From 413bd84530e6816d57b3dc334b951a22c053a47b Mon Sep 17 00:00:00 2001 From: Jonas Zeunert Date: Thu, 13 Feb 2020 21:47:42 +0100 Subject: [PATCH] change venv --- .gitignore | 1 + requirements | 62 + venv/bin/Activate.ps1 | 231 - venv/bin/activate | 76 - venv/bin/activate.csh | 37 - venv/bin/activate.fish | 75 - venv/bin/chardetect | 10 - venv/bin/easy_install | 12 - venv/bin/easy_install-3.8 | 12 - venv/bin/pip | 12 - venv/bin/pip3 | 12 - venv/bin/pip3.8 | 12 - venv/bin/python | Bin 14408 -> 0 bytes venv/bin/python3 | Bin 14408 -> 0 bytes venv/bin/python3.8 | Bin 14408 -> 0 bytes .../DESCRIPTION.rst | 50 - .../certifi-2019.11.28.dist-info/INSTALLER | 1 - .../certifi-2019.11.28.dist-info/METADATA | 74 - .../certifi-2019.11.28.dist-info/RECORD | 14 - .../certifi-2019.11.28.dist-info/WHEEL | 6 - .../metadata.json | 1 - .../top_level.txt | 1 - .../site-packages/certifi/__init__.py | 3 - .../site-packages/certifi/__main__.py | 2 - .../__pycache__/__init__.cpython-38.pyc | Bin 209 -> 0 bytes .../__pycache__/__main__.cpython-38.pyc | Bin 200 -> 0 bytes .../certifi/__pycache__/core.cpython-38.pyc | Bin 425 -> 0 bytes .../site-packages/certifi/cacert.pem | 4602 --------- .../python3.8/site-packages/certifi/core.py | 15 - .../chardet-3.0.4.dist-info/DESCRIPTION.rst | 70 - .../chardet-3.0.4.dist-info/INSTALLER | 1 - .../chardet-3.0.4.dist-info/METADATA | 96 - .../chardet-3.0.4.dist-info/RECORD | 91 - .../chardet-3.0.4.dist-info/WHEEL | 6 - .../chardet-3.0.4.dist-info/entry_points.txt | 3 - .../chardet-3.0.4.dist-info/metadata.json | 1 - .../chardet-3.0.4.dist-info/top_level.txt | 1 - .../site-packages/chardet/__init__.py | 39 - .../__pycache__/__init__.cpython-38.pyc | Bin 802 -> 0 bytes .../__pycache__/big5freq.cpython-38.pyc | Bin 27131 -> 0 bytes .../__pycache__/big5prober.cpython-38.pyc | Bin 1086 -> 0 bytes .../chardistribution.cpython-38.pyc | Bin 6172 -> 0 bytes .../charsetgroupprober.cpython-38.pyc | Bin 2203 -> 0 bytes .../__pycache__/charsetprober.cpython-38.pyc | Bin 3435 -> 0 bytes .../codingstatemachine.cpython-38.pyc | Bin 2862 -> 0 bytes .../chardet/__pycache__/compat.cpython-38.pyc | Bin 307 -> 0 bytes .../__pycache__/cp949prober.cpython-38.pyc | Bin 1093 -> 0 bytes .../chardet/__pycache__/enums.cpython-38.pyc | Bin 2600 -> 0 bytes .../__pycache__/escprober.cpython-38.pyc | Bin 2585 -> 0 bytes .../chardet/__pycache__/escsm.cpython-38.pyc | Bin 7426 -> 0 bytes .../__pycache__/eucjpprober.cpython-38.pyc | Bin 2403 -> 0 bytes .../__pycache__/euckrfreq.cpython-38.pyc | Bin 12015 -> 0 bytes .../__pycache__/euckrprober.cpython-38.pyc | Bin 1094 -> 0 bytes .../__pycache__/euctwfreq.cpython-38.pyc | Bin 27135 -> 0 bytes .../__pycache__/euctwprober.cpython-38.pyc | Bin 1094 -> 0 bytes .../__pycache__/gb2312freq.cpython-38.pyc | Bin 19059 -> 0 bytes .../__pycache__/gb2312prober.cpython-38.pyc | Bin 1102 -> 0 bytes .../__pycache__/hebrewprober.cpython-38.pyc | Bin 2975 -> 0 bytes .../__pycache__/jisfreq.cpython-38.pyc | Bin 22087 -> 0 bytes .../chardet/__pycache__/jpcntx.cpython-38.pyc | Bin 37560 -> 0 bytes .../langbulgarianmodel.cpython-38.pyc | Bin 23584 -> 0 bytes .../langcyrillicmodel.cpython-38.pyc | Bin 29048 -> 0 bytes .../__pycache__/langgreekmodel.cpython-38.pyc | Bin 23542 -> 0 bytes .../langhebrewmodel.cpython-38.pyc | Bin 22169 -> 0 bytes .../langhungarianmodel.cpython-38.pyc | Bin 23573 -> 0 bytes .../__pycache__/langthaimodel.cpython-38.pyc | Bin 22148 -> 0 bytes .../langturkishmodel.cpython-38.pyc | Bin 22171 -> 0 bytes .../__pycache__/latin1prober.cpython-38.pyc | Bin 3355 -> 0 bytes .../mbcharsetprober.cpython-38.pyc | Bin 2218 -> 0 bytes .../mbcsgroupprober.cpython-38.pyc | Bin 1083 -> 0 bytes .../chardet/__pycache__/mbcssm.cpython-38.pyc | Bin 16706 -> 0 bytes .../sbcharsetprober.cpython-38.pyc | Bin 2971 -> 0 bytes .../sbcsgroupprober.cpython-38.pyc | Bin 1581 -> 0 bytes .../__pycache__/sjisprober.cpython-38.pyc | Bin 2439 -> 0 bytes .../universaldetector.cpython-38.pyc | Bin 5783 -> 0 bytes .../__pycache__/utf8prober.cpython-38.pyc | Bin 1944 -> 0 bytes .../__pycache__/version.cpython-38.pyc | Bin 391 -> 0 bytes .../site-packages/chardet/big5freq.py | 386 - .../site-packages/chardet/big5prober.py | 47 - .../site-packages/chardet/chardistribution.py | 233 - .../chardet/charsetgroupprober.py | 106 - .../site-packages/chardet/charsetprober.py | 145 - .../site-packages/chardet/cli/__init__.py | 1 - .../cli/__pycache__/__init__.cpython-38.pyc | Bin 148 -> 0 bytes .../cli/__pycache__/chardetect.cpython-38.pyc | Bin 2613 -> 0 bytes .../site-packages/chardet/cli/chardetect.py | 85 - .../chardet/codingstatemachine.py | 88 - .../python3.8/site-packages/chardet/compat.py | 34 - .../site-packages/chardet/cp949prober.py | 49 - .../python3.8/site-packages/chardet/enums.py | 76 - .../site-packages/chardet/escprober.py | 101 - .../python3.8/site-packages/chardet/escsm.py | 246 - .../site-packages/chardet/eucjpprober.py | 92 - .../site-packages/chardet/euckrfreq.py | 195 - .../site-packages/chardet/euckrprober.py | 47 - .../site-packages/chardet/euctwfreq.py | 387 - .../site-packages/chardet/euctwprober.py | 46 - .../site-packages/chardet/gb2312freq.py | 283 - .../site-packages/chardet/gb2312prober.py | 46 - .../site-packages/chardet/hebrewprober.py | 292 - .../site-packages/chardet/jisfreq.py | 325 - .../python3.8/site-packages/chardet/jpcntx.py | 233 - .../chardet/langbulgarianmodel.py | 228 - .../chardet/langcyrillicmodel.py | 333 - .../site-packages/chardet/langgreekmodel.py | 225 - .../site-packages/chardet/langhebrewmodel.py | 200 - .../chardet/langhungarianmodel.py | 225 - .../site-packages/chardet/langthaimodel.py | 199 - .../site-packages/chardet/langturkishmodel.py | 193 - .../site-packages/chardet/latin1prober.py | 145 - .../site-packages/chardet/mbcharsetprober.py | 91 - .../site-packages/chardet/mbcsgroupprober.py | 54 - .../python3.8/site-packages/chardet/mbcssm.py | 572 -- .../site-packages/chardet/sbcharsetprober.py | 132 - .../site-packages/chardet/sbcsgroupprober.py | 73 - .../site-packages/chardet/sjisprober.py | 92 - .../chardet/universaldetector.py | 286 - .../site-packages/chardet/utf8prober.py | 82 - .../site-packages/chardet/version.py | 9 - .../python3.8/site-packages/easy-install.pth | 2 - .../idna-2.8.dist-info/INSTALLER | 1 - .../idna-2.8.dist-info/LICENSE.rst | 80 - .../site-packages/idna-2.8.dist-info/METADATA | 239 - .../site-packages/idna-2.8.dist-info/RECORD | 22 - .../site-packages/idna-2.8.dist-info/WHEEL | 6 - .../idna-2.8.dist-info/top_level.txt | 1 - .../python3.8/site-packages/idna/__init__.py | 2 - .../idna/__pycache__/__init__.cpython-38.pyc | Bin 207 -> 0 bytes .../idna/__pycache__/codec.cpython-38.pyc | Bin 2861 -> 0 bytes .../idna/__pycache__/compat.cpython-38.pyc | Bin 579 -> 0 bytes .../idna/__pycache__/core.cpython-38.pyc | Bin 8995 -> 0 bytes .../idna/__pycache__/idnadata.cpython-38.pyc | Bin 21331 -> 0 bytes .../idna/__pycache__/intranges.cpython-38.pyc | Bin 1759 -> 0 bytes .../__pycache__/package_data.cpython-38.pyc | Bin 161 -> 0 bytes .../idna/__pycache__/uts46data.cpython-38.pyc | Bin 174134 -> 0 bytes .../lib/python3.8/site-packages/idna/codec.py | 118 - .../python3.8/site-packages/idna/compat.py | 12 - venv/lib/python3.8/site-packages/idna/core.py | 396 - .../python3.8/site-packages/idna/idnadata.py | 1979 ---- .../python3.8/site-packages/idna/intranges.py | 53 - .../site-packages/idna/package_data.py | 2 - .../python3.8/site-packages/idna/uts46data.py | 8205 ----------------- .../DESCRIPTION.rst | 124 - .../observable-1.0.3.dist-info/INSTALLER | 1 - .../observable-1.0.3.dist-info/METADATA | 147 - .../observable-1.0.3.dist-info/RECORD | 17 - .../observable-1.0.3.dist-info/WHEEL | 6 - .../observable-1.0.3.dist-info/metadata.json | 1 - .../observable-1.0.3.dist-info/top_level.txt | 2 - .../site-packages/observable/__init__.py | 9 - .../__pycache__/__init__.cpython-38.pyc | Bin 321 -> 0 bytes .../__pycache__/__version__.cpython-38.pyc | Bin 248 -> 0 bytes .../__pycache__/core.cpython-38.pyc | Bin 5228 -> 0 bytes .../site-packages/observable/__version__.py | 5 - .../site-packages/observable/core.py | 134 - .../pip-19.0.3-py3.8.egg/EGG-INFO/PKG-INFO | 73 - .../pip-19.0.3-py3.8.egg/EGG-INFO/SOURCES.txt | 391 - .../EGG-INFO/dependency_links.txt | 1 - .../EGG-INFO/entry_points.txt | 5 - .../EGG-INFO/not-zip-safe | 1 - .../EGG-INFO/top_level.txt | 1 - .../pip-19.0.3-py3.8.egg/pip/__init__.py | 1 - .../pip-19.0.3-py3.8.egg/pip/__main__.py | 19 - .../pip/__pycache__/__init__.cpython-38.pyc | Bin 216 -> 0 bytes .../pip/_internal/__init__.py | 78 - .../__pycache__/__init__.cpython-38.pyc | Bin 1864 -> 0 bytes .../__pycache__/build_env.cpython-38.pyc | Bin 7558 -> 0 bytes .../__pycache__/cache.cpython-38.pyc | Bin 7147 -> 0 bytes .../__pycache__/configuration.cpython-38.pyc | Bin 9949 -> 0 bytes .../__pycache__/download.cpython-38.pyc | Bin 21392 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 11530 -> 0 bytes .../__pycache__/index.cpython-38.pyc | Bin 25518 -> 0 bytes .../__pycache__/locations.cpython-38.pyc | Bin 4487 -> 0 bytes .../__pycache__/pep425tags.cpython-38.pyc | Bin 8212 -> 0 bytes .../__pycache__/pyproject.cpython-38.pyc | Bin 3222 -> 0 bytes .../__pycache__/resolve.cpython-38.pyc | Bin 9125 -> 0 bytes .../__pycache__/wheel.cpython-38.pyc | Bin 26305 -> 0 bytes .../pip/_internal/build_env.py | 215 - .../pip/_internal/cache.py | 224 - .../pip/_internal/cli/__init__.py | 4 - .../cli/__pycache__/__init__.cpython-38.pyc | Bin 291 -> 0 bytes .../__pycache__/autocompletion.cpython-38.pyc | Bin 5149 -> 0 bytes .../__pycache__/base_command.cpython-38.pyc | Bin 7994 -> 0 bytes .../cli/__pycache__/cmdoptions.cpython-38.pyc | Bin 17030 -> 0 bytes .../__pycache__/main_parser.cpython-38.pyc | Bin 2405 -> 0 bytes .../cli/__pycache__/parser.cpython-38.pyc | Bin 9032 -> 0 bytes .../__pycache__/status_codes.cpython-38.pyc | Bin 420 -> 0 bytes .../pip/_internal/cli/autocompletion.py | 152 - .../pip/_internal/cli/base_command.py | 341 - .../pip/_internal/cli/cmdoptions.py | 809 -- .../pip/_internal/cli/main_parser.py | 104 - .../pip/_internal/cli/parser.py | 261 - .../pip/_internal/cli/status_codes.py | 8 - .../pip/_internal/commands/__init__.py | 79 - .../__pycache__/__init__.cpython-38.pyc | Bin 2541 -> 0 bytes .../commands/__pycache__/check.cpython-38.pyc | Bin 1352 -> 0 bytes .../__pycache__/completion.cpython-38.pyc | Bin 3131 -> 0 bytes .../__pycache__/configuration.cpython-38.pyc | Bin 6503 -> 0 bytes .../__pycache__/download.cpython-38.pyc | Bin 4778 -> 0 bytes .../__pycache__/freeze.cpython-38.pyc | Bin 2904 -> 0 bytes .../commands/__pycache__/hash.cpython-38.pyc | Bin 2100 -> 0 bytes .../commands/__pycache__/help.cpython-38.pyc | Bin 1271 -> 0 bytes .../__pycache__/install.cpython-38.pyc | Bin 12667 -> 0 bytes .../commands/__pycache__/list.cpython-38.pyc | Bin 8816 -> 0 bytes .../__pycache__/search.cpython-38.pyc | Bin 4377 -> 0 bytes .../commands/__pycache__/show.cpython-38.pyc | Bin 5883 -> 0 bytes .../__pycache__/uninstall.cpython-38.pyc | Bin 2733 -> 0 bytes .../commands/__pycache__/wheel.cpython-38.pyc | Bin 5076 -> 0 bytes .../pip/_internal/commands/check.py | 41 - .../pip/_internal/commands/completion.py | 94 - .../pip/_internal/commands/configuration.py | 227 - .../pip/_internal/commands/download.py | 176 - .../pip/_internal/commands/freeze.py | 96 - .../pip/_internal/commands/hash.py | 57 - .../pip/_internal/commands/help.py | 37 - .../pip/_internal/commands/install.py | 566 -- .../pip/_internal/commands/list.py | 301 - .../pip/_internal/commands/search.py | 135 - .../pip/_internal/commands/show.py | 168 - .../pip/_internal/commands/uninstall.py | 78 - .../pip/_internal/commands/wheel.py | 186 - .../pip/_internal/configuration.py | 387 - .../pip/_internal/download.py | 971 -- .../pip/_internal/exceptions.py | 274 - .../pip/_internal/index.py | 990 -- .../pip/_internal/locations.py | 211 - .../pip/_internal/models/__init__.py | 2 - .../__pycache__/__init__.cpython-38.pyc | Bin 279 -> 0 bytes .../__pycache__/candidate.cpython-38.pyc | Bin 1346 -> 0 bytes .../__pycache__/format_control.cpython-38.pyc | Bin 2307 -> 0 bytes .../models/__pycache__/index.cpython-38.pyc | Bin 1201 -> 0 bytes .../models/__pycache__/link.cpython-38.pyc | Bin 5044 -> 0 bytes .../pip/_internal/models/candidate.py | 31 - .../pip/_internal/models/format_control.py | 73 - .../pip/_internal/models/index.py | 31 - .../pip/_internal/models/link.py | 163 - .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 215 -> 0 bytes .../__pycache__/check.cpython-38.pyc | Bin 3655 -> 0 bytes .../__pycache__/freeze.cpython-38.pyc | Bin 5694 -> 0 bytes .../__pycache__/prepare.cpython-38.pyc | Bin 10375 -> 0 bytes .../pip/_internal/operations/check.py | 155 - .../pip/_internal/operations/freeze.py | 247 - .../pip/_internal/operations/prepare.py | 413 - .../pip/_internal/pep425tags.py | 381 - .../pip/_internal/pyproject.py | 171 - .../pip/_internal/req/__init__.py | 77 - .../req/__pycache__/__init__.cpython-38.pyc | Bin 1741 -> 0 bytes .../__pycache__/constructors.cpython-38.pyc | Bin 7735 -> 0 bytes .../req/__pycache__/req_file.cpython-38.pyc | Bin 9290 -> 0 bytes .../__pycache__/req_install.cpython-38.pyc | Bin 25364 -> 0 bytes .../req/__pycache__/req_set.cpython-38.pyc | Bin 6117 -> 0 bytes .../__pycache__/req_tracker.cpython-38.pyc | Bin 3203 -> 0 bytes .../__pycache__/req_uninstall.cpython-38.pyc | Bin 17110 -> 0 bytes .../pip/_internal/req/constructors.py | 339 - .../pip/_internal/req/req_file.py | 382 - .../pip/_internal/req/req_install.py | 1021 -- .../pip/_internal/req/req_set.py | 197 - .../pip/_internal/req/req_tracker.py | 88 - .../pip/_internal/req/req_uninstall.py | 596 -- .../pip/_internal/resolve.py | 393 - .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-38.pyc | Bin 210 -> 0 bytes .../utils/__pycache__/appdirs.cpython-38.pyc | Bin 8105 -> 0 bytes .../utils/__pycache__/compat.cpython-38.pyc | Bin 6124 -> 0 bytes .../__pycache__/deprecation.cpython-38.pyc | Bin 2624 -> 0 bytes .../utils/__pycache__/encoding.cpython-38.pyc | Bin 1295 -> 0 bytes .../__pycache__/filesystem.cpython-38.pyc | Bin 681 -> 0 bytes .../utils/__pycache__/glibc.cpython-38.pyc | Bin 1724 -> 0 bytes .../utils/__pycache__/hashes.cpython-38.pyc | Bin 3650 -> 0 bytes .../utils/__pycache__/logging.cpython-38.pyc | Bin 7867 -> 0 bytes .../utils/__pycache__/misc.cpython-38.pyc | Bin 26157 -> 0 bytes .../utils/__pycache__/models.cpython-38.pyc | Bin 1980 -> 0 bytes .../utils/__pycache__/outdated.cpython-38.pyc | Bin 4147 -> 0 bytes .../__pycache__/packaging.cpython-38.pyc | Bin 2665 -> 0 bytes .../setuptools_build.cpython-38.pyc | Bin 407 -> 0 bytes .../utils/__pycache__/temp_dir.cpython-38.pyc | Bin 4930 -> 0 bytes .../utils/__pycache__/typing.cpython-38.pyc | Bin 1354 -> 0 bytes .../utils/__pycache__/ui.cpython-38.pyc | Bin 12404 -> 0 bytes .../pip/_internal/utils/appdirs.py | 270 - .../pip/_internal/utils/compat.py | 264 - .../pip/_internal/utils/deprecation.py | 90 - .../pip/_internal/utils/encoding.py | 39 - .../pip/_internal/utils/filesystem.py | 30 - .../pip/_internal/utils/glibc.py | 93 - .../pip/_internal/utils/hashes.py | 115 - .../pip/_internal/utils/logging.py | 318 - .../pip/_internal/utils/misc.py | 1040 --- .../pip/_internal/utils/models.py | 40 - .../pip/_internal/utils/outdated.py | 164 - .../pip/_internal/utils/packaging.py | 85 - .../pip/_internal/utils/setuptools_build.py | 8 - .../pip/_internal/utils/temp_dir.py | 155 - .../pip/_internal/utils/typing.py | 29 - .../pip/_internal/utils/ui.py | 441 - .../pip/_internal/vcs/__init__.py | 534 -- .../vcs/__pycache__/__init__.cpython-38.pyc | Bin 15543 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-38.pyc | Bin 3879 -> 0 bytes .../vcs/__pycache__/git.cpython-38.pyc | Bin 9536 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-38.pyc | Bin 3839 -> 0 bytes .../vcs/__pycache__/subversion.cpython-38.pyc | Bin 6047 -> 0 bytes .../pip/_internal/vcs/bazaar.py | 114 - .../pip/_internal/vcs/git.py | 369 - .../pip/_internal/vcs/mercurial.py | 103 - .../pip/_internal/vcs/subversion.py | 200 - .../pip/_internal/wheel.py | 1095 --- .../pip/_vendor/__init__.py | 111 - .../__pycache__/__init__.cpython-38.pyc | Bin 2902 -> 0 bytes .../__pycache__/appdirs.cpython-38.pyc | Bin 20492 -> 0 bytes .../_vendor/__pycache__/distro.cpython-38.pyc | Bin 36406 -> 0 bytes .../__pycache__/pyparsing.cpython-38.pyc | Bin 219080 -> 0 bytes .../__pycache__/retrying.cpython-38.pyc | Bin 8061 -> 0 bytes .../_vendor/__pycache__/six.cpython-38.pyc | Bin 26451 -> 0 bytes .../pip/_vendor/appdirs.py | 604 -- .../pip/_vendor/cachecontrol/__init__.py | 11 - .../__pycache__/__init__.cpython-38.pyc | Bin 568 -> 0 bytes .../__pycache__/adapter.cpython-38.pyc | Bin 3094 -> 0 bytes .../__pycache__/cache.cpython-38.pyc | Bin 1801 -> 0 bytes .../__pycache__/compat.cpython-38.pyc | Bin 775 -> 0 bytes .../__pycache__/controller.cpython-38.pyc | Bin 7715 -> 0 bytes .../__pycache__/filewrapper.cpython-38.pyc | Bin 2194 -> 0 bytes .../__pycache__/serialize.cpython-38.pyc | Bin 4266 -> 0 bytes .../__pycache__/wrapper.cpython-38.pyc | Bin 684 -> 0 bytes .../pip/_vendor/cachecontrol/_cmd.py | 57 - .../pip/_vendor/cachecontrol/adapter.py | 133 - .../pip/_vendor/cachecontrol/cache.py | 39 - .../_vendor/cachecontrol/caches/__init__.py | 2 - .../__pycache__/__init__.cpython-38.pyc | Bin 312 -> 0 bytes .../__pycache__/file_cache.cpython-38.pyc | Bin 3310 -> 0 bytes .../__pycache__/redis_cache.cpython-38.pyc | Bin 1584 -> 0 bytes .../_vendor/cachecontrol/caches/file_cache.py | 146 - .../cachecontrol/caches/redis_cache.py | 33 - .../pip/_vendor/cachecontrol/compat.py | 29 - .../pip/_vendor/cachecontrol/controller.py | 367 - .../pip/_vendor/cachecontrol/filewrapper.py | 80 - .../pip/_vendor/cachecontrol/heuristics.py | 135 - .../pip/_vendor/cachecontrol/serialize.py | 186 - .../pip/_vendor/cachecontrol/wrapper.py | 29 - .../pip/_vendor/certifi/__init__.py | 3 - .../pip/_vendor/certifi/__main__.py | 2 - .../__pycache__/__init__.cpython-38.pyc | Bin 275 -> 0 bytes .../certifi/__pycache__/core.cpython-38.pyc | Bin 540 -> 0 bytes .../pip/_vendor/certifi/cacert.pem | 4512 --------- .../pip/_vendor/certifi/core.py | 20 - .../pip/_vendor/chardet/__init__.py | 39 - .../__pycache__/__init__.cpython-38.pyc | Bin 868 -> 0 bytes .../__pycache__/big5freq.cpython-38.pyc | Bin 27197 -> 0 bytes .../__pycache__/big5prober.cpython-38.pyc | Bin 1152 -> 0 bytes .../chardistribution.cpython-38.pyc | Bin 6238 -> 0 bytes .../charsetgroupprober.cpython-38.pyc | Bin 2269 -> 0 bytes .../__pycache__/charsetprober.cpython-38.pyc | Bin 3501 -> 0 bytes .../codingstatemachine.cpython-38.pyc | Bin 2928 -> 0 bytes .../chardet/__pycache__/compat.cpython-38.pyc | Bin 373 -> 0 bytes .../__pycache__/cp949prober.cpython-38.pyc | Bin 1159 -> 0 bytes .../chardet/__pycache__/enums.cpython-38.pyc | Bin 2666 -> 0 bytes .../__pycache__/escprober.cpython-38.pyc | Bin 2651 -> 0 bytes .../chardet/__pycache__/escsm.cpython-38.pyc | Bin 7492 -> 0 bytes .../__pycache__/eucjpprober.cpython-38.pyc | Bin 2469 -> 0 bytes .../__pycache__/euckrfreq.cpython-38.pyc | Bin 12081 -> 0 bytes .../__pycache__/euckrprober.cpython-38.pyc | Bin 1160 -> 0 bytes .../__pycache__/euctwfreq.cpython-38.pyc | Bin 27201 -> 0 bytes .../__pycache__/euctwprober.cpython-38.pyc | Bin 1160 -> 0 bytes .../__pycache__/gb2312freq.cpython-38.pyc | Bin 19125 -> 0 bytes .../__pycache__/gb2312prober.cpython-38.pyc | Bin 1168 -> 0 bytes .../__pycache__/hebrewprober.cpython-38.pyc | Bin 3041 -> 0 bytes .../__pycache__/jisfreq.cpython-38.pyc | Bin 22153 -> 0 bytes .../chardet/__pycache__/jpcntx.cpython-38.pyc | Bin 37626 -> 0 bytes .../langbulgarianmodel.cpython-38.pyc | Bin 23650 -> 0 bytes .../langcyrillicmodel.cpython-38.pyc | Bin 29114 -> 0 bytes .../__pycache__/langgreekmodel.cpython-38.pyc | Bin 23608 -> 0 bytes .../langhebrewmodel.cpython-38.pyc | Bin 22235 -> 0 bytes .../__pycache__/langthaimodel.cpython-38.pyc | Bin 22214 -> 0 bytes .../langturkishmodel.cpython-38.pyc | Bin 22237 -> 0 bytes .../__pycache__/latin1prober.cpython-38.pyc | Bin 3421 -> 0 bytes .../mbcharsetprober.cpython-38.pyc | Bin 2284 -> 0 bytes .../mbcsgroupprober.cpython-38.pyc | Bin 1149 -> 0 bytes .../chardet/__pycache__/mbcssm.cpython-38.pyc | Bin 16772 -> 0 bytes .../sbcharsetprober.cpython-38.pyc | Bin 3037 -> 0 bytes .../sbcsgroupprober.cpython-38.pyc | Bin 1647 -> 0 bytes .../__pycache__/sjisprober.cpython-38.pyc | Bin 2505 -> 0 bytes .../universaldetector.cpython-38.pyc | Bin 5849 -> 0 bytes .../__pycache__/utf8prober.cpython-38.pyc | Bin 2010 -> 0 bytes .../__pycache__/version.cpython-38.pyc | Bin 457 -> 0 bytes .../pip/_vendor/chardet/big5freq.py | 386 - .../pip/_vendor/chardet/big5prober.py | 47 - .../pip/_vendor/chardet/chardistribution.py | 233 - .../pip/_vendor/chardet/charsetgroupprober.py | 106 - .../pip/_vendor/chardet/charsetprober.py | 145 - .../pip/_vendor/chardet/cli/__init__.py | 1 - .../pip/_vendor/chardet/cli/chardetect.py | 85 - .../pip/_vendor/chardet/codingstatemachine.py | 88 - .../pip/_vendor/chardet/compat.py | 34 - .../pip/_vendor/chardet/cp949prober.py | 49 - .../pip/_vendor/chardet/enums.py | 76 - .../pip/_vendor/chardet/escprober.py | 101 - .../pip/_vendor/chardet/escsm.py | 246 - .../pip/_vendor/chardet/eucjpprober.py | 92 - .../pip/_vendor/chardet/euckrfreq.py | 195 - .../pip/_vendor/chardet/euckrprober.py | 47 - .../pip/_vendor/chardet/euctwfreq.py | 387 - .../pip/_vendor/chardet/euctwprober.py | 46 - .../pip/_vendor/chardet/gb2312freq.py | 283 - .../pip/_vendor/chardet/gb2312prober.py | 46 - .../pip/_vendor/chardet/hebrewprober.py | 292 - .../pip/_vendor/chardet/jisfreq.py | 325 - .../pip/_vendor/chardet/jpcntx.py | 233 - .../pip/_vendor/chardet/langbulgarianmodel.py | 228 - .../pip/_vendor/chardet/langcyrillicmodel.py | 333 - .../pip/_vendor/chardet/langgreekmodel.py | 225 - .../pip/_vendor/chardet/langhebrewmodel.py | 200 - .../pip/_vendor/chardet/langhungarianmodel.py | 225 - .../pip/_vendor/chardet/langthaimodel.py | 199 - .../pip/_vendor/chardet/langturkishmodel.py | 193 - .../pip/_vendor/chardet/latin1prober.py | 145 - .../pip/_vendor/chardet/mbcharsetprober.py | 91 - .../pip/_vendor/chardet/mbcsgroupprober.py | 54 - .../pip/_vendor/chardet/mbcssm.py | 572 -- .../pip/_vendor/chardet/sbcharsetprober.py | 132 - .../pip/_vendor/chardet/sbcsgroupprober.py | 73 - .../pip/_vendor/chardet/sjisprober.py | 92 - .../pip/_vendor/chardet/universaldetector.py | 286 - .../pip/_vendor/chardet/utf8prober.py | 82 - .../pip/_vendor/chardet/version.py | 9 - .../pip/_vendor/colorama/__init__.py | 6 - .../__pycache__/__init__.cpython-38.pyc | Bin 462 -> 0 bytes .../colorama/__pycache__/ansi.cpython-38.pyc | Bin 3247 -> 0 bytes .../__pycache__/ansitowin32.cpython-38.pyc | Bin 7756 -> 0 bytes .../__pycache__/initialise.cpython-38.pyc | Bin 1723 -> 0 bytes .../colorama/__pycache__/win32.cpython-38.pyc | Bin 3999 -> 0 bytes .../__pycache__/winterm.cpython-38.pyc | Bin 4683 -> 0 bytes .../pip/_vendor/colorama/ansi.py | 102 - .../pip/_vendor/colorama/ansitowin32.py | 257 - .../pip/_vendor/colorama/initialise.py | 80 - .../pip/_vendor/colorama/win32.py | 152 - .../pip/_vendor/colorama/winterm.py | 169 - .../pip/_vendor/distlib/__init__.py | 23 - .../__pycache__/__init__.cpython-38.pyc | Bin 1077 -> 0 bytes .../distlib/__pycache__/compat.cpython-38.pyc | Bin 32226 -> 0 bytes .../__pycache__/resources.cpython-38.pyc | Bin 11027 -> 0 bytes .../__pycache__/scripts.cpython-38.pyc | Bin 11199 -> 0 bytes .../distlib/__pycache__/util.cpython-38.pyc | Bin 48115 -> 0 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 - .../pip/_vendor/distlib/_backport/misc.py | 41 - .../pip/_vendor/distlib/_backport/shutil.py | 761 -- .../_vendor/distlib/_backport/sysconfig.cfg | 84 - .../_vendor/distlib/_backport/sysconfig.py | 788 -- .../pip/_vendor/distlib/_backport/tarfile.py | 2607 ------ .../pip/_vendor/distlib/compat.py | 1120 --- .../pip/_vendor/distlib/database.py | 1339 --- .../pip/_vendor/distlib/index.py | 516 -- .../pip/_vendor/distlib/locators.py | 1295 --- .../pip/_vendor/distlib/manifest.py | 393 - .../pip/_vendor/distlib/markers.py | 131 - .../pip/_vendor/distlib/metadata.py | 1094 --- .../pip/_vendor/distlib/resources.py | 355 - .../pip/_vendor/distlib/scripts.py | 417 - .../pip/_vendor/distlib/t32.exe | Bin 92672 -> 0 bytes .../pip/_vendor/distlib/t64.exe | Bin 102400 -> 0 bytes .../pip/_vendor/distlib/util.py | 1756 ---- .../pip/_vendor/distlib/version.py | 736 -- .../pip/_vendor/distlib/w32.exe | Bin 89088 -> 0 bytes .../pip/_vendor/distlib/w64.exe | Bin 99328 -> 0 bytes .../pip/_vendor/distlib/wheel.py | 988 -- .../pip/_vendor/distro.py | 1197 --- .../pip/_vendor/html5lib/__init__.py | 35 - .../__pycache__/__init__.cpython-38.pyc | Bin 1335 -> 0 bytes .../__pycache__/_ihatexml.cpython-38.pyc | Bin 13807 -> 0 bytes .../__pycache__/_inputstream.cpython-38.pyc | Bin 21959 -> 0 bytes .../__pycache__/_tokenizer.cpython-38.pyc | Bin 39677 -> 0 bytes .../__pycache__/_utils.cpython-38.pyc | Bin 3365 -> 0 bytes .../__pycache__/constants.cpython-38.pyc | Bin 66372 -> 0 bytes .../__pycache__/html5parser.cpython-38.pyc | Bin 95194 -> 0 bytes .../__pycache__/serializer.cpython-38.pyc | Bin 10843 -> 0 bytes .../pip/_vendor/html5lib/_ihatexml.py | 288 - .../pip/_vendor/html5lib/_inputstream.py | 923 -- .../pip/_vendor/html5lib/_tokenizer.py | 1721 ---- .../pip/_vendor/html5lib/_trie/__init__.py | 14 - .../_trie/__pycache__/__init__.cpython-38.pyc | Bin 444 -> 0 bytes .../_trie/__pycache__/_base.cpython-38.pyc | Bin 1549 -> 0 bytes .../_trie/__pycache__/datrie.cpython-38.pyc | Bin 2056 -> 0 bytes .../_trie/__pycache__/py.cpython-38.pyc | Bin 2280 -> 0 bytes .../pip/_vendor/html5lib/_trie/_base.py | 37 - .../pip/_vendor/html5lib/_trie/datrie.py | 44 - .../pip/_vendor/html5lib/_trie/py.py | 67 - .../pip/_vendor/html5lib/_utils.py | 124 - .../pip/_vendor/html5lib/constants.py | 2947 ------ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../filters/alphabeticalattributes.py | 29 - .../pip/_vendor/html5lib/filters/base.py | 12 - .../html5lib/filters/inject_meta_charset.py | 73 - .../pip/_vendor/html5lib/filters/lint.py | 93 - .../_vendor/html5lib/filters/optionaltags.py | 207 - .../pip/_vendor/html5lib/filters/sanitizer.py | 896 -- .../_vendor/html5lib/filters/whitespace.py | 38 - .../pip/_vendor/html5lib/html5parser.py | 2791 ------ .../pip/_vendor/html5lib/serializer.py | 409 - .../_vendor/html5lib/treeadapters/__init__.py | 30 - .../_vendor/html5lib/treeadapters/genshi.py | 54 - .../pip/_vendor/html5lib/treeadapters/sax.py | 50 - .../_vendor/html5lib/treebuilders/__init__.py | 88 - .../__pycache__/__init__.cpython-38.pyc | Bin 3343 -> 0 bytes .../__pycache__/base.cpython-38.pyc | Bin 11369 -> 0 bytes .../__pycache__/etree.cpython-38.pyc | Bin 11863 -> 0 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 - .../pip/_vendor/html5lib/treebuilders/dom.py | 236 - .../_vendor/html5lib/treebuilders/etree.py | 340 - .../html5lib/treebuilders/etree_lxml.py | 366 - .../_vendor/html5lib/treewalkers/__init__.py | 154 - .../__pycache__/__init__.cpython-38.pyc | Bin 4024 -> 0 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 - .../pip/_vendor/html5lib/treewalkers/dom.py | 43 - .../pip/_vendor/html5lib/treewalkers/etree.py | 130 - .../html5lib/treewalkers/etree_lxml.py | 213 - .../_vendor/html5lib/treewalkers/genshi.py | 69 - .../pip/_vendor/idna/__init__.py | 2 - .../idna/__pycache__/__init__.cpython-38.pyc | Bin 276 -> 0 bytes .../idna/__pycache__/core.cpython-38.pyc | Bin 9064 -> 0 bytes .../idna/__pycache__/idnadata.cpython-38.pyc | Bin 21400 -> 0 bytes .../idna/__pycache__/intranges.cpython-38.pyc | Bin 1828 -> 0 bytes .../__pycache__/package_data.cpython-38.pyc | Bin 230 -> 0 bytes .../pip/_vendor/idna/codec.py | 118 - .../pip/_vendor/idna/compat.py | 12 - .../pip/_vendor/idna/core.py | 396 - .../pip/_vendor/idna/idnadata.py | 1979 ---- .../pip/_vendor/idna/intranges.py | 53 - .../pip/_vendor/idna/package_data.py | 2 - .../pip/_vendor/idna/uts46data.py | 8205 ----------------- .../pip/_vendor/ipaddress.py | 2419 ----- .../pip/_vendor/lockfile/__init__.py | 347 - .../__pycache__/__init__.cpython-38.pyc | Bin 9823 -> 0 bytes .../__pycache__/linklockfile.cpython-38.pyc | Bin 2331 -> 0 bytes .../__pycache__/mkdirlockfile.cpython-38.pyc | Bin 2699 -> 0 bytes .../pip/_vendor/lockfile/linklockfile.py | 73 - .../pip/_vendor/lockfile/mkdirlockfile.py | 84 - .../pip/_vendor/lockfile/pidlockfile.py | 190 - .../pip/_vendor/lockfile/sqlitelockfile.py | 156 - .../pip/_vendor/lockfile/symlinklockfile.py | 70 - .../pip/_vendor/msgpack/__init__.py | 66 - .../__pycache__/__init__.cpython-38.pyc | Bin 2106 -> 0 bytes .../__pycache__/_version.cpython-38.pyc | Bin 237 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 2153 -> 0 bytes .../__pycache__/fallback.cpython-38.pyc | Bin 24406 -> 0 bytes .../pip/_vendor/msgpack/_version.py | 1 - .../pip/_vendor/msgpack/exceptions.py | 41 - .../pip/_vendor/msgpack/fallback.py | 977 -- .../pip/_vendor/packaging/__about__.py | 27 - .../pip/_vendor/packaging/__init__.py | 26 - .../__pycache__/__about__.cpython-38.pyc | Bin 752 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 590 -> 0 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 1026 -> 0 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 2808 -> 0 bytes .../__pycache__/markers.cpython-38.pyc | Bin 8933 -> 0 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 4031 -> 0 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 19782 -> 0 bytes .../__pycache__/utils.cpython-38.pyc | Bin 1483 -> 0 bytes .../__pycache__/version.cpython-38.pyc | Bin 12113 -> 0 bytes .../pip/_vendor/packaging/_compat.py | 31 - .../pip/_vendor/packaging/_structures.py | 68 - .../pip/_vendor/packaging/markers.py | 296 - .../pip/_vendor/packaging/requirements.py | 138 - .../pip/_vendor/packaging/specifiers.py | 749 -- .../pip/_vendor/packaging/utils.py | 57 - .../pip/_vendor/packaging/version.py | 420 - .../pip/_vendor/pep517/__init__.py | 4 - .../__pycache__/__init__.cpython-38.pyc | Bin 301 -> 0 bytes .../pep517/__pycache__/compat.cpython-38.pyc | Bin 1023 -> 0 bytes .../__pycache__/wrappers.cpython-38.pyc | Bin 5563 -> 0 bytes .../pip/_vendor/pep517/_in_process.py | 207 - .../pip/_vendor/pep517/build.py | 108 - .../pip/_vendor/pep517/check.py | 202 - .../pip/_vendor/pep517/colorlog.py | 115 - .../pip/_vendor/pep517/compat.py | 23 - .../pip/_vendor/pep517/envbuild.py | 158 - .../pip/_vendor/pep517/wrappers.py | 163 - .../pip/_vendor/pkg_resources/__init__.py | 3171 ------- .../__pycache__/__init__.cpython-38.pyc | Bin 97425 -> 0 bytes .../__pycache__/py31compat.cpython-38.pyc | Bin 667 -> 0 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 - .../pip/_vendor/progress/__init__.py | 127 - .../__pycache__/__init__.cpython-38.pyc | Bin 3991 -> 0 bytes .../progress/__pycache__/bar.cpython-38.pyc | Bin 2742 -> 0 bytes .../__pycache__/helpers.cpython-38.pyc | Bin 2999 -> 0 bytes .../__pycache__/spinner.cpython-38.pyc | Bin 1483 -> 0 bytes .../pip/_vendor/progress/bar.py | 94 - .../pip/_vendor/progress/counter.py | 48 - .../pip/_vendor/progress/helpers.py | 91 - .../pip/_vendor/progress/spinner.py | 44 - .../pip/_vendor/pyparsing.py | 6452 ------------- .../pip/_vendor/pytoml/__init__.py | 4 - .../__pycache__/__init__.cpython-38.pyc | Bin 395 -> 0 bytes .../pytoml/__pycache__/core.cpython-38.pyc | Bin 972 -> 0 bytes .../pytoml/__pycache__/parser.cpython-38.pyc | Bin 10169 -> 0 bytes .../pytoml/__pycache__/test.cpython-38.pyc | Bin 1274 -> 0 bytes .../pytoml/__pycache__/utils.cpython-38.pyc | Bin 2184 -> 0 bytes .../pytoml/__pycache__/writer.cpython-38.pyc | Bin 3615 -> 0 bytes .../pip/_vendor/pytoml/core.py | 13 - .../pip/_vendor/pytoml/parser.py | 341 - .../pip/_vendor/pytoml/test.py | 30 - .../pip/_vendor/pytoml/utils.py | 67 - .../pip/_vendor/pytoml/writer.py | 106 - .../pip/_vendor/requests/__init__.py | 133 - .../__pycache__/__init__.cpython-38.pyc | Bin 3522 -> 0 bytes .../__pycache__/__version__.cpython-38.pyc | Bin 569 -> 0 bytes .../_internal_utils.cpython-38.pyc | Bin 1339 -> 0 bytes .../__pycache__/adapters.cpython-38.pyc | Bin 17002 -> 0 bytes .../requests/__pycache__/api.cpython-38.pyc | Bin 6508 -> 0 bytes .../requests/__pycache__/auth.cpython-38.pyc | Bin 8348 -> 0 bytes .../requests/__pycache__/certs.cpython-38.pyc | Bin 652 -> 0 bytes .../__pycache__/compat.cpython-38.pyc | Bin 1631 -> 0 bytes .../__pycache__/cookies.cpython-38.pyc | Bin 18853 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 5263 -> 0 bytes .../requests/__pycache__/hooks.cpython-38.pyc | Bin 1011 -> 0 bytes .../__pycache__/models.cpython-38.pyc | Bin 23947 -> 0 bytes .../__pycache__/packages.cpython-38.pyc | Bin 521 -> 0 bytes .../__pycache__/sessions.cpython-38.pyc | Bin 19561 -> 0 bytes .../__pycache__/status_codes.cpython-38.pyc | Bin 4207 -> 0 bytes .../__pycache__/structures.cpython-38.pyc | Bin 4449 -> 0 bytes .../requests/__pycache__/utils.cpython-38.pyc | Bin 22218 -> 0 bytes .../pip/_vendor/requests/__version__.py | 14 - .../pip/_vendor/requests/_internal_utils.py | 42 - .../pip/_vendor/requests/adapters.py | 533 -- .../pip/_vendor/requests/api.py | 158 - .../pip/_vendor/requests/auth.py | 305 - .../pip/_vendor/requests/certs.py | 18 - .../pip/_vendor/requests/compat.py | 74 - .../pip/_vendor/requests/cookies.py | 549 -- .../pip/_vendor/requests/exceptions.py | 126 - .../pip/_vendor/requests/help.py | 119 - .../pip/_vendor/requests/hooks.py | 34 - .../pip/_vendor/requests/models.py | 953 -- .../pip/_vendor/requests/packages.py | 16 - .../pip/_vendor/requests/sessions.py | 770 -- .../pip/_vendor/requests/status_codes.py | 120 - .../pip/_vendor/requests/structures.py | 103 - .../pip/_vendor/requests/utils.py | 977 -- .../pip/_vendor/retrying.py | 267 - .../pip-19.0.3-py3.8.egg/pip/_vendor/six.py | 952 -- .../pip/_vendor/urllib3/__init__.py | 92 - .../__pycache__/__init__.cpython-38.pyc | Bin 2144 -> 0 bytes .../__pycache__/_collections.cpython-38.pyc | Bin 10794 -> 0 bytes .../__pycache__/connection.cpython-38.pyc | Bin 10268 -> 0 bytes .../__pycache__/connectionpool.cpython-38.pyc | Bin 23730 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 10087 -> 0 bytes .../urllib3/__pycache__/fields.cpython-38.pyc | Bin 5890 -> 0 bytes .../__pycache__/filepost.cpython-38.pyc | Bin 2789 -> 0 bytes .../__pycache__/poolmanager.cpython-38.pyc | Bin 12829 -> 0 bytes .../__pycache__/request.cpython-38.pyc | Bin 5643 -> 0 bytes .../__pycache__/response.cpython-38.pyc | Bin 18934 -> 0 bytes .../pip/_vendor/urllib3/_collections.py | 329 - .../pip/_vendor/urllib3/connection.py | 391 - .../pip/_vendor/urllib3/connectionpool.py | 896 -- .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 218 -> 0 bytes .../_appengine_environ.cpython-38.pyc | Bin 1146 -> 0 bytes .../__pycache__/pyopenssl.cpython-38.pyc | Bin 14672 -> 0 bytes .../contrib/__pycache__/socks.cpython-38.pyc | Bin 4994 -> 0 bytes .../urllib3/contrib/_appengine_environ.py | 30 - .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 593 -- .../contrib/_securetransport/low_level.py | 346 - .../pip/_vendor/urllib3/contrib/appengine.py | 289 - .../pip/_vendor/urllib3/contrib/ntlmpool.py | 111 - .../pip/_vendor/urllib3/contrib/pyopenssl.py | 466 - .../urllib3/contrib/securetransport.py | 804 -- .../pip/_vendor/urllib3/contrib/socks.py | 192 - .../pip/_vendor/urllib3/exceptions.py | 246 - .../pip/_vendor/urllib3/fields.py | 178 - .../pip/_vendor/urllib3/filepost.py | 98 - .../pip/_vendor/urllib3/packages/__init__.py | 5 - .../__pycache__/__init__.cpython-38.pyc | Bin 332 -> 0 bytes .../packages/__pycache__/six.cpython-38.pyc | Bin 24492 -> 0 bytes .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 53 - .../pip/_vendor/urllib3/packages/six.py | 868 -- .../packages/ssl_match_hostname/__init__.py | 19 - .../__pycache__/__init__.cpython-38.pyc | Bin 573 -> 0 bytes .../ssl_match_hostname/_implementation.py | 156 - .../pip/_vendor/urllib3/poolmanager.py | 450 - .../pip/_vendor/urllib3/request.py | 150 - .../pip/_vendor/urllib3/response.py | 705 -- .../pip/_vendor/urllib3/util/__init__.py | 54 - .../util/__pycache__/__init__.cpython-38.pyc | Bin 1010 -> 0 bytes .../__pycache__/connection.cpython-38.pyc | Bin 3211 -> 0 bytes .../util/__pycache__/queue.cpython-38.pyc | Bin 1083 -> 0 bytes .../util/__pycache__/request.cpython-38.pyc | Bin 3264 -> 0 bytes .../util/__pycache__/response.cpython-38.pyc | Bin 2008 -> 0 bytes .../util/__pycache__/retry.cpython-38.pyc | Bin 12787 -> 0 bytes .../util/__pycache__/ssl_.cpython-38.pyc | Bin 9642 -> 0 bytes .../util/__pycache__/timeout.cpython-38.pyc | Bin 8839 -> 0 bytes .../util/__pycache__/url.cpython-38.pyc | Bin 5245 -> 0 bytes .../util/__pycache__/wait.cpython-38.pyc | Bin 3132 -> 0 bytes .../pip/_vendor/urllib3/util/connection.py | 134 - .../pip/_vendor/urllib3/util/queue.py | 21 - .../pip/_vendor/urllib3/util/request.py | 118 - .../pip/_vendor/urllib3/util/response.py | 87 - .../pip/_vendor/urllib3/util/retry.py | 411 - .../pip/_vendor/urllib3/util/ssl_.py | 381 - .../pip/_vendor/urllib3/util/timeout.py | 242 - .../pip/_vendor/urllib3/util/url.py | 230 - .../pip/_vendor/urllib3/util/wait.py | 150 - .../pip/_vendor/webencodings/__init__.py | 342 - .../__pycache__/__init__.cpython-38.pyc | Bin 9758 -> 0 bytes .../__pycache__/labels.cpython-38.pyc | Bin 3856 -> 0 bytes .../pip/_vendor/webencodings/labels.py | 231 - .../pip/_vendor/webencodings/mklabels.py | 59 - .../pip/_vendor/webencodings/tests.py | 153 - .../_vendor/webencodings/x_user_defined.py | 325 - .../requests-2.22.0.dist-info/INSTALLER | 1 - .../requests-2.22.0.dist-info/LICENSE | 13 - .../requests-2.22.0.dist-info/METADATA | 145 - .../requests-2.22.0.dist-info/RECORD | 42 - .../requests-2.22.0.dist-info/WHEEL | 6 - .../requests-2.22.0.dist-info/top_level.txt | 1 - .../site-packages/requests/__init__.py | 131 - .../__pycache__/__init__.cpython-38.pyc | Bin 3334 -> 0 bytes .../__pycache__/__version__.cpython-38.pyc | Bin 504 -> 0 bytes .../_internal_utils.cpython-38.pyc | Bin 1274 -> 0 bytes .../__pycache__/adapters.cpython-38.pyc | Bin 16865 -> 0 bytes .../requests/__pycache__/api.cpython-38.pyc | Bin 6461 -> 0 bytes .../requests/__pycache__/auth.cpython-38.pyc | Bin 8283 -> 0 bytes .../requests/__pycache__/certs.cpython-38.pyc | Bin 575 -> 0 bytes .../__pycache__/compat.cpython-38.pyc | Bin 1609 -> 0 bytes .../__pycache__/cookies.cpython-38.pyc | Bin 18788 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 5186 -> 0 bytes .../requests/__pycache__/help.cpython-38.pyc | Bin 2626 -> 0 bytes .../requests/__pycache__/hooks.cpython-38.pyc | Bin 946 -> 0 bytes .../__pycache__/models.cpython-38.pyc | Bin 23810 -> 0 bytes .../__pycache__/packages.cpython-38.pyc | Bin 363 -> 0 bytes .../__pycache__/sessions.cpython-38.pyc | Bin 19496 -> 0 bytes .../__pycache__/status_codes.cpython-38.pyc | Bin 4142 -> 0 bytes .../__pycache__/structures.cpython-38.pyc | Bin 4384 -> 0 bytes .../requests/__pycache__/utils.cpython-38.pyc | Bin 22153 -> 0 bytes .../site-packages/requests/__version__.py | 14 - .../site-packages/requests/_internal_utils.py | 42 - .../site-packages/requests/adapters.py | 533 -- .../python3.8/site-packages/requests/api.py | 158 - .../python3.8/site-packages/requests/auth.py | 305 - .../python3.8/site-packages/requests/certs.py | 18 - .../site-packages/requests/compat.py | 70 - .../site-packages/requests/cookies.py | 549 -- .../site-packages/requests/exceptions.py | 126 - .../python3.8/site-packages/requests/help.py | 119 - .../python3.8/site-packages/requests/hooks.py | 34 - .../site-packages/requests/models.py | 953 -- .../site-packages/requests/packages.py | 14 - .../site-packages/requests/sessions.py | 770 -- .../site-packages/requests/status_codes.py | 120 - .../site-packages/requests/structures.py | 103 - .../python3.8/site-packages/requests/utils.py | 977 -- .../AUTHORS | 11 - .../INSTALLER | 1 - .../LICENSE | 202 - .../METADATA | 117 - .../RECORD | 16 - .../requests_unixsocket-0.2.0.dist-info/WHEEL | 6 - .../pbr.json | 1 - .../top_level.txt | 1 - .../requests_unixsocket/__init__.py | 77 - .../__pycache__/__init__.cpython-38.pyc | Bin 2996 -> 0 bytes .../__pycache__/adapters.cpython-38.pyc | Bin 3567 -> 0 bytes .../__pycache__/testutils.cpython-38.pyc | Bin 3673 -> 0 bytes .../requests_unixsocket/adapters.py | 89 - .../test_requests_unixsocket.cpython-38.pyc | Bin 3497 -> 0 bytes .../tests/test_requests_unixsocket.py | 121 - .../requests_unixsocket/testutils.py | 97 - .../site-packages/setuptools-40.8.0-py3.8.egg | Bin 571891 -> 0 bytes .../python3.8/site-packages/setuptools.pth | 1 - .../python3.8/site-packages/tests/__init__.py | 0 .../tests/__pycache__/__init__.cpython-38.pyc | Bin 145 -> 0 bytes .../__pycache__/test_core.cpython-38.pyc | Bin 9896 -> 0 bytes .../site-packages/tests/test_core.py | 308 - .../urllib3-1.25.8.dist-info/INSTALLER | 1 - .../urllib3-1.25.8.dist-info/LICENSE.txt | 21 - .../urllib3-1.25.8.dist-info/METADATA | 1238 --- .../urllib3-1.25.8.dist-info/RECORD | 78 - .../urllib3-1.25.8.dist-info/WHEEL | 6 - .../urllib3-1.25.8.dist-info/top_level.txt | 1 - .../site-packages/urllib3/__init__.py | 86 - .../__pycache__/__init__.cpython-38.pyc | Bin 2074 -> 0 bytes .../__pycache__/_collections.cpython-38.pyc | Bin 10628 -> 0 bytes .../__pycache__/connection.cpython-38.pyc | Bin 10082 -> 0 bytes .../__pycache__/connectionpool.cpython-38.pyc | Bin 24063 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 10017 -> 0 bytes .../urllib3/__pycache__/fields.cpython-38.pyc | Bin 8088 -> 0 bytes .../__pycache__/filepost.cpython-38.pyc | Bin 2723 -> 0 bytes .../__pycache__/poolmanager.cpython-38.pyc | Bin 12893 -> 0 bytes .../__pycache__/request.cpython-38.pyc | Bin 5611 -> 0 bytes .../__pycache__/response.cpython-38.pyc | Bin 20322 -> 0 bytes .../site-packages/urllib3/_collections.py | 336 - .../site-packages/urllib3/connection.py | 414 - .../site-packages/urllib3/connectionpool.py | 1051 --- .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 152 -> 0 bytes .../_appengine_environ.cpython-38.pyc | Bin 1376 -> 0 bytes .../__pycache__/appengine.cpython-38.pyc | Bin 8201 -> 0 bytes .../__pycache__/ntlmpool.cpython-38.pyc | Bin 3233 -> 0 bytes .../__pycache__/pyopenssl.cpython-38.pyc | Bin 14898 -> 0 bytes .../securetransport.cpython-38.pyc | Bin 19784 -> 0 bytes .../contrib/__pycache__/socks.cpython-38.pyc | Bin 5536 -> 0 bytes .../urllib3/contrib/_appengine_environ.py | 36 - .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 169 -> 0 bytes .../__pycache__/bindings.cpython-38.pyc | Bin 10188 -> 0 bytes .../__pycache__/low_level.cpython-38.pyc | Bin 7509 -> 0 bytes .../contrib/_securetransport/bindings.py | 493 - .../contrib/_securetransport/low_level.py | 328 - .../urllib3/contrib/appengine.py | 314 - .../site-packages/urllib3/contrib/ntlmpool.py | 121 - .../urllib3/contrib/pyopenssl.py | 498 - .../urllib3/contrib/securetransport.py | 859 -- .../site-packages/urllib3/contrib/socks.py | 210 - .../site-packages/urllib3/exceptions.py | 255 - .../python3.8/site-packages/urllib3/fields.py | 273 - .../site-packages/urllib3/filepost.py | 98 - .../urllib3/packages/__init__.py | 5 - .../__pycache__/__init__.cpython-38.pyc | Bin 266 -> 0 bytes .../packages/__pycache__/six.cpython-38.pyc | Bin 26478 -> 0 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 163 -> 0 bytes .../__pycache__/makefile.cpython-38.pyc | Bin 1267 -> 0 bytes .../urllib3/packages/backports/makefile.py | 52 - .../site-packages/urllib3/packages/six.py | 1021 -- .../packages/ssl_match_hostname/__init__.py | 19 - .../__pycache__/__init__.cpython-38.pyc | Bin 507 -> 0 bytes .../_implementation.cpython-38.pyc | Bin 3264 -> 0 bytes .../ssl_match_hostname/_implementation.py | 160 - .../site-packages/urllib3/poolmanager.py | 470 - .../site-packages/urllib3/request.py | 171 - .../site-packages/urllib3/response.py | 809 -- .../site-packages/urllib3/util/__init__.py | 46 - .../util/__pycache__/__init__.cpython-38.pyc | Bin 972 -> 0 bytes .../__pycache__/connection.cpython-38.pyc | Bin 3145 -> 0 bytes .../util/__pycache__/queue.cpython-38.pyc | Bin 1017 -> 0 bytes .../util/__pycache__/request.cpython-38.pyc | Bin 3311 -> 0 bytes .../util/__pycache__/response.cpython-38.pyc | Bin 1938 -> 0 bytes .../util/__pycache__/retry.cpython-38.pyc | Bin 12934 -> 0 bytes .../util/__pycache__/ssl_.cpython-38.pyc | Bin 9802 -> 0 bytes .../util/__pycache__/timeout.cpython-38.pyc | Bin 8832 -> 0 bytes .../util/__pycache__/url.cpython-38.pyc | Bin 10656 -> 0 bytes .../util/__pycache__/wait.cpython-38.pyc | Bin 3066 -> 0 bytes .../site-packages/urllib3/util/connection.py | 138 - .../site-packages/urllib3/util/queue.py | 21 - .../site-packages/urllib3/util/request.py | 135 - .../site-packages/urllib3/util/response.py | 86 - .../site-packages/urllib3/util/retry.py | 450 - .../site-packages/urllib3/util/ssl_.py | 407 - .../site-packages/urllib3/util/timeout.py | 258 - .../site-packages/urllib3/util/url.py | 430 - .../site-packages/urllib3/util/wait.py | 153 - venv/lib64 | 1 - venv/pyvenv.cfg | 3 - 851 files changed, 63 insertions(+), 147859 deletions(-) create mode 100644 requirements delete mode 100644 venv/bin/Activate.ps1 delete mode 100644 venv/bin/activate delete mode 100644 venv/bin/activate.csh delete mode 100644 venv/bin/activate.fish delete mode 100755 venv/bin/chardetect delete mode 100755 venv/bin/easy_install delete mode 100755 venv/bin/easy_install-3.8 delete mode 100755 venv/bin/pip delete mode 100755 venv/bin/pip3 delete mode 100755 venv/bin/pip3.8 delete mode 100755 venv/bin/python delete mode 100755 venv/bin/python3 delete mode 100755 venv/bin/python3.8 delete mode 100644 venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/DESCRIPTION.rst delete mode 100644 venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/INSTALLER delete mode 100644 venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/METADATA delete mode 100644 venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/RECORD delete mode 100644 venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/WHEEL delete mode 100644 venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/metadata.json delete mode 100644 venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/top_level.txt delete mode 100644 venv/lib/python3.8/site-packages/certifi/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/certifi/__main__.py delete mode 100644 venv/lib/python3.8/site-packages/certifi/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/certifi/__pycache__/__main__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/certifi/__pycache__/core.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/certifi/cacert.pem delete mode 100644 venv/lib/python3.8/site-packages/certifi/core.py delete mode 100644 venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/DESCRIPTION.rst delete mode 100644 venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/INSTALLER delete mode 100644 venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/METADATA delete mode 100644 venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/RECORD delete mode 100644 venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/WHEEL delete mode 100644 venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/metadata.json delete mode 100644 venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/top_level.txt delete mode 100644 venv/lib/python3.8/site-packages/chardet/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/big5freq.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/big5prober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/chardistribution.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/charsetgroupprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/charsetprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/codingstatemachine.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/cp949prober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/enums.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/escprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/escsm.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/eucjpprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/euckrfreq.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/euckrprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/euctwfreq.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/euctwprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/gb2312freq.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/gb2312prober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/hebrewprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/jisfreq.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/jpcntx.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/langbulgarianmodel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/langcyrillicmodel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/langgreekmodel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/langhebrewmodel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/langhungarianmodel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/langthaimodel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/langturkishmodel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/latin1prober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/mbcharsetprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/mbcsgroupprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/mbcssm.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/sbcharsetprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/sbcsgroupprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/sjisprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/universaldetector.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/utf8prober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/__pycache__/version.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/big5freq.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/big5prober.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/chardistribution.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/charsetgroupprober.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/charsetprober.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/cli/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/cli/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/cli/__pycache__/chardetect.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/chardet/cli/chardetect.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/codingstatemachine.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/compat.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/cp949prober.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/enums.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/escprober.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/escsm.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/eucjpprober.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/euckrfreq.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/euckrprober.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/euctwfreq.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/euctwprober.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/gb2312freq.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/gb2312prober.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/hebrewprober.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/jisfreq.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/jpcntx.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/langbulgarianmodel.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/langcyrillicmodel.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/langgreekmodel.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/langhebrewmodel.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/langhungarianmodel.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/langthaimodel.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/langturkishmodel.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/latin1prober.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/mbcharsetprober.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/mbcsgroupprober.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/mbcssm.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/sbcharsetprober.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/sbcsgroupprober.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/sjisprober.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/universaldetector.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/utf8prober.py delete mode 100644 venv/lib/python3.8/site-packages/chardet/version.py delete mode 100644 venv/lib/python3.8/site-packages/easy-install.pth delete mode 100644 venv/lib/python3.8/site-packages/idna-2.8.dist-info/INSTALLER delete mode 100644 venv/lib/python3.8/site-packages/idna-2.8.dist-info/LICENSE.rst delete mode 100644 venv/lib/python3.8/site-packages/idna-2.8.dist-info/METADATA delete mode 100644 venv/lib/python3.8/site-packages/idna-2.8.dist-info/RECORD delete mode 100644 venv/lib/python3.8/site-packages/idna-2.8.dist-info/WHEEL delete mode 100644 venv/lib/python3.8/site-packages/idna-2.8.dist-info/top_level.txt delete mode 100644 venv/lib/python3.8/site-packages/idna/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/idna/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/idna/__pycache__/codec.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/idna/__pycache__/compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/idna/__pycache__/core.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/idna/__pycache__/idnadata.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/idna/__pycache__/intranges.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/idna/__pycache__/package_data.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/idna/__pycache__/uts46data.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/idna/codec.py delete mode 100644 venv/lib/python3.8/site-packages/idna/compat.py delete mode 100644 venv/lib/python3.8/site-packages/idna/core.py delete mode 100644 venv/lib/python3.8/site-packages/idna/idnadata.py delete mode 100644 venv/lib/python3.8/site-packages/idna/intranges.py delete mode 100644 venv/lib/python3.8/site-packages/idna/package_data.py delete mode 100644 venv/lib/python3.8/site-packages/idna/uts46data.py delete mode 100644 venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/DESCRIPTION.rst delete mode 100644 venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/INSTALLER delete mode 100644 venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/METADATA delete mode 100644 venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/RECORD delete mode 100644 venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/WHEEL delete mode 100644 venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/metadata.json delete mode 100644 venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/top_level.txt delete mode 100644 venv/lib/python3.8/site-packages/observable/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/observable/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/observable/__pycache__/__version__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/observable/__pycache__/core.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/observable/__version__.py delete mode 100644 venv/lib/python3.8/site-packages/observable/core.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/PKG-INFO delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/SOURCES.txt delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/dependency_links.txt delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/entry_points.txt delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/not-zip-safe delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/top_level.txt delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/__main__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/build_env.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/cache.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/configuration.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/download.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/exceptions.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/index.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/locations.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/pep425tags.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/pyproject.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/resolve.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/wheel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/build_env.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cache.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__pycache__/autocompletion.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__pycache__/base_command.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__pycache__/cmdoptions.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__pycache__/main_parser.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__pycache__/parser.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__pycache__/status_codes.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/autocompletion.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/base_command.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/cmdoptions.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/main_parser.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/parser.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/status_codes.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/check.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/completion.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/configuration.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/download.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/freeze.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/hash.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/help.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/install.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/list.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/search.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/show.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/uninstall.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/wheel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/check.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/completion.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/configuration.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/download.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/freeze.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/hash.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/help.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/install.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/list.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/search.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/show.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/uninstall.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/wheel.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/configuration.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/download.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/exceptions.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/index.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/locations.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__pycache__/candidate.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__pycache__/format_control.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__pycache__/index.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__pycache__/link.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/candidate.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/format_control.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/index.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/link.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__pycache__/check.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__pycache__/freeze.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__pycache__/prepare.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/check.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/freeze.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/prepare.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pep425tags.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pyproject.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__pycache__/constructors.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__pycache__/req_file.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__pycache__/req_install.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__pycache__/req_set.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__pycache__/req_tracker.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__pycache__/req_uninstall.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/constructors.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_file.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_install.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_set.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_tracker.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_uninstall.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/resolve.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/appdirs.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/deprecation.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/encoding.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/filesystem.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/glibc.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/hashes.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/logging.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/misc.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/models.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/outdated.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/packaging.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/setuptools_build.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/temp_dir.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/typing.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/ui.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/appdirs.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/compat.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/deprecation.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/encoding.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/filesystem.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/glibc.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/hashes.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/logging.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/misc.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/models.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/outdated.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/packaging.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/setuptools_build.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/temp_dir.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/typing.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/ui.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__pycache__/bazaar.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__pycache__/git.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__pycache__/mercurial.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__pycache__/subversion.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/bazaar.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/git.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/mercurial.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/subversion.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/wheel.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/appdirs.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/distro.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/pyparsing.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/retrying.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/six.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/appdirs.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/cache.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/controller.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/adapter.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/cache.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/compat.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/controller.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/serialize.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__main__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__pycache__/core.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/cacert.pem delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/core.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/big5freq.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/big5prober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/chardistribution.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/charsetprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/cp949prober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/enums.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/escprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/escsm.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/euckrprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/euctwprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/jisfreq.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/jpcntx.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/latin1prober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/mbcssm.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/sjisprober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/universaldetector.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/utf8prober.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/version.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5freq.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5prober.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/chardistribution.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetgroupprober.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetprober.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/chardetect.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/codingstatemachine.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/compat.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cp949prober.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/enums.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escprober.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escsm.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/eucjpprober.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrfreq.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrprober.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwfreq.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwprober.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312freq.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312prober.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/hebrewprober.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jisfreq.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jpcntx.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langbulgarianmodel.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langcyrillicmodel.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langgreekmodel.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhebrewmodel.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhungarianmodel.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langthaimodel.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langturkishmodel.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/latin1prober.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcharsetprober.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcsgroupprober.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcssm.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcharsetprober.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcsgroupprober.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sjisprober.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/universaldetector.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/utf8prober.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/version.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/ansi.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/initialise.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/win32.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/winterm.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansi.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansitowin32.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/initialise.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/win32.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/winterm.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__pycache__/compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__pycache__/resources.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__pycache__/scripts.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__pycache__/util.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/misc.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/shutil.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.cfg delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/tarfile.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/compat.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/database.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/index.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/locators.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/manifest.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/markers.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/metadata.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/resources.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/scripts.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t32.exe delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t64.exe delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/util.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/version.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w32.exe delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w64.exe delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/wheel.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distro.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/_utils.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/constants.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/html5parser.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/serializer.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_ihatexml.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_inputstream.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_tokenizer.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/_base.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/datrie.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/py.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_utils.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/constants.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/alphabeticalattributes.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/base.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/inject_meta_charset.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/lint.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/optionaltags.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/sanitizer.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/whitespace.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/html5parser.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/serializer.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/genshi.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/sax.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/base.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/dom.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree_lxml.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/base.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/dom.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree_lxml.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/genshi.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__pycache__/core.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__pycache__/idnadata.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__pycache__/intranges.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__pycache__/package_data.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/codec.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/compat.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/core.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/idnadata.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/intranges.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/package_data.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/uts46data.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/ipaddress.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/linklockfile.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/mkdirlockfile.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/pidlockfile.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/sqlitelockfile.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/symlinklockfile.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__pycache__/_version.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__pycache__/exceptions.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__pycache__/fallback.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/_version.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/exceptions.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/fallback.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__about__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/__about__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/_compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/_structures.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/markers.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/requirements.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/utils.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/version.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_compat.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_structures.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/markers.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/requirements.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/specifiers.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/utils.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/version.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__pycache__/compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__pycache__/wrappers.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/_in_process.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/build.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/check.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/colorlog.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/compat.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/envbuild.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/wrappers.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/py31compat.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__pycache__/bar.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__pycache__/helpers.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__pycache__/spinner.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/bar.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/counter.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/helpers.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/spinner.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pyparsing.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/core.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/parser.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/test.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/utils.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/writer.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/core.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/parser.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/test.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/utils.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/writer.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/__version__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/_internal_utils.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/adapters.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/api.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/auth.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/certs.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/cookies.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/exceptions.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/hooks.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/models.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/packages.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/sessions.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/status_codes.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/structures.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/utils.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__version__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/_internal_utils.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/adapters.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/api.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/auth.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/certs.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/compat.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/cookies.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/exceptions.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/help.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/hooks.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/models.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/packages.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/sessions.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/status_codes.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/structures.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/utils.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/retrying.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/six.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/_collections.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/connection.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/exceptions.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/fields.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/filepost.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/request.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/response.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/_collections.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connection.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connectionpool.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_appengine_environ.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/bindings.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/low_level.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/appengine.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/ntlmpool.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/pyopenssl.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/securetransport.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/socks.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/exceptions.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/fields.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/filepost.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/__pycache__/six.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/makefile.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/six.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/poolmanager.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/request.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/response.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/connection.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/queue.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/request.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/response.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/retry.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/url.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/wait.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/connection.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/queue.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/request.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/response.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/retry.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/ssl_.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/timeout.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/url.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/wait.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/__pycache__/labels.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/labels.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/mklabels.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/tests.py delete mode 100644 venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/x_user_defined.py delete mode 100644 venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/LICENSE delete mode 100644 venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/METADATA delete mode 100644 venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/RECORD delete mode 100644 venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/top_level.txt delete mode 100644 venv/lib/python3.8/site-packages/requests/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/__version__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/_internal_utils.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/adapters.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/api.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/auth.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/certs.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/cookies.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/exceptions.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/help.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/hooks.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/models.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/packages.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/sessions.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/status_codes.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/structures.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__pycache__/utils.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests/__version__.py delete mode 100644 venv/lib/python3.8/site-packages/requests/_internal_utils.py delete mode 100644 venv/lib/python3.8/site-packages/requests/adapters.py delete mode 100644 venv/lib/python3.8/site-packages/requests/api.py delete mode 100644 venv/lib/python3.8/site-packages/requests/auth.py delete mode 100644 venv/lib/python3.8/site-packages/requests/certs.py delete mode 100644 venv/lib/python3.8/site-packages/requests/compat.py delete mode 100644 venv/lib/python3.8/site-packages/requests/cookies.py delete mode 100644 venv/lib/python3.8/site-packages/requests/exceptions.py delete mode 100644 venv/lib/python3.8/site-packages/requests/help.py delete mode 100644 venv/lib/python3.8/site-packages/requests/hooks.py delete mode 100644 venv/lib/python3.8/site-packages/requests/models.py delete mode 100644 venv/lib/python3.8/site-packages/requests/packages.py delete mode 100644 venv/lib/python3.8/site-packages/requests/sessions.py delete mode 100644 venv/lib/python3.8/site-packages/requests/status_codes.py delete mode 100644 venv/lib/python3.8/site-packages/requests/structures.py delete mode 100644 venv/lib/python3.8/site-packages/requests/utils.py delete mode 100644 venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/AUTHORS delete mode 100644 venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/LICENSE delete mode 100644 venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/METADATA delete mode 100644 venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/RECORD delete mode 100644 venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/pbr.json delete mode 100644 venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/top_level.txt delete mode 100644 venv/lib/python3.8/site-packages/requests_unixsocket/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/requests_unixsocket/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests_unixsocket/__pycache__/adapters.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests_unixsocket/__pycache__/testutils.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/requests_unixsocket/adapters.py delete mode 100644 venv/lib/python3.8/site-packages/requests_unixsocket/tests/__pycache__/test_requests_unixsocket.cpython-38.pyc delete mode 100755 venv/lib/python3.8/site-packages/requests_unixsocket/tests/test_requests_unixsocket.py delete mode 100644 venv/lib/python3.8/site-packages/requests_unixsocket/testutils.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools-40.8.0-py3.8.egg delete mode 100644 venv/lib/python3.8/site-packages/setuptools.pth delete mode 100644 venv/lib/python3.8/site-packages/tests/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/tests/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/tests/__pycache__/test_core.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/tests/test_core.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/INSTALLER delete mode 100644 venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/LICENSE.txt delete mode 100644 venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/METADATA delete mode 100644 venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/RECORD delete mode 100644 venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/WHEEL delete mode 100644 venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/top_level.txt delete mode 100644 venv/lib/python3.8/site-packages/urllib3/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/__pycache__/_collections.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/__pycache__/connection.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/__pycache__/connectionpool.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/__pycache__/exceptions.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/__pycache__/fields.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/__pycache__/filepost.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/__pycache__/poolmanager.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/__pycache__/request.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/__pycache__/response.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/_collections.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/connection.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/connectionpool.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/_appengine_environ.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/appengine.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/ntlmpool.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/securetransport.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/socks.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/_appengine_environ.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/bindings.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/low_level.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/appengine.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/ntlmpool.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/pyopenssl.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/securetransport.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/contrib/socks.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/exceptions.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/fields.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/filepost.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/packages/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/packages/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/packages/__pycache__/six.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/packages/backports/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/packages/backports/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/packages/backports/__pycache__/makefile.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/packages/backports/makefile.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/packages/six.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/_implementation.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/poolmanager.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/request.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/response.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/__pycache__/connection.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/__pycache__/queue.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/__pycache__/request.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/__pycache__/response.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/__pycache__/retry.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/__pycache__/ssl_.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/__pycache__/timeout.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/__pycache__/url.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/__pycache__/wait.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/connection.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/queue.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/request.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/response.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/retry.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/ssl_.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/timeout.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/url.py delete mode 100644 venv/lib/python3.8/site-packages/urllib3/util/wait.py delete mode 120000 venv/lib64 delete mode 100644 venv/pyvenv.cfg diff --git a/.gitignore b/.gitignore index ee05595..698a214 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .idea __pycache__ +venv diff --git a/requirements b/requirements new file mode 100644 index 0000000..23b9c80 --- /dev/null +++ b/requirements @@ -0,0 +1,62 @@ +anytree==2.6.0 +asn1crypto==0.24.0 +casttube==0.2.0 +cffi==1.12.3 +chardet==3.0.4 +Click==7.0 +colorama==0.4.1 +cryptography==2.7 +cssutils==1.0.2 +cupshelpers==1.0 +decorator==4.4.0 +entrypoints==0.3 +evdev==1.2.0 +Flask==1.1.1 +gajim==1.1.3 +idna==2.8 +ifaddr==0.1.6 +itsdangerous==1.1.0 +jeepney==0.4.2 +Jinja2==2.10.1 +keyring==18.0.1 +lutris==0.5.4 +lxml==4.4.1 +MarkupSafe==1.1.1 +meld==3.20.1 +meson==0.52.1 +mutagen==1.43.0 +nbxmpp==0.6.10 +netifaces==0.10.9 +Pillow==6.2.1 +ply==3.11 +precis-i18n==1.0.1 +protobuf==3.10.0 +psutil==5.6.3 +pyasn1==0.4.6 +pycairo==1.18.1 +PyChromecast==4.1.0 +pycparser==2.19 +pycups==1.9.74 +Pygments==2.5.2 +PyGObject==3.32.2 +pyOpenSSL==19.0.0 +pysmbc==1.0.17 +pyte==0.8.0 +python-axolotl==0.2.3 +python-axolotl-curve25519==0.4.1.post2 +pyxdg==0.26 +PyYAML==5.2 +qrcode==6.1 +requests==2.22.0 +SecretStorage==3.1.2 +six==1.12.0 +soco==0.18.1 +thefuck==3.29 +unrpa==2.3.0 +urllib3==1.25.6 +virtualenv==16.7.5 +wcwidth==0.1.7 +Werkzeug==0.16.1 +xmltodict==0.12.0 +youtube-dl==2020.1.24 +zeroconf==0.24.4 diff --git a/venv/bin/Activate.ps1 b/venv/bin/Activate.ps1 deleted file mode 100644 index 5b9adb2..0000000 --- a/venv/bin/Activate.ps1 +++ /dev/null @@ -1,231 +0,0 @@ -<# -.Synopsis -Activate a Python virtual environment for the current Powershell session. - -.Description -Pushes the python executable for a virtual environment to the front of the -$Env:PATH environment variable and sets the prompt to signify that you are -in a Python virtual environment. Makes use of the command line switches as -well as the `pyvenv.cfg` file values present in the virtual environment. - -.Parameter VenvDir -Path to the directory that contains the virtual environment to activate. The -default value for this is the parent of the directory that the Activate.ps1 -script is located within. - -.Parameter Prompt -The prompt prefix to display when this virtual environment is activated. By -default, this prompt is the name of the virtual environment folder (VenvDir) -surrounded by parentheses and followed by a single space (ie. '(.venv) '). - -.Example -Activate.ps1 -Activates the Python virtual environment that contains the Activate.ps1 script. - -.Example -Activate.ps1 -Verbose -Activates the Python virtual environment that contains the Activate.ps1 script, -and shows extra information about the activation as it executes. - -.Example -Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv -Activates the Python virtual environment located in the specified location. - -.Example -Activate.ps1 -Prompt "MyPython" -Activates the Python virtual environment that contains the Activate.ps1 script, -and prefixes the current prompt with the specified string (surrounded in -parentheses) while the virtual environment is active. - - -#> -Param( - [Parameter(Mandatory = $false)] - [String] - $VenvDir, - [Parameter(Mandatory = $false)] - [String] - $Prompt -) - -<# Function declarations --------------------------------------------------- #> - -<# -.Synopsis -Remove all shell session elements added by the Activate script, including the -addition of the virtual environment's Python executable from the beginning of -the PATH variable. - -.Parameter NonDestructive -If present, do not remove this function from the global namespace for the -session. - -#> -function global:deactivate ([switch]$NonDestructive) { - # Revert to original values - - # The prior prompt: - if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { - Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt - Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT - } - - # The prior PYTHONHOME: - if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { - Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME - Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME - } - - # The prior PATH: - if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { - Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH - Remove-Item -Path Env:_OLD_VIRTUAL_PATH - } - - # Just remove the VIRTUAL_ENV altogether: - if (Test-Path -Path Env:VIRTUAL_ENV) { - Remove-Item -Path env:VIRTUAL_ENV - } - - # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: - if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { - Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force - } - - # Leave deactivate function in the global namespace if requested: - if (-not $NonDestructive) { - Remove-Item -Path function:deactivate - } -} - -<# -.Description -Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the -given folder, and returns them in a map. - -For each line in the pyvenv.cfg file, if that line can be parsed into exactly -two strings separated by `=` (with any amount of whitespace surrounding the =) -then it is considered a `key = value` line. The left hand string is the key, -the right hand is the value. - -If the value starts with a `'` or a `"` then the first and last character is -stripped from the value before being captured. - -.Parameter ConfigDir -Path to the directory that contains the `pyvenv.cfg` file. -#> -function Get-PyVenvConfig( - [String] - $ConfigDir -) { - Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" - - # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). - $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue - - # An empty map will be returned if no config file is found. - $pyvenvConfig = @{ } - - if ($pyvenvConfigPath) { - - Write-Verbose "File exists, parse `key = value` lines" - $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath - - $pyvenvConfigContent | ForEach-Object { - $keyval = $PSItem -split "\s*=\s*", 2 - if ($keyval[0] -and $keyval[1]) { - $val = $keyval[1] - - # Remove extraneous quotations around a string value. - if ("'""".Contains($val.Substring(0,1))) { - $val = $val.Substring(1, $val.Length - 2) - } - - $pyvenvConfig[$keyval[0]] = $val - Write-Verbose "Adding Key: '$($keyval[0])'='$val'" - } - } - } - return $pyvenvConfig -} - - -<# Begin Activate script --------------------------------------------------- #> - -# Determine the containing directory of this script -$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition -$VenvExecDir = Get-Item -Path $VenvExecPath - -Write-Verbose "Activation script is located in path: '$VenvExecPath'" -Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" -Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" - -# Set values required in priority: CmdLine, ConfigFile, Default -# First, get the location of the virtual environment, it might not be -# VenvExecDir if specified on the command line. -if ($VenvDir) { - Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" -} else { - Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." - $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") - $VenvDir = $VenvDir.Insert($VenvDir.Length, "/") - Write-Verbose "VenvDir=$VenvDir" -} - -# Next, read the `pyvenv.cfg` file to determine any required value such -# as `prompt`. -$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir - -# Next, set the prompt from the command line, or the config file, or -# just use the name of the virtual environment folder. -if ($Prompt) { - Write-Verbose "Prompt specified as argument, using '$Prompt'" -} else { - Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" - if ($pyvenvCfg -and $pyvenvCfg['prompt']) { - Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" - $Prompt = $pyvenvCfg['prompt']; - } - else { - Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)" - Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" - $Prompt = Split-Path -Path $venvDir -Leaf - } -} - -Write-Verbose "Prompt = '$Prompt'" -Write-Verbose "VenvDir='$VenvDir'" - -# Deactivate any currently active virtual environment, but leave the -# deactivate function in place. -deactivate -nondestructive - -# Now set the environment variable VIRTUAL_ENV, used by many tools to determine -# that there is an activated venv. -$env:VIRTUAL_ENV = $VenvDir - -if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { - - Write-Verbose "Setting prompt to '$Prompt'" - - # Set the prompt to include the env name - # Make sure _OLD_VIRTUAL_PROMPT is global - function global:_OLD_VIRTUAL_PROMPT { "" } - Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT - New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt - - function global:prompt { - Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " - _OLD_VIRTUAL_PROMPT - } -} - -# Clear PYTHONHOME -if (Test-Path -Path Env:PYTHONHOME) { - Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME - Remove-Item -Path Env:PYTHONHOME -} - -# Add the venv to the PATH -Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH -$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/venv/bin/activate b/venv/bin/activate deleted file mode 100644 index 75b73e8..0000000 --- a/venv/bin/activate +++ /dev/null @@ -1,76 +0,0 @@ -# This file must be used with "source bin/activate" *from bash* -# you cannot run it directly - -deactivate () { - # reset old environment variables - if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then - PATH="${_OLD_VIRTUAL_PATH:-}" - export PATH - unset _OLD_VIRTUAL_PATH - fi - if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then - PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" - export PYTHONHOME - unset _OLD_VIRTUAL_PYTHONHOME - fi - - # This should detect bash and zsh, which have a hash command that must - # be called to get it to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r - fi - - if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then - PS1="${_OLD_VIRTUAL_PS1:-}" - export PS1 - unset _OLD_VIRTUAL_PS1 - fi - - unset VIRTUAL_ENV - if [ ! "${1:-}" = "nondestructive" ] ; then - # Self destruct! - unset -f deactivate - fi -} - -# unset irrelevant variables -deactivate nondestructive - -VIRTUAL_ENV="/home/rhetenor/FlippR/flippr-game/venv" -export VIRTUAL_ENV - -_OLD_VIRTUAL_PATH="$PATH" -PATH="$VIRTUAL_ENV/bin:$PATH" -export PATH - -# unset PYTHONHOME if set -# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) -# could use `if (set -u; : $PYTHONHOME) ;` in bash -if [ -n "${PYTHONHOME:-}" ] ; then - _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" - unset PYTHONHOME -fi - -if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then - _OLD_VIRTUAL_PS1="${PS1:-}" - if [ "x(venv) " != x ] ; then - PS1="(venv) ${PS1:-}" - else - if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then - # special case for Aspen magic directories - # see http://www.zetadev.com/software/aspen/ - PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" - else - PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" - fi - fi - export PS1 -fi - -# This should detect bash and zsh, which have a hash command that must -# be called to get it to forget past commands. Without forgetting -# past commands the $PATH changes we made may not be respected -if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r -fi diff --git a/venv/bin/activate.csh b/venv/bin/activate.csh deleted file mode 100644 index 588eb9a..0000000 --- a/venv/bin/activate.csh +++ /dev/null @@ -1,37 +0,0 @@ -# This file must be used with "source bin/activate.csh" *from csh*. -# You cannot run it directly. -# Created by Davide Di Blasi . -# Ported to Python 3.3 venv by Andrew Svetlov - -alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate' - -# Unset irrelevant variables. -deactivate nondestructive - -setenv VIRTUAL_ENV "/home/rhetenor/FlippR/flippr-game/venv" - -set _OLD_VIRTUAL_PATH="$PATH" -setenv PATH "$VIRTUAL_ENV/bin:$PATH" - - -set _OLD_VIRTUAL_PROMPT="$prompt" - -if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then - if ("venv" != "") then - set env_name = "venv" - else - if (`basename "VIRTUAL_ENV"` == "__") then - # special case for Aspen magic directories - # see http://www.zetadev.com/software/aspen/ - set env_name = `basename \`dirname "$VIRTUAL_ENV"\`` - else - set env_name = `basename "$VIRTUAL_ENV"` - endif - endif - set prompt = "[$env_name] $prompt" - unset env_name -endif - -alias pydoc python -m pydoc - -rehash diff --git a/venv/bin/activate.fish b/venv/bin/activate.fish deleted file mode 100644 index 7e3ebdd..0000000 --- a/venv/bin/activate.fish +++ /dev/null @@ -1,75 +0,0 @@ -# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org) -# you cannot run it directly - -function deactivate -d "Exit virtualenv and return to normal shell environment" - # reset old environment variables - if test -n "$_OLD_VIRTUAL_PATH" - set -gx PATH $_OLD_VIRTUAL_PATH - set -e _OLD_VIRTUAL_PATH - end - if test -n "$_OLD_VIRTUAL_PYTHONHOME" - set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME - set -e _OLD_VIRTUAL_PYTHONHOME - end - - if test -n "$_OLD_FISH_PROMPT_OVERRIDE" - functions -e fish_prompt - set -e _OLD_FISH_PROMPT_OVERRIDE - functions -c _old_fish_prompt fish_prompt - functions -e _old_fish_prompt - end - - set -e VIRTUAL_ENV - if test "$argv[1]" != "nondestructive" - # Self destruct! - functions -e deactivate - end -end - -# unset irrelevant variables -deactivate nondestructive - -set -gx VIRTUAL_ENV "/home/rhetenor/FlippR/flippr-game/venv" - -set -gx _OLD_VIRTUAL_PATH $PATH -set -gx PATH "$VIRTUAL_ENV/bin" $PATH - -# unset PYTHONHOME if set -if set -q PYTHONHOME - set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME - set -e PYTHONHOME -end - -if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" - # fish uses a function instead of an env var to generate the prompt. - - # save the current fish_prompt function as the function _old_fish_prompt - functions -c fish_prompt _old_fish_prompt - - # with the original prompt function renamed, we can override with our own. - function fish_prompt - # Save the return status of the last command - set -l old_status $status - - # Prompt override? - if test -n "(venv) " - printf "%s%s" "(venv) " (set_color normal) - else - # ...Otherwise, prepend env - set -l _checkbase (basename "$VIRTUAL_ENV") - if test $_checkbase = "__" - # special case for Aspen magic directories - # see http://www.zetadev.com/software/aspen/ - printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) - else - printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal) - end - end - - # Restore the return status of the previous command. - echo "exit $old_status" | . - _old_fish_prompt - end - - set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" -end diff --git a/venv/bin/chardetect b/venv/bin/chardetect deleted file mode 100755 index 7478f1c..0000000 --- a/venv/bin/chardetect +++ /dev/null @@ -1,10 +0,0 @@ -#!/home/rhetenor/FlippR/flippr-game/venv/bin/python -# -*- coding: utf-8 -*- -import re -import sys - -from chardet.cli.chardetect import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/easy_install b/venv/bin/easy_install deleted file mode 100755 index 4737dc1..0000000 --- a/venv/bin/easy_install +++ /dev/null @@ -1,12 +0,0 @@ -#!/home/rhetenor/FlippR/flippr-game/venv/bin/python -# EASY-INSTALL-ENTRY-SCRIPT: 'setuptools==40.8.0','console_scripts','easy_install' -__requires__ = 'setuptools==40.8.0' -import re -import sys -from pkg_resources import load_entry_point - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit( - load_entry_point('setuptools==40.8.0', 'console_scripts', 'easy_install')() - ) diff --git a/venv/bin/easy_install-3.8 b/venv/bin/easy_install-3.8 deleted file mode 100755 index dd3ca56..0000000 --- a/venv/bin/easy_install-3.8 +++ /dev/null @@ -1,12 +0,0 @@ -#!/home/rhetenor/FlippR/flippr-game/venv/bin/python -# EASY-INSTALL-ENTRY-SCRIPT: 'setuptools==40.8.0','console_scripts','easy_install-3.8' -__requires__ = 'setuptools==40.8.0' -import re -import sys -from pkg_resources import load_entry_point - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit( - load_entry_point('setuptools==40.8.0', 'console_scripts', 'easy_install-3.8')() - ) diff --git a/venv/bin/pip b/venv/bin/pip deleted file mode 100755 index 2b1187b..0000000 --- a/venv/bin/pip +++ /dev/null @@ -1,12 +0,0 @@ -#!/home/rhetenor/FlippR/flippr-game/venv/bin/python -# EASY-INSTALL-ENTRY-SCRIPT: 'pip==19.0.3','console_scripts','pip' -__requires__ = 'pip==19.0.3' -import re -import sys -from pkg_resources import load_entry_point - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit( - load_entry_point('pip==19.0.3', 'console_scripts', 'pip')() - ) diff --git a/venv/bin/pip3 b/venv/bin/pip3 deleted file mode 100755 index d06299d..0000000 --- a/venv/bin/pip3 +++ /dev/null @@ -1,12 +0,0 @@ -#!/home/rhetenor/FlippR/flippr-game/venv/bin/python -# EASY-INSTALL-ENTRY-SCRIPT: 'pip==19.0.3','console_scripts','pip3' -__requires__ = 'pip==19.0.3' -import re -import sys -from pkg_resources import load_entry_point - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit( - load_entry_point('pip==19.0.3', 'console_scripts', 'pip3')() - ) diff --git a/venv/bin/pip3.8 b/venv/bin/pip3.8 deleted file mode 100755 index 7c56571..0000000 --- a/venv/bin/pip3.8 +++ /dev/null @@ -1,12 +0,0 @@ -#!/home/rhetenor/FlippR/flippr-game/venv/bin/python -# EASY-INSTALL-ENTRY-SCRIPT: 'pip==19.0.3','console_scripts','pip3.8' -__requires__ = 'pip==19.0.3' -import re -import sys -from pkg_resources import load_entry_point - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit( - load_entry_point('pip==19.0.3', 'console_scripts', 'pip3.8')() - ) diff --git a/venv/bin/python b/venv/bin/python deleted file mode 100755 index cf2a53c84c0dcea875cf8ee3902d8a49af4fdbde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14408 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 import certifi - - >>> certifi.where() - '/usr/local/lib/python2.7/site-packages/certifi/cacert.pem' - -Or from the command line:: - - $ python -m certifi - /usr/local/lib/python2.7/site-packages/certifi/cacert.pem - -Enjoy! - -1024-bit Root Certificates -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Browsers and certificate authorities have concluded that 1024-bit keys are -unacceptably weak for certificates, particularly root certificates. For this -reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its -bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key) -certificate from the same CA. Because Mozilla removed these certificates from -its bundle, ``certifi`` removed them as well. - -In previous versions, ``certifi`` provided the ``certifi.old_where()`` function -to intentionally re-add the 1024-bit roots back into your bundle. This was not -recommended in production and therefore was removed at the end of 2018. - -.. _`Certifi`: https://certifi.io/en/latest/ -.. _`Requests`: http://docs.python-requests.org/en/latest/ - - diff --git a/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/INSTALLER b/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/METADATA b/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/METADATA deleted file mode 100644 index bc0532f..0000000 --- a/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/METADATA +++ /dev/null @@ -1,74 +0,0 @@ -Metadata-Version: 2.0 -Name: certifi -Version: 2019.11.28 -Summary: Python package for providing Mozilla's CA Bundle. -Home-page: https://certifi.io/ -Author: Kenneth Reitz -Author-email: me@kennethreitz.com -License: MPL-2.0 -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) -Classifier: Natural Language :: English -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 - -Certifi: Python SSL Certificates -================================ - -`Certifi`_ is a carefully curated collection of Root Certificates for -validating the trustworthiness of SSL certificates while verifying the identity -of TLS hosts. It has been extracted from the `Requests`_ project. - -Installation ------------- - -``certifi`` is available on PyPI. Simply install it with ``pip``:: - - $ pip install certifi - -Usage ------ - -To reference the installed certificate authority (CA) bundle, you can use the -built-in function:: - - >>> import certifi - - >>> certifi.where() - '/usr/local/lib/python2.7/site-packages/certifi/cacert.pem' - -Or from the command line:: - - $ python -m certifi - /usr/local/lib/python2.7/site-packages/certifi/cacert.pem - -Enjoy! - -1024-bit Root Certificates -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Browsers and certificate authorities have concluded that 1024-bit keys are -unacceptably weak for certificates, particularly root certificates. For this -reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its -bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key) -certificate from the same CA. Because Mozilla removed these certificates from -its bundle, ``certifi`` removed them as well. - -In previous versions, ``certifi`` provided the ``certifi.old_where()`` function -to intentionally re-add the 1024-bit roots back into your bundle. This was not -recommended in production and therefore was removed at the end of 2018. - -.. _`Certifi`: https://certifi.io/en/latest/ -.. _`Requests`: http://docs.python-requests.org/en/latest/ - - diff --git a/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/RECORD b/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/RECORD deleted file mode 100644 index b9f761f..0000000 --- a/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/RECORD +++ /dev/null @@ -1,14 +0,0 @@ -certifi-2019.11.28.dist-info/DESCRIPTION.rst,sha256=aLNHONztn2ZiBpSTivVFy6EDIWmuNYSsEQwx4NWbvB4,1580 -certifi-2019.11.28.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -certifi-2019.11.28.dist-info/METADATA,sha256=CnYsfjDpEJJMNgBGSD2v_WN-PS-g4ZmIt1aiZ8UiRiE,2523 -certifi-2019.11.28.dist-info/RECORD,, -certifi-2019.11.28.dist-info/WHEEL,sha256=5wvfB7GvgZAbKBSE9uX9Zbi6LCL-_KgezgHblXhCRnM,113 -certifi-2019.11.28.dist-info/metadata.json,sha256=9MSLVS0RruV3LnE_uHbsv6QHamn7Lq9GwQ_gZOrw4Mw,1023 -certifi-2019.11.28.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 -certifi/__init__.py,sha256=JVwzDhkMttyVVtfNDrU_i0v2a-WmtEBXq0Z8oz4Ghzk,52 -certifi/__main__.py,sha256=FiOYt1Fltst7wk9DRa6GCoBr8qBUxlNQu_MKJf04E6s,41 -certifi/__pycache__/__init__.cpython-38.pyc,, -certifi/__pycache__/__main__.cpython-38.pyc,, -certifi/__pycache__/core.cpython-38.pyc,, -certifi/cacert.pem,sha256=cyvv5Jx1gHACNEj2GaOrsIj0Tk8FmSvHR42uhzvlatg,281457 -certifi/core.py,sha256=EuFc2BsToG5O1-qsx4BSjQ1r1-7WRtH87b1WflZOWhI,218 diff --git a/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/WHEEL b/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/WHEEL deleted file mode 100644 index 7bf9daa..0000000 --- a/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.30.0.a0) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/metadata.json b/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/metadata.json deleted file mode 100644 index 3a14841..0000000 --- a/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)", "Natural Language :: English", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7"], "extensions": {"python.details": {"contacts": [{"email": "me@kennethreitz.com", "name": "Kenneth Reitz", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://certifi.io/"}}}, "generator": "bdist_wheel (0.30.0.a0)", "license": "MPL-2.0", "metadata_version": "2.0", "name": "certifi", "summary": "Python package for providing Mozilla's CA Bundle.", "version": "2019.11.28"} \ No newline at end of file diff --git a/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/top_level.txt b/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/top_level.txt deleted file mode 100644 index 963eac5..0000000 --- a/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -certifi diff --git a/venv/lib/python3.8/site-packages/certifi/__init__.py b/venv/lib/python3.8/site-packages/certifi/__init__.py deleted file mode 100644 index 0d59a05..0000000 --- a/venv/lib/python3.8/site-packages/certifi/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .core import where - -__version__ = "2019.11.28" diff --git a/venv/lib/python3.8/site-packages/certifi/__main__.py b/venv/lib/python3.8/site-packages/certifi/__main__.py deleted file mode 100644 index 5f1da0d..0000000 --- a/venv/lib/python3.8/site-packages/certifi/__main__.py +++ /dev/null @@ -1,2 +0,0 @@ -from certifi import where -print(where()) diff --git a/venv/lib/python3.8/site-packages/certifi/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/certifi/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 3e2db7a274d49962873556f8a54f4d8c025f6f9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmWIL<>g`kg5|dQaV9|eF^GcL;fbm1L%6!s+<<%)HE!_;|g7 X%3B;Zx%nxjIjMFa2NZ*>;9&v)wW~4l diff --git a/venv/lib/python3.8/site-packages/certifi/__pycache__/__main__.cpython-38.pyc b/venv/lib/python3.8/site-packages/certifi/__pycache__/__main__.cpython-38.pyc deleted file mode 100644 index 17e589264b9a58a9b48a890b7ee35000381ec8f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmWIL<>g`kg5|dQahgE-F^Gc`1jLi(qKvoJ< zFoP!ZOQ1Z1CgUyE@{H7?R6kATTkOfHMJ1VOnMEKoZm|{=W#*NvWGG?<^1#F|Q~i?M z0{w!_0^Q8K;*!Li9No0C%52LL(^P$^RyZ9WpPQJO7ay-zPQ`QV^#K3?A2#LK5bjg4f#g5{V#F68IS^*OuLZ^yf^2)?7 zFmY}Q?UU}^oh`k4ceBxmBEaSn{@IOe3nDdryc-%(09xkGWV zn$cWnBMUicm-Ou)l-`%Ji)zIem58)33*B^)DMcik&SX`U8L676Qh8sfBFZzTG-*XW zq2DkRO>@V8z)<)Qw-DVakU?|&L5#P?uYK*mfXTJ9MW!pdmx}{SRA>D*Go>AHshg}8 zHe{@jm0-;Jb0wP?TU>l19fI=DSz_uoX=OX!xg8fz%f}0IE|T50`>eEp)ot)x3N41t roO6lrkZ5<|*s}x1xXKyR?xx$v?UVyLh7TKF_Sd@hpxcW0N1^u%VDD?5 diff --git a/venv/lib/python3.8/site-packages/certifi/cacert.pem b/venv/lib/python3.8/site-packages/certifi/cacert.pem deleted file mode 100644 index a4758ef..0000000 --- a/venv/lib/python3.8/site-packages/certifi/cacert.pem +++ /dev/null @@ -1,4602 +0,0 @@ - -# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Label: "GlobalSign Root CA" -# Serial: 4835703278459707669005204 -# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a -# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c -# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Label: "GlobalSign Root CA - R2" -# Serial: 4835703278459682885658125 -# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 -# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe -# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 3 Public Primary Certification Authority - G3" -# Serial: 206684696279472310254277870180966723415 -# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 -# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 -# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Premium 2048 Secure Server CA" -# Serial: 946069240 -# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 -# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 -# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Label: "AddTrust External Root" -# Serial: 1 -# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f -# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 -# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. -# Label: "GeoTrust Global CA" -# Serial: 144470 -# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 -# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 -# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Label: "GeoTrust Universal CA" -# Serial: 1 -# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 -# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 -# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Universal CA 2" -# Serial: 1 -# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 -# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 -# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -# Issuer: CN=AAA Certificate Services O=Comodo CA Limited -# Subject: CN=AAA Certificate Services O=Comodo CA Limited -# Label: "Comodo AAA Services root" -# Serial: 1 -# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 -# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 -# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Label: "QuoVadis Root CA" -# Serial: 985026699 -# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 -# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 -# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -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=Sonera Class2 CA O=Sonera -# Subject: CN=Sonera Class2 CA O=Sonera -# Label: "Sonera Class 2 Root CA" -# Serial: 29 -# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb -# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 -# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------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" -# Serial: 107108908803651509692980124233745014957 -# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 -# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 -# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - -# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Label: "Starfield Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 -# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a -# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -# Issuer: O=Government Root Certification Authority -# Subject: O=Government Root Certification Authority -# Label: "Taiwan GRCA" -# Serial: 42023070807708724159991140556527066870 -# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e -# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 -# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ -MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow -PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR -IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q -gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy -yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts -F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 -jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx -ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC -VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK -YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH -EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud -DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE -MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK -UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf -qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK -ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE -JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 -hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 -EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm -nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX -udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz -ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe -LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl -pYYsfPQS ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Label: "DST Root CA X3" -# Serial: 91299735575339953335919266965803778155 -# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 -# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 -# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Label: "SwissSign Gold CA - G2" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Label: "SwissSign Silver CA - G2" -# Serial: 5700383053117599563 -# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 -# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb -# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Label: "GeoTrust Primary Certification Authority" -# Serial: 32798226551256963324313806436981982369 -# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf -# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 -# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA" -# Serial: 69529181992039203566298953787712940909 -# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 -# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 -# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" -# Serial: 33037644167568058970164719475676101450 -# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c -# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 -# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Label: "Network Solutions Certificate Authority" -# Serial: 116697915152937497490437556386812487904 -# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e -# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce -# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GA CA" -# Serial: 86718877871133159090080555911823548314 -# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 -# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 -# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB -ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly -aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl -ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w -NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G -A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD -VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX -SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR -VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 -w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF -mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg -4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 -4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw -EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx -SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 -ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 -vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi -Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ -/L7fCg0= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc -# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc -# Label: "Cybertrust Global Root" -# Serial: 4835703278459682877484360 -# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 -# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 -# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Label: "ePKI Root Certification Authority" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G3" -# Serial: 28809105769928564313984085209975885599 -# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 -# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd -# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB -mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT -MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ -BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 -BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz -+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm -hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn -5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W -JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL -DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC -huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB -AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB -zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN -kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH -SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G -spki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G2" -# Serial: 71758320672825410020661621085256472406 -# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f -# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 -# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp -IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi -BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw -MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig -YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v -dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ -BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 -papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K -DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 -KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox -XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G3" -# Serial: 127614157056681299805556476275995414779 -# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 -# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 -# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB -rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV -BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa -Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl -LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u -MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm -gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 -YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf -b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 -9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S -zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk -OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA -2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW -oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c -KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM -m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu -MdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G2" -# Serial: 80682863203381065782177908751794619243 -# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a -# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 -# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL -MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj -KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 -MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw -NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV -BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL -So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal -tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG -CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT -qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz -rD6ogRLQy7rQkgu2npaqBA+K ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Universal Root Certification Authority" -# Serial: 85209574734084581917763752644031726877 -# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 -# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 -# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB -vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W -ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 -IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y -IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh -bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF -9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH -H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H -LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN -/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT -rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw -WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs -exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 -sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ -seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz -4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ -BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR -lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 -7M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" -# Serial: 63143484348153506665311985501458640051 -# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 -# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a -# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp -U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg -SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln -biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm -GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve -fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ -aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj -aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW -kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC -4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga -FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G2" -# Serial: 10000012 -# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a -# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 -# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Label: "Hongkong Post Root CA 1" -# Serial: 1000 -# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca -# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 -# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Label: "SecureSign RootCA11" -# Serial: 1 -# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 -# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 -# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -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" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Label: "Chambers of Commerce Root - 2008" -# Serial: 11806822484801597146 -# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 -# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c -# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz -IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz -MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj -dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw -EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp -MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 -28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq -VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q -DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR -5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL -ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a -Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl -UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s -+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 -Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx -hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV -HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 -+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN -YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t -L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy -ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt -IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV -HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w -DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW -PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF -5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 -glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH -FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 -pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD -xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG -tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq -jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De -fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ -d0jQ ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Label: "Global Chambersign Root - 2008" -# Serial: 14541511773111788494 -# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 -# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c -# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx -MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy -cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG -A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl -BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed -KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 -G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 -zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 -ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG -HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 -Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V -yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e -beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r -6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog -zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW -BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr -ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp -ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk -cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt -YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC -CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow -KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI -hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ -UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz -X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x -fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz -a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd -Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd -SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O -AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso -M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge -v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2011" -# Serial: 0 -# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 -# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d -# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: O=Trustis Limited OU=Trustis FPS Root CA -# Subject: O=Trustis Limited OU=Trustis FPS Root CA -# Label: "Trustis FPS Root CA" -# Serial: 36053640375399034304724988975563710553 -# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d -# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 -# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL -ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx -MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc -MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ -AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH -iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj -vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA -0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB -OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ -BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E -FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 -GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW -zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 -1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE -f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F -jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN -ZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Label: "EE Certification Centre Root CA" -# Serial: 112324828676200291871926431888494945866 -# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f -# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 -# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 -czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG -CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy -MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl -ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS -b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy -euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO -bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw -WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d -MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE -1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ -zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB -BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF -BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV -v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG -E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW -iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v -GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Label: "TeliaSonera Root CA v1" -# Serial: 199041966741090107964904287217786801558 -# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c -# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 -# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Label: "E-Tugra Certification Authority" -# Serial: 7667447206703254355 -# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 -# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 -# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC -aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV -BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 -Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz -MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ -BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp -em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY -B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH -D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF -Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo -q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D -k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH -fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut -dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM -ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 -zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX -U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 -Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 -XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF -Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR -HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY -GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c -77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 -+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK -vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 -FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl -yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P -AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD -y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d -NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot 2011 O=Atos -# Subject: CN=Atos TrustedRoot 2011 O=Atos -# Label: "Atos TrustedRoot 2011" -# Serial: 6643877497813316402 -# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 -# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 -# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 1 G3" -# Serial: 687049649626669250736271037606554624078720034195 -# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab -# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 -# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2 G3" -# Serial: 390156079458959257446133169266079962026824725800 -# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 -# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 -# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3 G3" -# Serial: 268090761170461462463995952157327242137089239581 -# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 -# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d -# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 14367148294922964480859022125800977897474 -# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e -# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb -# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ -FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F -uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX -kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs -ewv4n4Q= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Label: "GlobalSign ECC Root CA - R5" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G3" -# Serial: 10003001 -# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 -# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc -# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX -DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP -cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW -IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX -xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy -KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR -9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az -5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 -6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 -Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP -bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt -BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt -XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd -INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp -LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 -Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp -gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh -/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw -0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A -fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq -4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR -1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ -QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM -94B7IWcnMFk= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Label: "Staat der Nederlanden EV Root CA" -# Serial: 10000013 -# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba -# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb -# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y -MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg -TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS -b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS -M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC -UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d -Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p -rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l -pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb -j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC -KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS -/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X -cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH -1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP -px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 -MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u -2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS -v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC -wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy -CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e -vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 -Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa -Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL -eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 -FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc -7uzXLg== ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Label: "IdenTrust Commercial Root CA 1" -# Serial: 13298821034946342390520003877796839426 -# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 -# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 -# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Label: "IdenTrust Public Sector Root CA 1" -# Serial: 13298821034946342390521976156843933698 -# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba -# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd -# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G2" -# Serial: 1246989352 -# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 -# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 -# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - EC1" -# Serial: 51543124481930649114116133369 -# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc -# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 -# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority -# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority -# Label: "CFCA EV ROOT" -# Serial: 407555286 -# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 -# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 -# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GB CA" -# Serial: 157768595616588414422159278966750757568 -# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d -# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed -# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Label: "SZAFIR ROOT CA2" -# Serial: 357043034767186914217277344587386743377558296292 -# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 -# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de -# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA 2" -# Serial: 44979900017204383099463764357512596969 -# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 -# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 -# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce -# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 -# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef -# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 -# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X1 O=Internet Security Research Group -# Subject: CN=ISRG Root X1 O=Internet Security Research Group -# Label: "ISRG Root X1" -# Serial: 172886928669790476064670243504169061120 -# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e -# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 -# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- - -# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Label: "AC RAIZ FNMT-RCM" -# Serial: 485876308206448804701554682760554759 -# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d -# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 -# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx -CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ -WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ -BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG -Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ -yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf -BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz -WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF -tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z -374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC -IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL -mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 -wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS -MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 -ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet -UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H -YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 -LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 -RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM -LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf -77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N -JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm -fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp -6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp -1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B -9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok -RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv -uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 1 O=Amazon -# Subject: CN=Amazon Root CA 1 O=Amazon -# Label: "Amazon Root CA 1" -# Serial: 143266978916655856878034712317230054538369994 -# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 -# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 -# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj -ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM -9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw -IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 -VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L -93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm -jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA -A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI -U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs -N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv -o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU -5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy -rqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 2 O=Amazon -# Subject: CN=Amazon Root CA 2 O=Amazon -# Label: "Amazon Root CA 2" -# Serial: 143266982885963551818349160658925006970653239 -# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 -# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a -# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK -gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ -W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg -1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K -8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r -2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me -z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR -8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj -mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz -7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 -+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI -0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm -UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 -LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS -k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl -7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm -btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl -urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ -fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 -n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE -76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H -9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT -4PsJYGw= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 3 O=Amazon -# Subject: CN=Amazon Root CA 3 O=Amazon -# Label: "Amazon Root CA 3" -# Serial: 143266986699090766294700635381230934788665930 -# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 -# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e -# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl -ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr -ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr -BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM -YyRIHN8wfdVoOw== ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 4 O=Amazon -# Subject: CN=Amazon Root CA 4 O=Amazon -# Label: "Amazon Root CA 4" -# Serial: 143266989758080763974105200630763877849284878 -# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd -# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be -# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi -9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk -M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB -MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw -CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW -1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- - -# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Label: "LuxTrust Global Root 2" -# Serial: 59914338225734147123941058376788110305822489521 -# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c -# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f -# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -# Serial: 1 -# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 -# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca -# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx -GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp -bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w -KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 -BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy -dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG -EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll -IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU -QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT -TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg -LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 -a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr -LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr -N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X -YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ -iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f -AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH -V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf -IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 -lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c -8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf -lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- - -# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Label: "GDCA TrustAUTH R5 ROOT" -# Serial: 9009899650740120186 -# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 -# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 -# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 ------BEGIN CERTIFICATE----- -MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE -BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ -IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 -MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w -HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj -Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj -TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u -KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj -qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm -MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 -ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP -zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk -L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC -jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA -HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC -AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg -p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm -DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 -COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry -L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf -JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg -IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io -2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV -09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ -XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq -T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe -MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-1" -# Serial: 15752444095811006489 -# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 -# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a -# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y -IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB -pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h -IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG -A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU -cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid -RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V -seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme -9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV -EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW -hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ -DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD -ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I -/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf -ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ -yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts -L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN -zl/HHk484IkzlQsPpTLWPFp5LBk= ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-2" -# Serial: 2711694510199101698 -# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 -# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 -# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 ------BEGIN CERTIFICATE----- -MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig -Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk -MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg -Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD -VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy -dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ -QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq -1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp -2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK -DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape -az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF -3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 -oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM -g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 -mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh -8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd -BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U -nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw -DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX -dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ -MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL -/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX -CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa -ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW -2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 -N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 -Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB -As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp -5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu -1uwJ ------END CERTIFICATE----- - -# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor ECA-1" -# Serial: 9548242946988625984 -# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c -# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd -# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y -IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig -RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb -3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA -BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 -3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou -owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ -wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF -ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf -BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv -civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 -AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F -hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 -soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI -WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi -tJ/X5g== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Label: "SSL.com Root Certification Authority RSA" -# Serial: 8875640296558310041 -# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 -# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb -# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 ------BEGIN CERTIFICATE----- -MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE -BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK -DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz -OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv -bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R -xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX -qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC -C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 -6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh -/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF -YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E -JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc -US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 -ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm -+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi -M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G -A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV -cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc -Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs -PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ -q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 -cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr -a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I -H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y -K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu -nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf -oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY -Ic2wBlX7Jz9TkHCpBB5XJ7k= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com Root Certification Authority ECC" -# Serial: 8495723813297216424 -# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e -# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a -# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 ------BEGIN CERTIFICATE----- -MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz -WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 -b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS -b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI -7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg -CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud -EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD -VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T -kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ -gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority RSA R2" -# Serial: 6248227494352943350 -# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 -# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a -# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c ------BEGIN CERTIFICATE----- -MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV -BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE -CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy -MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G -A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD -DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq -M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf -OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa -4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 -HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR -aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA -b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ -Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV -PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO -pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu -UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY -MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV -HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 -9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW -s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 -Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg -cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM -79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz -/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt -ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm -Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK -QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ -w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi -S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 -mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority ECC" -# Serial: 3182246526754555285 -# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 -# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d -# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 ------BEGIN CERTIFICATE----- -MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx -NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv -bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA -VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku -WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX -5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ -ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg -h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Label: "GlobalSign Root CA - R6" -# Serial: 1417766617973444989252670301619537 -# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae -# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 -# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg -MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx -MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET -MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI -xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k -ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD -aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw -LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw -1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX -k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 -SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h -bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n -WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY -rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce -MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu -bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN -nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt -Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 -55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj -vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf -cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz -oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp -nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs -pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v -JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R -8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 -5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GC CA" -# Serial: 44084345621038548146064804565436152554 -# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 -# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 -# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d ------BEGIN CERTIFICATE----- -MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw -CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 -bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg -Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ -BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu -ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS -b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni -eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W -p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T -rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV -57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg -Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R1 O=Google Trust Services LLC -# Subject: CN=GTS Root R1 O=Google Trust Services LLC -# Label: "GTS Root R1" -# Serial: 146587175971765017618439757810265552097 -# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 -# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 -# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM -f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX -mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 -zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P -fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc -vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 -Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp -zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO -Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW -k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ -DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF -lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW -Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 -d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z -XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR -gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 -d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv -J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg -DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM -+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy -F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 -SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws -E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R2 O=Google Trust Services LLC -# Subject: CN=GTS Root R2 O=Google Trust Services LLC -# Label: "GTS Root R2" -# Serial: 146587176055767053814479386953112547951 -# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b -# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d -# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv -CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg -GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu -XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd -re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu -PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 -mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K -8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj -x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR -nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 -kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok -twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp -8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT -vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT -z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA -pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb -pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB -R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R -RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk -0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC -5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF -izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn -yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R3 O=Google Trust Services LLC -# Subject: CN=GTS Root R3 O=Google Trust Services LLC -# Label: "GTS Root R3" -# Serial: 146587176140553309517047991083707763997 -# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 -# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 -# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 ------BEGIN CERTIFICATE----- -MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout -736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A -DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk -fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA -njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R4 O=Google Trust Services LLC -# Subject: CN=GTS Root R4 O=Google Trust Services LLC -# Label: "GTS Root R4" -# Serial: 146587176229350439916519468929765261721 -# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 -# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb -# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd ------BEGIN CERTIFICATE----- -MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu -hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l -xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 -CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx -sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== ------END CERTIFICATE----- - -# Issuer: CN=UCA Global G2 Root O=UniTrust -# Subject: CN=UCA Global G2 Root O=UniTrust -# Label: "UCA Global G2 Root" -# Serial: 124779693093741543919145257850076631279 -# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 -# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a -# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH -bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x -CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds -b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr -b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 -kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm -VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R -VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc -C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj -tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY -D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv -j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl -NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 -iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP -O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV -ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj -L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 -1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl -1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU -b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV -PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj -y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb -EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg -DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI -+Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy -YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX -UB+K+wb1whnw0A== ------END CERTIFICATE----- - -# Issuer: CN=UCA Extended Validation Root O=UniTrust -# Subject: CN=UCA Extended Validation Root O=UniTrust -# Label: "UCA Extended Validation Root" -# Serial: 106100277556486529736699587978573607008 -# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 -# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a -# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF -eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx -MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV -BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog -D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS -sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop -O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk -sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi -c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj -VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz -KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ -TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G -sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs -1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD -fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN -l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR -ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ -VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 -c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp -4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s -t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj -2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO -vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C -xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx -cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM -fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax ------END CERTIFICATE----- - -# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Label: "Certigna Root CA" -# Serial: 269714418870597844693661054334862075617 -# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 -# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 -# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 ------BEGIN CERTIFICATE----- -MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw -WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw -MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x -MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD -VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX -BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO -ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M -CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu -I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm -TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh -C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf -ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz -IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT -Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k -JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 -hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB -GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of -1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov -L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo -dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr -aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq -hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L -6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG -HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 -0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB -lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi -o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 -gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v -faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 -Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh -jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw -3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= ------END CERTIFICATE----- - -# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI -# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI -# Label: "emSign Root CA - G1" -# Serial: 235931866688319308814040 -# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac -# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c -# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 ------BEGIN CERTIFICATE----- -MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD -VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU -ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH -MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO -MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv -Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz -f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO -8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq -d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM -tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt -Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB -o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x -PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM -wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d -GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH -6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby -RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx -iN66zB+Afko= ------END CERTIFICATE----- - -# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI -# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI -# Label: "emSign ECC Root CA - G3" -# Serial: 287880440101571086945156 -# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 -# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 -# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b ------BEGIN CERTIFICATE----- -MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG -EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo -bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g -RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ -TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s -b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw -djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 -WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS -fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB -zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq -hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB -CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD -+JbNR6iC8hZVdyR+EhCVBCyj ------END CERTIFICATE----- - -# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI -# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI -# Label: "emSign Root CA - C1" -# Serial: 825510296613316004955058 -# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 -# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 -# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f ------BEGIN CERTIFICATE----- -MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG -A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg -SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v -dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ -BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ -HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH -3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH -GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c -xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 -aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq -TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 -/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 -kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG -YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT -+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo -WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= ------END CERTIFICATE----- - -# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI -# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI -# Label: "emSign ECC Root CA - C3" -# Serial: 582948710642506000014504 -# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 -# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 -# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 ------BEGIN CERTIFICATE----- -MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG -EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx -IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND -IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci -MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti -sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O -BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB -Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c -3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J -0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post -# Label: "Hongkong Post Root CA 3" -# Serial: 46170865288971385588281144162979347873371282084 -# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 -# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 -# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 ------BEGIN CERTIFICATE----- -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 -mpv0 ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G4" -# Serial: 289383649854506086828220374796556676440 -# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88 -# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01 -# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88 ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw -gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL -Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg -MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw -BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 -MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 -c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ -bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ -2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E -T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j -5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM -C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T -DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX -wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A -2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm -nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 -dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl -N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj -c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS -5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS -Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr -hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ -B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI -AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw -H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ -b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk -2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol -IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk -5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY -n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== ------END CERTIFICATE----- diff --git a/venv/lib/python3.8/site-packages/certifi/core.py b/venv/lib/python3.8/site-packages/certifi/core.py deleted file mode 100644 index 7271acf..0000000 --- a/venv/lib/python3.8/site-packages/certifi/core.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -certifi.py -~~~~~~~~~~ - -This module returns the installation location of cacert.pem. -""" -import os - - -def where(): - f = os.path.dirname(__file__) - - return os.path.join(f, 'cacert.pem') diff --git a/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/DESCRIPTION.rst b/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/DESCRIPTION.rst deleted file mode 100644 index c0f044d..0000000 --- a/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/DESCRIPTION.rst +++ /dev/null @@ -1,70 +0,0 @@ -Chardet: The Universal Character Encoding Detector --------------------------------------------------- - -.. image:: https://img.shields.io/travis/chardet/chardet/stable.svg - :alt: Build status - :target: https://travis-ci.org/chardet/chardet - -.. image:: https://img.shields.io/coveralls/chardet/chardet/stable.svg - :target: https://coveralls.io/r/chardet/chardet - -.. image:: https://img.shields.io/pypi/v/chardet.svg - :target: https://warehouse.python.org/project/chardet/ - :alt: Latest version on PyPI - -.. image:: https://img.shields.io/pypi/l/chardet.svg - :alt: License - - -Detects - - ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants) - - Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese) - - EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese) - - EUC-KR, ISO-2022-KR (Korean) - - KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic) - - ISO-8859-5, windows-1251 (Bulgarian) - - ISO-8859-1, windows-1252 (Western European languages) - - ISO-8859-7, windows-1253 (Greek) - - ISO-8859-8, windows-1255 (Visual and Logical Hebrew) - - TIS-620 (Thai) - -.. note:: - Our ISO-8859-2 and windows-1250 (Hungarian) probers have been temporarily - disabled until we can retrain the models. - -Requires Python 2.6, 2.7, or 3.3+. - -Installation ------------- - -Install from `PyPI `_:: - - pip install chardet - -Documentation -------------- - -For users, docs are now available at https://chardet.readthedocs.io/. - -Command-line Tool ------------------ - -chardet comes with a command-line script which reports on the encodings of one -or more files:: - - % chardetect somefile someotherfile - somefile: windows-1252 with confidence 0.5 - someotherfile: ascii with confidence 1.0 - -About ------ - -This is a continuation of Mark Pilgrim's excellent chardet. Previously, two -versions needed to be maintained: one that supported python 2.x and one that -supported python 3.x. We've recently merged with `Ian Cordasco `_'s -`charade `_ fork, so now we have one -coherent version that works for Python 2.6+. - -:maintainer: Dan Blanchard - - diff --git a/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/INSTALLER b/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/METADATA b/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/METADATA deleted file mode 100644 index 1427867..0000000 --- a/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/METADATA +++ /dev/null @@ -1,96 +0,0 @@ -Metadata-Version: 2.0 -Name: chardet -Version: 3.0.4 -Summary: Universal encoding detector for Python 2 and 3 -Home-page: https://github.com/chardet/chardet -Author: Daniel Blanchard -Author-email: dan.blanchard@gmail.com -License: LGPL -Keywords: encoding,i18n,xml -Platform: UNKNOWN -Classifier: Development Status :: 4 - Beta -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Text Processing :: Linguistic - -Chardet: The Universal Character Encoding Detector --------------------------------------------------- - -.. image:: https://img.shields.io/travis/chardet/chardet/stable.svg - :alt: Build status - :target: https://travis-ci.org/chardet/chardet - -.. image:: https://img.shields.io/coveralls/chardet/chardet/stable.svg - :target: https://coveralls.io/r/chardet/chardet - -.. image:: https://img.shields.io/pypi/v/chardet.svg - :target: https://warehouse.python.org/project/chardet/ - :alt: Latest version on PyPI - -.. image:: https://img.shields.io/pypi/l/chardet.svg - :alt: License - - -Detects - - ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants) - - Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese) - - EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese) - - EUC-KR, ISO-2022-KR (Korean) - - KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic) - - ISO-8859-5, windows-1251 (Bulgarian) - - ISO-8859-1, windows-1252 (Western European languages) - - ISO-8859-7, windows-1253 (Greek) - - ISO-8859-8, windows-1255 (Visual and Logical Hebrew) - - TIS-620 (Thai) - -.. note:: - Our ISO-8859-2 and windows-1250 (Hungarian) probers have been temporarily - disabled until we can retrain the models. - -Requires Python 2.6, 2.7, or 3.3+. - -Installation ------------- - -Install from `PyPI `_:: - - pip install chardet - -Documentation -------------- - -For users, docs are now available at https://chardet.readthedocs.io/. - -Command-line Tool ------------------ - -chardet comes with a command-line script which reports on the encodings of one -or more files:: - - % chardetect somefile someotherfile - somefile: windows-1252 with confidence 0.5 - someotherfile: ascii with confidence 1.0 - -About ------ - -This is a continuation of Mark Pilgrim's excellent chardet. Previously, two -versions needed to be maintained: one that supported python 2.x and one that -supported python 3.x. We've recently merged with `Ian Cordasco `_'s -`charade `_ fork, so now we have one -coherent version that works for Python 2.6+. - -:maintainer: Dan Blanchard - - diff --git a/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/RECORD b/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/RECORD deleted file mode 100644 index 5c4012a..0000000 --- a/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/RECORD +++ /dev/null @@ -1,91 +0,0 @@ -../../../bin/chardetect,sha256=CBBc-ckAIK-wz2TTTa1pfpJZ5FBIrkQWV8xvNXRXti8,257 -chardet-3.0.4.dist-info/DESCRIPTION.rst,sha256=PQ4sBsMyKFZkjC6QpmbpLn0UtCNyeb-ZqvCGEgyZMGk,2174 -chardet-3.0.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -chardet-3.0.4.dist-info/METADATA,sha256=RV_2I4B1Z586DL8oVO5Kp7X5bUdQ5EuKAvNoAEF8wSw,3239 -chardet-3.0.4.dist-info/RECORD,, -chardet-3.0.4.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 -chardet-3.0.4.dist-info/entry_points.txt,sha256=fAMmhu5eJ-zAJ-smfqQwRClQ3-nozOCmvJ6-E8lgGJo,60 -chardet-3.0.4.dist-info/metadata.json,sha256=0htbRM18ujyGZDdfowgAqj6Hq2eQtwzwyhaEveKntgo,1375 -chardet-3.0.4.dist-info/top_level.txt,sha256=AowzBbZy4x8EirABDdJSLJZMkJ_53iIag8xfKR6D7kI,8 -chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559 -chardet/__pycache__/__init__.cpython-38.pyc,, -chardet/__pycache__/big5freq.cpython-38.pyc,, -chardet/__pycache__/big5prober.cpython-38.pyc,, -chardet/__pycache__/chardistribution.cpython-38.pyc,, -chardet/__pycache__/charsetgroupprober.cpython-38.pyc,, -chardet/__pycache__/charsetprober.cpython-38.pyc,, -chardet/__pycache__/codingstatemachine.cpython-38.pyc,, -chardet/__pycache__/compat.cpython-38.pyc,, -chardet/__pycache__/cp949prober.cpython-38.pyc,, -chardet/__pycache__/enums.cpython-38.pyc,, -chardet/__pycache__/escprober.cpython-38.pyc,, -chardet/__pycache__/escsm.cpython-38.pyc,, -chardet/__pycache__/eucjpprober.cpython-38.pyc,, -chardet/__pycache__/euckrfreq.cpython-38.pyc,, -chardet/__pycache__/euckrprober.cpython-38.pyc,, -chardet/__pycache__/euctwfreq.cpython-38.pyc,, -chardet/__pycache__/euctwprober.cpython-38.pyc,, -chardet/__pycache__/gb2312freq.cpython-38.pyc,, -chardet/__pycache__/gb2312prober.cpython-38.pyc,, -chardet/__pycache__/hebrewprober.cpython-38.pyc,, -chardet/__pycache__/jisfreq.cpython-38.pyc,, -chardet/__pycache__/jpcntx.cpython-38.pyc,, -chardet/__pycache__/langbulgarianmodel.cpython-38.pyc,, -chardet/__pycache__/langcyrillicmodel.cpython-38.pyc,, -chardet/__pycache__/langgreekmodel.cpython-38.pyc,, -chardet/__pycache__/langhebrewmodel.cpython-38.pyc,, -chardet/__pycache__/langhungarianmodel.cpython-38.pyc,, -chardet/__pycache__/langthaimodel.cpython-38.pyc,, -chardet/__pycache__/langturkishmodel.cpython-38.pyc,, -chardet/__pycache__/latin1prober.cpython-38.pyc,, -chardet/__pycache__/mbcharsetprober.cpython-38.pyc,, -chardet/__pycache__/mbcsgroupprober.cpython-38.pyc,, -chardet/__pycache__/mbcssm.cpython-38.pyc,, -chardet/__pycache__/sbcharsetprober.cpython-38.pyc,, -chardet/__pycache__/sbcsgroupprober.cpython-38.pyc,, -chardet/__pycache__/sjisprober.cpython-38.pyc,, -chardet/__pycache__/universaldetector.cpython-38.pyc,, -chardet/__pycache__/utf8prober.cpython-38.pyc,, -chardet/__pycache__/version.cpython-38.pyc,, -chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 -chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 -chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 -chardet/charsetgroupprober.py,sha256=6bDu8YIiRuScX4ca9Igb0U69TA2PGXXDej6Cc4_9kO4,3787 -chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 -chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 -chardet/cli/__pycache__/__init__.cpython-38.pyc,, -chardet/cli/__pycache__/chardetect.cpython-38.pyc,, -chardet/cli/chardetect.py,sha256=YBO8L4mXo0WR6_-Fjh_8QxPBoEBNqB9oNxNrdc54AQs,2738 -chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 -chardet/compat.py,sha256=PKTzHkSbtbHDqS9PyujMbX74q1a8mMpeQTDVsQhZMRw,1134 -chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 -chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 -chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 -chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 -chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 -chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 -chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 -chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 -chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 -chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 -chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 -chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 -chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 -chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 -chardet/langbulgarianmodel.py,sha256=1HqQS9Pbtnj1xQgxitJMvw8X6kKr5OockNCZWfEQrPE,12839 -chardet/langcyrillicmodel.py,sha256=LODajvsetH87yYDDQKA2CULXUH87tI223dhfjh9Zx9c,17948 -chardet/langgreekmodel.py,sha256=8YAW7bU8YwSJap0kIJSbPMw1BEqzGjWzqcqf0WgUKAA,12688 -chardet/langhebrewmodel.py,sha256=JSnqmE5E62tDLTPTvLpQsg5gOMO4PbdWRvV7Avkc0HA,11345 -chardet/langhungarianmodel.py,sha256=RhapYSG5l0ZaO-VV4Fan5sW0WRGQqhwBM61yx3yxyOA,12592 -chardet/langthaimodel.py,sha256=8l0173Gu_W6G8mxmQOTEF4ls2YdE7FxWf3QkSxEGXJQ,11290 -chardet/langturkishmodel.py,sha256=W22eRNJsqI6uWAfwXSKVWWnCerYqrI8dZQTm_M0lRFk,11102 -chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 -chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 -chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 -chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 -chardet/sbcharsetprober.py,sha256=LDSpCldDCFlYwUkGkwD2oFxLlPWIWXT09akH_2PiY74,5657 -chardet/sbcsgroupprober.py,sha256=1IprcCB_k1qfmnxGC6MBbxELlKqD3scW6S8YIwdeyXA,3546 -chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 -chardet/universaldetector.py,sha256=qL0174lSZE442eB21nnktT9_VcAye07laFWUeUrjttY,12485 -chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 -chardet/version.py,sha256=sp3B08mrDXB-pf3K9fqJ_zeDHOCLC8RrngQyDFap_7g,242 diff --git a/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/WHEEL b/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/WHEEL deleted file mode 100644 index 8b6dd1b..0000000 --- a/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.29.0) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/entry_points.txt b/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/entry_points.txt deleted file mode 100644 index a884269..0000000 --- a/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[console_scripts] -chardetect = chardet.cli.chardetect:main - diff --git a/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/metadata.json b/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/metadata.json deleted file mode 100644 index 8cdf025..0000000 --- a/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"classifiers": ["Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Linguistic"], "extensions": {"python.commands": {"wrap_console": {"chardetect": "chardet.cli.chardetect:main"}}, "python.details": {"contacts": [{"email": "dan.blanchard@gmail.com", "name": "Daniel Blanchard", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/chardet/chardet"}}, "python.exports": {"console_scripts": {"chardetect": "chardet.cli.chardetect:main"}}}, "generator": "bdist_wheel (0.29.0)", "keywords": ["encoding", "i18n", "xml"], "license": "LGPL", "metadata_version": "2.0", "name": "chardet", "summary": "Universal encoding detector for Python 2 and 3", "test_requires": [{"requires": ["hypothesis", "pytest"]}], "version": "3.0.4"} \ No newline at end of file diff --git a/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/top_level.txt b/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/top_level.txt deleted file mode 100644 index 79236f2..0000000 --- a/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -chardet diff --git a/venv/lib/python3.8/site-packages/chardet/__init__.py b/venv/lib/python3.8/site-packages/chardet/__init__.py deleted file mode 100644 index 0f9f820..0000000 --- a/venv/lib/python3.8/site-packages/chardet/__init__.py +++ /dev/null @@ -1,39 +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 .compat import PY2, PY3 -from .universaldetector import UniversalDetector -from .version import __version__, VERSION - - -def detect(byte_str): - """ - Detect the encoding of the given byte string. - - :param byte_str: The byte sequence to examine. - :type byte_str: ``bytes`` or ``bytearray`` - """ - if not isinstance(byte_str, bytearray): - if not isinstance(byte_str, bytes): - raise TypeError('Expected object of type bytes or bytearray, got: ' - '{0}'.format(type(byte_str))) - else: - byte_str = bytearray(byte_str) - detector = UniversalDetector() - detector.feed(byte_str) - return detector.close() diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index b9a7ffd238ffeb34f991334bc3b337a2ecf4d942..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 802 zcmYjP&u`N(6t?rbfk`VI;OHZjSUUlepaO&hmEbZE+mOhCBum^b5XZrBr**U!${(@{ zF8oWra^hd$0?$r6_9Q>QXMf*&U*dPPwG|?;A5R7!Zg~j((#ch`AbAF>c?d2?IW7^y z5oT6oVVzs0&78KIBgBenU}^dk3iJ|HeS?S;~I%{+@RCdsuaks^XN2 zCM{o3Ni)d>0ItQcJ}Y!`43 zimH(*2vMC&h;mIg)j5O`BO$m@-k1xPO66#E!hv6`oH3=jaqor-4*4Mt zv4_3CfgQjeVsR5r_u)IdjI%nGLJxwl!Kv3%AB U%y>R6=~LaN(b#Q#9dFzJ06Co7!2kdN diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/big5freq.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/big5freq.cpython-38.pyc deleted file mode 100644 index b8470f926dba92623006a5e7513c5952227f5471..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27131 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 diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/big5prober.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/big5prober.cpython-38.pyc deleted file mode 100644 index 0f384650f3ba0cc7def0e1b2c0ba14794f49ac8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1086 zcma)5PiqrF6rb6D*@UFlmZ}F&dJ354(jtP2CXphTDg-ZkaM>^Lt4Xzva3+5RZkM&;9`$>-(EGL%u0rz=uM%FY50lTaL zN9QCU31;1}Eev0!m|+Fi3o-h~tsj9f#L!c+_Ab0Hgc9SMU=4Q`nrKbnY@Cvd7%iND zUwYVW+E6bSLMh;%*qE`r%nf4-9jXv@&CKz^bfK^xc8AwkU@6jYB9sl4(863&8)zYq z;A}FM$y95`F3HcweN!y@i+s_`OKnmqdqkY9(8)0 zm|Mm4ih`<73OTY{)to?gjVP-B#!ZpkbRDh@O*Kamc+oIaIAqRsEti{y#80aNpWnxX Ka0uGeJ^n9`Hvi}V diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/chardistribution.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/chardistribution.cpython-38.pyc deleted file mode 100644 index 61d61707fb703e580671a3fbf73bf6479be58726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6172 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 diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/charsetgroupprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/charsetgroupprober.cpython-38.pyc deleted file mode 100644 index 6c27d7693f5dcf98beeb47405558b54e97ef8566..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2203 zcmbtVPj4GV6rY)$U9TNG4Iynqi$scw=px#PN(d^o1ZZgl5-w`eizOI2o{6!uah#cT zrI^hrmU=?szz0YqF1_@N@D28cIQ7Jx6Tdg>kU!+c+VAaqGqW@A&+ol?)@alip5GoU z|M2@PV}Fuz`jJpR2e}WyG}Am~+q}g&$s!foK`Y>FmFYms3DeR92SH2faE&F=YmQG6 zUev#{I~%=0cP(pY272S+k8QhVG8#6vgGFZ^I*}gt6wI&|*Q_P<>ryd4HDJ~5jE1EZ&5rPg zmWuKCa8zQ~yhx(r-u;-O~PJZQqfnY2CVs?A=S8T*=cOrj!m zqoJ{uoGW6bdV^l3R57F4ovioVsKIEvs0@8TTrsaUjLTGaWSmpwU?K|XOuA`9Z19p7 zRi!#<8`J6~`+H?M+a4|td&Aqkfy>%ydVBNv-qyYBW3${rsI|$?yq(Fq{@*a&Ikvn*xjlX;T;v#q%zXoP9Iiug#1JZkP6avZ%SY_{oBKTH z_FB%Ta|oykb9~+pbnpoiSh;)62Q=~ll}#IA$93z$RIwE(WfVhe;EAo$0AaX@%2?VN zD2cFjKUO+v8?@>Yu{mOIfV~fLq%l4VcWYeo81FegUcA6@f7ltX$sqFlA;>L(!9(U2 zb9Ttd>rx{hNa~9t-_bplP|F=c0pas=3|dQ55}bC0cYo7T_HD( z(UyQv#E+jmYd%t6ua`*VpyEr9l}27Yz0FMMT6tPPQpr#|%eckkvwKXU6BtsKT$LaQDL&S?CwcEt8+Jc;VGwE8U+KNSv&6VXS|~ zjrZKrU?*ED>wbJ0D*h*Bwe$dbQZK_w8M4=iy-kdo#HlPs=}s4jE<$ZKMqNv_=Fx5m z&q-JoB&DaQ`rb^3_?#8ei|3L?h4KvKJ^*7rMbalsPGw5r9FiFGE1;WNsNqr>XF9{dA*oz$QJ diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/charsetprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/charsetprober.cpython-38.pyc deleted file mode 100644 index 24c430be3573a3e2726290621fffc26ee0da04b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3435 zcmai1TW=f36`t7(MbVV($g$HXX)#H937bf2QM5n=$FVEBu>nCXECmJVI;$mTNUpWq zrDunBDNv{YyZ=K5^5S1npnd6Y*w;S!r7s2g&=>bRv*c2grFI3*&YV4SZgajfN8cAOvrv#*)-r2m3RUwO~n zrZ4#}YgAri7u$KwF*bN!|D8@-QPSNtp;2x6boz0zxP@PqU{DO=S<{ic>B?);mEH^9 zgaTQ4!J59R$OTz_!JhNxf?Sj}(5j$al66a4luL3Mw3@mkFUu>IR>%Auxnk!_m|vCe z+WE3{VCeOHX{#6NU1i8brMn&b{PU}wwgYRX56#KUE&Q?%F-SIM0UL9S+&Cw$@m|v0 zmu#24;yaB>UI{YtHop{yNjK<3u~9l-h|_KtfyfuT%4}l}S~Uogu&;t3uh3Ve8&2+J zD(>h7D0;>85?=q=+%WyY#vmH3MF|AQ@mlBU=->vO)ZPubdZY}1G48zSMMFom% zY&S}6&f)63w$p5H9r^!I+HkCQx!W3c&g%9$O37c8I{D$syiWRjv4a%5F?(D_m)mIS z^PKc;iv6n8|b;Y0;q7b%H3?(YHA zIb-Jzdvxo_9rF`+>{4y~v-3WC$vMLcYg!$7WADU!$+GRSC%prvx1|pn?Lg(=?8)`9 zt((Iy0E(KJJik{$s!o(BVR~9&91T<^(vBeSvdxk&j0e52rOc*KNjHwNo|sZH@i1IF zyuH?ZR5C{iDp3-eC{4n6Q_L*|!69se0UQ5%y!N-h%=Yy|eV{Z{JXLyRdZ=PT#hDTh zzb!OO*h@WoJq6)|p%H*cM`_Ux6VW19(qXq}gh>UG$%IiNLXjyQ6|Ox?wanml9Q7lk zWGSvS5`_iXy4dSQndl6YHaQ`%;~*n(#c9I#m}rn*6+q zkah#|s#cXGnBlUgt3Wj{iKP7nO250BU0Jo;?5 zoSYL;zuI~I29HJ7vHl)*HT-;$vMSU%9O?H#$rq4$61L=g2j|^DVABn-Hx*qsb3f{&CLI=BI@^*jL;p$qtdXJ z>ZDMbw%bFkOQ_wv04h&mz+cCO1P6 zD?{a-?)!{HvU&vw^PDUAtD-5aa?icu)ZG=Q#%r#J_hI8)?42jIf!6o3rvEJRS`hS8 zIgF{Xtp~xAVHi)^+?CyXzkRT`_03+eckjVnEVl3H%h;l+9muQbTL(&;k;cCzOkbmc z>VkfczSgOuiQ0XITSV#)i2h?5sKYx|ZK!3|)NX3J`9HxgqX1VO&#C!U*MVoJMi1*B uI^6Oi+SGd#70_47u%8v(Z6$3zR&8UM&eN1vZxsICq;s`hc9mBV$o~THe{K{2 diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/codingstatemachine.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/codingstatemachine.cpython-38.pyc deleted file mode 100644 index f0b19477bfed0db54528f0c9b4dd356a501e01bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2862 zcmb7GO>f&q5M7e`vMj4aT>V>)>TDs3~tp^cwH5T5P@Z(DuBd z^C*hPNv3yP>3=26fd?P4pY8rPlClsY~uBjb{ImPSTml!5#5``j>?21vQfjkQ!70Xpn5I@Za7w%29i{ghG}=q`b(v?n+=bndbjd{b8G6Tjh{wVLrsP(?(lI zltx%ObNP*mlG|+t+S$Fgy<0-uMhposE&EWSVk2G*apuMdocK@mC`y-=VJOn___~(# zK}sYKqBKzwDrq^*;ZKi61T_XkYa_>zm3vx)4y7}f3=^&TrDu;GR&LGx%2W~~Psly+ zPCP9~zCeK8rNlYy9s?jwJJm5v#>5Zdky}iXA%ViD> zgD|a4kS52;DW8rLBxMW*;yiN^L~}$mxp*3`N_A2kOE^>ET&g2v28)gN-XGk()_AFerOAbvwAr&l=#lQmUkcS`~Dkkgm*4W3%S6%cT z;J%OB-b8cc9f=SpFItaVUkSViuJ*d_8gFR4c_d!9-UtsTG>$)i%kaUwRy4v13L!1J zVLUS?qyz||V%4Yg3sapH>*YMBchOAq(FliUu{P4~N4#rOw8AipCOQm@2F+rmjyl(_ z=NC1r(_!J;$y;I0!QH>^Y`V#GbDB(VBpDFX^v3Yu@bOpfOT9@3ksgaDAEs<}ei-+s zhh!|t5*LQIh=L9p;Wg&Jj`#e-vuAt1+7VOW)kW{bCNoJePV5s~;BQB~^|pF}A)<>q zpGl^L_qU$GSFj9(qcQJOcLU8G+?Iv%o?l+!0`sw?Bz-%Nl^mmUB=(`>6)1W|yztTU zoWCDD_RUR&URdM#0P{X>5!Pu1kJYY-ix~Ytya>2o$2_e=MjVNn*srO^EriMl^!;sa z73*;tSsOa~fN(k#-Ae9qu;`R4hBy~?QJ^Ys*FuVLzVFfGiJxk%jxHBFkYF;#^Z z7i~@~hAY~fX$)2pNIAhQ7VS(wb0JTChe1ntBItS@XnW4@dj8)v|D4zLo?l%-?_%#6 zjY((Ln0zCCc7(Zr*Ph3YnoD>;?aKw^HYYtk0wEEDGWZ$mDuq8=;lhe7XM8!%H~L$} zT0v{B$)ZLTgal(&SNU|A4RA@6EQRx;*g4_Y=l|x|ihcjbyH<)n53>lREn#gHXXaB( z{Cez)zp@Z3l&#*nS;yL<9nu*zOX=+BgyEA}l+I6*W*DkG4nuRE3{r`itJHi<%_nGz z*3{%vZQLQ7J|W?8P8q5(T5D;j<<%~=TCJef#U1z_&-UtOjlk+Un@wz4@r`_MAOF*M Veidxd`nq)b+m8sFjI{ht@DIF;`jG$t diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/compat.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/compat.cpython-38.pyc deleted file mode 100644 index 54fdf2d2db9a8936eb5f654850d4c9ff53081e31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 307 zcmYj}Jx;?w5QX>8u@fZ?LYyHkf+ZpfBtTS@2ni_I0?Wycg^9gh?QSA`9~!Q-Emf{S z#VizIM)N(*d(wNF%_aorCOgLm9eqA9`MIT6>?6HO1^e$^r5Co1g`f$|!r*#seo zpo)| zY=7J=jMc^7#1`Y~O_iysDGY2b55}UX4n{V!a+u|ZMJ2&{cQ{eDcssRnaG2?lw7Yt| zCpGLW4t6)zH~47ChaWb#-sj-r+6XT+vkpL#lnRmtr(~ZBDuNT1hB6YNh)&3irZHe2 zH{j%yL?p$yJMM<}(YVYpiOYc)9pE%iKv-hwF_{Ht!FNK54Q(_7oyRtr5m-CNCL&=Olqlh0+$`*yr>GxxyA=|jJCPl^TAE21JqYUi#MJjaYs_SSW6@AIdzed zY9H1)&U2L+!}&S+{j6`xx?dOdYEc=RDYd%)ZTe-yK9&6(_!QD!tu@eDdv@3Asb=8w z5ln-C&_y~QGJ15UMabG^(0?(5>Kp?qp}uyiZ^N^C1%z9;C`~Svf?8h@u!u*H1>X)20T}#A8SSzFh!3c@ zW7jPCvb8#)X^!QlS)jyLmd(%OTglxl_bw=FN~^IXE&;27#==JPPq$*Zst9}DB>3_H M284akrTz>50FlA}E&u=k diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/enums.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/enums.cpython-38.pyc deleted file mode 100644 index a49b68e022108d3d4332b828c92e23d62e77d67a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2600 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 diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/euckrprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/euckrprober.cpython-38.pyc deleted file mode 100644 index e373c7a0efb399f5a2d7c5ab004df7a5d605363b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1094 zcma)5O>Yx15ViL!+mM!06$BC|I7K4OrAQzF0@8{@NkNTz*#p*g?X;_UH^KHICF(7e z`ZtQirT>SMublV`oS5;pbSs2}R~|oq?9BMR@&591n?U>avj6FOM92@EG+O|Z*UQZ}e zSV@z=of$DWO4Uf1k7{xt6zr@GCOj_>Mi!cgcpjnhK>r0%Bvv@-jD!DRihpTwBT6KJ?ood+MnjrUS4XGO4%EKnH@hjPenfi3AiwSMp0$QYU%{pn9fuT zF&{(M2nb!FZ5q@0dV`RStEB&82H6?lznD0uaAR+G9>K4@ojtV*YpR3BA!qKu)OIi< zxC<-OLUdt8dtit+zuyenJoI0IZL~8{A}#+NIF@O7Sfz)e*9dy!rdJ2LF-nE`F=pG0 z6%$@b#2v;ySE;Ob9CtPbE3Q)}Q>t%I@4m)c}PN)Y>+fE7G~EVz1j1VG~}jcF(H zXxsOwTgS4wT^w9eP-~@-B)e7@3rK84QNJHoN_N%B+^C$om?H3^p|Y^joa;s|*NVh1 Q>I=SlhzVgKbg29M-_9rjx&QzG diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/euctwfreq.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/euctwfreq.cpython-38.pyc deleted file mode 100644 index 579485cdbfbe5989e5a25c39f2a42dce76a65042..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27135 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 T5F&@Tcg diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/gb2312freq.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/gb2312freq.cpython-38.pyc deleted file mode 100644 index 06759c2e2afee12a769faabed6f24777570a0186..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19059 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 NeM|_8p+Vi}{RXY^0IvW5 diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/hebrewprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/hebrewprober.cpython-38.pyc deleted file mode 100644 index fb7bbf20972a9a56d22220cf82da56556deb0b25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2975 zcmZuzTTdHD6rP#AuwK><*KjRKs@_}$XwuR`)1)Eb5UasNn6%PL?aFx8#<19A)+EJs zq)I_be?y)?%1d6Nst^4I{T1_8^@&!!NWDDdg`P8OJ2qsk`R2^k=gfD`nYkN}+XTL+ zSEs*9d`QSI*l7QBXk3R9UIgHT(|~MKmr|5jz_vA4qhyJ2jqCe_>pp#?xjHwpBxxQ| zSdyeNzOa!KS-*NmRMvd~9S%yRaxq)YRsB3n>iD!qD?9+fCobj0Wt_SiXRx#88eDfx zZn$0CbS>WH#<=C$Jmz+D+jV%i8|RLj;Bog1Pq;mgNrCb+yl3BXdwDPK+b3=x@8<(h z_wzx17U}^$#D}3Ca+e3ALHZu2kFND7l{z3Q`;Xecep!m(e^QE6_`=8eAbarKOc6MfN za<=9?D3y8TK{$Eo^2|&gPqX=LA zgIF{-OPc;(QtKLwIM7vJy?1?@w=?NZH4*;PFYPS7q zgY5)PH4Q&?-VBy5;3ne$98TMdka7kxQwV1cKA~lfU(EV|Prex-I1lBPVrX4mDON|7AaJroU}utvA*jSK%9ECnLO0n9w0PSU?gzjm266Ztwg}NvP}AB(hnA-%=TXDvhq4K!b(E;_ zCOGUS)}Z&M21PFzTV_*xL&k2VGxN8-&*pD7#pTp;Q_S4WNGqCfCndWhX)Qayn1040 zTWS8JMOG<{oc9M%rE%m5suTVAggZ3now5PLR@s1udfJA9{!)Kk+L@Kr<%R)G87*ka zXhN(p=T1tz3tOJl*a1z-m2#x@k1egc?MUm94hq`mc4&_Ng0v~kzXt)%8dAq5+hU>* z>n!vfXmxr>AJRHqBwv2_kkujm!gv{Z0Z9{2V2%MT^N@pxBz+!b-8py(!xtbpk30; ztgLybhl!_bP`d-!dD&=4=3O&5WqDWMMc?p{soietVT1zdgr87&-2(i@C zuqvdM-xVkM&E02jZNy0M!2!pqD95q+Phvv)iDR3egzA|#Z2rCca+znu3~Vv>Eh_wveO>UL|} z78U9a3U}9~rP2^cC;4#j62R0`&Tae0pm~T1mgo+(Aw@aV)PR9woi$pz1qrs+88z)Y zbnt?{hDGs$;ln9-BFjiK;xp3a6z zkRhvVQ-er+9l3hh!rm+aglAWj@69ORUxtM$G{pNTVWtu@2(M68;N%I^QauR4W1VBh zPF+DN+>+z?K){2B2ZHV4)vz0&?0DWicm+fw;!XUkNdycLF@^9p!ZZR}CEi0w0!XKk z{#4=?bJ%|s;R?dX2zZODYf`*{l8R&%zq8Pk7Tiqme5vk<>o|G?0Zo$e#v>x{2Z86c zxeeaqLfySc>9F#*F~gFvO1hh|4(6KM%e2K|ad4T+c_m5Xgh&aQdCmln z)jfecMDvj+PkPs3AsHlx6p#{9L25_?X(1h?hYXMrGC^j@0$Cv&WQW)uMGjF; z$OX9}59Eb>kRJ*_K_~=;p$HU(Vo)4PKuIVCrJ)Rzg>tabTk>Z3iHh`u($R0W_aKYJ zB&g|=l1cQHcc{F!3Q!R$L1m}{RbeQB?{w@HeFROZJcX{&pA=CyC3C!HbIk3MAVeX> zM_{A9j!K3p*(dtc-X__41a80>iDU4acQ>Zjq8c03p$621T2LEesEehphz~?!Dlxc< zc<&ELtoMN!>%4Vzv{P3U&O#}P3=mOQS4lC6R`%Agd(JYBr+U#|Ps(S_jce}}9j`(? zcnt=G4uXuncuIt#LHIaAz3{6b2$SKLTPP3|6U7ew1tr5M2)|RKf^ZcTJ7#f)A85QBvCS70WI#4i1KhylYxtQ5+>bM1wu3vPw!p zZfF6uLPTCT%z9D9@Oejuhs((M@GT57+bbCMM&1mcMrx0cWfTEkn=2HHY9 zXb&AAo{w`!Q77mOU7#y;gYM7+BG40hL2u{-eW4%phXF7U2Ekz15Pqa0LqtPi7z~FI zFcL<=Xn5=}H^Wm#;`4Vf{E~?D4nOFTw`E_tgE69{_Qr}5sGH|Y>lcH@*^8s?5G0g6 zt@yBITo|t;o+v&flbv91B20qGFa@Tg|G+~!xC5u%V0Tt4d1}G@Ev>)KfsUh6Z{M-U?r@A)vyNE z!a7(F8{ilC6@G)?;Sbmdn_x3+fvxZ-`~}-!JM4hJ;UD-H{)3&c3wFaE*bDn$KOBIA za0m{=5jYCR;5eLslW+=7!x=aW=ioeCfQxVmE<*rU;3`~$>u>{Z!Y#NBci=AEgZuCR z9>ODd3{T)GJcH-(0$xH?_%EbL42TJ_AU4E-Uf~x-WPP{$su#miT)3#7C%g_%E8sThIpDLR`v;d@ACJ5{u%C5!(cd!fRQi?M#I}M2FAiT7!MO*B20qGFa@Tg|G+~!xC5u%V0Tt4d1}G@Ev>)KfsUh z6Z{M-U?r@A)vyNE!a7(F8{ilC6@G)?;Sbmdn_x3+fvxZ-`~}-!JM4hJ;UD-H{)3&c z3wFaE*bDn$KOBIAa0m{=5jYCR;5eLslW+=7!x=aW=ioeCfQxVmE<*rU;3`~$>u>{Z z!Y#NBci=AEgZuCR9>ODd3{T)GJcH-(0$xH?_#f4g7!VU;L2QTvaUmYWhXjxi5i2GNCRmh9i)d0kP$LLX2=3rAsb|e9FP-oL2k$cc_AOS6w73#rj@H*6o zH=qGDghtR9nm|)%2F>A3XaOyu6|{!8pbfNzcF-O=Ku72VouLbKg>KLtdO!qvLNDkI zeV{M&gZ?l82Erg13`1Zj41?h?0!G3p7!7a37#IuVU_4BKi7*K!!xWeb@4z&e4l`gT z%!1kQF1!ct!w2vod;}lEC-5nJ2A{(h@Fjc&b6_sagZZ!k7Q!M}3`<}sEQ96nHGBi# z!gugJ`~W|~Pw+FWfR(TcR>K-t3+rG#Y=B?jSNIKnhd*E=Y=X_O1-8PU@E2@@?XUy> zhJWB+_z!l%F4zrwU@z>0{cr#d!XY>eN8l(NgX3@lPQocT4QJpioP+al0WQKNxC{YY zfva#0uEPzu3Af-j+=07r5AMSQcnFW+F+72%@C=^A3wQ}p;cpBgF(4+yg4hrT;zB%# z4+$V4B!a|{1d>8BNDe6=C8UDXkOtC1I!F&0AR}ag%#a1LLN>?_IUpzGg4~b?@cT7V zD%6A5;B}}EZ$JZR2#ugIG=Zkj44T86&;nXQD`*XGK^tfb?Vvq$fR4}!Izt!e3f-VP z^neKTgkI1a`aoak2mN6H41_^27>2-57zV>(1dN1HFdE*5F)$X!!FZSe6JZiehAA)= z-hpW_9cI8xm<6-pU3d@PhY#RG_y|6RPvBGd3_gc1;7j-l=D=K-2lHV8EQCd{7?!|N zSO&}CYxoAfh40{d_yK-|pWtU$0V`n@tcEqP7S_Rf*Z{x4ukaiE4u8N#*aVwl3v7iy z;V;+*+hGU%4gbKu@E`1iU9cPWz+Tt~`{4i_ghOx`j=)hk2FKw9oP<+w8qUC3c;;u$ z#D0O3#7~tM!r!Gu_W3o{5kJT-6eX4TOroTpSI=oX52KVci!Sy%nT~$K{Sn&vq4k22 zGk#Aq+Kjd4dnrrnW)@?sPGqq zk>4eL3KPLhKSfU?zfQ+iB{{<1Kt?_nZPL5fGLg2sur8btEY?;_qM^B^Br@pu&*fYs z^$g}H8AxS?#7cJi>ey;zAtiA|JM7IQ@CR%CMFS)*IAx`9FQ{SUMa$=;&QPu;DsFGO zsIMFP)eU`0;F6MNlxsmh*(653luhWaaG@kEpK?$?$^v`SqP%SoPj z3wwv@jS=-XGI_L9dvoojuuLJUPQJdmm$*M_#%B@_Jgt9;4iUxBn~2@lMD^6QfU8Q@ z>1fZ|6~^aFRHpon;#(3ajcm(lZF-xv9oIJAUS{aQ#zh?yESFn;9DRRbU2rmdj6pZg zvIv3SLIiJH4mRx*ZJR}DB(_UzB`}LX;Sj-TdokTmCyAx7nN&+QJ|vKitGc38?2dBY z4ql{dil2}wBwLEV0WS8Ljy|#vptOf~)_H${r?6V_R|eG-^){^~r@t$XqL+uOZJaW5F?QPQ$&pAr#Xks~?XdiQ%NnCc5 z+wCPLu*Lzed2_DAG0Sn#mB0;qsXdQsij%-yHYS?3n3puNMMN2NER`q-b<{0%{N18L zysRg1T9jAu&#;@J-xw;UZnNIKqM{OmEZ-u3o2x>WX^q_IUebxa5Y^PtS@d1>DHWfw zH&e%2@)=Dlz(I1aPhp8emO~`clS(Q|D^Y<;UV0fM(h}GyF^TdL7^?Ujsa8}DLn-Hd zp*Nv#sdMV)LPjdJML#;yu zb;TL)=wrG=$1}&;8YY5~-pPF7GT0*e*6=@dv@qkA;cw|3YQ_$GTO5C-k`w$*kw_rX z&)ir>9+&;pjD)fo2+XIP&rw%cCW4&sRLOWz1uDt;n`K5~9osBlbC}=gy{n{$=(fac zy{Dj0dn5jKQU!41U;M8AlhDVeNyn8QT$ z)`4|gy(X$BdtLUL=qrhbTX5!_S~lY|Jy(!`;S8d&`ux1%J#UQjv-LaMLPaboSA%SgYL<; zP(0b*Vtdy`wV*qxB2>EYchM1g=}1AZbhNyu@S)-X+>fy=WVy<;dkp=mtp}&o?M;KR z>Z+St!?HH1ij{7j-X}c_Y-=L#P=CRgAc8_dp%jcqk zM!rGsEqiz1Ypw=CYuU-N8$|x>WTdKT?~%$UD&kmI-Oy!q$vpTtmfMvSaE`RbykG4MDIZZ+0CSyLlwA5WhlKnihGB>K?C2m zHx2)r{Bw0}iOx`0$?~pfKc}0C{zZNk^p>qJo0;<4+UBb}AQ3~!KFT%2Y%tZJ@{ZbA zVyi?h#T_i0!Jn3^Ne$;EHNAnPcG=4;8{6Io(S`_|hFh{HoTwD^h0MOHc8M}7zNIdU zz0XCXqK^unnp>UnH8+0Iv~)`L8dM>)8+;QQ58mPaXW269dbo%#qSnrKK=wTy5lH2I z{@L6wNc}=SwY@=5M9DxGaozA#vRNtbw|vXH`wwfyEi*uJ@9FRK&Z{d*w5dcgCvRfe zkfD2|GN~I!<(g$Bm~UBHVuX$_6<2aOs|*@x?~$lKtd>~fY}w7YF8ZEIMV|B98|?^R zQCV(yPRf6Z_Nv=w`L*RVbxR2}Wc;B|R9Er~4EjEdf~T%7iM?8E40b~WD37&QHf#%C zS2Bg(1#RWYKcLr0T~<%EhwLNrH%#;A=pu=E*$kx==Vtth#Bl-z^;QY@f==YSYD**g zr&E?T{2QWI?fu1CQHLosS{Zbk$~X3|=y*fPPDd?d8G**?Cc3qSJeOtTUmfR&UJ^y)^y z*G`myt3gU~$&S+Y7emdt@8(|SU-bYlK zd+*O^MIB8fUqU z`?qv_t0a{~c_nAzOJ1sSm6)OLb)=Q}#q(HUTVwCJy+4U|hr6;f!@Z!MxicMM zb@Z)?ZaU=>b#1t>C`uynMz{sU+ljBFhaz6!HJzc3NplRYKz!rdP*s1D;z$RAal zNOmF7I-;HqbHg2U*V{tLL)j@hUe~+Mv|1dzucL~?>{Hj)GPk-Mp6YXZGZbevcaPrn ztaYILy5gY{@kzxtqqry%?gih6B|$qltN1&2P>S9`Dmlrg^aQ_Dd`Zb}Hj;)VK}XA8 z&XH0_CC_7+XsQ_-;9GMq5_q58mo8_DjuBkNC$)l?bBa$H*+?R`wxyQK9c!4nMPW%W z-pEVz2Ag(^-4(I{mAICdWp9}Fn!Sz;Wwm@NYD@I8@fA%?YLbTNphH%i6)7k2hN#t^2wH)D~6OG&+e9zNI&Wy=`3(h=@E!bnj>_GfKPW$zHJ4+o%Vbg?Kesq_XV&|6tY zIoVsXgUHwL=~-?$L*fl}I~?^V%Rz9)jDl1O6Ubw4g=m{|%%{>z+Z7jY_CVxh!U%VVOc+^2=~&K6hn1C=pm{K3m>R0i|hi~FIz$hw*~LS5Pr z!8H!1DXHwj?l9gB?yGwvG!*nw^0#aZHooDipX|YKZm>)Cg1upE3{}_Lv}64xANokTIc-54LhOK$GFv++RmN>~#79u5kgo7Pv!8XZ*~u&lZ&<}S7T z-g23?1F*TWpOQ}87gmzi zosKu-g}PV{Gg#d=*o#^``bwf6|q63zpcf#^-(OgH3rLK*(m0?NnjF-;hI_##%bOgeB%g+jLiFccRI;8*Iu07c z0@(x6d!l5bm!kcY+q3qnX}c_cCy*L`^%%Q5QD&YGi$<6+(efS2#oc6HHVV0o6gsBK zW?+0Rr$0DlZ^iit%rhgOj**s=*vO(cfssG6)}G1*Dt}tW({Yc=eRyG6jg6Z`?{RQ4 z6bKeM!pP`^yXqr5nm|IzvAuAq4C)TW$!~;%O0p}tPq`pNvsimzT0(mr)D4q}FY%#e z5_5Bfd%<3FJF6=odq#9c)P#eR;bDTEO77Zg7PbZNMPIh%K*&PxP4Zv5usg6Y`XbCo zC3-1J3V)~@sAP`ipQf!esDoP@ZuvXRl}#`4NbyQDx{1~p8G~qF*(y-bUJcoJ5_jBC z{_q(EcQ_p$N(E0uO%<;U>w;01%`B&CtH4zpbAPscgUSSk28MHk!-`{>QAr{rcvq2jr3X>{9KAuEd%Wt`#!2Kltsv1-;EDnCMw~W*&bXz7a-?XutpB}Kqyd2h1h(3n;!57(DvEp=*+=wFv71xLAx>Y_TN%1Y zJk}A<$-mbzN1_LTyD;4m5}MIp$vDL;lvGq)pI!;ezYJd{`;QM(a(353Rc(J7K0s7W zM{CPB6xSpF8ym@~)D*pLZtdvjt1cHLkneu0r zUnt3BIZw$+bHAV$TisG6Pb?o>W>>OM@hyqYidRB%DwCAF6demog5w-C(>p_PM~Ep~ zQpX5V#bp1I$f>t^c!c0+*cRN@+sWQ?9gjVzjgDFjet^?1VhgE69zaINALSK@FPgz* z&#*0cL26=nb-@Nv8NCI)y8-#12%IqEJ5fi`aJ_%=_dTpPC==znmRH!l4Zo@@$J!%p zx83sw#nni?2oVf3a))JR0x3mzIXDD`*ck5)%2W9}dM@`3Si2?qShUUD!io=T>+9n; zQ(F>q>r2?#_SYb53P+75~aN~BgYP1|YmH${h)d?3nbFScb}(E^6@ z!ER1R`K$SP&>*4ER%Q& z9jJ_U8^3cpPIj!`go;OV@UFcbmZ{j-Ap4%ZgyffN`+>?iiT5R5u}rP_k!%tE?sz*} zJ4^|e-3o4-TSP}p=&JZmv=>+M7UQ)-mEffl{jOsHbfx^0;YFk6y_gvde+Y+6i$!lf zflo+H<9;5Lljx+aH-QA9UND#ZJ;isK97W)ss3_&wIwl*r-LXcRu}<`_%b8DfzK&|5 zyWA&ru@%TCm6$H^9~&v)BY4|IEQ&snY)5(@SUxZE{ZG3zNz>q2gO)x zC#ucbVJE8Q2z|``kF}jpL2o@HXXrhy<0My^Ez>#W5p924j$-3&N64<@DI{~4aoRoz z>w+m<<<)V>$T5n~Yip_GWpo<{ZyUY~4l-UrVhX31wNRy=*xLc2mCR zFezjkguTHw!}rNHVs{BNg%8a*L;ea>geH!VPolUd)5$Umy-u~JFAF4`6%_=};_&bE-=KmuRD04iDRUF7eyj=s@{CK}JkubIq9 z`3Eyrs+$kv72lV*5d9eGRVQ^xNB6Kdh=g;41&05sxHK#`vZ5JrwN0`7RAQj$Yjfw4 zYHWF%UTTMlBT-2rANl75s#=~^*NIdg*uvT{!%vy}fWL<@h}0<^V_oO>M%J)5&T_D* zf*EN{d!!>1q_zA|qMwoNOnb+m>29MWFF%Sp!&%F0p@ZO<;VX0`f`Ps^XDJzP+6#L* zsAP>EE|I~qgjZk`YiFWAoDvhGpF%h{_>kxt4hGRn$J#0-_w9Y+}+>i|G{=C3CF(qzdRQ>PjXkuH(?-Eps|T zX7VF=$v`Ep#8WdSsQZt~QY!f^$8ivc`#+Qn;IEF6W$k74Q2v3E?q!I%Whrk|^3?J> z%fA#CwYSzeB1UHA`7qHpMRV1~G;)yQe~Hc}u#o3hl)R$1r;fpHcecG2kkL6N5PeVa z5867wL&u*8Q^^m}c9xAyI#!!;$H-AeHm014-Xl^CC2ASD(xIQYwefD_Ealf^AFGQO zeHh41Wgk2;@(8J768})nY-D@cETsM-ki}k4B~2uL(os$n-;7n-iZL0VjZ&_-cJw*y zm37pX>PkyIHu9pq#O!9J{M4Xq5>-tbr#LlagW^;=nAU-VY?imlKht(ZM{{#`aFw0P zA|(SQQV>{WPyx$B+RCtT)$&y~{;`)`$5*0kq{fgMsO`BKGi6_hZfcvU?kk2q3JnEc zc?mPyYpZRik{>C@gEbsv)qB-7C5GxA&u^j~(IwVfOmnH!RrDQwHmX{qan~lFEN*L4x|SQM zbXT0sgIdhrBsTKvSRk9kHC0p`75-m^M9#DOszKwm{bxqEaAa_Z=sTw6B(TRFjIn&K zW4GuWYqNBWU^fQ6H1?Ll9d+5+$N>#_*-NFg^VSgU5_K`WYlt8SM+W!J9Z7F2f$2P- zGwnRlf9>7UwuWAD=eVxqrDLTO{R)%S%~hA4{B;;b^stNArDQ6-#oRw}z;0&bcL%){ zU$%S&zA4B~o$d89@@snym~1NgHjIMFVQ+Agz#RwN=2(vm z%B`)T;xBngOR5!rGx*!2?j6f0)=uhp#a=SEn_l7>v>=**KrK-gAIb-xm^+5v zIlb?Rnv<%lV;j%Q?adR#^wI>fr>M+PGSTo_@GGaEs{2PGmg24)#E?DWFbmB1Mo9|G zVoubUUV9xw`K!d*8dwXB2owmX1?M<@MQ#Wo3r)D4yc^zU@WYWVwXNR~=!P-ZGXS zIck4VQTG>%%2xiqwb#d9MxsAj?xHfuHRYn*L+@zl1kdcfEzsZxBNI-UUt7|JA4qf1+!h#7S_tjeg`dKf|8e}6&CF={F-F~ zx0Xh9L0fK4bD368TQAw46le1#JvI6qP|;IJ!09y0#(LAU*3V&jh~6|PH>t_)<+l49 ztnNK}t3-lyo~Y4_Su^P>&^I0TONZps7pmYyXfmM z5v+A3)0s@9c(Y^e*PGpm%9&P7al%kO_(Ac$&`WSp^ofym=)I}#u0aR%)`1}s(;=_n ze^Y*FMpB1a=V|RBaGiWV*=bas^U~VhyY?bF){3S(Z)zP$?R`LHt|KhtB?r4lU1DD< z<>3ZH`3(Os)C+!7_a3Qau#G@$AL0|*KBfGzy;pdiVOkT*l8W!x%VcgvqT``(*cMzT znp#O~52ZJ$8IF+O+?JM&C|470AdtezC)w-glrt5l7cDd60p+cRPt?)EISPv6gieE7 zrd9HCl_xbzZ(hR-n6{YR3wjgU>!CsN5{F2?4{4G$NEi4KCki{Q`xojst_nabh@_6-msT!j3S!LU5yQ+;BW5FG5H~Z zo%Cv0ehG;!XKNcwbiTWq1D{79Ridgv37z+KhDzyJZRAImRl>Q!6*FR3wxM#7t4olN zKn;mP-lp!(@i!Zt$iL3P0@IFadkL2mCvk+WiW4f?4W-RpC0kJ9J<5Hkd=DF`EK$;r zd;|WXJc{Ca^DB-pbl)Fr^(L02T!5j}qFD9{>Rs;vv+>udFzwr|#|QN3C<>bI|5uW7R;^=dY6R_+`eIx+I5U; zZbL`(sxY`r*J7P}bR5{F>)`+UXV1u>ZUegxDB6F-(fF17^y@ODch{^KLKx=AXxl$I%JQd&VNgesPErWr>WhrJAi)LKT*J-2LgI$GMBG&f_`cuvTEFo--=0oNLtTl9 z=AHNOywCf5hqd-NiIP`OoLH{X*N4CU#JB(MTUGV1IoSWzPr*~^d-5yE)YV4yTvd1K z?t4|;9d+LAZFE!ItNSVLkGd)DrFfxUOz|Rdzdp8JtqxY#SJ(FvLpAO+X0O|L=I(ZH zuT_5+DD4&YuarB2=G?ZrKF%kymrs1Qy4Ks1w#|(fGLBHgkrGlBf=4wJLQWhk%nf`w zw-=a&=q+Y_;Mf2>azL1C!3BZ~ZHC|kJ54IVR4IgM$OuL-o-^RfxpY8~VXT|Go4mVS z-;aB*@(DKw3GGYs1aS>KJ3MoG;Ra9$ z1_(KC%HcVyc)`E|p9Mpz4l?Aj(_xi1*GA|AWz|6?FnoYD-q?!aJiUOTdL|iXg#+;mLs1oM1eR z_gtk=h0qmQ#dEF@dZDL^jL@cnAX2cqMlT(?+8hwspIXBn{nV;IRCseh9;LU;TjB9~ z7swHMh0N)}tZA>t?3XnQfyDxzRY#JuUbQ2-T&DmmKpD43(b z?%GiT)6p&~9Z>6sKd8?BJn8^ExaYn{LX}W8p^7+-xUj1f5b0cU;w<19x+xBF9buCp zb-m7YntMeK;|!VcpqDR5Q=||)Oj~W9AQF~B4?@f#NpWg57r>;No1p~Az;=~bkIz)9M+ zH3viw8uS2>({q4RTC(`LF9Z)YA!l!?>Q!_1y}wpVIfYXd0#%sHa94?k(h}Gu$U<)J z{!vw~p(DwK1IoGPfWlF_Iy?1qV_? zA*zyqoRHvAMOE-@)1w#WoJ$AP`m^8SL^?h!42bjG8FwM%1na@#G;|Tt>wPn4FVcK6 zC~ zF~hm^qR?s>4j70mwpmcU9=I?qge3?$XV9T>e_ga4vY4-K`RLl zMj*~>$@V>rSj!Bbi&gpjj_852g9SkO$HCg3PIsO?Ax)cP|oTxWVDg9k_$MGhP$R0$a* zM9*y$=L~R)1VTp&emKz8dP1mir~G-0=-QmY=|R?_TuL91$+o1@@v5z>aIQf7d2KNyZ7M;jq+ z4!2hsYIYhYU8iina97P+|mT~s?djwl0SLzM)_NvNW_0h&+ z18He%g+S%z!J?r`=x{=h)TNR$RJbg9;?RPDSqOZ04r&faB#rdw1+9+4Qzk4@*=7f% zwh=<0OoxjLIYQ1sW?10USjD5@AaaD}=7tv39O!`rQgRByQ@AUaN|uak4k#d1BOH(2 zSA%VKgah)>f`-5xLYV0&@d*Z^3^&i5o+7~+ek>0@RLQJJJxR&A7~29Qgjr;BKy*{r z^G)GUxLKX^@GwfJ0|Il|9r3hr2)y2n38I=dsuZE(oGceSi(E%7W)e zN%5#M90LKWf*`Tta< z!vbEIVMx_M&QQ2H&L)7ZQplz`Adixh4Wr}%2gDmdl@QO#<|wcdbKo?gHw>~Wy}fEN zX9rawZYbaox^f8EGDiY71R}k?!4smVQow|Gj?B4(2PBg5VU&^_;1coBz!bnCM_cFs zhoNeyCkqhifiO}6ATC={+U&&xr=U^@GX+V>N##hvklF!6EqDkQ;*54N%>hXpJTy3} zZJhn#kWj+_z!=p4aXEI7!_X_vUZ^OL!$@x~KnMd)dc0ETZm9|u47rjtsMv0+Ar}e` za^((cm(?5)C6MYO42G&&(GVbpfz&o3bEgGnad;RY76PdSJA?#JrJ+y?<)h7B1hKWD z%?=CdGpE;fGzV0ImvT_30S}xxxAv&H&;g$>N?8~#*!KgT8&wicH7F&NFVGu;vlox* zk7zy)K{_BOGtXr!-L;bg!oFe1=}`?isl<^h8Kwn#L`q6^t_-SnhzrwzFb!kXUOlTW zP(kE8(vs)O!`cGaCiAm<4S@@ z=$<=BDsmx|Sr7Gug2}ll;eZTXC0ZEiT&ftSDcoJ7Y8#${JaDKSq+EM*t~nrS9i?X# zkAennH4ri$2nDO;fap;TD+z6-odFVN5Mo@XIXc`UmEvKnx_Pu&4bqh167bM$4ua52 zP6!^R)qL=Ppb&(IR;8Cl(I!NKkaL}SK3W4Kg!b^r#VkpM8E3R=?U3332Pd+=-oCwIw%8xyMT zRy%(7PxrvFoX|mtL56MW6M~06aPTR^0=c=y^}1-mGSq>=Q_-sXVF z0*5hpR`2Yd?Jq-v;6R`daI#pygG!?o`CK9_gr!Z9xg^aMIXC1Su4ZLO9~Kkz*&&O9 z0*eY-NOM5aQlgO@J#2tE3eHm@o>KxTh0yCX=nUdB~Q1t_$fPux(j!=cb8RANV0?v>P zu!DlqBo#-MJ;0j_rdK|2gkk^W3t&d7Ahc0!I}RRDX;e5Mx%FI=9#lZ)npVi{ZAp0e zL57hs(;N5%>!B}%YG!*-fC+mEjv3CCFYGi0b9U%KFT{Or_nP z3{eQ5BlXmeM_Y-M4k5mD95mPCL?k7I&!eI`H*^X1GL6u=A+!w$GsuA>R0dwgH3t+1 z*y9wuwsH2E5!%8Os+iDbs7J4S?miG@0C9Dt8TLwQ8#xykLJPqo#6VA*y$W{_U>B%T zJqZNkwUFk3$R5?uU1B@}fxU-=#Rbnbl{`o-96sZdtE$=ST9KE5< zFhdR=kUb8d2csIQC51r5IS;V9q}L0*fHAU209aBzA?BRnI`HNi=Q2nfR1U`ztY-%~ z&jyd2s`O|h%(&)&BvXx^RlHK6lnZV40zPVoET|4EkyPAI)SJ633LMK^ND!XE%>mI! zUC*sBho=ET=;nnsb(Px4smm~s0&yCoUPL|H@WA;y9ynJ?6;efps*sWbXW-e3N3S^` zD8M*ZW;>{6TysE{9Ayr;Lmj}{!I5*69#vNoaLx!F;HV0LMSTt@he#oz&8q9bn`X@r zJnunsKqB24Z;CmlcmqNkRfW(7#DX~rR`DEU0o7ImJyo71A1K#ZYNP5P>1_)hV0Qyj z4OLXprU%3vI1B}Fgg^xA<&n(+DapFsdeCCT(W`#Jc;G^g4s%kOo7*eIg((Os`S7T^ zK-%>}9uijz+kmuMR~3lP`= zPEy+r_db5d;e1wI7P+8QT)U$51mXJt@TLH%XO#hjc$&j=R56h15n@_Nv;U@(1;A{X zz057;95h!NYoqG+gyB@(EveiW2}0H0;JIi$A><74a;|yBg_4UXd2M(6N8Vwb4yEI8 z;~-cz4AzomH^5*|Erb4S5L6;Hz`CE<}%T&Ox6zEHK7f?z@o^n`RE$Q;Z{ z!xQH!X`{d(!qDqd@q#MbN=ieokf0!wrUO#2$S@#ibpQp7Ii_ID1p*-yf-ZA<3KA@f zgV-oSI|u_6A*NKd7f-N-(r~MI8o(uyDrJTpgtrffZ0QD=vk^uL7*|KA5IuFZLubER zNUzMmLcy&lJqke7qQ^9c%gkaRbyLK-R3L;@1w-W^J-~!`c0grY@SG7w=DE!)4p5+V zl-1y&K@+Nnhw48nj*W5=w3S#&xiI4hkkIjogon$>OKlFwWwQ&Y@qqMT1fmIGsKDtF znxg{(3*-nxmCzh*$_)g9^(3_o&rmI;wlIS*^xCH9Tykz0+Zjd*ra(uY(HxMp)_J2? z(3334w16j-y>^(hE#yMMdm;`#2hjn}-qJ`3j_Nt1)Zw&J)m+eWIBBjn2V|qiqUU&U z-T(%W0}Rd_o(7q2o+E)+#iNRW6vGU`;3z-}m}+2FfdxFZz+%;r%z%KLBhAr9sBk3AZ$CD0|HLTV=)&zr$CDVVibOUo?GUMDL{o_LQJcFtQHD{b8{4= z56p&m7&p(VsuYAL7%$`?umdgN1UnL3h8#SgKpTdJDS*jg++=aVLs!Vr<`Kvuy(dCW z2z-H*5FBlW%ymVuU?|`@2v0B&jMGAnk?ONb&JfRO&M?<@96TV#(*wwEJs`@2wq@M+ zza0WX0mF(7?NGWoXFwkyP*D&E#LzZ#(7O&Gh7iDvp-s(rfE5{LSd|nHD%# z=}yCw9uF$pgouL*L)E3as|pva2Ne(uEcQ|btZ)T|MGMxWw`Fb~Bgg-Uo(f9@R5e0M zIjXEAYy|}ex%=|DTQb8EHo%UL?=d52k)<>UEuL3co4vuyZ6Ei5+#bCG?GO3?EZeIW zSlsDQa0BoH0bwYR3ph79&>ta$YOX#B!pNXX+*~hrGzS!pmmYI2ha83+9+S-xN)S4H z2kAj2i=H#^STTIigA)=4QJ7l=>`oH`hLnPyRDsWeZ)x>Wbt44hNe@J@Va^>qAdz!D z)P(&7jB&Agp-Q1t4Fq9^8_Mb+P>Y_-0Rla}7**+of=6Yq^tO@nFz}!~3pGx18my;P)8=bn^=+>Q$Uftd3*S(E}y1%hlFKisE7wcp1RU3nPP%ovQ zOZ9SnJpEj*SLze#=kfYveNXziQlF~tO+Qc6_pMi}_fH>sar4^d&S)|^cXelX^!D!A zoz3lcCYL6Ad4Ko*JALid$-DG#NgaQ#+RB2Puk2@q=hFA&OUcyLjcPcvNon%C*dDfj zqx$~B2URE4*Q;BdwbjMx@^JU+?&kJzJldWf&vrQ3eB;{oX!_uAXEdr)bvU_l>DqAX zJDcO-&RcIxPYt&>C%d!w>bM?_rwhaS>dt7oFiwluz15laC!_6)x2o~aBso9$+7r8P zTzlf$rE6clv@=PAw!eJw_ujekjon`wJ&`Hv(Qf{pJ3M#x!ZXjEf8}?^CsTHOPd2Brxi_2pv&lO!GY@9(zGU7_ z-;+$2R@6P&ORMT#e{|k@*wL+Y@a$W~B~;_(EH*FZX75JtM)yiJ{_}Lw z-5Z@0_3F+;)gN|GS08kKw|ldHb0OsxzFyr%_Qw};$EWfpbXb1x%~Ln}b@xhd{9$5D zTQc+d)#bD?Ur(29m~PSK{Jn6cKmKl=ykYfbns<3|_gL;YUES!Pt`@4(RmS(KCsUj- ziI**1SeyN;S$PlmW9^02!EDR&4o;U|AMFmgSF_Dz$M1dV>~9ZWdFETg3(vpu%=+`^ zzx6bGK0SH)+E>q|TXg%;NeA>m<`}&8&hBV9*&R=p(v2PFXfo|wnl8-l>wvqwJ=zK9 zGwokYH~xw#z1&cFKH^I@@t%QU^`^{czX(azPkUjNRp-rU{%v&1sVuY#&` z{fqOIg`NW<^Ht+&J(e6rjz4$XPcOdHRlY2jtA}S-uD8z1WVJhcQdax3bv*de3u`aD zl%A8P&t5nik8SDc^J^D|zp-}yw@Q!6^klvQTUU23UaChsTcf{7QYQJ%SKXD)gWc<2 zn7g<;+P2t>+?KwwpI?=%Eq`{@o%D2f*KT#k?LFi+q;tquX#7Yv;qg74a(|V+n_d3w zVM4fSYpW;oyKHCkjnQzJUbVwFuGVjDXMbfleDkf%?OA2~sXXoHviV##pU&p<**ug@ zer=3Do6XN=^M!1(mVNqA$~$I|3cKlhlA}SV-~81b3=rL8HoNzspC`>q#kx; zdV-Ii^l8J^a*5LC&eCwWl|Gv$!{Kaa*pIw}f14-fQ?JtFd;O7u(D|Pn?XAf-FyH&; zf$fYRPnqHcUdb<*M%~{h)a=G|ub(N6-VeUx(&k@a@@AdO41b->jm~6{FYb+WBB!gH z-Sk1#?I*~U&iM0n|4L`_&7E%gY+q=zzgjP*+U1>or`ma}K9=73-Fk4PJ9({MYBApi zvy(Az?$pcqZNAg5kKgR2!|A-+sgI|({6}fx@ieiY`d6-W#~-D)e*gC5Kdn!s86PoY zC4F-A)9aykv725CCucub?^zpvF{$U1bng$6xA(nl{w16LOoq>cz4vqYgJh-)=U)EC z*S^YU!`?sU?7wGFeooWVnKymfOE2$R3qGmS<%^fbw|^-apUH^hlTmtu)ZCMO&k0u| zKRf@Bz9;!PtMUWV9dsT~KhLB$e80Dn-t}iXE8XjlmQJhvcuJpIKcCvitJ!=hn|#%# zgKOif>9X#=GycV#%d^sTon6eW(e`$8IeB8A$PhH;yZtxmdy=2cL1(4k?JW1W@mncz z$5(!rJ(a#E`9;+{s63=q`lU3zkJA(Lz%#F&d-3J?H0I9c>yFFyCn*~*S32rmx+-5u zN8Mbq$LfW2)W6J8FV>4Udpq|f)Uk9So~{Qe>eox@+9alQZI<#c2kF`@-M%)<36+0Y zXs*rM>0))p-z{95mD|_m#QtmZM@iw{2ig2rGP4_#KdEQ`woZOZ_CCz!KXQ(%(i#6+ z_MgnA@FM@`l)vKwoJk++gY-Muz6bMwsv_h&)#ymyiaxedY=xSoPC6R^D_y-r(*v%Pn|pU=>Guz`WA!$ diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/langbulgarianmodel.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/langbulgarianmodel.cpython-38.pyc deleted file mode 100644 index 98be551e7043fb0b0ada1e90aff2ec4aa19469bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23584 zcmeI4=a*e&8O85RCLsh+x?;fqB18=lFbWC;LdS$i*HDH_?qzb#WM+8hh7c@Z@4YK_ zELi>k%O|_oyN+FK*M_~sdiD-0zwoU09L|{xE?5#4o2Tq&KjoZr^NkDk*ke(v_;cg& z%Pu?Ys8;J1IXnK@rEpFx{+)hg0iD*`R%dAKP-l4UaJSVR?#%0qbmn&!bauI6!P$nu zg0Bd^D)^e<>w<3xzA5;Y;M;;3!FL4T6?{+deZda|KNS3^fOKzJKNj2~_=(`Bf}aU` zf}ab1As7gLDfpG(*Mg;j-w1vyc#vSR;1I#X1cwS9F3{2gU1OlT3?3^uNN|MUA%X`B zmIw|M942^x;9$Ygf=39B6zH6T;`gI9&`k%&3XT`tDmYp2JHc@RAA3mF-hy2P`wDgw z%oE&4;FAo?x}RWo!6L!E1PcTsf;|Mg2o?(F3-%E_P;h`?f5Co&`wQ+X*h}y@f!>J0 z?*$JP>?t@w@CU&k1%DDeM(}6B6@tGA{wnyJ;O~O1f`1f{w8FL@0Bz(S!5Y6qk)ri? zhy_bg1*8fqoq$R=~GMk%F@vSy|%d@vhw-# zQl}My69p#;RtioQoFX{2fWbAgP7|CiI74uz;4Fc@nY2oGgV zrwg7Tc&6Z4f@ce!BY3Xhd4lH)ULbg(;6;KL3tl34so-UTmkVAYc%|S~f>#S(BY3Ug zb%NIm-XM6R;0D2)1oH%M5xlj4!&`e6PoXew8^}}54S1uvQjN%UMH}%xlDUDWVl-So zRa`f6jFyxUYh>jHsv$s`El*{u5m06ew~vXyJB)ttfuz^b9*navAJ2e*1Rlc~UR zS#YbRsRPOj+c(4lIb6f!Qi{m{ z^Ra5qg4f7Gs%}~H3M+?w!@+W{%R<7<4IyFqkhSXsS&KT6+t<8YqBItyf8W)bxX*$LJZdy zU~;$>TVhpDUz%+$(7eLUT^4Ro*L5wxaS+8KYk4*|g;|0H4~q(7q0HSvw%RQftx;Bb zu&{J+-O@2zfMXVQ3=0AFrOXzI>cOkCZd6SPS(=ALwabFJBa&rvc+Q4fQ2{S^Kl1<& z$Ll!a@a?B87xZKaYaG_i* zP@21UifHK=UeGNK-rT_HaLE!2WkD*qF7qrTaBV>;o%ybm;7nLv!3%O-b_-ct*5U?O z)`L=N)#c5hz${yGAx;-8Q@DXGZi)*9QEF`gZ0;DYRRA}_#mXs%EELPrJhUXi7`a$b z!3_t)^+1*iquI3p7E@6XEGS`8W+AaNR<2RC9(z>tLe`DK!El|0!c?ZXB{7s8V<4;D)Bav$vvTTHvqxc$5AZp74aVzG_#mFM%m|d(eLCB(#s|Z;rSTt{> z%;wC809jiB+?HnMK1`Tj3^W=vX%;EjzP9%pf45)RHz_JMb4s@EJNn39M9c+AuR4^72F_TH#A}o zXYB?`sSBCfpvMGQP;5Ej9zoABvcWA)gmDAU#|aPy!euI}1YmkBx;a)obD#v3&<)qT zKxWd=k{%?GaxBymE9Hgz*)^Hkx>o6Y)dKEDEv{n#D>xS1z_aVV@N!lug_%Pc3HQj| z&lCp2wG;xjf;@v`QQ>a5Sdi(PQ+CW0vQ&_;m76aYvy>AEFj}Y}VRH5TP(~hsV6j^b za;OdavPU=*E|$rFm7T?cOkZM$dd>HwB$m>P_~60 zWGs3F9*3nl7CjJP0!xtyWz?2dkbsOz&Vt7tj)hr*GL%pTkA$rNY)OT!>LJMnGAbzB z;@u?y*;e(WVeq?%%OS#+EaOCQ*_;Fx7oyf#C>$&#a8U{5TytWOX`ahg&q9`gaxr@3 zc+OUXM>8c1nRA&Smn~JvO@IJpSY+Lj1Xd}9ge_(c7qT0E^mCN|Su8g$%Xo}HA&XUG zTvTe1t0{gS0KZbXvKoEE9#+mt4OUx*=OW{k?UIXhljTRvvt9u?e@^{*8c)v C(yXfh diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/langcyrillicmodel.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/langcyrillicmodel.cpython-38.pyc deleted file mode 100644 index 46751cc07142115221b966aeec2c4cb3d2641309..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29048 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 O|NOs=&#(UbZs{*#t3;as diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/mbcharsetprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/mbcharsetprober.cpython-38.pyc deleted file mode 100644 index 6c2ba549618e420a35f82847a01abca70aec7421..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2218 zcma)7Ur!rH5Z~SV!`Yk-fg}*MP2E;$<*J0fL~0~bwFR0W6;ol;hm+dX;a!^}=d;;c zSH&_fg(^?|4!G(I@BIY*82j2MzCsm=&a8n#15)?A#rldn7N|9$N>o}3qaU++K=R`QdJtD%D^w5bs;nhjiKc%p( zN=<2bCsuW-zg69BsjAF`$R%03u464txE?oml1y5u30tl;^Z{G`9S}((DoDfxjT|xc zinOS;TZmlCd%`~oB2W5aLIg+TkVX^07evwWftVEG5s3<-B+Bq#d_`OmO@gP>=Kgv= z)yY@;T3+*YP$^cR-8^ZhYE5R{8x!Q6^PYbKj3$~6$syZiLn`R6HgrS69YKJ)f(h1U zzd%^NuO4gdkW?ARI7A$veZ^uQT9 z+THbDGF5{a|9CFJ1Ne!Z(ob0@l6S;JrtA1%6{7Rdy0x0gQK5CDxT~C`2%4(^z2| zot{CfJ}{nw%aF!NWoC2P6f^mg<^WnK7g#Edx4OBxv1$CY+ipWO@Pyp%x78d>sd*#_ zGvn7b8hm}#_~V_%Uu)D+4!+*ls;%&~hVkl+FE<-zwk@H4^p%1%wRHpyBP=Y4jN6h@ zKzXutys)y`SY2+c)t;NFc2{$mb^GldE@B;YX4UTm&{ z@XboqvtTp<9v=Ksh9;2y=f%ug2r#)hx?llvi4yf8c=QZ<{uvNLr{OEofVxoN*_q1% zi{3HC@iLuZ^OT+WPML+UGCX4}V1u`AffOF{4JaWDZ9-!;flDRFbOi9WV5+iljrka+ zZo-tpi3s`_%yjVR7R%S8R;9IShz|hP0(bz5oOimSpCTV}zSob_^O*_GMYqYht((9ud8NB^NMk))!Mce-4^5O<~)=;kBjFRz*bd`{*;4M~JOk_QQbDqJuqn$ClX| rJXWP^4}`)v8Bb>YPHuD0W~p6##mePPnqX;sq|YCsDa`1QPCNeq`zR9o diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/mbcsgroupprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/mbcsgroupprober.cpython-38.pyc deleted file mode 100644 index daf56be5a2a4ea9953493c251845e4e80a9c1e5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1083 zcmZ8fOK;Oa5Z?78@hdG24{_oiq&A{Zsg(*s4Ny@;RFPIlKCnt`C%9dwX4e4~<$#n* zJ@Fqv;?lpg;>L-8fH*O;Hfh?mzVXcL+B@GjbJ%Ej1lEto?RP)xg#5x_aaj;N1;{U8 zViHqMG8$5fzQK*m3{CBu+{*0G*1pASSv{<4-{wx{hOYK&+{^sX*M6M`StD#{-{DKy za=5I0m*2=%!WBw(N$kb`8HxRb&djhG2R+hi{H9Pwi>hYleP8sFVpp6@@_lhKNCafP z!-E%_mr-x;Wp5t&&ks9$`|~i^-C2M5V0|9r_NzCSVP}8q(bhclcGA(tJi@aFZ_6-( zdaf)K441qICLtk>Nod5@IT_N}h|M!MG|!1eLJR2FYWej}r?)_&8yWiR(xC4EOn`g_ zrXU5Kl9_R2OleHNLK_NmMhXjH18RUezyY`bZ$?JWlrVovz6IY23JkXzU69J>{qcwm zQ(k~_4Q0zoo(SQ?9m-)W9j66j0`C<_NZ4p~*MXc@|q z2_K38HZQ1h8H;#dO2#h8-|cphQ?Uepybq9fz!2IrEPCbnQ}aIGy{75fe?BeR1<8TlxSu7ADUY%2B%W~e1I9i~ z`n=rH*QiESc9d`qV%&lYOVdQ}HX78c1(3Q^RL9-cP1Qsypu|G;0*@$fQVcgsI$B-j z$)i+O2~=A7$s{_e7;D*8FdE>fR)??&`p~hcGT0I2M>z~^mBIEXZvZn}C9qZcqvBJQ c!M^Eo7kFug$V)lfr7%x$h$Zq3=(WfE2e07>1poj5 diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/mbcssm.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/mbcssm.cpython-38.pyc deleted file mode 100644 index 6f7e73775378ff730c6f512e30720f3a93e6b7af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16706 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 diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/sjisprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/sjisprober.cpython-38.pyc deleted file mode 100644 index d3b6ebb2ab4e01efb8a4efbbde35f8a57c7189f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2439 zcmZ`5%WfMtkmNqJl2@{0*RP@|9H2P}ZQ>qUv<1?lsqMxNVmYvsLj|mgdA}?K%rpFh!4|DM)u}QN8YAEXxGMCHTLY2%K!blr?_7x0@C^{q~Hf9q- ziL#VEf_301cSK+=D9_BrAsLtO1SfU!n%1fd+R6GoA!QLB(OwWlX{3Tc;=|I#y<*EK zI>-`4znx>UXwT9Y^$WV z-HUp6qcl@t9N#_t+9Z3mJciL6L{gK;)bMSg5(lHi#XiEVFia(9M*6^>=)28R1^WO z220oWyJs}<9y4gk9lYbg0OU!B&ImI@N&Bb@P-2jViOA_1lGk+C;p&(827`gH!TKE4 z`O6o-m5Ik8)hT28#J<;Fw$MaB7195|K+Tiw`YzuyQplqE*Y70WME4MFt1qQUVFoV; z!nzbdddQc#|J$cRa0x{T$QxF4ad)q=x6?SNJ=BZst_noj?YGYY9;#4R%$wcxG~yy{ z3B6q3KRRygJZ%Jx{o_4YJl?H3av5LqP$j^l)HH%9o2EGwR(r@zfO@#;`SNqP_$~Bo z9|l5~;KS5oL&|1vZH7rGPemm&SLhnW{bjZRvuj`jSrt~HKK1bq8!XNREJ}MLP|-rz zP1t-20GOMMDY!6(12Yg)CTvD*mOJb`OKrpPTy<6wKCfE2;2^81f&t8@+MgzLv--ch z_`omFGpq#!WGd0Y<{Y;-wGHJ2N(knuAOJ%KNtgFyg#93R)(_(xW3snNmf8bPh3ca& z=6ncMERn7*PisX>#4*&QYg3rKYf>(jtS`<<5Nlg7sAv%C}UWB=E_`N`P@#gm8$1?sdM4U3~HjOk&a0FNoKs?#7SN( auK6_(@~gf3xlVq-+LK`!11Fe%OV)pVK|-+r diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/universaldetector.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/universaldetector.cpython-38.pyc deleted file mode 100644 index 12f687b9274d96e245dc1c30525f5eae8ba74c20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5783 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 diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/utf8prober.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/utf8prober.cpython-38.pyc deleted file mode 100644 index e59be5cf0cfb771cf439d121c617ad689549232f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1944 zcma)7&2A$_5bmBokDaj-k`+G^;;=}Ij5diltTvH=u-M)tQev-c=Q0wsoawgL_RPfT z86#pjr$pM@o_K&n;lYteO>js7p9-*xfUtAHx!O5Q&p_I?8uf#U&xbVAvLt$$yI*$#%yIspj)CAv zJ_nJKlupToab;W+N>VemF2H6sCm@|Exys=@CvZHimtAEiKkj7b|z z>EK*G(9p0XQbiVzBNiRA0KiR@Ekz>IH&j`P2)ppkGZuuMBw_3g`RnOs8jUtb{n2_q zPSQ>ou6KVp8*Zmh#3pX%BE5Z&)9%(tU)09vOygO-{kR`e~aLM(nv8B}O0Bxa!OTC>?`N^B_Q z)EjMfSW`~6Kso#E7TWIf#!_S?#CwVyTHYOM!%6pW=5F}$I^LlNr&g8tHsldsm= zwMu)xzN<=l?MdA2a}ftZt+w_W&35Ie&Dwj-8W;!FvL#FC-#tD{1^AYV22cyLPSml! zQz%wf2)+$_l21So>QWCH$A#9J%Mx8NJZLA^m@F?85AM5HG>8x;udi|g6i&~fWd^{@ zLn0qdQP=hw*(T?dn^XEBu*noES~rzd@4emqZSvslA3HbLAT!?jbEj-%h!h+38msI* zYqA&3#b|qK7=(vVfwAa> zk3-Zw#!knbF#96QaH!@Q-OkDd0sOL^A`F2Y@37a*ph*D< z^ivoKS}wH=&+%-77EB!OnkJWexuA-(Zp{c!BHGFpK&*)_xvU0Pv#Zvn6J@_DP07lM ij)NqLG&N^@br;JmXv+OEOZw}NF(BkN4^Z={XZ;OVEv_*D diff --git a/venv/lib/python3.8/site-packages/chardet/__pycache__/version.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/__pycache__/version.cpython-38.pyc deleted file mode 100644 index 91cfb1a5380b4ca8dc20c7b257bfede96a23613f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 391 zcmYjNJx{|h5RGX{QBYUr8|hF7i84?Dst^n;MWVpafyj-W#;QLe+bN{K1|$|{{!Lc? z0V5M`35b*KJw4s&^zPktyHVil^)!C?^!%|F|EuN2$hY0|K!a&O(G)TCyhXQO(6mKc zlb{!_-lN-`TacQTf&qKt)>+U>RNypNE(^i43Ji0Gvn5w^a5;k|GnQ)ws+2QkKxdHV z#8Bp<%xDRZ+~r(>Wv(o6Q2|jDHiKphY&k1Px*&6AaTE2hs`a6uHD3!*k_uuqA? zvtK!yOTq -# -# 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 - -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 -) - diff --git a/venv/lib/python3.8/site-packages/chardet/big5prober.py b/venv/lib/python3.8/site-packages/chardet/big5prober.py deleted file mode 100644 index 98f9970..0000000 --- a/venv/lib/python3.8/site-packages/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 .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import Big5DistributionAnalysis -from .mbcssm import BIG5_SM_MODEL - - -class Big5Prober(MultiByteCharSetProber): - def __init__(self): - super(Big5Prober, self).__init__() - self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) - self.distribution_analyzer = Big5DistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "Big5" - - @property - def language(self): - return "Chinese" diff --git a/venv/lib/python3.8/site-packages/chardet/chardistribution.py b/venv/lib/python3.8/site-packages/chardet/chardistribution.py deleted file mode 100644 index c0395f4..0000000 --- a/venv/lib/python3.8/site-packages/chardet/chardistribution.py +++ /dev/null @@ -1,233 +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 .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, - EUCTW_TYPICAL_DISTRIBUTION_RATIO) -from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, - EUCKR_TYPICAL_DISTRIBUTION_RATIO) -from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, - GB2312_TYPICAL_DISTRIBUTION_RATIO) -from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, - BIG5_TYPICAL_DISTRIBUTION_RATIO) -from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, - JIS_TYPICAL_DISTRIBUTION_RATIO) - - -class CharDistributionAnalysis(object): - ENOUGH_DATA_THRESHOLD = 1024 - SURE_YES = 0.99 - SURE_NO = 0.01 - MINIMUM_DATA_THRESHOLD = 3 - - def __init__(self): - # Mapping table to get frequency order from char order (get from - # GetOrder()) - self._char_to_freq_order = None - self._table_size = None # 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 = None - self._done = None - self._total_chars = None - self._freq_chars = None - self.reset() - - def reset(self): - """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, char_len): - """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): - """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): - # 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, byte_str): - # 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): - super(EUCTWDistributionAnalysis, self).__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): - # 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 - else: - return -1 - - -class EUCKRDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(EUCKRDistributionAnalysis, self).__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): - # 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 - else: - return -1 - - -class GB2312DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(GB2312DistributionAnalysis, self).__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): - # 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 - else: - return -1 - - -class Big5DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(Big5DistributionAnalysis, self).__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): - # 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 - else: - return 157 * (first_char - 0xA4) + second_char - 0x40 - else: - return -1 - - -class SJISDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(SJISDistributionAnalysis, self).__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): - # 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 (first_char >= 0x81) and (first_char <= 0x9F): - order = 188 * (first_char - 0x81) - elif (first_char >= 0xE0) and (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): - super(EUCJPDistributionAnalysis, self).__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): - # 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 - else: - return -1 diff --git a/venv/lib/python3.8/site-packages/chardet/charsetgroupprober.py b/venv/lib/python3.8/site-packages/chardet/charsetgroupprober.py deleted file mode 100644 index 8b3738e..0000000 --- a/venv/lib/python3.8/site-packages/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 .enums import ProbingState -from .charsetprober import CharSetProber - - -class CharSetGroupProber(CharSetProber): - def __init__(self, lang_filter=None): - super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) - self._active_num = 0 - self.probers = [] - self._best_guess_prober = None - - def reset(self): - super(CharSetGroupProber, self).reset() - self._active_num = 0 - for prober in self.probers: - if prober: - prober.reset() - prober.active = True - self._active_num += 1 - self._best_guess_prober = None - - @property - def charset_name(self): - 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): - 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): - for prober in self.probers: - if not prober: - continue - if not prober.active: - continue - state = prober.feed(byte_str) - if not state: - continue - if state == ProbingState.FOUND_IT: - self._best_guess_prober = prober - return self.state - elif 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): - state = self.state - if state == ProbingState.FOUND_IT: - return 0.99 - elif state == ProbingState.NOT_ME: - return 0.01 - best_conf = 0.0 - self._best_guess_prober = None - for prober in self.probers: - if not prober: - continue - 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/venv/lib/python3.8/site-packages/chardet/charsetprober.py b/venv/lib/python3.8/site-packages/chardet/charsetprober.py deleted file mode 100644 index eac4e59..0000000 --- a/venv/lib/python3.8/site-packages/chardet/charsetprober.py +++ /dev/null @@ -1,145 +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 .enums import ProbingState - - -class CharSetProber(object): - - SHORTCUT_THRESHOLD = 0.95 - - def __init__(self, lang_filter=None): - self._state = None - self.lang_filter = lang_filter - self.logger = logging.getLogger(__name__) - - def reset(self): - self._state = ProbingState.DETECTING - - @property - def charset_name(self): - return None - - def feed(self, buf): - pass - - @property - def state(self): - return self._state - - def get_confidence(self): - return 0.0 - - @staticmethod - def filter_high_byte_only(buf): - buf = re.sub(b'([\x00-\x7F])+', b' ', buf) - return buf - - @staticmethod - def filter_international_words(buf): - """ - 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 = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', - 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 filter_with_english_letters(buf): - """ - Returns a copy of ``buf`` that retains only the sequences of English - alphabet and high byte characters that are not between <> characters. - Also retains English alphabet and high byte characters immediately - before occurrences of >. - - 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 - - for curr in range(len(buf)): - # Slice here to get bytes instead of an int with Python 3 - buf_char = buf[curr:curr + 1] - # Check if we're coming out of or entering an HTML tag - if buf_char == b'>': - in_tag = False - elif buf_char == b'<': - in_tag = True - - # If current character is not extended-ASCII and not alphabetic... - if buf_char < b'\x80' and not buf_char.isalpha(): - # ...and we're not in a tag - 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' ') - prev = curr + 1 - - # 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/venv/lib/python3.8/site-packages/chardet/cli/__init__.py b/venv/lib/python3.8/site-packages/chardet/cli/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/venv/lib/python3.8/site-packages/chardet/cli/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/venv/lib/python3.8/site-packages/chardet/cli/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/chardet/cli/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 829d431ea59e04d1a7fd235bb566a10b03bfe712..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmWIL<>g`kf+e>4ag0FvF^GcWBeaP>|S!s&*^JU`3u1Y&R0!Rrs2zuz@F-w>guklufEpjJ3EPo=f8iy z_3clPex}Lh6JYWoep+D=-oO(~_ysHdfnNrLpbQ5gBVABLgUG$(L5z1;G|J|n>Apq9 zR+$VEC&$Hh*&4JU?}(<@`koDTL|Y_c8&X?d6Ri_pRkD5I!6Nv~>s-rjFwaXq8>)P4 z_}NiDJmMxhk($?)z@txl7B>8y6t9l&-Vj8RZ6wbsR&&?|295Ln9cw+cS z)g{*kq4bjE7nH{91om2XpzC5{WSW5@Q(5O2tPf;V7v?O+@E{* zy>Iw=VAwpkVCTWyzx3z9f-!II9|sCZc)a&Gfi_&A&d^2Yp^4T0oLx3d^KxqeL@oSt zHV=h=-BX1KE|d9c23>gFTL2p(BJF}fih-2I>^GP3Pow~G0ded!{m9o$GG1BMNX#l9A0B}(o(z^XN{4Uqvlul>k{IEhZ z*yj2evp1jIKJW7^WKHhB)$S=(6xe@f~}VfH)Qs)2IaEjnnXR5rEYNJ?Qt zfxffRu&A}P@zPom1Z*rMVao=3s_pAY2?YV!$Z~xk8;@#LW~LL_$OU6Viovpp4QZ}+ z;pj(CUB~O!zuhwB_|`Zdck@b{tSGvp)9J}y%{_T*)v3?lMZT7it=@QQ+smqtDRpT* z`U4#58yLJKW=;Ghe#}UUS;%(rZn5}T7^pwOVhFyudO}E)2nX;VAQm zyo*)|E?Wyvothodf{(V?dFnII?3inFd^_H~@GsCtkG~deBFEX!uJr!~=^@vEOIZ^C zQ7(C=4kySwD1%g}hXzK8`he?9fec^7HOx=@{F4>*uNLotvUrYO7|UTk%B5J5>Uys( z?X?6uHObWjHroeM_V}Ymz(9|@e|4w-&7(&=*LM$<|YcOi!z73ez$WiO;+keqza&`oOKX2$WXzEEpsXdX@@^n$Cl45_s z`OA}=LXI-DRDVg=9qX$D%iisTHawEW*oG9jjVi>hZDVCT+v;{#q-+~2Vb*&4Cdlis zqdA(j zmgBa{mi*;_K}?hJgCeU=mOw(Z8q|^%D~1K7u z?y&vNu5F~LsE284lN6UTt}B_Qitbev&_JZ4{!9afYa6Rlx+n+j)vSkR$A3I7EraW8 zB`)~ot-bt5rdE!|mm#kYM3jsDh-5bg7ijbSvKEs self.SHORTCUT_THRESHOLD)): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self): - context_conf = self.context_analyzer.get_confidence() - distrib_conf = self.distribution_analyzer.get_confidence() - return max(context_conf, distrib_conf) diff --git a/venv/lib/python3.8/site-packages/chardet/euckrfreq.py b/venv/lib/python3.8/site-packages/chardet/euckrfreq.py deleted file mode 100644 index b68078c..0000000 --- a/venv/lib/python3.8/site-packages/chardet/euckrfreq.py +++ /dev/null @@ -1,195 +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 , -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 -) - diff --git a/venv/lib/python3.8/site-packages/chardet/euckrprober.py b/venv/lib/python3.8/site-packages/chardet/euckrprober.py deleted file mode 100644 index 345a060..0000000 --- a/venv/lib/python3.8/site-packages/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 .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import EUCKR_SM_MODEL - - -class EUCKRProber(MultiByteCharSetProber): - def __init__(self): - super(EUCKRProber, self).__init__() - self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) - self.distribution_analyzer = EUCKRDistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "EUC-KR" - - @property - def language(self): - return "Korean" diff --git a/venv/lib/python3.8/site-packages/chardet/euctwfreq.py b/venv/lib/python3.8/site-packages/chardet/euctwfreq.py deleted file mode 100644 index ed7a995..0000000 --- a/venv/lib/python3.8/site-packages/chardet/euctwfreq.py +++ /dev/null @@ -1,387 +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 -# - -# 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 - -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 -) - diff --git a/venv/lib/python3.8/site-packages/chardet/euctwprober.py b/venv/lib/python3.8/site-packages/chardet/euctwprober.py deleted file mode 100644 index 35669cc..0000000 --- a/venv/lib/python3.8/site-packages/chardet/euctwprober.py +++ /dev/null @@ -1,46 +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 .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCTWDistributionAnalysis -from .mbcssm import EUCTW_SM_MODEL - -class EUCTWProber(MultiByteCharSetProber): - def __init__(self): - super(EUCTWProber, self).__init__() - self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) - self.distribution_analyzer = EUCTWDistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "EUC-TW" - - @property - def language(self): - return "Taiwan" diff --git a/venv/lib/python3.8/site-packages/chardet/gb2312freq.py b/venv/lib/python3.8/site-packages/chardet/gb2312freq.py deleted file mode 100644 index 697837b..0000000 --- a/venv/lib/python3.8/site-packages/chardet/gb2312freq.py +++ /dev/null @@ -1,283 +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 - -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 -) - diff --git a/venv/lib/python3.8/site-packages/chardet/gb2312prober.py b/venv/lib/python3.8/site-packages/chardet/gb2312prober.py deleted file mode 100644 index 8446d2d..0000000 --- a/venv/lib/python3.8/site-packages/chardet/gb2312prober.py +++ /dev/null @@ -1,46 +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 .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import GB2312DistributionAnalysis -from .mbcssm import GB2312_SM_MODEL - -class GB2312Prober(MultiByteCharSetProber): - def __init__(self): - super(GB2312Prober, self).__init__() - self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) - self.distribution_analyzer = GB2312DistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "GB2312" - - @property - def language(self): - return "Chinese" diff --git a/venv/lib/python3.8/site-packages/chardet/hebrewprober.py b/venv/lib/python3.8/site-packages/chardet/hebrewprober.py deleted file mode 100644 index b0e1bf4..0000000 --- a/venv/lib/python3.8/site-packages/chardet/hebrewprober.py +++ /dev/null @@ -1,292 +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 .charsetprober import CharSetProber -from .enums import ProbingState - -# 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): - # 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): - super(HebrewProber, self).__init__() - self._final_char_logical_score = None - self._final_char_visual_score = None - self._prev = None - self._before_prev = None - self._logical_prober = None - self._visual_prober = None - self.reset() - - def reset(self): - 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._before_prev = ' ' - # These probers are owned by the group prober. - - def set_model_probers(self, logicalProber, visualProber): - self._logical_prober = logicalProber - self._visual_prober = visualProber - - def is_final(self, c): - return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, - self.FINAL_PE, self.FINAL_TSADI] - - def is_non_final(self, c): - # 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): - # 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 == ' ': - # We stand on a space - a word just ended - if self._before_prev != ' ': - # 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 == ' ') and - (self.is_final(self._prev)) and (cur != ' ')): - # 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): - # 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): - return 'Hebrew' - - @property - def state(self): - # 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/venv/lib/python3.8/site-packages/chardet/jisfreq.py b/venv/lib/python3.8/site-packages/chardet/jisfreq.py deleted file mode 100644 index 83fc082..0000000 --- a/venv/lib/python3.8/site-packages/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 - -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 -) - - diff --git a/venv/lib/python3.8/site-packages/chardet/jpcntx.py b/venv/lib/python3.8/site-packages/chardet/jpcntx.py deleted file mode 100644 index 20044e4..0000000 --- a/venv/lib/python3.8/site-packages/chardet/jpcntx.py +++ /dev/null @@ -1,233 +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 ######################### - - -# This is hiragana 2-char sequence table, the number in each cell represents its frequency category -jp2CharContext = ( -(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), -) - -class JapaneseContextAnalysis(object): - NUM_OF_CATEGORY = 6 - DONT_KNOW = -1 - ENOUGH_REL_THRESHOLD = 100 - MAX_REL_THRESHOLD = 1000 - MINIMUM_DATA_THRESHOLD = 4 - - def __init__(self): - self._total_rel = None - self._rel_sample = None - self._need_to_skip_char_num = None - self._last_char_order = None - self._done = None - self.reset() - - def reset(self): - 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, num_bytes): - 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[jp2CharContext[self._last_char_order][order]] += 1 - self._last_char_order = order - - def got_enough_data(self): - return self._total_rel > self.ENOUGH_REL_THRESHOLD - - def get_confidence(self): - # 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 - else: - return self.DONT_KNOW - - def get_order(self, byte_str): - return -1, 1 - -class SJISContextAnalysis(JapaneseContextAnalysis): - def __init__(self): - super(SJISContextAnalysis, self).__init__() - self._charset_name = "SHIFT_JIS" - - @property - def charset_name(self): - return self._charset_name - - def get_order(self, byte_str): - 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): - 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/venv/lib/python3.8/site-packages/chardet/langbulgarianmodel.py b/venv/lib/python3.8/site-packages/chardet/langbulgarianmodel.py deleted file mode 100644 index 2aa4fb2..0000000 --- a/venv/lib/python3.8/site-packages/chardet/langbulgarianmodel.py +++ /dev/null @@ -1,228 +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 ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -# this table is modified base on win1251BulgarianCharToOrderMap, so -# only number <64 is sure valid - -Latin5_BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 -210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 - 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 - 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 -) - -win1251BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 -221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 - 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 - 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 96.9392% -# first 1024 sequences:3.0618% -# rest sequences: 0.2992% -# negative sequences: 0.0020% -BulgarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, -3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, -0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, -0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, -0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, -0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, -0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,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, -1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, -0,0,0,0,0,0,0,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, -2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,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, -3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,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,1, -3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,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,1, -3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,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, -2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,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,1, -3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,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, -3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,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, -3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, -2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, -3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, -1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, -3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, -1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, -2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, -2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, -3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, -1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, -2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, -2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, -1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, -2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, -2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, -2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, -1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, -2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, -1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, -3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, -1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, -3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, -1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, -2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, -1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, -2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,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,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, -1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, -2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, -1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, -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,1,0,1,0, -1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, -2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, -1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, -0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, -1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, -1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, -1,0,0,1,3,1,1,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, -0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, -1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -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,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,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, -1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,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,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,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,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,1, -) - -Latin5BulgarianModel = { - 'char_to_order_map': Latin5_BulgarianCharToOrderMap, - 'precedence_matrix': BulgarianLangModel, - 'typical_positive_ratio': 0.969392, - 'keep_english_letter': False, - 'charset_name': "ISO-8859-5", - 'language': 'Bulgairan', -} - -Win1251BulgarianModel = { - 'char_to_order_map': win1251BulgarianCharToOrderMap, - 'precedence_matrix': BulgarianLangModel, - 'typical_positive_ratio': 0.969392, - 'keep_english_letter': False, - 'charset_name': "windows-1251", - 'language': 'Bulgarian', -} diff --git a/venv/lib/python3.8/site-packages/chardet/langcyrillicmodel.py b/venv/lib/python3.8/site-packages/chardet/langcyrillicmodel.py deleted file mode 100644 index e5f9a1f..0000000 --- a/venv/lib/python3.8/site-packages/chardet/langcyrillicmodel.py +++ /dev/null @@ -1,333 +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 ######################### - -# KOI8-R language model -# Character Mapping Table: -KOI8R_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 -223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 -238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 - 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 - 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 - 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 - 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 -) - -win1251_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -) - -latin5_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -macCyrillic_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, -) - -IBM855_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, -206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, - 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, -220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, -230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, - 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, - 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, -250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, -) - -IBM866_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 97.6601% -# first 1024 sequences: 2.3389% -# rest sequences: 0.1237% -# negative sequences: 0.0009% -RussianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, -0,0,0,0,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, -3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, -0,0,0,0,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, -3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,1,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, -3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, -0,0,0,0,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, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, -0,0,0,0,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, -3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,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, -3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, -0,0,0,0,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, -3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, -0,0,0,0,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, -2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,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, -3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,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, -3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, -0,0,0,0,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, -3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,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, -3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,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, -3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,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,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,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, -3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, -0,0,0,0,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, -3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,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, -2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, -0,0,0,0,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, -3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,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, -3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,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, -2,1,3,3,3,2,0,0,0,2,1,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, -1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, -1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, -2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, -1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, -3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, -1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, -2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, -1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, -1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, -1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, -1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, -3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, -1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, -2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, -1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, -2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, -0,0,0,0,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, -2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, -1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, -1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, -1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, -3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, -3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, -1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, -1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, -0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, -1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, -1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, -0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, -1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, -2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, -1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, -1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, -2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, -1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, -1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, -1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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, -1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, -0,1,1,0,0,1,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, -1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, -0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, -0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, -2,2,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,1, -1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,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,1, -1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,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,1, -1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, -0,1,1,1,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, -0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -) - -Koi8rModel = { - 'char_to_order_map': KOI8R_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "KOI8-R", - 'language': 'Russian', -} - -Win1251CyrillicModel = { - 'char_to_order_map': win1251_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "windows-1251", - 'language': 'Russian', -} - -Latin5CyrillicModel = { - 'char_to_order_map': latin5_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "ISO-8859-5", - 'language': 'Russian', -} - -MacCyrillicModel = { - 'char_to_order_map': macCyrillic_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "MacCyrillic", - 'language': 'Russian', -} - -Ibm866Model = { - 'char_to_order_map': IBM866_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "IBM866", - 'language': 'Russian', -} - -Ibm855Model = { - 'char_to_order_map': IBM855_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "IBM855", - 'language': 'Russian', -} diff --git a/venv/lib/python3.8/site-packages/chardet/langgreekmodel.py b/venv/lib/python3.8/site-packages/chardet/langgreekmodel.py deleted file mode 100644 index 5332221..0000000 --- a/venv/lib/python3.8/site-packages/chardet/langgreekmodel.py +++ /dev/null @@ -1,225 +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 ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin7_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -win1253_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.2851% -# first 1024 sequences:1.7001% -# rest sequences: 0.0359% -# negative sequences: 0.0148% -GreekLangModel = ( -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,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, -3,0,0,0,2,0,0,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,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,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,2,0,0,0,0,0,0,0,0, -0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, -2,0,0,0,2,0,0,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,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, -0,0,0,0,2,0,0,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,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, -2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, -2,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,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,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,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,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,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,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,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, -0,0,1,0,0,0,0,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,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,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, -0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, -2,0,0,0,0,0,0,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,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,2,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,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,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, -3,0,0,0,0,0,0,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,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,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,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, -2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, -2,0,0,0,0,0,0,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,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,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,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,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,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,1,0,0,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,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,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,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,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,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,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,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, -0,0,0,0,0,0,0,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,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,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,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,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,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,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,0, -0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,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,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, -0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, -0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,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,0, -0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, -0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, -0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, -0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, -0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, -0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,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,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,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, -0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, -0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, -0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,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,0,0,0,0, -0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, -0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, -0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,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,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, -0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, -0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,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,0,0,0,0,0, -0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, -0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, -0,0,0,0,0,0,0,2,1,0,0,0,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,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,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,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,0,0,1,0,0,1,0,2,0,0,0, -0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,1,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,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, -0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,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,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,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, -) - -Latin7GreekModel = { - 'char_to_order_map': Latin7_char_to_order_map, - 'precedence_matrix': GreekLangModel, - 'typical_positive_ratio': 0.982851, - 'keep_english_letter': False, - 'charset_name': "ISO-8859-7", - 'language': 'Greek', -} - -Win1253GreekModel = { - 'char_to_order_map': win1253_char_to_order_map, - 'precedence_matrix': GreekLangModel, - 'typical_positive_ratio': 0.982851, - 'keep_english_letter': False, - 'charset_name': "windows-1253", - 'language': 'Greek', -} diff --git a/venv/lib/python3.8/site-packages/chardet/langhebrewmodel.py b/venv/lib/python3.8/site-packages/chardet/langhebrewmodel.py deleted file mode 100644 index 58f4c87..0000000 --- a/venv/lib/python3.8/site-packages/chardet/langhebrewmodel.py +++ /dev/null @@ -1,200 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Simon Montagu -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Shoshannah Forbes - 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 ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Windows-1255 language model -# Character Mapping Table: -WIN1255_CHAR_TO_ORDER_MAP = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 - 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 -253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 - 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 -124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, -215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, - 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, -106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, - 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, -238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, - 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, - 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.4004% -# first 1024 sequences: 1.5981% -# rest sequences: 0.087% -# negative sequences: 0.0015% -HEBREW_LANG_MODEL = ( -0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, -3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, -1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, -1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, -1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, -1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, -0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, -0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, -0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, -0,2,0,1,2,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,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, -0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, -0,2,0,1,2,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,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, -0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, -0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, -0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, -0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, -0,2,1,1,1,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,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, -1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, -0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,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, -3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,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, -3,0,0,0,1,1,0,1,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,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, -0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,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, -2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, -0,0,0,1,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, -2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,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, -3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,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,1,0,0,0,0,0,0,0,0,0, -0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, -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,0,0, -3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,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, -1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, -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,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, -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, -2,1,2,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,2,2,2, -0,2,0,1,2,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,1,0, -3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,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, -2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, -0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,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, -2,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, -1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, -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,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, -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,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, -1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, -0,2,0,1,2,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, -2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,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, -1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,1,0,1,0,0,1,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, -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,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, -1,0,0,1,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,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, -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,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,0,1,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,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, -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,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, -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,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, -2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,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, -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,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, -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,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,0,0,2,0,0,0,0,0, -0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,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, -1,0,0,1,0,0,1,0,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,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, -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,0,0,0, -1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, -0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,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, -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,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, -) - -Win1255HebrewModel = { - 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, - 'precedence_matrix': HEBREW_LANG_MODEL, - 'typical_positive_ratio': 0.984004, - 'keep_english_letter': False, - 'charset_name': "windows-1255", - 'language': 'Hebrew', -} diff --git a/venv/lib/python3.8/site-packages/chardet/langhungarianmodel.py b/venv/lib/python3.8/site-packages/chardet/langhungarianmodel.py deleted file mode 100644 index bb7c095..0000000 --- a/venv/lib/python3.8/site-packages/chardet/langhungarianmodel.py +++ /dev/null @@ -1,225 +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 ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin2_HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, -175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, - 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, - 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, -245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -win1250HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, -177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, - 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, - 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, -245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 94.7368% -# first 1024 sequences:5.2623% -# rest sequences: 0.8894% -# negative sequences: 0.0009% -HungarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, -3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,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,2,0, -3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,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,1,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, -0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, -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,1,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,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,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,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, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,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, -3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,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,1,0, -3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,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, -3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,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, -3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, -1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, -1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,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, -1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,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, -3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,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,0, -3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, -3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, -2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, -2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, -2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, -2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, -1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, -1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, -3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, -1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, -1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, -2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, -2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, -2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, -3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,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, -2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, -1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, -1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, -1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, -2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, -1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, -2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, -2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, -1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, -1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, -0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, -2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, -2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, -1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, -1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, -2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, -2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, -2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,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, -1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, -1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, -0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,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,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -) - -Latin2HungarianModel = { - 'char_to_order_map': Latin2_HungarianCharToOrderMap, - 'precedence_matrix': HungarianLangModel, - 'typical_positive_ratio': 0.947368, - 'keep_english_letter': True, - 'charset_name': "ISO-8859-2", - 'language': 'Hungarian', -} - -Win1250HungarianModel = { - 'char_to_order_map': win1250HungarianCharToOrderMap, - 'precedence_matrix': HungarianLangModel, - 'typical_positive_ratio': 0.947368, - 'keep_english_letter': True, - 'charset_name': "windows-1250", - 'language': 'Hungarian', -} diff --git a/venv/lib/python3.8/site-packages/chardet/langthaimodel.py b/venv/lib/python3.8/site-packages/chardet/langthaimodel.py deleted file mode 100644 index 15f94c2..0000000 --- a/venv/lib/python3.8/site-packages/chardet/langthaimodel.py +++ /dev/null @@ -1,199 +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 ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# The following result for thai was collected from a limited sample (1M). - -# Character Mapping Table: -TIS620CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 -188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 -253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 - 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 -209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, -223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, -236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, - 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, - 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, - 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, - 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, - 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 92.6386% -# first 1024 sequences:7.3177% -# rest sequences: 1.0230% -# negative sequences: 0.0436% -ThaiLangModel = ( -0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, -0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, -3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, -0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, -3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, -3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, -3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, -3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, -2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, -3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, -1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, -3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, -1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, -0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, -0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, -2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, -0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, -3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, -2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, -3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, -2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, -3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, -3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, -3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, -3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, -1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, -0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, -0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, -3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, -3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, -1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, -3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, -3,1,0,2,3,0,0,0,3,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,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,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,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, -0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, -0,0,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, -3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, -1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, -1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, -3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, -0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, -3,0,0,1,1,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, -3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, -0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, -0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, -0,1,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, -3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, -0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, -0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, -0,0,0,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,3,3,3,3,1,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, -1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, -0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, -0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, -0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, -3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, -2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, -0,0,0,2,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,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, -3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,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, -2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0, -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,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,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, -1,0,0,1,0,1,1,0,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,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, -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,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,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, -2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, -1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -1,0,0,3,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,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, -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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,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,0, -2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,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, -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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,1,0,0,2,1,0,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,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, -2,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -TIS620ThaiModel = { - 'char_to_order_map': TIS620CharToOrderMap, - 'precedence_matrix': ThaiLangModel, - 'typical_positive_ratio': 0.926386, - 'keep_english_letter': False, - 'charset_name': "TIS-620", - 'language': 'Thai', -} diff --git a/venv/lib/python3.8/site-packages/chardet/langturkishmodel.py b/venv/lib/python3.8/site-packages/chardet/langturkishmodel.py deleted file mode 100644 index a427a45..0000000 --- a/venv/lib/python3.8/site-packages/chardet/langturkishmodel.py +++ /dev/null @@ -1,193 +0,0 @@ -# -*- coding: utf-8 -*- -######################## 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 -# Özgür Baskın - Turkish Language Model -# -# 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 ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin5_TurkishCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, - 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, -255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, - 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, -180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, -164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, -150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, - 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, -124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, - 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, - 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, - 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, -) - -TurkishLangModel = ( -3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, -3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, -3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, -3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, -3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, -3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, -3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, -2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, -3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, -2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, -1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, -2,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, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, -3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, -3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, -2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, -3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, -2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, -3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, -3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, -3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, -0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, -3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, -0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, -3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, -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,1,0,2,0,0,1, -3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, -2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, -2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, -3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, -0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, -1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, -3,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, -3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, -1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, -3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, -2,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, -3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, -0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, -3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, -0,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,1,0,0,0, -3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, -1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, -1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, -2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, -2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,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, -3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, -2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, -3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,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,1,0,0,0,0,0,0, -3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, -0,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,1,0,0,0,0,0, -3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, -1,0,0,1,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,1, -1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, -0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, -3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,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,0,0,0,0,0,0, -3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, -0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, -3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, -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,1,1,0,1,0,0,0, -3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, -1,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,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, -2,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, -3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, -0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, -3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, -0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, -0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, -3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, -0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, -0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, -3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, -0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, -3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, -0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, -0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, -3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, -0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, -0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, -3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, -0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, -0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, -3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, -0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, -3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, -0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, -0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, -0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, -0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, -1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, -0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, -0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, -3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, -0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, -2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, -2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, -0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,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,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,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,1,0,0,0,0,0,2,0,0,0,0,0,1, -0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,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,1,0,0,0, -2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,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, -2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,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,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -Latin5TurkishModel = { - 'char_to_order_map': Latin5_TurkishCharToOrderMap, - 'precedence_matrix': TurkishLangModel, - 'typical_positive_ratio': 0.970290, - 'keep_english_letter': True, - 'charset_name': "ISO-8859-9", - 'language': 'Turkish', -} diff --git a/venv/lib/python3.8/site-packages/chardet/latin1prober.py b/venv/lib/python3.8/site-packages/chardet/latin1prober.py deleted file mode 100644 index 7d1e8c2..0000000 --- a/venv/lib/python3.8/site-packages/chardet/latin1prober.py +++ /dev/null @@ -1,145 +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 .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 - -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 -) - - -class Latin1Prober(CharSetProber): - def __init__(self): - super(Latin1Prober, self).__init__() - self._last_char_class = None - self._freq_counter = None - self.reset() - - def reset(self): - self._last_char_class = OTH - self._freq_counter = [0] * FREQ_CAT_NUM - CharSetProber.reset(self) - - @property - def charset_name(self): - return "ISO-8859-1" - - @property - def language(self): - return "" - - def feed(self, byte_str): - byte_str = self.filter_with_english_letters(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): - if self.state == ProbingState.NOT_ME: - return 0.01 - - total = sum(self._freq_counter) - if total < 0.01: - confidence = 0.0 - else: - confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) - / total) - if confidence < 0.0: - confidence = 0.0 - # lower the confidence of latin1 so that other more accurate - # detector can take priority. - confidence = confidence * 0.73 - return confidence diff --git a/venv/lib/python3.8/site-packages/chardet/mbcharsetprober.py b/venv/lib/python3.8/site-packages/chardet/mbcharsetprober.py deleted file mode 100644 index 6256ecf..0000000 --- a/venv/lib/python3.8/site-packages/chardet/mbcharsetprober.py +++ /dev/null @@ -1,91 +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 .charsetprober import CharSetProber -from .enums import ProbingState, MachineState - - -class MultiByteCharSetProber(CharSetProber): - """ - MultiByteCharSetProber - """ - - def __init__(self, lang_filter=None): - super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) - self.distribution_analyzer = None - self.coding_sm = None - self._last_char = [0, 0] - - def reset(self): - super(MultiByteCharSetProber, self).reset() - if self.coding_sm: - self.coding_sm.reset() - if self.distribution_analyzer: - self.distribution_analyzer.reset() - self._last_char = [0, 0] - - @property - def charset_name(self): - raise NotImplementedError - - @property - def language(self): - raise NotImplementedError - - def feed(self, byte_str): - for i in range(len(byte_str)): - coding_state = self.coding_sm.next_state(byte_str[i]) - 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 - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte_str[0] - 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): - return self.distribution_analyzer.get_confidence() diff --git a/venv/lib/python3.8/site-packages/chardet/mbcsgroupprober.py b/venv/lib/python3.8/site-packages/chardet/mbcsgroupprober.py deleted file mode 100644 index 530abe7..0000000 --- a/venv/lib/python3.8/site-packages/chardet/mbcsgroupprober.py +++ /dev/null @@ -1,54 +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 .charsetgroupprober import CharSetGroupProber -from .utf8prober import UTF8Prober -from .sjisprober import SJISProber -from .eucjpprober import EUCJPProber -from .gb2312prober import GB2312Prober -from .euckrprober import EUCKRProber -from .cp949prober import CP949Prober -from .big5prober import Big5Prober -from .euctwprober import EUCTWProber - - -class MBCSGroupProber(CharSetGroupProber): - def __init__(self, lang_filter=None): - super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) - self.probers = [ - UTF8Prober(), - SJISProber(), - EUCJPProber(), - GB2312Prober(), - EUCKRProber(), - CP949Prober(), - Big5Prober(), - EUCTWProber() - ] - self.reset() diff --git a/venv/lib/python3.8/site-packages/chardet/mbcssm.py b/venv/lib/python3.8/site-packages/chardet/mbcssm.py deleted file mode 100644 index 8360d0f..0000000 --- a/venv/lib/python3.8/site-packages/chardet/mbcssm.py +++ /dev/null @@ -1,572 +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 .enums import MachineState - -# BIG5 - -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 -) - -BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) - -BIG5_SM_MODEL = {'class_table': BIG5_CLS, - 'class_factor': 5, - 'state_table': BIG5_ST, - 'char_len_table': BIG5_CHAR_LEN_TABLE, - 'name': 'Big5'} - -# CP949 - -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 -) - -CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) - -CP949_SM_MODEL = {'class_table': CP949_CLS, - 'class_factor': 10, - 'state_table': CP949_ST, - 'char_len_table': CP949_CHAR_LEN_TABLE, - 'name': 'CP949'} - -# EUC-JP - -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 -) - -EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) - -EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, - 'class_factor': 6, - 'state_table': EUCJP_ST, - 'char_len_table': EUCJP_CHAR_LEN_TABLE, - 'name': 'EUC-JP'} - -# EUC-KR - -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 -) - -EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) - -EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, - 'class_factor': 4, - 'state_table': EUCKR_ST, - 'char_len_table': EUCKR_CHAR_LEN_TABLE, - 'name': 'EUC-KR'} - -# EUC-TW - -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 -) - -EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) - -EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, - 'class_factor': 7, - 'state_table': EUCTW_ST, - 'char_len_table': EUCTW_CHAR_LEN_TABLE, - 'name': 'x-euc-tw'} - -# GB2312 - -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 -) - -# 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 = {'class_table': GB2312_CLS, - 'class_factor': 7, - 'state_table': GB2312_ST, - 'char_len_table': GB2312_CHAR_LEN_TABLE, - 'name': 'GB2312'} - -# Shift_JIS - -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 -) - -SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) - -SJIS_SM_MODEL = {'class_table': SJIS_CLS, - 'class_factor': 6, - 'state_table': SJIS_ST, - 'char_len_table': SJIS_CHAR_LEN_TABLE, - 'name': 'Shift_JIS'} - -# UCS2-BE - -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 -) - -UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) - -UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, - 'class_factor': 6, - 'state_table': UCS2BE_ST, - 'char_len_table': UCS2BE_CHAR_LEN_TABLE, - 'name': 'UTF-16BE'} - -# UCS2-LE - -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 -) - -UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) - -UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, - 'class_factor': 6, - 'state_table': UCS2LE_ST, - 'char_len_table': UCS2LE_CHAR_LEN_TABLE, - 'name': 'UTF-16LE'} - -# UTF-8 - -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 -) - -UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) - -UTF8_SM_MODEL = {'class_table': UTF8_CLS, - 'class_factor': 16, - 'state_table': UTF8_ST, - 'char_len_table': UTF8_CHAR_LEN_TABLE, - 'name': 'UTF-8'} diff --git a/venv/lib/python3.8/site-packages/chardet/sbcharsetprober.py b/venv/lib/python3.8/site-packages/chardet/sbcharsetprober.py deleted file mode 100644 index 0adb51d..0000000 --- a/venv/lib/python3.8/site-packages/chardet/sbcharsetprober.py +++ /dev/null @@ -1,132 +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 .charsetprober import CharSetProber -from .enums import CharacterCategory, ProbingState, SequenceLikelihood - - -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, reversed=False, name_prober=None): - super(SingleByteCharSetProber, self).__init__() - self._model = model - # TRUE if we need to reverse every pair in the model lookup - self._reversed = reversed - # Optional auxiliary prober for name decision - self._name_prober = name_prober - self._last_order = None - self._seq_counters = None - self._total_seqs = None - self._total_char = None - self._freq_char = None - self.reset() - - def reset(self): - super(SingleByteCharSetProber, self).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 - # characters that fall in our sampling range - self._freq_char = 0 - - @property - def charset_name(self): - if self._name_prober: - return self._name_prober.charset_name - else: - return self._model['charset_name'] - - @property - def language(self): - if self._name_prober: - return self._name_prober.language - else: - return self._model.get('language') - - def feed(self, byte_str): - if not self._model['keep_english_letter']: - byte_str = self.filter_international_words(byte_str) - if not byte_str: - return self.state - char_to_order_map = self._model['char_to_order_map'] - for i, c in enumerate(byte_str): - # XXX: Order is in range 1-64, so one would think we want 0-63 here, - # but that leads to 27 more test failures than before. - order = char_to_order_map[c] - # 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: - i = (self._last_order * self.SAMPLE_SIZE) + order - model = self._model['precedence_matrix'][i] - else: # reverse the order of the letters in the lookup - i = (order * self.SAMPLE_SIZE) + self._last_order - model = self._model['precedence_matrix'][i] - self._seq_counters[model] += 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 threshhold %s', charset_name, - confidence, - self.NEGATIVE_SHORTCUT_THRESHOLD) - self._state = ProbingState.NOT_ME - - return self.state - - def get_confidence(self): - r = 0.01 - if self._total_seqs > 0: - r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / - self._total_seqs / self._model['typical_positive_ratio']) - r = r * self._freq_char / self._total_char - if r >= 1.0: - r = 0.99 - return r diff --git a/venv/lib/python3.8/site-packages/chardet/sbcsgroupprober.py b/venv/lib/python3.8/site-packages/chardet/sbcsgroupprober.py deleted file mode 100644 index 98e95dc..0000000 --- a/venv/lib/python3.8/site-packages/chardet/sbcsgroupprober.py +++ /dev/null @@ -1,73 +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 .sbcharsetprober import SingleByteCharSetProber -from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, - Latin5CyrillicModel, MacCyrillicModel, - Ibm866Model, Ibm855Model) -from .langgreekmodel import Latin7GreekModel, Win1253GreekModel -from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel -# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel -from .langthaimodel import TIS620ThaiModel -from .langhebrewmodel import Win1255HebrewModel -from .hebrewprober import HebrewProber -from .langturkishmodel import Latin5TurkishModel - - -class SBCSGroupProber(CharSetGroupProber): - def __init__(self): - super(SBCSGroupProber, self).__init__() - self.probers = [ - SingleByteCharSetProber(Win1251CyrillicModel), - SingleByteCharSetProber(Koi8rModel), - SingleByteCharSetProber(Latin5CyrillicModel), - SingleByteCharSetProber(MacCyrillicModel), - SingleByteCharSetProber(Ibm866Model), - SingleByteCharSetProber(Ibm855Model), - SingleByteCharSetProber(Latin7GreekModel), - SingleByteCharSetProber(Win1253GreekModel), - SingleByteCharSetProber(Latin5BulgarianModel), - SingleByteCharSetProber(Win1251BulgarianModel), - # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) - # after we retrain model. - # SingleByteCharSetProber(Latin2HungarianModel), - # SingleByteCharSetProber(Win1250HungarianModel), - SingleByteCharSetProber(TIS620ThaiModel), - SingleByteCharSetProber(Latin5TurkishModel), - ] - hebrew_prober = HebrewProber() - logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, - False, hebrew_prober) - visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, - hebrew_prober) - hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) - self.probers.extend([hebrew_prober, logical_hebrew_prober, - visual_hebrew_prober]) - - self.reset() diff --git a/venv/lib/python3.8/site-packages/chardet/sjisprober.py b/venv/lib/python3.8/site-packages/chardet/sjisprober.py deleted file mode 100644 index 9e29623..0000000 --- a/venv/lib/python3.8/site-packages/chardet/sjisprober.py +++ /dev/null @@ -1,92 +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 .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import SJISDistributionAnalysis -from .jpcntx import SJISContextAnalysis -from .mbcssm import SJIS_SM_MODEL -from .enums import ProbingState, MachineState - - -class SJISProber(MultiByteCharSetProber): - def __init__(self): - super(SJISProber, self).__init__() - self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) - self.distribution_analyzer = SJISDistributionAnalysis() - self.context_analyzer = SJISContextAnalysis() - self.reset() - - def reset(self): - super(SJISProber, self).reset() - self.context_analyzer.reset() - - @property - def charset_name(self): - return self.context_analyzer.charset_name - - @property - def language(self): - return "Japanese" - - def feed(self, byte_str): - for i in range(len(byte_str)): - coding_state = self.coding_sm.next_state(byte_str[i]) - 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 - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte_str[0] - 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): - context_conf = self.context_analyzer.get_confidence() - distrib_conf = self.distribution_analyzer.get_confidence() - return max(context_conf, distrib_conf) diff --git a/venv/lib/python3.8/site-packages/chardet/universaldetector.py b/venv/lib/python3.8/site-packages/chardet/universaldetector.py deleted file mode 100644 index 7b4e92d..0000000 --- a/venv/lib/python3.8/site-packages/chardet/universaldetector.py +++ /dev/null @@ -1,286 +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 .charsetgroupprober import CharSetGroupProber -from .enums import InputState, LanguageFilter, ProbingState -from .escprober import EscCharSetProber -from .latin1prober import Latin1Prober -from .mbcsgroupprober import MBCSGroupProber -from .sbcsgroupprober import SBCSGroupProber - - -class UniversalDetector(object): - """ - 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'} - - def __init__(self, lang_filter=LanguageFilter.ALL): - self._esc_charset_prober = None - self._charset_probers = [] - self.result = None - self.done = None - self._got_data = None - self._input_state = None - self._last_char = None - self.lang_filter = lang_filter - self.logger = logging.getLogger(__name__) - self._has_win_bytes = None - self.reset() - - def reset(self): - """ - 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() - for prober in self._charset_probers: - prober.reset() - - def feed(self, byte_str): - """ - 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 len(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 = {'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 = {'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:] - - # 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()) - 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): - """ - 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 - lower_charset_name = max_prober.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) - 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', - prober.charset_name, - prober.language, - prober.get_confidence()) - return self.result diff --git a/venv/lib/python3.8/site-packages/chardet/utf8prober.py b/venv/lib/python3.8/site-packages/chardet/utf8prober.py deleted file mode 100644 index 6c3196c..0000000 --- a/venv/lib/python3.8/site-packages/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 .charsetprober import CharSetProber -from .enums import ProbingState, MachineState -from .codingstatemachine import CodingStateMachine -from .mbcssm import UTF8_SM_MODEL - - - -class UTF8Prober(CharSetProber): - ONE_CHAR_PROB = 0.5 - - def __init__(self): - super(UTF8Prober, self).__init__() - self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) - self._num_mb_chars = None - self.reset() - - def reset(self): - super(UTF8Prober, self).reset() - self.coding_sm.reset() - self._num_mb_chars = 0 - - @property - def charset_name(self): - return "utf-8" - - @property - def language(self): - return "" - - def feed(self, byte_str): - for c in byte_str: - coding_state = self.coding_sm.next_state(c) - if coding_state == MachineState.ERROR: - self._state = ProbingState.NOT_ME - break - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif 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): - unlike = 0.99 - if self._num_mb_chars < 6: - unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars - return 1.0 - unlike - else: - return unlike diff --git a/venv/lib/python3.8/site-packages/chardet/version.py b/venv/lib/python3.8/site-packages/chardet/version.py deleted file mode 100644 index bb2a34a..0000000 --- a/venv/lib/python3.8/site-packages/chardet/version.py +++ /dev/null @@ -1,9 +0,0 @@ -""" -This module exists only to simplify retrieving the version number of chardet -from within setup.py and from chardet subpackages. - -:author: Dan Blanchard (dan.blanchard@gmail.com) -""" - -__version__ = "3.0.4" -VERSION = __version__.split('.') diff --git a/venv/lib/python3.8/site-packages/easy-install.pth b/venv/lib/python3.8/site-packages/easy-install.pth deleted file mode 100644 index c5c7346..0000000 --- a/venv/lib/python3.8/site-packages/easy-install.pth +++ /dev/null @@ -1,2 +0,0 @@ -./setuptools-40.8.0-py3.8.egg -./pip-19.0.3-py3.8.egg diff --git a/venv/lib/python3.8/site-packages/idna-2.8.dist-info/INSTALLER b/venv/lib/python3.8/site-packages/idna-2.8.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.8/site-packages/idna-2.8.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.8/site-packages/idna-2.8.dist-info/LICENSE.rst b/venv/lib/python3.8/site-packages/idna-2.8.dist-info/LICENSE.rst deleted file mode 100644 index 3ee64fb..0000000 --- a/venv/lib/python3.8/site-packages/idna-2.8.dist-info/LICENSE.rst +++ /dev/null @@ -1,80 +0,0 @@ -License -------- - -Copyright (c) 2013-2018, Kim Davies. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -#. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -#. Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided with - the distribution. - -#. Neither the name of the copyright holder nor the names of the - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -#. THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE - USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - DAMAGE. - -Portions of the codec implementation and unit tests are derived from the -Python standard library, which carries the `Python Software Foundation -License `_: - - Copyright (c) 2001-2014 Python Software Foundation; All Rights Reserved - -Portions of the unit tests are derived from the Unicode standard, which -is subject to the Unicode, Inc. License Agreement: - - Copyright (c) 1991-2014 Unicode, Inc. All rights reserved. - Distributed under the Terms of Use in - . - - Permission is hereby granted, free of charge, to any person obtaining - a copy of the Unicode data files and any associated documentation - (the "Data Files") or Unicode software and any associated documentation - (the "Software") to deal in the Data Files or Software - without restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, and/or sell copies of - the Data Files or Software, and to permit persons to whom the Data Files - or Software are furnished to do so, provided that - - (a) this copyright and permission notice appear with all copies - of the Data Files or Software, - - (b) this copyright and permission notice appear in associated - documentation, and - - (c) there is clear notice in each modified Data File or in the Software - as well as in the documentation associated with the Data File(s) or - Software that the data or software has been modified. - - THE DATA FILES AND SOFTWARE ARE 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 OF THIRD PARTY RIGHTS. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS - NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL - DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THE DATA FILES OR SOFTWARE. - - Except as contained in this notice, the name of a copyright holder - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in these Data Files or Software without prior - written authorization of the copyright holder. diff --git a/venv/lib/python3.8/site-packages/idna-2.8.dist-info/METADATA b/venv/lib/python3.8/site-packages/idna-2.8.dist-info/METADATA deleted file mode 100644 index 30fde02..0000000 --- a/venv/lib/python3.8/site-packages/idna-2.8.dist-info/METADATA +++ /dev/null @@ -1,239 +0,0 @@ -Metadata-Version: 2.1 -Name: idna -Version: 2.8 -Summary: Internationalized Domain Names in Applications (IDNA) -Home-page: https://github.com/kjd/idna -Author: Kim Davies -Author-email: kim@cynosure.com.au -License: BSD-like -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: System Administrators -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Topic :: Internet :: Name Service (DNS) -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Utilities -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* - -Internationalized Domain Names in Applications (IDNA) -===================================================== - -Support for the Internationalised Domain Names in Applications -(IDNA) protocol as specified in `RFC 5891 `_. -This is the latest version of the protocol and is sometimes referred to as -“IDNA 2008”. - -This library also provides support for Unicode Technical Standard 46, -`Unicode IDNA Compatibility Processing `_. - -This acts as a suitable replacement for the “encodings.idna” module that -comes with the Python standard library, but only supports the -old, deprecated IDNA specification (`RFC 3490 `_). - -Basic functions are simply executed: - -.. code-block:: pycon - - # Python 3 - >>> import idna - >>> idna.encode('ドメイン.テスト') - b'xn--eckwd4c7c.xn--zckzah' - >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) - ドメイン.テスト - - # Python 2 - >>> import idna - >>> idna.encode(u'ドメイン.テスト') - 'xn--eckwd4c7c.xn--zckzah' - >>> print idna.decode('xn--eckwd4c7c.xn--zckzah') - ドメイン.テスト - -Packages --------- - -The latest tagged release version is published in the PyPI repository: - -.. image:: https://badge.fury.io/py/idna.svg - :target: http://badge.fury.io/py/idna - - -Installation ------------- - -To install this library, you can use pip: - -.. code-block:: bash - - $ pip install idna - -Alternatively, you can install the package using the bundled setup script: - -.. code-block:: bash - - $ python setup.py install - -This library works with Python 2.7 and Python 3.4 or later. - - -Usage ------ - -For typical usage, the ``encode`` and ``decode`` functions will take a domain -name argument and perform a conversion to A-labels or U-labels respectively. - -.. code-block:: pycon - - # Python 3 - >>> import idna - >>> idna.encode('ドメイン.テスト') - b'xn--eckwd4c7c.xn--zckzah' - >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) - ドメイン.テスト - -You may use the codec encoding and decoding methods using the -``idna.codec`` module: - -.. code-block:: pycon - - # Python 2 - >>> import idna.codec - >>> print u'домена.испытание'.encode('idna') - xn--80ahd1agd.xn--80akhbyknj4f - >>> print 'xn--80ahd1agd.xn--80akhbyknj4f'.decode('idna') - домена.испытание - -Conversions can be applied at a per-label basis using the ``ulabel`` or ``alabel`` -functions if necessary: - -.. code-block:: pycon - - # Python 2 - >>> idna.alabel(u'测试') - 'xn--0zwm56d' - -Compatibility Mapping (UTS #46) -+++++++++++++++++++++++++++++++ - -As described in `RFC 5895 `_, the IDNA -specification no longer normalizes input from different potential ways a user -may input a domain name. This functionality, known as a “mapping”, is now -considered by the specification to be a local user-interface issue distinct -from IDNA conversion functionality. - -This library provides one such mapping, that was developed by the Unicode -Consortium. Known as `Unicode IDNA Compatibility Processing `_, -it provides for both a regular mapping for typical applications, as well as -a transitional mapping to help migrate from older IDNA 2003 applications. - -For example, “Königsgäßchen” is not a permissible label as *LATIN CAPITAL -LETTER K* is not allowed (nor are capital letters in general). UTS 46 will -convert this into lower case prior to applying the IDNA conversion. - -.. code-block:: pycon - - # Python 3 - >>> import idna - >>> idna.encode(u'Königsgäßchen') - ... - idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed - >>> idna.encode('Königsgäßchen', uts46=True) - b'xn--knigsgchen-b4a3dun' - >>> print(idna.decode('xn--knigsgchen-b4a3dun')) - königsgäßchen - -Transitional processing provides conversions to help transition from the older -2003 standard to the current standard. For example, in the original IDNA -specification, the *LATIN SMALL LETTER SHARP S* (ß) was converted into two -*LATIN SMALL LETTER S* (ss), whereas in the current IDNA specification this -conversion is not performed. - -.. code-block:: pycon - - # Python 2 - >>> idna.encode(u'Königsgäßchen', uts46=True, transitional=True) - 'xn--knigsgsschen-lcb0w' - -Implementors should use transitional processing with caution, only in rare -cases where conversion from legacy labels to current labels must be performed -(i.e. IDNA implementations that pre-date 2008). For typical applications -that just need to convert labels, transitional processing is unlikely to be -beneficial and could produce unexpected incompatible results. - -``encodings.idna`` Compatibility -++++++++++++++++++++++++++++++++ - -Function calls from the Python built-in ``encodings.idna`` module are -mapped to their IDNA 2008 equivalents using the ``idna.compat`` module. -Simply substitute the ``import`` clause in your code to refer to the -new module name. - -Exceptions ----------- - -All errors raised during the conversion following the specification should -raise an exception derived from the ``idna.IDNAError`` base class. - -More specific exceptions that may be generated as ``idna.IDNABidiError`` -when the error reflects an illegal combination of left-to-right and right-to-left -characters in a label; ``idna.InvalidCodepoint`` when a specific codepoint is -an illegal character in an IDN label (i.e. INVALID); and ``idna.InvalidCodepointContext`` -when the codepoint is illegal based on its positional context (i.e. it is CONTEXTO -or CONTEXTJ but the contextual requirements are not satisfied.) - -Building and Diagnostics ------------------------- - -The IDNA and UTS 46 functionality relies upon pre-calculated lookup tables for -performance. These tables are derived from computing against eligibility criteria -in the respective standards. These tables are computed using the command-line -script ``tools/idna-data``. - -This tool will fetch relevant tables from the Unicode Consortium and perform the -required calculations to identify eligibility. It has three main modes: - -* ``idna-data make-libdata``. Generates ``idnadata.py`` and ``uts46data.py``, - the pre-calculated lookup tables using for IDNA and UTS 46 conversions. Implementors - who wish to track this library against a different Unicode version may use this tool - to manually generate a different version of the ``idnadata.py`` and ``uts46data.py`` - files. - -* ``idna-data make-table``. Generate a table of the IDNA disposition - (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix B.1 of RFC - 5892 and the pre-computed tables published by `IANA `_. - -* ``idna-data U+0061``. Prints debugging output on the various properties - associated with an individual Unicode codepoint (in this case, U+0061), that are - used to assess the IDNA and UTS 46 status of a codepoint. This is helpful in debugging - or analysis. - -The tool accepts a number of arguments, described using ``idna-data -h``. Most notably, -the ``--version`` argument allows the specification of the version of Unicode to use -in computing the table data. For example, ``idna-data --version 9.0.0 make-libdata`` -will generate library data against Unicode 9.0.0. - -Note that this script requires Python 3, but all generated library data will work -in Python 2.7. - - -Testing -------- - -The library has a test suite based on each rule of the IDNA specification, as -well as tests that are provided as part of the Unicode Technical Standard 46, -`Unicode IDNA Compatibility Processing `_. - -The tests are run automatically on each commit at Travis CI: - -.. image:: https://travis-ci.org/kjd/idna.svg?branch=master - :target: https://travis-ci.org/kjd/idna - - diff --git a/venv/lib/python3.8/site-packages/idna-2.8.dist-info/RECORD b/venv/lib/python3.8/site-packages/idna-2.8.dist-info/RECORD deleted file mode 100644 index 8676c30..0000000 --- a/venv/lib/python3.8/site-packages/idna-2.8.dist-info/RECORD +++ /dev/null @@ -1,22 +0,0 @@ -idna-2.8.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -idna-2.8.dist-info/LICENSE.rst,sha256=DUvHq9SNz7FOJCVO5AQGZzf_AWcUTiIpFKIRO4eUaD4,3947 -idna-2.8.dist-info/METADATA,sha256=X4QsM_BLMPhl4gC8SEnXjvl5-gj7hvwAl7UCyR418so,8862 -idna-2.8.dist-info/RECORD,, -idna-2.8.dist-info/WHEEL,sha256=CihQvCnsGZQBGAHLEUMf0IdA4fRduS_NBUTMgCTtvPM,110 -idna-2.8.dist-info/top_level.txt,sha256=jSag9sEDqvSPftxOQy-ABfGV_RSy7oFh4zZJpODV8k0,5 -idna/__init__.py,sha256=9Nt7xpyet3DmOrPUGooDdAwmHZZu1qUAy2EaJ93kGiQ,58 -idna/__pycache__/__init__.cpython-38.pyc,, -idna/__pycache__/codec.cpython-38.pyc,, -idna/__pycache__/compat.cpython-38.pyc,, -idna/__pycache__/core.cpython-38.pyc,, -idna/__pycache__/idnadata.cpython-38.pyc,, -idna/__pycache__/intranges.cpython-38.pyc,, -idna/__pycache__/package_data.cpython-38.pyc,, -idna/__pycache__/uts46data.cpython-38.pyc,, -idna/codec.py,sha256=lvYb7yu7PhAqFaAIAdWcwgaWI2UmgseUua-1c0AsG0A,3299 -idna/compat.py,sha256=R-h29D-6mrnJzbXxymrWUW7iZUvy-26TQwZ0ij57i4U,232 -idna/core.py,sha256=JDCZZ_PLESqIgEbU8mPyoEufWwoOiIqygA17-QZIe3s,11733 -idna/idnadata.py,sha256=HXaPFw6_YAJ0qppACPu0YLAULtRs3QovRM_CCZHGdY0,40899 -idna/intranges.py,sha256=TY1lpxZIQWEP6tNqjZkFA5hgoMWOj1OBmnUG8ihT87E,1749 -idna/package_data.py,sha256=kIzeKKXEouXLR4srqwf9Q3zv-NffKSOz5aSDOJARPB0,21 -idna/uts46data.py,sha256=oLyNZ1pBaiBlj9zFzLFRd_P7J8MkRcgDisjExZR_4MY,198292 diff --git a/venv/lib/python3.8/site-packages/idna-2.8.dist-info/WHEEL b/venv/lib/python3.8/site-packages/idna-2.8.dist-info/WHEEL deleted file mode 100644 index dea0e20..0000000 --- a/venv/lib/python3.8/site-packages/idna-2.8.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.32.2) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.8/site-packages/idna-2.8.dist-info/top_level.txt b/venv/lib/python3.8/site-packages/idna-2.8.dist-info/top_level.txt deleted file mode 100644 index c40472e..0000000 --- a/venv/lib/python3.8/site-packages/idna-2.8.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -idna diff --git a/venv/lib/python3.8/site-packages/idna/__init__.py b/venv/lib/python3.8/site-packages/idna/__init__.py deleted file mode 100644 index 847bf93..0000000 --- a/venv/lib/python3.8/site-packages/idna/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .package_data import __version__ -from .core import * diff --git a/venv/lib/python3.8/site-packages/idna/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/idna/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 7fc50d2b6576db2e74407d9ced79bb98c18d900a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmWIL<>g`kf|a)VaaKV3F^GcMX4(p zir9c0F!4)Yza+OnzaX16f@RGL?rB0J8QmmH+?% diff --git a/venv/lib/python3.8/site-packages/idna/__pycache__/codec.cpython-38.pyc b/venv/lib/python3.8/site-packages/idna/__pycache__/codec.cpython-38.pyc deleted file mode 100644 index 5e37391f7333f41e83b4ce076203fb23b9943c66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2861 zcmb`JPmdcl6u|BIpV@47H%G!VqTS1de{Yfh*myC#*dl zR6b+E7S2;99O>-(BQx+(;|dQo9%`0QQ$BsRn)DD6|wr11#7~*#hPo+IWDtlD@Ug7o{-8BvV2ELbXO+I8Ij`rKi$#RI>d7D0;Jyf@_T*s1apePK%@0oBi$6Xxr!r0>@{)87iJ4asSMuF|z zB-t@;v5D1!3V!ux<93=2`u!f{QZytv)A%MzMG~hwjf>x38eW_jih+wmn-)0uQckA_ z-6#ix8fGHXiK(niCLLvoD35U4XqIfk-~<_XZ!_=qH~VpaJx;ScN|N=?w-4@J$v=>r zu}Gs*(EheJ`VaJ^w607OWq7=1SllumR`pJ7lqd3kZUm5_scTTfI?&F-3W-$`eVp3KZugDNBdq{pWDBPiOz}8wXvU#Uv(6qm0E$`7 z)-PCj6sVGZrVf-efh_%zG5g+py&Uu9{%Ff*;c%4h`j?69FD+@V`o+w9J} zL$7egR&E#G2wXO9>5DV#y~*=1jWEuyZt=g&>uk^^-VPPSo$qQ~>RfCPP`f zy*QmzV2w0&62yeEJ8>Feg3$RPQ`H=zm?DWLR1U~&kmMLE@k5+ik2yq_s)ct4osNXC z1pORNnq5M{_$(59j`4skT?~g>6d}}KO0&kR{NaV8N4#-x?iNCS5@&`}B;FwLHi_fd zJB=N0VabRtj{~*;GkM!OtNsIdzoV5`kyl_&8yWC^ZjJ4d!SpP$f>~~;vz@R;2C~G* zwy-s!nn-wrRJurLB5X~lJ0(=>HKC8FM-%EDAk@vh1wwyDLMu~3EBl20AndV!fY3^D zm{9*Pp~{Z3b{xZ-=(VO5&QOg)zC?9t0aZWFbT&=fQn^!V;VccMV^Stw7(nmjk8 z&Qq;HVt&GuSmw-?x$9%pWgnv0XU_C_)%3W}{V8cLWzRUm-t>_7*_-9ZBkZlC!G)F0 z^WHnyaSh9iJ!&6ek79X?22rffvmRywLsf6(AfxV=5a$wF6TBjE%mVfE?U);-3w4L) zn*vYme`EA>83{BBn`H7hLloS*3x=qD#1Q4<>oll=B4@i?@Z1=&T~kZUnYoiAm%{kb zMUTyvvgl@Qy2_%PWqz-ydOT13Wrl$Ry7F{DRgoXuvhVbk&045IU+`avqi^d>RrH;F zGsXV{bQR6*===b5P(T|85mCqMxhK$+ittp?Z=5MBZAhZ&U~u#suV}_qF(K>1E%mE_Jme*tUKOE c<;{MLaMZq>#k`DnwNXD=zffB;&s`$~KD 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 P797vn=j?J1xR3uI31t{h diff --git a/venv/lib/python3.8/site-packages/idna/__pycache__/idnadata.cpython-38.pyc b/venv/lib/python3.8/site-packages/idna/__pycache__/idnadata.cpython-38.pyc deleted file mode 100644 index d33a2d8d56a432aa909163cf2026697a25afe356..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21331 zcmeI)4^-8K{r~X~h=_`cN=inGN(zdKii(PQRa8_`GcqGmw5x%lAzsZA?bhgzMP`m~ zF(Y%16&h>SsGMVs6_pj06_sPmQRCa!iZy=4nsa>X_j-L^pZDyy@7eGC&Ufeh&hK|l z^X%p0dGF_bE?iN!doNzqt5**P|2Z;a+^QEJb(}vizWtvMLmkJ53%0g(bsWEw?f66d zq5dxZFn?EnctzLj5P!FS_z{8b?)`|s&-!l!e&&x0*VrZh_;U~MNV}Y8&=1|#&Tg0f zv!Csr{&zqBv)lf6F4xETU+?YPkHNP;1G|r&?qkHda9g|X!sl+6TsYf>`@3-6x23av z`;z}^9%GkM7y5$i`hWH39^bkzyQd5H{_V5#QhinNXS;^K?shx7?849bY<0{(9(Cbf zc-9Dik8hpz!WsTw*M;9_J^elZ{;2$GA9XkPv9L4$Yv=kuyLIIM^4NDr>A&1={z&&L zP`{RTzQ}KVuJ$XbqpkSsZU4RSb*pQ2jqQaq^S1)$i_d`0 zZue#{fv3erFy>bG(q?d_*bWB7KZ7U5Z@|;H7T_~80k@zH1Wb`tx#w>mHu=b7f6q61N2@%}hmljdC$p6oc$J})8=u@<8c zB^GIj7DO9Ax@RxPEc2p$NCIja8+;26%N^(>c6T4mlc@9oZTtoM4D=0jFa0xEJJ9|7 zr|b-I0tMcOG6T_KF$;0dVh+OD_8zE1h`<~#hK%px zg!y{u!wf0nuR6q(1Zq5XJB`@$!@eRVa*o&1D@kwQRQFv>J zQ@+dl_zoiKEkcrUPq^E}u1#GR6s=pgv8hYOn$1n&8SB;-t-GlyA|tB0%)bmc^FdUE18Lpj4Z!#VMs z%Qz!ABRL72M9wJAXigGm3}-B794DDGo-=_nk(0ui#F@;Q!b#;!#d(|a4(DCYdz{~KKIi<2bDr}zPABIZPM>a=C{904e@-;# zBF+HLKu!$jV$LAWC7f8!rJTW>A)GkQP|h&Ua85kuGR_FjNKOJLku!=jnv=vC!x_sN z$GM!dgtL^hjB^ENIp<1F7UwF?3eMG>m7Hrh*_>-RIh^Y_t2nDUxtukewVdlY`19V$ zU&mR`xq*|%!Jqw3{szuQ4*tk>^6>{MewT4>

tYaEdrvIRVZ#&UVgCoE@B-Ik#|j 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 Gp8pB6^pvy! diff --git a/venv/lib/python3.8/site-packages/idna/__pycache__/intranges.cpython-38.pyc b/venv/lib/python3.8/site-packages/idna/__pycache__/intranges.cpython-38.pyc deleted file mode 100644 index a78de55b7640d72ad617aaed1028a446cd106a42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1759 zcmZux%}*RR6t_JeY!;A`rY)c%)uK|hBawwr_0S5EsEtx72P!4$1+^W9wRagY>lthh zglJYdY%BH8NRIh~dhxX<{)JxXd!FShsz>(N&+o(jz2EaMi;GC=M8Pb6@nwmSBPNCd`H4p=~@B%q@P5@FVv8cFkgmqVK&oo;$))6FZa(-!;` z(MPz~xv2+-0Ayxwq3OL`QiW$)a``$N*y0SdN+Tf+*LFUsY0kHIK)j8)g#{#>n-cPn z_q*QN3xB-Ul^T>n3cP~J)u^~8(u@&&dz*i=#T)bmM^vRnU0YX$G=1;w`~uoJCR5{( z#4a|awo!}1uooT3LrtqwB3umC$NdIC{j1ynx?pNaf_qt78&fF>fB04 zbGJCCwFXwVEv%-si2 z+f_Q$<=Dr>SHOG@1L<^V2;W`!mMNp3(p4HW{R!+0@G-b-ILGdZy8x30o`y$2#2*Nd zhwYwokoglP%tbywE&w3Bs2%R1MhAv3p&Rd<`t_{}L2Lu)J`mm*13ku(Jt0GUWrAIO zALIpUUA(<`8_eQTNA*YHAPquZr(q2&E(0&Y{MHSzEJNr%@Ee$5X$m@J6K3f91@OLb-(vxCqD*)z6v;%5_(Tl&DYyFG+)i2xSe@lh*di zE=D^j;uF*pAzU$fv-4D1smHkjrVjZ&q%hs*LrAy5C$QutY|I|IHn;c+?YGnYzGtXL zfL=XIA`h~Q4{~@#t($NEX(5MJBMKTHrDV>97(`=kUF_+ax}YkJ3sDnDo{tW#qv^*G z-@B$4Jk&PJ)z{#nB^T?`g`fkZTBade0E!{mG{<AGAFa>fDHg eM9@ee*V!JIqAuhkB#J>EhjSg)`K%Lk!v6sO6v0;j diff --git a/venv/lib/python3.8/site-packages/idna/__pycache__/package_data.cpython-38.pyc b/venv/lib/python3.8/site-packages/idna/__pycache__/package_data.cpython-38.pyc deleted file mode 100644 index 792e3c2abe8f17e894418111f978fdce9ade8103..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmWIL<>g`kf|a)VaiT!_F^Gc<7=auIATH(r5-AK(3@MDk44O<;%tm?^ewvK8xZ~r? zQj3Z+^Yh~4S27ea0abyCU&i_+xdr+KnFYF;dBr7(IXSv%WtG{MC8nwRnJIaR5TYP4 hIXf{uH9jS=BvG%R@)n0pZhlH>PO2Tq+Rs4D006S)Cc6Lt diff --git a/venv/lib/python3.8/site-packages/idna/__pycache__/uts46data.cpython-38.pyc b/venv/lib/python3.8/site-packages/idna/__pycache__/uts46data.cpython-38.pyc deleted file mode 100644 index bdfe5b482e667a68706e30c5f6bcb24dc5e60068..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174134 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 V65AQv9NQ7x65Aehjcp75`+t;R7eW94 diff --git a/venv/lib/python3.8/site-packages/idna/codec.py b/venv/lib/python3.8/site-packages/idna/codec.py deleted file mode 100644 index 98c65ea..0000000 --- a/venv/lib/python3.8/site-packages/idna/codec.py +++ /dev/null @@ -1,118 +0,0 @@ -from .core import encode, decode, alabel, ulabel, IDNAError -import codecs -import re - -_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') - -class Codec(codecs.Codec): - - def encode(self, data, errors='strict'): - - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return "", 0 - - return encode(data), len(data) - - def decode(self, data, errors='strict'): - - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return u"", 0 - - return decode(data), len(data) - -class IncrementalEncoder(codecs.BufferedIncrementalEncoder): - def _buffer_encode(self, data, errors, final): - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return ("", 0) - - labels = _unicode_dots_re.split(data) - trailing_dot = u'' - if labels: - if not labels[-1]: - trailing_dot = '.' - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = '.' - - result = [] - size = 0 - for label in labels: - result.append(alabel(label)) - if size: - size += 1 - size += len(label) - - # Join with U+002E - result = ".".join(result) + trailing_dot - size += len(trailing_dot) - return (result, size) - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - def _buffer_decode(self, data, errors, final): - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return (u"", 0) - - # IDNA allows decoding to operate on Unicode strings, too. - if isinstance(data, unicode): - labels = _unicode_dots_re.split(data) - else: - # Must be ASCII string - data = str(data) - unicode(data, "ascii") - labels = data.split(".") - - trailing_dot = u'' - if labels: - if not labels[-1]: - trailing_dot = u'.' - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = u'.' - - result = [] - size = 0 - for label in labels: - result.append(ulabel(label)) - if size: - size += 1 - size += len(label) - - result = u".".join(result) + trailing_dot - size += len(trailing_dot) - return (result, size) - - -class StreamWriter(Codec, codecs.StreamWriter): - pass - -class StreamReader(Codec, codecs.StreamReader): - pass - -def getregentry(): - return codecs.CodecInfo( - name='idna', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamwriter=StreamWriter, - streamreader=StreamReader, - ) diff --git a/venv/lib/python3.8/site-packages/idna/compat.py b/venv/lib/python3.8/site-packages/idna/compat.py deleted file mode 100644 index 4d47f33..0000000 --- a/venv/lib/python3.8/site-packages/idna/compat.py +++ /dev/null @@ -1,12 +0,0 @@ -from .core import * -from .codec import * - -def ToASCII(label): - return encode(label) - -def ToUnicode(label): - return decode(label) - -def nameprep(s): - raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") - diff --git a/venv/lib/python3.8/site-packages/idna/core.py b/venv/lib/python3.8/site-packages/idna/core.py deleted file mode 100644 index 104624a..0000000 --- a/venv/lib/python3.8/site-packages/idna/core.py +++ /dev/null @@ -1,396 +0,0 @@ -from . import idnadata -import bisect -import unicodedata -import re -import sys -from .intranges import intranges_contain - -_virama_combining_class = 9 -_alabel_prefix = b'xn--' -_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') - -if sys.version_info[0] == 3: - unicode = str - unichr = chr - -class IDNAError(UnicodeError): - """ Base exception for all IDNA-encoding related problems """ - pass - - -class IDNABidiError(IDNAError): - """ Exception when bidirectional requirements are not satisfied """ - pass - - -class InvalidCodepoint(IDNAError): - """ Exception when a disallowed or unallocated codepoint is used """ - pass - - -class InvalidCodepointContext(IDNAError): - """ Exception when the codepoint is not valid in the context it is used """ - pass - - -def _combining_class(cp): - v = unicodedata.combining(unichr(cp)) - if v == 0: - if not unicodedata.name(unichr(cp)): - raise ValueError("Unknown character in unicodedata") - return v - -def _is_script(cp, script): - return intranges_contain(ord(cp), idnadata.scripts[script]) - -def _punycode(s): - return s.encode('punycode') - -def _unot(s): - return 'U+{0:04X}'.format(s) - - -def valid_label_length(label): - - if len(label) > 63: - return False - return True - - -def valid_string_length(label, trailing_dot): - - if len(label) > (254 if trailing_dot else 253): - return False - return True - - -def check_bidi(label, check_ltr=False): - - # Bidi rules should only be applied if string contains RTL characters - bidi_label = False - for (idx, cp) in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - if direction == '': - # String likely comes from a newer version of Unicode - raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx)) - if direction in ['R', 'AL', 'AN']: - bidi_label = True - if not bidi_label and not check_ltr: - return True - - # Bidi rule 1 - direction = unicodedata.bidirectional(label[0]) - if direction in ['R', 'AL']: - rtl = True - elif direction == 'L': - rtl = False - else: - raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label))) - - valid_ending = False - number_type = False - for (idx, cp) in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - - if rtl: - # Bidi rule 2 - if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: - raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx)) - # Bidi rule 3 - if direction in ['R', 'AL', 'EN', 'AN']: - valid_ending = True - elif direction != 'NSM': - valid_ending = False - # Bidi rule 4 - if direction in ['AN', 'EN']: - if not number_type: - number_type = direction - else: - if number_type != direction: - raise IDNABidiError('Can not mix numeral types in a right-to-left label') - else: - # Bidi rule 5 - if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: - raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx)) - # Bidi rule 6 - if direction in ['L', 'EN']: - valid_ending = True - elif direction != 'NSM': - valid_ending = False - - if not valid_ending: - raise IDNABidiError('Label ends with illegal codepoint directionality') - - return True - - -def check_initial_combiner(label): - - if unicodedata.category(label[0])[0] == 'M': - raise IDNAError('Label begins with an illegal combining character') - return True - - -def check_hyphen_ok(label): - - if label[2:4] == '--': - raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') - if label[0] == '-' or label[-1] == '-': - raise IDNAError('Label must not start or end with a hyphen') - return True - - -def check_nfc(label): - - if unicodedata.normalize('NFC', label) != label: - raise IDNAError('Label must be in Normalization Form C') - - -def valid_contextj(label, pos): - - cp_value = ord(label[pos]) - - if cp_value == 0x200c: - - if pos > 0: - if _combining_class(ord(label[pos - 1])) == _virama_combining_class: - return True - - ok = False - for i in range(pos-1, -1, -1): - joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == ord('T'): - continue - if joining_type in [ord('L'), ord('D')]: - ok = True - break - - if not ok: - return False - - ok = False - for i in range(pos+1, len(label)): - joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == ord('T'): - continue - if joining_type in [ord('R'), ord('D')]: - ok = True - break - return ok - - if cp_value == 0x200d: - - if pos > 0: - if _combining_class(ord(label[pos - 1])) == _virama_combining_class: - return True - return False - - else: - - return False - - -def valid_contexto(label, pos, exception=False): - - cp_value = ord(label[pos]) - - if cp_value == 0x00b7: - if 0 < pos < len(label)-1: - if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: - return True - return False - - elif cp_value == 0x0375: - if pos < len(label)-1 and len(label) > 1: - return _is_script(label[pos + 1], 'Greek') - return False - - elif cp_value == 0x05f3 or cp_value == 0x05f4: - if pos > 0: - return _is_script(label[pos - 1], 'Hebrew') - return False - - elif cp_value == 0x30fb: - for cp in label: - if cp == u'\u30fb': - continue - if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): - return True - return False - - elif 0x660 <= cp_value <= 0x669: - for cp in label: - if 0x6f0 <= ord(cp) <= 0x06f9: - return False - return True - - elif 0x6f0 <= cp_value <= 0x6f9: - for cp in label: - if 0x660 <= ord(cp) <= 0x0669: - return False - return True - - -def check_label(label): - - if isinstance(label, (bytes, bytearray)): - label = label.decode('utf-8') - if len(label) == 0: - raise IDNAError('Empty Label') - - check_nfc(label) - check_hyphen_ok(label) - check_initial_combiner(label) - - for (pos, cp) in enumerate(label): - cp_value = ord(cp) - 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 {0} not allowed at position {1} in {2}'.format( - _unot(cp_value), pos+1, repr(label))) - except ValueError: - raise IDNAError('Unknown codepoint adjacent to joiner {0} at position {1} in {2}'.format( - _unot(cp_value), pos+1, repr(label))) - elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): - if not valid_contexto(label, pos): - raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) - else: - raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label))) - - check_bidi(label) - - -def alabel(label): - - try: - label = label.encode('ascii') - ulabel(label) - if not valid_label_length(label): - raise IDNAError('Label too long') - return label - except UnicodeEncodeError: - pass - - if not label: - raise IDNAError('No Input') - - label = unicode(label) - check_label(label) - label = _punycode(label) - label = _alabel_prefix + label - - if not valid_label_length(label): - raise IDNAError('Label too long') - - return label - - -def ulabel(label): - - if not isinstance(label, (bytes, bytearray)): - try: - label = label.encode('ascii') - except UnicodeEncodeError: - check_label(label) - return label - - label = label.lower() - if label.startswith(_alabel_prefix): - label = label[len(_alabel_prefix):] - else: - check_label(label) - return label.decode('ascii') - - label = label.decode('punycode') - check_label(label) - return label - - -def uts46_remap(domain, std3_rules=True, transitional=False): - """Re-map the characters in the string according to UTS46 processing.""" - from .uts46data import uts46data - output = u"" - try: - for pos, char in enumerate(domain): - code_point = ord(char) - uts46row = uts46data[code_point if code_point < 256 else - bisect.bisect_left(uts46data, (code_point, "Z")) - 1] - status = uts46row[1] - replacement = uts46row[2] if len(uts46row) == 3 else None - if (status == "V" or - (status == "D" and not transitional) or - (status == "3" and not std3_rules and replacement is None)): - output += char - elif replacement is not None and (status == "M" or - (status == "3" and not std3_rules) or - (status == "D" and transitional)): - output += replacement - elif status != "I": - raise IndexError() - return unicodedata.normalize("NFC", output) - except IndexError: - raise InvalidCodepoint( - "Codepoint {0} not allowed at position {1} in {2}".format( - _unot(code_point), pos + 1, repr(domain))) - - -def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): - - if isinstance(s, (bytes, bytearray)): - s = s.decode("ascii") - if uts46: - s = uts46_remap(s, std3_rules, transitional) - trailing_dot = False - result = [] - if strict: - labels = s.split('.') - else: - labels = _unicode_dots_re.split(s) - if not labels or labels == ['']: - raise IDNAError('Empty domain') - if labels[-1] == '': - del labels[-1] - trailing_dot = True - for label in labels: - s = alabel(label) - if s: - result.append(s) - else: - raise IDNAError('Empty label') - if trailing_dot: - result.append(b'') - s = b'.'.join(result) - if not valid_string_length(s, trailing_dot): - raise IDNAError('Domain too long') - return s - - -def decode(s, strict=False, uts46=False, std3_rules=False): - - if isinstance(s, (bytes, bytearray)): - s = s.decode("ascii") - if uts46: - s = uts46_remap(s, std3_rules, False) - trailing_dot = False - result = [] - if not strict: - labels = _unicode_dots_re.split(s) - else: - labels = s.split(u'.') - if not labels or labels == ['']: - raise IDNAError('Empty domain') - if not labels[-1]: - del labels[-1] - trailing_dot = True - for label in labels: - s = ulabel(label) - if s: - result.append(s) - else: - raise IDNAError('Empty label') - if trailing_dot: - result.append(u'') - return u'.'.join(result) diff --git a/venv/lib/python3.8/site-packages/idna/idnadata.py b/venv/lib/python3.8/site-packages/idna/idnadata.py deleted file mode 100644 index a80c959..0000000 --- a/venv/lib/python3.8/site-packages/idna/idnadata.py +++ /dev/null @@ -1,1979 +0,0 @@ -# This file is automatically generated by tools/idna-data - -__version__ = "11.0.0" -scripts = { - 'Greek': ( - 0x37000000374, - 0x37500000378, - 0x37a0000037e, - 0x37f00000380, - 0x38400000385, - 0x38600000387, - 0x3880000038b, - 0x38c0000038d, - 0x38e000003a2, - 0x3a3000003e2, - 0x3f000000400, - 0x1d2600001d2b, - 0x1d5d00001d62, - 0x1d6600001d6b, - 0x1dbf00001dc0, - 0x1f0000001f16, - 0x1f1800001f1e, - 0x1f2000001f46, - 0x1f4800001f4e, - 0x1f5000001f58, - 0x1f5900001f5a, - 0x1f5b00001f5c, - 0x1f5d00001f5e, - 0x1f5f00001f7e, - 0x1f8000001fb5, - 0x1fb600001fc5, - 0x1fc600001fd4, - 0x1fd600001fdc, - 0x1fdd00001ff0, - 0x1ff200001ff5, - 0x1ff600001fff, - 0x212600002127, - 0xab650000ab66, - 0x101400001018f, - 0x101a0000101a1, - 0x1d2000001d246, - ), - 'Han': ( - 0x2e8000002e9a, - 0x2e9b00002ef4, - 0x2f0000002fd6, - 0x300500003006, - 0x300700003008, - 0x30210000302a, - 0x30380000303c, - 0x340000004db6, - 0x4e0000009ff0, - 0xf9000000fa6e, - 0xfa700000fada, - 0x200000002a6d7, - 0x2a7000002b735, - 0x2b7400002b81e, - 0x2b8200002cea2, - 0x2ceb00002ebe1, - 0x2f8000002fa1e, - ), - 'Hebrew': ( - 0x591000005c8, - 0x5d0000005eb, - 0x5ef000005f5, - 0xfb1d0000fb37, - 0xfb380000fb3d, - 0xfb3e0000fb3f, - 0xfb400000fb42, - 0xfb430000fb45, - 0xfb460000fb50, - ), - 'Hiragana': ( - 0x304100003097, - 0x309d000030a0, - 0x1b0010001b11f, - 0x1f2000001f201, - ), - 'Katakana': ( - 0x30a1000030fb, - 0x30fd00003100, - 0x31f000003200, - 0x32d0000032ff, - 0x330000003358, - 0xff660000ff70, - 0xff710000ff9e, - 0x1b0000001b001, - ), -} -joining_types = { - 0x600: 85, - 0x601: 85, - 0x602: 85, - 0x603: 85, - 0x604: 85, - 0x605: 85, - 0x608: 85, - 0x60b: 85, - 0x620: 68, - 0x621: 85, - 0x622: 82, - 0x623: 82, - 0x624: 82, - 0x625: 82, - 0x626: 68, - 0x627: 82, - 0x628: 68, - 0x629: 82, - 0x62a: 68, - 0x62b: 68, - 0x62c: 68, - 0x62d: 68, - 0x62e: 68, - 0x62f: 82, - 0x630: 82, - 0x631: 82, - 0x632: 82, - 0x633: 68, - 0x634: 68, - 0x635: 68, - 0x636: 68, - 0x637: 68, - 0x638: 68, - 0x639: 68, - 0x63a: 68, - 0x63b: 68, - 0x63c: 68, - 0x63d: 68, - 0x63e: 68, - 0x63f: 68, - 0x640: 67, - 0x641: 68, - 0x642: 68, - 0x643: 68, - 0x644: 68, - 0x645: 68, - 0x646: 68, - 0x647: 68, - 0x648: 82, - 0x649: 68, - 0x64a: 68, - 0x66e: 68, - 0x66f: 68, - 0x671: 82, - 0x672: 82, - 0x673: 82, - 0x674: 85, - 0x675: 82, - 0x676: 82, - 0x677: 82, - 0x678: 68, - 0x679: 68, - 0x67a: 68, - 0x67b: 68, - 0x67c: 68, - 0x67d: 68, - 0x67e: 68, - 0x67f: 68, - 0x680: 68, - 0x681: 68, - 0x682: 68, - 0x683: 68, - 0x684: 68, - 0x685: 68, - 0x686: 68, - 0x687: 68, - 0x688: 82, - 0x689: 82, - 0x68a: 82, - 0x68b: 82, - 0x68c: 82, - 0x68d: 82, - 0x68e: 82, - 0x68f: 82, - 0x690: 82, - 0x691: 82, - 0x692: 82, - 0x693: 82, - 0x694: 82, - 0x695: 82, - 0x696: 82, - 0x697: 82, - 0x698: 82, - 0x699: 82, - 0x69a: 68, - 0x69b: 68, - 0x69c: 68, - 0x69d: 68, - 0x69e: 68, - 0x69f: 68, - 0x6a0: 68, - 0x6a1: 68, - 0x6a2: 68, - 0x6a3: 68, - 0x6a4: 68, - 0x6a5: 68, - 0x6a6: 68, - 0x6a7: 68, - 0x6a8: 68, - 0x6a9: 68, - 0x6aa: 68, - 0x6ab: 68, - 0x6ac: 68, - 0x6ad: 68, - 0x6ae: 68, - 0x6af: 68, - 0x6b0: 68, - 0x6b1: 68, - 0x6b2: 68, - 0x6b3: 68, - 0x6b4: 68, - 0x6b5: 68, - 0x6b6: 68, - 0x6b7: 68, - 0x6b8: 68, - 0x6b9: 68, - 0x6ba: 68, - 0x6bb: 68, - 0x6bc: 68, - 0x6bd: 68, - 0x6be: 68, - 0x6bf: 68, - 0x6c0: 82, - 0x6c1: 68, - 0x6c2: 68, - 0x6c3: 82, - 0x6c4: 82, - 0x6c5: 82, - 0x6c6: 82, - 0x6c7: 82, - 0x6c8: 82, - 0x6c9: 82, - 0x6ca: 82, - 0x6cb: 82, - 0x6cc: 68, - 0x6cd: 82, - 0x6ce: 68, - 0x6cf: 82, - 0x6d0: 68, - 0x6d1: 68, - 0x6d2: 82, - 0x6d3: 82, - 0x6d5: 82, - 0x6dd: 85, - 0x6ee: 82, - 0x6ef: 82, - 0x6fa: 68, - 0x6fb: 68, - 0x6fc: 68, - 0x6ff: 68, - 0x70f: 84, - 0x710: 82, - 0x712: 68, - 0x713: 68, - 0x714: 68, - 0x715: 82, - 0x716: 82, - 0x717: 82, - 0x718: 82, - 0x719: 82, - 0x71a: 68, - 0x71b: 68, - 0x71c: 68, - 0x71d: 68, - 0x71e: 82, - 0x71f: 68, - 0x720: 68, - 0x721: 68, - 0x722: 68, - 0x723: 68, - 0x724: 68, - 0x725: 68, - 0x726: 68, - 0x727: 68, - 0x728: 82, - 0x729: 68, - 0x72a: 82, - 0x72b: 68, - 0x72c: 82, - 0x72d: 68, - 0x72e: 68, - 0x72f: 82, - 0x74d: 82, - 0x74e: 68, - 0x74f: 68, - 0x750: 68, - 0x751: 68, - 0x752: 68, - 0x753: 68, - 0x754: 68, - 0x755: 68, - 0x756: 68, - 0x757: 68, - 0x758: 68, - 0x759: 82, - 0x75a: 82, - 0x75b: 82, - 0x75c: 68, - 0x75d: 68, - 0x75e: 68, - 0x75f: 68, - 0x760: 68, - 0x761: 68, - 0x762: 68, - 0x763: 68, - 0x764: 68, - 0x765: 68, - 0x766: 68, - 0x767: 68, - 0x768: 68, - 0x769: 68, - 0x76a: 68, - 0x76b: 82, - 0x76c: 82, - 0x76d: 68, - 0x76e: 68, - 0x76f: 68, - 0x770: 68, - 0x771: 82, - 0x772: 68, - 0x773: 82, - 0x774: 82, - 0x775: 68, - 0x776: 68, - 0x777: 68, - 0x778: 82, - 0x779: 82, - 0x77a: 68, - 0x77b: 68, - 0x77c: 68, - 0x77d: 68, - 0x77e: 68, - 0x77f: 68, - 0x7ca: 68, - 0x7cb: 68, - 0x7cc: 68, - 0x7cd: 68, - 0x7ce: 68, - 0x7cf: 68, - 0x7d0: 68, - 0x7d1: 68, - 0x7d2: 68, - 0x7d3: 68, - 0x7d4: 68, - 0x7d5: 68, - 0x7d6: 68, - 0x7d7: 68, - 0x7d8: 68, - 0x7d9: 68, - 0x7da: 68, - 0x7db: 68, - 0x7dc: 68, - 0x7dd: 68, - 0x7de: 68, - 0x7df: 68, - 0x7e0: 68, - 0x7e1: 68, - 0x7e2: 68, - 0x7e3: 68, - 0x7e4: 68, - 0x7e5: 68, - 0x7e6: 68, - 0x7e7: 68, - 0x7e8: 68, - 0x7e9: 68, - 0x7ea: 68, - 0x7fa: 67, - 0x840: 82, - 0x841: 68, - 0x842: 68, - 0x843: 68, - 0x844: 68, - 0x845: 68, - 0x846: 82, - 0x847: 82, - 0x848: 68, - 0x849: 82, - 0x84a: 68, - 0x84b: 68, - 0x84c: 68, - 0x84d: 68, - 0x84e: 68, - 0x84f: 68, - 0x850: 68, - 0x851: 68, - 0x852: 68, - 0x853: 68, - 0x854: 82, - 0x855: 68, - 0x856: 85, - 0x857: 85, - 0x858: 85, - 0x860: 68, - 0x861: 85, - 0x862: 68, - 0x863: 68, - 0x864: 68, - 0x865: 68, - 0x866: 85, - 0x867: 82, - 0x868: 68, - 0x869: 82, - 0x86a: 82, - 0x8a0: 68, - 0x8a1: 68, - 0x8a2: 68, - 0x8a3: 68, - 0x8a4: 68, - 0x8a5: 68, - 0x8a6: 68, - 0x8a7: 68, - 0x8a8: 68, - 0x8a9: 68, - 0x8aa: 82, - 0x8ab: 82, - 0x8ac: 82, - 0x8ad: 85, - 0x8ae: 82, - 0x8af: 68, - 0x8b0: 68, - 0x8b1: 82, - 0x8b2: 82, - 0x8b3: 68, - 0x8b4: 68, - 0x8b6: 68, - 0x8b7: 68, - 0x8b8: 68, - 0x8b9: 82, - 0x8ba: 68, - 0x8bb: 68, - 0x8bc: 68, - 0x8bd: 68, - 0x8e2: 85, - 0x1806: 85, - 0x1807: 68, - 0x180a: 67, - 0x180e: 85, - 0x1820: 68, - 0x1821: 68, - 0x1822: 68, - 0x1823: 68, - 0x1824: 68, - 0x1825: 68, - 0x1826: 68, - 0x1827: 68, - 0x1828: 68, - 0x1829: 68, - 0x182a: 68, - 0x182b: 68, - 0x182c: 68, - 0x182d: 68, - 0x182e: 68, - 0x182f: 68, - 0x1830: 68, - 0x1831: 68, - 0x1832: 68, - 0x1833: 68, - 0x1834: 68, - 0x1835: 68, - 0x1836: 68, - 0x1837: 68, - 0x1838: 68, - 0x1839: 68, - 0x183a: 68, - 0x183b: 68, - 0x183c: 68, - 0x183d: 68, - 0x183e: 68, - 0x183f: 68, - 0x1840: 68, - 0x1841: 68, - 0x1842: 68, - 0x1843: 68, - 0x1844: 68, - 0x1845: 68, - 0x1846: 68, - 0x1847: 68, - 0x1848: 68, - 0x1849: 68, - 0x184a: 68, - 0x184b: 68, - 0x184c: 68, - 0x184d: 68, - 0x184e: 68, - 0x184f: 68, - 0x1850: 68, - 0x1851: 68, - 0x1852: 68, - 0x1853: 68, - 0x1854: 68, - 0x1855: 68, - 0x1856: 68, - 0x1857: 68, - 0x1858: 68, - 0x1859: 68, - 0x185a: 68, - 0x185b: 68, - 0x185c: 68, - 0x185d: 68, - 0x185e: 68, - 0x185f: 68, - 0x1860: 68, - 0x1861: 68, - 0x1862: 68, - 0x1863: 68, - 0x1864: 68, - 0x1865: 68, - 0x1866: 68, - 0x1867: 68, - 0x1868: 68, - 0x1869: 68, - 0x186a: 68, - 0x186b: 68, - 0x186c: 68, - 0x186d: 68, - 0x186e: 68, - 0x186f: 68, - 0x1870: 68, - 0x1871: 68, - 0x1872: 68, - 0x1873: 68, - 0x1874: 68, - 0x1875: 68, - 0x1876: 68, - 0x1877: 68, - 0x1878: 68, - 0x1880: 85, - 0x1881: 85, - 0x1882: 85, - 0x1883: 85, - 0x1884: 85, - 0x1885: 84, - 0x1886: 84, - 0x1887: 68, - 0x1888: 68, - 0x1889: 68, - 0x188a: 68, - 0x188b: 68, - 0x188c: 68, - 0x188d: 68, - 0x188e: 68, - 0x188f: 68, - 0x1890: 68, - 0x1891: 68, - 0x1892: 68, - 0x1893: 68, - 0x1894: 68, - 0x1895: 68, - 0x1896: 68, - 0x1897: 68, - 0x1898: 68, - 0x1899: 68, - 0x189a: 68, - 0x189b: 68, - 0x189c: 68, - 0x189d: 68, - 0x189e: 68, - 0x189f: 68, - 0x18a0: 68, - 0x18a1: 68, - 0x18a2: 68, - 0x18a3: 68, - 0x18a4: 68, - 0x18a5: 68, - 0x18a6: 68, - 0x18a7: 68, - 0x18a8: 68, - 0x18aa: 68, - 0x200c: 85, - 0x200d: 67, - 0x202f: 85, - 0x2066: 85, - 0x2067: 85, - 0x2068: 85, - 0x2069: 85, - 0xa840: 68, - 0xa841: 68, - 0xa842: 68, - 0xa843: 68, - 0xa844: 68, - 0xa845: 68, - 0xa846: 68, - 0xa847: 68, - 0xa848: 68, - 0xa849: 68, - 0xa84a: 68, - 0xa84b: 68, - 0xa84c: 68, - 0xa84d: 68, - 0xa84e: 68, - 0xa84f: 68, - 0xa850: 68, - 0xa851: 68, - 0xa852: 68, - 0xa853: 68, - 0xa854: 68, - 0xa855: 68, - 0xa856: 68, - 0xa857: 68, - 0xa858: 68, - 0xa859: 68, - 0xa85a: 68, - 0xa85b: 68, - 0xa85c: 68, - 0xa85d: 68, - 0xa85e: 68, - 0xa85f: 68, - 0xa860: 68, - 0xa861: 68, - 0xa862: 68, - 0xa863: 68, - 0xa864: 68, - 0xa865: 68, - 0xa866: 68, - 0xa867: 68, - 0xa868: 68, - 0xa869: 68, - 0xa86a: 68, - 0xa86b: 68, - 0xa86c: 68, - 0xa86d: 68, - 0xa86e: 68, - 0xa86f: 68, - 0xa870: 68, - 0xa871: 68, - 0xa872: 76, - 0xa873: 85, - 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, - 0x10ad0: 82, - 0x10ad1: 82, - 0x10ad2: 82, - 0x10ad3: 68, - 0x10ad4: 68, - 0x10ad5: 68, - 0x10ad6: 68, - 0x10ad7: 76, - 0x10ad8: 68, - 0x10ad9: 68, - 0x10ada: 68, - 0x10adb: 68, - 0x10adc: 68, - 0x10add: 82, - 0x10ade: 68, - 0x10adf: 68, - 0x10ae0: 68, - 0x10ae1: 82, - 0x10ae2: 85, - 0x10ae3: 85, - 0x10ae4: 82, - 0x10aeb: 68, - 0x10aec: 68, - 0x10aed: 68, - 0x10aee: 68, - 0x10aef: 82, - 0x10b80: 68, - 0x10b81: 82, - 0x10b82: 68, - 0x10b83: 82, - 0x10b84: 82, - 0x10b85: 82, - 0x10b86: 68, - 0x10b87: 68, - 0x10b88: 68, - 0x10b89: 82, - 0x10b8a: 68, - 0x10b8b: 68, - 0x10b8c: 82, - 0x10b8d: 68, - 0x10b8e: 82, - 0x10b8f: 82, - 0x10b90: 68, - 0x10b91: 82, - 0x10ba9: 82, - 0x10baa: 82, - 0x10bab: 82, - 0x10bac: 82, - 0x10bad: 68, - 0x10bae: 68, - 0x10baf: 85, - 0x10d00: 76, - 0x10d01: 68, - 0x10d02: 68, - 0x10d03: 68, - 0x10d04: 68, - 0x10d05: 68, - 0x10d06: 68, - 0x10d07: 68, - 0x10d08: 68, - 0x10d09: 68, - 0x10d0a: 68, - 0x10d0b: 68, - 0x10d0c: 68, - 0x10d0d: 68, - 0x10d0e: 68, - 0x10d0f: 68, - 0x10d10: 68, - 0x10d11: 68, - 0x10d12: 68, - 0x10d13: 68, - 0x10d14: 68, - 0x10d15: 68, - 0x10d16: 68, - 0x10d17: 68, - 0x10d18: 68, - 0x10d19: 68, - 0x10d1a: 68, - 0x10d1b: 68, - 0x10d1c: 68, - 0x10d1d: 68, - 0x10d1e: 68, - 0x10d1f: 68, - 0x10d20: 68, - 0x10d21: 68, - 0x10d22: 82, - 0x10d23: 68, - 0x10f30: 68, - 0x10f31: 68, - 0x10f32: 68, - 0x10f33: 82, - 0x10f34: 68, - 0x10f35: 68, - 0x10f36: 68, - 0x10f37: 68, - 0x10f38: 68, - 0x10f39: 68, - 0x10f3a: 68, - 0x10f3b: 68, - 0x10f3c: 68, - 0x10f3d: 68, - 0x10f3e: 68, - 0x10f3f: 68, - 0x10f40: 68, - 0x10f41: 68, - 0x10f42: 68, - 0x10f43: 68, - 0x10f44: 68, - 0x10f45: 85, - 0x10f51: 68, - 0x10f52: 68, - 0x10f53: 68, - 0x10f54: 82, - 0x110bd: 85, - 0x110cd: 85, - 0x1e900: 68, - 0x1e901: 68, - 0x1e902: 68, - 0x1e903: 68, - 0x1e904: 68, - 0x1e905: 68, - 0x1e906: 68, - 0x1e907: 68, - 0x1e908: 68, - 0x1e909: 68, - 0x1e90a: 68, - 0x1e90b: 68, - 0x1e90c: 68, - 0x1e90d: 68, - 0x1e90e: 68, - 0x1e90f: 68, - 0x1e910: 68, - 0x1e911: 68, - 0x1e912: 68, - 0x1e913: 68, - 0x1e914: 68, - 0x1e915: 68, - 0x1e916: 68, - 0x1e917: 68, - 0x1e918: 68, - 0x1e919: 68, - 0x1e91a: 68, - 0x1e91b: 68, - 0x1e91c: 68, - 0x1e91d: 68, - 0x1e91e: 68, - 0x1e91f: 68, - 0x1e920: 68, - 0x1e921: 68, - 0x1e922: 68, - 0x1e923: 68, - 0x1e924: 68, - 0x1e925: 68, - 0x1e926: 68, - 0x1e927: 68, - 0x1e928: 68, - 0x1e929: 68, - 0x1e92a: 68, - 0x1e92b: 68, - 0x1e92c: 68, - 0x1e92d: 68, - 0x1e92e: 68, - 0x1e92f: 68, - 0x1e930: 68, - 0x1e931: 68, - 0x1e932: 68, - 0x1e933: 68, - 0x1e934: 68, - 0x1e935: 68, - 0x1e936: 68, - 0x1e937: 68, - 0x1e938: 68, - 0x1e939: 68, - 0x1e93a: 68, - 0x1e93b: 68, - 0x1e93c: 68, - 0x1e93d: 68, - 0x1e93e: 68, - 0x1e93f: 68, - 0x1e940: 68, - 0x1e941: 68, - 0x1e942: 68, - 0x1e943: 68, -} -codepoint_classes = { - 'PVALID': ( - 0x2d0000002e, - 0x300000003a, - 0x610000007b, - 0xdf000000f7, - 0xf800000100, - 0x10100000102, - 0x10300000104, - 0x10500000106, - 0x10700000108, - 0x1090000010a, - 0x10b0000010c, - 0x10d0000010e, - 0x10f00000110, - 0x11100000112, - 0x11300000114, - 0x11500000116, - 0x11700000118, - 0x1190000011a, - 0x11b0000011c, - 0x11d0000011e, - 0x11f00000120, - 0x12100000122, - 0x12300000124, - 0x12500000126, - 0x12700000128, - 0x1290000012a, - 0x12b0000012c, - 0x12d0000012e, - 0x12f00000130, - 0x13100000132, - 0x13500000136, - 0x13700000139, - 0x13a0000013b, - 0x13c0000013d, - 0x13e0000013f, - 0x14200000143, - 0x14400000145, - 0x14600000147, - 0x14800000149, - 0x14b0000014c, - 0x14d0000014e, - 0x14f00000150, - 0x15100000152, - 0x15300000154, - 0x15500000156, - 0x15700000158, - 0x1590000015a, - 0x15b0000015c, - 0x15d0000015e, - 0x15f00000160, - 0x16100000162, - 0x16300000164, - 0x16500000166, - 0x16700000168, - 0x1690000016a, - 0x16b0000016c, - 0x16d0000016e, - 0x16f00000170, - 0x17100000172, - 0x17300000174, - 0x17500000176, - 0x17700000178, - 0x17a0000017b, - 0x17c0000017d, - 0x17e0000017f, - 0x18000000181, - 0x18300000184, - 0x18500000186, - 0x18800000189, - 0x18c0000018e, - 0x19200000193, - 0x19500000196, - 0x1990000019c, - 0x19e0000019f, - 0x1a1000001a2, - 0x1a3000001a4, - 0x1a5000001a6, - 0x1a8000001a9, - 0x1aa000001ac, - 0x1ad000001ae, - 0x1b0000001b1, - 0x1b4000001b5, - 0x1b6000001b7, - 0x1b9000001bc, - 0x1bd000001c4, - 0x1ce000001cf, - 0x1d0000001d1, - 0x1d2000001d3, - 0x1d4000001d5, - 0x1d6000001d7, - 0x1d8000001d9, - 0x1da000001db, - 0x1dc000001de, - 0x1df000001e0, - 0x1e1000001e2, - 0x1e3000001e4, - 0x1e5000001e6, - 0x1e7000001e8, - 0x1e9000001ea, - 0x1eb000001ec, - 0x1ed000001ee, - 0x1ef000001f1, - 0x1f5000001f6, - 0x1f9000001fa, - 0x1fb000001fc, - 0x1fd000001fe, - 0x1ff00000200, - 0x20100000202, - 0x20300000204, - 0x20500000206, - 0x20700000208, - 0x2090000020a, - 0x20b0000020c, - 0x20d0000020e, - 0x20f00000210, - 0x21100000212, - 0x21300000214, - 0x21500000216, - 0x21700000218, - 0x2190000021a, - 0x21b0000021c, - 0x21d0000021e, - 0x21f00000220, - 0x22100000222, - 0x22300000224, - 0x22500000226, - 0x22700000228, - 0x2290000022a, - 0x22b0000022c, - 0x22d0000022e, - 0x22f00000230, - 0x23100000232, - 0x2330000023a, - 0x23c0000023d, - 0x23f00000241, - 0x24200000243, - 0x24700000248, - 0x2490000024a, - 0x24b0000024c, - 0x24d0000024e, - 0x24f000002b0, - 0x2b9000002c2, - 0x2c6000002d2, - 0x2ec000002ed, - 0x2ee000002ef, - 0x30000000340, - 0x34200000343, - 0x3460000034f, - 0x35000000370, - 0x37100000372, - 0x37300000374, - 0x37700000378, - 0x37b0000037e, - 0x39000000391, - 0x3ac000003cf, - 0x3d7000003d8, - 0x3d9000003da, - 0x3db000003dc, - 0x3dd000003de, - 0x3df000003e0, - 0x3e1000003e2, - 0x3e3000003e4, - 0x3e5000003e6, - 0x3e7000003e8, - 0x3e9000003ea, - 0x3eb000003ec, - 0x3ed000003ee, - 0x3ef000003f0, - 0x3f3000003f4, - 0x3f8000003f9, - 0x3fb000003fd, - 0x43000000460, - 0x46100000462, - 0x46300000464, - 0x46500000466, - 0x46700000468, - 0x4690000046a, - 0x46b0000046c, - 0x46d0000046e, - 0x46f00000470, - 0x47100000472, - 0x47300000474, - 0x47500000476, - 0x47700000478, - 0x4790000047a, - 0x47b0000047c, - 0x47d0000047e, - 0x47f00000480, - 0x48100000482, - 0x48300000488, - 0x48b0000048c, - 0x48d0000048e, - 0x48f00000490, - 0x49100000492, - 0x49300000494, - 0x49500000496, - 0x49700000498, - 0x4990000049a, - 0x49b0000049c, - 0x49d0000049e, - 0x49f000004a0, - 0x4a1000004a2, - 0x4a3000004a4, - 0x4a5000004a6, - 0x4a7000004a8, - 0x4a9000004aa, - 0x4ab000004ac, - 0x4ad000004ae, - 0x4af000004b0, - 0x4b1000004b2, - 0x4b3000004b4, - 0x4b5000004b6, - 0x4b7000004b8, - 0x4b9000004ba, - 0x4bb000004bc, - 0x4bd000004be, - 0x4bf000004c0, - 0x4c2000004c3, - 0x4c4000004c5, - 0x4c6000004c7, - 0x4c8000004c9, - 0x4ca000004cb, - 0x4cc000004cd, - 0x4ce000004d0, - 0x4d1000004d2, - 0x4d3000004d4, - 0x4d5000004d6, - 0x4d7000004d8, - 0x4d9000004da, - 0x4db000004dc, - 0x4dd000004de, - 0x4df000004e0, - 0x4e1000004e2, - 0x4e3000004e4, - 0x4e5000004e6, - 0x4e7000004e8, - 0x4e9000004ea, - 0x4eb000004ec, - 0x4ed000004ee, - 0x4ef000004f0, - 0x4f1000004f2, - 0x4f3000004f4, - 0x4f5000004f6, - 0x4f7000004f8, - 0x4f9000004fa, - 0x4fb000004fc, - 0x4fd000004fe, - 0x4ff00000500, - 0x50100000502, - 0x50300000504, - 0x50500000506, - 0x50700000508, - 0x5090000050a, - 0x50b0000050c, - 0x50d0000050e, - 0x50f00000510, - 0x51100000512, - 0x51300000514, - 0x51500000516, - 0x51700000518, - 0x5190000051a, - 0x51b0000051c, - 0x51d0000051e, - 0x51f00000520, - 0x52100000522, - 0x52300000524, - 0x52500000526, - 0x52700000528, - 0x5290000052a, - 0x52b0000052c, - 0x52d0000052e, - 0x52f00000530, - 0x5590000055a, - 0x56000000587, - 0x58800000589, - 0x591000005be, - 0x5bf000005c0, - 0x5c1000005c3, - 0x5c4000005c6, - 0x5c7000005c8, - 0x5d0000005eb, - 0x5ef000005f3, - 0x6100000061b, - 0x62000000640, - 0x64100000660, - 0x66e00000675, - 0x679000006d4, - 0x6d5000006dd, - 0x6df000006e9, - 0x6ea000006f0, - 0x6fa00000700, - 0x7100000074b, - 0x74d000007b2, - 0x7c0000007f6, - 0x7fd000007fe, - 0x8000000082e, - 0x8400000085c, - 0x8600000086b, - 0x8a0000008b5, - 0x8b6000008be, - 0x8d3000008e2, - 0x8e300000958, - 0x96000000964, - 0x96600000970, - 0x97100000984, - 0x9850000098d, - 0x98f00000991, - 0x993000009a9, - 0x9aa000009b1, - 0x9b2000009b3, - 0x9b6000009ba, - 0x9bc000009c5, - 0x9c7000009c9, - 0x9cb000009cf, - 0x9d7000009d8, - 0x9e0000009e4, - 0x9e6000009f2, - 0x9fc000009fd, - 0x9fe000009ff, - 0xa0100000a04, - 0xa0500000a0b, - 0xa0f00000a11, - 0xa1300000a29, - 0xa2a00000a31, - 0xa3200000a33, - 0xa3500000a36, - 0xa3800000a3a, - 0xa3c00000a3d, - 0xa3e00000a43, - 0xa4700000a49, - 0xa4b00000a4e, - 0xa5100000a52, - 0xa5c00000a5d, - 0xa6600000a76, - 0xa8100000a84, - 0xa8500000a8e, - 0xa8f00000a92, - 0xa9300000aa9, - 0xaaa00000ab1, - 0xab200000ab4, - 0xab500000aba, - 0xabc00000ac6, - 0xac700000aca, - 0xacb00000ace, - 0xad000000ad1, - 0xae000000ae4, - 0xae600000af0, - 0xaf900000b00, - 0xb0100000b04, - 0xb0500000b0d, - 0xb0f00000b11, - 0xb1300000b29, - 0xb2a00000b31, - 0xb3200000b34, - 0xb3500000b3a, - 0xb3c00000b45, - 0xb4700000b49, - 0xb4b00000b4e, - 0xb5600000b58, - 0xb5f00000b64, - 0xb6600000b70, - 0xb7100000b72, - 0xb8200000b84, - 0xb8500000b8b, - 0xb8e00000b91, - 0xb9200000b96, - 0xb9900000b9b, - 0xb9c00000b9d, - 0xb9e00000ba0, - 0xba300000ba5, - 0xba800000bab, - 0xbae00000bba, - 0xbbe00000bc3, - 0xbc600000bc9, - 0xbca00000bce, - 0xbd000000bd1, - 0xbd700000bd8, - 0xbe600000bf0, - 0xc0000000c0d, - 0xc0e00000c11, - 0xc1200000c29, - 0xc2a00000c3a, - 0xc3d00000c45, - 0xc4600000c49, - 0xc4a00000c4e, - 0xc5500000c57, - 0xc5800000c5b, - 0xc6000000c64, - 0xc6600000c70, - 0xc8000000c84, - 0xc8500000c8d, - 0xc8e00000c91, - 0xc9200000ca9, - 0xcaa00000cb4, - 0xcb500000cba, - 0xcbc00000cc5, - 0xcc600000cc9, - 0xcca00000cce, - 0xcd500000cd7, - 0xcde00000cdf, - 0xce000000ce4, - 0xce600000cf0, - 0xcf100000cf3, - 0xd0000000d04, - 0xd0500000d0d, - 0xd0e00000d11, - 0xd1200000d45, - 0xd4600000d49, - 0xd4a00000d4f, - 0xd5400000d58, - 0xd5f00000d64, - 0xd6600000d70, - 0xd7a00000d80, - 0xd8200000d84, - 0xd8500000d97, - 0xd9a00000db2, - 0xdb300000dbc, - 0xdbd00000dbe, - 0xdc000000dc7, - 0xdca00000dcb, - 0xdcf00000dd5, - 0xdd600000dd7, - 0xdd800000de0, - 0xde600000df0, - 0xdf200000df4, - 0xe0100000e33, - 0xe3400000e3b, - 0xe4000000e4f, - 0xe5000000e5a, - 0xe8100000e83, - 0xe8400000e85, - 0xe8700000e89, - 0xe8a00000e8b, - 0xe8d00000e8e, - 0xe9400000e98, - 0xe9900000ea0, - 0xea100000ea4, - 0xea500000ea6, - 0xea700000ea8, - 0xeaa00000eac, - 0xead00000eb3, - 0xeb400000eba, - 0xebb00000ebe, - 0xec000000ec5, - 0xec600000ec7, - 0xec800000ece, - 0xed000000eda, - 0xede00000ee0, - 0xf0000000f01, - 0xf0b00000f0c, - 0xf1800000f1a, - 0xf2000000f2a, - 0xf3500000f36, - 0xf3700000f38, - 0xf3900000f3a, - 0xf3e00000f43, - 0xf4400000f48, - 0xf4900000f4d, - 0xf4e00000f52, - 0xf5300000f57, - 0xf5800000f5c, - 0xf5d00000f69, - 0xf6a00000f6d, - 0xf7100000f73, - 0xf7400000f75, - 0xf7a00000f81, - 0xf8200000f85, - 0xf8600000f93, - 0xf9400000f98, - 0xf9900000f9d, - 0xf9e00000fa2, - 0xfa300000fa7, - 0xfa800000fac, - 0xfad00000fb9, - 0xfba00000fbd, - 0xfc600000fc7, - 0x10000000104a, - 0x10500000109e, - 0x10d0000010fb, - 0x10fd00001100, - 0x120000001249, - 0x124a0000124e, - 0x125000001257, - 0x125800001259, - 0x125a0000125e, - 0x126000001289, - 0x128a0000128e, - 0x1290000012b1, - 0x12b2000012b6, - 0x12b8000012bf, - 0x12c0000012c1, - 0x12c2000012c6, - 0x12c8000012d7, - 0x12d800001311, - 0x131200001316, - 0x13180000135b, - 0x135d00001360, - 0x138000001390, - 0x13a0000013f6, - 0x14010000166d, - 0x166f00001680, - 0x16810000169b, - 0x16a0000016eb, - 0x16f1000016f9, - 0x17000000170d, - 0x170e00001715, - 0x172000001735, - 0x174000001754, - 0x17600000176d, - 0x176e00001771, - 0x177200001774, - 0x1780000017b4, - 0x17b6000017d4, - 0x17d7000017d8, - 0x17dc000017de, - 0x17e0000017ea, - 0x18100000181a, - 0x182000001879, - 0x1880000018ab, - 0x18b0000018f6, - 0x19000000191f, - 0x19200000192c, - 0x19300000193c, - 0x19460000196e, - 0x197000001975, - 0x1980000019ac, - 0x19b0000019ca, - 0x19d0000019da, - 0x1a0000001a1c, - 0x1a2000001a5f, - 0x1a6000001a7d, - 0x1a7f00001a8a, - 0x1a9000001a9a, - 0x1aa700001aa8, - 0x1ab000001abe, - 0x1b0000001b4c, - 0x1b5000001b5a, - 0x1b6b00001b74, - 0x1b8000001bf4, - 0x1c0000001c38, - 0x1c4000001c4a, - 0x1c4d00001c7e, - 0x1cd000001cd3, - 0x1cd400001cfa, - 0x1d0000001d2c, - 0x1d2f00001d30, - 0x1d3b00001d3c, - 0x1d4e00001d4f, - 0x1d6b00001d78, - 0x1d7900001d9b, - 0x1dc000001dfa, - 0x1dfb00001e00, - 0x1e0100001e02, - 0x1e0300001e04, - 0x1e0500001e06, - 0x1e0700001e08, - 0x1e0900001e0a, - 0x1e0b00001e0c, - 0x1e0d00001e0e, - 0x1e0f00001e10, - 0x1e1100001e12, - 0x1e1300001e14, - 0x1e1500001e16, - 0x1e1700001e18, - 0x1e1900001e1a, - 0x1e1b00001e1c, - 0x1e1d00001e1e, - 0x1e1f00001e20, - 0x1e2100001e22, - 0x1e2300001e24, - 0x1e2500001e26, - 0x1e2700001e28, - 0x1e2900001e2a, - 0x1e2b00001e2c, - 0x1e2d00001e2e, - 0x1e2f00001e30, - 0x1e3100001e32, - 0x1e3300001e34, - 0x1e3500001e36, - 0x1e3700001e38, - 0x1e3900001e3a, - 0x1e3b00001e3c, - 0x1e3d00001e3e, - 0x1e3f00001e40, - 0x1e4100001e42, - 0x1e4300001e44, - 0x1e4500001e46, - 0x1e4700001e48, - 0x1e4900001e4a, - 0x1e4b00001e4c, - 0x1e4d00001e4e, - 0x1e4f00001e50, - 0x1e5100001e52, - 0x1e5300001e54, - 0x1e5500001e56, - 0x1e5700001e58, - 0x1e5900001e5a, - 0x1e5b00001e5c, - 0x1e5d00001e5e, - 0x1e5f00001e60, - 0x1e6100001e62, - 0x1e6300001e64, - 0x1e6500001e66, - 0x1e6700001e68, - 0x1e6900001e6a, - 0x1e6b00001e6c, - 0x1e6d00001e6e, - 0x1e6f00001e70, - 0x1e7100001e72, - 0x1e7300001e74, - 0x1e7500001e76, - 0x1e7700001e78, - 0x1e7900001e7a, - 0x1e7b00001e7c, - 0x1e7d00001e7e, - 0x1e7f00001e80, - 0x1e8100001e82, - 0x1e8300001e84, - 0x1e8500001e86, - 0x1e8700001e88, - 0x1e8900001e8a, - 0x1e8b00001e8c, - 0x1e8d00001e8e, - 0x1e8f00001e90, - 0x1e9100001e92, - 0x1e9300001e94, - 0x1e9500001e9a, - 0x1e9c00001e9e, - 0x1e9f00001ea0, - 0x1ea100001ea2, - 0x1ea300001ea4, - 0x1ea500001ea6, - 0x1ea700001ea8, - 0x1ea900001eaa, - 0x1eab00001eac, - 0x1ead00001eae, - 0x1eaf00001eb0, - 0x1eb100001eb2, - 0x1eb300001eb4, - 0x1eb500001eb6, - 0x1eb700001eb8, - 0x1eb900001eba, - 0x1ebb00001ebc, - 0x1ebd00001ebe, - 0x1ebf00001ec0, - 0x1ec100001ec2, - 0x1ec300001ec4, - 0x1ec500001ec6, - 0x1ec700001ec8, - 0x1ec900001eca, - 0x1ecb00001ecc, - 0x1ecd00001ece, - 0x1ecf00001ed0, - 0x1ed100001ed2, - 0x1ed300001ed4, - 0x1ed500001ed6, - 0x1ed700001ed8, - 0x1ed900001eda, - 0x1edb00001edc, - 0x1edd00001ede, - 0x1edf00001ee0, - 0x1ee100001ee2, - 0x1ee300001ee4, - 0x1ee500001ee6, - 0x1ee700001ee8, - 0x1ee900001eea, - 0x1eeb00001eec, - 0x1eed00001eee, - 0x1eef00001ef0, - 0x1ef100001ef2, - 0x1ef300001ef4, - 0x1ef500001ef6, - 0x1ef700001ef8, - 0x1ef900001efa, - 0x1efb00001efc, - 0x1efd00001efe, - 0x1eff00001f08, - 0x1f1000001f16, - 0x1f2000001f28, - 0x1f3000001f38, - 0x1f4000001f46, - 0x1f5000001f58, - 0x1f6000001f68, - 0x1f7000001f71, - 0x1f7200001f73, - 0x1f7400001f75, - 0x1f7600001f77, - 0x1f7800001f79, - 0x1f7a00001f7b, - 0x1f7c00001f7d, - 0x1fb000001fb2, - 0x1fb600001fb7, - 0x1fc600001fc7, - 0x1fd000001fd3, - 0x1fd600001fd8, - 0x1fe000001fe3, - 0x1fe400001fe8, - 0x1ff600001ff7, - 0x214e0000214f, - 0x218400002185, - 0x2c3000002c5f, - 0x2c6100002c62, - 0x2c6500002c67, - 0x2c6800002c69, - 0x2c6a00002c6b, - 0x2c6c00002c6d, - 0x2c7100002c72, - 0x2c7300002c75, - 0x2c7600002c7c, - 0x2c8100002c82, - 0x2c8300002c84, - 0x2c8500002c86, - 0x2c8700002c88, - 0x2c8900002c8a, - 0x2c8b00002c8c, - 0x2c8d00002c8e, - 0x2c8f00002c90, - 0x2c9100002c92, - 0x2c9300002c94, - 0x2c9500002c96, - 0x2c9700002c98, - 0x2c9900002c9a, - 0x2c9b00002c9c, - 0x2c9d00002c9e, - 0x2c9f00002ca0, - 0x2ca100002ca2, - 0x2ca300002ca4, - 0x2ca500002ca6, - 0x2ca700002ca8, - 0x2ca900002caa, - 0x2cab00002cac, - 0x2cad00002cae, - 0x2caf00002cb0, - 0x2cb100002cb2, - 0x2cb300002cb4, - 0x2cb500002cb6, - 0x2cb700002cb8, - 0x2cb900002cba, - 0x2cbb00002cbc, - 0x2cbd00002cbe, - 0x2cbf00002cc0, - 0x2cc100002cc2, - 0x2cc300002cc4, - 0x2cc500002cc6, - 0x2cc700002cc8, - 0x2cc900002cca, - 0x2ccb00002ccc, - 0x2ccd00002cce, - 0x2ccf00002cd0, - 0x2cd100002cd2, - 0x2cd300002cd4, - 0x2cd500002cd6, - 0x2cd700002cd8, - 0x2cd900002cda, - 0x2cdb00002cdc, - 0x2cdd00002cde, - 0x2cdf00002ce0, - 0x2ce100002ce2, - 0x2ce300002ce5, - 0x2cec00002ced, - 0x2cee00002cf2, - 0x2cf300002cf4, - 0x2d0000002d26, - 0x2d2700002d28, - 0x2d2d00002d2e, - 0x2d3000002d68, - 0x2d7f00002d97, - 0x2da000002da7, - 0x2da800002daf, - 0x2db000002db7, - 0x2db800002dbf, - 0x2dc000002dc7, - 0x2dc800002dcf, - 0x2dd000002dd7, - 0x2dd800002ddf, - 0x2de000002e00, - 0x2e2f00002e30, - 0x300500003008, - 0x302a0000302e, - 0x303c0000303d, - 0x304100003097, - 0x30990000309b, - 0x309d0000309f, - 0x30a1000030fb, - 0x30fc000030ff, - 0x310500003130, - 0x31a0000031bb, - 0x31f000003200, - 0x340000004db6, - 0x4e0000009ff0, - 0xa0000000a48d, - 0xa4d00000a4fe, - 0xa5000000a60d, - 0xa6100000a62c, - 0xa6410000a642, - 0xa6430000a644, - 0xa6450000a646, - 0xa6470000a648, - 0xa6490000a64a, - 0xa64b0000a64c, - 0xa64d0000a64e, - 0xa64f0000a650, - 0xa6510000a652, - 0xa6530000a654, - 0xa6550000a656, - 0xa6570000a658, - 0xa6590000a65a, - 0xa65b0000a65c, - 0xa65d0000a65e, - 0xa65f0000a660, - 0xa6610000a662, - 0xa6630000a664, - 0xa6650000a666, - 0xa6670000a668, - 0xa6690000a66a, - 0xa66b0000a66c, - 0xa66d0000a670, - 0xa6740000a67e, - 0xa67f0000a680, - 0xa6810000a682, - 0xa6830000a684, - 0xa6850000a686, - 0xa6870000a688, - 0xa6890000a68a, - 0xa68b0000a68c, - 0xa68d0000a68e, - 0xa68f0000a690, - 0xa6910000a692, - 0xa6930000a694, - 0xa6950000a696, - 0xa6970000a698, - 0xa6990000a69a, - 0xa69b0000a69c, - 0xa69e0000a6e6, - 0xa6f00000a6f2, - 0xa7170000a720, - 0xa7230000a724, - 0xa7250000a726, - 0xa7270000a728, - 0xa7290000a72a, - 0xa72b0000a72c, - 0xa72d0000a72e, - 0xa72f0000a732, - 0xa7330000a734, - 0xa7350000a736, - 0xa7370000a738, - 0xa7390000a73a, - 0xa73b0000a73c, - 0xa73d0000a73e, - 0xa73f0000a740, - 0xa7410000a742, - 0xa7430000a744, - 0xa7450000a746, - 0xa7470000a748, - 0xa7490000a74a, - 0xa74b0000a74c, - 0xa74d0000a74e, - 0xa74f0000a750, - 0xa7510000a752, - 0xa7530000a754, - 0xa7550000a756, - 0xa7570000a758, - 0xa7590000a75a, - 0xa75b0000a75c, - 0xa75d0000a75e, - 0xa75f0000a760, - 0xa7610000a762, - 0xa7630000a764, - 0xa7650000a766, - 0xa7670000a768, - 0xa7690000a76a, - 0xa76b0000a76c, - 0xa76d0000a76e, - 0xa76f0000a770, - 0xa7710000a779, - 0xa77a0000a77b, - 0xa77c0000a77d, - 0xa77f0000a780, - 0xa7810000a782, - 0xa7830000a784, - 0xa7850000a786, - 0xa7870000a789, - 0xa78c0000a78d, - 0xa78e0000a790, - 0xa7910000a792, - 0xa7930000a796, - 0xa7970000a798, - 0xa7990000a79a, - 0xa79b0000a79c, - 0xa79d0000a79e, - 0xa79f0000a7a0, - 0xa7a10000a7a2, - 0xa7a30000a7a4, - 0xa7a50000a7a6, - 0xa7a70000a7a8, - 0xa7a90000a7aa, - 0xa7af0000a7b0, - 0xa7b50000a7b6, - 0xa7b70000a7b8, - 0xa7b90000a7ba, - 0xa7f70000a7f8, - 0xa7fa0000a828, - 0xa8400000a874, - 0xa8800000a8c6, - 0xa8d00000a8da, - 0xa8e00000a8f8, - 0xa8fb0000a8fc, - 0xa8fd0000a92e, - 0xa9300000a954, - 0xa9800000a9c1, - 0xa9cf0000a9da, - 0xa9e00000a9ff, - 0xaa000000aa37, - 0xaa400000aa4e, - 0xaa500000aa5a, - 0xaa600000aa77, - 0xaa7a0000aac3, - 0xaadb0000aade, - 0xaae00000aaf0, - 0xaaf20000aaf7, - 0xab010000ab07, - 0xab090000ab0f, - 0xab110000ab17, - 0xab200000ab27, - 0xab280000ab2f, - 0xab300000ab5b, - 0xab600000ab66, - 0xabc00000abeb, - 0xabec0000abee, - 0xabf00000abfa, - 0xac000000d7a4, - 0xfa0e0000fa10, - 0xfa110000fa12, - 0xfa130000fa15, - 0xfa1f0000fa20, - 0xfa210000fa22, - 0xfa230000fa25, - 0xfa270000fa2a, - 0xfb1e0000fb1f, - 0xfe200000fe30, - 0xfe730000fe74, - 0x100000001000c, - 0x1000d00010027, - 0x100280001003b, - 0x1003c0001003e, - 0x1003f0001004e, - 0x100500001005e, - 0x10080000100fb, - 0x101fd000101fe, - 0x102800001029d, - 0x102a0000102d1, - 0x102e0000102e1, - 0x1030000010320, - 0x1032d00010341, - 0x103420001034a, - 0x103500001037b, - 0x103800001039e, - 0x103a0000103c4, - 0x103c8000103d0, - 0x104280001049e, - 0x104a0000104aa, - 0x104d8000104fc, - 0x1050000010528, - 0x1053000010564, - 0x1060000010737, - 0x1074000010756, - 0x1076000010768, - 0x1080000010806, - 0x1080800010809, - 0x1080a00010836, - 0x1083700010839, - 0x1083c0001083d, - 0x1083f00010856, - 0x1086000010877, - 0x108800001089f, - 0x108e0000108f3, - 0x108f4000108f6, - 0x1090000010916, - 0x109200001093a, - 0x10980000109b8, - 0x109be000109c0, - 0x10a0000010a04, - 0x10a0500010a07, - 0x10a0c00010a14, - 0x10a1500010a18, - 0x10a1900010a36, - 0x10a3800010a3b, - 0x10a3f00010a40, - 0x10a6000010a7d, - 0x10a8000010a9d, - 0x10ac000010ac8, - 0x10ac900010ae7, - 0x10b0000010b36, - 0x10b4000010b56, - 0x10b6000010b73, - 0x10b8000010b92, - 0x10c0000010c49, - 0x10cc000010cf3, - 0x10d0000010d28, - 0x10d3000010d3a, - 0x10f0000010f1d, - 0x10f2700010f28, - 0x10f3000010f51, - 0x1100000011047, - 0x1106600011070, - 0x1107f000110bb, - 0x110d0000110e9, - 0x110f0000110fa, - 0x1110000011135, - 0x1113600011140, - 0x1114400011147, - 0x1115000011174, - 0x1117600011177, - 0x11180000111c5, - 0x111c9000111cd, - 0x111d0000111db, - 0x111dc000111dd, - 0x1120000011212, - 0x1121300011238, - 0x1123e0001123f, - 0x1128000011287, - 0x1128800011289, - 0x1128a0001128e, - 0x1128f0001129e, - 0x1129f000112a9, - 0x112b0000112eb, - 0x112f0000112fa, - 0x1130000011304, - 0x113050001130d, - 0x1130f00011311, - 0x1131300011329, - 0x1132a00011331, - 0x1133200011334, - 0x113350001133a, - 0x1133b00011345, - 0x1134700011349, - 0x1134b0001134e, - 0x1135000011351, - 0x1135700011358, - 0x1135d00011364, - 0x113660001136d, - 0x1137000011375, - 0x114000001144b, - 0x114500001145a, - 0x1145e0001145f, - 0x11480000114c6, - 0x114c7000114c8, - 0x114d0000114da, - 0x11580000115b6, - 0x115b8000115c1, - 0x115d8000115de, - 0x1160000011641, - 0x1164400011645, - 0x116500001165a, - 0x11680000116b8, - 0x116c0000116ca, - 0x117000001171b, - 0x1171d0001172c, - 0x117300001173a, - 0x118000001183b, - 0x118c0000118ea, - 0x118ff00011900, - 0x11a0000011a3f, - 0x11a4700011a48, - 0x11a5000011a84, - 0x11a8600011a9a, - 0x11a9d00011a9e, - 0x11ac000011af9, - 0x11c0000011c09, - 0x11c0a00011c37, - 0x11c3800011c41, - 0x11c5000011c5a, - 0x11c7200011c90, - 0x11c9200011ca8, - 0x11ca900011cb7, - 0x11d0000011d07, - 0x11d0800011d0a, - 0x11d0b00011d37, - 0x11d3a00011d3b, - 0x11d3c00011d3e, - 0x11d3f00011d48, - 0x11d5000011d5a, - 0x11d6000011d66, - 0x11d6700011d69, - 0x11d6a00011d8f, - 0x11d9000011d92, - 0x11d9300011d99, - 0x11da000011daa, - 0x11ee000011ef7, - 0x120000001239a, - 0x1248000012544, - 0x130000001342f, - 0x1440000014647, - 0x1680000016a39, - 0x16a4000016a5f, - 0x16a6000016a6a, - 0x16ad000016aee, - 0x16af000016af5, - 0x16b0000016b37, - 0x16b4000016b44, - 0x16b5000016b5a, - 0x16b6300016b78, - 0x16b7d00016b90, - 0x16e6000016e80, - 0x16f0000016f45, - 0x16f5000016f7f, - 0x16f8f00016fa0, - 0x16fe000016fe2, - 0x17000000187f2, - 0x1880000018af3, - 0x1b0000001b11f, - 0x1b1700001b2fc, - 0x1bc000001bc6b, - 0x1bc700001bc7d, - 0x1bc800001bc89, - 0x1bc900001bc9a, - 0x1bc9d0001bc9f, - 0x1da000001da37, - 0x1da3b0001da6d, - 0x1da750001da76, - 0x1da840001da85, - 0x1da9b0001daa0, - 0x1daa10001dab0, - 0x1e0000001e007, - 0x1e0080001e019, - 0x1e01b0001e022, - 0x1e0230001e025, - 0x1e0260001e02b, - 0x1e8000001e8c5, - 0x1e8d00001e8d7, - 0x1e9220001e94b, - 0x1e9500001e95a, - 0x200000002a6d7, - 0x2a7000002b735, - 0x2b7400002b81e, - 0x2b8200002cea2, - 0x2ceb00002ebe1, - ), - 'CONTEXTJ': ( - 0x200c0000200e, - ), - 'CONTEXTO': ( - 0xb7000000b8, - 0x37500000376, - 0x5f3000005f5, - 0x6600000066a, - 0x6f0000006fa, - 0x30fb000030fc, - ), -} diff --git a/venv/lib/python3.8/site-packages/idna/intranges.py b/venv/lib/python3.8/site-packages/idna/intranges.py deleted file mode 100644 index fa8a735..0000000 --- a/venv/lib/python3.8/site-packages/idna/intranges.py +++ /dev/null @@ -1,53 +0,0 @@ -""" -Given a list of integers, made up of (hopefully) a small number of long runs -of consecutive integers, compute a representation of the form -((start1, end1), (start2, end2) ...). Then answer the question "was x present -in the original list?" in time O(log(# runs)). -""" - -import bisect - -def intranges_from_list(list_): - """Represent a list of integers as a sequence of ranges: - ((start_0, end_0), (start_1, end_1), ...), such that the original - integers are exactly those x such that start_i <= x < end_i for some i. - - Ranges are encoded as single integers (start << 32 | end), not as tuples. - """ - - sorted_list = sorted(list_) - ranges = [] - last_write = -1 - for i in range(len(sorted_list)): - if i+1 < len(sorted_list): - if sorted_list[i] == sorted_list[i+1]-1: - continue - current_range = sorted_list[last_write+1:i+1] - ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) - last_write = i - - return tuple(ranges) - -def _encode_range(start, end): - return (start << 32) | end - -def _decode_range(r): - return (r >> 32), (r & ((1 << 32) - 1)) - - -def intranges_contain(int_, ranges): - """Determine if `int_` falls into one of the ranges in `ranges`.""" - tuple_ = _encode_range(int_, 0) - pos = bisect.bisect_left(ranges, tuple_) - # we could be immediately ahead of a tuple (start, end) - # with start < int_ <= end - if pos > 0: - left, right = _decode_range(ranges[pos-1]) - if left <= int_ < right: - return True - # or we could be immediately behind a tuple (int_, end) - if pos < len(ranges): - left, _ = _decode_range(ranges[pos]) - if left == int_: - return True - return False diff --git a/venv/lib/python3.8/site-packages/idna/package_data.py b/venv/lib/python3.8/site-packages/idna/package_data.py deleted file mode 100644 index 257e898..0000000 --- a/venv/lib/python3.8/site-packages/idna/package_data.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = '2.8' - diff --git a/venv/lib/python3.8/site-packages/idna/uts46data.py b/venv/lib/python3.8/site-packages/idna/uts46data.py deleted file mode 100644 index a68ed4c..0000000 --- a/venv/lib/python3.8/site-packages/idna/uts46data.py +++ /dev/null @@ -1,8205 +0,0 @@ -# This file is automatically generated by tools/idna-data -# vim: set fileencoding=utf-8 : - -"""IDNA Mapping Table from UTS46.""" - - -__version__ = "11.0.0" -def _seg_0(): - return [ - (0x0, '3'), - (0x1, '3'), - (0x2, '3'), - (0x3, '3'), - (0x4, '3'), - (0x5, '3'), - (0x6, '3'), - (0x7, '3'), - (0x8, '3'), - (0x9, '3'), - (0xA, '3'), - (0xB, '3'), - (0xC, '3'), - (0xD, '3'), - (0xE, '3'), - (0xF, '3'), - (0x10, '3'), - (0x11, '3'), - (0x12, '3'), - (0x13, '3'), - (0x14, '3'), - (0x15, '3'), - (0x16, '3'), - (0x17, '3'), - (0x18, '3'), - (0x19, '3'), - (0x1A, '3'), - (0x1B, '3'), - (0x1C, '3'), - (0x1D, '3'), - (0x1E, '3'), - (0x1F, '3'), - (0x20, '3'), - (0x21, '3'), - (0x22, '3'), - (0x23, '3'), - (0x24, '3'), - (0x25, '3'), - (0x26, '3'), - (0x27, '3'), - (0x28, '3'), - (0x29, '3'), - (0x2A, '3'), - (0x2B, '3'), - (0x2C, '3'), - (0x2D, 'V'), - (0x2E, 'V'), - (0x2F, '3'), - (0x30, 'V'), - (0x31, 'V'), - (0x32, 'V'), - (0x33, 'V'), - (0x34, 'V'), - (0x35, 'V'), - (0x36, 'V'), - (0x37, 'V'), - (0x38, 'V'), - (0x39, 'V'), - (0x3A, '3'), - (0x3B, '3'), - (0x3C, '3'), - (0x3D, '3'), - (0x3E, '3'), - (0x3F, '3'), - (0x40, '3'), - (0x41, 'M', u'a'), - (0x42, 'M', u'b'), - (0x43, 'M', u'c'), - (0x44, 'M', u'd'), - (0x45, 'M', u'e'), - (0x46, 'M', u'f'), - (0x47, 'M', u'g'), - (0x48, 'M', u'h'), - (0x49, 'M', u'i'), - (0x4A, 'M', u'j'), - (0x4B, 'M', u'k'), - (0x4C, 'M', u'l'), - (0x4D, 'M', u'm'), - (0x4E, 'M', u'n'), - (0x4F, 'M', u'o'), - (0x50, 'M', u'p'), - (0x51, 'M', u'q'), - (0x52, 'M', u'r'), - (0x53, 'M', u's'), - (0x54, 'M', u't'), - (0x55, 'M', u'u'), - (0x56, 'M', u'v'), - (0x57, 'M', u'w'), - (0x58, 'M', u'x'), - (0x59, 'M', u'y'), - (0x5A, 'M', u'z'), - (0x5B, '3'), - (0x5C, '3'), - (0x5D, '3'), - (0x5E, '3'), - (0x5F, '3'), - (0x60, '3'), - (0x61, 'V'), - (0x62, 'V'), - (0x63, 'V'), - ] - -def _seg_1(): - return [ - (0x64, 'V'), - (0x65, 'V'), - (0x66, 'V'), - (0x67, 'V'), - (0x68, 'V'), - (0x69, 'V'), - (0x6A, 'V'), - (0x6B, 'V'), - (0x6C, 'V'), - (0x6D, 'V'), - (0x6E, 'V'), - (0x6F, 'V'), - (0x70, 'V'), - (0x71, 'V'), - (0x72, 'V'), - (0x73, 'V'), - (0x74, 'V'), - (0x75, 'V'), - (0x76, 'V'), - (0x77, 'V'), - (0x78, 'V'), - (0x79, 'V'), - (0x7A, 'V'), - (0x7B, '3'), - (0x7C, '3'), - (0x7D, '3'), - (0x7E, '3'), - (0x7F, '3'), - (0x80, 'X'), - (0x81, 'X'), - (0x82, 'X'), - (0x83, 'X'), - (0x84, 'X'), - (0x85, 'X'), - (0x86, 'X'), - (0x87, 'X'), - (0x88, 'X'), - (0x89, 'X'), - (0x8A, 'X'), - (0x8B, 'X'), - (0x8C, 'X'), - (0x8D, 'X'), - (0x8E, 'X'), - (0x8F, 'X'), - (0x90, 'X'), - (0x91, 'X'), - (0x92, 'X'), - (0x93, 'X'), - (0x94, 'X'), - (0x95, 'X'), - (0x96, 'X'), - (0x97, 'X'), - (0x98, 'X'), - (0x99, 'X'), - (0x9A, 'X'), - (0x9B, 'X'), - (0x9C, 'X'), - (0x9D, 'X'), - (0x9E, 'X'), - (0x9F, 'X'), - (0xA0, '3', u' '), - (0xA1, 'V'), - (0xA2, 'V'), - (0xA3, 'V'), - (0xA4, 'V'), - (0xA5, 'V'), - (0xA6, 'V'), - (0xA7, 'V'), - (0xA8, '3', u' ̈'), - (0xA9, 'V'), - (0xAA, 'M', u'a'), - (0xAB, 'V'), - (0xAC, 'V'), - (0xAD, 'I'), - (0xAE, 'V'), - (0xAF, '3', u' ̄'), - (0xB0, 'V'), - (0xB1, 'V'), - (0xB2, 'M', u'2'), - (0xB3, 'M', u'3'), - (0xB4, '3', u' ́'), - (0xB5, 'M', u'μ'), - (0xB6, 'V'), - (0xB7, 'V'), - (0xB8, '3', u' ̧'), - (0xB9, 'M', u'1'), - (0xBA, 'M', u'o'), - (0xBB, 'V'), - (0xBC, 'M', u'1⁄4'), - (0xBD, 'M', u'1⁄2'), - (0xBE, 'M', u'3⁄4'), - (0xBF, 'V'), - (0xC0, 'M', u'à'), - (0xC1, 'M', u'á'), - (0xC2, 'M', u'â'), - (0xC3, 'M', u'ã'), - (0xC4, 'M', u'ä'), - (0xC5, 'M', u'å'), - (0xC6, 'M', u'æ'), - (0xC7, 'M', u'ç'), - ] - -def _seg_2(): - return [ - (0xC8, 'M', u'è'), - (0xC9, 'M', u'é'), - (0xCA, 'M', u'ê'), - (0xCB, 'M', u'ë'), - (0xCC, 'M', u'ì'), - (0xCD, 'M', u'í'), - (0xCE, 'M', u'î'), - (0xCF, 'M', u'ï'), - (0xD0, 'M', u'ð'), - (0xD1, 'M', u'ñ'), - (0xD2, 'M', u'ò'), - (0xD3, 'M', u'ó'), - (0xD4, 'M', u'ô'), - (0xD5, 'M', u'õ'), - (0xD6, 'M', u'ö'), - (0xD7, 'V'), - (0xD8, 'M', u'ø'), - (0xD9, 'M', u'ù'), - (0xDA, 'M', u'ú'), - (0xDB, 'M', u'û'), - (0xDC, 'M', u'ü'), - (0xDD, 'M', u'ý'), - (0xDE, 'M', u'þ'), - (0xDF, 'D', u'ss'), - (0xE0, 'V'), - (0xE1, 'V'), - (0xE2, 'V'), - (0xE3, 'V'), - (0xE4, 'V'), - (0xE5, 'V'), - (0xE6, 'V'), - (0xE7, 'V'), - (0xE8, 'V'), - (0xE9, 'V'), - (0xEA, 'V'), - (0xEB, 'V'), - (0xEC, 'V'), - (0xED, 'V'), - (0xEE, 'V'), - (0xEF, 'V'), - (0xF0, 'V'), - (0xF1, 'V'), - (0xF2, 'V'), - (0xF3, 'V'), - (0xF4, 'V'), - (0xF5, 'V'), - (0xF6, 'V'), - (0xF7, 'V'), - (0xF8, 'V'), - (0xF9, 'V'), - (0xFA, 'V'), - (0xFB, 'V'), - (0xFC, 'V'), - (0xFD, 'V'), - (0xFE, 'V'), - (0xFF, 'V'), - (0x100, 'M', u'ā'), - (0x101, 'V'), - (0x102, 'M', u'ă'), - (0x103, 'V'), - (0x104, 'M', u'ą'), - (0x105, 'V'), - (0x106, 'M', u'ć'), - (0x107, 'V'), - (0x108, 'M', u'ĉ'), - (0x109, 'V'), - (0x10A, 'M', u'ċ'), - (0x10B, 'V'), - (0x10C, 'M', u'č'), - (0x10D, 'V'), - (0x10E, 'M', u'ď'), - (0x10F, 'V'), - (0x110, 'M', u'đ'), - (0x111, 'V'), - (0x112, 'M', u'ē'), - (0x113, 'V'), - (0x114, 'M', u'ĕ'), - (0x115, 'V'), - (0x116, 'M', u'ė'), - (0x117, 'V'), - (0x118, 'M', u'ę'), - (0x119, 'V'), - (0x11A, 'M', u'ě'), - (0x11B, 'V'), - (0x11C, 'M', u'ĝ'), - (0x11D, 'V'), - (0x11E, 'M', u'ğ'), - (0x11F, 'V'), - (0x120, 'M', u'ġ'), - (0x121, 'V'), - (0x122, 'M', u'ģ'), - (0x123, 'V'), - (0x124, 'M', u'ĥ'), - (0x125, 'V'), - (0x126, 'M', u'ħ'), - (0x127, 'V'), - (0x128, 'M', u'ĩ'), - (0x129, 'V'), - (0x12A, 'M', u'ī'), - (0x12B, 'V'), - ] - -def _seg_3(): - return [ - (0x12C, 'M', u'ĭ'), - (0x12D, 'V'), - (0x12E, 'M', u'į'), - (0x12F, 'V'), - (0x130, 'M', u'i̇'), - (0x131, 'V'), - (0x132, 'M', u'ij'), - (0x134, 'M', u'ĵ'), - (0x135, 'V'), - (0x136, 'M', u'ķ'), - (0x137, 'V'), - (0x139, 'M', u'ĺ'), - (0x13A, 'V'), - (0x13B, 'M', u'ļ'), - (0x13C, 'V'), - (0x13D, 'M', u'ľ'), - (0x13E, 'V'), - (0x13F, 'M', u'l·'), - (0x141, 'M', u'ł'), - (0x142, 'V'), - (0x143, 'M', u'ń'), - (0x144, 'V'), - (0x145, 'M', u'ņ'), - (0x146, 'V'), - (0x147, 'M', u'ň'), - (0x148, 'V'), - (0x149, 'M', u'ʼn'), - (0x14A, 'M', u'ŋ'), - (0x14B, 'V'), - (0x14C, 'M', u'ō'), - (0x14D, 'V'), - (0x14E, 'M', u'ŏ'), - (0x14F, 'V'), - (0x150, 'M', u'ő'), - (0x151, 'V'), - (0x152, 'M', u'œ'), - (0x153, 'V'), - (0x154, 'M', u'ŕ'), - (0x155, 'V'), - (0x156, 'M', u'ŗ'), - (0x157, 'V'), - (0x158, 'M', u'ř'), - (0x159, 'V'), - (0x15A, 'M', u'ś'), - (0x15B, 'V'), - (0x15C, 'M', u'ŝ'), - (0x15D, 'V'), - (0x15E, 'M', u'ş'), - (0x15F, 'V'), - (0x160, 'M', u'š'), - (0x161, 'V'), - (0x162, 'M', u'ţ'), - (0x163, 'V'), - (0x164, 'M', u'ť'), - (0x165, 'V'), - (0x166, 'M', u'ŧ'), - (0x167, 'V'), - (0x168, 'M', u'ũ'), - (0x169, 'V'), - (0x16A, 'M', u'ū'), - (0x16B, 'V'), - (0x16C, 'M', u'ŭ'), - (0x16D, 'V'), - (0x16E, 'M', u'ů'), - (0x16F, 'V'), - (0x170, 'M', u'ű'), - (0x171, 'V'), - (0x172, 'M', u'ų'), - (0x173, 'V'), - (0x174, 'M', u'ŵ'), - (0x175, 'V'), - (0x176, 'M', u'ŷ'), - (0x177, 'V'), - (0x178, 'M', u'ÿ'), - (0x179, 'M', u'ź'), - (0x17A, 'V'), - (0x17B, 'M', u'ż'), - (0x17C, 'V'), - (0x17D, 'M', u'ž'), - (0x17E, 'V'), - (0x17F, 'M', u's'), - (0x180, 'V'), - (0x181, 'M', u'ɓ'), - (0x182, 'M', u'ƃ'), - (0x183, 'V'), - (0x184, 'M', u'ƅ'), - (0x185, 'V'), - (0x186, 'M', u'ɔ'), - (0x187, 'M', u'ƈ'), - (0x188, 'V'), - (0x189, 'M', u'ɖ'), - (0x18A, 'M', u'ɗ'), - (0x18B, 'M', u'ƌ'), - (0x18C, 'V'), - (0x18E, 'M', u'ǝ'), - (0x18F, 'M', u'ə'), - (0x190, 'M', u'ɛ'), - (0x191, 'M', u'ƒ'), - (0x192, 'V'), - (0x193, 'M', u'ɠ'), - ] - -def _seg_4(): - return [ - (0x194, 'M', u'ɣ'), - (0x195, 'V'), - (0x196, 'M', u'ɩ'), - (0x197, 'M', u'ɨ'), - (0x198, 'M', u'ƙ'), - (0x199, 'V'), - (0x19C, 'M', u'ɯ'), - (0x19D, 'M', u'ɲ'), - (0x19E, 'V'), - (0x19F, 'M', u'ɵ'), - (0x1A0, 'M', u'ơ'), - (0x1A1, 'V'), - (0x1A2, 'M', u'ƣ'), - (0x1A3, 'V'), - (0x1A4, 'M', u'ƥ'), - (0x1A5, 'V'), - (0x1A6, 'M', u'ʀ'), - (0x1A7, 'M', u'ƨ'), - (0x1A8, 'V'), - (0x1A9, 'M', u'ʃ'), - (0x1AA, 'V'), - (0x1AC, 'M', u'ƭ'), - (0x1AD, 'V'), - (0x1AE, 'M', u'ʈ'), - (0x1AF, 'M', u'ư'), - (0x1B0, 'V'), - (0x1B1, 'M', u'ʊ'), - (0x1B2, 'M', u'ʋ'), - (0x1B3, 'M', u'ƴ'), - (0x1B4, 'V'), - (0x1B5, 'M', u'ƶ'), - (0x1B6, 'V'), - (0x1B7, 'M', u'ʒ'), - (0x1B8, 'M', u'ƹ'), - (0x1B9, 'V'), - (0x1BC, 'M', u'ƽ'), - (0x1BD, 'V'), - (0x1C4, 'M', u'dž'), - (0x1C7, 'M', u'lj'), - (0x1CA, 'M', u'nj'), - (0x1CD, 'M', u'ǎ'), - (0x1CE, 'V'), - (0x1CF, 'M', u'ǐ'), - (0x1D0, 'V'), - (0x1D1, 'M', u'ǒ'), - (0x1D2, 'V'), - (0x1D3, 'M', u'ǔ'), - (0x1D4, 'V'), - (0x1D5, 'M', u'ǖ'), - (0x1D6, 'V'), - (0x1D7, 'M', u'ǘ'), - (0x1D8, 'V'), - (0x1D9, 'M', u'ǚ'), - (0x1DA, 'V'), - (0x1DB, 'M', u'ǜ'), - (0x1DC, 'V'), - (0x1DE, 'M', u'ǟ'), - (0x1DF, 'V'), - (0x1E0, 'M', u'ǡ'), - (0x1E1, 'V'), - (0x1E2, 'M', u'ǣ'), - (0x1E3, 'V'), - (0x1E4, 'M', u'ǥ'), - (0x1E5, 'V'), - (0x1E6, 'M', u'ǧ'), - (0x1E7, 'V'), - (0x1E8, 'M', u'ǩ'), - (0x1E9, 'V'), - (0x1EA, 'M', u'ǫ'), - (0x1EB, 'V'), - (0x1EC, 'M', u'ǭ'), - (0x1ED, 'V'), - (0x1EE, 'M', u'ǯ'), - (0x1EF, 'V'), - (0x1F1, 'M', u'dz'), - (0x1F4, 'M', u'ǵ'), - (0x1F5, 'V'), - (0x1F6, 'M', u'ƕ'), - (0x1F7, 'M', u'ƿ'), - (0x1F8, 'M', u'ǹ'), - (0x1F9, 'V'), - (0x1FA, 'M', u'ǻ'), - (0x1FB, 'V'), - (0x1FC, 'M', u'ǽ'), - (0x1FD, 'V'), - (0x1FE, 'M', u'ǿ'), - (0x1FF, 'V'), - (0x200, 'M', u'ȁ'), - (0x201, 'V'), - (0x202, 'M', u'ȃ'), - (0x203, 'V'), - (0x204, 'M', u'ȅ'), - (0x205, 'V'), - (0x206, 'M', u'ȇ'), - (0x207, 'V'), - (0x208, 'M', u'ȉ'), - (0x209, 'V'), - (0x20A, 'M', u'ȋ'), - (0x20B, 'V'), - (0x20C, 'M', u'ȍ'), - ] - -def _seg_5(): - return [ - (0x20D, 'V'), - (0x20E, 'M', u'ȏ'), - (0x20F, 'V'), - (0x210, 'M', u'ȑ'), - (0x211, 'V'), - (0x212, 'M', u'ȓ'), - (0x213, 'V'), - (0x214, 'M', u'ȕ'), - (0x215, 'V'), - (0x216, 'M', u'ȗ'), - (0x217, 'V'), - (0x218, 'M', u'ș'), - (0x219, 'V'), - (0x21A, 'M', u'ț'), - (0x21B, 'V'), - (0x21C, 'M', u'ȝ'), - (0x21D, 'V'), - (0x21E, 'M', u'ȟ'), - (0x21F, 'V'), - (0x220, 'M', u'ƞ'), - (0x221, 'V'), - (0x222, 'M', u'ȣ'), - (0x223, 'V'), - (0x224, 'M', u'ȥ'), - (0x225, 'V'), - (0x226, 'M', u'ȧ'), - (0x227, 'V'), - (0x228, 'M', u'ȩ'), - (0x229, 'V'), - (0x22A, 'M', u'ȫ'), - (0x22B, 'V'), - (0x22C, 'M', u'ȭ'), - (0x22D, 'V'), - (0x22E, 'M', u'ȯ'), - (0x22F, 'V'), - (0x230, 'M', u'ȱ'), - (0x231, 'V'), - (0x232, 'M', u'ȳ'), - (0x233, 'V'), - (0x23A, 'M', u'ⱥ'), - (0x23B, 'M', u'ȼ'), - (0x23C, 'V'), - (0x23D, 'M', u'ƚ'), - (0x23E, 'M', u'ⱦ'), - (0x23F, 'V'), - (0x241, 'M', u'ɂ'), - (0x242, 'V'), - (0x243, 'M', u'ƀ'), - (0x244, 'M', u'ʉ'), - (0x245, 'M', u'ʌ'), - (0x246, 'M', u'ɇ'), - (0x247, 'V'), - (0x248, 'M', u'ɉ'), - (0x249, 'V'), - (0x24A, 'M', u'ɋ'), - (0x24B, 'V'), - (0x24C, 'M', u'ɍ'), - (0x24D, 'V'), - (0x24E, 'M', u'ɏ'), - (0x24F, 'V'), - (0x2B0, 'M', u'h'), - (0x2B1, 'M', u'ɦ'), - (0x2B2, 'M', u'j'), - (0x2B3, 'M', u'r'), - (0x2B4, 'M', u'ɹ'), - (0x2B5, 'M', u'ɻ'), - (0x2B6, 'M', u'ʁ'), - (0x2B7, 'M', u'w'), - (0x2B8, 'M', u'y'), - (0x2B9, 'V'), - (0x2D8, '3', u' ̆'), - (0x2D9, '3', u' ̇'), - (0x2DA, '3', u' ̊'), - (0x2DB, '3', u' ̨'), - (0x2DC, '3', u' ̃'), - (0x2DD, '3', u' ̋'), - (0x2DE, 'V'), - (0x2E0, 'M', u'ɣ'), - (0x2E1, 'M', u'l'), - (0x2E2, 'M', u's'), - (0x2E3, 'M', u'x'), - (0x2E4, 'M', u'ʕ'), - (0x2E5, 'V'), - (0x340, 'M', u'̀'), - (0x341, 'M', u'́'), - (0x342, 'V'), - (0x343, 'M', u'̓'), - (0x344, 'M', u'̈́'), - (0x345, 'M', u'ι'), - (0x346, 'V'), - (0x34F, 'I'), - (0x350, 'V'), - (0x370, 'M', u'ͱ'), - (0x371, 'V'), - (0x372, 'M', u'ͳ'), - (0x373, 'V'), - (0x374, 'M', u'ʹ'), - (0x375, 'V'), - (0x376, 'M', u'ͷ'), - (0x377, 'V'), - ] - -def _seg_6(): - return [ - (0x378, 'X'), - (0x37A, '3', u' ι'), - (0x37B, 'V'), - (0x37E, '3', u';'), - (0x37F, 'M', u'ϳ'), - (0x380, 'X'), - (0x384, '3', u' ́'), - (0x385, '3', u' ̈́'), - (0x386, 'M', u'ά'), - (0x387, 'M', u'·'), - (0x388, 'M', u'έ'), - (0x389, 'M', u'ή'), - (0x38A, 'M', u'ί'), - (0x38B, 'X'), - (0x38C, 'M', u'ό'), - (0x38D, 'X'), - (0x38E, 'M', u'ύ'), - (0x38F, 'M', u'ώ'), - (0x390, 'V'), - (0x391, 'M', u'α'), - (0x392, 'M', u'β'), - (0x393, 'M', u'γ'), - (0x394, 'M', u'δ'), - (0x395, 'M', u'ε'), - (0x396, 'M', u'ζ'), - (0x397, 'M', u'η'), - (0x398, 'M', u'θ'), - (0x399, 'M', u'ι'), - (0x39A, 'M', u'κ'), - (0x39B, 'M', u'λ'), - (0x39C, 'M', u'μ'), - (0x39D, 'M', u'ν'), - (0x39E, 'M', u'ξ'), - (0x39F, 'M', u'ο'), - (0x3A0, 'M', u'π'), - (0x3A1, 'M', u'ρ'), - (0x3A2, 'X'), - (0x3A3, 'M', u'σ'), - (0x3A4, 'M', u'τ'), - (0x3A5, 'M', u'υ'), - (0x3A6, 'M', u'φ'), - (0x3A7, 'M', u'χ'), - (0x3A8, 'M', u'ψ'), - (0x3A9, 'M', u'ω'), - (0x3AA, 'M', u'ϊ'), - (0x3AB, 'M', u'ϋ'), - (0x3AC, 'V'), - (0x3C2, 'D', u'σ'), - (0x3C3, 'V'), - (0x3CF, 'M', u'ϗ'), - (0x3D0, 'M', u'β'), - (0x3D1, 'M', u'θ'), - (0x3D2, 'M', u'υ'), - (0x3D3, 'M', u'ύ'), - (0x3D4, 'M', u'ϋ'), - (0x3D5, 'M', u'φ'), - (0x3D6, 'M', u'π'), - (0x3D7, 'V'), - (0x3D8, 'M', u'ϙ'), - (0x3D9, 'V'), - (0x3DA, 'M', u'ϛ'), - (0x3DB, 'V'), - (0x3DC, 'M', u'ϝ'), - (0x3DD, 'V'), - (0x3DE, 'M', u'ϟ'), - (0x3DF, 'V'), - (0x3E0, 'M', u'ϡ'), - (0x3E1, 'V'), - (0x3E2, 'M', u'ϣ'), - (0x3E3, 'V'), - (0x3E4, 'M', u'ϥ'), - (0x3E5, 'V'), - (0x3E6, 'M', u'ϧ'), - (0x3E7, 'V'), - (0x3E8, 'M', u'ϩ'), - (0x3E9, 'V'), - (0x3EA, 'M', u'ϫ'), - (0x3EB, 'V'), - (0x3EC, 'M', u'ϭ'), - (0x3ED, 'V'), - (0x3EE, 'M', u'ϯ'), - (0x3EF, 'V'), - (0x3F0, 'M', u'κ'), - (0x3F1, 'M', u'ρ'), - (0x3F2, 'M', u'σ'), - (0x3F3, 'V'), - (0x3F4, 'M', u'θ'), - (0x3F5, 'M', u'ε'), - (0x3F6, 'V'), - (0x3F7, 'M', u'ϸ'), - (0x3F8, 'V'), - (0x3F9, 'M', u'σ'), - (0x3FA, 'M', u'ϻ'), - (0x3FB, 'V'), - (0x3FD, 'M', u'ͻ'), - (0x3FE, 'M', u'ͼ'), - (0x3FF, 'M', u'ͽ'), - (0x400, 'M', u'ѐ'), - (0x401, 'M', u'ё'), - (0x402, 'M', u'ђ'), - ] - -def _seg_7(): - return [ - (0x403, 'M', u'ѓ'), - (0x404, 'M', u'є'), - (0x405, 'M', u'ѕ'), - (0x406, 'M', u'і'), - (0x407, 'M', u'ї'), - (0x408, 'M', u'ј'), - (0x409, 'M', u'љ'), - (0x40A, 'M', u'њ'), - (0x40B, 'M', u'ћ'), - (0x40C, 'M', u'ќ'), - (0x40D, 'M', u'ѝ'), - (0x40E, 'M', u'ў'), - (0x40F, 'M', u'џ'), - (0x410, 'M', u'а'), - (0x411, 'M', u'б'), - (0x412, 'M', u'в'), - (0x413, 'M', u'г'), - (0x414, 'M', u'д'), - (0x415, 'M', u'е'), - (0x416, 'M', u'ж'), - (0x417, 'M', u'з'), - (0x418, 'M', u'и'), - (0x419, 'M', u'й'), - (0x41A, 'M', u'к'), - (0x41B, 'M', u'л'), - (0x41C, 'M', u'м'), - (0x41D, 'M', u'н'), - (0x41E, 'M', u'о'), - (0x41F, 'M', u'п'), - (0x420, 'M', u'р'), - (0x421, 'M', u'с'), - (0x422, 'M', u'т'), - (0x423, 'M', u'у'), - (0x424, 'M', u'ф'), - (0x425, 'M', u'х'), - (0x426, 'M', u'ц'), - (0x427, 'M', u'ч'), - (0x428, 'M', u'ш'), - (0x429, 'M', u'щ'), - (0x42A, 'M', u'ъ'), - (0x42B, 'M', u'ы'), - (0x42C, 'M', u'ь'), - (0x42D, 'M', u'э'), - (0x42E, 'M', u'ю'), - (0x42F, 'M', u'я'), - (0x430, 'V'), - (0x460, 'M', u'ѡ'), - (0x461, 'V'), - (0x462, 'M', u'ѣ'), - (0x463, 'V'), - (0x464, 'M', u'ѥ'), - (0x465, 'V'), - (0x466, 'M', u'ѧ'), - (0x467, 'V'), - (0x468, 'M', u'ѩ'), - (0x469, 'V'), - (0x46A, 'M', u'ѫ'), - (0x46B, 'V'), - (0x46C, 'M', u'ѭ'), - (0x46D, 'V'), - (0x46E, 'M', u'ѯ'), - (0x46F, 'V'), - (0x470, 'M', u'ѱ'), - (0x471, 'V'), - (0x472, 'M', u'ѳ'), - (0x473, 'V'), - (0x474, 'M', u'ѵ'), - (0x475, 'V'), - (0x476, 'M', u'ѷ'), - (0x477, 'V'), - (0x478, 'M', u'ѹ'), - (0x479, 'V'), - (0x47A, 'M', u'ѻ'), - (0x47B, 'V'), - (0x47C, 'M', u'ѽ'), - (0x47D, 'V'), - (0x47E, 'M', u'ѿ'), - (0x47F, 'V'), - (0x480, 'M', u'ҁ'), - (0x481, 'V'), - (0x48A, 'M', u'ҋ'), - (0x48B, 'V'), - (0x48C, 'M', u'ҍ'), - (0x48D, 'V'), - (0x48E, 'M', u'ҏ'), - (0x48F, 'V'), - (0x490, 'M', u'ґ'), - (0x491, 'V'), - (0x492, 'M', u'ғ'), - (0x493, 'V'), - (0x494, 'M', u'ҕ'), - (0x495, 'V'), - (0x496, 'M', u'җ'), - (0x497, 'V'), - (0x498, 'M', u'ҙ'), - (0x499, 'V'), - (0x49A, 'M', u'қ'), - (0x49B, 'V'), - (0x49C, 'M', u'ҝ'), - (0x49D, 'V'), - ] - -def _seg_8(): - return [ - (0x49E, 'M', u'ҟ'), - (0x49F, 'V'), - (0x4A0, 'M', u'ҡ'), - (0x4A1, 'V'), - (0x4A2, 'M', u'ң'), - (0x4A3, 'V'), - (0x4A4, 'M', u'ҥ'), - (0x4A5, 'V'), - (0x4A6, 'M', u'ҧ'), - (0x4A7, 'V'), - (0x4A8, 'M', u'ҩ'), - (0x4A9, 'V'), - (0x4AA, 'M', u'ҫ'), - (0x4AB, 'V'), - (0x4AC, 'M', u'ҭ'), - (0x4AD, 'V'), - (0x4AE, 'M', u'ү'), - (0x4AF, 'V'), - (0x4B0, 'M', u'ұ'), - (0x4B1, 'V'), - (0x4B2, 'M', u'ҳ'), - (0x4B3, 'V'), - (0x4B4, 'M', u'ҵ'), - (0x4B5, 'V'), - (0x4B6, 'M', u'ҷ'), - (0x4B7, 'V'), - (0x4B8, 'M', u'ҹ'), - (0x4B9, 'V'), - (0x4BA, 'M', u'һ'), - (0x4BB, 'V'), - (0x4BC, 'M', u'ҽ'), - (0x4BD, 'V'), - (0x4BE, 'M', u'ҿ'), - (0x4BF, 'V'), - (0x4C0, 'X'), - (0x4C1, 'M', u'ӂ'), - (0x4C2, 'V'), - (0x4C3, 'M', u'ӄ'), - (0x4C4, 'V'), - (0x4C5, 'M', u'ӆ'), - (0x4C6, 'V'), - (0x4C7, 'M', u'ӈ'), - (0x4C8, 'V'), - (0x4C9, 'M', u'ӊ'), - (0x4CA, 'V'), - (0x4CB, 'M', u'ӌ'), - (0x4CC, 'V'), - (0x4CD, 'M', u'ӎ'), - (0x4CE, 'V'), - (0x4D0, 'M', u'ӑ'), - (0x4D1, 'V'), - (0x4D2, 'M', u'ӓ'), - (0x4D3, 'V'), - (0x4D4, 'M', u'ӕ'), - (0x4D5, 'V'), - (0x4D6, 'M', u'ӗ'), - (0x4D7, 'V'), - (0x4D8, 'M', u'ә'), - (0x4D9, 'V'), - (0x4DA, 'M', u'ӛ'), - (0x4DB, 'V'), - (0x4DC, 'M', u'ӝ'), - (0x4DD, 'V'), - (0x4DE, 'M', u'ӟ'), - (0x4DF, 'V'), - (0x4E0, 'M', u'ӡ'), - (0x4E1, 'V'), - (0x4E2, 'M', u'ӣ'), - (0x4E3, 'V'), - (0x4E4, 'M', u'ӥ'), - (0x4E5, 'V'), - (0x4E6, 'M', u'ӧ'), - (0x4E7, 'V'), - (0x4E8, 'M', u'ө'), - (0x4E9, 'V'), - (0x4EA, 'M', u'ӫ'), - (0x4EB, 'V'), - (0x4EC, 'M', u'ӭ'), - (0x4ED, 'V'), - (0x4EE, 'M', u'ӯ'), - (0x4EF, 'V'), - (0x4F0, 'M', u'ӱ'), - (0x4F1, 'V'), - (0x4F2, 'M', u'ӳ'), - (0x4F3, 'V'), - (0x4F4, 'M', u'ӵ'), - (0x4F5, 'V'), - (0x4F6, 'M', u'ӷ'), - (0x4F7, 'V'), - (0x4F8, 'M', u'ӹ'), - (0x4F9, 'V'), - (0x4FA, 'M', u'ӻ'), - (0x4FB, 'V'), - (0x4FC, 'M', u'ӽ'), - (0x4FD, 'V'), - (0x4FE, 'M', u'ӿ'), - (0x4FF, 'V'), - (0x500, 'M', u'ԁ'), - (0x501, 'V'), - (0x502, 'M', u'ԃ'), - ] - -def _seg_9(): - return [ - (0x503, 'V'), - (0x504, 'M', u'ԅ'), - (0x505, 'V'), - (0x506, 'M', u'ԇ'), - (0x507, 'V'), - (0x508, 'M', u'ԉ'), - (0x509, 'V'), - (0x50A, 'M', u'ԋ'), - (0x50B, 'V'), - (0x50C, 'M', u'ԍ'), - (0x50D, 'V'), - (0x50E, 'M', u'ԏ'), - (0x50F, 'V'), - (0x510, 'M', u'ԑ'), - (0x511, 'V'), - (0x512, 'M', u'ԓ'), - (0x513, 'V'), - (0x514, 'M', u'ԕ'), - (0x515, 'V'), - (0x516, 'M', u'ԗ'), - (0x517, 'V'), - (0x518, 'M', u'ԙ'), - (0x519, 'V'), - (0x51A, 'M', u'ԛ'), - (0x51B, 'V'), - (0x51C, 'M', u'ԝ'), - (0x51D, 'V'), - (0x51E, 'M', u'ԟ'), - (0x51F, 'V'), - (0x520, 'M', u'ԡ'), - (0x521, 'V'), - (0x522, 'M', u'ԣ'), - (0x523, 'V'), - (0x524, 'M', u'ԥ'), - (0x525, 'V'), - (0x526, 'M', u'ԧ'), - (0x527, 'V'), - (0x528, 'M', u'ԩ'), - (0x529, 'V'), - (0x52A, 'M', u'ԫ'), - (0x52B, 'V'), - (0x52C, 'M', u'ԭ'), - (0x52D, 'V'), - (0x52E, 'M', u'ԯ'), - (0x52F, 'V'), - (0x530, 'X'), - (0x531, 'M', u'ա'), - (0x532, 'M', u'բ'), - (0x533, 'M', u'գ'), - (0x534, 'M', u'դ'), - (0x535, 'M', u'ե'), - (0x536, 'M', u'զ'), - (0x537, 'M', u'է'), - (0x538, 'M', u'ը'), - (0x539, 'M', u'թ'), - (0x53A, 'M', u'ժ'), - (0x53B, 'M', u'ի'), - (0x53C, 'M', u'լ'), - (0x53D, 'M', u'խ'), - (0x53E, 'M', u'ծ'), - (0x53F, 'M', u'կ'), - (0x540, 'M', u'հ'), - (0x541, 'M', u'ձ'), - (0x542, 'M', u'ղ'), - (0x543, 'M', u'ճ'), - (0x544, 'M', u'մ'), - (0x545, 'M', u'յ'), - (0x546, 'M', u'ն'), - (0x547, 'M', u'շ'), - (0x548, 'M', u'ո'), - (0x549, 'M', u'չ'), - (0x54A, 'M', u'պ'), - (0x54B, 'M', u'ջ'), - (0x54C, 'M', u'ռ'), - (0x54D, 'M', u'ս'), - (0x54E, 'M', u'վ'), - (0x54F, 'M', u'տ'), - (0x550, 'M', u'ր'), - (0x551, 'M', u'ց'), - (0x552, 'M', u'ւ'), - (0x553, 'M', u'փ'), - (0x554, 'M', u'ք'), - (0x555, 'M', u'օ'), - (0x556, 'M', u'ֆ'), - (0x557, 'X'), - (0x559, 'V'), - (0x587, 'M', u'եւ'), - (0x588, 'V'), - (0x58B, 'X'), - (0x58D, 'V'), - (0x590, 'X'), - (0x591, 'V'), - (0x5C8, 'X'), - (0x5D0, 'V'), - (0x5EB, 'X'), - (0x5EF, 'V'), - (0x5F5, 'X'), - (0x606, 'V'), - (0x61C, 'X'), - (0x61E, 'V'), - ] - -def _seg_10(): - return [ - (0x675, 'M', u'اٴ'), - (0x676, 'M', u'وٴ'), - (0x677, 'M', u'ۇٴ'), - (0x678, 'M', u'يٴ'), - (0x679, 'V'), - (0x6DD, 'X'), - (0x6DE, 'V'), - (0x70E, 'X'), - (0x710, 'V'), - (0x74B, 'X'), - (0x74D, 'V'), - (0x7B2, 'X'), - (0x7C0, 'V'), - (0x7FB, 'X'), - (0x7FD, 'V'), - (0x82E, 'X'), - (0x830, 'V'), - (0x83F, 'X'), - (0x840, 'V'), - (0x85C, 'X'), - (0x85E, 'V'), - (0x85F, 'X'), - (0x860, 'V'), - (0x86B, 'X'), - (0x8A0, 'V'), - (0x8B5, 'X'), - (0x8B6, 'V'), - (0x8BE, 'X'), - (0x8D3, 'V'), - (0x8E2, 'X'), - (0x8E3, 'V'), - (0x958, 'M', u'क़'), - (0x959, 'M', u'ख़'), - (0x95A, 'M', u'ग़'), - (0x95B, 'M', u'ज़'), - (0x95C, 'M', u'ड़'), - (0x95D, 'M', u'ढ़'), - (0x95E, 'M', u'फ़'), - (0x95F, 'M', u'य़'), - (0x960, 'V'), - (0x984, 'X'), - (0x985, 'V'), - (0x98D, 'X'), - (0x98F, 'V'), - (0x991, 'X'), - (0x993, 'V'), - (0x9A9, 'X'), - (0x9AA, 'V'), - (0x9B1, 'X'), - (0x9B2, 'V'), - (0x9B3, 'X'), - (0x9B6, 'V'), - (0x9BA, 'X'), - (0x9BC, 'V'), - (0x9C5, 'X'), - (0x9C7, 'V'), - (0x9C9, 'X'), - (0x9CB, 'V'), - (0x9CF, 'X'), - (0x9D7, 'V'), - (0x9D8, 'X'), - (0x9DC, 'M', u'ড়'), - (0x9DD, 'M', u'ঢ়'), - (0x9DE, 'X'), - (0x9DF, 'M', u'য়'), - (0x9E0, 'V'), - (0x9E4, 'X'), - (0x9E6, 'V'), - (0x9FF, 'X'), - (0xA01, 'V'), - (0xA04, 'X'), - (0xA05, 'V'), - (0xA0B, 'X'), - (0xA0F, 'V'), - (0xA11, 'X'), - (0xA13, 'V'), - (0xA29, 'X'), - (0xA2A, 'V'), - (0xA31, 'X'), - (0xA32, 'V'), - (0xA33, 'M', u'ਲ਼'), - (0xA34, 'X'), - (0xA35, 'V'), - (0xA36, 'M', u'ਸ਼'), - (0xA37, 'X'), - (0xA38, 'V'), - (0xA3A, 'X'), - (0xA3C, 'V'), - (0xA3D, 'X'), - (0xA3E, 'V'), - (0xA43, 'X'), - (0xA47, 'V'), - (0xA49, 'X'), - (0xA4B, 'V'), - (0xA4E, 'X'), - (0xA51, 'V'), - (0xA52, 'X'), - (0xA59, 'M', u'ਖ਼'), - (0xA5A, 'M', u'ਗ਼'), - (0xA5B, 'M', u'ਜ਼'), - ] - -def _seg_11(): - return [ - (0xA5C, 'V'), - (0xA5D, 'X'), - (0xA5E, 'M', u'ਫ਼'), - (0xA5F, 'X'), - (0xA66, 'V'), - (0xA77, 'X'), - (0xA81, 'V'), - (0xA84, 'X'), - (0xA85, 'V'), - (0xA8E, 'X'), - (0xA8F, 'V'), - (0xA92, 'X'), - (0xA93, 'V'), - (0xAA9, 'X'), - (0xAAA, 'V'), - (0xAB1, 'X'), - (0xAB2, 'V'), - (0xAB4, 'X'), - (0xAB5, 'V'), - (0xABA, 'X'), - (0xABC, 'V'), - (0xAC6, 'X'), - (0xAC7, 'V'), - (0xACA, 'X'), - (0xACB, 'V'), - (0xACE, 'X'), - (0xAD0, 'V'), - (0xAD1, 'X'), - (0xAE0, 'V'), - (0xAE4, 'X'), - (0xAE6, 'V'), - (0xAF2, 'X'), - (0xAF9, 'V'), - (0xB00, 'X'), - (0xB01, 'V'), - (0xB04, 'X'), - (0xB05, 'V'), - (0xB0D, 'X'), - (0xB0F, 'V'), - (0xB11, 'X'), - (0xB13, 'V'), - (0xB29, 'X'), - (0xB2A, 'V'), - (0xB31, 'X'), - (0xB32, 'V'), - (0xB34, 'X'), - (0xB35, 'V'), - (0xB3A, 'X'), - (0xB3C, 'V'), - (0xB45, 'X'), - (0xB47, 'V'), - (0xB49, 'X'), - (0xB4B, 'V'), - (0xB4E, 'X'), - (0xB56, 'V'), - (0xB58, 'X'), - (0xB5C, 'M', u'ଡ଼'), - (0xB5D, 'M', u'ଢ଼'), - (0xB5E, 'X'), - (0xB5F, 'V'), - (0xB64, 'X'), - (0xB66, 'V'), - (0xB78, 'X'), - (0xB82, 'V'), - (0xB84, 'X'), - (0xB85, 'V'), - (0xB8B, 'X'), - (0xB8E, 'V'), - (0xB91, 'X'), - (0xB92, 'V'), - (0xB96, 'X'), - (0xB99, 'V'), - (0xB9B, 'X'), - (0xB9C, 'V'), - (0xB9D, 'X'), - (0xB9E, 'V'), - (0xBA0, 'X'), - (0xBA3, 'V'), - (0xBA5, 'X'), - (0xBA8, 'V'), - (0xBAB, 'X'), - (0xBAE, 'V'), - (0xBBA, 'X'), - (0xBBE, 'V'), - (0xBC3, 'X'), - (0xBC6, 'V'), - (0xBC9, 'X'), - (0xBCA, 'V'), - (0xBCE, 'X'), - (0xBD0, 'V'), - (0xBD1, 'X'), - (0xBD7, 'V'), - (0xBD8, 'X'), - (0xBE6, 'V'), - (0xBFB, 'X'), - (0xC00, 'V'), - (0xC0D, 'X'), - (0xC0E, 'V'), - (0xC11, 'X'), - (0xC12, 'V'), - ] - -def _seg_12(): - return [ - (0xC29, 'X'), - (0xC2A, 'V'), - (0xC3A, 'X'), - (0xC3D, 'V'), - (0xC45, 'X'), - (0xC46, 'V'), - (0xC49, 'X'), - (0xC4A, 'V'), - (0xC4E, 'X'), - (0xC55, 'V'), - (0xC57, 'X'), - (0xC58, 'V'), - (0xC5B, 'X'), - (0xC60, 'V'), - (0xC64, 'X'), - (0xC66, 'V'), - (0xC70, 'X'), - (0xC78, 'V'), - (0xC8D, 'X'), - (0xC8E, 'V'), - (0xC91, 'X'), - (0xC92, 'V'), - (0xCA9, 'X'), - (0xCAA, 'V'), - (0xCB4, 'X'), - (0xCB5, 'V'), - (0xCBA, 'X'), - (0xCBC, 'V'), - (0xCC5, 'X'), - (0xCC6, 'V'), - (0xCC9, 'X'), - (0xCCA, 'V'), - (0xCCE, 'X'), - (0xCD5, 'V'), - (0xCD7, 'X'), - (0xCDE, 'V'), - (0xCDF, 'X'), - (0xCE0, 'V'), - (0xCE4, 'X'), - (0xCE6, 'V'), - (0xCF0, 'X'), - (0xCF1, 'V'), - (0xCF3, 'X'), - (0xD00, 'V'), - (0xD04, 'X'), - (0xD05, 'V'), - (0xD0D, 'X'), - (0xD0E, 'V'), - (0xD11, 'X'), - (0xD12, 'V'), - (0xD45, 'X'), - (0xD46, 'V'), - (0xD49, 'X'), - (0xD4A, 'V'), - (0xD50, 'X'), - (0xD54, 'V'), - (0xD64, 'X'), - (0xD66, 'V'), - (0xD80, 'X'), - (0xD82, 'V'), - (0xD84, 'X'), - (0xD85, 'V'), - (0xD97, 'X'), - (0xD9A, 'V'), - (0xDB2, 'X'), - (0xDB3, 'V'), - (0xDBC, 'X'), - (0xDBD, 'V'), - (0xDBE, 'X'), - (0xDC0, 'V'), - (0xDC7, 'X'), - (0xDCA, 'V'), - (0xDCB, 'X'), - (0xDCF, 'V'), - (0xDD5, 'X'), - (0xDD6, 'V'), - (0xDD7, 'X'), - (0xDD8, 'V'), - (0xDE0, 'X'), - (0xDE6, 'V'), - (0xDF0, 'X'), - (0xDF2, 'V'), - (0xDF5, 'X'), - (0xE01, 'V'), - (0xE33, 'M', u'ํา'), - (0xE34, 'V'), - (0xE3B, 'X'), - (0xE3F, 'V'), - (0xE5C, 'X'), - (0xE81, 'V'), - (0xE83, 'X'), - (0xE84, 'V'), - (0xE85, 'X'), - (0xE87, 'V'), - (0xE89, 'X'), - (0xE8A, 'V'), - (0xE8B, 'X'), - (0xE8D, 'V'), - (0xE8E, 'X'), - (0xE94, 'V'), - ] - -def _seg_13(): - return [ - (0xE98, 'X'), - (0xE99, 'V'), - (0xEA0, 'X'), - (0xEA1, 'V'), - (0xEA4, 'X'), - (0xEA5, 'V'), - (0xEA6, 'X'), - (0xEA7, 'V'), - (0xEA8, 'X'), - (0xEAA, 'V'), - (0xEAC, 'X'), - (0xEAD, 'V'), - (0xEB3, 'M', u'ໍາ'), - (0xEB4, 'V'), - (0xEBA, 'X'), - (0xEBB, 'V'), - (0xEBE, 'X'), - (0xEC0, 'V'), - (0xEC5, 'X'), - (0xEC6, 'V'), - (0xEC7, 'X'), - (0xEC8, 'V'), - (0xECE, 'X'), - (0xED0, 'V'), - (0xEDA, 'X'), - (0xEDC, 'M', u'ຫນ'), - (0xEDD, 'M', u'ຫມ'), - (0xEDE, 'V'), - (0xEE0, 'X'), - (0xF00, 'V'), - (0xF0C, 'M', u'་'), - (0xF0D, 'V'), - (0xF43, 'M', u'གྷ'), - (0xF44, 'V'), - (0xF48, 'X'), - (0xF49, 'V'), - (0xF4D, 'M', u'ཌྷ'), - (0xF4E, 'V'), - (0xF52, 'M', u'དྷ'), - (0xF53, 'V'), - (0xF57, 'M', u'བྷ'), - (0xF58, 'V'), - (0xF5C, 'M', u'ཛྷ'), - (0xF5D, 'V'), - (0xF69, 'M', u'ཀྵ'), - (0xF6A, 'V'), - (0xF6D, 'X'), - (0xF71, 'V'), - (0xF73, 'M', u'ཱི'), - (0xF74, 'V'), - (0xF75, 'M', u'ཱུ'), - (0xF76, 'M', u'ྲྀ'), - (0xF77, 'M', u'ྲཱྀ'), - (0xF78, 'M', u'ླྀ'), - (0xF79, 'M', u'ླཱྀ'), - (0xF7A, 'V'), - (0xF81, 'M', u'ཱྀ'), - (0xF82, 'V'), - (0xF93, 'M', u'ྒྷ'), - (0xF94, 'V'), - (0xF98, 'X'), - (0xF99, 'V'), - (0xF9D, 'M', u'ྜྷ'), - (0xF9E, 'V'), - (0xFA2, 'M', u'ྡྷ'), - (0xFA3, 'V'), - (0xFA7, 'M', u'ྦྷ'), - (0xFA8, 'V'), - (0xFAC, 'M', u'ྫྷ'), - (0xFAD, 'V'), - (0xFB9, 'M', u'ྐྵ'), - (0xFBA, 'V'), - (0xFBD, 'X'), - (0xFBE, 'V'), - (0xFCD, 'X'), - (0xFCE, 'V'), - (0xFDB, 'X'), - (0x1000, 'V'), - (0x10A0, 'X'), - (0x10C7, 'M', u'ⴧ'), - (0x10C8, 'X'), - (0x10CD, 'M', u'ⴭ'), - (0x10CE, 'X'), - (0x10D0, 'V'), - (0x10FC, 'M', u'ნ'), - (0x10FD, 'V'), - (0x115F, 'X'), - (0x1161, 'V'), - (0x1249, 'X'), - (0x124A, 'V'), - (0x124E, 'X'), - (0x1250, 'V'), - (0x1257, 'X'), - (0x1258, 'V'), - (0x1259, 'X'), - (0x125A, 'V'), - (0x125E, 'X'), - (0x1260, 'V'), - (0x1289, 'X'), - (0x128A, 'V'), - ] - -def _seg_14(): - return [ - (0x128E, 'X'), - (0x1290, 'V'), - (0x12B1, 'X'), - (0x12B2, 'V'), - (0x12B6, 'X'), - (0x12B8, 'V'), - (0x12BF, 'X'), - (0x12C0, 'V'), - (0x12C1, 'X'), - (0x12C2, 'V'), - (0x12C6, 'X'), - (0x12C8, 'V'), - (0x12D7, 'X'), - (0x12D8, 'V'), - (0x1311, 'X'), - (0x1312, 'V'), - (0x1316, 'X'), - (0x1318, 'V'), - (0x135B, 'X'), - (0x135D, 'V'), - (0x137D, 'X'), - (0x1380, 'V'), - (0x139A, 'X'), - (0x13A0, 'V'), - (0x13F6, 'X'), - (0x13F8, 'M', u'Ᏸ'), - (0x13F9, 'M', u'Ᏹ'), - (0x13FA, 'M', u'Ᏺ'), - (0x13FB, 'M', u'Ᏻ'), - (0x13FC, 'M', u'Ᏼ'), - (0x13FD, 'M', u'Ᏽ'), - (0x13FE, 'X'), - (0x1400, 'V'), - (0x1680, 'X'), - (0x1681, 'V'), - (0x169D, 'X'), - (0x16A0, 'V'), - (0x16F9, 'X'), - (0x1700, 'V'), - (0x170D, 'X'), - (0x170E, 'V'), - (0x1715, 'X'), - (0x1720, 'V'), - (0x1737, 'X'), - (0x1740, 'V'), - (0x1754, 'X'), - (0x1760, 'V'), - (0x176D, 'X'), - (0x176E, 'V'), - (0x1771, 'X'), - (0x1772, 'V'), - (0x1774, 'X'), - (0x1780, 'V'), - (0x17B4, 'X'), - (0x17B6, 'V'), - (0x17DE, 'X'), - (0x17E0, 'V'), - (0x17EA, 'X'), - (0x17F0, 'V'), - (0x17FA, 'X'), - (0x1800, 'V'), - (0x1806, 'X'), - (0x1807, 'V'), - (0x180B, 'I'), - (0x180E, 'X'), - (0x1810, 'V'), - (0x181A, 'X'), - (0x1820, 'V'), - (0x1879, 'X'), - (0x1880, 'V'), - (0x18AB, 'X'), - (0x18B0, 'V'), - (0x18F6, 'X'), - (0x1900, 'V'), - (0x191F, 'X'), - (0x1920, 'V'), - (0x192C, 'X'), - (0x1930, 'V'), - (0x193C, 'X'), - (0x1940, 'V'), - (0x1941, 'X'), - (0x1944, 'V'), - (0x196E, 'X'), - (0x1970, 'V'), - (0x1975, 'X'), - (0x1980, 'V'), - (0x19AC, 'X'), - (0x19B0, 'V'), - (0x19CA, 'X'), - (0x19D0, 'V'), - (0x19DB, 'X'), - (0x19DE, 'V'), - (0x1A1C, 'X'), - (0x1A1E, 'V'), - (0x1A5F, 'X'), - (0x1A60, 'V'), - (0x1A7D, 'X'), - (0x1A7F, 'V'), - (0x1A8A, 'X'), - (0x1A90, 'V'), - ] - -def _seg_15(): - return [ - (0x1A9A, 'X'), - (0x1AA0, 'V'), - (0x1AAE, 'X'), - (0x1AB0, 'V'), - (0x1ABF, 'X'), - (0x1B00, 'V'), - (0x1B4C, 'X'), - (0x1B50, 'V'), - (0x1B7D, 'X'), - (0x1B80, 'V'), - (0x1BF4, 'X'), - (0x1BFC, 'V'), - (0x1C38, 'X'), - (0x1C3B, 'V'), - (0x1C4A, 'X'), - (0x1C4D, 'V'), - (0x1C80, 'M', u'в'), - (0x1C81, 'M', u'д'), - (0x1C82, 'M', u'о'), - (0x1C83, 'M', u'с'), - (0x1C84, 'M', u'т'), - (0x1C86, 'M', u'ъ'), - (0x1C87, 'M', u'ѣ'), - (0x1C88, 'M', u'ꙋ'), - (0x1C89, 'X'), - (0x1CC0, 'V'), - (0x1CC8, 'X'), - (0x1CD0, 'V'), - (0x1CFA, 'X'), - (0x1D00, 'V'), - (0x1D2C, 'M', u'a'), - (0x1D2D, 'M', u'æ'), - (0x1D2E, 'M', u'b'), - (0x1D2F, 'V'), - (0x1D30, 'M', u'd'), - (0x1D31, 'M', u'e'), - (0x1D32, 'M', u'ǝ'), - (0x1D33, 'M', u'g'), - (0x1D34, 'M', u'h'), - (0x1D35, 'M', u'i'), - (0x1D36, 'M', u'j'), - (0x1D37, 'M', u'k'), - (0x1D38, 'M', u'l'), - (0x1D39, 'M', u'm'), - (0x1D3A, 'M', u'n'), - (0x1D3B, 'V'), - (0x1D3C, 'M', u'o'), - (0x1D3D, 'M', u'ȣ'), - (0x1D3E, 'M', u'p'), - (0x1D3F, 'M', u'r'), - (0x1D40, 'M', u't'), - (0x1D41, 'M', u'u'), - (0x1D42, 'M', u'w'), - (0x1D43, 'M', u'a'), - (0x1D44, 'M', u'ɐ'), - (0x1D45, 'M', u'ɑ'), - (0x1D46, 'M', u'ᴂ'), - (0x1D47, 'M', u'b'), - (0x1D48, 'M', u'd'), - (0x1D49, 'M', u'e'), - (0x1D4A, 'M', u'ə'), - (0x1D4B, 'M', u'ɛ'), - (0x1D4C, 'M', u'ɜ'), - (0x1D4D, 'M', u'g'), - (0x1D4E, 'V'), - (0x1D4F, 'M', u'k'), - (0x1D50, 'M', u'm'), - (0x1D51, 'M', u'ŋ'), - (0x1D52, 'M', u'o'), - (0x1D53, 'M', u'ɔ'), - (0x1D54, 'M', u'ᴖ'), - (0x1D55, 'M', u'ᴗ'), - (0x1D56, 'M', u'p'), - (0x1D57, 'M', u't'), - (0x1D58, 'M', u'u'), - (0x1D59, 'M', u'ᴝ'), - (0x1D5A, 'M', u'ɯ'), - (0x1D5B, 'M', u'v'), - (0x1D5C, 'M', u'ᴥ'), - (0x1D5D, 'M', u'β'), - (0x1D5E, 'M', u'γ'), - (0x1D5F, 'M', u'δ'), - (0x1D60, 'M', u'φ'), - (0x1D61, 'M', u'χ'), - (0x1D62, 'M', u'i'), - (0x1D63, 'M', u'r'), - (0x1D64, 'M', u'u'), - (0x1D65, 'M', u'v'), - (0x1D66, 'M', u'β'), - (0x1D67, 'M', u'γ'), - (0x1D68, 'M', u'ρ'), - (0x1D69, 'M', u'φ'), - (0x1D6A, 'M', u'χ'), - (0x1D6B, 'V'), - (0x1D78, 'M', u'н'), - (0x1D79, 'V'), - (0x1D9B, 'M', u'ɒ'), - (0x1D9C, 'M', u'c'), - (0x1D9D, 'M', u'ɕ'), - (0x1D9E, 'M', u'ð'), - ] - -def _seg_16(): - return [ - (0x1D9F, 'M', u'ɜ'), - (0x1DA0, 'M', u'f'), - (0x1DA1, 'M', u'ɟ'), - (0x1DA2, 'M', u'ɡ'), - (0x1DA3, 'M', u'ɥ'), - (0x1DA4, 'M', u'ɨ'), - (0x1DA5, 'M', u'ɩ'), - (0x1DA6, 'M', u'ɪ'), - (0x1DA7, 'M', u'ᵻ'), - (0x1DA8, 'M', u'ʝ'), - (0x1DA9, 'M', u'ɭ'), - (0x1DAA, 'M', u'ᶅ'), - (0x1DAB, 'M', u'ʟ'), - (0x1DAC, 'M', u'ɱ'), - (0x1DAD, 'M', u'ɰ'), - (0x1DAE, 'M', u'ɲ'), - (0x1DAF, 'M', u'ɳ'), - (0x1DB0, 'M', u'ɴ'), - (0x1DB1, 'M', u'ɵ'), - (0x1DB2, 'M', u'ɸ'), - (0x1DB3, 'M', u'ʂ'), - (0x1DB4, 'M', u'ʃ'), - (0x1DB5, 'M', u'ƫ'), - (0x1DB6, 'M', u'ʉ'), - (0x1DB7, 'M', u'ʊ'), - (0x1DB8, 'M', u'ᴜ'), - (0x1DB9, 'M', u'ʋ'), - (0x1DBA, 'M', u'ʌ'), - (0x1DBB, 'M', u'z'), - (0x1DBC, 'M', u'ʐ'), - (0x1DBD, 'M', u'ʑ'), - (0x1DBE, 'M', u'ʒ'), - (0x1DBF, 'M', u'θ'), - (0x1DC0, 'V'), - (0x1DFA, 'X'), - (0x1DFB, 'V'), - (0x1E00, 'M', u'ḁ'), - (0x1E01, 'V'), - (0x1E02, 'M', u'ḃ'), - (0x1E03, 'V'), - (0x1E04, 'M', u'ḅ'), - (0x1E05, 'V'), - (0x1E06, 'M', u'ḇ'), - (0x1E07, 'V'), - (0x1E08, 'M', u'ḉ'), - (0x1E09, 'V'), - (0x1E0A, 'M', u'ḋ'), - (0x1E0B, 'V'), - (0x1E0C, 'M', u'ḍ'), - (0x1E0D, 'V'), - (0x1E0E, 'M', u'ḏ'), - (0x1E0F, 'V'), - (0x1E10, 'M', u'ḑ'), - (0x1E11, 'V'), - (0x1E12, 'M', u'ḓ'), - (0x1E13, 'V'), - (0x1E14, 'M', u'ḕ'), - (0x1E15, 'V'), - (0x1E16, 'M', u'ḗ'), - (0x1E17, 'V'), - (0x1E18, 'M', u'ḙ'), - (0x1E19, 'V'), - (0x1E1A, 'M', u'ḛ'), - (0x1E1B, 'V'), - (0x1E1C, 'M', u'ḝ'), - (0x1E1D, 'V'), - (0x1E1E, 'M', u'ḟ'), - (0x1E1F, 'V'), - (0x1E20, 'M', u'ḡ'), - (0x1E21, 'V'), - (0x1E22, 'M', u'ḣ'), - (0x1E23, 'V'), - (0x1E24, 'M', u'ḥ'), - (0x1E25, 'V'), - (0x1E26, 'M', u'ḧ'), - (0x1E27, 'V'), - (0x1E28, 'M', u'ḩ'), - (0x1E29, 'V'), - (0x1E2A, 'M', u'ḫ'), - (0x1E2B, 'V'), - (0x1E2C, 'M', u'ḭ'), - (0x1E2D, 'V'), - (0x1E2E, 'M', u'ḯ'), - (0x1E2F, 'V'), - (0x1E30, 'M', u'ḱ'), - (0x1E31, 'V'), - (0x1E32, 'M', u'ḳ'), - (0x1E33, 'V'), - (0x1E34, 'M', u'ḵ'), - (0x1E35, 'V'), - (0x1E36, 'M', u'ḷ'), - (0x1E37, 'V'), - (0x1E38, 'M', u'ḹ'), - (0x1E39, 'V'), - (0x1E3A, 'M', u'ḻ'), - (0x1E3B, 'V'), - (0x1E3C, 'M', u'ḽ'), - (0x1E3D, 'V'), - (0x1E3E, 'M', u'ḿ'), - (0x1E3F, 'V'), - ] - -def _seg_17(): - return [ - (0x1E40, 'M', u'ṁ'), - (0x1E41, 'V'), - (0x1E42, 'M', u'ṃ'), - (0x1E43, 'V'), - (0x1E44, 'M', u'ṅ'), - (0x1E45, 'V'), - (0x1E46, 'M', u'ṇ'), - (0x1E47, 'V'), - (0x1E48, 'M', u'ṉ'), - (0x1E49, 'V'), - (0x1E4A, 'M', u'ṋ'), - (0x1E4B, 'V'), - (0x1E4C, 'M', u'ṍ'), - (0x1E4D, 'V'), - (0x1E4E, 'M', u'ṏ'), - (0x1E4F, 'V'), - (0x1E50, 'M', u'ṑ'), - (0x1E51, 'V'), - (0x1E52, 'M', u'ṓ'), - (0x1E53, 'V'), - (0x1E54, 'M', u'ṕ'), - (0x1E55, 'V'), - (0x1E56, 'M', u'ṗ'), - (0x1E57, 'V'), - (0x1E58, 'M', u'ṙ'), - (0x1E59, 'V'), - (0x1E5A, 'M', u'ṛ'), - (0x1E5B, 'V'), - (0x1E5C, 'M', u'ṝ'), - (0x1E5D, 'V'), - (0x1E5E, 'M', u'ṟ'), - (0x1E5F, 'V'), - (0x1E60, 'M', u'ṡ'), - (0x1E61, 'V'), - (0x1E62, 'M', u'ṣ'), - (0x1E63, 'V'), - (0x1E64, 'M', u'ṥ'), - (0x1E65, 'V'), - (0x1E66, 'M', u'ṧ'), - (0x1E67, 'V'), - (0x1E68, 'M', u'ṩ'), - (0x1E69, 'V'), - (0x1E6A, 'M', u'ṫ'), - (0x1E6B, 'V'), - (0x1E6C, 'M', u'ṭ'), - (0x1E6D, 'V'), - (0x1E6E, 'M', u'ṯ'), - (0x1E6F, 'V'), - (0x1E70, 'M', u'ṱ'), - (0x1E71, 'V'), - (0x1E72, 'M', u'ṳ'), - (0x1E73, 'V'), - (0x1E74, 'M', u'ṵ'), - (0x1E75, 'V'), - (0x1E76, 'M', u'ṷ'), - (0x1E77, 'V'), - (0x1E78, 'M', u'ṹ'), - (0x1E79, 'V'), - (0x1E7A, 'M', u'ṻ'), - (0x1E7B, 'V'), - (0x1E7C, 'M', u'ṽ'), - (0x1E7D, 'V'), - (0x1E7E, 'M', u'ṿ'), - (0x1E7F, 'V'), - (0x1E80, 'M', u'ẁ'), - (0x1E81, 'V'), - (0x1E82, 'M', u'ẃ'), - (0x1E83, 'V'), - (0x1E84, 'M', u'ẅ'), - (0x1E85, 'V'), - (0x1E86, 'M', u'ẇ'), - (0x1E87, 'V'), - (0x1E88, 'M', u'ẉ'), - (0x1E89, 'V'), - (0x1E8A, 'M', u'ẋ'), - (0x1E8B, 'V'), - (0x1E8C, 'M', u'ẍ'), - (0x1E8D, 'V'), - (0x1E8E, 'M', u'ẏ'), - (0x1E8F, 'V'), - (0x1E90, 'M', u'ẑ'), - (0x1E91, 'V'), - (0x1E92, 'M', u'ẓ'), - (0x1E93, 'V'), - (0x1E94, 'M', u'ẕ'), - (0x1E95, 'V'), - (0x1E9A, 'M', u'aʾ'), - (0x1E9B, 'M', u'ṡ'), - (0x1E9C, 'V'), - (0x1E9E, 'M', u'ss'), - (0x1E9F, 'V'), - (0x1EA0, 'M', u'ạ'), - (0x1EA1, 'V'), - (0x1EA2, 'M', u'ả'), - (0x1EA3, 'V'), - (0x1EA4, 'M', u'ấ'), - (0x1EA5, 'V'), - (0x1EA6, 'M', u'ầ'), - (0x1EA7, 'V'), - (0x1EA8, 'M', u'ẩ'), - ] - -def _seg_18(): - return [ - (0x1EA9, 'V'), - (0x1EAA, 'M', u'ẫ'), - (0x1EAB, 'V'), - (0x1EAC, 'M', u'ậ'), - (0x1EAD, 'V'), - (0x1EAE, 'M', u'ắ'), - (0x1EAF, 'V'), - (0x1EB0, 'M', u'ằ'), - (0x1EB1, 'V'), - (0x1EB2, 'M', u'ẳ'), - (0x1EB3, 'V'), - (0x1EB4, 'M', u'ẵ'), - (0x1EB5, 'V'), - (0x1EB6, 'M', u'ặ'), - (0x1EB7, 'V'), - (0x1EB8, 'M', u'ẹ'), - (0x1EB9, 'V'), - (0x1EBA, 'M', u'ẻ'), - (0x1EBB, 'V'), - (0x1EBC, 'M', u'ẽ'), - (0x1EBD, 'V'), - (0x1EBE, 'M', u'ế'), - (0x1EBF, 'V'), - (0x1EC0, 'M', u'ề'), - (0x1EC1, 'V'), - (0x1EC2, 'M', u'ể'), - (0x1EC3, 'V'), - (0x1EC4, 'M', u'ễ'), - (0x1EC5, 'V'), - (0x1EC6, 'M', u'ệ'), - (0x1EC7, 'V'), - (0x1EC8, 'M', u'ỉ'), - (0x1EC9, 'V'), - (0x1ECA, 'M', u'ị'), - (0x1ECB, 'V'), - (0x1ECC, 'M', u'ọ'), - (0x1ECD, 'V'), - (0x1ECE, 'M', u'ỏ'), - (0x1ECF, 'V'), - (0x1ED0, 'M', u'ố'), - (0x1ED1, 'V'), - (0x1ED2, 'M', u'ồ'), - (0x1ED3, 'V'), - (0x1ED4, 'M', u'ổ'), - (0x1ED5, 'V'), - (0x1ED6, 'M', u'ỗ'), - (0x1ED7, 'V'), - (0x1ED8, 'M', u'ộ'), - (0x1ED9, 'V'), - (0x1EDA, 'M', u'ớ'), - (0x1EDB, 'V'), - (0x1EDC, 'M', u'ờ'), - (0x1EDD, 'V'), - (0x1EDE, 'M', u'ở'), - (0x1EDF, 'V'), - (0x1EE0, 'M', u'ỡ'), - (0x1EE1, 'V'), - (0x1EE2, 'M', u'ợ'), - (0x1EE3, 'V'), - (0x1EE4, 'M', u'ụ'), - (0x1EE5, 'V'), - (0x1EE6, 'M', u'ủ'), - (0x1EE7, 'V'), - (0x1EE8, 'M', u'ứ'), - (0x1EE9, 'V'), - (0x1EEA, 'M', u'ừ'), - (0x1EEB, 'V'), - (0x1EEC, 'M', u'ử'), - (0x1EED, 'V'), - (0x1EEE, 'M', u'ữ'), - (0x1EEF, 'V'), - (0x1EF0, 'M', u'ự'), - (0x1EF1, 'V'), - (0x1EF2, 'M', u'ỳ'), - (0x1EF3, 'V'), - (0x1EF4, 'M', u'ỵ'), - (0x1EF5, 'V'), - (0x1EF6, 'M', u'ỷ'), - (0x1EF7, 'V'), - (0x1EF8, 'M', u'ỹ'), - (0x1EF9, 'V'), - (0x1EFA, 'M', u'ỻ'), - (0x1EFB, 'V'), - (0x1EFC, 'M', u'ỽ'), - (0x1EFD, 'V'), - (0x1EFE, 'M', u'ỿ'), - (0x1EFF, 'V'), - (0x1F08, 'M', u'ἀ'), - (0x1F09, 'M', u'ἁ'), - (0x1F0A, 'M', u'ἂ'), - (0x1F0B, 'M', u'ἃ'), - (0x1F0C, 'M', u'ἄ'), - (0x1F0D, 'M', u'ἅ'), - (0x1F0E, 'M', u'ἆ'), - (0x1F0F, 'M', u'ἇ'), - (0x1F10, 'V'), - (0x1F16, 'X'), - (0x1F18, 'M', u'ἐ'), - (0x1F19, 'M', u'ἑ'), - (0x1F1A, 'M', u'ἒ'), - ] - -def _seg_19(): - return [ - (0x1F1B, 'M', u'ἓ'), - (0x1F1C, 'M', u'ἔ'), - (0x1F1D, 'M', u'ἕ'), - (0x1F1E, 'X'), - (0x1F20, 'V'), - (0x1F28, 'M', u'ἠ'), - (0x1F29, 'M', u'ἡ'), - (0x1F2A, 'M', u'ἢ'), - (0x1F2B, 'M', u'ἣ'), - (0x1F2C, 'M', u'ἤ'), - (0x1F2D, 'M', u'ἥ'), - (0x1F2E, 'M', u'ἦ'), - (0x1F2F, 'M', u'ἧ'), - (0x1F30, 'V'), - (0x1F38, 'M', u'ἰ'), - (0x1F39, 'M', u'ἱ'), - (0x1F3A, 'M', u'ἲ'), - (0x1F3B, 'M', u'ἳ'), - (0x1F3C, 'M', u'ἴ'), - (0x1F3D, 'M', u'ἵ'), - (0x1F3E, 'M', u'ἶ'), - (0x1F3F, 'M', u'ἷ'), - (0x1F40, 'V'), - (0x1F46, 'X'), - (0x1F48, 'M', u'ὀ'), - (0x1F49, 'M', u'ὁ'), - (0x1F4A, 'M', u'ὂ'), - (0x1F4B, 'M', u'ὃ'), - (0x1F4C, 'M', u'ὄ'), - (0x1F4D, 'M', u'ὅ'), - (0x1F4E, 'X'), - (0x1F50, 'V'), - (0x1F58, 'X'), - (0x1F59, 'M', u'ὑ'), - (0x1F5A, 'X'), - (0x1F5B, 'M', u'ὓ'), - (0x1F5C, 'X'), - (0x1F5D, 'M', u'ὕ'), - (0x1F5E, 'X'), - (0x1F5F, 'M', u'ὗ'), - (0x1F60, 'V'), - (0x1F68, 'M', u'ὠ'), - (0x1F69, 'M', u'ὡ'), - (0x1F6A, 'M', u'ὢ'), - (0x1F6B, 'M', u'ὣ'), - (0x1F6C, 'M', u'ὤ'), - (0x1F6D, 'M', u'ὥ'), - (0x1F6E, 'M', u'ὦ'), - (0x1F6F, 'M', u'ὧ'), - (0x1F70, 'V'), - (0x1F71, 'M', u'ά'), - (0x1F72, 'V'), - (0x1F73, 'M', u'έ'), - (0x1F74, 'V'), - (0x1F75, 'M', u'ή'), - (0x1F76, 'V'), - (0x1F77, 'M', u'ί'), - (0x1F78, 'V'), - (0x1F79, 'M', u'ό'), - (0x1F7A, 'V'), - (0x1F7B, 'M', u'ύ'), - (0x1F7C, 'V'), - (0x1F7D, 'M', u'ώ'), - (0x1F7E, 'X'), - (0x1F80, 'M', u'ἀι'), - (0x1F81, 'M', u'ἁι'), - (0x1F82, 'M', u'ἂι'), - (0x1F83, 'M', u'ἃι'), - (0x1F84, 'M', u'ἄι'), - (0x1F85, 'M', u'ἅι'), - (0x1F86, 'M', u'ἆι'), - (0x1F87, 'M', u'ἇι'), - (0x1F88, 'M', u'ἀι'), - (0x1F89, 'M', u'ἁι'), - (0x1F8A, 'M', u'ἂι'), - (0x1F8B, 'M', u'ἃι'), - (0x1F8C, 'M', u'ἄι'), - (0x1F8D, 'M', u'ἅι'), - (0x1F8E, 'M', u'ἆι'), - (0x1F8F, 'M', u'ἇι'), - (0x1F90, 'M', u'ἠι'), - (0x1F91, 'M', u'ἡι'), - (0x1F92, 'M', u'ἢι'), - (0x1F93, 'M', u'ἣι'), - (0x1F94, 'M', u'ἤι'), - (0x1F95, 'M', u'ἥι'), - (0x1F96, 'M', u'ἦι'), - (0x1F97, 'M', u'ἧι'), - (0x1F98, 'M', u'ἠι'), - (0x1F99, 'M', u'ἡι'), - (0x1F9A, 'M', u'ἢι'), - (0x1F9B, 'M', u'ἣι'), - (0x1F9C, 'M', u'ἤι'), - (0x1F9D, 'M', u'ἥι'), - (0x1F9E, 'M', u'ἦι'), - (0x1F9F, 'M', u'ἧι'), - (0x1FA0, 'M', u'ὠι'), - (0x1FA1, 'M', u'ὡι'), - (0x1FA2, 'M', u'ὢι'), - (0x1FA3, 'M', u'ὣι'), - ] - -def _seg_20(): - return [ - (0x1FA4, 'M', u'ὤι'), - (0x1FA5, 'M', u'ὥι'), - (0x1FA6, 'M', u'ὦι'), - (0x1FA7, 'M', u'ὧι'), - (0x1FA8, 'M', u'ὠι'), - (0x1FA9, 'M', u'ὡι'), - (0x1FAA, 'M', u'ὢι'), - (0x1FAB, 'M', u'ὣι'), - (0x1FAC, 'M', u'ὤι'), - (0x1FAD, 'M', u'ὥι'), - (0x1FAE, 'M', u'ὦι'), - (0x1FAF, 'M', u'ὧι'), - (0x1FB0, 'V'), - (0x1FB2, 'M', u'ὰι'), - (0x1FB3, 'M', u'αι'), - (0x1FB4, 'M', u'άι'), - (0x1FB5, 'X'), - (0x1FB6, 'V'), - (0x1FB7, 'M', u'ᾶι'), - (0x1FB8, 'M', u'ᾰ'), - (0x1FB9, 'M', u'ᾱ'), - (0x1FBA, 'M', u'ὰ'), - (0x1FBB, 'M', u'ά'), - (0x1FBC, 'M', u'αι'), - (0x1FBD, '3', u' ̓'), - (0x1FBE, 'M', u'ι'), - (0x1FBF, '3', u' ̓'), - (0x1FC0, '3', u' ͂'), - (0x1FC1, '3', u' ̈͂'), - (0x1FC2, 'M', u'ὴι'), - (0x1FC3, 'M', u'ηι'), - (0x1FC4, 'M', u'ήι'), - (0x1FC5, 'X'), - (0x1FC6, 'V'), - (0x1FC7, 'M', u'ῆι'), - (0x1FC8, 'M', u'ὲ'), - (0x1FC9, 'M', u'έ'), - (0x1FCA, 'M', u'ὴ'), - (0x1FCB, 'M', u'ή'), - (0x1FCC, 'M', u'ηι'), - (0x1FCD, '3', u' ̓̀'), - (0x1FCE, '3', u' ̓́'), - (0x1FCF, '3', u' ̓͂'), - (0x1FD0, 'V'), - (0x1FD3, 'M', u'ΐ'), - (0x1FD4, 'X'), - (0x1FD6, 'V'), - (0x1FD8, 'M', u'ῐ'), - (0x1FD9, 'M', u'ῑ'), - (0x1FDA, 'M', u'ὶ'), - (0x1FDB, 'M', u'ί'), - (0x1FDC, 'X'), - (0x1FDD, '3', u' ̔̀'), - (0x1FDE, '3', u' ̔́'), - (0x1FDF, '3', u' ̔͂'), - (0x1FE0, 'V'), - (0x1FE3, 'M', u'ΰ'), - (0x1FE4, 'V'), - (0x1FE8, 'M', u'ῠ'), - (0x1FE9, 'M', u'ῡ'), - (0x1FEA, 'M', u'ὺ'), - (0x1FEB, 'M', u'ύ'), - (0x1FEC, 'M', u'ῥ'), - (0x1FED, '3', u' ̈̀'), - (0x1FEE, '3', u' ̈́'), - (0x1FEF, '3', u'`'), - (0x1FF0, 'X'), - (0x1FF2, 'M', u'ὼι'), - (0x1FF3, 'M', u'ωι'), - (0x1FF4, 'M', u'ώι'), - (0x1FF5, 'X'), - (0x1FF6, 'V'), - (0x1FF7, 'M', u'ῶι'), - (0x1FF8, 'M', u'ὸ'), - (0x1FF9, 'M', u'ό'), - (0x1FFA, 'M', u'ὼ'), - (0x1FFB, 'M', u'ώ'), - (0x1FFC, 'M', u'ωι'), - (0x1FFD, '3', u' ́'), - (0x1FFE, '3', u' ̔'), - (0x1FFF, 'X'), - (0x2000, '3', u' '), - (0x200B, 'I'), - (0x200C, 'D', u''), - (0x200E, 'X'), - (0x2010, 'V'), - (0x2011, 'M', u'‐'), - (0x2012, 'V'), - (0x2017, '3', u' ̳'), - (0x2018, 'V'), - (0x2024, 'X'), - (0x2027, 'V'), - (0x2028, 'X'), - (0x202F, '3', u' '), - (0x2030, 'V'), - (0x2033, 'M', u'′′'), - (0x2034, 'M', u'′′′'), - (0x2035, 'V'), - (0x2036, 'M', u'‵‵'), - (0x2037, 'M', u'‵‵‵'), - ] - -def _seg_21(): - return [ - (0x2038, 'V'), - (0x203C, '3', u'!!'), - (0x203D, 'V'), - (0x203E, '3', u' ̅'), - (0x203F, 'V'), - (0x2047, '3', u'??'), - (0x2048, '3', u'?!'), - (0x2049, '3', u'!?'), - (0x204A, 'V'), - (0x2057, 'M', u'′′′′'), - (0x2058, 'V'), - (0x205F, '3', u' '), - (0x2060, 'I'), - (0x2061, 'X'), - (0x2064, 'I'), - (0x2065, 'X'), - (0x2070, 'M', u'0'), - (0x2071, 'M', u'i'), - (0x2072, 'X'), - (0x2074, 'M', u'4'), - (0x2075, 'M', u'5'), - (0x2076, 'M', u'6'), - (0x2077, 'M', u'7'), - (0x2078, 'M', u'8'), - (0x2079, 'M', u'9'), - (0x207A, '3', u'+'), - (0x207B, 'M', u'−'), - (0x207C, '3', u'='), - (0x207D, '3', u'('), - (0x207E, '3', u')'), - (0x207F, 'M', u'n'), - (0x2080, 'M', u'0'), - (0x2081, 'M', u'1'), - (0x2082, 'M', u'2'), - (0x2083, 'M', u'3'), - (0x2084, 'M', u'4'), - (0x2085, 'M', u'5'), - (0x2086, 'M', u'6'), - (0x2087, 'M', u'7'), - (0x2088, 'M', u'8'), - (0x2089, 'M', u'9'), - (0x208A, '3', u'+'), - (0x208B, 'M', u'−'), - (0x208C, '3', u'='), - (0x208D, '3', u'('), - (0x208E, '3', u')'), - (0x208F, 'X'), - (0x2090, 'M', u'a'), - (0x2091, 'M', u'e'), - (0x2092, 'M', u'o'), - (0x2093, 'M', u'x'), - (0x2094, 'M', u'ə'), - (0x2095, 'M', u'h'), - (0x2096, 'M', u'k'), - (0x2097, 'M', u'l'), - (0x2098, 'M', u'm'), - (0x2099, 'M', u'n'), - (0x209A, 'M', u'p'), - (0x209B, 'M', u's'), - (0x209C, 'M', u't'), - (0x209D, 'X'), - (0x20A0, 'V'), - (0x20A8, 'M', u'rs'), - (0x20A9, 'V'), - (0x20C0, 'X'), - (0x20D0, 'V'), - (0x20F1, 'X'), - (0x2100, '3', u'a/c'), - (0x2101, '3', u'a/s'), - (0x2102, 'M', u'c'), - (0x2103, 'M', u'°c'), - (0x2104, 'V'), - (0x2105, '3', u'c/o'), - (0x2106, '3', u'c/u'), - (0x2107, 'M', u'ɛ'), - (0x2108, 'V'), - (0x2109, 'M', u'°f'), - (0x210A, 'M', u'g'), - (0x210B, 'M', u'h'), - (0x210F, 'M', u'ħ'), - (0x2110, 'M', u'i'), - (0x2112, 'M', u'l'), - (0x2114, 'V'), - (0x2115, 'M', u'n'), - (0x2116, 'M', u'no'), - (0x2117, 'V'), - (0x2119, 'M', u'p'), - (0x211A, 'M', u'q'), - (0x211B, 'M', u'r'), - (0x211E, 'V'), - (0x2120, 'M', u'sm'), - (0x2121, 'M', u'tel'), - (0x2122, 'M', u'tm'), - (0x2123, 'V'), - (0x2124, 'M', u'z'), - (0x2125, 'V'), - (0x2126, 'M', u'ω'), - (0x2127, 'V'), - (0x2128, 'M', u'z'), - (0x2129, 'V'), - ] - -def _seg_22(): - return [ - (0x212A, 'M', u'k'), - (0x212B, 'M', u'å'), - (0x212C, 'M', u'b'), - (0x212D, 'M', u'c'), - (0x212E, 'V'), - (0x212F, 'M', u'e'), - (0x2131, 'M', u'f'), - (0x2132, 'X'), - (0x2133, 'M', u'm'), - (0x2134, 'M', u'o'), - (0x2135, 'M', u'א'), - (0x2136, 'M', u'ב'), - (0x2137, 'M', u'ג'), - (0x2138, 'M', u'ד'), - (0x2139, 'M', u'i'), - (0x213A, 'V'), - (0x213B, 'M', u'fax'), - (0x213C, 'M', u'π'), - (0x213D, 'M', u'γ'), - (0x213F, 'M', u'π'), - (0x2140, 'M', u'∑'), - (0x2141, 'V'), - (0x2145, 'M', u'd'), - (0x2147, 'M', u'e'), - (0x2148, 'M', u'i'), - (0x2149, 'M', u'j'), - (0x214A, 'V'), - (0x2150, 'M', u'1⁄7'), - (0x2151, 'M', u'1⁄9'), - (0x2152, 'M', u'1⁄10'), - (0x2153, 'M', u'1⁄3'), - (0x2154, 'M', u'2⁄3'), - (0x2155, 'M', u'1⁄5'), - (0x2156, 'M', u'2⁄5'), - (0x2157, 'M', u'3⁄5'), - (0x2158, 'M', u'4⁄5'), - (0x2159, 'M', u'1⁄6'), - (0x215A, 'M', u'5⁄6'), - (0x215B, 'M', u'1⁄8'), - (0x215C, 'M', u'3⁄8'), - (0x215D, 'M', u'5⁄8'), - (0x215E, 'M', u'7⁄8'), - (0x215F, 'M', u'1⁄'), - (0x2160, 'M', u'i'), - (0x2161, 'M', u'ii'), - (0x2162, 'M', u'iii'), - (0x2163, 'M', u'iv'), - (0x2164, 'M', u'v'), - (0x2165, 'M', u'vi'), - (0x2166, 'M', u'vii'), - (0x2167, 'M', u'viii'), - (0x2168, 'M', u'ix'), - (0x2169, 'M', u'x'), - (0x216A, 'M', u'xi'), - (0x216B, 'M', u'xii'), - (0x216C, 'M', u'l'), - (0x216D, 'M', u'c'), - (0x216E, 'M', u'd'), - (0x216F, 'M', u'm'), - (0x2170, 'M', u'i'), - (0x2171, 'M', u'ii'), - (0x2172, 'M', u'iii'), - (0x2173, 'M', u'iv'), - (0x2174, 'M', u'v'), - (0x2175, 'M', u'vi'), - (0x2176, 'M', u'vii'), - (0x2177, 'M', u'viii'), - (0x2178, 'M', u'ix'), - (0x2179, 'M', u'x'), - (0x217A, 'M', u'xi'), - (0x217B, 'M', u'xii'), - (0x217C, 'M', u'l'), - (0x217D, 'M', u'c'), - (0x217E, 'M', u'd'), - (0x217F, 'M', u'm'), - (0x2180, 'V'), - (0x2183, 'X'), - (0x2184, 'V'), - (0x2189, 'M', u'0⁄3'), - (0x218A, 'V'), - (0x218C, 'X'), - (0x2190, 'V'), - (0x222C, 'M', u'∫∫'), - (0x222D, 'M', u'∫∫∫'), - (0x222E, 'V'), - (0x222F, 'M', u'∮∮'), - (0x2230, 'M', u'∮∮∮'), - (0x2231, 'V'), - (0x2260, '3'), - (0x2261, 'V'), - (0x226E, '3'), - (0x2270, 'V'), - (0x2329, 'M', u'〈'), - (0x232A, 'M', u'〉'), - (0x232B, 'V'), - (0x2427, 'X'), - (0x2440, 'V'), - (0x244B, 'X'), - (0x2460, 'M', u'1'), - (0x2461, 'M', u'2'), - ] - -def _seg_23(): - return [ - (0x2462, 'M', u'3'), - (0x2463, 'M', u'4'), - (0x2464, 'M', u'5'), - (0x2465, 'M', u'6'), - (0x2466, 'M', u'7'), - (0x2467, 'M', u'8'), - (0x2468, 'M', u'9'), - (0x2469, 'M', u'10'), - (0x246A, 'M', u'11'), - (0x246B, 'M', u'12'), - (0x246C, 'M', u'13'), - (0x246D, 'M', u'14'), - (0x246E, 'M', u'15'), - (0x246F, 'M', u'16'), - (0x2470, 'M', u'17'), - (0x2471, 'M', u'18'), - (0x2472, 'M', u'19'), - (0x2473, 'M', u'20'), - (0x2474, '3', u'(1)'), - (0x2475, '3', u'(2)'), - (0x2476, '3', u'(3)'), - (0x2477, '3', u'(4)'), - (0x2478, '3', u'(5)'), - (0x2479, '3', u'(6)'), - (0x247A, '3', u'(7)'), - (0x247B, '3', u'(8)'), - (0x247C, '3', u'(9)'), - (0x247D, '3', u'(10)'), - (0x247E, '3', u'(11)'), - (0x247F, '3', u'(12)'), - (0x2480, '3', u'(13)'), - (0x2481, '3', u'(14)'), - (0x2482, '3', u'(15)'), - (0x2483, '3', u'(16)'), - (0x2484, '3', u'(17)'), - (0x2485, '3', u'(18)'), - (0x2486, '3', u'(19)'), - (0x2487, '3', u'(20)'), - (0x2488, 'X'), - (0x249C, '3', u'(a)'), - (0x249D, '3', u'(b)'), - (0x249E, '3', u'(c)'), - (0x249F, '3', u'(d)'), - (0x24A0, '3', u'(e)'), - (0x24A1, '3', u'(f)'), - (0x24A2, '3', u'(g)'), - (0x24A3, '3', u'(h)'), - (0x24A4, '3', u'(i)'), - (0x24A5, '3', u'(j)'), - (0x24A6, '3', u'(k)'), - (0x24A7, '3', u'(l)'), - (0x24A8, '3', u'(m)'), - (0x24A9, '3', u'(n)'), - (0x24AA, '3', u'(o)'), - (0x24AB, '3', u'(p)'), - (0x24AC, '3', u'(q)'), - (0x24AD, '3', u'(r)'), - (0x24AE, '3', u'(s)'), - (0x24AF, '3', u'(t)'), - (0x24B0, '3', u'(u)'), - (0x24B1, '3', u'(v)'), - (0x24B2, '3', u'(w)'), - (0x24B3, '3', u'(x)'), - (0x24B4, '3', u'(y)'), - (0x24B5, '3', u'(z)'), - (0x24B6, 'M', u'a'), - (0x24B7, 'M', u'b'), - (0x24B8, 'M', u'c'), - (0x24B9, 'M', u'd'), - (0x24BA, 'M', u'e'), - (0x24BB, 'M', u'f'), - (0x24BC, 'M', u'g'), - (0x24BD, 'M', u'h'), - (0x24BE, 'M', u'i'), - (0x24BF, 'M', u'j'), - (0x24C0, 'M', u'k'), - (0x24C1, 'M', u'l'), - (0x24C2, 'M', u'm'), - (0x24C3, 'M', u'n'), - (0x24C4, 'M', u'o'), - (0x24C5, 'M', u'p'), - (0x24C6, 'M', u'q'), - (0x24C7, 'M', u'r'), - (0x24C8, 'M', u's'), - (0x24C9, 'M', u't'), - (0x24CA, 'M', u'u'), - (0x24CB, 'M', u'v'), - (0x24CC, 'M', u'w'), - (0x24CD, 'M', u'x'), - (0x24CE, 'M', u'y'), - (0x24CF, 'M', u'z'), - (0x24D0, 'M', u'a'), - (0x24D1, 'M', u'b'), - (0x24D2, 'M', u'c'), - (0x24D3, 'M', u'd'), - (0x24D4, 'M', u'e'), - (0x24D5, 'M', u'f'), - (0x24D6, 'M', u'g'), - (0x24D7, 'M', u'h'), - (0x24D8, 'M', u'i'), - ] - -def _seg_24(): - return [ - (0x24D9, 'M', u'j'), - (0x24DA, 'M', u'k'), - (0x24DB, 'M', u'l'), - (0x24DC, 'M', u'm'), - (0x24DD, 'M', u'n'), - (0x24DE, 'M', u'o'), - (0x24DF, 'M', u'p'), - (0x24E0, 'M', u'q'), - (0x24E1, 'M', u'r'), - (0x24E2, 'M', u's'), - (0x24E3, 'M', u't'), - (0x24E4, 'M', u'u'), - (0x24E5, 'M', u'v'), - (0x24E6, 'M', u'w'), - (0x24E7, 'M', u'x'), - (0x24E8, 'M', u'y'), - (0x24E9, 'M', u'z'), - (0x24EA, 'M', u'0'), - (0x24EB, 'V'), - (0x2A0C, 'M', u'∫∫∫∫'), - (0x2A0D, 'V'), - (0x2A74, '3', u'::='), - (0x2A75, '3', u'=='), - (0x2A76, '3', u'==='), - (0x2A77, 'V'), - (0x2ADC, 'M', u'⫝̸'), - (0x2ADD, 'V'), - (0x2B74, 'X'), - (0x2B76, 'V'), - (0x2B96, 'X'), - (0x2B98, 'V'), - (0x2BC9, 'X'), - (0x2BCA, 'V'), - (0x2BFF, 'X'), - (0x2C00, 'M', u'ⰰ'), - (0x2C01, 'M', u'ⰱ'), - (0x2C02, 'M', u'ⰲ'), - (0x2C03, 'M', u'ⰳ'), - (0x2C04, 'M', u'ⰴ'), - (0x2C05, 'M', u'ⰵ'), - (0x2C06, 'M', u'ⰶ'), - (0x2C07, 'M', u'ⰷ'), - (0x2C08, 'M', u'ⰸ'), - (0x2C09, 'M', u'ⰹ'), - (0x2C0A, 'M', u'ⰺ'), - (0x2C0B, 'M', u'ⰻ'), - (0x2C0C, 'M', u'ⰼ'), - (0x2C0D, 'M', u'ⰽ'), - (0x2C0E, 'M', u'ⰾ'), - (0x2C0F, 'M', u'ⰿ'), - (0x2C10, 'M', u'ⱀ'), - (0x2C11, 'M', u'ⱁ'), - (0x2C12, 'M', u'ⱂ'), - (0x2C13, 'M', u'ⱃ'), - (0x2C14, 'M', u'ⱄ'), - (0x2C15, 'M', u'ⱅ'), - (0x2C16, 'M', u'ⱆ'), - (0x2C17, 'M', u'ⱇ'), - (0x2C18, 'M', u'ⱈ'), - (0x2C19, 'M', u'ⱉ'), - (0x2C1A, 'M', u'ⱊ'), - (0x2C1B, 'M', u'ⱋ'), - (0x2C1C, 'M', u'ⱌ'), - (0x2C1D, 'M', u'ⱍ'), - (0x2C1E, 'M', u'ⱎ'), - (0x2C1F, 'M', u'ⱏ'), - (0x2C20, 'M', u'ⱐ'), - (0x2C21, 'M', u'ⱑ'), - (0x2C22, 'M', u'ⱒ'), - (0x2C23, 'M', u'ⱓ'), - (0x2C24, 'M', u'ⱔ'), - (0x2C25, 'M', u'ⱕ'), - (0x2C26, 'M', u'ⱖ'), - (0x2C27, 'M', u'ⱗ'), - (0x2C28, 'M', u'ⱘ'), - (0x2C29, 'M', u'ⱙ'), - (0x2C2A, 'M', u'ⱚ'), - (0x2C2B, 'M', u'ⱛ'), - (0x2C2C, 'M', u'ⱜ'), - (0x2C2D, 'M', u'ⱝ'), - (0x2C2E, 'M', u'ⱞ'), - (0x2C2F, 'X'), - (0x2C30, 'V'), - (0x2C5F, 'X'), - (0x2C60, 'M', u'ⱡ'), - (0x2C61, 'V'), - (0x2C62, 'M', u'ɫ'), - (0x2C63, 'M', u'ᵽ'), - (0x2C64, 'M', u'ɽ'), - (0x2C65, 'V'), - (0x2C67, 'M', u'ⱨ'), - (0x2C68, 'V'), - (0x2C69, 'M', u'ⱪ'), - (0x2C6A, 'V'), - (0x2C6B, 'M', u'ⱬ'), - (0x2C6C, 'V'), - (0x2C6D, 'M', u'ɑ'), - (0x2C6E, 'M', u'ɱ'), - (0x2C6F, 'M', u'ɐ'), - (0x2C70, 'M', u'ɒ'), - ] - -def _seg_25(): - return [ - (0x2C71, 'V'), - (0x2C72, 'M', u'ⱳ'), - (0x2C73, 'V'), - (0x2C75, 'M', u'ⱶ'), - (0x2C76, 'V'), - (0x2C7C, 'M', u'j'), - (0x2C7D, 'M', u'v'), - (0x2C7E, 'M', u'ȿ'), - (0x2C7F, 'M', u'ɀ'), - (0x2C80, 'M', u'ⲁ'), - (0x2C81, 'V'), - (0x2C82, 'M', u'ⲃ'), - (0x2C83, 'V'), - (0x2C84, 'M', u'ⲅ'), - (0x2C85, 'V'), - (0x2C86, 'M', u'ⲇ'), - (0x2C87, 'V'), - (0x2C88, 'M', u'ⲉ'), - (0x2C89, 'V'), - (0x2C8A, 'M', u'ⲋ'), - (0x2C8B, 'V'), - (0x2C8C, 'M', u'ⲍ'), - (0x2C8D, 'V'), - (0x2C8E, 'M', u'ⲏ'), - (0x2C8F, 'V'), - (0x2C90, 'M', u'ⲑ'), - (0x2C91, 'V'), - (0x2C92, 'M', u'ⲓ'), - (0x2C93, 'V'), - (0x2C94, 'M', u'ⲕ'), - (0x2C95, 'V'), - (0x2C96, 'M', u'ⲗ'), - (0x2C97, 'V'), - (0x2C98, 'M', u'ⲙ'), - (0x2C99, 'V'), - (0x2C9A, 'M', u'ⲛ'), - (0x2C9B, 'V'), - (0x2C9C, 'M', u'ⲝ'), - (0x2C9D, 'V'), - (0x2C9E, 'M', u'ⲟ'), - (0x2C9F, 'V'), - (0x2CA0, 'M', u'ⲡ'), - (0x2CA1, 'V'), - (0x2CA2, 'M', u'ⲣ'), - (0x2CA3, 'V'), - (0x2CA4, 'M', u'ⲥ'), - (0x2CA5, 'V'), - (0x2CA6, 'M', u'ⲧ'), - (0x2CA7, 'V'), - (0x2CA8, 'M', u'ⲩ'), - (0x2CA9, 'V'), - (0x2CAA, 'M', u'ⲫ'), - (0x2CAB, 'V'), - (0x2CAC, 'M', u'ⲭ'), - (0x2CAD, 'V'), - (0x2CAE, 'M', u'ⲯ'), - (0x2CAF, 'V'), - (0x2CB0, 'M', u'ⲱ'), - (0x2CB1, 'V'), - (0x2CB2, 'M', u'ⲳ'), - (0x2CB3, 'V'), - (0x2CB4, 'M', u'ⲵ'), - (0x2CB5, 'V'), - (0x2CB6, 'M', u'ⲷ'), - (0x2CB7, 'V'), - (0x2CB8, 'M', u'ⲹ'), - (0x2CB9, 'V'), - (0x2CBA, 'M', u'ⲻ'), - (0x2CBB, 'V'), - (0x2CBC, 'M', u'ⲽ'), - (0x2CBD, 'V'), - (0x2CBE, 'M', u'ⲿ'), - (0x2CBF, 'V'), - (0x2CC0, 'M', u'ⳁ'), - (0x2CC1, 'V'), - (0x2CC2, 'M', u'ⳃ'), - (0x2CC3, 'V'), - (0x2CC4, 'M', u'ⳅ'), - (0x2CC5, 'V'), - (0x2CC6, 'M', u'ⳇ'), - (0x2CC7, 'V'), - (0x2CC8, 'M', u'ⳉ'), - (0x2CC9, 'V'), - (0x2CCA, 'M', u'ⳋ'), - (0x2CCB, 'V'), - (0x2CCC, 'M', u'ⳍ'), - (0x2CCD, 'V'), - (0x2CCE, 'M', u'ⳏ'), - (0x2CCF, 'V'), - (0x2CD0, 'M', u'ⳑ'), - (0x2CD1, 'V'), - (0x2CD2, 'M', u'ⳓ'), - (0x2CD3, 'V'), - (0x2CD4, 'M', u'ⳕ'), - (0x2CD5, 'V'), - (0x2CD6, 'M', u'ⳗ'), - (0x2CD7, 'V'), - (0x2CD8, 'M', u'ⳙ'), - (0x2CD9, 'V'), - (0x2CDA, 'M', u'ⳛ'), - ] - -def _seg_26(): - return [ - (0x2CDB, 'V'), - (0x2CDC, 'M', u'ⳝ'), - (0x2CDD, 'V'), - (0x2CDE, 'M', u'ⳟ'), - (0x2CDF, 'V'), - (0x2CE0, 'M', u'ⳡ'), - (0x2CE1, 'V'), - (0x2CE2, 'M', u'ⳣ'), - (0x2CE3, 'V'), - (0x2CEB, 'M', u'ⳬ'), - (0x2CEC, 'V'), - (0x2CED, 'M', u'ⳮ'), - (0x2CEE, 'V'), - (0x2CF2, 'M', u'ⳳ'), - (0x2CF3, 'V'), - (0x2CF4, 'X'), - (0x2CF9, 'V'), - (0x2D26, 'X'), - (0x2D27, 'V'), - (0x2D28, 'X'), - (0x2D2D, 'V'), - (0x2D2E, 'X'), - (0x2D30, 'V'), - (0x2D68, 'X'), - (0x2D6F, 'M', u'ⵡ'), - (0x2D70, 'V'), - (0x2D71, 'X'), - (0x2D7F, 'V'), - (0x2D97, 'X'), - (0x2DA0, 'V'), - (0x2DA7, 'X'), - (0x2DA8, 'V'), - (0x2DAF, 'X'), - (0x2DB0, 'V'), - (0x2DB7, 'X'), - (0x2DB8, 'V'), - (0x2DBF, 'X'), - (0x2DC0, 'V'), - (0x2DC7, 'X'), - (0x2DC8, 'V'), - (0x2DCF, 'X'), - (0x2DD0, 'V'), - (0x2DD7, 'X'), - (0x2DD8, 'V'), - (0x2DDF, 'X'), - (0x2DE0, 'V'), - (0x2E4F, 'X'), - (0x2E80, 'V'), - (0x2E9A, 'X'), - (0x2E9B, 'V'), - (0x2E9F, 'M', u'母'), - (0x2EA0, 'V'), - (0x2EF3, 'M', u'龟'), - (0x2EF4, 'X'), - (0x2F00, 'M', u'一'), - (0x2F01, 'M', u'丨'), - (0x2F02, 'M', u'丶'), - (0x2F03, 'M', u'丿'), - (0x2F04, 'M', u'乙'), - (0x2F05, 'M', u'亅'), - (0x2F06, 'M', u'二'), - (0x2F07, 'M', u'亠'), - (0x2F08, 'M', u'人'), - (0x2F09, 'M', u'儿'), - (0x2F0A, 'M', u'入'), - (0x2F0B, 'M', u'八'), - (0x2F0C, 'M', u'冂'), - (0x2F0D, 'M', u'冖'), - (0x2F0E, 'M', u'冫'), - (0x2F0F, 'M', u'几'), - (0x2F10, 'M', u'凵'), - (0x2F11, 'M', u'刀'), - (0x2F12, 'M', u'力'), - (0x2F13, 'M', u'勹'), - (0x2F14, 'M', u'匕'), - (0x2F15, 'M', u'匚'), - (0x2F16, 'M', u'匸'), - (0x2F17, 'M', u'十'), - (0x2F18, 'M', u'卜'), - (0x2F19, 'M', u'卩'), - (0x2F1A, 'M', u'厂'), - (0x2F1B, 'M', u'厶'), - (0x2F1C, 'M', u'又'), - (0x2F1D, 'M', u'口'), - (0x2F1E, 'M', u'囗'), - (0x2F1F, 'M', u'土'), - (0x2F20, 'M', u'士'), - (0x2F21, 'M', u'夂'), - (0x2F22, 'M', u'夊'), - (0x2F23, 'M', u'夕'), - (0x2F24, 'M', u'大'), - (0x2F25, 'M', u'女'), - (0x2F26, 'M', u'子'), - (0x2F27, 'M', u'宀'), - (0x2F28, 'M', u'寸'), - (0x2F29, 'M', u'小'), - (0x2F2A, 'M', u'尢'), - (0x2F2B, 'M', u'尸'), - (0x2F2C, 'M', u'屮'), - (0x2F2D, 'M', u'山'), - ] - -def _seg_27(): - return [ - (0x2F2E, 'M', u'巛'), - (0x2F2F, 'M', u'工'), - (0x2F30, 'M', u'己'), - (0x2F31, 'M', u'巾'), - (0x2F32, 'M', u'干'), - (0x2F33, 'M', u'幺'), - (0x2F34, 'M', u'广'), - (0x2F35, 'M', u'廴'), - (0x2F36, 'M', u'廾'), - (0x2F37, 'M', u'弋'), - (0x2F38, 'M', u'弓'), - (0x2F39, 'M', u'彐'), - (0x2F3A, 'M', u'彡'), - (0x2F3B, 'M', u'彳'), - (0x2F3C, 'M', u'心'), - (0x2F3D, 'M', u'戈'), - (0x2F3E, 'M', u'戶'), - (0x2F3F, 'M', u'手'), - (0x2F40, 'M', u'支'), - (0x2F41, 'M', u'攴'), - (0x2F42, 'M', u'文'), - (0x2F43, 'M', u'斗'), - (0x2F44, 'M', u'斤'), - (0x2F45, 'M', u'方'), - (0x2F46, 'M', u'无'), - (0x2F47, 'M', u'日'), - (0x2F48, 'M', u'曰'), - (0x2F49, 'M', u'月'), - (0x2F4A, 'M', u'木'), - (0x2F4B, 'M', u'欠'), - (0x2F4C, 'M', u'止'), - (0x2F4D, 'M', u'歹'), - (0x2F4E, 'M', u'殳'), - (0x2F4F, 'M', u'毋'), - (0x2F50, 'M', u'比'), - (0x2F51, 'M', u'毛'), - (0x2F52, 'M', u'氏'), - (0x2F53, 'M', u'气'), - (0x2F54, 'M', u'水'), - (0x2F55, 'M', u'火'), - (0x2F56, 'M', u'爪'), - (0x2F57, 'M', u'父'), - (0x2F58, 'M', u'爻'), - (0x2F59, 'M', u'爿'), - (0x2F5A, 'M', u'片'), - (0x2F5B, 'M', u'牙'), - (0x2F5C, 'M', u'牛'), - (0x2F5D, 'M', u'犬'), - (0x2F5E, 'M', u'玄'), - (0x2F5F, 'M', u'玉'), - (0x2F60, 'M', u'瓜'), - (0x2F61, 'M', u'瓦'), - (0x2F62, 'M', u'甘'), - (0x2F63, 'M', u'生'), - (0x2F64, 'M', u'用'), - (0x2F65, 'M', u'田'), - (0x2F66, 'M', u'疋'), - (0x2F67, 'M', u'疒'), - (0x2F68, 'M', u'癶'), - (0x2F69, 'M', u'白'), - (0x2F6A, 'M', u'皮'), - (0x2F6B, 'M', u'皿'), - (0x2F6C, 'M', u'目'), - (0x2F6D, 'M', u'矛'), - (0x2F6E, 'M', u'矢'), - (0x2F6F, 'M', u'石'), - (0x2F70, 'M', u'示'), - (0x2F71, 'M', u'禸'), - (0x2F72, 'M', u'禾'), - (0x2F73, 'M', u'穴'), - (0x2F74, 'M', u'立'), - (0x2F75, 'M', u'竹'), - (0x2F76, 'M', u'米'), - (0x2F77, 'M', u'糸'), - (0x2F78, 'M', u'缶'), - (0x2F79, 'M', u'网'), - (0x2F7A, 'M', u'羊'), - (0x2F7B, 'M', u'羽'), - (0x2F7C, 'M', u'老'), - (0x2F7D, 'M', u'而'), - (0x2F7E, 'M', u'耒'), - (0x2F7F, 'M', u'耳'), - (0x2F80, 'M', u'聿'), - (0x2F81, 'M', u'肉'), - (0x2F82, 'M', u'臣'), - (0x2F83, 'M', u'自'), - (0x2F84, 'M', u'至'), - (0x2F85, 'M', u'臼'), - (0x2F86, 'M', u'舌'), - (0x2F87, 'M', u'舛'), - (0x2F88, 'M', u'舟'), - (0x2F89, 'M', u'艮'), - (0x2F8A, 'M', u'色'), - (0x2F8B, 'M', u'艸'), - (0x2F8C, 'M', u'虍'), - (0x2F8D, 'M', u'虫'), - (0x2F8E, 'M', u'血'), - (0x2F8F, 'M', u'行'), - (0x2F90, 'M', u'衣'), - (0x2F91, 'M', u'襾'), - ] - -def _seg_28(): - return [ - (0x2F92, 'M', u'見'), - (0x2F93, 'M', u'角'), - (0x2F94, 'M', u'言'), - (0x2F95, 'M', u'谷'), - (0x2F96, 'M', u'豆'), - (0x2F97, 'M', u'豕'), - (0x2F98, 'M', u'豸'), - (0x2F99, 'M', u'貝'), - (0x2F9A, 'M', u'赤'), - (0x2F9B, 'M', u'走'), - (0x2F9C, 'M', u'足'), - (0x2F9D, 'M', u'身'), - (0x2F9E, 'M', u'車'), - (0x2F9F, 'M', u'辛'), - (0x2FA0, 'M', u'辰'), - (0x2FA1, 'M', u'辵'), - (0x2FA2, 'M', u'邑'), - (0x2FA3, 'M', u'酉'), - (0x2FA4, 'M', u'釆'), - (0x2FA5, 'M', u'里'), - (0x2FA6, 'M', u'金'), - (0x2FA7, 'M', u'長'), - (0x2FA8, 'M', u'門'), - (0x2FA9, 'M', u'阜'), - (0x2FAA, 'M', u'隶'), - (0x2FAB, 'M', u'隹'), - (0x2FAC, 'M', u'雨'), - (0x2FAD, 'M', u'靑'), - (0x2FAE, 'M', u'非'), - (0x2FAF, 'M', u'面'), - (0x2FB0, 'M', u'革'), - (0x2FB1, 'M', u'韋'), - (0x2FB2, 'M', u'韭'), - (0x2FB3, 'M', u'音'), - (0x2FB4, 'M', u'頁'), - (0x2FB5, 'M', u'風'), - (0x2FB6, 'M', u'飛'), - (0x2FB7, 'M', u'食'), - (0x2FB8, 'M', u'首'), - (0x2FB9, 'M', u'香'), - (0x2FBA, 'M', u'馬'), - (0x2FBB, 'M', u'骨'), - (0x2FBC, 'M', u'高'), - (0x2FBD, 'M', u'髟'), - (0x2FBE, 'M', u'鬥'), - (0x2FBF, 'M', u'鬯'), - (0x2FC0, 'M', u'鬲'), - (0x2FC1, 'M', u'鬼'), - (0x2FC2, 'M', u'魚'), - (0x2FC3, 'M', u'鳥'), - (0x2FC4, 'M', u'鹵'), - (0x2FC5, 'M', u'鹿'), - (0x2FC6, 'M', u'麥'), - (0x2FC7, 'M', u'麻'), - (0x2FC8, 'M', u'黃'), - (0x2FC9, 'M', u'黍'), - (0x2FCA, 'M', u'黑'), - (0x2FCB, 'M', u'黹'), - (0x2FCC, 'M', u'黽'), - (0x2FCD, 'M', u'鼎'), - (0x2FCE, 'M', u'鼓'), - (0x2FCF, 'M', u'鼠'), - (0x2FD0, 'M', u'鼻'), - (0x2FD1, 'M', u'齊'), - (0x2FD2, 'M', u'齒'), - (0x2FD3, 'M', u'龍'), - (0x2FD4, 'M', u'龜'), - (0x2FD5, 'M', u'龠'), - (0x2FD6, 'X'), - (0x3000, '3', u' '), - (0x3001, 'V'), - (0x3002, 'M', u'.'), - (0x3003, 'V'), - (0x3036, 'M', u'〒'), - (0x3037, 'V'), - (0x3038, 'M', u'十'), - (0x3039, 'M', u'卄'), - (0x303A, 'M', u'卅'), - (0x303B, 'V'), - (0x3040, 'X'), - (0x3041, 'V'), - (0x3097, 'X'), - (0x3099, 'V'), - (0x309B, '3', u' ゙'), - (0x309C, '3', u' ゚'), - (0x309D, 'V'), - (0x309F, 'M', u'より'), - (0x30A0, 'V'), - (0x30FF, 'M', u'コト'), - (0x3100, 'X'), - (0x3105, 'V'), - (0x3130, 'X'), - (0x3131, 'M', u'ᄀ'), - (0x3132, 'M', u'ᄁ'), - (0x3133, 'M', u'ᆪ'), - (0x3134, 'M', u'ᄂ'), - (0x3135, 'M', u'ᆬ'), - (0x3136, 'M', u'ᆭ'), - (0x3137, 'M', u'ᄃ'), - (0x3138, 'M', u'ᄄ'), - ] - -def _seg_29(): - return [ - (0x3139, 'M', u'ᄅ'), - (0x313A, 'M', u'ᆰ'), - (0x313B, 'M', u'ᆱ'), - (0x313C, 'M', u'ᆲ'), - (0x313D, 'M', u'ᆳ'), - (0x313E, 'M', u'ᆴ'), - (0x313F, 'M', u'ᆵ'), - (0x3140, 'M', u'ᄚ'), - (0x3141, 'M', u'ᄆ'), - (0x3142, 'M', u'ᄇ'), - (0x3143, 'M', u'ᄈ'), - (0x3144, 'M', u'ᄡ'), - (0x3145, 'M', u'ᄉ'), - (0x3146, 'M', u'ᄊ'), - (0x3147, 'M', u'ᄋ'), - (0x3148, 'M', u'ᄌ'), - (0x3149, 'M', u'ᄍ'), - (0x314A, 'M', u'ᄎ'), - (0x314B, 'M', u'ᄏ'), - (0x314C, 'M', u'ᄐ'), - (0x314D, 'M', u'ᄑ'), - (0x314E, 'M', u'ᄒ'), - (0x314F, 'M', u'ᅡ'), - (0x3150, 'M', u'ᅢ'), - (0x3151, 'M', u'ᅣ'), - (0x3152, 'M', u'ᅤ'), - (0x3153, 'M', u'ᅥ'), - (0x3154, 'M', u'ᅦ'), - (0x3155, 'M', u'ᅧ'), - (0x3156, 'M', u'ᅨ'), - (0x3157, 'M', u'ᅩ'), - (0x3158, 'M', u'ᅪ'), - (0x3159, 'M', u'ᅫ'), - (0x315A, 'M', u'ᅬ'), - (0x315B, 'M', u'ᅭ'), - (0x315C, 'M', u'ᅮ'), - (0x315D, 'M', u'ᅯ'), - (0x315E, 'M', u'ᅰ'), - (0x315F, 'M', u'ᅱ'), - (0x3160, 'M', u'ᅲ'), - (0x3161, 'M', u'ᅳ'), - (0x3162, 'M', u'ᅴ'), - (0x3163, 'M', u'ᅵ'), - (0x3164, 'X'), - (0x3165, 'M', u'ᄔ'), - (0x3166, 'M', u'ᄕ'), - (0x3167, 'M', u'ᇇ'), - (0x3168, 'M', u'ᇈ'), - (0x3169, 'M', u'ᇌ'), - (0x316A, 'M', u'ᇎ'), - (0x316B, 'M', u'ᇓ'), - (0x316C, 'M', u'ᇗ'), - (0x316D, 'M', u'ᇙ'), - (0x316E, 'M', u'ᄜ'), - (0x316F, 'M', u'ᇝ'), - (0x3170, 'M', u'ᇟ'), - (0x3171, 'M', u'ᄝ'), - (0x3172, 'M', u'ᄞ'), - (0x3173, 'M', u'ᄠ'), - (0x3174, 'M', u'ᄢ'), - (0x3175, 'M', u'ᄣ'), - (0x3176, 'M', u'ᄧ'), - (0x3177, 'M', u'ᄩ'), - (0x3178, 'M', u'ᄫ'), - (0x3179, 'M', u'ᄬ'), - (0x317A, 'M', u'ᄭ'), - (0x317B, 'M', u'ᄮ'), - (0x317C, 'M', u'ᄯ'), - (0x317D, 'M', u'ᄲ'), - (0x317E, 'M', u'ᄶ'), - (0x317F, 'M', u'ᅀ'), - (0x3180, 'M', u'ᅇ'), - (0x3181, 'M', u'ᅌ'), - (0x3182, 'M', u'ᇱ'), - (0x3183, 'M', u'ᇲ'), - (0x3184, 'M', u'ᅗ'), - (0x3185, 'M', u'ᅘ'), - (0x3186, 'M', u'ᅙ'), - (0x3187, 'M', u'ᆄ'), - (0x3188, 'M', u'ᆅ'), - (0x3189, 'M', u'ᆈ'), - (0x318A, 'M', u'ᆑ'), - (0x318B, 'M', u'ᆒ'), - (0x318C, 'M', u'ᆔ'), - (0x318D, 'M', u'ᆞ'), - (0x318E, 'M', u'ᆡ'), - (0x318F, 'X'), - (0x3190, 'V'), - (0x3192, 'M', u'一'), - (0x3193, 'M', u'二'), - (0x3194, 'M', u'三'), - (0x3195, 'M', u'四'), - (0x3196, 'M', u'上'), - (0x3197, 'M', u'中'), - (0x3198, 'M', u'下'), - (0x3199, 'M', u'甲'), - (0x319A, 'M', u'乙'), - (0x319B, 'M', u'丙'), - (0x319C, 'M', u'丁'), - (0x319D, 'M', u'天'), - ] - -def _seg_30(): - return [ - (0x319E, 'M', u'地'), - (0x319F, 'M', u'人'), - (0x31A0, 'V'), - (0x31BB, 'X'), - (0x31C0, 'V'), - (0x31E4, 'X'), - (0x31F0, 'V'), - (0x3200, '3', u'(ᄀ)'), - (0x3201, '3', u'(ᄂ)'), - (0x3202, '3', u'(ᄃ)'), - (0x3203, '3', u'(ᄅ)'), - (0x3204, '3', u'(ᄆ)'), - (0x3205, '3', u'(ᄇ)'), - (0x3206, '3', u'(ᄉ)'), - (0x3207, '3', u'(ᄋ)'), - (0x3208, '3', u'(ᄌ)'), - (0x3209, '3', u'(ᄎ)'), - (0x320A, '3', u'(ᄏ)'), - (0x320B, '3', u'(ᄐ)'), - (0x320C, '3', u'(ᄑ)'), - (0x320D, '3', u'(ᄒ)'), - (0x320E, '3', u'(가)'), - (0x320F, '3', u'(나)'), - (0x3210, '3', u'(다)'), - (0x3211, '3', u'(라)'), - (0x3212, '3', u'(마)'), - (0x3213, '3', u'(바)'), - (0x3214, '3', u'(사)'), - (0x3215, '3', u'(아)'), - (0x3216, '3', u'(자)'), - (0x3217, '3', u'(차)'), - (0x3218, '3', u'(카)'), - (0x3219, '3', u'(타)'), - (0x321A, '3', u'(파)'), - (0x321B, '3', u'(하)'), - (0x321C, '3', u'(주)'), - (0x321D, '3', u'(오전)'), - (0x321E, '3', u'(오후)'), - (0x321F, 'X'), - (0x3220, '3', u'(一)'), - (0x3221, '3', u'(二)'), - (0x3222, '3', u'(三)'), - (0x3223, '3', u'(四)'), - (0x3224, '3', u'(五)'), - (0x3225, '3', u'(六)'), - (0x3226, '3', u'(七)'), - (0x3227, '3', u'(八)'), - (0x3228, '3', u'(九)'), - (0x3229, '3', u'(十)'), - (0x322A, '3', u'(月)'), - (0x322B, '3', u'(火)'), - (0x322C, '3', u'(水)'), - (0x322D, '3', u'(木)'), - (0x322E, '3', u'(金)'), - (0x322F, '3', u'(土)'), - (0x3230, '3', u'(日)'), - (0x3231, '3', u'(株)'), - (0x3232, '3', u'(有)'), - (0x3233, '3', u'(社)'), - (0x3234, '3', u'(名)'), - (0x3235, '3', u'(特)'), - (0x3236, '3', u'(財)'), - (0x3237, '3', u'(祝)'), - (0x3238, '3', u'(労)'), - (0x3239, '3', u'(代)'), - (0x323A, '3', u'(呼)'), - (0x323B, '3', u'(学)'), - (0x323C, '3', u'(監)'), - (0x323D, '3', u'(企)'), - (0x323E, '3', u'(資)'), - (0x323F, '3', u'(協)'), - (0x3240, '3', u'(祭)'), - (0x3241, '3', u'(休)'), - (0x3242, '3', u'(自)'), - (0x3243, '3', u'(至)'), - (0x3244, 'M', u'問'), - (0x3245, 'M', u'幼'), - (0x3246, 'M', u'文'), - (0x3247, 'M', u'箏'), - (0x3248, 'V'), - (0x3250, 'M', u'pte'), - (0x3251, 'M', u'21'), - (0x3252, 'M', u'22'), - (0x3253, 'M', u'23'), - (0x3254, 'M', u'24'), - (0x3255, 'M', u'25'), - (0x3256, 'M', u'26'), - (0x3257, 'M', u'27'), - (0x3258, 'M', u'28'), - (0x3259, 'M', u'29'), - (0x325A, 'M', u'30'), - (0x325B, 'M', u'31'), - (0x325C, 'M', u'32'), - (0x325D, 'M', u'33'), - (0x325E, 'M', u'34'), - (0x325F, 'M', u'35'), - (0x3260, 'M', u'ᄀ'), - (0x3261, 'M', u'ᄂ'), - (0x3262, 'M', u'ᄃ'), - (0x3263, 'M', u'ᄅ'), - ] - -def _seg_31(): - return [ - (0x3264, 'M', u'ᄆ'), - (0x3265, 'M', u'ᄇ'), - (0x3266, 'M', u'ᄉ'), - (0x3267, 'M', u'ᄋ'), - (0x3268, 'M', u'ᄌ'), - (0x3269, 'M', u'ᄎ'), - (0x326A, 'M', u'ᄏ'), - (0x326B, 'M', u'ᄐ'), - (0x326C, 'M', u'ᄑ'), - (0x326D, 'M', u'ᄒ'), - (0x326E, 'M', u'가'), - (0x326F, 'M', u'나'), - (0x3270, 'M', u'다'), - (0x3271, 'M', u'라'), - (0x3272, 'M', u'마'), - (0x3273, 'M', u'바'), - (0x3274, 'M', u'사'), - (0x3275, 'M', u'아'), - (0x3276, 'M', u'자'), - (0x3277, 'M', u'차'), - (0x3278, 'M', u'카'), - (0x3279, 'M', u'타'), - (0x327A, 'M', u'파'), - (0x327B, 'M', u'하'), - (0x327C, 'M', u'참고'), - (0x327D, 'M', u'주의'), - (0x327E, 'M', u'우'), - (0x327F, 'V'), - (0x3280, 'M', u'一'), - (0x3281, 'M', u'二'), - (0x3282, 'M', u'三'), - (0x3283, 'M', u'四'), - (0x3284, 'M', u'五'), - (0x3285, 'M', u'六'), - (0x3286, 'M', u'七'), - (0x3287, 'M', u'八'), - (0x3288, 'M', u'九'), - (0x3289, 'M', u'十'), - (0x328A, 'M', u'月'), - (0x328B, 'M', u'火'), - (0x328C, 'M', u'水'), - (0x328D, 'M', u'木'), - (0x328E, 'M', u'金'), - (0x328F, 'M', u'土'), - (0x3290, 'M', u'日'), - (0x3291, 'M', u'株'), - (0x3292, 'M', u'有'), - (0x3293, 'M', u'社'), - (0x3294, 'M', u'名'), - (0x3295, 'M', u'特'), - (0x3296, 'M', u'財'), - (0x3297, 'M', u'祝'), - (0x3298, 'M', u'労'), - (0x3299, 'M', u'秘'), - (0x329A, 'M', u'男'), - (0x329B, 'M', u'女'), - (0x329C, 'M', u'適'), - (0x329D, 'M', u'優'), - (0x329E, 'M', u'印'), - (0x329F, 'M', u'注'), - (0x32A0, 'M', u'項'), - (0x32A1, 'M', u'休'), - (0x32A2, 'M', u'写'), - (0x32A3, 'M', u'正'), - (0x32A4, 'M', u'上'), - (0x32A5, 'M', u'中'), - (0x32A6, 'M', u'下'), - (0x32A7, 'M', u'左'), - (0x32A8, 'M', u'右'), - (0x32A9, 'M', u'医'), - (0x32AA, 'M', u'宗'), - (0x32AB, 'M', u'学'), - (0x32AC, 'M', u'監'), - (0x32AD, 'M', u'企'), - (0x32AE, 'M', u'資'), - (0x32AF, 'M', u'協'), - (0x32B0, 'M', u'夜'), - (0x32B1, 'M', u'36'), - (0x32B2, 'M', u'37'), - (0x32B3, 'M', u'38'), - (0x32B4, 'M', u'39'), - (0x32B5, 'M', u'40'), - (0x32B6, 'M', u'41'), - (0x32B7, 'M', u'42'), - (0x32B8, 'M', u'43'), - (0x32B9, 'M', u'44'), - (0x32BA, 'M', u'45'), - (0x32BB, 'M', u'46'), - (0x32BC, 'M', u'47'), - (0x32BD, 'M', u'48'), - (0x32BE, 'M', u'49'), - (0x32BF, 'M', u'50'), - (0x32C0, 'M', u'1月'), - (0x32C1, 'M', u'2月'), - (0x32C2, 'M', u'3月'), - (0x32C3, 'M', u'4月'), - (0x32C4, 'M', u'5月'), - (0x32C5, 'M', u'6月'), - (0x32C6, 'M', u'7月'), - (0x32C7, 'M', u'8月'), - ] - -def _seg_32(): - return [ - (0x32C8, 'M', u'9月'), - (0x32C9, 'M', u'10月'), - (0x32CA, 'M', u'11月'), - (0x32CB, 'M', u'12月'), - (0x32CC, 'M', u'hg'), - (0x32CD, 'M', u'erg'), - (0x32CE, 'M', u'ev'), - (0x32CF, 'M', u'ltd'), - (0x32D0, 'M', u'ア'), - (0x32D1, 'M', u'イ'), - (0x32D2, 'M', u'ウ'), - (0x32D3, 'M', u'エ'), - (0x32D4, 'M', u'オ'), - (0x32D5, 'M', u'カ'), - (0x32D6, 'M', u'キ'), - (0x32D7, 'M', u'ク'), - (0x32D8, 'M', u'ケ'), - (0x32D9, 'M', u'コ'), - (0x32DA, 'M', u'サ'), - (0x32DB, 'M', u'シ'), - (0x32DC, 'M', u'ス'), - (0x32DD, 'M', u'セ'), - (0x32DE, 'M', u'ソ'), - (0x32DF, 'M', u'タ'), - (0x32E0, 'M', u'チ'), - (0x32E1, 'M', u'ツ'), - (0x32E2, 'M', u'テ'), - (0x32E3, 'M', u'ト'), - (0x32E4, 'M', u'ナ'), - (0x32E5, 'M', u'ニ'), - (0x32E6, 'M', u'ヌ'), - (0x32E7, 'M', u'ネ'), - (0x32E8, 'M', u'ノ'), - (0x32E9, 'M', u'ハ'), - (0x32EA, 'M', u'ヒ'), - (0x32EB, 'M', u'フ'), - (0x32EC, 'M', u'ヘ'), - (0x32ED, 'M', u'ホ'), - (0x32EE, 'M', u'マ'), - (0x32EF, 'M', u'ミ'), - (0x32F0, 'M', u'ム'), - (0x32F1, 'M', u'メ'), - (0x32F2, 'M', u'モ'), - (0x32F3, 'M', u'ヤ'), - (0x32F4, 'M', u'ユ'), - (0x32F5, 'M', u'ヨ'), - (0x32F6, 'M', u'ラ'), - (0x32F7, 'M', u'リ'), - (0x32F8, 'M', u'ル'), - (0x32F9, 'M', u'レ'), - (0x32FA, 'M', u'ロ'), - (0x32FB, 'M', u'ワ'), - (0x32FC, 'M', u'ヰ'), - (0x32FD, 'M', u'ヱ'), - (0x32FE, 'M', u'ヲ'), - (0x32FF, 'X'), - (0x3300, 'M', u'アパート'), - (0x3301, 'M', u'アルファ'), - (0x3302, 'M', u'アンペア'), - (0x3303, 'M', u'アール'), - (0x3304, 'M', u'イニング'), - (0x3305, 'M', u'インチ'), - (0x3306, 'M', u'ウォン'), - (0x3307, 'M', u'エスクード'), - (0x3308, 'M', u'エーカー'), - (0x3309, 'M', u'オンス'), - (0x330A, 'M', u'オーム'), - (0x330B, 'M', u'カイリ'), - (0x330C, 'M', u'カラット'), - (0x330D, 'M', u'カロリー'), - (0x330E, 'M', u'ガロン'), - (0x330F, 'M', u'ガンマ'), - (0x3310, 'M', u'ギガ'), - (0x3311, 'M', u'ギニー'), - (0x3312, 'M', u'キュリー'), - (0x3313, 'M', u'ギルダー'), - (0x3314, 'M', u'キロ'), - (0x3315, 'M', u'キログラム'), - (0x3316, 'M', u'キロメートル'), - (0x3317, 'M', u'キロワット'), - (0x3318, 'M', u'グラム'), - (0x3319, 'M', u'グラムトン'), - (0x331A, 'M', u'クルゼイロ'), - (0x331B, 'M', u'クローネ'), - (0x331C, 'M', u'ケース'), - (0x331D, 'M', u'コルナ'), - (0x331E, 'M', u'コーポ'), - (0x331F, 'M', u'サイクル'), - (0x3320, 'M', u'サンチーム'), - (0x3321, 'M', u'シリング'), - (0x3322, 'M', u'センチ'), - (0x3323, 'M', u'セント'), - (0x3324, 'M', u'ダース'), - (0x3325, 'M', u'デシ'), - (0x3326, 'M', u'ドル'), - (0x3327, 'M', u'トン'), - (0x3328, 'M', u'ナノ'), - (0x3329, 'M', u'ノット'), - (0x332A, 'M', u'ハイツ'), - (0x332B, 'M', u'パーセント'), - ] - -def _seg_33(): - return [ - (0x332C, 'M', u'パーツ'), - (0x332D, 'M', u'バーレル'), - (0x332E, 'M', u'ピアストル'), - (0x332F, 'M', u'ピクル'), - (0x3330, 'M', u'ピコ'), - (0x3331, 'M', u'ビル'), - (0x3332, 'M', u'ファラッド'), - (0x3333, 'M', u'フィート'), - (0x3334, 'M', u'ブッシェル'), - (0x3335, 'M', u'フラン'), - (0x3336, 'M', u'ヘクタール'), - (0x3337, 'M', u'ペソ'), - (0x3338, 'M', u'ペニヒ'), - (0x3339, 'M', u'ヘルツ'), - (0x333A, 'M', u'ペンス'), - (0x333B, 'M', u'ページ'), - (0x333C, 'M', u'ベータ'), - (0x333D, 'M', u'ポイント'), - (0x333E, 'M', u'ボルト'), - (0x333F, 'M', u'ホン'), - (0x3340, 'M', u'ポンド'), - (0x3341, 'M', u'ホール'), - (0x3342, 'M', u'ホーン'), - (0x3343, 'M', u'マイクロ'), - (0x3344, 'M', u'マイル'), - (0x3345, 'M', u'マッハ'), - (0x3346, 'M', u'マルク'), - (0x3347, 'M', u'マンション'), - (0x3348, 'M', u'ミクロン'), - (0x3349, 'M', u'ミリ'), - (0x334A, 'M', u'ミリバール'), - (0x334B, 'M', u'メガ'), - (0x334C, 'M', u'メガトン'), - (0x334D, 'M', u'メートル'), - (0x334E, 'M', u'ヤード'), - (0x334F, 'M', u'ヤール'), - (0x3350, 'M', u'ユアン'), - (0x3351, 'M', u'リットル'), - (0x3352, 'M', u'リラ'), - (0x3353, 'M', u'ルピー'), - (0x3354, 'M', u'ルーブル'), - (0x3355, 'M', u'レム'), - (0x3356, 'M', u'レントゲン'), - (0x3357, 'M', u'ワット'), - (0x3358, 'M', u'0点'), - (0x3359, 'M', u'1点'), - (0x335A, 'M', u'2点'), - (0x335B, 'M', u'3点'), - (0x335C, 'M', u'4点'), - (0x335D, 'M', u'5点'), - (0x335E, 'M', u'6点'), - (0x335F, 'M', u'7点'), - (0x3360, 'M', u'8点'), - (0x3361, 'M', u'9点'), - (0x3362, 'M', u'10点'), - (0x3363, 'M', u'11点'), - (0x3364, 'M', u'12点'), - (0x3365, 'M', u'13点'), - (0x3366, 'M', u'14点'), - (0x3367, 'M', u'15点'), - (0x3368, 'M', u'16点'), - (0x3369, 'M', u'17点'), - (0x336A, 'M', u'18点'), - (0x336B, 'M', u'19点'), - (0x336C, 'M', u'20点'), - (0x336D, 'M', u'21点'), - (0x336E, 'M', u'22点'), - (0x336F, 'M', u'23点'), - (0x3370, 'M', u'24点'), - (0x3371, 'M', u'hpa'), - (0x3372, 'M', u'da'), - (0x3373, 'M', u'au'), - (0x3374, 'M', u'bar'), - (0x3375, 'M', u'ov'), - (0x3376, 'M', u'pc'), - (0x3377, 'M', u'dm'), - (0x3378, 'M', u'dm2'), - (0x3379, 'M', u'dm3'), - (0x337A, 'M', u'iu'), - (0x337B, 'M', u'平成'), - (0x337C, 'M', u'昭和'), - (0x337D, 'M', u'大正'), - (0x337E, 'M', u'明治'), - (0x337F, 'M', u'株式会社'), - (0x3380, 'M', u'pa'), - (0x3381, 'M', u'na'), - (0x3382, 'M', u'μa'), - (0x3383, 'M', u'ma'), - (0x3384, 'M', u'ka'), - (0x3385, 'M', u'kb'), - (0x3386, 'M', u'mb'), - (0x3387, 'M', u'gb'), - (0x3388, 'M', u'cal'), - (0x3389, 'M', u'kcal'), - (0x338A, 'M', u'pf'), - (0x338B, 'M', u'nf'), - (0x338C, 'M', u'μf'), - (0x338D, 'M', u'μg'), - (0x338E, 'M', u'mg'), - (0x338F, 'M', u'kg'), - ] - -def _seg_34(): - return [ - (0x3390, 'M', u'hz'), - (0x3391, 'M', u'khz'), - (0x3392, 'M', u'mhz'), - (0x3393, 'M', u'ghz'), - (0x3394, 'M', u'thz'), - (0x3395, 'M', u'μl'), - (0x3396, 'M', u'ml'), - (0x3397, 'M', u'dl'), - (0x3398, 'M', u'kl'), - (0x3399, 'M', u'fm'), - (0x339A, 'M', u'nm'), - (0x339B, 'M', u'μm'), - (0x339C, 'M', u'mm'), - (0x339D, 'M', u'cm'), - (0x339E, 'M', u'km'), - (0x339F, 'M', u'mm2'), - (0x33A0, 'M', u'cm2'), - (0x33A1, 'M', u'm2'), - (0x33A2, 'M', u'km2'), - (0x33A3, 'M', u'mm3'), - (0x33A4, 'M', u'cm3'), - (0x33A5, 'M', u'm3'), - (0x33A6, 'M', u'km3'), - (0x33A7, 'M', u'm∕s'), - (0x33A8, 'M', u'm∕s2'), - (0x33A9, 'M', u'pa'), - (0x33AA, 'M', u'kpa'), - (0x33AB, 'M', u'mpa'), - (0x33AC, 'M', u'gpa'), - (0x33AD, 'M', u'rad'), - (0x33AE, 'M', u'rad∕s'), - (0x33AF, 'M', u'rad∕s2'), - (0x33B0, 'M', u'ps'), - (0x33B1, 'M', u'ns'), - (0x33B2, 'M', u'μs'), - (0x33B3, 'M', u'ms'), - (0x33B4, 'M', u'pv'), - (0x33B5, 'M', u'nv'), - (0x33B6, 'M', u'μv'), - (0x33B7, 'M', u'mv'), - (0x33B8, 'M', u'kv'), - (0x33B9, 'M', u'mv'), - (0x33BA, 'M', u'pw'), - (0x33BB, 'M', u'nw'), - (0x33BC, 'M', u'μw'), - (0x33BD, 'M', u'mw'), - (0x33BE, 'M', u'kw'), - (0x33BF, 'M', u'mw'), - (0x33C0, 'M', u'kω'), - (0x33C1, 'M', u'mω'), - (0x33C2, 'X'), - (0x33C3, 'M', u'bq'), - (0x33C4, 'M', u'cc'), - (0x33C5, 'M', u'cd'), - (0x33C6, 'M', u'c∕kg'), - (0x33C7, 'X'), - (0x33C8, 'M', u'db'), - (0x33C9, 'M', u'gy'), - (0x33CA, 'M', u'ha'), - (0x33CB, 'M', u'hp'), - (0x33CC, 'M', u'in'), - (0x33CD, 'M', u'kk'), - (0x33CE, 'M', u'km'), - (0x33CF, 'M', u'kt'), - (0x33D0, 'M', u'lm'), - (0x33D1, 'M', u'ln'), - (0x33D2, 'M', u'log'), - (0x33D3, 'M', u'lx'), - (0x33D4, 'M', u'mb'), - (0x33D5, 'M', u'mil'), - (0x33D6, 'M', u'mol'), - (0x33D7, 'M', u'ph'), - (0x33D8, 'X'), - (0x33D9, 'M', u'ppm'), - (0x33DA, 'M', u'pr'), - (0x33DB, 'M', u'sr'), - (0x33DC, 'M', u'sv'), - (0x33DD, 'M', u'wb'), - (0x33DE, 'M', u'v∕m'), - (0x33DF, 'M', u'a∕m'), - (0x33E0, 'M', u'1日'), - (0x33E1, 'M', u'2日'), - (0x33E2, 'M', u'3日'), - (0x33E3, 'M', u'4日'), - (0x33E4, 'M', u'5日'), - (0x33E5, 'M', u'6日'), - (0x33E6, 'M', u'7日'), - (0x33E7, 'M', u'8日'), - (0x33E8, 'M', u'9日'), - (0x33E9, 'M', u'10日'), - (0x33EA, 'M', u'11日'), - (0x33EB, 'M', u'12日'), - (0x33EC, 'M', u'13日'), - (0x33ED, 'M', u'14日'), - (0x33EE, 'M', u'15日'), - (0x33EF, 'M', u'16日'), - (0x33F0, 'M', u'17日'), - (0x33F1, 'M', u'18日'), - (0x33F2, 'M', u'19日'), - (0x33F3, 'M', u'20日'), - ] - -def _seg_35(): - return [ - (0x33F4, 'M', u'21日'), - (0x33F5, 'M', u'22日'), - (0x33F6, 'M', u'23日'), - (0x33F7, 'M', u'24日'), - (0x33F8, 'M', u'25日'), - (0x33F9, 'M', u'26日'), - (0x33FA, 'M', u'27日'), - (0x33FB, 'M', u'28日'), - (0x33FC, 'M', u'29日'), - (0x33FD, 'M', u'30日'), - (0x33FE, 'M', u'31日'), - (0x33FF, 'M', u'gal'), - (0x3400, 'V'), - (0x4DB6, 'X'), - (0x4DC0, 'V'), - (0x9FF0, 'X'), - (0xA000, 'V'), - (0xA48D, 'X'), - (0xA490, 'V'), - (0xA4C7, 'X'), - (0xA4D0, 'V'), - (0xA62C, 'X'), - (0xA640, 'M', u'ꙁ'), - (0xA641, 'V'), - (0xA642, 'M', u'ꙃ'), - (0xA643, 'V'), - (0xA644, 'M', u'ꙅ'), - (0xA645, 'V'), - (0xA646, 'M', u'ꙇ'), - (0xA647, 'V'), - (0xA648, 'M', u'ꙉ'), - (0xA649, 'V'), - (0xA64A, 'M', u'ꙋ'), - (0xA64B, 'V'), - (0xA64C, 'M', u'ꙍ'), - (0xA64D, 'V'), - (0xA64E, 'M', u'ꙏ'), - (0xA64F, 'V'), - (0xA650, 'M', u'ꙑ'), - (0xA651, 'V'), - (0xA652, 'M', u'ꙓ'), - (0xA653, 'V'), - (0xA654, 'M', u'ꙕ'), - (0xA655, 'V'), - (0xA656, 'M', u'ꙗ'), - (0xA657, 'V'), - (0xA658, 'M', u'ꙙ'), - (0xA659, 'V'), - (0xA65A, 'M', u'ꙛ'), - (0xA65B, 'V'), - (0xA65C, 'M', u'ꙝ'), - (0xA65D, 'V'), - (0xA65E, 'M', u'ꙟ'), - (0xA65F, 'V'), - (0xA660, 'M', u'ꙡ'), - (0xA661, 'V'), - (0xA662, 'M', u'ꙣ'), - (0xA663, 'V'), - (0xA664, 'M', u'ꙥ'), - (0xA665, 'V'), - (0xA666, 'M', u'ꙧ'), - (0xA667, 'V'), - (0xA668, 'M', u'ꙩ'), - (0xA669, 'V'), - (0xA66A, 'M', u'ꙫ'), - (0xA66B, 'V'), - (0xA66C, 'M', u'ꙭ'), - (0xA66D, 'V'), - (0xA680, 'M', u'ꚁ'), - (0xA681, 'V'), - (0xA682, 'M', u'ꚃ'), - (0xA683, 'V'), - (0xA684, 'M', u'ꚅ'), - (0xA685, 'V'), - (0xA686, 'M', u'ꚇ'), - (0xA687, 'V'), - (0xA688, 'M', u'ꚉ'), - (0xA689, 'V'), - (0xA68A, 'M', u'ꚋ'), - (0xA68B, 'V'), - (0xA68C, 'M', u'ꚍ'), - (0xA68D, 'V'), - (0xA68E, 'M', u'ꚏ'), - (0xA68F, 'V'), - (0xA690, 'M', u'ꚑ'), - (0xA691, 'V'), - (0xA692, 'M', u'ꚓ'), - (0xA693, 'V'), - (0xA694, 'M', u'ꚕ'), - (0xA695, 'V'), - (0xA696, 'M', u'ꚗ'), - (0xA697, 'V'), - (0xA698, 'M', u'ꚙ'), - (0xA699, 'V'), - (0xA69A, 'M', u'ꚛ'), - (0xA69B, 'V'), - (0xA69C, 'M', u'ъ'), - (0xA69D, 'M', u'ь'), - (0xA69E, 'V'), - (0xA6F8, 'X'), - ] - -def _seg_36(): - return [ - (0xA700, 'V'), - (0xA722, 'M', u'ꜣ'), - (0xA723, 'V'), - (0xA724, 'M', u'ꜥ'), - (0xA725, 'V'), - (0xA726, 'M', u'ꜧ'), - (0xA727, 'V'), - (0xA728, 'M', u'ꜩ'), - (0xA729, 'V'), - (0xA72A, 'M', u'ꜫ'), - (0xA72B, 'V'), - (0xA72C, 'M', u'ꜭ'), - (0xA72D, 'V'), - (0xA72E, 'M', u'ꜯ'), - (0xA72F, 'V'), - (0xA732, 'M', u'ꜳ'), - (0xA733, 'V'), - (0xA734, 'M', u'ꜵ'), - (0xA735, 'V'), - (0xA736, 'M', u'ꜷ'), - (0xA737, 'V'), - (0xA738, 'M', u'ꜹ'), - (0xA739, 'V'), - (0xA73A, 'M', u'ꜻ'), - (0xA73B, 'V'), - (0xA73C, 'M', u'ꜽ'), - (0xA73D, 'V'), - (0xA73E, 'M', u'ꜿ'), - (0xA73F, 'V'), - (0xA740, 'M', u'ꝁ'), - (0xA741, 'V'), - (0xA742, 'M', u'ꝃ'), - (0xA743, 'V'), - (0xA744, 'M', u'ꝅ'), - (0xA745, 'V'), - (0xA746, 'M', u'ꝇ'), - (0xA747, 'V'), - (0xA748, 'M', u'ꝉ'), - (0xA749, 'V'), - (0xA74A, 'M', u'ꝋ'), - (0xA74B, 'V'), - (0xA74C, 'M', u'ꝍ'), - (0xA74D, 'V'), - (0xA74E, 'M', u'ꝏ'), - (0xA74F, 'V'), - (0xA750, 'M', u'ꝑ'), - (0xA751, 'V'), - (0xA752, 'M', u'ꝓ'), - (0xA753, 'V'), - (0xA754, 'M', u'ꝕ'), - (0xA755, 'V'), - (0xA756, 'M', u'ꝗ'), - (0xA757, 'V'), - (0xA758, 'M', u'ꝙ'), - (0xA759, 'V'), - (0xA75A, 'M', u'ꝛ'), - (0xA75B, 'V'), - (0xA75C, 'M', u'ꝝ'), - (0xA75D, 'V'), - (0xA75E, 'M', u'ꝟ'), - (0xA75F, 'V'), - (0xA760, 'M', u'ꝡ'), - (0xA761, 'V'), - (0xA762, 'M', u'ꝣ'), - (0xA763, 'V'), - (0xA764, 'M', u'ꝥ'), - (0xA765, 'V'), - (0xA766, 'M', u'ꝧ'), - (0xA767, 'V'), - (0xA768, 'M', u'ꝩ'), - (0xA769, 'V'), - (0xA76A, 'M', u'ꝫ'), - (0xA76B, 'V'), - (0xA76C, 'M', u'ꝭ'), - (0xA76D, 'V'), - (0xA76E, 'M', u'ꝯ'), - (0xA76F, 'V'), - (0xA770, 'M', u'ꝯ'), - (0xA771, 'V'), - (0xA779, 'M', u'ꝺ'), - (0xA77A, 'V'), - (0xA77B, 'M', u'ꝼ'), - (0xA77C, 'V'), - (0xA77D, 'M', u'ᵹ'), - (0xA77E, 'M', u'ꝿ'), - (0xA77F, 'V'), - (0xA780, 'M', u'ꞁ'), - (0xA781, 'V'), - (0xA782, 'M', u'ꞃ'), - (0xA783, 'V'), - (0xA784, 'M', u'ꞅ'), - (0xA785, 'V'), - (0xA786, 'M', u'ꞇ'), - (0xA787, 'V'), - (0xA78B, 'M', u'ꞌ'), - (0xA78C, 'V'), - (0xA78D, 'M', u'ɥ'), - (0xA78E, 'V'), - (0xA790, 'M', u'ꞑ'), - (0xA791, 'V'), - ] - -def _seg_37(): - return [ - (0xA792, 'M', u'ꞓ'), - (0xA793, 'V'), - (0xA796, 'M', u'ꞗ'), - (0xA797, 'V'), - (0xA798, 'M', u'ꞙ'), - (0xA799, 'V'), - (0xA79A, 'M', u'ꞛ'), - (0xA79B, 'V'), - (0xA79C, 'M', u'ꞝ'), - (0xA79D, 'V'), - (0xA79E, 'M', u'ꞟ'), - (0xA79F, 'V'), - (0xA7A0, 'M', u'ꞡ'), - (0xA7A1, 'V'), - (0xA7A2, 'M', u'ꞣ'), - (0xA7A3, 'V'), - (0xA7A4, 'M', u'ꞥ'), - (0xA7A5, 'V'), - (0xA7A6, 'M', u'ꞧ'), - (0xA7A7, 'V'), - (0xA7A8, 'M', u'ꞩ'), - (0xA7A9, 'V'), - (0xA7AA, 'M', u'ɦ'), - (0xA7AB, 'M', u'ɜ'), - (0xA7AC, 'M', u'ɡ'), - (0xA7AD, 'M', u'ɬ'), - (0xA7AE, 'M', u'ɪ'), - (0xA7AF, 'V'), - (0xA7B0, 'M', u'ʞ'), - (0xA7B1, 'M', u'ʇ'), - (0xA7B2, 'M', u'ʝ'), - (0xA7B3, 'M', u'ꭓ'), - (0xA7B4, 'M', u'ꞵ'), - (0xA7B5, 'V'), - (0xA7B6, 'M', u'ꞷ'), - (0xA7B7, 'V'), - (0xA7B8, 'X'), - (0xA7B9, 'V'), - (0xA7BA, 'X'), - (0xA7F7, 'V'), - (0xA7F8, 'M', u'ħ'), - (0xA7F9, 'M', u'œ'), - (0xA7FA, 'V'), - (0xA82C, 'X'), - (0xA830, 'V'), - (0xA83A, 'X'), - (0xA840, 'V'), - (0xA878, 'X'), - (0xA880, 'V'), - (0xA8C6, 'X'), - (0xA8CE, 'V'), - (0xA8DA, 'X'), - (0xA8E0, 'V'), - (0xA954, 'X'), - (0xA95F, 'V'), - (0xA97D, 'X'), - (0xA980, 'V'), - (0xA9CE, 'X'), - (0xA9CF, 'V'), - (0xA9DA, 'X'), - (0xA9DE, 'V'), - (0xA9FF, 'X'), - (0xAA00, 'V'), - (0xAA37, 'X'), - (0xAA40, 'V'), - (0xAA4E, 'X'), - (0xAA50, 'V'), - (0xAA5A, 'X'), - (0xAA5C, 'V'), - (0xAAC3, 'X'), - (0xAADB, 'V'), - (0xAAF7, 'X'), - (0xAB01, 'V'), - (0xAB07, 'X'), - (0xAB09, 'V'), - (0xAB0F, 'X'), - (0xAB11, 'V'), - (0xAB17, 'X'), - (0xAB20, 'V'), - (0xAB27, 'X'), - (0xAB28, 'V'), - (0xAB2F, 'X'), - (0xAB30, 'V'), - (0xAB5C, 'M', u'ꜧ'), - (0xAB5D, 'M', u'ꬷ'), - (0xAB5E, 'M', u'ɫ'), - (0xAB5F, 'M', u'ꭒ'), - (0xAB60, 'V'), - (0xAB66, 'X'), - (0xAB70, 'M', u'Ꭰ'), - (0xAB71, 'M', u'Ꭱ'), - (0xAB72, 'M', u'Ꭲ'), - (0xAB73, 'M', u'Ꭳ'), - (0xAB74, 'M', u'Ꭴ'), - (0xAB75, 'M', u'Ꭵ'), - (0xAB76, 'M', u'Ꭶ'), - (0xAB77, 'M', u'Ꭷ'), - (0xAB78, 'M', u'Ꭸ'), - (0xAB79, 'M', u'Ꭹ'), - (0xAB7A, 'M', u'Ꭺ'), - ] - -def _seg_38(): - return [ - (0xAB7B, 'M', u'Ꭻ'), - (0xAB7C, 'M', u'Ꭼ'), - (0xAB7D, 'M', u'Ꭽ'), - (0xAB7E, 'M', u'Ꭾ'), - (0xAB7F, 'M', u'Ꭿ'), - (0xAB80, 'M', u'Ꮀ'), - (0xAB81, 'M', u'Ꮁ'), - (0xAB82, 'M', u'Ꮂ'), - (0xAB83, 'M', u'Ꮃ'), - (0xAB84, 'M', u'Ꮄ'), - (0xAB85, 'M', u'Ꮅ'), - (0xAB86, 'M', u'Ꮆ'), - (0xAB87, 'M', u'Ꮇ'), - (0xAB88, 'M', u'Ꮈ'), - (0xAB89, 'M', u'Ꮉ'), - (0xAB8A, 'M', u'Ꮊ'), - (0xAB8B, 'M', u'Ꮋ'), - (0xAB8C, 'M', u'Ꮌ'), - (0xAB8D, 'M', u'Ꮍ'), - (0xAB8E, 'M', u'Ꮎ'), - (0xAB8F, 'M', u'Ꮏ'), - (0xAB90, 'M', u'Ꮐ'), - (0xAB91, 'M', u'Ꮑ'), - (0xAB92, 'M', u'Ꮒ'), - (0xAB93, 'M', u'Ꮓ'), - (0xAB94, 'M', u'Ꮔ'), - (0xAB95, 'M', u'Ꮕ'), - (0xAB96, 'M', u'Ꮖ'), - (0xAB97, 'M', u'Ꮗ'), - (0xAB98, 'M', u'Ꮘ'), - (0xAB99, 'M', u'Ꮙ'), - (0xAB9A, 'M', u'Ꮚ'), - (0xAB9B, 'M', u'Ꮛ'), - (0xAB9C, 'M', u'Ꮜ'), - (0xAB9D, 'M', u'Ꮝ'), - (0xAB9E, 'M', u'Ꮞ'), - (0xAB9F, 'M', u'Ꮟ'), - (0xABA0, 'M', u'Ꮠ'), - (0xABA1, 'M', u'Ꮡ'), - (0xABA2, 'M', u'Ꮢ'), - (0xABA3, 'M', u'Ꮣ'), - (0xABA4, 'M', u'Ꮤ'), - (0xABA5, 'M', u'Ꮥ'), - (0xABA6, 'M', u'Ꮦ'), - (0xABA7, 'M', u'Ꮧ'), - (0xABA8, 'M', u'Ꮨ'), - (0xABA9, 'M', u'Ꮩ'), - (0xABAA, 'M', u'Ꮪ'), - (0xABAB, 'M', u'Ꮫ'), - (0xABAC, 'M', u'Ꮬ'), - (0xABAD, 'M', u'Ꮭ'), - (0xABAE, 'M', u'Ꮮ'), - (0xABAF, 'M', u'Ꮯ'), - (0xABB0, 'M', u'Ꮰ'), - (0xABB1, 'M', u'Ꮱ'), - (0xABB2, 'M', u'Ꮲ'), - (0xABB3, 'M', u'Ꮳ'), - (0xABB4, 'M', u'Ꮴ'), - (0xABB5, 'M', u'Ꮵ'), - (0xABB6, 'M', u'Ꮶ'), - (0xABB7, 'M', u'Ꮷ'), - (0xABB8, 'M', u'Ꮸ'), - (0xABB9, 'M', u'Ꮹ'), - (0xABBA, 'M', u'Ꮺ'), - (0xABBB, 'M', u'Ꮻ'), - (0xABBC, 'M', u'Ꮼ'), - (0xABBD, 'M', u'Ꮽ'), - (0xABBE, 'M', u'Ꮾ'), - (0xABBF, 'M', u'Ꮿ'), - (0xABC0, 'V'), - (0xABEE, 'X'), - (0xABF0, 'V'), - (0xABFA, 'X'), - (0xAC00, 'V'), - (0xD7A4, 'X'), - (0xD7B0, 'V'), - (0xD7C7, 'X'), - (0xD7CB, 'V'), - (0xD7FC, 'X'), - (0xF900, 'M', u'豈'), - (0xF901, 'M', u'更'), - (0xF902, 'M', u'車'), - (0xF903, 'M', u'賈'), - (0xF904, 'M', u'滑'), - (0xF905, 'M', u'串'), - (0xF906, 'M', u'句'), - (0xF907, 'M', u'龜'), - (0xF909, 'M', u'契'), - (0xF90A, 'M', u'金'), - (0xF90B, 'M', u'喇'), - (0xF90C, 'M', u'奈'), - (0xF90D, 'M', u'懶'), - (0xF90E, 'M', u'癩'), - (0xF90F, 'M', u'羅'), - (0xF910, 'M', u'蘿'), - (0xF911, 'M', u'螺'), - (0xF912, 'M', u'裸'), - (0xF913, 'M', u'邏'), - (0xF914, 'M', u'樂'), - (0xF915, 'M', u'洛'), - ] - -def _seg_39(): - return [ - (0xF916, 'M', u'烙'), - (0xF917, 'M', u'珞'), - (0xF918, 'M', u'落'), - (0xF919, 'M', u'酪'), - (0xF91A, 'M', u'駱'), - (0xF91B, 'M', u'亂'), - (0xF91C, 'M', u'卵'), - (0xF91D, 'M', u'欄'), - (0xF91E, 'M', u'爛'), - (0xF91F, 'M', u'蘭'), - (0xF920, 'M', u'鸞'), - (0xF921, 'M', u'嵐'), - (0xF922, 'M', u'濫'), - (0xF923, 'M', u'藍'), - (0xF924, 'M', u'襤'), - (0xF925, 'M', u'拉'), - (0xF926, 'M', u'臘'), - (0xF927, 'M', u'蠟'), - (0xF928, 'M', u'廊'), - (0xF929, 'M', u'朗'), - (0xF92A, 'M', u'浪'), - (0xF92B, 'M', u'狼'), - (0xF92C, 'M', u'郎'), - (0xF92D, 'M', u'來'), - (0xF92E, 'M', u'冷'), - (0xF92F, 'M', u'勞'), - (0xF930, 'M', u'擄'), - (0xF931, 'M', u'櫓'), - (0xF932, 'M', u'爐'), - (0xF933, 'M', u'盧'), - (0xF934, 'M', u'老'), - (0xF935, 'M', u'蘆'), - (0xF936, 'M', u'虜'), - (0xF937, 'M', u'路'), - (0xF938, 'M', u'露'), - (0xF939, 'M', u'魯'), - (0xF93A, 'M', u'鷺'), - (0xF93B, 'M', u'碌'), - (0xF93C, 'M', u'祿'), - (0xF93D, 'M', u'綠'), - (0xF93E, 'M', u'菉'), - (0xF93F, 'M', u'錄'), - (0xF940, 'M', u'鹿'), - (0xF941, 'M', u'論'), - (0xF942, 'M', u'壟'), - (0xF943, 'M', u'弄'), - (0xF944, 'M', u'籠'), - (0xF945, 'M', u'聾'), - (0xF946, 'M', u'牢'), - (0xF947, 'M', u'磊'), - (0xF948, 'M', u'賂'), - (0xF949, 'M', u'雷'), - (0xF94A, 'M', u'壘'), - (0xF94B, 'M', u'屢'), - (0xF94C, 'M', u'樓'), - (0xF94D, 'M', u'淚'), - (0xF94E, 'M', u'漏'), - (0xF94F, 'M', u'累'), - (0xF950, 'M', u'縷'), - (0xF951, 'M', u'陋'), - (0xF952, 'M', u'勒'), - (0xF953, 'M', u'肋'), - (0xF954, 'M', u'凜'), - (0xF955, 'M', u'凌'), - (0xF956, 'M', u'稜'), - (0xF957, 'M', u'綾'), - (0xF958, 'M', u'菱'), - (0xF959, 'M', u'陵'), - (0xF95A, 'M', u'讀'), - (0xF95B, 'M', u'拏'), - (0xF95C, 'M', u'樂'), - (0xF95D, 'M', u'諾'), - (0xF95E, 'M', u'丹'), - (0xF95F, 'M', u'寧'), - (0xF960, 'M', u'怒'), - (0xF961, 'M', u'率'), - (0xF962, 'M', u'異'), - (0xF963, 'M', u'北'), - (0xF964, 'M', u'磻'), - (0xF965, 'M', u'便'), - (0xF966, 'M', u'復'), - (0xF967, 'M', u'不'), - (0xF968, 'M', u'泌'), - (0xF969, 'M', u'數'), - (0xF96A, 'M', u'索'), - (0xF96B, 'M', u'參'), - (0xF96C, 'M', u'塞'), - (0xF96D, 'M', u'省'), - (0xF96E, 'M', u'葉'), - (0xF96F, 'M', u'說'), - (0xF970, 'M', u'殺'), - (0xF971, 'M', u'辰'), - (0xF972, 'M', u'沈'), - (0xF973, 'M', u'拾'), - (0xF974, 'M', u'若'), - (0xF975, 'M', u'掠'), - (0xF976, 'M', u'略'), - (0xF977, 'M', u'亮'), - (0xF978, 'M', u'兩'), - (0xF979, 'M', u'凉'), - ] - -def _seg_40(): - return [ - (0xF97A, 'M', u'梁'), - (0xF97B, 'M', u'糧'), - (0xF97C, 'M', u'良'), - (0xF97D, 'M', u'諒'), - (0xF97E, 'M', u'量'), - (0xF97F, 'M', u'勵'), - (0xF980, 'M', u'呂'), - (0xF981, 'M', u'女'), - (0xF982, 'M', u'廬'), - (0xF983, 'M', u'旅'), - (0xF984, 'M', u'濾'), - (0xF985, 'M', u'礪'), - (0xF986, 'M', u'閭'), - (0xF987, 'M', u'驪'), - (0xF988, 'M', u'麗'), - (0xF989, 'M', u'黎'), - (0xF98A, 'M', u'力'), - (0xF98B, 'M', u'曆'), - (0xF98C, 'M', u'歷'), - (0xF98D, 'M', u'轢'), - (0xF98E, 'M', u'年'), - (0xF98F, 'M', u'憐'), - (0xF990, 'M', u'戀'), - (0xF991, 'M', u'撚'), - (0xF992, 'M', u'漣'), - (0xF993, 'M', u'煉'), - (0xF994, 'M', u'璉'), - (0xF995, 'M', u'秊'), - (0xF996, 'M', u'練'), - (0xF997, 'M', u'聯'), - (0xF998, 'M', u'輦'), - (0xF999, 'M', u'蓮'), - (0xF99A, 'M', u'連'), - (0xF99B, 'M', u'鍊'), - (0xF99C, 'M', u'列'), - (0xF99D, 'M', u'劣'), - (0xF99E, 'M', u'咽'), - (0xF99F, 'M', u'烈'), - (0xF9A0, 'M', u'裂'), - (0xF9A1, 'M', u'說'), - (0xF9A2, 'M', u'廉'), - (0xF9A3, 'M', u'念'), - (0xF9A4, 'M', u'捻'), - (0xF9A5, 'M', u'殮'), - (0xF9A6, 'M', u'簾'), - (0xF9A7, 'M', u'獵'), - (0xF9A8, 'M', u'令'), - (0xF9A9, 'M', u'囹'), - (0xF9AA, 'M', u'寧'), - (0xF9AB, 'M', u'嶺'), - (0xF9AC, 'M', u'怜'), - (0xF9AD, 'M', u'玲'), - (0xF9AE, 'M', u'瑩'), - (0xF9AF, 'M', u'羚'), - (0xF9B0, 'M', u'聆'), - (0xF9B1, 'M', u'鈴'), - (0xF9B2, 'M', u'零'), - (0xF9B3, 'M', u'靈'), - (0xF9B4, 'M', u'領'), - (0xF9B5, 'M', u'例'), - (0xF9B6, 'M', u'禮'), - (0xF9B7, 'M', u'醴'), - (0xF9B8, 'M', u'隸'), - (0xF9B9, 'M', u'惡'), - (0xF9BA, 'M', u'了'), - (0xF9BB, 'M', u'僚'), - (0xF9BC, 'M', u'寮'), - (0xF9BD, 'M', u'尿'), - (0xF9BE, 'M', u'料'), - (0xF9BF, 'M', u'樂'), - (0xF9C0, 'M', u'燎'), - (0xF9C1, 'M', u'療'), - (0xF9C2, 'M', u'蓼'), - (0xF9C3, 'M', u'遼'), - (0xF9C4, 'M', u'龍'), - (0xF9C5, 'M', u'暈'), - (0xF9C6, 'M', u'阮'), - (0xF9C7, 'M', u'劉'), - (0xF9C8, 'M', u'杻'), - (0xF9C9, 'M', u'柳'), - (0xF9CA, 'M', u'流'), - (0xF9CB, 'M', u'溜'), - (0xF9CC, 'M', u'琉'), - (0xF9CD, 'M', u'留'), - (0xF9CE, 'M', u'硫'), - (0xF9CF, 'M', u'紐'), - (0xF9D0, 'M', u'類'), - (0xF9D1, 'M', u'六'), - (0xF9D2, 'M', u'戮'), - (0xF9D3, 'M', u'陸'), - (0xF9D4, 'M', u'倫'), - (0xF9D5, 'M', u'崙'), - (0xF9D6, 'M', u'淪'), - (0xF9D7, 'M', u'輪'), - (0xF9D8, 'M', u'律'), - (0xF9D9, 'M', u'慄'), - (0xF9DA, 'M', u'栗'), - (0xF9DB, 'M', u'率'), - (0xF9DC, 'M', u'隆'), - (0xF9DD, 'M', u'利'), - ] - -def _seg_41(): - return [ - (0xF9DE, 'M', u'吏'), - (0xF9DF, 'M', u'履'), - (0xF9E0, 'M', u'易'), - (0xF9E1, 'M', u'李'), - (0xF9E2, 'M', u'梨'), - (0xF9E3, 'M', u'泥'), - (0xF9E4, 'M', u'理'), - (0xF9E5, 'M', u'痢'), - (0xF9E6, 'M', u'罹'), - (0xF9E7, 'M', u'裏'), - (0xF9E8, 'M', u'裡'), - (0xF9E9, 'M', u'里'), - (0xF9EA, 'M', u'離'), - (0xF9EB, 'M', u'匿'), - (0xF9EC, 'M', u'溺'), - (0xF9ED, 'M', u'吝'), - (0xF9EE, 'M', u'燐'), - (0xF9EF, 'M', u'璘'), - (0xF9F0, 'M', u'藺'), - (0xF9F1, 'M', u'隣'), - (0xF9F2, 'M', u'鱗'), - (0xF9F3, 'M', u'麟'), - (0xF9F4, 'M', u'林'), - (0xF9F5, 'M', u'淋'), - (0xF9F6, 'M', u'臨'), - (0xF9F7, 'M', u'立'), - (0xF9F8, 'M', u'笠'), - (0xF9F9, 'M', u'粒'), - (0xF9FA, 'M', u'狀'), - (0xF9FB, 'M', u'炙'), - (0xF9FC, 'M', u'識'), - (0xF9FD, 'M', u'什'), - (0xF9FE, 'M', u'茶'), - (0xF9FF, 'M', u'刺'), - (0xFA00, 'M', u'切'), - (0xFA01, 'M', u'度'), - (0xFA02, 'M', u'拓'), - (0xFA03, 'M', u'糖'), - (0xFA04, 'M', u'宅'), - (0xFA05, 'M', u'洞'), - (0xFA06, 'M', u'暴'), - (0xFA07, 'M', u'輻'), - (0xFA08, 'M', u'行'), - (0xFA09, 'M', u'降'), - (0xFA0A, 'M', u'見'), - (0xFA0B, 'M', u'廓'), - (0xFA0C, 'M', u'兀'), - (0xFA0D, 'M', u'嗀'), - (0xFA0E, 'V'), - (0xFA10, 'M', u'塚'), - (0xFA11, 'V'), - (0xFA12, 'M', u'晴'), - (0xFA13, 'V'), - (0xFA15, 'M', u'凞'), - (0xFA16, 'M', u'猪'), - (0xFA17, 'M', u'益'), - (0xFA18, 'M', u'礼'), - (0xFA19, 'M', u'神'), - (0xFA1A, 'M', u'祥'), - (0xFA1B, 'M', u'福'), - (0xFA1C, 'M', u'靖'), - (0xFA1D, 'M', u'精'), - (0xFA1E, 'M', u'羽'), - (0xFA1F, 'V'), - (0xFA20, 'M', u'蘒'), - (0xFA21, 'V'), - (0xFA22, 'M', u'諸'), - (0xFA23, 'V'), - (0xFA25, 'M', u'逸'), - (0xFA26, 'M', u'都'), - (0xFA27, 'V'), - (0xFA2A, 'M', u'飯'), - (0xFA2B, 'M', u'飼'), - (0xFA2C, 'M', u'館'), - (0xFA2D, 'M', u'鶴'), - (0xFA2E, 'M', u'郞'), - (0xFA2F, 'M', u'隷'), - (0xFA30, 'M', u'侮'), - (0xFA31, 'M', u'僧'), - (0xFA32, 'M', u'免'), - (0xFA33, 'M', u'勉'), - (0xFA34, 'M', u'勤'), - (0xFA35, 'M', u'卑'), - (0xFA36, 'M', u'喝'), - (0xFA37, 'M', u'嘆'), - (0xFA38, 'M', u'器'), - (0xFA39, 'M', u'塀'), - (0xFA3A, 'M', u'墨'), - (0xFA3B, 'M', u'層'), - (0xFA3C, 'M', u'屮'), - (0xFA3D, 'M', u'悔'), - (0xFA3E, 'M', u'慨'), - (0xFA3F, 'M', u'憎'), - (0xFA40, 'M', u'懲'), - (0xFA41, 'M', u'敏'), - (0xFA42, 'M', u'既'), - (0xFA43, 'M', u'暑'), - (0xFA44, 'M', u'梅'), - (0xFA45, 'M', u'海'), - (0xFA46, 'M', u'渚'), - ] - -def _seg_42(): - return [ - (0xFA47, 'M', u'漢'), - (0xFA48, 'M', u'煮'), - (0xFA49, 'M', u'爫'), - (0xFA4A, 'M', u'琢'), - (0xFA4B, 'M', u'碑'), - (0xFA4C, 'M', u'社'), - (0xFA4D, 'M', u'祉'), - (0xFA4E, 'M', u'祈'), - (0xFA4F, 'M', u'祐'), - (0xFA50, 'M', u'祖'), - (0xFA51, 'M', u'祝'), - (0xFA52, 'M', u'禍'), - (0xFA53, 'M', u'禎'), - (0xFA54, 'M', u'穀'), - (0xFA55, 'M', u'突'), - (0xFA56, 'M', u'節'), - (0xFA57, 'M', u'練'), - (0xFA58, 'M', u'縉'), - (0xFA59, 'M', u'繁'), - (0xFA5A, 'M', u'署'), - (0xFA5B, 'M', u'者'), - (0xFA5C, 'M', u'臭'), - (0xFA5D, 'M', u'艹'), - (0xFA5F, 'M', u'著'), - (0xFA60, 'M', u'褐'), - (0xFA61, 'M', u'視'), - (0xFA62, 'M', u'謁'), - (0xFA63, 'M', u'謹'), - (0xFA64, 'M', u'賓'), - (0xFA65, 'M', u'贈'), - (0xFA66, 'M', u'辶'), - (0xFA67, 'M', u'逸'), - (0xFA68, 'M', u'難'), - (0xFA69, 'M', u'響'), - (0xFA6A, 'M', u'頻'), - (0xFA6B, 'M', u'恵'), - (0xFA6C, 'M', u'𤋮'), - (0xFA6D, 'M', u'舘'), - (0xFA6E, 'X'), - (0xFA70, 'M', u'並'), - (0xFA71, 'M', u'况'), - (0xFA72, 'M', u'全'), - (0xFA73, 'M', u'侀'), - (0xFA74, 'M', u'充'), - (0xFA75, 'M', u'冀'), - (0xFA76, 'M', u'勇'), - (0xFA77, 'M', u'勺'), - (0xFA78, 'M', u'喝'), - (0xFA79, 'M', u'啕'), - (0xFA7A, 'M', u'喙'), - (0xFA7B, 'M', u'嗢'), - (0xFA7C, 'M', u'塚'), - (0xFA7D, 'M', u'墳'), - (0xFA7E, 'M', u'奄'), - (0xFA7F, 'M', u'奔'), - (0xFA80, 'M', u'婢'), - (0xFA81, 'M', u'嬨'), - (0xFA82, 'M', u'廒'), - (0xFA83, 'M', u'廙'), - (0xFA84, 'M', u'彩'), - (0xFA85, 'M', u'徭'), - (0xFA86, 'M', u'惘'), - (0xFA87, 'M', u'慎'), - (0xFA88, 'M', u'愈'), - (0xFA89, 'M', u'憎'), - (0xFA8A, 'M', u'慠'), - (0xFA8B, 'M', u'懲'), - (0xFA8C, 'M', u'戴'), - (0xFA8D, 'M', u'揄'), - (0xFA8E, 'M', u'搜'), - (0xFA8F, 'M', u'摒'), - (0xFA90, 'M', u'敖'), - (0xFA91, 'M', u'晴'), - (0xFA92, 'M', u'朗'), - (0xFA93, 'M', u'望'), - (0xFA94, 'M', u'杖'), - (0xFA95, 'M', u'歹'), - (0xFA96, 'M', u'殺'), - (0xFA97, 'M', u'流'), - (0xFA98, 'M', u'滛'), - (0xFA99, 'M', u'滋'), - (0xFA9A, 'M', u'漢'), - (0xFA9B, 'M', u'瀞'), - (0xFA9C, 'M', u'煮'), - (0xFA9D, 'M', u'瞧'), - (0xFA9E, 'M', u'爵'), - (0xFA9F, 'M', u'犯'), - (0xFAA0, 'M', u'猪'), - (0xFAA1, 'M', u'瑱'), - (0xFAA2, 'M', u'甆'), - (0xFAA3, 'M', u'画'), - (0xFAA4, 'M', u'瘝'), - (0xFAA5, 'M', u'瘟'), - (0xFAA6, 'M', u'益'), - (0xFAA7, 'M', u'盛'), - (0xFAA8, 'M', u'直'), - (0xFAA9, 'M', u'睊'), - (0xFAAA, 'M', u'着'), - (0xFAAB, 'M', u'磌'), - (0xFAAC, 'M', u'窱'), - ] - -def _seg_43(): - return [ - (0xFAAD, 'M', u'節'), - (0xFAAE, 'M', u'类'), - (0xFAAF, 'M', u'絛'), - (0xFAB0, 'M', u'練'), - (0xFAB1, 'M', u'缾'), - (0xFAB2, 'M', u'者'), - (0xFAB3, 'M', u'荒'), - (0xFAB4, 'M', u'華'), - (0xFAB5, 'M', u'蝹'), - (0xFAB6, 'M', u'襁'), - (0xFAB7, 'M', u'覆'), - (0xFAB8, 'M', u'視'), - (0xFAB9, 'M', u'調'), - (0xFABA, 'M', u'諸'), - (0xFABB, 'M', u'請'), - (0xFABC, 'M', u'謁'), - (0xFABD, 'M', u'諾'), - (0xFABE, 'M', u'諭'), - (0xFABF, 'M', u'謹'), - (0xFAC0, 'M', u'變'), - (0xFAC1, 'M', u'贈'), - (0xFAC2, 'M', u'輸'), - (0xFAC3, 'M', u'遲'), - (0xFAC4, 'M', u'醙'), - (0xFAC5, 'M', u'鉶'), - (0xFAC6, 'M', u'陼'), - (0xFAC7, 'M', u'難'), - (0xFAC8, 'M', u'靖'), - (0xFAC9, 'M', u'韛'), - (0xFACA, 'M', u'響'), - (0xFACB, 'M', u'頋'), - (0xFACC, 'M', u'頻'), - (0xFACD, 'M', u'鬒'), - (0xFACE, 'M', u'龜'), - (0xFACF, 'M', u'𢡊'), - (0xFAD0, 'M', u'𢡄'), - (0xFAD1, 'M', u'𣏕'), - (0xFAD2, 'M', u'㮝'), - (0xFAD3, 'M', u'䀘'), - (0xFAD4, 'M', u'䀹'), - (0xFAD5, 'M', u'𥉉'), - (0xFAD6, 'M', u'𥳐'), - (0xFAD7, 'M', u'𧻓'), - (0xFAD8, 'M', u'齃'), - (0xFAD9, 'M', u'龎'), - (0xFADA, 'X'), - (0xFB00, 'M', u'ff'), - (0xFB01, 'M', u'fi'), - (0xFB02, 'M', u'fl'), - (0xFB03, 'M', u'ffi'), - (0xFB04, 'M', u'ffl'), - (0xFB05, 'M', u'st'), - (0xFB07, 'X'), - (0xFB13, 'M', u'մն'), - (0xFB14, 'M', u'մե'), - (0xFB15, 'M', u'մի'), - (0xFB16, 'M', u'վն'), - (0xFB17, 'M', u'մխ'), - (0xFB18, 'X'), - (0xFB1D, 'M', u'יִ'), - (0xFB1E, 'V'), - (0xFB1F, 'M', u'ײַ'), - (0xFB20, 'M', u'ע'), - (0xFB21, 'M', u'א'), - (0xFB22, 'M', u'ד'), - (0xFB23, 'M', u'ה'), - (0xFB24, 'M', u'כ'), - (0xFB25, 'M', u'ל'), - (0xFB26, 'M', u'ם'), - (0xFB27, 'M', u'ר'), - (0xFB28, 'M', u'ת'), - (0xFB29, '3', u'+'), - (0xFB2A, 'M', u'שׁ'), - (0xFB2B, 'M', u'שׂ'), - (0xFB2C, 'M', u'שּׁ'), - (0xFB2D, 'M', u'שּׂ'), - (0xFB2E, 'M', u'אַ'), - (0xFB2F, 'M', u'אָ'), - (0xFB30, 'M', u'אּ'), - (0xFB31, 'M', u'בּ'), - (0xFB32, 'M', u'גּ'), - (0xFB33, 'M', u'דּ'), - (0xFB34, 'M', u'הּ'), - (0xFB35, 'M', u'וּ'), - (0xFB36, 'M', u'זּ'), - (0xFB37, 'X'), - (0xFB38, 'M', u'טּ'), - (0xFB39, 'M', u'יּ'), - (0xFB3A, 'M', u'ךּ'), - (0xFB3B, 'M', u'כּ'), - (0xFB3C, 'M', u'לּ'), - (0xFB3D, 'X'), - (0xFB3E, 'M', u'מּ'), - (0xFB3F, 'X'), - (0xFB40, 'M', u'נּ'), - (0xFB41, 'M', u'סּ'), - (0xFB42, 'X'), - (0xFB43, 'M', u'ףּ'), - (0xFB44, 'M', u'פּ'), - (0xFB45, 'X'), - ] - -def _seg_44(): - return [ - (0xFB46, 'M', u'צּ'), - (0xFB47, 'M', u'קּ'), - (0xFB48, 'M', u'רּ'), - (0xFB49, 'M', u'שּ'), - (0xFB4A, 'M', u'תּ'), - (0xFB4B, 'M', u'וֹ'), - (0xFB4C, 'M', u'בֿ'), - (0xFB4D, 'M', u'כֿ'), - (0xFB4E, 'M', u'פֿ'), - (0xFB4F, 'M', u'אל'), - (0xFB50, 'M', u'ٱ'), - (0xFB52, 'M', u'ٻ'), - (0xFB56, 'M', u'پ'), - (0xFB5A, 'M', u'ڀ'), - (0xFB5E, 'M', u'ٺ'), - (0xFB62, 'M', u'ٿ'), - (0xFB66, 'M', u'ٹ'), - (0xFB6A, 'M', u'ڤ'), - (0xFB6E, 'M', u'ڦ'), - (0xFB72, 'M', u'ڄ'), - (0xFB76, 'M', u'ڃ'), - (0xFB7A, 'M', u'چ'), - (0xFB7E, 'M', u'ڇ'), - (0xFB82, 'M', u'ڍ'), - (0xFB84, 'M', u'ڌ'), - (0xFB86, 'M', u'ڎ'), - (0xFB88, 'M', u'ڈ'), - (0xFB8A, 'M', u'ژ'), - (0xFB8C, 'M', u'ڑ'), - (0xFB8E, 'M', u'ک'), - (0xFB92, 'M', u'گ'), - (0xFB96, 'M', u'ڳ'), - (0xFB9A, 'M', u'ڱ'), - (0xFB9E, 'M', u'ں'), - (0xFBA0, 'M', u'ڻ'), - (0xFBA4, 'M', u'ۀ'), - (0xFBA6, 'M', u'ہ'), - (0xFBAA, 'M', u'ھ'), - (0xFBAE, 'M', u'ے'), - (0xFBB0, 'M', u'ۓ'), - (0xFBB2, 'V'), - (0xFBC2, 'X'), - (0xFBD3, 'M', u'ڭ'), - (0xFBD7, 'M', u'ۇ'), - (0xFBD9, 'M', u'ۆ'), - (0xFBDB, 'M', u'ۈ'), - (0xFBDD, 'M', u'ۇٴ'), - (0xFBDE, 'M', u'ۋ'), - (0xFBE0, 'M', u'ۅ'), - (0xFBE2, 'M', u'ۉ'), - (0xFBE4, 'M', u'ې'), - (0xFBE8, 'M', u'ى'), - (0xFBEA, 'M', u'ئا'), - (0xFBEC, 'M', u'ئە'), - (0xFBEE, 'M', u'ئو'), - (0xFBF0, 'M', u'ئۇ'), - (0xFBF2, 'M', u'ئۆ'), - (0xFBF4, 'M', u'ئۈ'), - (0xFBF6, 'M', u'ئې'), - (0xFBF9, 'M', u'ئى'), - (0xFBFC, 'M', u'ی'), - (0xFC00, 'M', u'ئج'), - (0xFC01, 'M', u'ئح'), - (0xFC02, 'M', u'ئم'), - (0xFC03, 'M', u'ئى'), - (0xFC04, 'M', u'ئي'), - (0xFC05, 'M', u'بج'), - (0xFC06, 'M', u'بح'), - (0xFC07, 'M', u'بخ'), - (0xFC08, 'M', u'بم'), - (0xFC09, 'M', u'بى'), - (0xFC0A, 'M', u'بي'), - (0xFC0B, 'M', u'تج'), - (0xFC0C, 'M', u'تح'), - (0xFC0D, 'M', u'تخ'), - (0xFC0E, 'M', u'تم'), - (0xFC0F, 'M', u'تى'), - (0xFC10, 'M', u'تي'), - (0xFC11, 'M', u'ثج'), - (0xFC12, 'M', u'ثم'), - (0xFC13, 'M', u'ثى'), - (0xFC14, 'M', u'ثي'), - (0xFC15, 'M', u'جح'), - (0xFC16, 'M', u'جم'), - (0xFC17, 'M', u'حج'), - (0xFC18, 'M', u'حم'), - (0xFC19, 'M', u'خج'), - (0xFC1A, 'M', u'خح'), - (0xFC1B, 'M', u'خم'), - (0xFC1C, 'M', u'سج'), - (0xFC1D, 'M', u'سح'), - (0xFC1E, 'M', u'سخ'), - (0xFC1F, 'M', u'سم'), - (0xFC20, 'M', u'صح'), - (0xFC21, 'M', u'صم'), - (0xFC22, 'M', u'ضج'), - (0xFC23, 'M', u'ضح'), - (0xFC24, 'M', u'ضخ'), - (0xFC25, 'M', u'ضم'), - (0xFC26, 'M', u'طح'), - ] - -def _seg_45(): - return [ - (0xFC27, 'M', u'طم'), - (0xFC28, 'M', u'ظم'), - (0xFC29, 'M', u'عج'), - (0xFC2A, 'M', u'عم'), - (0xFC2B, 'M', u'غج'), - (0xFC2C, 'M', u'غم'), - (0xFC2D, 'M', u'فج'), - (0xFC2E, 'M', u'فح'), - (0xFC2F, 'M', u'فخ'), - (0xFC30, 'M', u'فم'), - (0xFC31, 'M', u'فى'), - (0xFC32, 'M', u'في'), - (0xFC33, 'M', u'قح'), - (0xFC34, 'M', u'قم'), - (0xFC35, 'M', u'قى'), - (0xFC36, 'M', u'قي'), - (0xFC37, 'M', u'كا'), - (0xFC38, 'M', u'كج'), - (0xFC39, 'M', u'كح'), - (0xFC3A, 'M', u'كخ'), - (0xFC3B, 'M', u'كل'), - (0xFC3C, 'M', u'كم'), - (0xFC3D, 'M', u'كى'), - (0xFC3E, 'M', u'كي'), - (0xFC3F, 'M', u'لج'), - (0xFC40, 'M', u'لح'), - (0xFC41, 'M', u'لخ'), - (0xFC42, 'M', u'لم'), - (0xFC43, 'M', u'لى'), - (0xFC44, 'M', u'لي'), - (0xFC45, 'M', u'مج'), - (0xFC46, 'M', u'مح'), - (0xFC47, 'M', u'مخ'), - (0xFC48, 'M', u'مم'), - (0xFC49, 'M', u'مى'), - (0xFC4A, 'M', u'مي'), - (0xFC4B, 'M', u'نج'), - (0xFC4C, 'M', u'نح'), - (0xFC4D, 'M', u'نخ'), - (0xFC4E, 'M', u'نم'), - (0xFC4F, 'M', u'نى'), - (0xFC50, 'M', u'ني'), - (0xFC51, 'M', u'هج'), - (0xFC52, 'M', u'هم'), - (0xFC53, 'M', u'هى'), - (0xFC54, 'M', u'هي'), - (0xFC55, 'M', u'يج'), - (0xFC56, 'M', u'يح'), - (0xFC57, 'M', u'يخ'), - (0xFC58, 'M', u'يم'), - (0xFC59, 'M', u'يى'), - (0xFC5A, 'M', u'يي'), - (0xFC5B, 'M', u'ذٰ'), - (0xFC5C, 'M', u'رٰ'), - (0xFC5D, 'M', u'ىٰ'), - (0xFC5E, '3', u' ٌّ'), - (0xFC5F, '3', u' ٍّ'), - (0xFC60, '3', u' َّ'), - (0xFC61, '3', u' ُّ'), - (0xFC62, '3', u' ِّ'), - (0xFC63, '3', u' ّٰ'), - (0xFC64, 'M', u'ئر'), - (0xFC65, 'M', u'ئز'), - (0xFC66, 'M', u'ئم'), - (0xFC67, 'M', u'ئن'), - (0xFC68, 'M', u'ئى'), - (0xFC69, 'M', u'ئي'), - (0xFC6A, 'M', u'بر'), - (0xFC6B, 'M', u'بز'), - (0xFC6C, 'M', u'بم'), - (0xFC6D, 'M', u'بن'), - (0xFC6E, 'M', u'بى'), - (0xFC6F, 'M', u'بي'), - (0xFC70, 'M', u'تر'), - (0xFC71, 'M', u'تز'), - (0xFC72, 'M', u'تم'), - (0xFC73, 'M', u'تن'), - (0xFC74, 'M', u'تى'), - (0xFC75, 'M', u'تي'), - (0xFC76, 'M', u'ثر'), - (0xFC77, 'M', u'ثز'), - (0xFC78, 'M', u'ثم'), - (0xFC79, 'M', u'ثن'), - (0xFC7A, 'M', u'ثى'), - (0xFC7B, 'M', u'ثي'), - (0xFC7C, 'M', u'فى'), - (0xFC7D, 'M', u'في'), - (0xFC7E, 'M', u'قى'), - (0xFC7F, 'M', u'قي'), - (0xFC80, 'M', u'كا'), - (0xFC81, 'M', u'كل'), - (0xFC82, 'M', u'كم'), - (0xFC83, 'M', u'كى'), - (0xFC84, 'M', u'كي'), - (0xFC85, 'M', u'لم'), - (0xFC86, 'M', u'لى'), - (0xFC87, 'M', u'لي'), - (0xFC88, 'M', u'ما'), - (0xFC89, 'M', u'مم'), - (0xFC8A, 'M', u'نر'), - ] - -def _seg_46(): - return [ - (0xFC8B, 'M', u'نز'), - (0xFC8C, 'M', u'نم'), - (0xFC8D, 'M', u'نن'), - (0xFC8E, 'M', u'نى'), - (0xFC8F, 'M', u'ني'), - (0xFC90, 'M', u'ىٰ'), - (0xFC91, 'M', u'ير'), - (0xFC92, 'M', u'يز'), - (0xFC93, 'M', u'يم'), - (0xFC94, 'M', u'ين'), - (0xFC95, 'M', u'يى'), - (0xFC96, 'M', u'يي'), - (0xFC97, 'M', u'ئج'), - (0xFC98, 'M', u'ئح'), - (0xFC99, 'M', u'ئخ'), - (0xFC9A, 'M', u'ئم'), - (0xFC9B, 'M', u'ئه'), - (0xFC9C, 'M', u'بج'), - (0xFC9D, 'M', u'بح'), - (0xFC9E, 'M', u'بخ'), - (0xFC9F, 'M', u'بم'), - (0xFCA0, 'M', u'به'), - (0xFCA1, 'M', u'تج'), - (0xFCA2, 'M', u'تح'), - (0xFCA3, 'M', u'تخ'), - (0xFCA4, 'M', u'تم'), - (0xFCA5, 'M', u'ته'), - (0xFCA6, 'M', u'ثم'), - (0xFCA7, 'M', u'جح'), - (0xFCA8, 'M', u'جم'), - (0xFCA9, 'M', u'حج'), - (0xFCAA, 'M', u'حم'), - (0xFCAB, 'M', u'خج'), - (0xFCAC, 'M', u'خم'), - (0xFCAD, 'M', u'سج'), - (0xFCAE, 'M', u'سح'), - (0xFCAF, 'M', u'سخ'), - (0xFCB0, 'M', u'سم'), - (0xFCB1, 'M', u'صح'), - (0xFCB2, 'M', u'صخ'), - (0xFCB3, 'M', u'صم'), - (0xFCB4, 'M', u'ضج'), - (0xFCB5, 'M', u'ضح'), - (0xFCB6, 'M', u'ضخ'), - (0xFCB7, 'M', u'ضم'), - (0xFCB8, 'M', u'طح'), - (0xFCB9, 'M', u'ظم'), - (0xFCBA, 'M', u'عج'), - (0xFCBB, 'M', u'عم'), - (0xFCBC, 'M', u'غج'), - (0xFCBD, 'M', u'غم'), - (0xFCBE, 'M', u'فج'), - (0xFCBF, 'M', u'فح'), - (0xFCC0, 'M', u'فخ'), - (0xFCC1, 'M', u'فم'), - (0xFCC2, 'M', u'قح'), - (0xFCC3, 'M', u'قم'), - (0xFCC4, 'M', u'كج'), - (0xFCC5, 'M', u'كح'), - (0xFCC6, 'M', u'كخ'), - (0xFCC7, 'M', u'كل'), - (0xFCC8, 'M', u'كم'), - (0xFCC9, 'M', u'لج'), - (0xFCCA, 'M', u'لح'), - (0xFCCB, 'M', u'لخ'), - (0xFCCC, 'M', u'لم'), - (0xFCCD, 'M', u'له'), - (0xFCCE, 'M', u'مج'), - (0xFCCF, 'M', u'مح'), - (0xFCD0, 'M', u'مخ'), - (0xFCD1, 'M', u'مم'), - (0xFCD2, 'M', u'نج'), - (0xFCD3, 'M', u'نح'), - (0xFCD4, 'M', u'نخ'), - (0xFCD5, 'M', u'نم'), - (0xFCD6, 'M', u'نه'), - (0xFCD7, 'M', u'هج'), - (0xFCD8, 'M', u'هم'), - (0xFCD9, 'M', u'هٰ'), - (0xFCDA, 'M', u'يج'), - (0xFCDB, 'M', u'يح'), - (0xFCDC, 'M', u'يخ'), - (0xFCDD, 'M', u'يم'), - (0xFCDE, 'M', u'يه'), - (0xFCDF, 'M', u'ئم'), - (0xFCE0, 'M', u'ئه'), - (0xFCE1, 'M', u'بم'), - (0xFCE2, 'M', u'به'), - (0xFCE3, 'M', u'تم'), - (0xFCE4, 'M', u'ته'), - (0xFCE5, 'M', u'ثم'), - (0xFCE6, 'M', u'ثه'), - (0xFCE7, 'M', u'سم'), - (0xFCE8, 'M', u'سه'), - (0xFCE9, 'M', u'شم'), - (0xFCEA, 'M', u'شه'), - (0xFCEB, 'M', u'كل'), - (0xFCEC, 'M', u'كم'), - (0xFCED, 'M', u'لم'), - (0xFCEE, 'M', u'نم'), - ] - -def _seg_47(): - return [ - (0xFCEF, 'M', u'نه'), - (0xFCF0, 'M', u'يم'), - (0xFCF1, 'M', u'يه'), - (0xFCF2, 'M', u'ـَّ'), - (0xFCF3, 'M', u'ـُّ'), - (0xFCF4, 'M', u'ـِّ'), - (0xFCF5, 'M', u'طى'), - (0xFCF6, 'M', u'طي'), - (0xFCF7, 'M', u'عى'), - (0xFCF8, 'M', u'عي'), - (0xFCF9, 'M', u'غى'), - (0xFCFA, 'M', u'غي'), - (0xFCFB, 'M', u'سى'), - (0xFCFC, 'M', u'سي'), - (0xFCFD, 'M', u'شى'), - (0xFCFE, 'M', u'شي'), - (0xFCFF, 'M', u'حى'), - (0xFD00, 'M', u'حي'), - (0xFD01, 'M', u'جى'), - (0xFD02, 'M', u'جي'), - (0xFD03, 'M', u'خى'), - (0xFD04, 'M', u'خي'), - (0xFD05, 'M', u'صى'), - (0xFD06, 'M', u'صي'), - (0xFD07, 'M', u'ضى'), - (0xFD08, 'M', u'ضي'), - (0xFD09, 'M', u'شج'), - (0xFD0A, 'M', u'شح'), - (0xFD0B, 'M', u'شخ'), - (0xFD0C, 'M', u'شم'), - (0xFD0D, 'M', u'شر'), - (0xFD0E, 'M', u'سر'), - (0xFD0F, 'M', u'صر'), - (0xFD10, 'M', u'ضر'), - (0xFD11, 'M', u'طى'), - (0xFD12, 'M', u'طي'), - (0xFD13, 'M', u'عى'), - (0xFD14, 'M', u'عي'), - (0xFD15, 'M', u'غى'), - (0xFD16, 'M', u'غي'), - (0xFD17, 'M', u'سى'), - (0xFD18, 'M', u'سي'), - (0xFD19, 'M', u'شى'), - (0xFD1A, 'M', u'شي'), - (0xFD1B, 'M', u'حى'), - (0xFD1C, 'M', u'حي'), - (0xFD1D, 'M', u'جى'), - (0xFD1E, 'M', u'جي'), - (0xFD1F, 'M', u'خى'), - (0xFD20, 'M', u'خي'), - (0xFD21, 'M', u'صى'), - (0xFD22, 'M', u'صي'), - (0xFD23, 'M', u'ضى'), - (0xFD24, 'M', u'ضي'), - (0xFD25, 'M', u'شج'), - (0xFD26, 'M', u'شح'), - (0xFD27, 'M', u'شخ'), - (0xFD28, 'M', u'شم'), - (0xFD29, 'M', u'شر'), - (0xFD2A, 'M', u'سر'), - (0xFD2B, 'M', u'صر'), - (0xFD2C, 'M', u'ضر'), - (0xFD2D, 'M', u'شج'), - (0xFD2E, 'M', u'شح'), - (0xFD2F, 'M', u'شخ'), - (0xFD30, 'M', u'شم'), - (0xFD31, 'M', u'سه'), - (0xFD32, 'M', u'شه'), - (0xFD33, 'M', u'طم'), - (0xFD34, 'M', u'سج'), - (0xFD35, 'M', u'سح'), - (0xFD36, 'M', u'سخ'), - (0xFD37, 'M', u'شج'), - (0xFD38, 'M', u'شح'), - (0xFD39, 'M', u'شخ'), - (0xFD3A, 'M', u'طم'), - (0xFD3B, 'M', u'ظم'), - (0xFD3C, 'M', u'اً'), - (0xFD3E, 'V'), - (0xFD40, 'X'), - (0xFD50, 'M', u'تجم'), - (0xFD51, 'M', u'تحج'), - (0xFD53, 'M', u'تحم'), - (0xFD54, 'M', u'تخم'), - (0xFD55, 'M', u'تمج'), - (0xFD56, 'M', u'تمح'), - (0xFD57, 'M', u'تمخ'), - (0xFD58, 'M', u'جمح'), - (0xFD5A, 'M', u'حمي'), - (0xFD5B, 'M', u'حمى'), - (0xFD5C, 'M', u'سحج'), - (0xFD5D, 'M', u'سجح'), - (0xFD5E, 'M', u'سجى'), - (0xFD5F, 'M', u'سمح'), - (0xFD61, 'M', u'سمج'), - (0xFD62, 'M', u'سمم'), - (0xFD64, 'M', u'صحح'), - (0xFD66, 'M', u'صمم'), - (0xFD67, 'M', u'شحم'), - (0xFD69, 'M', u'شجي'), - ] - -def _seg_48(): - return [ - (0xFD6A, 'M', u'شمخ'), - (0xFD6C, 'M', u'شمم'), - (0xFD6E, 'M', u'ضحى'), - (0xFD6F, 'M', u'ضخم'), - (0xFD71, 'M', u'طمح'), - (0xFD73, 'M', u'طمم'), - (0xFD74, 'M', u'طمي'), - (0xFD75, 'M', u'عجم'), - (0xFD76, 'M', u'عمم'), - (0xFD78, 'M', u'عمى'), - (0xFD79, 'M', u'غمم'), - (0xFD7A, 'M', u'غمي'), - (0xFD7B, 'M', u'غمى'), - (0xFD7C, 'M', u'فخم'), - (0xFD7E, 'M', u'قمح'), - (0xFD7F, 'M', u'قمم'), - (0xFD80, 'M', u'لحم'), - (0xFD81, 'M', u'لحي'), - (0xFD82, 'M', u'لحى'), - (0xFD83, 'M', u'لجج'), - (0xFD85, 'M', u'لخم'), - (0xFD87, 'M', u'لمح'), - (0xFD89, 'M', u'محج'), - (0xFD8A, 'M', u'محم'), - (0xFD8B, 'M', u'محي'), - (0xFD8C, 'M', u'مجح'), - (0xFD8D, 'M', u'مجم'), - (0xFD8E, 'M', u'مخج'), - (0xFD8F, 'M', u'مخم'), - (0xFD90, 'X'), - (0xFD92, 'M', u'مجخ'), - (0xFD93, 'M', u'همج'), - (0xFD94, 'M', u'همم'), - (0xFD95, 'M', u'نحم'), - (0xFD96, 'M', u'نحى'), - (0xFD97, 'M', u'نجم'), - (0xFD99, 'M', u'نجى'), - (0xFD9A, 'M', u'نمي'), - (0xFD9B, 'M', u'نمى'), - (0xFD9C, 'M', u'يمم'), - (0xFD9E, 'M', u'بخي'), - (0xFD9F, 'M', u'تجي'), - (0xFDA0, 'M', u'تجى'), - (0xFDA1, 'M', u'تخي'), - (0xFDA2, 'M', u'تخى'), - (0xFDA3, 'M', u'تمي'), - (0xFDA4, 'M', u'تمى'), - (0xFDA5, 'M', u'جمي'), - (0xFDA6, 'M', u'جحى'), - (0xFDA7, 'M', u'جمى'), - (0xFDA8, 'M', u'سخى'), - (0xFDA9, 'M', u'صحي'), - (0xFDAA, 'M', u'شحي'), - (0xFDAB, 'M', u'ضحي'), - (0xFDAC, 'M', u'لجي'), - (0xFDAD, 'M', u'لمي'), - (0xFDAE, 'M', u'يحي'), - (0xFDAF, 'M', u'يجي'), - (0xFDB0, 'M', u'يمي'), - (0xFDB1, 'M', u'ممي'), - (0xFDB2, 'M', u'قمي'), - (0xFDB3, 'M', u'نحي'), - (0xFDB4, 'M', u'قمح'), - (0xFDB5, 'M', u'لحم'), - (0xFDB6, 'M', u'عمي'), - (0xFDB7, 'M', u'كمي'), - (0xFDB8, 'M', u'نجح'), - (0xFDB9, 'M', u'مخي'), - (0xFDBA, 'M', u'لجم'), - (0xFDBB, 'M', u'كمم'), - (0xFDBC, 'M', u'لجم'), - (0xFDBD, 'M', u'نجح'), - (0xFDBE, 'M', u'جحي'), - (0xFDBF, 'M', u'حجي'), - (0xFDC0, 'M', u'مجي'), - (0xFDC1, 'M', u'فمي'), - (0xFDC2, 'M', u'بحي'), - (0xFDC3, 'M', u'كمم'), - (0xFDC4, 'M', u'عجم'), - (0xFDC5, 'M', u'صمم'), - (0xFDC6, 'M', u'سخي'), - (0xFDC7, 'M', u'نجي'), - (0xFDC8, 'X'), - (0xFDF0, 'M', u'صلے'), - (0xFDF1, 'M', u'قلے'), - (0xFDF2, 'M', u'الله'), - (0xFDF3, 'M', u'اكبر'), - (0xFDF4, 'M', u'محمد'), - (0xFDF5, 'M', u'صلعم'), - (0xFDF6, 'M', u'رسول'), - (0xFDF7, 'M', u'عليه'), - (0xFDF8, 'M', u'وسلم'), - (0xFDF9, 'M', u'صلى'), - (0xFDFA, '3', u'صلى الله عليه وسلم'), - (0xFDFB, '3', u'جل جلاله'), - (0xFDFC, 'M', u'ریال'), - (0xFDFD, 'V'), - (0xFDFE, 'X'), - (0xFE00, 'I'), - (0xFE10, '3', u','), - ] - -def _seg_49(): - return [ - (0xFE11, 'M', u'、'), - (0xFE12, 'X'), - (0xFE13, '3', u':'), - (0xFE14, '3', u';'), - (0xFE15, '3', u'!'), - (0xFE16, '3', u'?'), - (0xFE17, 'M', u'〖'), - (0xFE18, 'M', u'〗'), - (0xFE19, 'X'), - (0xFE20, 'V'), - (0xFE30, 'X'), - (0xFE31, 'M', u'—'), - (0xFE32, 'M', u'–'), - (0xFE33, '3', u'_'), - (0xFE35, '3', u'('), - (0xFE36, '3', u')'), - (0xFE37, '3', u'{'), - (0xFE38, '3', u'}'), - (0xFE39, 'M', u'〔'), - (0xFE3A, 'M', u'〕'), - (0xFE3B, 'M', u'【'), - (0xFE3C, 'M', u'】'), - (0xFE3D, 'M', u'《'), - (0xFE3E, 'M', u'》'), - (0xFE3F, 'M', u'〈'), - (0xFE40, 'M', u'〉'), - (0xFE41, 'M', u'「'), - (0xFE42, 'M', u'」'), - (0xFE43, 'M', u'『'), - (0xFE44, 'M', u'』'), - (0xFE45, 'V'), - (0xFE47, '3', u'['), - (0xFE48, '3', u']'), - (0xFE49, '3', u' ̅'), - (0xFE4D, '3', u'_'), - (0xFE50, '3', u','), - (0xFE51, 'M', u'、'), - (0xFE52, 'X'), - (0xFE54, '3', u';'), - (0xFE55, '3', u':'), - (0xFE56, '3', u'?'), - (0xFE57, '3', u'!'), - (0xFE58, 'M', u'—'), - (0xFE59, '3', u'('), - (0xFE5A, '3', u')'), - (0xFE5B, '3', u'{'), - (0xFE5C, '3', u'}'), - (0xFE5D, 'M', u'〔'), - (0xFE5E, 'M', u'〕'), - (0xFE5F, '3', u'#'), - (0xFE60, '3', u'&'), - (0xFE61, '3', u'*'), - (0xFE62, '3', u'+'), - (0xFE63, 'M', u'-'), - (0xFE64, '3', u'<'), - (0xFE65, '3', u'>'), - (0xFE66, '3', u'='), - (0xFE67, 'X'), - (0xFE68, '3', u'\\'), - (0xFE69, '3', u'$'), - (0xFE6A, '3', u'%'), - (0xFE6B, '3', u'@'), - (0xFE6C, 'X'), - (0xFE70, '3', u' ً'), - (0xFE71, 'M', u'ـً'), - (0xFE72, '3', u' ٌ'), - (0xFE73, 'V'), - (0xFE74, '3', u' ٍ'), - (0xFE75, 'X'), - (0xFE76, '3', u' َ'), - (0xFE77, 'M', u'ـَ'), - (0xFE78, '3', u' ُ'), - (0xFE79, 'M', u'ـُ'), - (0xFE7A, '3', u' ِ'), - (0xFE7B, 'M', u'ـِ'), - (0xFE7C, '3', u' ّ'), - (0xFE7D, 'M', u'ـّ'), - (0xFE7E, '3', u' ْ'), - (0xFE7F, 'M', u'ـْ'), - (0xFE80, 'M', u'ء'), - (0xFE81, 'M', u'آ'), - (0xFE83, 'M', u'أ'), - (0xFE85, 'M', u'ؤ'), - (0xFE87, 'M', u'إ'), - (0xFE89, 'M', u'ئ'), - (0xFE8D, 'M', u'ا'), - (0xFE8F, 'M', u'ب'), - (0xFE93, 'M', u'ة'), - (0xFE95, 'M', u'ت'), - (0xFE99, 'M', u'ث'), - (0xFE9D, 'M', u'ج'), - (0xFEA1, 'M', u'ح'), - (0xFEA5, 'M', u'خ'), - (0xFEA9, 'M', u'د'), - (0xFEAB, 'M', u'ذ'), - (0xFEAD, 'M', u'ر'), - (0xFEAF, 'M', u'ز'), - (0xFEB1, 'M', u'س'), - (0xFEB5, 'M', u'ش'), - (0xFEB9, 'M', u'ص'), - ] - -def _seg_50(): - return [ - (0xFEBD, 'M', u'ض'), - (0xFEC1, 'M', u'ط'), - (0xFEC5, 'M', u'ظ'), - (0xFEC9, 'M', u'ع'), - (0xFECD, 'M', u'غ'), - (0xFED1, 'M', u'ف'), - (0xFED5, 'M', u'ق'), - (0xFED9, 'M', u'ك'), - (0xFEDD, 'M', u'ل'), - (0xFEE1, 'M', u'م'), - (0xFEE5, 'M', u'ن'), - (0xFEE9, 'M', u'ه'), - (0xFEED, 'M', u'و'), - (0xFEEF, 'M', u'ى'), - (0xFEF1, 'M', u'ي'), - (0xFEF5, 'M', u'لآ'), - (0xFEF7, 'M', u'لأ'), - (0xFEF9, 'M', u'لإ'), - (0xFEFB, 'M', u'لا'), - (0xFEFD, 'X'), - (0xFEFF, 'I'), - (0xFF00, 'X'), - (0xFF01, '3', u'!'), - (0xFF02, '3', u'"'), - (0xFF03, '3', u'#'), - (0xFF04, '3', u'$'), - (0xFF05, '3', u'%'), - (0xFF06, '3', u'&'), - (0xFF07, '3', u'\''), - (0xFF08, '3', u'('), - (0xFF09, '3', u')'), - (0xFF0A, '3', u'*'), - (0xFF0B, '3', u'+'), - (0xFF0C, '3', u','), - (0xFF0D, 'M', u'-'), - (0xFF0E, 'M', u'.'), - (0xFF0F, '3', u'/'), - (0xFF10, 'M', u'0'), - (0xFF11, 'M', u'1'), - (0xFF12, 'M', u'2'), - (0xFF13, 'M', u'3'), - (0xFF14, 'M', u'4'), - (0xFF15, 'M', u'5'), - (0xFF16, 'M', u'6'), - (0xFF17, 'M', u'7'), - (0xFF18, 'M', u'8'), - (0xFF19, 'M', u'9'), - (0xFF1A, '3', u':'), - (0xFF1B, '3', u';'), - (0xFF1C, '3', u'<'), - (0xFF1D, '3', u'='), - (0xFF1E, '3', u'>'), - (0xFF1F, '3', u'?'), - (0xFF20, '3', u'@'), - (0xFF21, 'M', u'a'), - (0xFF22, 'M', u'b'), - (0xFF23, 'M', u'c'), - (0xFF24, 'M', u'd'), - (0xFF25, 'M', u'e'), - (0xFF26, 'M', u'f'), - (0xFF27, 'M', u'g'), - (0xFF28, 'M', u'h'), - (0xFF29, 'M', u'i'), - (0xFF2A, 'M', u'j'), - (0xFF2B, 'M', u'k'), - (0xFF2C, 'M', u'l'), - (0xFF2D, 'M', u'm'), - (0xFF2E, 'M', u'n'), - (0xFF2F, 'M', u'o'), - (0xFF30, 'M', u'p'), - (0xFF31, 'M', u'q'), - (0xFF32, 'M', u'r'), - (0xFF33, 'M', u's'), - (0xFF34, 'M', u't'), - (0xFF35, 'M', u'u'), - (0xFF36, 'M', u'v'), - (0xFF37, 'M', u'w'), - (0xFF38, 'M', u'x'), - (0xFF39, 'M', u'y'), - (0xFF3A, 'M', u'z'), - (0xFF3B, '3', u'['), - (0xFF3C, '3', u'\\'), - (0xFF3D, '3', u']'), - (0xFF3E, '3', u'^'), - (0xFF3F, '3', u'_'), - (0xFF40, '3', u'`'), - (0xFF41, 'M', u'a'), - (0xFF42, 'M', u'b'), - (0xFF43, 'M', u'c'), - (0xFF44, 'M', u'd'), - (0xFF45, 'M', u'e'), - (0xFF46, 'M', u'f'), - (0xFF47, 'M', u'g'), - (0xFF48, 'M', u'h'), - (0xFF49, 'M', u'i'), - (0xFF4A, 'M', u'j'), - (0xFF4B, 'M', u'k'), - (0xFF4C, 'M', u'l'), - (0xFF4D, 'M', u'm'), - (0xFF4E, 'M', u'n'), - ] - -def _seg_51(): - return [ - (0xFF4F, 'M', u'o'), - (0xFF50, 'M', u'p'), - (0xFF51, 'M', u'q'), - (0xFF52, 'M', u'r'), - (0xFF53, 'M', u's'), - (0xFF54, 'M', u't'), - (0xFF55, 'M', u'u'), - (0xFF56, 'M', u'v'), - (0xFF57, 'M', u'w'), - (0xFF58, 'M', u'x'), - (0xFF59, 'M', u'y'), - (0xFF5A, 'M', u'z'), - (0xFF5B, '3', u'{'), - (0xFF5C, '3', u'|'), - (0xFF5D, '3', u'}'), - (0xFF5E, '3', u'~'), - (0xFF5F, 'M', u'⦅'), - (0xFF60, 'M', u'⦆'), - (0xFF61, 'M', u'.'), - (0xFF62, 'M', u'「'), - (0xFF63, 'M', u'」'), - (0xFF64, 'M', u'、'), - (0xFF65, 'M', u'・'), - (0xFF66, 'M', u'ヲ'), - (0xFF67, 'M', u'ァ'), - (0xFF68, 'M', u'ィ'), - (0xFF69, 'M', u'ゥ'), - (0xFF6A, 'M', u'ェ'), - (0xFF6B, 'M', u'ォ'), - (0xFF6C, 'M', u'ャ'), - (0xFF6D, 'M', u'ュ'), - (0xFF6E, 'M', u'ョ'), - (0xFF6F, 'M', u'ッ'), - (0xFF70, 'M', u'ー'), - (0xFF71, 'M', u'ア'), - (0xFF72, 'M', u'イ'), - (0xFF73, 'M', u'ウ'), - (0xFF74, 'M', u'エ'), - (0xFF75, 'M', u'オ'), - (0xFF76, 'M', u'カ'), - (0xFF77, 'M', u'キ'), - (0xFF78, 'M', u'ク'), - (0xFF79, 'M', u'ケ'), - (0xFF7A, 'M', u'コ'), - (0xFF7B, 'M', u'サ'), - (0xFF7C, 'M', u'シ'), - (0xFF7D, 'M', u'ス'), - (0xFF7E, 'M', u'セ'), - (0xFF7F, 'M', u'ソ'), - (0xFF80, 'M', u'タ'), - (0xFF81, 'M', u'チ'), - (0xFF82, 'M', u'ツ'), - (0xFF83, 'M', u'テ'), - (0xFF84, 'M', u'ト'), - (0xFF85, 'M', u'ナ'), - (0xFF86, 'M', u'ニ'), - (0xFF87, 'M', u'ヌ'), - (0xFF88, 'M', u'ネ'), - (0xFF89, 'M', u'ノ'), - (0xFF8A, 'M', u'ハ'), - (0xFF8B, 'M', u'ヒ'), - (0xFF8C, 'M', u'フ'), - (0xFF8D, 'M', u'ヘ'), - (0xFF8E, 'M', u'ホ'), - (0xFF8F, 'M', u'マ'), - (0xFF90, 'M', u'ミ'), - (0xFF91, 'M', u'ム'), - (0xFF92, 'M', u'メ'), - (0xFF93, 'M', u'モ'), - (0xFF94, 'M', u'ヤ'), - (0xFF95, 'M', u'ユ'), - (0xFF96, 'M', u'ヨ'), - (0xFF97, 'M', u'ラ'), - (0xFF98, 'M', u'リ'), - (0xFF99, 'M', u'ル'), - (0xFF9A, 'M', u'レ'), - (0xFF9B, 'M', u'ロ'), - (0xFF9C, 'M', u'ワ'), - (0xFF9D, 'M', u'ン'), - (0xFF9E, 'M', u'゙'), - (0xFF9F, 'M', u'゚'), - (0xFFA0, 'X'), - (0xFFA1, 'M', u'ᄀ'), - (0xFFA2, 'M', u'ᄁ'), - (0xFFA3, 'M', u'ᆪ'), - (0xFFA4, 'M', u'ᄂ'), - (0xFFA5, 'M', u'ᆬ'), - (0xFFA6, 'M', u'ᆭ'), - (0xFFA7, 'M', u'ᄃ'), - (0xFFA8, 'M', u'ᄄ'), - (0xFFA9, 'M', u'ᄅ'), - (0xFFAA, 'M', u'ᆰ'), - (0xFFAB, 'M', u'ᆱ'), - (0xFFAC, 'M', u'ᆲ'), - (0xFFAD, 'M', u'ᆳ'), - (0xFFAE, 'M', u'ᆴ'), - (0xFFAF, 'M', u'ᆵ'), - (0xFFB0, 'M', u'ᄚ'), - (0xFFB1, 'M', u'ᄆ'), - (0xFFB2, 'M', u'ᄇ'), - ] - -def _seg_52(): - return [ - (0xFFB3, 'M', u'ᄈ'), - (0xFFB4, 'M', u'ᄡ'), - (0xFFB5, 'M', u'ᄉ'), - (0xFFB6, 'M', u'ᄊ'), - (0xFFB7, 'M', u'ᄋ'), - (0xFFB8, 'M', u'ᄌ'), - (0xFFB9, 'M', u'ᄍ'), - (0xFFBA, 'M', u'ᄎ'), - (0xFFBB, 'M', u'ᄏ'), - (0xFFBC, 'M', u'ᄐ'), - (0xFFBD, 'M', u'ᄑ'), - (0xFFBE, 'M', u'ᄒ'), - (0xFFBF, 'X'), - (0xFFC2, 'M', u'ᅡ'), - (0xFFC3, 'M', u'ᅢ'), - (0xFFC4, 'M', u'ᅣ'), - (0xFFC5, 'M', u'ᅤ'), - (0xFFC6, 'M', u'ᅥ'), - (0xFFC7, 'M', u'ᅦ'), - (0xFFC8, 'X'), - (0xFFCA, 'M', u'ᅧ'), - (0xFFCB, 'M', u'ᅨ'), - (0xFFCC, 'M', u'ᅩ'), - (0xFFCD, 'M', u'ᅪ'), - (0xFFCE, 'M', u'ᅫ'), - (0xFFCF, 'M', u'ᅬ'), - (0xFFD0, 'X'), - (0xFFD2, 'M', u'ᅭ'), - (0xFFD3, 'M', u'ᅮ'), - (0xFFD4, 'M', u'ᅯ'), - (0xFFD5, 'M', u'ᅰ'), - (0xFFD6, 'M', u'ᅱ'), - (0xFFD7, 'M', u'ᅲ'), - (0xFFD8, 'X'), - (0xFFDA, 'M', u'ᅳ'), - (0xFFDB, 'M', u'ᅴ'), - (0xFFDC, 'M', u'ᅵ'), - (0xFFDD, 'X'), - (0xFFE0, 'M', u'¢'), - (0xFFE1, 'M', u'£'), - (0xFFE2, 'M', u'¬'), - (0xFFE3, '3', u' ̄'), - (0xFFE4, 'M', u'¦'), - (0xFFE5, 'M', u'¥'), - (0xFFE6, 'M', u'₩'), - (0xFFE7, 'X'), - (0xFFE8, 'M', u'│'), - (0xFFE9, 'M', u'←'), - (0xFFEA, 'M', u'↑'), - (0xFFEB, 'M', u'→'), - (0xFFEC, 'M', u'↓'), - (0xFFED, 'M', u'■'), - (0xFFEE, 'M', u'○'), - (0xFFEF, 'X'), - (0x10000, 'V'), - (0x1000C, 'X'), - (0x1000D, 'V'), - (0x10027, 'X'), - (0x10028, 'V'), - (0x1003B, 'X'), - (0x1003C, 'V'), - (0x1003E, 'X'), - (0x1003F, 'V'), - (0x1004E, 'X'), - (0x10050, 'V'), - (0x1005E, 'X'), - (0x10080, 'V'), - (0x100FB, 'X'), - (0x10100, 'V'), - (0x10103, 'X'), - (0x10107, 'V'), - (0x10134, 'X'), - (0x10137, 'V'), - (0x1018F, 'X'), - (0x10190, 'V'), - (0x1019C, 'X'), - (0x101A0, 'V'), - (0x101A1, 'X'), - (0x101D0, 'V'), - (0x101FE, 'X'), - (0x10280, 'V'), - (0x1029D, 'X'), - (0x102A0, 'V'), - (0x102D1, 'X'), - (0x102E0, 'V'), - (0x102FC, 'X'), - (0x10300, 'V'), - (0x10324, 'X'), - (0x1032D, 'V'), - (0x1034B, 'X'), - (0x10350, 'V'), - (0x1037B, 'X'), - (0x10380, 'V'), - (0x1039E, 'X'), - (0x1039F, 'V'), - (0x103C4, 'X'), - (0x103C8, 'V'), - (0x103D6, 'X'), - (0x10400, 'M', u'𐐨'), - (0x10401, 'M', u'𐐩'), - ] - -def _seg_53(): - return [ - (0x10402, 'M', u'𐐪'), - (0x10403, 'M', u'𐐫'), - (0x10404, 'M', u'𐐬'), - (0x10405, 'M', u'𐐭'), - (0x10406, 'M', u'𐐮'), - (0x10407, 'M', u'𐐯'), - (0x10408, 'M', u'𐐰'), - (0x10409, 'M', u'𐐱'), - (0x1040A, 'M', u'𐐲'), - (0x1040B, 'M', u'𐐳'), - (0x1040C, 'M', u'𐐴'), - (0x1040D, 'M', u'𐐵'), - (0x1040E, 'M', u'𐐶'), - (0x1040F, 'M', u'𐐷'), - (0x10410, 'M', u'𐐸'), - (0x10411, 'M', u'𐐹'), - (0x10412, 'M', u'𐐺'), - (0x10413, 'M', u'𐐻'), - (0x10414, 'M', u'𐐼'), - (0x10415, 'M', u'𐐽'), - (0x10416, 'M', u'𐐾'), - (0x10417, 'M', u'𐐿'), - (0x10418, 'M', u'𐑀'), - (0x10419, 'M', u'𐑁'), - (0x1041A, 'M', u'𐑂'), - (0x1041B, 'M', u'𐑃'), - (0x1041C, 'M', u'𐑄'), - (0x1041D, 'M', u'𐑅'), - (0x1041E, 'M', u'𐑆'), - (0x1041F, 'M', u'𐑇'), - (0x10420, 'M', u'𐑈'), - (0x10421, 'M', u'𐑉'), - (0x10422, 'M', u'𐑊'), - (0x10423, 'M', u'𐑋'), - (0x10424, 'M', u'𐑌'), - (0x10425, 'M', u'𐑍'), - (0x10426, 'M', u'𐑎'), - (0x10427, 'M', u'𐑏'), - (0x10428, 'V'), - (0x1049E, 'X'), - (0x104A0, 'V'), - (0x104AA, 'X'), - (0x104B0, 'M', u'𐓘'), - (0x104B1, 'M', u'𐓙'), - (0x104B2, 'M', u'𐓚'), - (0x104B3, 'M', u'𐓛'), - (0x104B4, 'M', u'𐓜'), - (0x104B5, 'M', u'𐓝'), - (0x104B6, 'M', u'𐓞'), - (0x104B7, 'M', u'𐓟'), - (0x104B8, 'M', u'𐓠'), - (0x104B9, 'M', u'𐓡'), - (0x104BA, 'M', u'𐓢'), - (0x104BB, 'M', u'𐓣'), - (0x104BC, 'M', u'𐓤'), - (0x104BD, 'M', u'𐓥'), - (0x104BE, 'M', u'𐓦'), - (0x104BF, 'M', u'𐓧'), - (0x104C0, 'M', u'𐓨'), - (0x104C1, 'M', u'𐓩'), - (0x104C2, 'M', u'𐓪'), - (0x104C3, 'M', u'𐓫'), - (0x104C4, 'M', u'𐓬'), - (0x104C5, 'M', u'𐓭'), - (0x104C6, 'M', u'𐓮'), - (0x104C7, 'M', u'𐓯'), - (0x104C8, 'M', u'𐓰'), - (0x104C9, 'M', u'𐓱'), - (0x104CA, 'M', u'𐓲'), - (0x104CB, 'M', u'𐓳'), - (0x104CC, 'M', u'𐓴'), - (0x104CD, 'M', u'𐓵'), - (0x104CE, 'M', u'𐓶'), - (0x104CF, 'M', u'𐓷'), - (0x104D0, 'M', u'𐓸'), - (0x104D1, 'M', u'𐓹'), - (0x104D2, 'M', u'𐓺'), - (0x104D3, 'M', u'𐓻'), - (0x104D4, 'X'), - (0x104D8, 'V'), - (0x104FC, 'X'), - (0x10500, 'V'), - (0x10528, 'X'), - (0x10530, 'V'), - (0x10564, 'X'), - (0x1056F, 'V'), - (0x10570, 'X'), - (0x10600, 'V'), - (0x10737, 'X'), - (0x10740, 'V'), - (0x10756, 'X'), - (0x10760, 'V'), - (0x10768, 'X'), - (0x10800, 'V'), - (0x10806, 'X'), - (0x10808, 'V'), - (0x10809, 'X'), - (0x1080A, 'V'), - (0x10836, 'X'), - (0x10837, 'V'), - ] - -def _seg_54(): - return [ - (0x10839, 'X'), - (0x1083C, 'V'), - (0x1083D, 'X'), - (0x1083F, 'V'), - (0x10856, 'X'), - (0x10857, 'V'), - (0x1089F, 'X'), - (0x108A7, 'V'), - (0x108B0, 'X'), - (0x108E0, 'V'), - (0x108F3, 'X'), - (0x108F4, 'V'), - (0x108F6, 'X'), - (0x108FB, 'V'), - (0x1091C, 'X'), - (0x1091F, 'V'), - (0x1093A, 'X'), - (0x1093F, 'V'), - (0x10940, 'X'), - (0x10980, 'V'), - (0x109B8, 'X'), - (0x109BC, 'V'), - (0x109D0, 'X'), - (0x109D2, 'V'), - (0x10A04, 'X'), - (0x10A05, 'V'), - (0x10A07, 'X'), - (0x10A0C, 'V'), - (0x10A14, 'X'), - (0x10A15, 'V'), - (0x10A18, 'X'), - (0x10A19, 'V'), - (0x10A36, 'X'), - (0x10A38, 'V'), - (0x10A3B, 'X'), - (0x10A3F, 'V'), - (0x10A49, 'X'), - (0x10A50, 'V'), - (0x10A59, 'X'), - (0x10A60, 'V'), - (0x10AA0, 'X'), - (0x10AC0, 'V'), - (0x10AE7, 'X'), - (0x10AEB, 'V'), - (0x10AF7, 'X'), - (0x10B00, 'V'), - (0x10B36, 'X'), - (0x10B39, 'V'), - (0x10B56, 'X'), - (0x10B58, 'V'), - (0x10B73, 'X'), - (0x10B78, 'V'), - (0x10B92, 'X'), - (0x10B99, 'V'), - (0x10B9D, 'X'), - (0x10BA9, 'V'), - (0x10BB0, 'X'), - (0x10C00, 'V'), - (0x10C49, 'X'), - (0x10C80, 'M', u'𐳀'), - (0x10C81, 'M', u'𐳁'), - (0x10C82, 'M', u'𐳂'), - (0x10C83, 'M', u'𐳃'), - (0x10C84, 'M', u'𐳄'), - (0x10C85, 'M', u'𐳅'), - (0x10C86, 'M', u'𐳆'), - (0x10C87, 'M', u'𐳇'), - (0x10C88, 'M', u'𐳈'), - (0x10C89, 'M', u'𐳉'), - (0x10C8A, 'M', u'𐳊'), - (0x10C8B, 'M', u'𐳋'), - (0x10C8C, 'M', u'𐳌'), - (0x10C8D, 'M', u'𐳍'), - (0x10C8E, 'M', u'𐳎'), - (0x10C8F, 'M', u'𐳏'), - (0x10C90, 'M', u'𐳐'), - (0x10C91, 'M', u'𐳑'), - (0x10C92, 'M', u'𐳒'), - (0x10C93, 'M', u'𐳓'), - (0x10C94, 'M', u'𐳔'), - (0x10C95, 'M', u'𐳕'), - (0x10C96, 'M', u'𐳖'), - (0x10C97, 'M', u'𐳗'), - (0x10C98, 'M', u'𐳘'), - (0x10C99, 'M', u'𐳙'), - (0x10C9A, 'M', u'𐳚'), - (0x10C9B, 'M', u'𐳛'), - (0x10C9C, 'M', u'𐳜'), - (0x10C9D, 'M', u'𐳝'), - (0x10C9E, 'M', u'𐳞'), - (0x10C9F, 'M', u'𐳟'), - (0x10CA0, 'M', u'𐳠'), - (0x10CA1, 'M', u'𐳡'), - (0x10CA2, 'M', u'𐳢'), - (0x10CA3, 'M', u'𐳣'), - (0x10CA4, 'M', u'𐳤'), - (0x10CA5, 'M', u'𐳥'), - (0x10CA6, 'M', u'𐳦'), - (0x10CA7, 'M', u'𐳧'), - (0x10CA8, 'M', u'𐳨'), - ] - -def _seg_55(): - return [ - (0x10CA9, 'M', u'𐳩'), - (0x10CAA, 'M', u'𐳪'), - (0x10CAB, 'M', u'𐳫'), - (0x10CAC, 'M', u'𐳬'), - (0x10CAD, 'M', u'𐳭'), - (0x10CAE, 'M', u'𐳮'), - (0x10CAF, 'M', u'𐳯'), - (0x10CB0, 'M', u'𐳰'), - (0x10CB1, 'M', u'𐳱'), - (0x10CB2, 'M', u'𐳲'), - (0x10CB3, 'X'), - (0x10CC0, 'V'), - (0x10CF3, 'X'), - (0x10CFA, 'V'), - (0x10D28, 'X'), - (0x10D30, 'V'), - (0x10D3A, 'X'), - (0x10E60, 'V'), - (0x10E7F, 'X'), - (0x10F00, 'V'), - (0x10F28, 'X'), - (0x10F30, 'V'), - (0x10F5A, 'X'), - (0x11000, 'V'), - (0x1104E, 'X'), - (0x11052, 'V'), - (0x11070, 'X'), - (0x1107F, 'V'), - (0x110BD, 'X'), - (0x110BE, 'V'), - (0x110C2, 'X'), - (0x110D0, 'V'), - (0x110E9, 'X'), - (0x110F0, 'V'), - (0x110FA, 'X'), - (0x11100, 'V'), - (0x11135, 'X'), - (0x11136, 'V'), - (0x11147, 'X'), - (0x11150, 'V'), - (0x11177, 'X'), - (0x11180, 'V'), - (0x111CE, 'X'), - (0x111D0, 'V'), - (0x111E0, 'X'), - (0x111E1, 'V'), - (0x111F5, 'X'), - (0x11200, 'V'), - (0x11212, 'X'), - (0x11213, 'V'), - (0x1123F, 'X'), - (0x11280, 'V'), - (0x11287, 'X'), - (0x11288, 'V'), - (0x11289, 'X'), - (0x1128A, 'V'), - (0x1128E, 'X'), - (0x1128F, 'V'), - (0x1129E, 'X'), - (0x1129F, 'V'), - (0x112AA, 'X'), - (0x112B0, 'V'), - (0x112EB, 'X'), - (0x112F0, 'V'), - (0x112FA, 'X'), - (0x11300, 'V'), - (0x11304, 'X'), - (0x11305, 'V'), - (0x1130D, 'X'), - (0x1130F, 'V'), - (0x11311, 'X'), - (0x11313, 'V'), - (0x11329, 'X'), - (0x1132A, 'V'), - (0x11331, 'X'), - (0x11332, 'V'), - (0x11334, 'X'), - (0x11335, 'V'), - (0x1133A, 'X'), - (0x1133B, 'V'), - (0x11345, 'X'), - (0x11347, 'V'), - (0x11349, 'X'), - (0x1134B, 'V'), - (0x1134E, 'X'), - (0x11350, 'V'), - (0x11351, 'X'), - (0x11357, 'V'), - (0x11358, 'X'), - (0x1135D, 'V'), - (0x11364, 'X'), - (0x11366, 'V'), - (0x1136D, 'X'), - (0x11370, 'V'), - (0x11375, 'X'), - (0x11400, 'V'), - (0x1145A, 'X'), - (0x1145B, 'V'), - (0x1145C, 'X'), - (0x1145D, 'V'), - ] - -def _seg_56(): - return [ - (0x1145F, 'X'), - (0x11480, 'V'), - (0x114C8, 'X'), - (0x114D0, 'V'), - (0x114DA, 'X'), - (0x11580, 'V'), - (0x115B6, 'X'), - (0x115B8, 'V'), - (0x115DE, 'X'), - (0x11600, 'V'), - (0x11645, 'X'), - (0x11650, 'V'), - (0x1165A, 'X'), - (0x11660, 'V'), - (0x1166D, 'X'), - (0x11680, 'V'), - (0x116B8, 'X'), - (0x116C0, 'V'), - (0x116CA, 'X'), - (0x11700, 'V'), - (0x1171B, 'X'), - (0x1171D, 'V'), - (0x1172C, 'X'), - (0x11730, 'V'), - (0x11740, 'X'), - (0x11800, 'V'), - (0x1183C, 'X'), - (0x118A0, 'M', u'𑣀'), - (0x118A1, 'M', u'𑣁'), - (0x118A2, 'M', u'𑣂'), - (0x118A3, 'M', u'𑣃'), - (0x118A4, 'M', u'𑣄'), - (0x118A5, 'M', u'𑣅'), - (0x118A6, 'M', u'𑣆'), - (0x118A7, 'M', u'𑣇'), - (0x118A8, 'M', u'𑣈'), - (0x118A9, 'M', u'𑣉'), - (0x118AA, 'M', u'𑣊'), - (0x118AB, 'M', u'𑣋'), - (0x118AC, 'M', u'𑣌'), - (0x118AD, 'M', u'𑣍'), - (0x118AE, 'M', u'𑣎'), - (0x118AF, 'M', u'𑣏'), - (0x118B0, 'M', u'𑣐'), - (0x118B1, 'M', u'𑣑'), - (0x118B2, 'M', u'𑣒'), - (0x118B3, 'M', u'𑣓'), - (0x118B4, 'M', u'𑣔'), - (0x118B5, 'M', u'𑣕'), - (0x118B6, 'M', u'𑣖'), - (0x118B7, 'M', u'𑣗'), - (0x118B8, 'M', u'𑣘'), - (0x118B9, 'M', u'𑣙'), - (0x118BA, 'M', u'𑣚'), - (0x118BB, 'M', u'𑣛'), - (0x118BC, 'M', u'𑣜'), - (0x118BD, 'M', u'𑣝'), - (0x118BE, 'M', u'𑣞'), - (0x118BF, 'M', u'𑣟'), - (0x118C0, 'V'), - (0x118F3, 'X'), - (0x118FF, 'V'), - (0x11900, 'X'), - (0x11A00, 'V'), - (0x11A48, 'X'), - (0x11A50, 'V'), - (0x11A84, 'X'), - (0x11A86, 'V'), - (0x11AA3, 'X'), - (0x11AC0, 'V'), - (0x11AF9, 'X'), - (0x11C00, 'V'), - (0x11C09, 'X'), - (0x11C0A, 'V'), - (0x11C37, 'X'), - (0x11C38, 'V'), - (0x11C46, 'X'), - (0x11C50, 'V'), - (0x11C6D, 'X'), - (0x11C70, 'V'), - (0x11C90, 'X'), - (0x11C92, 'V'), - (0x11CA8, 'X'), - (0x11CA9, 'V'), - (0x11CB7, 'X'), - (0x11D00, 'V'), - (0x11D07, 'X'), - (0x11D08, 'V'), - (0x11D0A, 'X'), - (0x11D0B, 'V'), - (0x11D37, 'X'), - (0x11D3A, 'V'), - (0x11D3B, 'X'), - (0x11D3C, 'V'), - (0x11D3E, 'X'), - (0x11D3F, 'V'), - (0x11D48, 'X'), - (0x11D50, 'V'), - (0x11D5A, 'X'), - (0x11D60, 'V'), - ] - -def _seg_57(): - return [ - (0x11D66, 'X'), - (0x11D67, 'V'), - (0x11D69, 'X'), - (0x11D6A, 'V'), - (0x11D8F, 'X'), - (0x11D90, 'V'), - (0x11D92, 'X'), - (0x11D93, 'V'), - (0x11D99, 'X'), - (0x11DA0, 'V'), - (0x11DAA, 'X'), - (0x11EE0, 'V'), - (0x11EF9, 'X'), - (0x12000, 'V'), - (0x1239A, 'X'), - (0x12400, 'V'), - (0x1246F, 'X'), - (0x12470, 'V'), - (0x12475, 'X'), - (0x12480, 'V'), - (0x12544, 'X'), - (0x13000, 'V'), - (0x1342F, 'X'), - (0x14400, 'V'), - (0x14647, 'X'), - (0x16800, 'V'), - (0x16A39, 'X'), - (0x16A40, 'V'), - (0x16A5F, 'X'), - (0x16A60, 'V'), - (0x16A6A, 'X'), - (0x16A6E, 'V'), - (0x16A70, 'X'), - (0x16AD0, 'V'), - (0x16AEE, 'X'), - (0x16AF0, 'V'), - (0x16AF6, 'X'), - (0x16B00, 'V'), - (0x16B46, 'X'), - (0x16B50, 'V'), - (0x16B5A, 'X'), - (0x16B5B, 'V'), - (0x16B62, 'X'), - (0x16B63, 'V'), - (0x16B78, 'X'), - (0x16B7D, 'V'), - (0x16B90, 'X'), - (0x16E60, 'V'), - (0x16E9B, 'X'), - (0x16F00, 'V'), - (0x16F45, 'X'), - (0x16F50, 'V'), - (0x16F7F, 'X'), - (0x16F8F, 'V'), - (0x16FA0, 'X'), - (0x16FE0, 'V'), - (0x16FE2, 'X'), - (0x17000, 'V'), - (0x187F2, 'X'), - (0x18800, 'V'), - (0x18AF3, 'X'), - (0x1B000, 'V'), - (0x1B11F, 'X'), - (0x1B170, 'V'), - (0x1B2FC, 'X'), - (0x1BC00, 'V'), - (0x1BC6B, 'X'), - (0x1BC70, 'V'), - (0x1BC7D, 'X'), - (0x1BC80, 'V'), - (0x1BC89, 'X'), - (0x1BC90, 'V'), - (0x1BC9A, 'X'), - (0x1BC9C, 'V'), - (0x1BCA0, 'I'), - (0x1BCA4, 'X'), - (0x1D000, 'V'), - (0x1D0F6, 'X'), - (0x1D100, 'V'), - (0x1D127, 'X'), - (0x1D129, 'V'), - (0x1D15E, 'M', u'𝅗𝅥'), - (0x1D15F, 'M', u'𝅘𝅥'), - (0x1D160, 'M', u'𝅘𝅥𝅮'), - (0x1D161, 'M', u'𝅘𝅥𝅯'), - (0x1D162, 'M', u'𝅘𝅥𝅰'), - (0x1D163, 'M', u'𝅘𝅥𝅱'), - (0x1D164, 'M', u'𝅘𝅥𝅲'), - (0x1D165, 'V'), - (0x1D173, 'X'), - (0x1D17B, 'V'), - (0x1D1BB, 'M', u'𝆹𝅥'), - (0x1D1BC, 'M', u'𝆺𝅥'), - (0x1D1BD, 'M', u'𝆹𝅥𝅮'), - (0x1D1BE, 'M', u'𝆺𝅥𝅮'), - (0x1D1BF, 'M', u'𝆹𝅥𝅯'), - (0x1D1C0, 'M', u'𝆺𝅥𝅯'), - (0x1D1C1, 'V'), - (0x1D1E9, 'X'), - (0x1D200, 'V'), - ] - -def _seg_58(): - return [ - (0x1D246, 'X'), - (0x1D2E0, 'V'), - (0x1D2F4, 'X'), - (0x1D300, 'V'), - (0x1D357, 'X'), - (0x1D360, 'V'), - (0x1D379, 'X'), - (0x1D400, 'M', u'a'), - (0x1D401, 'M', u'b'), - (0x1D402, 'M', u'c'), - (0x1D403, 'M', u'd'), - (0x1D404, 'M', u'e'), - (0x1D405, 'M', u'f'), - (0x1D406, 'M', u'g'), - (0x1D407, 'M', u'h'), - (0x1D408, 'M', u'i'), - (0x1D409, 'M', u'j'), - (0x1D40A, 'M', u'k'), - (0x1D40B, 'M', u'l'), - (0x1D40C, 'M', u'm'), - (0x1D40D, 'M', u'n'), - (0x1D40E, 'M', u'o'), - (0x1D40F, 'M', u'p'), - (0x1D410, 'M', u'q'), - (0x1D411, 'M', u'r'), - (0x1D412, 'M', u's'), - (0x1D413, 'M', u't'), - (0x1D414, 'M', u'u'), - (0x1D415, 'M', u'v'), - (0x1D416, 'M', u'w'), - (0x1D417, 'M', u'x'), - (0x1D418, 'M', u'y'), - (0x1D419, 'M', u'z'), - (0x1D41A, 'M', u'a'), - (0x1D41B, 'M', u'b'), - (0x1D41C, 'M', u'c'), - (0x1D41D, 'M', u'd'), - (0x1D41E, 'M', u'e'), - (0x1D41F, 'M', u'f'), - (0x1D420, 'M', u'g'), - (0x1D421, 'M', u'h'), - (0x1D422, 'M', u'i'), - (0x1D423, 'M', u'j'), - (0x1D424, 'M', u'k'), - (0x1D425, 'M', u'l'), - (0x1D426, 'M', u'm'), - (0x1D427, 'M', u'n'), - (0x1D428, 'M', u'o'), - (0x1D429, 'M', u'p'), - (0x1D42A, 'M', u'q'), - (0x1D42B, 'M', u'r'), - (0x1D42C, 'M', u's'), - (0x1D42D, 'M', u't'), - (0x1D42E, 'M', u'u'), - (0x1D42F, 'M', u'v'), - (0x1D430, 'M', u'w'), - (0x1D431, 'M', u'x'), - (0x1D432, 'M', u'y'), - (0x1D433, 'M', u'z'), - (0x1D434, 'M', u'a'), - (0x1D435, 'M', u'b'), - (0x1D436, 'M', u'c'), - (0x1D437, 'M', u'd'), - (0x1D438, 'M', u'e'), - (0x1D439, 'M', u'f'), - (0x1D43A, 'M', u'g'), - (0x1D43B, 'M', u'h'), - (0x1D43C, 'M', u'i'), - (0x1D43D, 'M', u'j'), - (0x1D43E, 'M', u'k'), - (0x1D43F, 'M', u'l'), - (0x1D440, 'M', u'm'), - (0x1D441, 'M', u'n'), - (0x1D442, 'M', u'o'), - (0x1D443, 'M', u'p'), - (0x1D444, 'M', u'q'), - (0x1D445, 'M', u'r'), - (0x1D446, 'M', u's'), - (0x1D447, 'M', u't'), - (0x1D448, 'M', u'u'), - (0x1D449, 'M', u'v'), - (0x1D44A, 'M', u'w'), - (0x1D44B, 'M', u'x'), - (0x1D44C, 'M', u'y'), - (0x1D44D, 'M', u'z'), - (0x1D44E, 'M', u'a'), - (0x1D44F, 'M', u'b'), - (0x1D450, 'M', u'c'), - (0x1D451, 'M', u'd'), - (0x1D452, 'M', u'e'), - (0x1D453, 'M', u'f'), - (0x1D454, 'M', u'g'), - (0x1D455, 'X'), - (0x1D456, 'M', u'i'), - (0x1D457, 'M', u'j'), - (0x1D458, 'M', u'k'), - (0x1D459, 'M', u'l'), - (0x1D45A, 'M', u'm'), - (0x1D45B, 'M', u'n'), - (0x1D45C, 'M', u'o'), - ] - -def _seg_59(): - return [ - (0x1D45D, 'M', u'p'), - (0x1D45E, 'M', u'q'), - (0x1D45F, 'M', u'r'), - (0x1D460, 'M', u's'), - (0x1D461, 'M', u't'), - (0x1D462, 'M', u'u'), - (0x1D463, 'M', u'v'), - (0x1D464, 'M', u'w'), - (0x1D465, 'M', u'x'), - (0x1D466, 'M', u'y'), - (0x1D467, 'M', u'z'), - (0x1D468, 'M', u'a'), - (0x1D469, 'M', u'b'), - (0x1D46A, 'M', u'c'), - (0x1D46B, 'M', u'd'), - (0x1D46C, 'M', u'e'), - (0x1D46D, 'M', u'f'), - (0x1D46E, 'M', u'g'), - (0x1D46F, 'M', u'h'), - (0x1D470, 'M', u'i'), - (0x1D471, 'M', u'j'), - (0x1D472, 'M', u'k'), - (0x1D473, 'M', u'l'), - (0x1D474, 'M', u'm'), - (0x1D475, 'M', u'n'), - (0x1D476, 'M', u'o'), - (0x1D477, 'M', u'p'), - (0x1D478, 'M', u'q'), - (0x1D479, 'M', u'r'), - (0x1D47A, 'M', u's'), - (0x1D47B, 'M', u't'), - (0x1D47C, 'M', u'u'), - (0x1D47D, 'M', u'v'), - (0x1D47E, 'M', u'w'), - (0x1D47F, 'M', u'x'), - (0x1D480, 'M', u'y'), - (0x1D481, 'M', u'z'), - (0x1D482, 'M', u'a'), - (0x1D483, 'M', u'b'), - (0x1D484, 'M', u'c'), - (0x1D485, 'M', u'd'), - (0x1D486, 'M', u'e'), - (0x1D487, 'M', u'f'), - (0x1D488, 'M', u'g'), - (0x1D489, 'M', u'h'), - (0x1D48A, 'M', u'i'), - (0x1D48B, 'M', u'j'), - (0x1D48C, 'M', u'k'), - (0x1D48D, 'M', u'l'), - (0x1D48E, 'M', u'm'), - (0x1D48F, 'M', u'n'), - (0x1D490, 'M', u'o'), - (0x1D491, 'M', u'p'), - (0x1D492, 'M', u'q'), - (0x1D493, 'M', u'r'), - (0x1D494, 'M', u's'), - (0x1D495, 'M', u't'), - (0x1D496, 'M', u'u'), - (0x1D497, 'M', u'v'), - (0x1D498, 'M', u'w'), - (0x1D499, 'M', u'x'), - (0x1D49A, 'M', u'y'), - (0x1D49B, 'M', u'z'), - (0x1D49C, 'M', u'a'), - (0x1D49D, 'X'), - (0x1D49E, 'M', u'c'), - (0x1D49F, 'M', u'd'), - (0x1D4A0, 'X'), - (0x1D4A2, 'M', u'g'), - (0x1D4A3, 'X'), - (0x1D4A5, 'M', u'j'), - (0x1D4A6, 'M', u'k'), - (0x1D4A7, 'X'), - (0x1D4A9, 'M', u'n'), - (0x1D4AA, 'M', u'o'), - (0x1D4AB, 'M', u'p'), - (0x1D4AC, 'M', u'q'), - (0x1D4AD, 'X'), - (0x1D4AE, 'M', u's'), - (0x1D4AF, 'M', u't'), - (0x1D4B0, 'M', u'u'), - (0x1D4B1, 'M', u'v'), - (0x1D4B2, 'M', u'w'), - (0x1D4B3, 'M', u'x'), - (0x1D4B4, 'M', u'y'), - (0x1D4B5, 'M', u'z'), - (0x1D4B6, 'M', u'a'), - (0x1D4B7, 'M', u'b'), - (0x1D4B8, 'M', u'c'), - (0x1D4B9, 'M', u'd'), - (0x1D4BA, 'X'), - (0x1D4BB, 'M', u'f'), - (0x1D4BC, 'X'), - (0x1D4BD, 'M', u'h'), - (0x1D4BE, 'M', u'i'), - (0x1D4BF, 'M', u'j'), - (0x1D4C0, 'M', u'k'), - (0x1D4C1, 'M', u'l'), - (0x1D4C2, 'M', u'm'), - (0x1D4C3, 'M', u'n'), - ] - -def _seg_60(): - return [ - (0x1D4C4, 'X'), - (0x1D4C5, 'M', u'p'), - (0x1D4C6, 'M', u'q'), - (0x1D4C7, 'M', u'r'), - (0x1D4C8, 'M', u's'), - (0x1D4C9, 'M', u't'), - (0x1D4CA, 'M', u'u'), - (0x1D4CB, 'M', u'v'), - (0x1D4CC, 'M', u'w'), - (0x1D4CD, 'M', u'x'), - (0x1D4CE, 'M', u'y'), - (0x1D4CF, 'M', u'z'), - (0x1D4D0, 'M', u'a'), - (0x1D4D1, 'M', u'b'), - (0x1D4D2, 'M', u'c'), - (0x1D4D3, 'M', u'd'), - (0x1D4D4, 'M', u'e'), - (0x1D4D5, 'M', u'f'), - (0x1D4D6, 'M', u'g'), - (0x1D4D7, 'M', u'h'), - (0x1D4D8, 'M', u'i'), - (0x1D4D9, 'M', u'j'), - (0x1D4DA, 'M', u'k'), - (0x1D4DB, 'M', u'l'), - (0x1D4DC, 'M', u'm'), - (0x1D4DD, 'M', u'n'), - (0x1D4DE, 'M', u'o'), - (0x1D4DF, 'M', u'p'), - (0x1D4E0, 'M', u'q'), - (0x1D4E1, 'M', u'r'), - (0x1D4E2, 'M', u's'), - (0x1D4E3, 'M', u't'), - (0x1D4E4, 'M', u'u'), - (0x1D4E5, 'M', u'v'), - (0x1D4E6, 'M', u'w'), - (0x1D4E7, 'M', u'x'), - (0x1D4E8, 'M', u'y'), - (0x1D4E9, 'M', u'z'), - (0x1D4EA, 'M', u'a'), - (0x1D4EB, 'M', u'b'), - (0x1D4EC, 'M', u'c'), - (0x1D4ED, 'M', u'd'), - (0x1D4EE, 'M', u'e'), - (0x1D4EF, 'M', u'f'), - (0x1D4F0, 'M', u'g'), - (0x1D4F1, 'M', u'h'), - (0x1D4F2, 'M', u'i'), - (0x1D4F3, 'M', u'j'), - (0x1D4F4, 'M', u'k'), - (0x1D4F5, 'M', u'l'), - (0x1D4F6, 'M', u'm'), - (0x1D4F7, 'M', u'n'), - (0x1D4F8, 'M', u'o'), - (0x1D4F9, 'M', u'p'), - (0x1D4FA, 'M', u'q'), - (0x1D4FB, 'M', u'r'), - (0x1D4FC, 'M', u's'), - (0x1D4FD, 'M', u't'), - (0x1D4FE, 'M', u'u'), - (0x1D4FF, 'M', u'v'), - (0x1D500, 'M', u'w'), - (0x1D501, 'M', u'x'), - (0x1D502, 'M', u'y'), - (0x1D503, 'M', u'z'), - (0x1D504, 'M', u'a'), - (0x1D505, 'M', u'b'), - (0x1D506, 'X'), - (0x1D507, 'M', u'd'), - (0x1D508, 'M', u'e'), - (0x1D509, 'M', u'f'), - (0x1D50A, 'M', u'g'), - (0x1D50B, 'X'), - (0x1D50D, 'M', u'j'), - (0x1D50E, 'M', u'k'), - (0x1D50F, 'M', u'l'), - (0x1D510, 'M', u'm'), - (0x1D511, 'M', u'n'), - (0x1D512, 'M', u'o'), - (0x1D513, 'M', u'p'), - (0x1D514, 'M', u'q'), - (0x1D515, 'X'), - (0x1D516, 'M', u's'), - (0x1D517, 'M', u't'), - (0x1D518, 'M', u'u'), - (0x1D519, 'M', u'v'), - (0x1D51A, 'M', u'w'), - (0x1D51B, 'M', u'x'), - (0x1D51C, 'M', u'y'), - (0x1D51D, 'X'), - (0x1D51E, 'M', u'a'), - (0x1D51F, 'M', u'b'), - (0x1D520, 'M', u'c'), - (0x1D521, 'M', u'd'), - (0x1D522, 'M', u'e'), - (0x1D523, 'M', u'f'), - (0x1D524, 'M', u'g'), - (0x1D525, 'M', u'h'), - (0x1D526, 'M', u'i'), - (0x1D527, 'M', u'j'), - (0x1D528, 'M', u'k'), - ] - -def _seg_61(): - return [ - (0x1D529, 'M', u'l'), - (0x1D52A, 'M', u'm'), - (0x1D52B, 'M', u'n'), - (0x1D52C, 'M', u'o'), - (0x1D52D, 'M', u'p'), - (0x1D52E, 'M', u'q'), - (0x1D52F, 'M', u'r'), - (0x1D530, 'M', u's'), - (0x1D531, 'M', u't'), - (0x1D532, 'M', u'u'), - (0x1D533, 'M', u'v'), - (0x1D534, 'M', u'w'), - (0x1D535, 'M', u'x'), - (0x1D536, 'M', u'y'), - (0x1D537, 'M', u'z'), - (0x1D538, 'M', u'a'), - (0x1D539, 'M', u'b'), - (0x1D53A, 'X'), - (0x1D53B, 'M', u'd'), - (0x1D53C, 'M', u'e'), - (0x1D53D, 'M', u'f'), - (0x1D53E, 'M', u'g'), - (0x1D53F, 'X'), - (0x1D540, 'M', u'i'), - (0x1D541, 'M', u'j'), - (0x1D542, 'M', u'k'), - (0x1D543, 'M', u'l'), - (0x1D544, 'M', u'm'), - (0x1D545, 'X'), - (0x1D546, 'M', u'o'), - (0x1D547, 'X'), - (0x1D54A, 'M', u's'), - (0x1D54B, 'M', u't'), - (0x1D54C, 'M', u'u'), - (0x1D54D, 'M', u'v'), - (0x1D54E, 'M', u'w'), - (0x1D54F, 'M', u'x'), - (0x1D550, 'M', u'y'), - (0x1D551, 'X'), - (0x1D552, 'M', u'a'), - (0x1D553, 'M', u'b'), - (0x1D554, 'M', u'c'), - (0x1D555, 'M', u'd'), - (0x1D556, 'M', u'e'), - (0x1D557, 'M', u'f'), - (0x1D558, 'M', u'g'), - (0x1D559, 'M', u'h'), - (0x1D55A, 'M', u'i'), - (0x1D55B, 'M', u'j'), - (0x1D55C, 'M', u'k'), - (0x1D55D, 'M', u'l'), - (0x1D55E, 'M', u'm'), - (0x1D55F, 'M', u'n'), - (0x1D560, 'M', u'o'), - (0x1D561, 'M', u'p'), - (0x1D562, 'M', u'q'), - (0x1D563, 'M', u'r'), - (0x1D564, 'M', u's'), - (0x1D565, 'M', u't'), - (0x1D566, 'M', u'u'), - (0x1D567, 'M', u'v'), - (0x1D568, 'M', u'w'), - (0x1D569, 'M', u'x'), - (0x1D56A, 'M', u'y'), - (0x1D56B, 'M', u'z'), - (0x1D56C, 'M', u'a'), - (0x1D56D, 'M', u'b'), - (0x1D56E, 'M', u'c'), - (0x1D56F, 'M', u'd'), - (0x1D570, 'M', u'e'), - (0x1D571, 'M', u'f'), - (0x1D572, 'M', u'g'), - (0x1D573, 'M', u'h'), - (0x1D574, 'M', u'i'), - (0x1D575, 'M', u'j'), - (0x1D576, 'M', u'k'), - (0x1D577, 'M', u'l'), - (0x1D578, 'M', u'm'), - (0x1D579, 'M', u'n'), - (0x1D57A, 'M', u'o'), - (0x1D57B, 'M', u'p'), - (0x1D57C, 'M', u'q'), - (0x1D57D, 'M', u'r'), - (0x1D57E, 'M', u's'), - (0x1D57F, 'M', u't'), - (0x1D580, 'M', u'u'), - (0x1D581, 'M', u'v'), - (0x1D582, 'M', u'w'), - (0x1D583, 'M', u'x'), - (0x1D584, 'M', u'y'), - (0x1D585, 'M', u'z'), - (0x1D586, 'M', u'a'), - (0x1D587, 'M', u'b'), - (0x1D588, 'M', u'c'), - (0x1D589, 'M', u'd'), - (0x1D58A, 'M', u'e'), - (0x1D58B, 'M', u'f'), - (0x1D58C, 'M', u'g'), - (0x1D58D, 'M', u'h'), - (0x1D58E, 'M', u'i'), - ] - -def _seg_62(): - return [ - (0x1D58F, 'M', u'j'), - (0x1D590, 'M', u'k'), - (0x1D591, 'M', u'l'), - (0x1D592, 'M', u'm'), - (0x1D593, 'M', u'n'), - (0x1D594, 'M', u'o'), - (0x1D595, 'M', u'p'), - (0x1D596, 'M', u'q'), - (0x1D597, 'M', u'r'), - (0x1D598, 'M', u's'), - (0x1D599, 'M', u't'), - (0x1D59A, 'M', u'u'), - (0x1D59B, 'M', u'v'), - (0x1D59C, 'M', u'w'), - (0x1D59D, 'M', u'x'), - (0x1D59E, 'M', u'y'), - (0x1D59F, 'M', u'z'), - (0x1D5A0, 'M', u'a'), - (0x1D5A1, 'M', u'b'), - (0x1D5A2, 'M', u'c'), - (0x1D5A3, 'M', u'd'), - (0x1D5A4, 'M', u'e'), - (0x1D5A5, 'M', u'f'), - (0x1D5A6, 'M', u'g'), - (0x1D5A7, 'M', u'h'), - (0x1D5A8, 'M', u'i'), - (0x1D5A9, 'M', u'j'), - (0x1D5AA, 'M', u'k'), - (0x1D5AB, 'M', u'l'), - (0x1D5AC, 'M', u'm'), - (0x1D5AD, 'M', u'n'), - (0x1D5AE, 'M', u'o'), - (0x1D5AF, 'M', u'p'), - (0x1D5B0, 'M', u'q'), - (0x1D5B1, 'M', u'r'), - (0x1D5B2, 'M', u's'), - (0x1D5B3, 'M', u't'), - (0x1D5B4, 'M', u'u'), - (0x1D5B5, 'M', u'v'), - (0x1D5B6, 'M', u'w'), - (0x1D5B7, 'M', u'x'), - (0x1D5B8, 'M', u'y'), - (0x1D5B9, 'M', u'z'), - (0x1D5BA, 'M', u'a'), - (0x1D5BB, 'M', u'b'), - (0x1D5BC, 'M', u'c'), - (0x1D5BD, 'M', u'd'), - (0x1D5BE, 'M', u'e'), - (0x1D5BF, 'M', u'f'), - (0x1D5C0, 'M', u'g'), - (0x1D5C1, 'M', u'h'), - (0x1D5C2, 'M', u'i'), - (0x1D5C3, 'M', u'j'), - (0x1D5C4, 'M', u'k'), - (0x1D5C5, 'M', u'l'), - (0x1D5C6, 'M', u'm'), - (0x1D5C7, 'M', u'n'), - (0x1D5C8, 'M', u'o'), - (0x1D5C9, 'M', u'p'), - (0x1D5CA, 'M', u'q'), - (0x1D5CB, 'M', u'r'), - (0x1D5CC, 'M', u's'), - (0x1D5CD, 'M', u't'), - (0x1D5CE, 'M', u'u'), - (0x1D5CF, 'M', u'v'), - (0x1D5D0, 'M', u'w'), - (0x1D5D1, 'M', u'x'), - (0x1D5D2, 'M', u'y'), - (0x1D5D3, 'M', u'z'), - (0x1D5D4, 'M', u'a'), - (0x1D5D5, 'M', u'b'), - (0x1D5D6, 'M', u'c'), - (0x1D5D7, 'M', u'd'), - (0x1D5D8, 'M', u'e'), - (0x1D5D9, 'M', u'f'), - (0x1D5DA, 'M', u'g'), - (0x1D5DB, 'M', u'h'), - (0x1D5DC, 'M', u'i'), - (0x1D5DD, 'M', u'j'), - (0x1D5DE, 'M', u'k'), - (0x1D5DF, 'M', u'l'), - (0x1D5E0, 'M', u'm'), - (0x1D5E1, 'M', u'n'), - (0x1D5E2, 'M', u'o'), - (0x1D5E3, 'M', u'p'), - (0x1D5E4, 'M', u'q'), - (0x1D5E5, 'M', u'r'), - (0x1D5E6, 'M', u's'), - (0x1D5E7, 'M', u't'), - (0x1D5E8, 'M', u'u'), - (0x1D5E9, 'M', u'v'), - (0x1D5EA, 'M', u'w'), - (0x1D5EB, 'M', u'x'), - (0x1D5EC, 'M', u'y'), - (0x1D5ED, 'M', u'z'), - (0x1D5EE, 'M', u'a'), - (0x1D5EF, 'M', u'b'), - (0x1D5F0, 'M', u'c'), - (0x1D5F1, 'M', u'd'), - (0x1D5F2, 'M', u'e'), - ] - -def _seg_63(): - return [ - (0x1D5F3, 'M', u'f'), - (0x1D5F4, 'M', u'g'), - (0x1D5F5, 'M', u'h'), - (0x1D5F6, 'M', u'i'), - (0x1D5F7, 'M', u'j'), - (0x1D5F8, 'M', u'k'), - (0x1D5F9, 'M', u'l'), - (0x1D5FA, 'M', u'm'), - (0x1D5FB, 'M', u'n'), - (0x1D5FC, 'M', u'o'), - (0x1D5FD, 'M', u'p'), - (0x1D5FE, 'M', u'q'), - (0x1D5FF, 'M', u'r'), - (0x1D600, 'M', u's'), - (0x1D601, 'M', u't'), - (0x1D602, 'M', u'u'), - (0x1D603, 'M', u'v'), - (0x1D604, 'M', u'w'), - (0x1D605, 'M', u'x'), - (0x1D606, 'M', u'y'), - (0x1D607, 'M', u'z'), - (0x1D608, 'M', u'a'), - (0x1D609, 'M', u'b'), - (0x1D60A, 'M', u'c'), - (0x1D60B, 'M', u'd'), - (0x1D60C, 'M', u'e'), - (0x1D60D, 'M', u'f'), - (0x1D60E, 'M', u'g'), - (0x1D60F, 'M', u'h'), - (0x1D610, 'M', u'i'), - (0x1D611, 'M', u'j'), - (0x1D612, 'M', u'k'), - (0x1D613, 'M', u'l'), - (0x1D614, 'M', u'm'), - (0x1D615, 'M', u'n'), - (0x1D616, 'M', u'o'), - (0x1D617, 'M', u'p'), - (0x1D618, 'M', u'q'), - (0x1D619, 'M', u'r'), - (0x1D61A, 'M', u's'), - (0x1D61B, 'M', u't'), - (0x1D61C, 'M', u'u'), - (0x1D61D, 'M', u'v'), - (0x1D61E, 'M', u'w'), - (0x1D61F, 'M', u'x'), - (0x1D620, 'M', u'y'), - (0x1D621, 'M', u'z'), - (0x1D622, 'M', u'a'), - (0x1D623, 'M', u'b'), - (0x1D624, 'M', u'c'), - (0x1D625, 'M', u'd'), - (0x1D626, 'M', u'e'), - (0x1D627, 'M', u'f'), - (0x1D628, 'M', u'g'), - (0x1D629, 'M', u'h'), - (0x1D62A, 'M', u'i'), - (0x1D62B, 'M', u'j'), - (0x1D62C, 'M', u'k'), - (0x1D62D, 'M', u'l'), - (0x1D62E, 'M', u'm'), - (0x1D62F, 'M', u'n'), - (0x1D630, 'M', u'o'), - (0x1D631, 'M', u'p'), - (0x1D632, 'M', u'q'), - (0x1D633, 'M', u'r'), - (0x1D634, 'M', u's'), - (0x1D635, 'M', u't'), - (0x1D636, 'M', u'u'), - (0x1D637, 'M', u'v'), - (0x1D638, 'M', u'w'), - (0x1D639, 'M', u'x'), - (0x1D63A, 'M', u'y'), - (0x1D63B, 'M', u'z'), - (0x1D63C, 'M', u'a'), - (0x1D63D, 'M', u'b'), - (0x1D63E, 'M', u'c'), - (0x1D63F, 'M', u'd'), - (0x1D640, 'M', u'e'), - (0x1D641, 'M', u'f'), - (0x1D642, 'M', u'g'), - (0x1D643, 'M', u'h'), - (0x1D644, 'M', u'i'), - (0x1D645, 'M', u'j'), - (0x1D646, 'M', u'k'), - (0x1D647, 'M', u'l'), - (0x1D648, 'M', u'm'), - (0x1D649, 'M', u'n'), - (0x1D64A, 'M', u'o'), - (0x1D64B, 'M', u'p'), - (0x1D64C, 'M', u'q'), - (0x1D64D, 'M', u'r'), - (0x1D64E, 'M', u's'), - (0x1D64F, 'M', u't'), - (0x1D650, 'M', u'u'), - (0x1D651, 'M', u'v'), - (0x1D652, 'M', u'w'), - (0x1D653, 'M', u'x'), - (0x1D654, 'M', u'y'), - (0x1D655, 'M', u'z'), - (0x1D656, 'M', u'a'), - ] - -def _seg_64(): - return [ - (0x1D657, 'M', u'b'), - (0x1D658, 'M', u'c'), - (0x1D659, 'M', u'd'), - (0x1D65A, 'M', u'e'), - (0x1D65B, 'M', u'f'), - (0x1D65C, 'M', u'g'), - (0x1D65D, 'M', u'h'), - (0x1D65E, 'M', u'i'), - (0x1D65F, 'M', u'j'), - (0x1D660, 'M', u'k'), - (0x1D661, 'M', u'l'), - (0x1D662, 'M', u'm'), - (0x1D663, 'M', u'n'), - (0x1D664, 'M', u'o'), - (0x1D665, 'M', u'p'), - (0x1D666, 'M', u'q'), - (0x1D667, 'M', u'r'), - (0x1D668, 'M', u's'), - (0x1D669, 'M', u't'), - (0x1D66A, 'M', u'u'), - (0x1D66B, 'M', u'v'), - (0x1D66C, 'M', u'w'), - (0x1D66D, 'M', u'x'), - (0x1D66E, 'M', u'y'), - (0x1D66F, 'M', u'z'), - (0x1D670, 'M', u'a'), - (0x1D671, 'M', u'b'), - (0x1D672, 'M', u'c'), - (0x1D673, 'M', u'd'), - (0x1D674, 'M', u'e'), - (0x1D675, 'M', u'f'), - (0x1D676, 'M', u'g'), - (0x1D677, 'M', u'h'), - (0x1D678, 'M', u'i'), - (0x1D679, 'M', u'j'), - (0x1D67A, 'M', u'k'), - (0x1D67B, 'M', u'l'), - (0x1D67C, 'M', u'm'), - (0x1D67D, 'M', u'n'), - (0x1D67E, 'M', u'o'), - (0x1D67F, 'M', u'p'), - (0x1D680, 'M', u'q'), - (0x1D681, 'M', u'r'), - (0x1D682, 'M', u's'), - (0x1D683, 'M', u't'), - (0x1D684, 'M', u'u'), - (0x1D685, 'M', u'v'), - (0x1D686, 'M', u'w'), - (0x1D687, 'M', u'x'), - (0x1D688, 'M', u'y'), - (0x1D689, 'M', u'z'), - (0x1D68A, 'M', u'a'), - (0x1D68B, 'M', u'b'), - (0x1D68C, 'M', u'c'), - (0x1D68D, 'M', u'd'), - (0x1D68E, 'M', u'e'), - (0x1D68F, 'M', u'f'), - (0x1D690, 'M', u'g'), - (0x1D691, 'M', u'h'), - (0x1D692, 'M', u'i'), - (0x1D693, 'M', u'j'), - (0x1D694, 'M', u'k'), - (0x1D695, 'M', u'l'), - (0x1D696, 'M', u'm'), - (0x1D697, 'M', u'n'), - (0x1D698, 'M', u'o'), - (0x1D699, 'M', u'p'), - (0x1D69A, 'M', u'q'), - (0x1D69B, 'M', u'r'), - (0x1D69C, 'M', u's'), - (0x1D69D, 'M', u't'), - (0x1D69E, 'M', u'u'), - (0x1D69F, 'M', u'v'), - (0x1D6A0, 'M', u'w'), - (0x1D6A1, 'M', u'x'), - (0x1D6A2, 'M', u'y'), - (0x1D6A3, 'M', u'z'), - (0x1D6A4, 'M', u'ı'), - (0x1D6A5, 'M', u'ȷ'), - (0x1D6A6, 'X'), - (0x1D6A8, 'M', u'α'), - (0x1D6A9, 'M', u'β'), - (0x1D6AA, 'M', u'γ'), - (0x1D6AB, 'M', u'δ'), - (0x1D6AC, 'M', u'ε'), - (0x1D6AD, 'M', u'ζ'), - (0x1D6AE, 'M', u'η'), - (0x1D6AF, 'M', u'θ'), - (0x1D6B0, 'M', u'ι'), - (0x1D6B1, 'M', u'κ'), - (0x1D6B2, 'M', u'λ'), - (0x1D6B3, 'M', u'μ'), - (0x1D6B4, 'M', u'ν'), - (0x1D6B5, 'M', u'ξ'), - (0x1D6B6, 'M', u'ο'), - (0x1D6B7, 'M', u'π'), - (0x1D6B8, 'M', u'ρ'), - (0x1D6B9, 'M', u'θ'), - (0x1D6BA, 'M', u'σ'), - (0x1D6BB, 'M', u'τ'), - ] - -def _seg_65(): - return [ - (0x1D6BC, 'M', u'υ'), - (0x1D6BD, 'M', u'φ'), - (0x1D6BE, 'M', u'χ'), - (0x1D6BF, 'M', u'ψ'), - (0x1D6C0, 'M', u'ω'), - (0x1D6C1, 'M', u'∇'), - (0x1D6C2, 'M', u'α'), - (0x1D6C3, 'M', u'β'), - (0x1D6C4, 'M', u'γ'), - (0x1D6C5, 'M', u'δ'), - (0x1D6C6, 'M', u'ε'), - (0x1D6C7, 'M', u'ζ'), - (0x1D6C8, 'M', u'η'), - (0x1D6C9, 'M', u'θ'), - (0x1D6CA, 'M', u'ι'), - (0x1D6CB, 'M', u'κ'), - (0x1D6CC, 'M', u'λ'), - (0x1D6CD, 'M', u'μ'), - (0x1D6CE, 'M', u'ν'), - (0x1D6CF, 'M', u'ξ'), - (0x1D6D0, 'M', u'ο'), - (0x1D6D1, 'M', u'π'), - (0x1D6D2, 'M', u'ρ'), - (0x1D6D3, 'M', u'σ'), - (0x1D6D5, 'M', u'τ'), - (0x1D6D6, 'M', u'υ'), - (0x1D6D7, 'M', u'φ'), - (0x1D6D8, 'M', u'χ'), - (0x1D6D9, 'M', u'ψ'), - (0x1D6DA, 'M', u'ω'), - (0x1D6DB, 'M', u'∂'), - (0x1D6DC, 'M', u'ε'), - (0x1D6DD, 'M', u'θ'), - (0x1D6DE, 'M', u'κ'), - (0x1D6DF, 'M', u'φ'), - (0x1D6E0, 'M', u'ρ'), - (0x1D6E1, 'M', u'π'), - (0x1D6E2, 'M', u'α'), - (0x1D6E3, 'M', u'β'), - (0x1D6E4, 'M', u'γ'), - (0x1D6E5, 'M', u'δ'), - (0x1D6E6, 'M', u'ε'), - (0x1D6E7, 'M', u'ζ'), - (0x1D6E8, 'M', u'η'), - (0x1D6E9, 'M', u'θ'), - (0x1D6EA, 'M', u'ι'), - (0x1D6EB, 'M', u'κ'), - (0x1D6EC, 'M', u'λ'), - (0x1D6ED, 'M', u'μ'), - (0x1D6EE, 'M', u'ν'), - (0x1D6EF, 'M', u'ξ'), - (0x1D6F0, 'M', u'ο'), - (0x1D6F1, 'M', u'π'), - (0x1D6F2, 'M', u'ρ'), - (0x1D6F3, 'M', u'θ'), - (0x1D6F4, 'M', u'σ'), - (0x1D6F5, 'M', u'τ'), - (0x1D6F6, 'M', u'υ'), - (0x1D6F7, 'M', u'φ'), - (0x1D6F8, 'M', u'χ'), - (0x1D6F9, 'M', u'ψ'), - (0x1D6FA, 'M', u'ω'), - (0x1D6FB, 'M', u'∇'), - (0x1D6FC, 'M', u'α'), - (0x1D6FD, 'M', u'β'), - (0x1D6FE, 'M', u'γ'), - (0x1D6FF, 'M', u'δ'), - (0x1D700, 'M', u'ε'), - (0x1D701, 'M', u'ζ'), - (0x1D702, 'M', u'η'), - (0x1D703, 'M', u'θ'), - (0x1D704, 'M', u'ι'), - (0x1D705, 'M', u'κ'), - (0x1D706, 'M', u'λ'), - (0x1D707, 'M', u'μ'), - (0x1D708, 'M', u'ν'), - (0x1D709, 'M', u'ξ'), - (0x1D70A, 'M', u'ο'), - (0x1D70B, 'M', u'π'), - (0x1D70C, 'M', u'ρ'), - (0x1D70D, 'M', u'σ'), - (0x1D70F, 'M', u'τ'), - (0x1D710, 'M', u'υ'), - (0x1D711, 'M', u'φ'), - (0x1D712, 'M', u'χ'), - (0x1D713, 'M', u'ψ'), - (0x1D714, 'M', u'ω'), - (0x1D715, 'M', u'∂'), - (0x1D716, 'M', u'ε'), - (0x1D717, 'M', u'θ'), - (0x1D718, 'M', u'κ'), - (0x1D719, 'M', u'φ'), - (0x1D71A, 'M', u'ρ'), - (0x1D71B, 'M', u'π'), - (0x1D71C, 'M', u'α'), - (0x1D71D, 'M', u'β'), - (0x1D71E, 'M', u'γ'), - (0x1D71F, 'M', u'δ'), - (0x1D720, 'M', u'ε'), - (0x1D721, 'M', u'ζ'), - ] - -def _seg_66(): - return [ - (0x1D722, 'M', u'η'), - (0x1D723, 'M', u'θ'), - (0x1D724, 'M', u'ι'), - (0x1D725, 'M', u'κ'), - (0x1D726, 'M', u'λ'), - (0x1D727, 'M', u'μ'), - (0x1D728, 'M', u'ν'), - (0x1D729, 'M', u'ξ'), - (0x1D72A, 'M', u'ο'), - (0x1D72B, 'M', u'π'), - (0x1D72C, 'M', u'ρ'), - (0x1D72D, 'M', u'θ'), - (0x1D72E, 'M', u'σ'), - (0x1D72F, 'M', u'τ'), - (0x1D730, 'M', u'υ'), - (0x1D731, 'M', u'φ'), - (0x1D732, 'M', u'χ'), - (0x1D733, 'M', u'ψ'), - (0x1D734, 'M', u'ω'), - (0x1D735, 'M', u'∇'), - (0x1D736, 'M', u'α'), - (0x1D737, 'M', u'β'), - (0x1D738, 'M', u'γ'), - (0x1D739, 'M', u'δ'), - (0x1D73A, 'M', u'ε'), - (0x1D73B, 'M', u'ζ'), - (0x1D73C, 'M', u'η'), - (0x1D73D, 'M', u'θ'), - (0x1D73E, 'M', u'ι'), - (0x1D73F, 'M', u'κ'), - (0x1D740, 'M', u'λ'), - (0x1D741, 'M', u'μ'), - (0x1D742, 'M', u'ν'), - (0x1D743, 'M', u'ξ'), - (0x1D744, 'M', u'ο'), - (0x1D745, 'M', u'π'), - (0x1D746, 'M', u'ρ'), - (0x1D747, 'M', u'σ'), - (0x1D749, 'M', u'τ'), - (0x1D74A, 'M', u'υ'), - (0x1D74B, 'M', u'φ'), - (0x1D74C, 'M', u'χ'), - (0x1D74D, 'M', u'ψ'), - (0x1D74E, 'M', u'ω'), - (0x1D74F, 'M', u'∂'), - (0x1D750, 'M', u'ε'), - (0x1D751, 'M', u'θ'), - (0x1D752, 'M', u'κ'), - (0x1D753, 'M', u'φ'), - (0x1D754, 'M', u'ρ'), - (0x1D755, 'M', u'π'), - (0x1D756, 'M', u'α'), - (0x1D757, 'M', u'β'), - (0x1D758, 'M', u'γ'), - (0x1D759, 'M', u'δ'), - (0x1D75A, 'M', u'ε'), - (0x1D75B, 'M', u'ζ'), - (0x1D75C, 'M', u'η'), - (0x1D75D, 'M', u'θ'), - (0x1D75E, 'M', u'ι'), - (0x1D75F, 'M', u'κ'), - (0x1D760, 'M', u'λ'), - (0x1D761, 'M', u'μ'), - (0x1D762, 'M', u'ν'), - (0x1D763, 'M', u'ξ'), - (0x1D764, 'M', u'ο'), - (0x1D765, 'M', u'π'), - (0x1D766, 'M', u'ρ'), - (0x1D767, 'M', u'θ'), - (0x1D768, 'M', u'σ'), - (0x1D769, 'M', u'τ'), - (0x1D76A, 'M', u'υ'), - (0x1D76B, 'M', u'φ'), - (0x1D76C, 'M', u'χ'), - (0x1D76D, 'M', u'ψ'), - (0x1D76E, 'M', u'ω'), - (0x1D76F, 'M', u'∇'), - (0x1D770, 'M', u'α'), - (0x1D771, 'M', u'β'), - (0x1D772, 'M', u'γ'), - (0x1D773, 'M', u'δ'), - (0x1D774, 'M', u'ε'), - (0x1D775, 'M', u'ζ'), - (0x1D776, 'M', u'η'), - (0x1D777, 'M', u'θ'), - (0x1D778, 'M', u'ι'), - (0x1D779, 'M', u'κ'), - (0x1D77A, 'M', u'λ'), - (0x1D77B, 'M', u'μ'), - (0x1D77C, 'M', u'ν'), - (0x1D77D, 'M', u'ξ'), - (0x1D77E, 'M', u'ο'), - (0x1D77F, 'M', u'π'), - (0x1D780, 'M', u'ρ'), - (0x1D781, 'M', u'σ'), - (0x1D783, 'M', u'τ'), - (0x1D784, 'M', u'υ'), - (0x1D785, 'M', u'φ'), - (0x1D786, 'M', u'χ'), - (0x1D787, 'M', u'ψ'), - ] - -def _seg_67(): - return [ - (0x1D788, 'M', u'ω'), - (0x1D789, 'M', u'∂'), - (0x1D78A, 'M', u'ε'), - (0x1D78B, 'M', u'θ'), - (0x1D78C, 'M', u'κ'), - (0x1D78D, 'M', u'φ'), - (0x1D78E, 'M', u'ρ'), - (0x1D78F, 'M', u'π'), - (0x1D790, 'M', u'α'), - (0x1D791, 'M', u'β'), - (0x1D792, 'M', u'γ'), - (0x1D793, 'M', u'δ'), - (0x1D794, 'M', u'ε'), - (0x1D795, 'M', u'ζ'), - (0x1D796, 'M', u'η'), - (0x1D797, 'M', u'θ'), - (0x1D798, 'M', u'ι'), - (0x1D799, 'M', u'κ'), - (0x1D79A, 'M', u'λ'), - (0x1D79B, 'M', u'μ'), - (0x1D79C, 'M', u'ν'), - (0x1D79D, 'M', u'ξ'), - (0x1D79E, 'M', u'ο'), - (0x1D79F, 'M', u'π'), - (0x1D7A0, 'M', u'ρ'), - (0x1D7A1, 'M', u'θ'), - (0x1D7A2, 'M', u'σ'), - (0x1D7A3, 'M', u'τ'), - (0x1D7A4, 'M', u'υ'), - (0x1D7A5, 'M', u'φ'), - (0x1D7A6, 'M', u'χ'), - (0x1D7A7, 'M', u'ψ'), - (0x1D7A8, 'M', u'ω'), - (0x1D7A9, 'M', u'∇'), - (0x1D7AA, 'M', u'α'), - (0x1D7AB, 'M', u'β'), - (0x1D7AC, 'M', u'γ'), - (0x1D7AD, 'M', u'δ'), - (0x1D7AE, 'M', u'ε'), - (0x1D7AF, 'M', u'ζ'), - (0x1D7B0, 'M', u'η'), - (0x1D7B1, 'M', u'θ'), - (0x1D7B2, 'M', u'ι'), - (0x1D7B3, 'M', u'κ'), - (0x1D7B4, 'M', u'λ'), - (0x1D7B5, 'M', u'μ'), - (0x1D7B6, 'M', u'ν'), - (0x1D7B7, 'M', u'ξ'), - (0x1D7B8, 'M', u'ο'), - (0x1D7B9, 'M', u'π'), - (0x1D7BA, 'M', u'ρ'), - (0x1D7BB, 'M', u'σ'), - (0x1D7BD, 'M', u'τ'), - (0x1D7BE, 'M', u'υ'), - (0x1D7BF, 'M', u'φ'), - (0x1D7C0, 'M', u'χ'), - (0x1D7C1, 'M', u'ψ'), - (0x1D7C2, 'M', u'ω'), - (0x1D7C3, 'M', u'∂'), - (0x1D7C4, 'M', u'ε'), - (0x1D7C5, 'M', u'θ'), - (0x1D7C6, 'M', u'κ'), - (0x1D7C7, 'M', u'φ'), - (0x1D7C8, 'M', u'ρ'), - (0x1D7C9, 'M', u'π'), - (0x1D7CA, 'M', u'ϝ'), - (0x1D7CC, 'X'), - (0x1D7CE, 'M', u'0'), - (0x1D7CF, 'M', u'1'), - (0x1D7D0, 'M', u'2'), - (0x1D7D1, 'M', u'3'), - (0x1D7D2, 'M', u'4'), - (0x1D7D3, 'M', u'5'), - (0x1D7D4, 'M', u'6'), - (0x1D7D5, 'M', u'7'), - (0x1D7D6, 'M', u'8'), - (0x1D7D7, 'M', u'9'), - (0x1D7D8, 'M', u'0'), - (0x1D7D9, 'M', u'1'), - (0x1D7DA, 'M', u'2'), - (0x1D7DB, 'M', u'3'), - (0x1D7DC, 'M', u'4'), - (0x1D7DD, 'M', u'5'), - (0x1D7DE, 'M', u'6'), - (0x1D7DF, 'M', u'7'), - (0x1D7E0, 'M', u'8'), - (0x1D7E1, 'M', u'9'), - (0x1D7E2, 'M', u'0'), - (0x1D7E3, 'M', u'1'), - (0x1D7E4, 'M', u'2'), - (0x1D7E5, 'M', u'3'), - (0x1D7E6, 'M', u'4'), - (0x1D7E7, 'M', u'5'), - (0x1D7E8, 'M', u'6'), - (0x1D7E9, 'M', u'7'), - (0x1D7EA, 'M', u'8'), - (0x1D7EB, 'M', u'9'), - (0x1D7EC, 'M', u'0'), - (0x1D7ED, 'M', u'1'), - (0x1D7EE, 'M', u'2'), - ] - -def _seg_68(): - return [ - (0x1D7EF, 'M', u'3'), - (0x1D7F0, 'M', u'4'), - (0x1D7F1, 'M', u'5'), - (0x1D7F2, 'M', u'6'), - (0x1D7F3, 'M', u'7'), - (0x1D7F4, 'M', u'8'), - (0x1D7F5, 'M', u'9'), - (0x1D7F6, 'M', u'0'), - (0x1D7F7, 'M', u'1'), - (0x1D7F8, 'M', u'2'), - (0x1D7F9, 'M', u'3'), - (0x1D7FA, 'M', u'4'), - (0x1D7FB, 'M', u'5'), - (0x1D7FC, 'M', u'6'), - (0x1D7FD, 'M', u'7'), - (0x1D7FE, 'M', u'8'), - (0x1D7FF, 'M', u'9'), - (0x1D800, 'V'), - (0x1DA8C, 'X'), - (0x1DA9B, 'V'), - (0x1DAA0, 'X'), - (0x1DAA1, 'V'), - (0x1DAB0, 'X'), - (0x1E000, 'V'), - (0x1E007, 'X'), - (0x1E008, 'V'), - (0x1E019, 'X'), - (0x1E01B, 'V'), - (0x1E022, 'X'), - (0x1E023, 'V'), - (0x1E025, 'X'), - (0x1E026, 'V'), - (0x1E02B, 'X'), - (0x1E800, 'V'), - (0x1E8C5, 'X'), - (0x1E8C7, 'V'), - (0x1E8D7, 'X'), - (0x1E900, 'M', u'𞤢'), - (0x1E901, 'M', u'𞤣'), - (0x1E902, 'M', u'𞤤'), - (0x1E903, 'M', u'𞤥'), - (0x1E904, 'M', u'𞤦'), - (0x1E905, 'M', u'𞤧'), - (0x1E906, 'M', u'𞤨'), - (0x1E907, 'M', u'𞤩'), - (0x1E908, 'M', u'𞤪'), - (0x1E909, 'M', u'𞤫'), - (0x1E90A, 'M', u'𞤬'), - (0x1E90B, 'M', u'𞤭'), - (0x1E90C, 'M', u'𞤮'), - (0x1E90D, 'M', u'𞤯'), - (0x1E90E, 'M', u'𞤰'), - (0x1E90F, 'M', u'𞤱'), - (0x1E910, 'M', u'𞤲'), - (0x1E911, 'M', u'𞤳'), - (0x1E912, 'M', u'𞤴'), - (0x1E913, 'M', u'𞤵'), - (0x1E914, 'M', u'𞤶'), - (0x1E915, 'M', u'𞤷'), - (0x1E916, 'M', u'𞤸'), - (0x1E917, 'M', u'𞤹'), - (0x1E918, 'M', u'𞤺'), - (0x1E919, 'M', u'𞤻'), - (0x1E91A, 'M', u'𞤼'), - (0x1E91B, 'M', u'𞤽'), - (0x1E91C, 'M', u'𞤾'), - (0x1E91D, 'M', u'𞤿'), - (0x1E91E, 'M', u'𞥀'), - (0x1E91F, 'M', u'𞥁'), - (0x1E920, 'M', u'𞥂'), - (0x1E921, 'M', u'𞥃'), - (0x1E922, 'V'), - (0x1E94B, 'X'), - (0x1E950, 'V'), - (0x1E95A, 'X'), - (0x1E95E, 'V'), - (0x1E960, 'X'), - (0x1EC71, 'V'), - (0x1ECB5, 'X'), - (0x1EE00, 'M', u'ا'), - (0x1EE01, 'M', u'ب'), - (0x1EE02, 'M', u'ج'), - (0x1EE03, 'M', u'د'), - (0x1EE04, 'X'), - (0x1EE05, 'M', u'و'), - (0x1EE06, 'M', u'ز'), - (0x1EE07, 'M', u'ح'), - (0x1EE08, 'M', u'ط'), - (0x1EE09, 'M', u'ي'), - (0x1EE0A, 'M', u'ك'), - (0x1EE0B, 'M', u'ل'), - (0x1EE0C, 'M', u'م'), - (0x1EE0D, 'M', u'ن'), - (0x1EE0E, 'M', u'س'), - (0x1EE0F, 'M', u'ع'), - (0x1EE10, 'M', u'ف'), - (0x1EE11, 'M', u'ص'), - (0x1EE12, 'M', u'ق'), - (0x1EE13, 'M', u'ر'), - (0x1EE14, 'M', u'ش'), - ] - -def _seg_69(): - return [ - (0x1EE15, 'M', u'ت'), - (0x1EE16, 'M', u'ث'), - (0x1EE17, 'M', u'خ'), - (0x1EE18, 'M', u'ذ'), - (0x1EE19, 'M', u'ض'), - (0x1EE1A, 'M', u'ظ'), - (0x1EE1B, 'M', u'غ'), - (0x1EE1C, 'M', u'ٮ'), - (0x1EE1D, 'M', u'ں'), - (0x1EE1E, 'M', u'ڡ'), - (0x1EE1F, 'M', u'ٯ'), - (0x1EE20, 'X'), - (0x1EE21, 'M', u'ب'), - (0x1EE22, 'M', u'ج'), - (0x1EE23, 'X'), - (0x1EE24, 'M', u'ه'), - (0x1EE25, 'X'), - (0x1EE27, 'M', u'ح'), - (0x1EE28, 'X'), - (0x1EE29, 'M', u'ي'), - (0x1EE2A, 'M', u'ك'), - (0x1EE2B, 'M', u'ل'), - (0x1EE2C, 'M', u'م'), - (0x1EE2D, 'M', u'ن'), - (0x1EE2E, 'M', u'س'), - (0x1EE2F, 'M', u'ع'), - (0x1EE30, 'M', u'ف'), - (0x1EE31, 'M', u'ص'), - (0x1EE32, 'M', u'ق'), - (0x1EE33, 'X'), - (0x1EE34, 'M', u'ش'), - (0x1EE35, 'M', u'ت'), - (0x1EE36, 'M', u'ث'), - (0x1EE37, 'M', u'خ'), - (0x1EE38, 'X'), - (0x1EE39, 'M', u'ض'), - (0x1EE3A, 'X'), - (0x1EE3B, 'M', u'غ'), - (0x1EE3C, 'X'), - (0x1EE42, 'M', u'ج'), - (0x1EE43, 'X'), - (0x1EE47, 'M', u'ح'), - (0x1EE48, 'X'), - (0x1EE49, 'M', u'ي'), - (0x1EE4A, 'X'), - (0x1EE4B, 'M', u'ل'), - (0x1EE4C, 'X'), - (0x1EE4D, 'M', u'ن'), - (0x1EE4E, 'M', u'س'), - (0x1EE4F, 'M', u'ع'), - (0x1EE50, 'X'), - (0x1EE51, 'M', u'ص'), - (0x1EE52, 'M', u'ق'), - (0x1EE53, 'X'), - (0x1EE54, 'M', u'ش'), - (0x1EE55, 'X'), - (0x1EE57, 'M', u'خ'), - (0x1EE58, 'X'), - (0x1EE59, 'M', u'ض'), - (0x1EE5A, 'X'), - (0x1EE5B, 'M', u'غ'), - (0x1EE5C, 'X'), - (0x1EE5D, 'M', u'ں'), - (0x1EE5E, 'X'), - (0x1EE5F, 'M', u'ٯ'), - (0x1EE60, 'X'), - (0x1EE61, 'M', u'ب'), - (0x1EE62, 'M', u'ج'), - (0x1EE63, 'X'), - (0x1EE64, 'M', u'ه'), - (0x1EE65, 'X'), - (0x1EE67, 'M', u'ح'), - (0x1EE68, 'M', u'ط'), - (0x1EE69, 'M', u'ي'), - (0x1EE6A, 'M', u'ك'), - (0x1EE6B, 'X'), - (0x1EE6C, 'M', u'م'), - (0x1EE6D, 'M', u'ن'), - (0x1EE6E, 'M', u'س'), - (0x1EE6F, 'M', u'ع'), - (0x1EE70, 'M', u'ف'), - (0x1EE71, 'M', u'ص'), - (0x1EE72, 'M', u'ق'), - (0x1EE73, 'X'), - (0x1EE74, 'M', u'ش'), - (0x1EE75, 'M', u'ت'), - (0x1EE76, 'M', u'ث'), - (0x1EE77, 'M', u'خ'), - (0x1EE78, 'X'), - (0x1EE79, 'M', u'ض'), - (0x1EE7A, 'M', u'ظ'), - (0x1EE7B, 'M', u'غ'), - (0x1EE7C, 'M', u'ٮ'), - (0x1EE7D, 'X'), - (0x1EE7E, 'M', u'ڡ'), - (0x1EE7F, 'X'), - (0x1EE80, 'M', u'ا'), - (0x1EE81, 'M', u'ب'), - (0x1EE82, 'M', u'ج'), - (0x1EE83, 'M', u'د'), - ] - -def _seg_70(): - return [ - (0x1EE84, 'M', u'ه'), - (0x1EE85, 'M', u'و'), - (0x1EE86, 'M', u'ز'), - (0x1EE87, 'M', u'ح'), - (0x1EE88, 'M', u'ط'), - (0x1EE89, 'M', u'ي'), - (0x1EE8A, 'X'), - (0x1EE8B, 'M', u'ل'), - (0x1EE8C, 'M', u'م'), - (0x1EE8D, 'M', u'ن'), - (0x1EE8E, 'M', u'س'), - (0x1EE8F, 'M', u'ع'), - (0x1EE90, 'M', u'ف'), - (0x1EE91, 'M', u'ص'), - (0x1EE92, 'M', u'ق'), - (0x1EE93, 'M', u'ر'), - (0x1EE94, 'M', u'ش'), - (0x1EE95, 'M', u'ت'), - (0x1EE96, 'M', u'ث'), - (0x1EE97, 'M', u'خ'), - (0x1EE98, 'M', u'ذ'), - (0x1EE99, 'M', u'ض'), - (0x1EE9A, 'M', u'ظ'), - (0x1EE9B, 'M', u'غ'), - (0x1EE9C, 'X'), - (0x1EEA1, 'M', u'ب'), - (0x1EEA2, 'M', u'ج'), - (0x1EEA3, 'M', u'د'), - (0x1EEA4, 'X'), - (0x1EEA5, 'M', u'و'), - (0x1EEA6, 'M', u'ز'), - (0x1EEA7, 'M', u'ح'), - (0x1EEA8, 'M', u'ط'), - (0x1EEA9, 'M', u'ي'), - (0x1EEAA, 'X'), - (0x1EEAB, 'M', u'ل'), - (0x1EEAC, 'M', u'م'), - (0x1EEAD, 'M', u'ن'), - (0x1EEAE, 'M', u'س'), - (0x1EEAF, 'M', u'ع'), - (0x1EEB0, 'M', u'ف'), - (0x1EEB1, 'M', u'ص'), - (0x1EEB2, 'M', u'ق'), - (0x1EEB3, 'M', u'ر'), - (0x1EEB4, 'M', u'ش'), - (0x1EEB5, 'M', u'ت'), - (0x1EEB6, 'M', u'ث'), - (0x1EEB7, 'M', u'خ'), - (0x1EEB8, 'M', u'ذ'), - (0x1EEB9, 'M', u'ض'), - (0x1EEBA, 'M', u'ظ'), - (0x1EEBB, 'M', u'غ'), - (0x1EEBC, 'X'), - (0x1EEF0, 'V'), - (0x1EEF2, 'X'), - (0x1F000, 'V'), - (0x1F02C, 'X'), - (0x1F030, 'V'), - (0x1F094, 'X'), - (0x1F0A0, 'V'), - (0x1F0AF, 'X'), - (0x1F0B1, 'V'), - (0x1F0C0, 'X'), - (0x1F0C1, 'V'), - (0x1F0D0, 'X'), - (0x1F0D1, 'V'), - (0x1F0F6, 'X'), - (0x1F101, '3', u'0,'), - (0x1F102, '3', u'1,'), - (0x1F103, '3', u'2,'), - (0x1F104, '3', u'3,'), - (0x1F105, '3', u'4,'), - (0x1F106, '3', u'5,'), - (0x1F107, '3', u'6,'), - (0x1F108, '3', u'7,'), - (0x1F109, '3', u'8,'), - (0x1F10A, '3', u'9,'), - (0x1F10B, 'V'), - (0x1F10D, 'X'), - (0x1F110, '3', u'(a)'), - (0x1F111, '3', u'(b)'), - (0x1F112, '3', u'(c)'), - (0x1F113, '3', u'(d)'), - (0x1F114, '3', u'(e)'), - (0x1F115, '3', u'(f)'), - (0x1F116, '3', u'(g)'), - (0x1F117, '3', u'(h)'), - (0x1F118, '3', u'(i)'), - (0x1F119, '3', u'(j)'), - (0x1F11A, '3', u'(k)'), - (0x1F11B, '3', u'(l)'), - (0x1F11C, '3', u'(m)'), - (0x1F11D, '3', u'(n)'), - (0x1F11E, '3', u'(o)'), - (0x1F11F, '3', u'(p)'), - (0x1F120, '3', u'(q)'), - (0x1F121, '3', u'(r)'), - (0x1F122, '3', u'(s)'), - (0x1F123, '3', u'(t)'), - (0x1F124, '3', u'(u)'), - ] - -def _seg_71(): - return [ - (0x1F125, '3', u'(v)'), - (0x1F126, '3', u'(w)'), - (0x1F127, '3', u'(x)'), - (0x1F128, '3', u'(y)'), - (0x1F129, '3', u'(z)'), - (0x1F12A, 'M', u'〔s〕'), - (0x1F12B, 'M', u'c'), - (0x1F12C, 'M', u'r'), - (0x1F12D, 'M', u'cd'), - (0x1F12E, 'M', u'wz'), - (0x1F12F, 'V'), - (0x1F130, 'M', u'a'), - (0x1F131, 'M', u'b'), - (0x1F132, 'M', u'c'), - (0x1F133, 'M', u'd'), - (0x1F134, 'M', u'e'), - (0x1F135, 'M', u'f'), - (0x1F136, 'M', u'g'), - (0x1F137, 'M', u'h'), - (0x1F138, 'M', u'i'), - (0x1F139, 'M', u'j'), - (0x1F13A, 'M', u'k'), - (0x1F13B, 'M', u'l'), - (0x1F13C, 'M', u'm'), - (0x1F13D, 'M', u'n'), - (0x1F13E, 'M', u'o'), - (0x1F13F, 'M', u'p'), - (0x1F140, 'M', u'q'), - (0x1F141, 'M', u'r'), - (0x1F142, 'M', u's'), - (0x1F143, 'M', u't'), - (0x1F144, 'M', u'u'), - (0x1F145, 'M', u'v'), - (0x1F146, 'M', u'w'), - (0x1F147, 'M', u'x'), - (0x1F148, 'M', u'y'), - (0x1F149, 'M', u'z'), - (0x1F14A, 'M', u'hv'), - (0x1F14B, 'M', u'mv'), - (0x1F14C, 'M', u'sd'), - (0x1F14D, 'M', u'ss'), - (0x1F14E, 'M', u'ppv'), - (0x1F14F, 'M', u'wc'), - (0x1F150, 'V'), - (0x1F16A, 'M', u'mc'), - (0x1F16B, 'M', u'md'), - (0x1F16C, 'X'), - (0x1F170, 'V'), - (0x1F190, 'M', u'dj'), - (0x1F191, 'V'), - (0x1F1AD, 'X'), - (0x1F1E6, 'V'), - (0x1F200, 'M', u'ほか'), - (0x1F201, 'M', u'ココ'), - (0x1F202, 'M', u'サ'), - (0x1F203, 'X'), - (0x1F210, 'M', u'手'), - (0x1F211, 'M', u'字'), - (0x1F212, 'M', u'双'), - (0x1F213, 'M', u'デ'), - (0x1F214, 'M', u'二'), - (0x1F215, 'M', u'多'), - (0x1F216, 'M', u'解'), - (0x1F217, 'M', u'天'), - (0x1F218, 'M', u'交'), - (0x1F219, 'M', u'映'), - (0x1F21A, 'M', u'無'), - (0x1F21B, 'M', u'料'), - (0x1F21C, 'M', u'前'), - (0x1F21D, 'M', u'後'), - (0x1F21E, 'M', u'再'), - (0x1F21F, 'M', u'新'), - (0x1F220, 'M', u'初'), - (0x1F221, 'M', u'終'), - (0x1F222, 'M', u'生'), - (0x1F223, 'M', u'販'), - (0x1F224, 'M', u'声'), - (0x1F225, 'M', u'吹'), - (0x1F226, 'M', u'演'), - (0x1F227, 'M', u'投'), - (0x1F228, 'M', u'捕'), - (0x1F229, 'M', u'一'), - (0x1F22A, 'M', u'三'), - (0x1F22B, 'M', u'遊'), - (0x1F22C, 'M', u'左'), - (0x1F22D, 'M', u'中'), - (0x1F22E, 'M', u'右'), - (0x1F22F, 'M', u'指'), - (0x1F230, 'M', u'走'), - (0x1F231, 'M', u'打'), - (0x1F232, 'M', u'禁'), - (0x1F233, 'M', u'空'), - (0x1F234, 'M', u'合'), - (0x1F235, 'M', u'満'), - (0x1F236, 'M', u'有'), - (0x1F237, 'M', u'月'), - (0x1F238, 'M', u'申'), - (0x1F239, 'M', u'割'), - (0x1F23A, 'M', u'営'), - (0x1F23B, 'M', u'配'), - ] - -def _seg_72(): - return [ - (0x1F23C, 'X'), - (0x1F240, 'M', u'〔本〕'), - (0x1F241, 'M', u'〔三〕'), - (0x1F242, 'M', u'〔二〕'), - (0x1F243, 'M', u'〔安〕'), - (0x1F244, 'M', u'〔点〕'), - (0x1F245, 'M', u'〔打〕'), - (0x1F246, 'M', u'〔盗〕'), - (0x1F247, 'M', u'〔勝〕'), - (0x1F248, 'M', u'〔敗〕'), - (0x1F249, 'X'), - (0x1F250, 'M', u'得'), - (0x1F251, 'M', u'可'), - (0x1F252, 'X'), - (0x1F260, 'V'), - (0x1F266, 'X'), - (0x1F300, 'V'), - (0x1F6D5, 'X'), - (0x1F6E0, 'V'), - (0x1F6ED, 'X'), - (0x1F6F0, 'V'), - (0x1F6FA, 'X'), - (0x1F700, 'V'), - (0x1F774, 'X'), - (0x1F780, 'V'), - (0x1F7D9, 'X'), - (0x1F800, 'V'), - (0x1F80C, 'X'), - (0x1F810, 'V'), - (0x1F848, 'X'), - (0x1F850, 'V'), - (0x1F85A, 'X'), - (0x1F860, 'V'), - (0x1F888, 'X'), - (0x1F890, 'V'), - (0x1F8AE, 'X'), - (0x1F900, 'V'), - (0x1F90C, 'X'), - (0x1F910, 'V'), - (0x1F93F, 'X'), - (0x1F940, 'V'), - (0x1F971, 'X'), - (0x1F973, 'V'), - (0x1F977, 'X'), - (0x1F97A, 'V'), - (0x1F97B, 'X'), - (0x1F97C, 'V'), - (0x1F9A3, 'X'), - (0x1F9B0, 'V'), - (0x1F9BA, 'X'), - (0x1F9C0, 'V'), - (0x1F9C3, 'X'), - (0x1F9D0, 'V'), - (0x1FA00, 'X'), - (0x1FA60, 'V'), - (0x1FA6E, 'X'), - (0x20000, 'V'), - (0x2A6D7, 'X'), - (0x2A700, 'V'), - (0x2B735, 'X'), - (0x2B740, 'V'), - (0x2B81E, 'X'), - (0x2B820, 'V'), - (0x2CEA2, 'X'), - (0x2CEB0, 'V'), - (0x2EBE1, 'X'), - (0x2F800, 'M', u'丽'), - (0x2F801, 'M', u'丸'), - (0x2F802, 'M', u'乁'), - (0x2F803, 'M', u'𠄢'), - (0x2F804, 'M', u'你'), - (0x2F805, 'M', u'侮'), - (0x2F806, 'M', u'侻'), - (0x2F807, 'M', u'倂'), - (0x2F808, 'M', u'偺'), - (0x2F809, 'M', u'備'), - (0x2F80A, 'M', u'僧'), - (0x2F80B, 'M', u'像'), - (0x2F80C, 'M', u'㒞'), - (0x2F80D, 'M', u'𠘺'), - (0x2F80E, 'M', u'免'), - (0x2F80F, 'M', u'兔'), - (0x2F810, 'M', u'兤'), - (0x2F811, 'M', u'具'), - (0x2F812, 'M', u'𠔜'), - (0x2F813, 'M', u'㒹'), - (0x2F814, 'M', u'內'), - (0x2F815, 'M', u'再'), - (0x2F816, 'M', u'𠕋'), - (0x2F817, 'M', u'冗'), - (0x2F818, 'M', u'冤'), - (0x2F819, 'M', u'仌'), - (0x2F81A, 'M', u'冬'), - (0x2F81B, 'M', u'况'), - (0x2F81C, 'M', u'𩇟'), - (0x2F81D, 'M', u'凵'), - (0x2F81E, 'M', u'刃'), - (0x2F81F, 'M', u'㓟'), - (0x2F820, 'M', u'刻'), - (0x2F821, 'M', u'剆'), - ] - -def _seg_73(): - return [ - (0x2F822, 'M', u'割'), - (0x2F823, 'M', u'剷'), - (0x2F824, 'M', u'㔕'), - (0x2F825, 'M', u'勇'), - (0x2F826, 'M', u'勉'), - (0x2F827, 'M', u'勤'), - (0x2F828, 'M', u'勺'), - (0x2F829, 'M', u'包'), - (0x2F82A, 'M', u'匆'), - (0x2F82B, 'M', u'北'), - (0x2F82C, 'M', u'卉'), - (0x2F82D, 'M', u'卑'), - (0x2F82E, 'M', u'博'), - (0x2F82F, 'M', u'即'), - (0x2F830, 'M', u'卽'), - (0x2F831, 'M', u'卿'), - (0x2F834, 'M', u'𠨬'), - (0x2F835, 'M', u'灰'), - (0x2F836, 'M', u'及'), - (0x2F837, 'M', u'叟'), - (0x2F838, 'M', u'𠭣'), - (0x2F839, 'M', u'叫'), - (0x2F83A, 'M', u'叱'), - (0x2F83B, 'M', u'吆'), - (0x2F83C, 'M', u'咞'), - (0x2F83D, 'M', u'吸'), - (0x2F83E, 'M', u'呈'), - (0x2F83F, 'M', u'周'), - (0x2F840, 'M', u'咢'), - (0x2F841, 'M', u'哶'), - (0x2F842, 'M', u'唐'), - (0x2F843, 'M', u'啓'), - (0x2F844, 'M', u'啣'), - (0x2F845, 'M', u'善'), - (0x2F847, 'M', u'喙'), - (0x2F848, 'M', u'喫'), - (0x2F849, 'M', u'喳'), - (0x2F84A, 'M', u'嗂'), - (0x2F84B, 'M', u'圖'), - (0x2F84C, 'M', u'嘆'), - (0x2F84D, 'M', u'圗'), - (0x2F84E, 'M', u'噑'), - (0x2F84F, 'M', u'噴'), - (0x2F850, 'M', u'切'), - (0x2F851, 'M', u'壮'), - (0x2F852, 'M', u'城'), - (0x2F853, 'M', u'埴'), - (0x2F854, 'M', u'堍'), - (0x2F855, 'M', u'型'), - (0x2F856, 'M', u'堲'), - (0x2F857, 'M', u'報'), - (0x2F858, 'M', u'墬'), - (0x2F859, 'M', u'𡓤'), - (0x2F85A, 'M', u'売'), - (0x2F85B, 'M', u'壷'), - (0x2F85C, 'M', u'夆'), - (0x2F85D, 'M', u'多'), - (0x2F85E, 'M', u'夢'), - (0x2F85F, 'M', u'奢'), - (0x2F860, 'M', u'𡚨'), - (0x2F861, 'M', u'𡛪'), - (0x2F862, 'M', u'姬'), - (0x2F863, 'M', u'娛'), - (0x2F864, 'M', u'娧'), - (0x2F865, 'M', u'姘'), - (0x2F866, 'M', u'婦'), - (0x2F867, 'M', u'㛮'), - (0x2F868, 'X'), - (0x2F869, 'M', u'嬈'), - (0x2F86A, 'M', u'嬾'), - (0x2F86C, 'M', u'𡧈'), - (0x2F86D, 'M', u'寃'), - (0x2F86E, 'M', u'寘'), - (0x2F86F, 'M', u'寧'), - (0x2F870, 'M', u'寳'), - (0x2F871, 'M', u'𡬘'), - (0x2F872, 'M', u'寿'), - (0x2F873, 'M', u'将'), - (0x2F874, 'X'), - (0x2F875, 'M', u'尢'), - (0x2F876, 'M', u'㞁'), - (0x2F877, 'M', u'屠'), - (0x2F878, 'M', u'屮'), - (0x2F879, 'M', u'峀'), - (0x2F87A, 'M', u'岍'), - (0x2F87B, 'M', u'𡷤'), - (0x2F87C, 'M', u'嵃'), - (0x2F87D, 'M', u'𡷦'), - (0x2F87E, 'M', u'嵮'), - (0x2F87F, 'M', u'嵫'), - (0x2F880, 'M', u'嵼'), - (0x2F881, 'M', u'巡'), - (0x2F882, 'M', u'巢'), - (0x2F883, 'M', u'㠯'), - (0x2F884, 'M', u'巽'), - (0x2F885, 'M', u'帨'), - (0x2F886, 'M', u'帽'), - (0x2F887, 'M', u'幩'), - (0x2F888, 'M', u'㡢'), - (0x2F889, 'M', u'𢆃'), - ] - -def _seg_74(): - return [ - (0x2F88A, 'M', u'㡼'), - (0x2F88B, 'M', u'庰'), - (0x2F88C, 'M', u'庳'), - (0x2F88D, 'M', u'庶'), - (0x2F88E, 'M', u'廊'), - (0x2F88F, 'M', u'𪎒'), - (0x2F890, 'M', u'廾'), - (0x2F891, 'M', u'𢌱'), - (0x2F893, 'M', u'舁'), - (0x2F894, 'M', u'弢'), - (0x2F896, 'M', u'㣇'), - (0x2F897, 'M', u'𣊸'), - (0x2F898, 'M', u'𦇚'), - (0x2F899, 'M', u'形'), - (0x2F89A, 'M', u'彫'), - (0x2F89B, 'M', u'㣣'), - (0x2F89C, 'M', u'徚'), - (0x2F89D, 'M', u'忍'), - (0x2F89E, 'M', u'志'), - (0x2F89F, 'M', u'忹'), - (0x2F8A0, 'M', u'悁'), - (0x2F8A1, 'M', u'㤺'), - (0x2F8A2, 'M', u'㤜'), - (0x2F8A3, 'M', u'悔'), - (0x2F8A4, 'M', u'𢛔'), - (0x2F8A5, 'M', u'惇'), - (0x2F8A6, 'M', u'慈'), - (0x2F8A7, 'M', u'慌'), - (0x2F8A8, 'M', u'慎'), - (0x2F8A9, 'M', u'慌'), - (0x2F8AA, 'M', u'慺'), - (0x2F8AB, 'M', u'憎'), - (0x2F8AC, 'M', u'憲'), - (0x2F8AD, 'M', u'憤'), - (0x2F8AE, 'M', u'憯'), - (0x2F8AF, 'M', u'懞'), - (0x2F8B0, 'M', u'懲'), - (0x2F8B1, 'M', u'懶'), - (0x2F8B2, 'M', u'成'), - (0x2F8B3, 'M', u'戛'), - (0x2F8B4, 'M', u'扝'), - (0x2F8B5, 'M', u'抱'), - (0x2F8B6, 'M', u'拔'), - (0x2F8B7, 'M', u'捐'), - (0x2F8B8, 'M', u'𢬌'), - (0x2F8B9, 'M', u'挽'), - (0x2F8BA, 'M', u'拼'), - (0x2F8BB, 'M', u'捨'), - (0x2F8BC, 'M', u'掃'), - (0x2F8BD, 'M', u'揤'), - (0x2F8BE, 'M', u'𢯱'), - (0x2F8BF, 'M', u'搢'), - (0x2F8C0, 'M', u'揅'), - (0x2F8C1, 'M', u'掩'), - (0x2F8C2, 'M', u'㨮'), - (0x2F8C3, 'M', u'摩'), - (0x2F8C4, 'M', u'摾'), - (0x2F8C5, 'M', u'撝'), - (0x2F8C6, 'M', u'摷'), - (0x2F8C7, 'M', u'㩬'), - (0x2F8C8, 'M', u'敏'), - (0x2F8C9, 'M', u'敬'), - (0x2F8CA, 'M', u'𣀊'), - (0x2F8CB, 'M', u'旣'), - (0x2F8CC, 'M', u'書'), - (0x2F8CD, 'M', u'晉'), - (0x2F8CE, 'M', u'㬙'), - (0x2F8CF, 'M', u'暑'), - (0x2F8D0, 'M', u'㬈'), - (0x2F8D1, 'M', u'㫤'), - (0x2F8D2, 'M', u'冒'), - (0x2F8D3, 'M', u'冕'), - (0x2F8D4, 'M', u'最'), - (0x2F8D5, 'M', u'暜'), - (0x2F8D6, 'M', u'肭'), - (0x2F8D7, 'M', u'䏙'), - (0x2F8D8, 'M', u'朗'), - (0x2F8D9, 'M', u'望'), - (0x2F8DA, 'M', u'朡'), - (0x2F8DB, 'M', u'杞'), - (0x2F8DC, 'M', u'杓'), - (0x2F8DD, 'M', u'𣏃'), - (0x2F8DE, 'M', u'㭉'), - (0x2F8DF, 'M', u'柺'), - (0x2F8E0, 'M', u'枅'), - (0x2F8E1, 'M', u'桒'), - (0x2F8E2, 'M', u'梅'), - (0x2F8E3, 'M', u'𣑭'), - (0x2F8E4, 'M', u'梎'), - (0x2F8E5, 'M', u'栟'), - (0x2F8E6, 'M', u'椔'), - (0x2F8E7, 'M', u'㮝'), - (0x2F8E8, 'M', u'楂'), - (0x2F8E9, 'M', u'榣'), - (0x2F8EA, 'M', u'槪'), - (0x2F8EB, 'M', u'檨'), - (0x2F8EC, 'M', u'𣚣'), - (0x2F8ED, 'M', u'櫛'), - (0x2F8EE, 'M', u'㰘'), - (0x2F8EF, 'M', u'次'), - ] - -def _seg_75(): - return [ - (0x2F8F0, 'M', u'𣢧'), - (0x2F8F1, 'M', u'歔'), - (0x2F8F2, 'M', u'㱎'), - (0x2F8F3, 'M', u'歲'), - (0x2F8F4, 'M', u'殟'), - (0x2F8F5, 'M', u'殺'), - (0x2F8F6, 'M', u'殻'), - (0x2F8F7, 'M', u'𣪍'), - (0x2F8F8, 'M', u'𡴋'), - (0x2F8F9, 'M', u'𣫺'), - (0x2F8FA, 'M', u'汎'), - (0x2F8FB, 'M', u'𣲼'), - (0x2F8FC, 'M', u'沿'), - (0x2F8FD, 'M', u'泍'), - (0x2F8FE, 'M', u'汧'), - (0x2F8FF, 'M', u'洖'), - (0x2F900, 'M', u'派'), - (0x2F901, 'M', u'海'), - (0x2F902, 'M', u'流'), - (0x2F903, 'M', u'浩'), - (0x2F904, 'M', u'浸'), - (0x2F905, 'M', u'涅'), - (0x2F906, 'M', u'𣴞'), - (0x2F907, 'M', u'洴'), - (0x2F908, 'M', u'港'), - (0x2F909, 'M', u'湮'), - (0x2F90A, 'M', u'㴳'), - (0x2F90B, 'M', u'滋'), - (0x2F90C, 'M', u'滇'), - (0x2F90D, 'M', u'𣻑'), - (0x2F90E, 'M', u'淹'), - (0x2F90F, 'M', u'潮'), - (0x2F910, 'M', u'𣽞'), - (0x2F911, 'M', u'𣾎'), - (0x2F912, 'M', u'濆'), - (0x2F913, 'M', u'瀹'), - (0x2F914, 'M', u'瀞'), - (0x2F915, 'M', u'瀛'), - (0x2F916, 'M', u'㶖'), - (0x2F917, 'M', u'灊'), - (0x2F918, 'M', u'災'), - (0x2F919, 'M', u'灷'), - (0x2F91A, 'M', u'炭'), - (0x2F91B, 'M', u'𠔥'), - (0x2F91C, 'M', u'煅'), - (0x2F91D, 'M', u'𤉣'), - (0x2F91E, 'M', u'熜'), - (0x2F91F, 'X'), - (0x2F920, 'M', u'爨'), - (0x2F921, 'M', u'爵'), - (0x2F922, 'M', u'牐'), - (0x2F923, 'M', u'𤘈'), - (0x2F924, 'M', u'犀'), - (0x2F925, 'M', u'犕'), - (0x2F926, 'M', u'𤜵'), - (0x2F927, 'M', u'𤠔'), - (0x2F928, 'M', u'獺'), - (0x2F929, 'M', u'王'), - (0x2F92A, 'M', u'㺬'), - (0x2F92B, 'M', u'玥'), - (0x2F92C, 'M', u'㺸'), - (0x2F92E, 'M', u'瑇'), - (0x2F92F, 'M', u'瑜'), - (0x2F930, 'M', u'瑱'), - (0x2F931, 'M', u'璅'), - (0x2F932, 'M', u'瓊'), - (0x2F933, 'M', u'㼛'), - (0x2F934, 'M', u'甤'), - (0x2F935, 'M', u'𤰶'), - (0x2F936, 'M', u'甾'), - (0x2F937, 'M', u'𤲒'), - (0x2F938, 'M', u'異'), - (0x2F939, 'M', u'𢆟'), - (0x2F93A, 'M', u'瘐'), - (0x2F93B, 'M', u'𤾡'), - (0x2F93C, 'M', u'𤾸'), - (0x2F93D, 'M', u'𥁄'), - (0x2F93E, 'M', u'㿼'), - (0x2F93F, 'M', u'䀈'), - (0x2F940, 'M', u'直'), - (0x2F941, 'M', u'𥃳'), - (0x2F942, 'M', u'𥃲'), - (0x2F943, 'M', u'𥄙'), - (0x2F944, 'M', u'𥄳'), - (0x2F945, 'M', u'眞'), - (0x2F946, 'M', u'真'), - (0x2F948, 'M', u'睊'), - (0x2F949, 'M', u'䀹'), - (0x2F94A, 'M', u'瞋'), - (0x2F94B, 'M', u'䁆'), - (0x2F94C, 'M', u'䂖'), - (0x2F94D, 'M', u'𥐝'), - (0x2F94E, 'M', u'硎'), - (0x2F94F, 'M', u'碌'), - (0x2F950, 'M', u'磌'), - (0x2F951, 'M', u'䃣'), - (0x2F952, 'M', u'𥘦'), - (0x2F953, 'M', u'祖'), - (0x2F954, 'M', u'𥚚'), - (0x2F955, 'M', u'𥛅'), - ] - -def _seg_76(): - return [ - (0x2F956, 'M', u'福'), - (0x2F957, 'M', u'秫'), - (0x2F958, 'M', u'䄯'), - (0x2F959, 'M', u'穀'), - (0x2F95A, 'M', u'穊'), - (0x2F95B, 'M', u'穏'), - (0x2F95C, 'M', u'𥥼'), - (0x2F95D, 'M', u'𥪧'), - (0x2F95F, 'X'), - (0x2F960, 'M', u'䈂'), - (0x2F961, 'M', u'𥮫'), - (0x2F962, 'M', u'篆'), - (0x2F963, 'M', u'築'), - (0x2F964, 'M', u'䈧'), - (0x2F965, 'M', u'𥲀'), - (0x2F966, 'M', u'糒'), - (0x2F967, 'M', u'䊠'), - (0x2F968, 'M', u'糨'), - (0x2F969, 'M', u'糣'), - (0x2F96A, 'M', u'紀'), - (0x2F96B, 'M', u'𥾆'), - (0x2F96C, 'M', u'絣'), - (0x2F96D, 'M', u'䌁'), - (0x2F96E, 'M', u'緇'), - (0x2F96F, 'M', u'縂'), - (0x2F970, 'M', u'繅'), - (0x2F971, 'M', u'䌴'), - (0x2F972, 'M', u'𦈨'), - (0x2F973, 'M', u'𦉇'), - (0x2F974, 'M', u'䍙'), - (0x2F975, 'M', u'𦋙'), - (0x2F976, 'M', u'罺'), - (0x2F977, 'M', u'𦌾'), - (0x2F978, 'M', u'羕'), - (0x2F979, 'M', u'翺'), - (0x2F97A, 'M', u'者'), - (0x2F97B, 'M', u'𦓚'), - (0x2F97C, 'M', u'𦔣'), - (0x2F97D, 'M', u'聠'), - (0x2F97E, 'M', u'𦖨'), - (0x2F97F, 'M', u'聰'), - (0x2F980, 'M', u'𣍟'), - (0x2F981, 'M', u'䏕'), - (0x2F982, 'M', u'育'), - (0x2F983, 'M', u'脃'), - (0x2F984, 'M', u'䐋'), - (0x2F985, 'M', u'脾'), - (0x2F986, 'M', u'媵'), - (0x2F987, 'M', u'𦞧'), - (0x2F988, 'M', u'𦞵'), - (0x2F989, 'M', u'𣎓'), - (0x2F98A, 'M', u'𣎜'), - (0x2F98B, 'M', u'舁'), - (0x2F98C, 'M', u'舄'), - (0x2F98D, 'M', u'辞'), - (0x2F98E, 'M', u'䑫'), - (0x2F98F, 'M', u'芑'), - (0x2F990, 'M', u'芋'), - (0x2F991, 'M', u'芝'), - (0x2F992, 'M', u'劳'), - (0x2F993, 'M', u'花'), - (0x2F994, 'M', u'芳'), - (0x2F995, 'M', u'芽'), - (0x2F996, 'M', u'苦'), - (0x2F997, 'M', u'𦬼'), - (0x2F998, 'M', u'若'), - (0x2F999, 'M', u'茝'), - (0x2F99A, 'M', u'荣'), - (0x2F99B, 'M', u'莭'), - (0x2F99C, 'M', u'茣'), - (0x2F99D, 'M', u'莽'), - (0x2F99E, 'M', u'菧'), - (0x2F99F, 'M', u'著'), - (0x2F9A0, 'M', u'荓'), - (0x2F9A1, 'M', u'菊'), - (0x2F9A2, 'M', u'菌'), - (0x2F9A3, 'M', u'菜'), - (0x2F9A4, 'M', u'𦰶'), - (0x2F9A5, 'M', u'𦵫'), - (0x2F9A6, 'M', u'𦳕'), - (0x2F9A7, 'M', u'䔫'), - (0x2F9A8, 'M', u'蓱'), - (0x2F9A9, 'M', u'蓳'), - (0x2F9AA, 'M', u'蔖'), - (0x2F9AB, 'M', u'𧏊'), - (0x2F9AC, 'M', u'蕤'), - (0x2F9AD, 'M', u'𦼬'), - (0x2F9AE, 'M', u'䕝'), - (0x2F9AF, 'M', u'䕡'), - (0x2F9B0, 'M', u'𦾱'), - (0x2F9B1, 'M', u'𧃒'), - (0x2F9B2, 'M', u'䕫'), - (0x2F9B3, 'M', u'虐'), - (0x2F9B4, 'M', u'虜'), - (0x2F9B5, 'M', u'虧'), - (0x2F9B6, 'M', u'虩'), - (0x2F9B7, 'M', u'蚩'), - (0x2F9B8, 'M', u'蚈'), - (0x2F9B9, 'M', u'蜎'), - (0x2F9BA, 'M', u'蛢'), - ] - -def _seg_77(): - return [ - (0x2F9BB, 'M', u'蝹'), - (0x2F9BC, 'M', u'蜨'), - (0x2F9BD, 'M', u'蝫'), - (0x2F9BE, 'M', u'螆'), - (0x2F9BF, 'X'), - (0x2F9C0, 'M', u'蟡'), - (0x2F9C1, 'M', u'蠁'), - (0x2F9C2, 'M', u'䗹'), - (0x2F9C3, 'M', u'衠'), - (0x2F9C4, 'M', u'衣'), - (0x2F9C5, 'M', u'𧙧'), - (0x2F9C6, 'M', u'裗'), - (0x2F9C7, 'M', u'裞'), - (0x2F9C8, 'M', u'䘵'), - (0x2F9C9, 'M', u'裺'), - (0x2F9CA, 'M', u'㒻'), - (0x2F9CB, 'M', u'𧢮'), - (0x2F9CC, 'M', u'𧥦'), - (0x2F9CD, 'M', u'䚾'), - (0x2F9CE, 'M', u'䛇'), - (0x2F9CF, 'M', u'誠'), - (0x2F9D0, 'M', u'諭'), - (0x2F9D1, 'M', u'變'), - (0x2F9D2, 'M', u'豕'), - (0x2F9D3, 'M', u'𧲨'), - (0x2F9D4, 'M', u'貫'), - (0x2F9D5, 'M', u'賁'), - (0x2F9D6, 'M', u'贛'), - (0x2F9D7, 'M', u'起'), - (0x2F9D8, 'M', u'𧼯'), - (0x2F9D9, 'M', u'𠠄'), - (0x2F9DA, 'M', u'跋'), - (0x2F9DB, 'M', u'趼'), - (0x2F9DC, 'M', u'跰'), - (0x2F9DD, 'M', u'𠣞'), - (0x2F9DE, 'M', u'軔'), - (0x2F9DF, 'M', u'輸'), - (0x2F9E0, 'M', u'𨗒'), - (0x2F9E1, 'M', u'𨗭'), - (0x2F9E2, 'M', u'邔'), - (0x2F9E3, 'M', u'郱'), - (0x2F9E4, 'M', u'鄑'), - (0x2F9E5, 'M', u'𨜮'), - (0x2F9E6, 'M', u'鄛'), - (0x2F9E7, 'M', u'鈸'), - (0x2F9E8, 'M', u'鋗'), - (0x2F9E9, 'M', u'鋘'), - (0x2F9EA, 'M', u'鉼'), - (0x2F9EB, 'M', u'鏹'), - (0x2F9EC, 'M', u'鐕'), - (0x2F9ED, 'M', u'𨯺'), - (0x2F9EE, 'M', u'開'), - (0x2F9EF, 'M', u'䦕'), - (0x2F9F0, 'M', u'閷'), - (0x2F9F1, 'M', u'𨵷'), - (0x2F9F2, 'M', u'䧦'), - (0x2F9F3, 'M', u'雃'), - (0x2F9F4, 'M', u'嶲'), - (0x2F9F5, 'M', u'霣'), - (0x2F9F6, 'M', u'𩅅'), - (0x2F9F7, 'M', u'𩈚'), - (0x2F9F8, 'M', u'䩮'), - (0x2F9F9, 'M', u'䩶'), - (0x2F9FA, 'M', u'韠'), - (0x2F9FB, 'M', u'𩐊'), - (0x2F9FC, 'M', u'䪲'), - (0x2F9FD, 'M', u'𩒖'), - (0x2F9FE, 'M', u'頋'), - (0x2FA00, 'M', u'頩'), - (0x2FA01, 'M', u'𩖶'), - (0x2FA02, 'M', u'飢'), - (0x2FA03, 'M', u'䬳'), - (0x2FA04, 'M', u'餩'), - (0x2FA05, 'M', u'馧'), - (0x2FA06, 'M', u'駂'), - (0x2FA07, 'M', u'駾'), - (0x2FA08, 'M', u'䯎'), - (0x2FA09, 'M', u'𩬰'), - (0x2FA0A, 'M', u'鬒'), - (0x2FA0B, 'M', u'鱀'), - (0x2FA0C, 'M', u'鳽'), - (0x2FA0D, 'M', u'䳎'), - (0x2FA0E, 'M', u'䳭'), - (0x2FA0F, 'M', u'鵧'), - (0x2FA10, 'M', u'𪃎'), - (0x2FA11, 'M', u'䳸'), - (0x2FA12, 'M', u'𪄅'), - (0x2FA13, 'M', u'𪈎'), - (0x2FA14, 'M', u'𪊑'), - (0x2FA15, 'M', u'麻'), - (0x2FA16, 'M', u'䵖'), - (0x2FA17, 'M', u'黹'), - (0x2FA18, 'M', u'黾'), - (0x2FA19, 'M', u'鼅'), - (0x2FA1A, 'M', u'鼏'), - (0x2FA1B, 'M', u'鼖'), - (0x2FA1C, 'M', u'鼻'), - (0x2FA1D, 'M', u'𪘀'), - (0x2FA1E, 'X'), - (0xE0100, 'I'), - ] - -def _seg_78(): - return [ - (0xE01F0, 'X'), - ] - -uts46data = tuple( - _seg_0() - + _seg_1() - + _seg_2() - + _seg_3() - + _seg_4() - + _seg_5() - + _seg_6() - + _seg_7() - + _seg_8() - + _seg_9() - + _seg_10() - + _seg_11() - + _seg_12() - + _seg_13() - + _seg_14() - + _seg_15() - + _seg_16() - + _seg_17() - + _seg_18() - + _seg_19() - + _seg_20() - + _seg_21() - + _seg_22() - + _seg_23() - + _seg_24() - + _seg_25() - + _seg_26() - + _seg_27() - + _seg_28() - + _seg_29() - + _seg_30() - + _seg_31() - + _seg_32() - + _seg_33() - + _seg_34() - + _seg_35() - + _seg_36() - + _seg_37() - + _seg_38() - + _seg_39() - + _seg_40() - + _seg_41() - + _seg_42() - + _seg_43() - + _seg_44() - + _seg_45() - + _seg_46() - + _seg_47() - + _seg_48() - + _seg_49() - + _seg_50() - + _seg_51() - + _seg_52() - + _seg_53() - + _seg_54() - + _seg_55() - + _seg_56() - + _seg_57() - + _seg_58() - + _seg_59() - + _seg_60() - + _seg_61() - + _seg_62() - + _seg_63() - + _seg_64() - + _seg_65() - + _seg_66() - + _seg_67() - + _seg_68() - + _seg_69() - + _seg_70() - + _seg_71() - + _seg_72() - + _seg_73() - + _seg_74() - + _seg_75() - + _seg_76() - + _seg_77() - + _seg_78() -) diff --git a/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/DESCRIPTION.rst b/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/DESCRIPTION.rst deleted file mode 100644 index a36ee2f..0000000 --- a/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/DESCRIPTION.rst +++ /dev/null @@ -1,124 +0,0 @@ -# observable -[![Build Status](https://travis-ci.com/timofurrer/observable.svg?branch=master)](https://travis-ci.com/timofurrer/observable) -[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) - -**pyobservable** is a minimalist event system for python. It provides you an easy-to-use interface to trigger arbitrary functions when specific events occur. - -```python -from observable import Observable - -obs = Observable() - -@obs.on("error") -def error_handler(message): - # do some fancy error handling - logging.error(f"An error occured: {message}") - -... - -def do_time_travel(): - # do some time traveling - ... - if year != 1291: - obs.trigger("error", "Time travel to 1291 didn't work") -``` - -**Note:** We are Python 3 only! Only Python Versions >= 3.5 are supported. Use [v0.3.2](https://pypi.org/project/observable/0.3.2/) for older Python Versions. - -## How to use - -Use a `pip` to install it from PyPI: - - pip install observable - -After completion you can start using `observable`: - -```python -from observable import Observable - -obs = Observable() -``` - -## Usage - -### `on`: Register event handler with `on` -There are two ways to register a function to an event.
-The first way is to register the event with a decorator like this: - -```python -@obs.on("error") -def error_func(message): - print("Error: %s" % message) -``` - -The second way is to register it with a method call: - -```python -def error_func(message): - print("Error: %s" % message) -obs.on("error", error_func) -``` - -### `once`: Register event handler with `once` -`once` works like `on`, but once the event handler is triggered it will be removed and cannot be triggered again. - -### `trigger`: trigger event -You can trigger a registered event with the `trigger` method: - -```python -obs.trigger("error", "This is my error message") -``` - -If no handler for the event `error` could be found an `Observable.NoHandlerFound`-Exception will be raised. - -### `off`: remove handler and events -Remove a handler from a specified event: - -```python -obs.off("error", error_func) -``` - -```python -obs.off("error", [error_func, second_error_func]) -``` - -Remove all handlers from a specified event: - -```python -obs.off("error") -``` - -Clear all events: - -```python -obs.off() -``` - -### `get_all_handlers`, `get_handlers` and `is_registered`: Check which handlers are registered -Imagine you registered the following handlers: - -```python -@obs.on("success") -def success_func(): - print("Success!") - -@obs.on("error") -def error_func(message): - print("Error: %s" % message) -``` - -Then you can do the following to inspect the registered handlers: -```python ->>> obs.get_all_handlers() -{'success': [], 'error': []} ->>> obs.get_handlers("success") -[] ->>> obs.get_handlers("other_event") -[] -``` - -*** - -*

This project is published under [MIT](LICENSE).
A [Timo Furrer](https://tuxtimo.me) project.
- :tada: -

* - - diff --git a/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/INSTALLER b/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/METADATA b/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/METADATA deleted file mode 100644 index 2583735..0000000 --- a/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/METADATA +++ /dev/null @@ -1,147 +0,0 @@ -Metadata-Version: 2.0 -Name: observable -Version: 1.0.3 -Summary: minimalist event system -Home-page: https://github.com/timofurrer/observable -Author: Timo Furrer -Author-email: tuxtimo@gmail.com -License: MIT -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Natural Language :: English -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: Implementation -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Description-Content-Type: text/markdown - -# observable -[![Build Status](https://travis-ci.com/timofurrer/observable.svg?branch=master)](https://travis-ci.com/timofurrer/observable) -[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) - -**pyobservable** is a minimalist event system for python. It provides you an easy-to-use interface to trigger arbitrary functions when specific events occur. - -```python -from observable import Observable - -obs = Observable() - -@obs.on("error") -def error_handler(message): - # do some fancy error handling - logging.error(f"An error occured: {message}") - -... - -def do_time_travel(): - # do some time traveling - ... - if year != 1291: - obs.trigger("error", "Time travel to 1291 didn't work") -``` - -**Note:** We are Python 3 only! Only Python Versions >= 3.5 are supported. Use [v0.3.2](https://pypi.org/project/observable/0.3.2/) for older Python Versions. - -## How to use - -Use a `pip` to install it from PyPI: - - pip install observable - -After completion you can start using `observable`: - -```python -from observable import Observable - -obs = Observable() -``` - -## Usage - -### `on`: Register event handler with `on` -There are two ways to register a function to an event.
-The first way is to register the event with a decorator like this: - -```python -@obs.on("error") -def error_func(message): - print("Error: %s" % message) -``` - -The second way is to register it with a method call: - -```python -def error_func(message): - print("Error: %s" % message) -obs.on("error", error_func) -``` - -### `once`: Register event handler with `once` -`once` works like `on`, but once the event handler is triggered it will be removed and cannot be triggered again. - -### `trigger`: trigger event -You can trigger a registered event with the `trigger` method: - -```python -obs.trigger("error", "This is my error message") -``` - -If no handler for the event `error` could be found an `Observable.NoHandlerFound`-Exception will be raised. - -### `off`: remove handler and events -Remove a handler from a specified event: - -```python -obs.off("error", error_func) -``` - -```python -obs.off("error", [error_func, second_error_func]) -``` - -Remove all handlers from a specified event: - -```python -obs.off("error") -``` - -Clear all events: - -```python -obs.off() -``` - -### `get_all_handlers`, `get_handlers` and `is_registered`: Check which handlers are registered -Imagine you registered the following handlers: - -```python -@obs.on("success") -def success_func(): - print("Success!") - -@obs.on("error") -def error_func(message): - print("Error: %s" % message) -``` - -Then you can do the following to inspect the registered handlers: -```python ->>> obs.get_all_handlers() -{'success': [], 'error': []} ->>> obs.get_handlers("success") -[] ->>> obs.get_handlers("other_event") -[] -``` - -*** - -*

This project is published under [MIT](LICENSE).
A [Timo Furrer](https://tuxtimo.me) project.
- :tada: -

* - - diff --git a/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/RECORD b/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/RECORD deleted file mode 100644 index 7c4562e..0000000 --- a/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/RECORD +++ /dev/null @@ -1,17 +0,0 @@ -observable-1.0.3.dist-info/DESCRIPTION.rst,sha256=ovXHS1efvthrNOKpH0JSFkxwgpAbFo1-BiHaos3Z90g,3057 -observable-1.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -observable-1.0.3.dist-info/METADATA,sha256=fNl6JAlRoKVUcY7chrtftOqHH__hr7BiVBAHavcY5dE,3962 -observable-1.0.3.dist-info/RECORD,, -observable-1.0.3.dist-info/WHEEL,sha256=kdsN-5OJAZIiHN-iO4Rhl82KyS0bDWf4uBwMbkNafr8,110 -observable-1.0.3.dist-info/metadata.json,sha256=q8-F57T7Zhy3IGSEj795E7ni1dtlYDdRjA1uoQbO46Y,1005 -observable-1.0.3.dist-info/top_level.txt,sha256=47luK7ZGvZgqf2u4sBjIO-HhTwR2ND-BR_LXVn0FjZ4,17 -observable/__init__.py,sha256=3cKuWeS1ZLcjlx3nx43-3QKCBCyXn5kbaJ1KYwwwiqs,185 -observable/__pycache__/__init__.cpython-38.pyc,, -observable/__pycache__/__version__.cpython-38.pyc,, -observable/__pycache__/core.cpython-38.pyc,, -observable/__version__.py,sha256=xa7LsbURY2yRXjuH5GR6U7DQ4hQJdaKPezzeLznkBCM,87 -observable/core.py,sha256=A7pxabHTVM-_1T_V7mBal42xbuM0CMVblkDN1eknsIg,4286 -tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -tests/__pycache__/__init__.cpython-38.pyc,, -tests/__pycache__/test_core.cpython-38.pyc,, -tests/test_core.py,sha256=DwYXB4ALlXGzGhL9IwFN_hS32xAsgnD7t9HJNomdmmE,7218 diff --git a/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/WHEEL b/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/WHEEL deleted file mode 100644 index 7332a41..0000000 --- a/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.30.0) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/metadata.json b/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/metadata.json deleted file mode 100644 index a9a2aa8..0000000 --- a/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Software Development :: Libraries :: Python Modules"], "description_content_type": "text/markdown", "extensions": {"python.details": {"contacts": [{"email": "tuxtimo@gmail.com", "name": "Timo Furrer", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/timofurrer/observable"}}}, "generator": "bdist_wheel (0.30.0)", "license": "MIT", "metadata_version": "2.0", "name": "observable", "summary": "minimalist event system", "version": "1.0.3"} \ No newline at end of file diff --git a/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/top_level.txt b/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/top_level.txt deleted file mode 100644 index 3e5c64a..0000000 --- a/venv/lib/python3.8/site-packages/observable-1.0.3.dist-info/top_level.txt +++ /dev/null @@ -1,2 +0,0 @@ -observable -tests diff --git a/venv/lib/python3.8/site-packages/observable/__init__.py b/venv/lib/python3.8/site-packages/observable/__init__.py deleted file mode 100644 index ab404c7..0000000 --- a/venv/lib/python3.8/site-packages/observable/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - Event system for python -""" - -from .core import Observable, EventNotFound, HandlerNotFound - -__all__ = ["Observable", "EventNotFound", "HandlerNotFound"] diff --git a/venv/lib/python3.8/site-packages/observable/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/observable/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 6abff1bff61b18e8914db2a887fd7c98a6c70e59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321 zcmZ8byGjHx6wM^r-C=X!Ye+L%F6PwIf8fjHe!;CS|J!66P+VX!3N$rGS>aLEOwhxi+0-BI-b diff --git a/venv/lib/python3.8/site-packages/observable/__pycache__/__version__.cpython-38.pyc b/venv/lib/python3.8/site-packages/observable/__pycache__/__version__.cpython-38.pyc deleted file mode 100644 index c4e56431dc20d6290454b2c8881896f5b4cba9c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 248 zcmWIL<>g`k0uCqrxNso-7{oyaj6jY95Et_Ri4=w?h7`sq#uTPt22JKFOD+W<@W{_e zDOM=SNL46HEh^5;&r`@N%}q)zQb@}$0t@FS6{i-JB_`#hDikCpXD6noa#gV!>KW)6 z`)M-WVvmnc$xn`tzr`IN4>ce@ekDT@GtfRT@ykxXB)34nAhSR>Gq1QLF(*ei$I{R+ kIm6UkA7L~y6UiXGg34PQHo5sJr8%i~Aioqd0SOis00B!w8~^|S diff --git a/venv/lib/python3.8/site-packages/observable/__pycache__/core.cpython-38.pyc b/venv/lib/python3.8/site-packages/observable/__pycache__/core.cpython-38.pyc deleted file mode 100644 index 1869f865bc9d2008f2922c574bca135610d7a216..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5228 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 diff --git a/venv/lib/python3.8/site-packages/observable/__version__.py b/venv/lib/python3.8/site-packages/observable/__version__.py deleted file mode 100644 index 501afbd..0000000 --- a/venv/lib/python3.8/site-packages/observable/__version__.py +++ /dev/null @@ -1,5 +0,0 @@ -""" - Holds the version number for the observable package -""" - -__version__ = "1.0.3" diff --git a/venv/lib/python3.8/site-packages/observable/core.py b/venv/lib/python3.8/site-packages/observable/core.py deleted file mode 100644 index d6be5dc..0000000 --- a/venv/lib/python3.8/site-packages/observable/core.py +++ /dev/null @@ -1,134 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - Event system for python -""" - -import typing as T - -from collections import defaultdict - - -class HandlerNotFound(Exception): - """Raised if a handler wasn't found""" - - def __init__(self, event: str, handler: T.Callable) -> None: - super().__init__() - self.event = event - self.handler = handler - - def __str__(self) -> str: - return "Handler {} wasn't found for event {}".format(self.handler, self.event) - - -class EventNotFound(Exception): - """Raised if an event wasn't found""" - - def __init__(self, event: str) -> None: - super().__init__() - self.event = event - - def __str__(self) -> str: - return "Event {} wasn't found".format(self.event) - - -class Observable(object): - """Event system for python""" - - def __init__(self) -> None: - self._events = defaultdict(list) # type: T.DefaultDict[str, T.List[T.Callable]] - - def get_all_handlers(self) -> T.Dict[str, T.List[T.Callable]]: - """Returns a dict with event names as keys and lists of - registered handlers as values.""" - - events = {} - for event, handlers in self._events.items(): - events[event] = list(handlers) - return events - - def get_handlers(self, event: str) -> T.List[T.Callable]: - """Returns a list of handlers registered for the given event.""" - - return list(self._events.get(event, [])) - - def is_registered(self, event: str, handler: T.Callable) -> bool: - """Returns whether the given handler is registered for the - given event.""" - - return handler in self._events.get(event, []) - - def on( - self, event: str, *handlers: T.Callable - ) -> T.Callable: # pylint: disable=invalid-name - """Registers one or more handlers to a specified event. - This method may as well be used as a decorator for the handler.""" - - def _on_wrapper(*handlers: T.Callable) -> T.Callable: - """wrapper for on decorator""" - self._events[event].extend(handlers) - return handlers[0] - - if handlers: - return _on_wrapper(*handlers) - return _on_wrapper - - def off( - self, event: str = None, *handlers: T.Callable - ) -> None: # pylint: disable=keyword-arg-before-vararg - """Unregisters a whole event (if no handlers are given) or one - or more handlers from an event. - Raises EventNotFound when the given event isn't registered. - Raises HandlerNotFound when a given handler isn't registered.""" - - if not event: - self._events.clear() - return - - if event not in self._events: - raise EventNotFound(event) - - if not handlers: - self._events.pop(event) - return - - for callback in handlers: - if callback not in self._events[event]: - raise HandlerNotFound(event, callback) - while callback in self._events[event]: - self._events[event].remove(callback) - return - - def once(self, event: str, *handlers: T.Callable) -> T.Callable: - """Registers one or more handlers to a specified event, but - removes them when the event is first triggered. - This method may as well be used as a decorator for the handler.""" - - def _once_wrapper(*handlers: T.Callable) -> T.Callable: - """Wrapper for 'once' decorator""" - - def _wrapper(*args: T.Any, **kw: T.Any) -> None: - """Wrapper that unregisters itself before executing - the handlers""" - - self.off(event, _wrapper) - for handler in handlers: - handler(*args, **kw) - - return _wrapper - - if handlers: - return self.on(event, _once_wrapper(*handlers)) - return lambda x: self.on(event, _once_wrapper(x)) - - def trigger(self, event: str, *args: T.Any, **kw: T.Any) -> bool: - """Triggers all handlers which are subscribed to an event. - Returns True when there were callbacks to execute, False otherwise.""" - - callbacks = list(self._events.get(event, [])) - if not callbacks: - return False - - for callback in callbacks: - callback(*args, **kw) - return True diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/PKG-INFO b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/PKG-INFO deleted file mode 100644 index 0b410a2..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/PKG-INFO +++ /dev/null @@ -1,73 +0,0 @@ -Metadata-Version: 1.2 -Name: pip -Version: 19.0.3 -Summary: The PyPA recommended tool for installing Python packages. -Home-page: https://pip.pypa.io/ -Author: The pip developers -Author-email: pypa-dev@groups.google.com -License: MIT -Description: pip - The Python Package Installer - ================================== - - .. image:: https://img.shields.io/pypi/v/pip.svg - :target: https://pypi.org/project/pip/ - - .. image:: https://readthedocs.org/projects/pip/badge/?version=latest - :target: https://pip.pypa.io/en/latest - - 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: - - * `Installation`_ - * `Usage`_ - * `Release notes`_ - - If you find bugs, need help, or want to talk to the developers please use our mailing lists or chat rooms: - - * `Issue tracking`_ - * `Discourse channel`_ - * `User IRC`_ - - If you want to get involved head over to GitHub to get the source code and feel free to jump on the developer mailing lists and chat rooms: - - * `GitHub page`_ - * `Dev mailing list`_ - * `Dev IRC`_ - - Code of Conduct - --------------- - - Everyone interacting in the pip project's codebases, issue trackers, chat - rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. - - .. _package installer: https://packaging.python.org/en/latest/current/ - .. _Python Package Index: https://pypi.org - .. _Installation: https://pip.pypa.io/en/stable/installing.html - .. _Usage: https://pip.pypa.io/en/stable/ - .. _Release notes: https://pip.pypa.io/en/stable/news.html - .. _GitHub page: https://github.com/pypa/pip - .. _Issue tracking: https://github.com/pypa/pip/issues - .. _Discourse channel: https://discuss.python.org/c/packaging - .. _Dev mailing list: https://groups.google.com/forum/#!forum/pypa-dev - .. _User IRC: https://webchat.freenode.net/?channels=%23pypa - .. _Dev IRC: https://webchat.freenode.net/?channels=%23pypa-dev - .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ - -Keywords: distutils easy_install egg setuptools wheel virtualenv -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Topic :: Software Development :: Build Tools -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/SOURCES.txt b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/SOURCES.txt deleted file mode 100644 index eb4810d..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/SOURCES.txt +++ /dev/null @@ -1,391 +0,0 @@ -AUTHORS.txt -LICENSE.txt -MANIFEST.in -NEWS.rst -README.rst -pyproject.toml -setup.cfg -setup.py -docs/pip_sphinxext.py -docs/html/conf.py -docs/html/cookbook.rst -docs/html/index.rst -docs/html/installing.rst -docs/html/logic.rst -docs/html/news.rst -docs/html/quickstart.rst -docs/html/usage.rst -docs/html/user_guide.rst -docs/html/development/configuration.rst -docs/html/development/contributing.rst -docs/html/development/getting-started.rst -docs/html/development/index.rst -docs/html/development/release-process.rst -docs/html/development/vendoring-policy.rst -docs/html/reference/index.rst -docs/html/reference/pip.rst -docs/html/reference/pip_check.rst -docs/html/reference/pip_config.rst -docs/html/reference/pip_download.rst -docs/html/reference/pip_freeze.rst -docs/html/reference/pip_hash.rst -docs/html/reference/pip_install.rst -docs/html/reference/pip_list.rst -docs/html/reference/pip_search.rst -docs/html/reference/pip_show.rst -docs/html/reference/pip_uninstall.rst -docs/html/reference/pip_wheel.rst -docs/man/index.rst -docs/man/commands/check.rst -docs/man/commands/config.rst -docs/man/commands/download.rst -docs/man/commands/freeze.rst -docs/man/commands/hash.rst -docs/man/commands/help.rst -docs/man/commands/install.rst -docs/man/commands/list.rst -docs/man/commands/search.rst -docs/man/commands/show.rst -docs/man/commands/uninstall.rst -docs/man/commands/wheel.rst -src/pip/__init__.py -src/pip/__main__.py -src/pip.egg-info/PKG-INFO -src/pip.egg-info/SOURCES.txt -src/pip.egg-info/dependency_links.txt -src/pip.egg-info/entry_points.txt -src/pip.egg-info/not-zip-safe -src/pip.egg-info/top_level.txt -src/pip/_internal/__init__.py -src/pip/_internal/build_env.py -src/pip/_internal/cache.py -src/pip/_internal/configuration.py -src/pip/_internal/download.py -src/pip/_internal/exceptions.py -src/pip/_internal/index.py -src/pip/_internal/locations.py -src/pip/_internal/pep425tags.py -src/pip/_internal/pyproject.py -src/pip/_internal/resolve.py -src/pip/_internal/wheel.py -src/pip/_internal/cli/__init__.py -src/pip/_internal/cli/autocompletion.py -src/pip/_internal/cli/base_command.py -src/pip/_internal/cli/cmdoptions.py -src/pip/_internal/cli/main_parser.py -src/pip/_internal/cli/parser.py -src/pip/_internal/cli/status_codes.py -src/pip/_internal/commands/__init__.py -src/pip/_internal/commands/check.py -src/pip/_internal/commands/completion.py -src/pip/_internal/commands/configuration.py -src/pip/_internal/commands/download.py -src/pip/_internal/commands/freeze.py -src/pip/_internal/commands/hash.py -src/pip/_internal/commands/help.py -src/pip/_internal/commands/install.py -src/pip/_internal/commands/list.py -src/pip/_internal/commands/search.py -src/pip/_internal/commands/show.py -src/pip/_internal/commands/uninstall.py -src/pip/_internal/commands/wheel.py -src/pip/_internal/models/__init__.py -src/pip/_internal/models/candidate.py -src/pip/_internal/models/format_control.py -src/pip/_internal/models/index.py -src/pip/_internal/models/link.py -src/pip/_internal/operations/__init__.py -src/pip/_internal/operations/check.py -src/pip/_internal/operations/freeze.py -src/pip/_internal/operations/prepare.py -src/pip/_internal/req/__init__.py -src/pip/_internal/req/constructors.py -src/pip/_internal/req/req_file.py -src/pip/_internal/req/req_install.py -src/pip/_internal/req/req_set.py -src/pip/_internal/req/req_tracker.py -src/pip/_internal/req/req_uninstall.py -src/pip/_internal/utils/__init__.py -src/pip/_internal/utils/appdirs.py -src/pip/_internal/utils/compat.py -src/pip/_internal/utils/deprecation.py -src/pip/_internal/utils/encoding.py -src/pip/_internal/utils/filesystem.py -src/pip/_internal/utils/glibc.py -src/pip/_internal/utils/hashes.py -src/pip/_internal/utils/logging.py -src/pip/_internal/utils/misc.py -src/pip/_internal/utils/models.py -src/pip/_internal/utils/outdated.py -src/pip/_internal/utils/packaging.py -src/pip/_internal/utils/setuptools_build.py -src/pip/_internal/utils/temp_dir.py -src/pip/_internal/utils/typing.py -src/pip/_internal/utils/ui.py -src/pip/_internal/vcs/__init__.py -src/pip/_internal/vcs/bazaar.py -src/pip/_internal/vcs/git.py -src/pip/_internal/vcs/mercurial.py -src/pip/_internal/vcs/subversion.py -src/pip/_vendor/README.rst -src/pip/_vendor/__init__.py -src/pip/_vendor/appdirs.LICENSE.txt -src/pip/_vendor/appdirs.py -src/pip/_vendor/distro.LICENSE -src/pip/_vendor/distro.py -src/pip/_vendor/ipaddress.LICENSE -src/pip/_vendor/ipaddress.py -src/pip/_vendor/pyparsing.LICENSE -src/pip/_vendor/pyparsing.py -src/pip/_vendor/retrying.LICENSE -src/pip/_vendor/retrying.py -src/pip/_vendor/six.LICENSE -src/pip/_vendor/six.py -src/pip/_vendor/vendor.txt -src/pip/_vendor/cachecontrol/LICENSE.txt -src/pip/_vendor/cachecontrol/__init__.py -src/pip/_vendor/cachecontrol/_cmd.py -src/pip/_vendor/cachecontrol/adapter.py -src/pip/_vendor/cachecontrol/cache.py -src/pip/_vendor/cachecontrol/compat.py -src/pip/_vendor/cachecontrol/controller.py -src/pip/_vendor/cachecontrol/filewrapper.py -src/pip/_vendor/cachecontrol/heuristics.py -src/pip/_vendor/cachecontrol/serialize.py -src/pip/_vendor/cachecontrol/wrapper.py -src/pip/_vendor/cachecontrol/caches/__init__.py -src/pip/_vendor/cachecontrol/caches/file_cache.py -src/pip/_vendor/cachecontrol/caches/redis_cache.py -src/pip/_vendor/certifi/LICENSE -src/pip/_vendor/certifi/__init__.py -src/pip/_vendor/certifi/__main__.py -src/pip/_vendor/certifi/cacert.pem -src/pip/_vendor/certifi/core.py -src/pip/_vendor/chardet/LICENSE -src/pip/_vendor/chardet/__init__.py -src/pip/_vendor/chardet/big5freq.py -src/pip/_vendor/chardet/big5prober.py -src/pip/_vendor/chardet/chardistribution.py -src/pip/_vendor/chardet/charsetgroupprober.py -src/pip/_vendor/chardet/charsetprober.py -src/pip/_vendor/chardet/codingstatemachine.py -src/pip/_vendor/chardet/compat.py -src/pip/_vendor/chardet/cp949prober.py -src/pip/_vendor/chardet/enums.py -src/pip/_vendor/chardet/escprober.py -src/pip/_vendor/chardet/escsm.py -src/pip/_vendor/chardet/eucjpprober.py -src/pip/_vendor/chardet/euckrfreq.py -src/pip/_vendor/chardet/euckrprober.py -src/pip/_vendor/chardet/euctwfreq.py -src/pip/_vendor/chardet/euctwprober.py -src/pip/_vendor/chardet/gb2312freq.py -src/pip/_vendor/chardet/gb2312prober.py -src/pip/_vendor/chardet/hebrewprober.py -src/pip/_vendor/chardet/jisfreq.py -src/pip/_vendor/chardet/jpcntx.py -src/pip/_vendor/chardet/langbulgarianmodel.py -src/pip/_vendor/chardet/langcyrillicmodel.py -src/pip/_vendor/chardet/langgreekmodel.py -src/pip/_vendor/chardet/langhebrewmodel.py -src/pip/_vendor/chardet/langhungarianmodel.py -src/pip/_vendor/chardet/langthaimodel.py -src/pip/_vendor/chardet/langturkishmodel.py -src/pip/_vendor/chardet/latin1prober.py -src/pip/_vendor/chardet/mbcharsetprober.py -src/pip/_vendor/chardet/mbcsgroupprober.py -src/pip/_vendor/chardet/mbcssm.py -src/pip/_vendor/chardet/sbcharsetprober.py -src/pip/_vendor/chardet/sbcsgroupprober.py -src/pip/_vendor/chardet/sjisprober.py -src/pip/_vendor/chardet/universaldetector.py -src/pip/_vendor/chardet/utf8prober.py -src/pip/_vendor/chardet/version.py -src/pip/_vendor/chardet/cli/__init__.py -src/pip/_vendor/chardet/cli/chardetect.py -src/pip/_vendor/colorama/LICENSE.txt -src/pip/_vendor/colorama/__init__.py -src/pip/_vendor/colorama/ansi.py -src/pip/_vendor/colorama/ansitowin32.py -src/pip/_vendor/colorama/initialise.py -src/pip/_vendor/colorama/win32.py -src/pip/_vendor/colorama/winterm.py -src/pip/_vendor/distlib/LICENSE.txt -src/pip/_vendor/distlib/__init__.py -src/pip/_vendor/distlib/compat.py -src/pip/_vendor/distlib/database.py -src/pip/_vendor/distlib/index.py -src/pip/_vendor/distlib/locators.py -src/pip/_vendor/distlib/manifest.py -src/pip/_vendor/distlib/markers.py -src/pip/_vendor/distlib/metadata.py -src/pip/_vendor/distlib/resources.py -src/pip/_vendor/distlib/scripts.py -src/pip/_vendor/distlib/t32.exe -src/pip/_vendor/distlib/t64.exe -src/pip/_vendor/distlib/util.py -src/pip/_vendor/distlib/version.py -src/pip/_vendor/distlib/w32.exe -src/pip/_vendor/distlib/w64.exe -src/pip/_vendor/distlib/wheel.py -src/pip/_vendor/distlib/_backport/__init__.py -src/pip/_vendor/distlib/_backport/misc.py -src/pip/_vendor/distlib/_backport/shutil.py -src/pip/_vendor/distlib/_backport/sysconfig.cfg -src/pip/_vendor/distlib/_backport/sysconfig.py -src/pip/_vendor/distlib/_backport/tarfile.py -src/pip/_vendor/html5lib/LICENSE -src/pip/_vendor/html5lib/__init__.py -src/pip/_vendor/html5lib/_ihatexml.py -src/pip/_vendor/html5lib/_inputstream.py -src/pip/_vendor/html5lib/_tokenizer.py -src/pip/_vendor/html5lib/_utils.py -src/pip/_vendor/html5lib/constants.py -src/pip/_vendor/html5lib/html5parser.py -src/pip/_vendor/html5lib/serializer.py -src/pip/_vendor/html5lib/_trie/__init__.py -src/pip/_vendor/html5lib/_trie/_base.py -src/pip/_vendor/html5lib/_trie/datrie.py -src/pip/_vendor/html5lib/_trie/py.py -src/pip/_vendor/html5lib/filters/__init__.py -src/pip/_vendor/html5lib/filters/alphabeticalattributes.py -src/pip/_vendor/html5lib/filters/base.py -src/pip/_vendor/html5lib/filters/inject_meta_charset.py -src/pip/_vendor/html5lib/filters/lint.py -src/pip/_vendor/html5lib/filters/optionaltags.py -src/pip/_vendor/html5lib/filters/sanitizer.py -src/pip/_vendor/html5lib/filters/whitespace.py -src/pip/_vendor/html5lib/treeadapters/__init__.py -src/pip/_vendor/html5lib/treeadapters/genshi.py -src/pip/_vendor/html5lib/treeadapters/sax.py -src/pip/_vendor/html5lib/treebuilders/__init__.py -src/pip/_vendor/html5lib/treebuilders/base.py -src/pip/_vendor/html5lib/treebuilders/dom.py -src/pip/_vendor/html5lib/treebuilders/etree.py -src/pip/_vendor/html5lib/treebuilders/etree_lxml.py -src/pip/_vendor/html5lib/treewalkers/__init__.py -src/pip/_vendor/html5lib/treewalkers/base.py -src/pip/_vendor/html5lib/treewalkers/dom.py -src/pip/_vendor/html5lib/treewalkers/etree.py -src/pip/_vendor/html5lib/treewalkers/etree_lxml.py -src/pip/_vendor/html5lib/treewalkers/genshi.py -src/pip/_vendor/idna/LICENSE.rst -src/pip/_vendor/idna/__init__.py -src/pip/_vendor/idna/codec.py -src/pip/_vendor/idna/compat.py -src/pip/_vendor/idna/core.py -src/pip/_vendor/idna/idnadata.py -src/pip/_vendor/idna/intranges.py -src/pip/_vendor/idna/package_data.py -src/pip/_vendor/idna/uts46data.py -src/pip/_vendor/lockfile/LICENSE -src/pip/_vendor/lockfile/__init__.py -src/pip/_vendor/lockfile/linklockfile.py -src/pip/_vendor/lockfile/mkdirlockfile.py -src/pip/_vendor/lockfile/pidlockfile.py -src/pip/_vendor/lockfile/sqlitelockfile.py -src/pip/_vendor/lockfile/symlinklockfile.py -src/pip/_vendor/msgpack/COPYING -src/pip/_vendor/msgpack/__init__.py -src/pip/_vendor/msgpack/_version.py -src/pip/_vendor/msgpack/exceptions.py -src/pip/_vendor/msgpack/fallback.py -src/pip/_vendor/packaging/LICENSE -src/pip/_vendor/packaging/LICENSE.APACHE -src/pip/_vendor/packaging/LICENSE.BSD -src/pip/_vendor/packaging/__about__.py -src/pip/_vendor/packaging/__init__.py -src/pip/_vendor/packaging/_compat.py -src/pip/_vendor/packaging/_structures.py -src/pip/_vendor/packaging/markers.py -src/pip/_vendor/packaging/requirements.py -src/pip/_vendor/packaging/specifiers.py -src/pip/_vendor/packaging/utils.py -src/pip/_vendor/packaging/version.py -src/pip/_vendor/pep517/LICENSE -src/pip/_vendor/pep517/__init__.py -src/pip/_vendor/pep517/_in_process.py -src/pip/_vendor/pep517/build.py -src/pip/_vendor/pep517/check.py -src/pip/_vendor/pep517/colorlog.py -src/pip/_vendor/pep517/compat.py -src/pip/_vendor/pep517/envbuild.py -src/pip/_vendor/pep517/wrappers.py -src/pip/_vendor/pkg_resources/LICENSE -src/pip/_vendor/pkg_resources/__init__.py -src/pip/_vendor/pkg_resources/py31compat.py -src/pip/_vendor/progress/LICENSE -src/pip/_vendor/progress/__init__.py -src/pip/_vendor/progress/bar.py -src/pip/_vendor/progress/counter.py -src/pip/_vendor/progress/helpers.py -src/pip/_vendor/progress/spinner.py -src/pip/_vendor/pytoml/LICENSE -src/pip/_vendor/pytoml/__init__.py -src/pip/_vendor/pytoml/core.py -src/pip/_vendor/pytoml/parser.py -src/pip/_vendor/pytoml/test.py -src/pip/_vendor/pytoml/utils.py -src/pip/_vendor/pytoml/writer.py -src/pip/_vendor/requests/LICENSE -src/pip/_vendor/requests/__init__.py -src/pip/_vendor/requests/__version__.py -src/pip/_vendor/requests/_internal_utils.py -src/pip/_vendor/requests/adapters.py -src/pip/_vendor/requests/api.py -src/pip/_vendor/requests/auth.py -src/pip/_vendor/requests/certs.py -src/pip/_vendor/requests/compat.py -src/pip/_vendor/requests/cookies.py -src/pip/_vendor/requests/exceptions.py -src/pip/_vendor/requests/help.py -src/pip/_vendor/requests/hooks.py -src/pip/_vendor/requests/models.py -src/pip/_vendor/requests/packages.py -src/pip/_vendor/requests/sessions.py -src/pip/_vendor/requests/status_codes.py -src/pip/_vendor/requests/structures.py -src/pip/_vendor/requests/utils.py -src/pip/_vendor/urllib3/LICENSE.txt -src/pip/_vendor/urllib3/__init__.py -src/pip/_vendor/urllib3/_collections.py -src/pip/_vendor/urllib3/connection.py -src/pip/_vendor/urllib3/connectionpool.py -src/pip/_vendor/urllib3/exceptions.py -src/pip/_vendor/urllib3/fields.py -src/pip/_vendor/urllib3/filepost.py -src/pip/_vendor/urllib3/poolmanager.py -src/pip/_vendor/urllib3/request.py -src/pip/_vendor/urllib3/response.py -src/pip/_vendor/urllib3/contrib/__init__.py -src/pip/_vendor/urllib3/contrib/_appengine_environ.py -src/pip/_vendor/urllib3/contrib/appengine.py -src/pip/_vendor/urllib3/contrib/ntlmpool.py -src/pip/_vendor/urllib3/contrib/pyopenssl.py -src/pip/_vendor/urllib3/contrib/securetransport.py -src/pip/_vendor/urllib3/contrib/socks.py -src/pip/_vendor/urllib3/contrib/_securetransport/__init__.py -src/pip/_vendor/urllib3/contrib/_securetransport/bindings.py -src/pip/_vendor/urllib3/contrib/_securetransport/low_level.py -src/pip/_vendor/urllib3/packages/__init__.py -src/pip/_vendor/urllib3/packages/six.py -src/pip/_vendor/urllib3/packages/backports/__init__.py -src/pip/_vendor/urllib3/packages/backports/makefile.py -src/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py -src/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py -src/pip/_vendor/urllib3/util/__init__.py -src/pip/_vendor/urllib3/util/connection.py -src/pip/_vendor/urllib3/util/queue.py -src/pip/_vendor/urllib3/util/request.py -src/pip/_vendor/urllib3/util/response.py -src/pip/_vendor/urllib3/util/retry.py -src/pip/_vendor/urllib3/util/ssl_.py -src/pip/_vendor/urllib3/util/timeout.py -src/pip/_vendor/urllib3/util/url.py -src/pip/_vendor/urllib3/util/wait.py -src/pip/_vendor/webencodings/LICENSE -src/pip/_vendor/webencodings/__init__.py -src/pip/_vendor/webencodings/labels.py -src/pip/_vendor/webencodings/mklabels.py -src/pip/_vendor/webencodings/tests.py -src/pip/_vendor/webencodings/x_user_defined.py \ No newline at end of file diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/dependency_links.txt b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/entry_points.txt b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/entry_points.txt deleted file mode 100644 index 6d3bbc1..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/entry_points.txt +++ /dev/null @@ -1,5 +0,0 @@ -[console_scripts] -pip = pip._internal:main -pip3 = pip._internal:main -pip3.8 = pip._internal:main - diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/not-zip-safe b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/not-zip-safe deleted file mode 100644 index 8b13789..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/not-zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/top_level.txt b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/top_level.txt deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/__init__.py deleted file mode 100644 index f48c1ca..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "19.0.3" diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/__main__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/__main__.py deleted file mode 100644 index 0c223f8..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/__main__.py +++ /dev/null @@ -1,19 +0,0 @@ -from __future__ import absolute_import - -import os -import sys - -# If we are running from a wheel, add the wheel to sys.path -# This allows the usage python pip-*.whl/pip install pip-*.whl -if __package__ == '': - # __file__ is pip-*.whl/pip/__main__.py - # first dirname call strips of '/__main__.py', second strips off '/pip' - # Resulting path is the name of the wheel itself - # Add that to sys.path so we can import pip - path = os.path.dirname(os.path.dirname(__file__)) - sys.path.insert(0, path) - -from pip._internal import main as _main # isort:skip # noqa - -if __name__ == '__main__': - sys.exit(_main()) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 7a51e1b88137c5ee19c13669e21e152a6774aa60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 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 L%`I1cZk+sY(|d?% diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/cache.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/cache.cpython-38.pyc deleted file mode 100644 index c93357815dc9e34844dd6e05d7fa4840097a8b3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7147 zcmb7JOKcm*8QvF{4^uMr@I#K1Y?Gi4QJYHR6itmLjUzweCYA%+ffJ(1cEuf$l$N{n z?9#FbDkx&NIko5Z5=ccaKJ-xZ)=O_iPd)Td6btm!ldnAnDBSP=XDL1`B`JlSotd4- zKmX(V|9|ws%uGqc@2^j)pIFan+P|qW{n6Xg zx`nqHbG&}MbE1BtbFzMt#~ulmI;ZNVFwWe4Mx5T$>(5@* z{IWmuQ1fTRa}Uh=^JvfdN6|hio=4k3yW-EGJtrKrzlHX^zkv1ve}BO@ZfVuU{@jY! zXbI=K7kW+65n)n#3|45XRXv?+cwrQ_8(z@v3peyS0-Z;?Uea=t$nD7hP3ygOxQTa3 z-0ym!-;0GrYv#7-bT74~Xe5!`M#ud1kKX^tU3us7%De8(4^~&NtzNAf>EgBU9v1iS zw1fz*v;#qVq&aR@t+a5Xo3x|Q3sUozNNB4#NzIEPEjV)}k{vHuiNZuiL4!yh|Cw1M zejgQ~L7p1PvTlB^twX}T`LF<4T7K@KR?qpipU2zw3w{yrykGK<;9XGstrrzv>!r^% zORFCN*D7g_x#oSQYud%o@z&x*dX2 zpeLr?*CE$oHKFMlMR7}6g)i&gKa0<&w<|b zL|kR^8)U`9Uk(+LK0Wb!C=xBv2igN;*Vxl^ZJ^6ji8;_8=%L|j1I@Jt2Fl#PL}`1`UGb&DGRabfvZ;wpvVcajz?+Jc`ZIg6p=!cH+8{ z2uX`9E|O$AJ1L{|=oIVHTrY&Sr?VGh7!fJ{Whof_1rw_2e-sj-#m0x@-3W6ny|Cwdm_BI9JJS#yW2@C z3eVSGUyj>}IM?+Wo4|s2x!dlZ`|b~Fuhh<;>u%$7O*EU-xr`$wLc%bYl{R*_4aj~r-t?^CiGPM-pl@hReaFBX5WHEGub~FR z<(jc;`o^wB->A1~?CEN{qV+qDPgZhlYO({~Gd8U#szZT;L>(oloBXEm67 zR)ff?*0gqVgB%2$?_a(u5(j3ew3jN-J}+@Py*PnkI8j_92&`>H?NIp6Ry%2p>~-Iq zR=?EW_)>rIF`f1?>E~lQCzNFoxarcQsF%3w(rXgtrp1;Qw-{nmi>j&Zb-N<;Q;W7q z^VA1XLHSzVtFOM6+9GU3zQ8UpYS)6}L#grDZP zU!KNjRXj`cj=4<%03lgnA|Ree)$l2vMWGc6`l5bPFWK|Cvqt}!OsEIVX$--ar=cJh z%o6?r6_}P**1GcpgG;@v?U(~oo^HatV5r6eoy`xjCi8<-v<+()vf0z)w`j~jgNz~f z9lKvn^1FqBy{F$nzojL`&651JuI=P?t^d*>zfnp`8%OYzTgIj>f6;`h-O)bMep|Su zeTLfi;P7|ypXNVAUub-Y)-COkzFM78rbd!udrKGSlvCEqMwph_5MtmgS?(N-W8T5k zU6Mm;L~)uA;I{|?@;7d=NvAoWMHr>_<<%RPS8u0zyl-E+cC%Vw5z4dJIW1>q$VyS4 zfh%^yC=*aRyYHEm&g3(^O)YX2sfqQc<$E-fZ|Jw-enk8ZHi=(Gp_v8UdSV#Xe~p}_ zTQFH$H=bB#8TFEG=w-bEV=n9cV-qqTt}|iJ#51@=C2bOWqCL<6ojNSb=)ZYWBs~dt z=?op>wgW%Jo0vC|IOPZA49E@BlJx3C%|*E-#RBNgE@J0BS%woRQ{o(Byc zo|sX`>Yq?&cuG(cI!pR{_$fSfiWtWr`sf7SIQ33@9j9=_eMmh%>qPLKa;qJ~i}UH( z74E}C7x4l>Wa^;uEl^N3$BuOY9aCpZO`M{Mes#87zqo(4iPMlDA^=*Up#;&eAmA+H zB~TQ0W&%Co^b#w{4Xg)njkh%U3I+mFh=1}m6sbjuEzeM!R+Ge}YHma#xw=dz&&syde9McU?bfz|E86lgm{6 zhze#Hv07fCf~+i^$sBV-1OaA@NIFGB2z@zrAoz|eC}5AJa;b2tuvD-M`9hw*Ht=EM zM*^TDFN|M-(yHP85vcJE zFl&rgWXPjv{%z6lkP%Vz3ISd!P;u7T62rW~8AHf@r~uA1IGey~ z9Z2IWN6Bb}4#NJp7i4kD2wOo{=mb%;Nx^)tyT6iJrqxa$%l*zfh-@gphL{n3f@Dl0 zAjY=XBikC#hQ_wj^6r7y0EcU@1;V)}WDEzmzgF1mtfA|y6VqhGPB@w$g=df;Awlsv zNHY=@(<@RqhRSx##!E3;4apBephTbOhpST8+Col>woYTA^F`@N@nc_p`i@)JLU!>{>t=&nErggQ(;RoQe^520liaIx=n9$j!4tB=V`Ahcq5CW2%EMOsAC z){P{@AiquRxvY)c#uxWp=qMw2YND3K)*P5ga>Z$B-+jetiMg!;u^iW@nMo}84W9TU z3eB*L3ddEmdPy%BhQ4S}+|^$^h`}KI8s^9!Q}Hepl+!A&Gx9apsqY}aLh#zh6VsXD zSIn|qIL4scK*z+-%vu~2ew{yIKVpNwc6#)37l3q!{KX34Q~&BkXZj=x1sb?eK;((& z=nM>XD|8U+K?I)M&J=kcy4b*;iY!SLiAwf(318Ly5~;n5XG2%%ePSj^-jVE6-k@(# zreG+?gVeo0Cy3N@ETeO5*tkiu0FQn(FG*jKLlaG$uiJ`T<)%KwN5%9@s8zFwle6&y z+|(b4NRA1s4F#*DGn{$hAlj}@cNhB+4)(9(Ge;NlD%D1^ zXX~Y~<4?2zhrLGs#Prs~U?+dLcF`L0P{ksK{GN6owy|OrCG{PyR&U|!*QwQEH*u_P zMW|ajEsbf~KkrDd8#_~nW7vL51KE>#4k0x>7Hg_Wr6+qF$#uIRXQB1*b%yzE13mf zja*~^f5yWA4dk-Rg@T2@yreJH7nOtkKCMQQ!1YbkYyve@8vG3IKWi>RJ3o@R2c(-) ze5>`6b`VQqOnRJ03~xwlJ{(;Tc|Ir1>C)s!B$vptYJ?J;Ri~#Wzw@%SM%00(sSD-P z2MrkdEak%vTqD`;(i!qZ;lkt^TjaVqD3TN&rFJ%!@+^6T3bIl;L*J&Ra;zk0=}Qr2 z@g6vZt0xLrQk&Q&WNNGbLvRkOvOV^t3_~Nc<{G)KwD3cfalc7UF{aSW!UYxo8D*o4 WizxM1LC|zkFB>JZ;#JO9=KlwAXysi1 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/configuration.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/configuration.cpython-38.pyc deleted file mode 100644 index a3f827d8e9b5084de9acddfdb4007ee907585f9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9949 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 F{}250Ajtp# diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/download.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/download.cpython-38.pyc deleted file mode 100644 index d932db24b9e701789d1a7550ba5a9d6688ebc054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21392 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/exceptions.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/exceptions.cpython-38.pyc deleted file mode 100644 index 15b67944aaa895f7fd18939edc5a75928ff2dd93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11530 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/index.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/index.cpython-38.pyc deleted file mode 100644 index 17c43f773894cc008dceafc4c4e451d234f2a2cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25518 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/locations.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/locations.cpython-38.pyc deleted file mode 100644 index 5feff302b3decec744d9c3ac45d13c83e12e8e83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4487 zcmahMO>^7E6<-8Eh@z-ZOSTguu@jq#MJ90)=fg>=T2ku9mQzU{$2*gv5O*bk0s&+J zS|ST|I#oK;=}g*mI@4o^>aCaFd+E7{{(?QWCtvyl(wVsLEhw3GGgD%)*nRun+xOnS zFWws;cNF;j{c-)r?m0#I7cNGBHY~meZ~8|~QK&)`s!}afI~vhcoa>=Zbon)g-x4Xw zwMk6*wTLCZHnHJrgyoJ+97$UW$2t{Kk#jQ~?^H=u&aH5wQzNy`B$U0)nudveK)njFF6*$f9X+Zr$<_s2(74k~I z!puPfW=-IJ9=N|Ix$_}+v;8`04mnTKGe;_UgVlik-y;&wgT&W{>n6q3n{xFQyLPO8 zt)~AN!CiO?7gul6v*hg|#v5QWja(nDuCupc^-k3OKlJBD=+FNzJy^9wb^6>dwFQMf z587+|Gihm^UXU=ifYBGoHTojG_$A)nyLfxc3h4XZlhdU`^$n$drGNc)-14&^j#77jmvQFqGdGOmJ$F0iZYz$qgPruM8$@a5hoPHh-R6vo(N~(_UJT!eVUW<_}ixtazWSJlKGxxf{V&h8z>Wwde0hrfIj;VrjbF4a44vVc-ynHsscdDXvGnK9}Zcgu=R%1e-6Z3ERYwG*&>*UwX&G^8rebCQqkbUpAO$L zyf@)Z-+&=g+Uh{dl}ta@4%N)aRjM9ozpWi=xi%)wKZRyU6Fye$oqO^}^irJ@;?yPKVEPcFE*G2jCAYr3*kU1$A zGI`s{pB26UI)B5PyK#p#`7W3@ig|N243cEMxs4ybxZ}g#Ll!-3hQU@d>1Dfdbgl7D zGlioUhu4`l(dMte+jy;UZ87P=c7yHgAh78LQN}p-eBYjWjFC&~9a95@N z9cl4(mUVgLZt^a8;x>fpWe8Z_jiMmhL01gG?R@uPz_YF&g6db@RX`8TCE$x+VxXE%ec@XkcC;G32TRC2$jYk8P0+(Vty!v z*NrIS-V+fPVK4QZwRxhP)T z3F9q4TztxFFdjEo*Xm_n16lbb48j7Rjlks~!EL2QG$4(zJr7;j^Y|3vqUyp7QW^9b zsUVKmiKz$Vq#DIuah{}k*2XhWtm>U&z7Grw`&x5qRh>fnUdBW8l(+gHY(k3LjzhQ; znRk5f7k0o}-3&bj1Ad#w9k=C2Xo@h7b^vh;N#GtE!b-ZFLHH0O=_S2y)SnS+qs4vf7eC4Kw^z;XO^f5u{}3t+Y_-sE4Mi z1j?b68{CB&ZtSRmdT2)mz-(H|6#Bf?KZV<8+3Wk;gGeCFw0lgtPruM-!p%Qn)#A z<}f{}#BSQ!WgRB5pf{8~N@W?ac(4VCaYV*a>B64Rchdg&;vxh&b{>nZ?HyqhAv|n% zHlZ6aTaYR3_y2k5pGK5d)XRsC)xOdovAiRWN zvnWQ7bcwUeeAq}INm&<2^;Dw<&NxXA0n+I}KJ((O zwx}+pAStT4!gGW z0Bt1bNTq~BwTrtX6YL=4K1cwxcxyv8I29@tY9RDI)+6JXb}=&+M`Djqgu1LywNt}- z1>4`le!2;RVpcRmGgKH=TXi%W9;o5QJk)VRHDScZhG(W+Rp&GtV1}x}Q&YA7*tP@f z>SI_xHZ&8U&bM}n-v++*((2k8)QOLT<#{x2d7f~f9CV?GV?n?qCoM>?26*g+m3 z569HUEf~aiVr9Jq$_U3lyuutVFgtRr_k0Y83J&8ih$_0D*YY7evDk^~y$$FLZ!STj z?=9b2=W~cTjRUq$g?nKkD^j*Bp3-+6sB6PsMVR3Gt$ix2yBmeC8|)y+q_YVd;{uIJ z#$}N`Y5Bx#5q|i8C4@{7K~sa?S_Qmu_!n=8bYSXkIisBd1b=c$OkoSZbnmtn2>TjAtMtJ+aJY{&N@;RW#q`9v2Q?c(hb>%n4QvJ z!GK|cp>Xm*XlNA(1Pq?@hNBynq1%pKwI@tmZ_U!vYs0((O^vD9a%V<|+NCIu{|hY-^f>?k diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/pep425tags.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/pep425tags.cpython-38.pyc deleted file mode 100644 index b4daf120d4ccaf4e579f8552b077564eb294d74b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8212 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/resolve.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__pycache__/resolve.cpython-38.pyc deleted file mode 100644 index c5ea3695638f0569a16b6062aaf2bfca03bfc7e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9125 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/build_env.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/build_env.py deleted file mode 100644 index d744cc7..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/build_env.py +++ /dev/null @@ -1,215 +0,0 @@ -"""Build Environment used for isolation during sdist building -""" - -import logging -import os -import sys -import textwrap -from collections import OrderedDict -from distutils.sysconfig import get_python_lib -from sysconfig import get_paths - -from pip._vendor.pkg_resources import Requirement, VersionConflict, WorkingSet - -from pip import __file__ as pip_location -from pip._internal.utils.misc import call_subprocess -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.utils.ui import open_spinner - -if MYPY_CHECK_RUNNING: - from typing import Tuple, Set, Iterable, Optional, List # noqa: F401 - from pip._internal.index import PackageFinder # noqa: F401 - -logger = logging.getLogger(__name__) - - -class _Prefix: - - def __init__(self, path): - # type: (str) -> None - self.path = path - self.setup = False - self.bin_dir = get_paths( - 'nt' if os.name == 'nt' else 'posix_prefix', - vars={'base': path, 'platbase': path} - )['scripts'] - # Note: prefer distutils' sysconfig to get the - # library paths so PyPy is correctly supported. - purelib = get_python_lib(plat_specific=False, prefix=path) - platlib = get_python_lib(plat_specific=True, prefix=path) - if purelib == platlib: - self.lib_dirs = [purelib] - else: - self.lib_dirs = [purelib, platlib] - - -class BuildEnvironment(object): - """Creates and manages an isolated environment to install build deps - """ - - def __init__(self): - # type: () -> None - self._temp_dir = TempDirectory(kind="build-env") - self._temp_dir.create() - - self._prefixes = OrderedDict(( - (name, _Prefix(os.path.join(self._temp_dir.path, name))) - for name in ('normal', 'overlay') - )) - - self._bin_dirs = [] # type: List[str] - self._lib_dirs = [] # type: List[str] - for prefix in reversed(list(self._prefixes.values())): - self._bin_dirs.append(prefix.bin_dir) - self._lib_dirs.extend(prefix.lib_dirs) - - # Customize site to: - # - ensure .pth files are honored - # - prevent access to system site packages - system_sites = { - os.path.normcase(site) for site in ( - get_python_lib(plat_specific=False), - get_python_lib(plat_specific=True), - ) - } - self._site_dir = os.path.join(self._temp_dir.path, 'site') - if not os.path.exists(self._site_dir): - os.mkdir(self._site_dir) - with open(os.path.join(self._site_dir, 'sitecustomize.py'), 'w') as fp: - fp.write(textwrap.dedent( - ''' - import os, site, sys - - # First, drop system-sites related paths. - original_sys_path = sys.path[:] - known_paths = set() - for path in {system_sites!r}: - site.addsitedir(path, known_paths=known_paths) - system_paths = set( - os.path.normcase(path) - for path in sys.path[len(original_sys_path):] - ) - original_sys_path = [ - path for path in original_sys_path - if os.path.normcase(path) not in system_paths - ] - sys.path = original_sys_path - - # Second, add lib directories. - # ensuring .pth file are processed. - for path in {lib_dirs!r}: - assert not path in sys.path - site.addsitedir(path) - ''' - ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)) - - def __enter__(self): - self._save_env = { - name: os.environ.get(name, None) - for name in ('PATH', 'PYTHONNOUSERSITE', 'PYTHONPATH') - } - - path = self._bin_dirs[:] - old_path = self._save_env['PATH'] - if old_path: - path.extend(old_path.split(os.pathsep)) - - pythonpath = [self._site_dir] - - os.environ.update({ - 'PATH': os.pathsep.join(path), - 'PYTHONNOUSERSITE': '1', - 'PYTHONPATH': os.pathsep.join(pythonpath), - }) - - def __exit__(self, exc_type, exc_val, exc_tb): - for varname, old_value in self._save_env.items(): - if old_value is None: - os.environ.pop(varname, None) - else: - os.environ[varname] = old_value - - def cleanup(self): - # type: () -> None - self._temp_dir.cleanup() - - def check_requirements(self, reqs): - # type: (Iterable[str]) -> Tuple[Set[Tuple[str, str]], Set[str]] - """Return 2 sets: - - conflicting requirements: set of (installed, wanted) reqs tuples - - missing requirements: set of reqs - """ - missing = set() - conflicting = set() - if reqs: - ws = WorkingSet(self._lib_dirs) - for req in reqs: - try: - if ws.find(Requirement.parse(req)) is None: - missing.add(req) - except VersionConflict as e: - conflicting.add((str(e.args[0].as_requirement()), - str(e.args[1]))) - return conflicting, missing - - def install_requirements( - self, - finder, # type: PackageFinder - requirements, # type: Iterable[str] - prefix_as_string, # type: str - message # type: Optional[str] - ): - # type: (...) -> None - prefix = self._prefixes[prefix_as_string] - assert not prefix.setup - prefix.setup = True - if not requirements: - return - args = [ - sys.executable, os.path.dirname(pip_location), 'install', - '--ignore-installed', '--no-user', '--prefix', prefix.path, - '--no-warn-script-location', - ] # type: List[str] - if logger.getEffectiveLevel() <= logging.DEBUG: - args.append('-v') - for format_control in ('no_binary', 'only_binary'): - formats = getattr(finder.format_control, format_control) - args.extend(('--' + format_control.replace('_', '-'), - ','.join(sorted(formats or {':none:'})))) - if finder.index_urls: - args.extend(['-i', finder.index_urls[0]]) - for extra_index in finder.index_urls[1:]: - args.extend(['--extra-index-url', extra_index]) - else: - args.append('--no-index') - for link in finder.find_links: - args.extend(['--find-links', link]) - for _, host, _ in finder.secure_origins: - args.extend(['--trusted-host', host]) - if finder.allow_all_prereleases: - args.append('--pre') - args.append('--') - args.extend(requirements) - with open_spinner(message) as spinner: - call_subprocess(args, show_stdout=False, spinner=spinner) - - -class NoOpBuildEnvironment(BuildEnvironment): - """A no-op drop-in replacement for BuildEnvironment - """ - - def __init__(self): - pass - - def __enter__(self): - pass - - def __exit__(self, exc_type, exc_val, exc_tb): - pass - - def cleanup(self): - pass - - def install_requirements(self, finder, requirements, prefix, message): - raise NotImplementedError() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cache.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cache.py deleted file mode 100644 index eb295c4..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cache.py +++ /dev/null @@ -1,224 +0,0 @@ -"""Cache Management -""" - -import errno -import hashlib -import logging -import os - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.download import path_to_url -from pip._internal.models.link import Link -from pip._internal.utils.compat import expanduser -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.wheel import InvalidWheelFilename, Wheel - -if MYPY_CHECK_RUNNING: - from typing import Optional, Set, List, Any # noqa: F401 - from pip._internal.index import FormatControl # noqa: F401 - -logger = logging.getLogger(__name__) - - -class Cache(object): - """An abstract class - provides cache directories for data from links - - - :param cache_dir: The root of the cache. - :param format_control: An object of FormatControl class to limit - binaries being read from the cache. - :param allowed_formats: which formats of files the cache should store. - ('binary' and 'source' are the only allowed values) - """ - - def __init__(self, cache_dir, format_control, allowed_formats): - # type: (str, FormatControl, Set[str]) -> None - super(Cache, self).__init__() - self.cache_dir = expanduser(cache_dir) if cache_dir else None - self.format_control = format_control - self.allowed_formats = allowed_formats - - _valid_formats = {"source", "binary"} - assert self.allowed_formats.union(_valid_formats) == _valid_formats - - def _get_cache_path_parts(self, link): - # type: (Link) -> List[str] - """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 - # and we don't care about those. - key_parts = [link.url_without_fragment] - if link.hash_name is not None and link.hash is not None: - key_parts.append("=".join([link.hash_name, link.hash])) - key_url = "#".join(key_parts) - - # Encode our key url with sha224, we'll use this because it has similar - # security properties to sha256, but with a shorter total output (and - # thus less secure). However the differences don't make a lot of - # difference for our use case here. - hashed = hashlib.sha224(key_url.encode()).hexdigest() - - # We want to nest the directories some to prevent having a ton of top - # level directories where we might run out of sub directories on some - # FS. - parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] - - return parts - - def _get_candidates(self, link, package_name): - # type: (Link, Optional[str]) -> List[Any] - can_not_cache = ( - not self.cache_dir or - not package_name or - not link - ) - if can_not_cache: - return [] - - canonical_name = canonicalize_name(package_name) - formats = self.format_control.get_allowed_formats( - canonical_name - ) - if not self.allowed_formats.intersection(formats): - return [] - - root = self.get_path_for_link(link) - try: - return os.listdir(root) - except OSError as err: - if err.errno in {errno.ENOENT, errno.ENOTDIR}: - return [] - raise - - def get_path_for_link(self, link): - # type: (Link) -> str - """Return a directory to store cached items in for link. - """ - raise NotImplementedError() - - def get(self, link, package_name): - # type: (Link, Optional[str]) -> Link - """Returns a link to a cached item if it exists, otherwise returns the - passed link. - """ - raise NotImplementedError() - - def _link_for_candidate(self, link, candidate): - # type: (Link, str) -> Link - root = self.get_path_for_link(link) - path = os.path.join(root, candidate) - - return Link(path_to_url(path)) - - def cleanup(self): - # type: () -> None - pass - - -class SimpleWheelCache(Cache): - """A cache of wheels for future installs. - """ - - def __init__(self, cache_dir, format_control): - # type: (str, FormatControl) -> None - super(SimpleWheelCache, self).__init__( - cache_dir, format_control, {"binary"} - ) - - def get_path_for_link(self, link): - # type: (Link) -> str - """Return a directory to store cached wheels for link - - Because there are M wheels for any one sdist, we provide a directory - to cache them in, and then consult that directory when looking up - cache hits. - - We only insert things into the cache if they have plausible version - numbers, so that we don't contaminate the cache with things that were - not unique. E.g. ./package might have dozens of installs done for it - and build a version of 0.0...and if we built and cached a wheel, we'd - end up using the same wheel even if the source has been edited. - - :param link: The link of the sdist for which this will cache wheels. - """ - parts = self._get_cache_path_parts(link) - - # Store wheels within the root cache_dir - return os.path.join(self.cache_dir, "wheels", *parts) - - def get(self, link, package_name): - # type: (Link, Optional[str]) -> Link - candidates = [] - - for wheel_name in self._get_candidates(link, package_name): - try: - wheel = Wheel(wheel_name) - except InvalidWheelFilename: - continue - if not wheel.supported(): - # Built for a different python/arch/etc - continue - candidates.append((wheel.support_index_min(), wheel_name)) - - if not candidates: - return link - - return self._link_for_candidate(link, min(candidates)[1]) - - -class EphemWheelCache(SimpleWheelCache): - """A SimpleWheelCache that creates it's own temporary cache directory - """ - - def __init__(self, format_control): - # type: (FormatControl) -> None - self._temp_dir = TempDirectory(kind="ephem-wheel-cache") - self._temp_dir.create() - - super(EphemWheelCache, self).__init__( - self._temp_dir.path, format_control - ) - - def cleanup(self): - # type: () -> None - self._temp_dir.cleanup() - - -class WheelCache(Cache): - """Wraps EphemWheelCache and SimpleWheelCache into a single Cache - - This Cache allows for gracefully degradation, using the ephem wheel cache - when a certain link is not found in the simple wheel cache first. - """ - - def __init__(self, cache_dir, format_control): - # type: (str, FormatControl) -> None - super(WheelCache, self).__init__( - cache_dir, format_control, {'binary'} - ) - self._wheel_cache = SimpleWheelCache(cache_dir, format_control) - self._ephem_cache = EphemWheelCache(format_control) - - def get_path_for_link(self, link): - # type: (Link) -> str - return self._wheel_cache.get_path_for_link(link) - - def get_ephem_path_for_link(self, link): - # type: (Link) -> str - return self._ephem_cache.get_path_for_link(link) - - def get(self, link, package_name): - # type: (Link, Optional[str]) -> Link - retval = self._wheel_cache.get(link, package_name) - if retval is link: - retval = self._ephem_cache.get(link, package_name) - return retval - - def cleanup(self): - # type: () -> None - self._wheel_cache.cleanup() - self._ephem_cache.cleanup() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__init__.py deleted file mode 100644 index e589bb9..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Subpackage containing all of pip's command line interface related code -""" - -# This file intentionally does not import submodules diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 334dbf5368f6fb1db1b095c072ad4488affc8276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291 zcmYjMF;2uV5Ol8LbkhC79ZC@|=o*j^qJoZs6AcBH&)zr|j%_*4NulO5{De1L%M<8m zU~{5irJd2t6g&I4UauI<$4~wIM*KO8|5K5;p&gb4hCMM;ZCSl|z1xnvr1Xoj$aM@w zx!{83%6lGLo?JQ|$nSd<4EHV|ccEZzl}4V?tAd7NgRA?xI-E#pqL%WV=AN@1w+hm>s?9@(9V<_t0>!J*n@XFNK@%z*oX@lT*2nA*8o(bIlmNVV$-CFVu9Aq gCdgx(pgd^rK$3JtN|C0+@~V$!^msi#{zc1v0n|iRwg3PC diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__pycache__/autocompletion.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__pycache__/autocompletion.cpython-38.pyc deleted file mode 100644 index ccee623724a5d06b11645a310a6bdcbbef5651a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5149 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 RCdN=Fa!OGh_>pw!{{YD#qc;Em diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__pycache__/cmdoptions.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__pycache__/cmdoptions.cpython-38.pyc deleted file mode 100644 index 066999740b8a6a4dd25e7b2792dfb5c7e92e6ba1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17030 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 L>Q?V>r(XVFN@83d diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__pycache__/main_parser.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__pycache__/main_parser.cpython-38.pyc deleted file mode 100644 index 2d9c57fa7c5b53a16a833ad421f85dc53042d49a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2405 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 J`lW^4{{cG2DQo}$ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__pycache__/status_codes.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__pycache__/status_codes.cpython-38.pyc deleted file mode 100644 index 332fd110e534c993f3628814ebdd1a83e69b0c50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420 zcmYk2-AcnS6vx}H`(SM7g`kgMFWM-(Q4n!%9TsOR?K&YBhHlBaVn0Hg4*D*>fN$b6 z^wz7sf;XB>1y9KD`Oe}zqIF9o5x2Si*8FB{Gy{eufHG zU<vb*u`B>(s~VdOPX9C1gj#8OGZ$X&@5+-%(zaP zHYF=_f>16jb=UJJ6VvnRw&}W#TMvEv-gcgBw3qN`X}Jr3JU8tnvYiE*IleuGCy%bV zv>e|qN(Nn`VVafJ&YHVJJb8|zDfCj-?PVO1-4m2K)xl6q*)GTaYU&LHX`ME z81UYXq&pBtD?lr@&C-!^0g8wbod)ZdAS4B#5!KHxjWc7U(~7qZ5{9A(P?R!~r$G$X jaRdq$u(Ckw43om3Ro%NvGF-;wTKrBSo-|NY`EPv#Rqt^4 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/autocompletion.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/autocompletion.py deleted file mode 100644 index 0a04199..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/autocompletion.py +++ /dev/null @@ -1,152 +0,0 @@ -"""Logic that powers autocompletion installed by ``pip completion``. -""" - -import optparse -import os -import sys - -from pip._internal.cli.main_parser import create_main_parser -from pip._internal.commands import commands_dict, get_summaries -from pip._internal.utils.misc import get_installed_distributions - - -def autocomplete(): - """Entry Point for completion of main and subcommand options. - """ - # Don't complete if user hasn't sourced bash_completion file. - if 'PIP_AUTO_COMPLETE' not in os.environ: - return - cwords = os.environ['COMP_WORDS'].split()[1:] - cword = int(os.environ['COMP_CWORD']) - try: - current = cwords[cword - 1] - except IndexError: - current = '' - - subcommands = [cmd for cmd, summary in get_summaries()] - options = [] - # subcommand - try: - subcommand_name = [w for w in cwords if w in subcommands][0] - except IndexError: - subcommand_name = None - - parser = create_main_parser() - # subcommand options - if subcommand_name: - # special case: 'help' subcommand has no options - if subcommand_name == 'help': - sys.exit(1) - # special case: list locally installed dists for show and uninstall - should_list_installed = ( - subcommand_name in ['show', 'uninstall'] and - not current.startswith('-') - ) - if should_list_installed: - installed = [] - lc = current.lower() - for dist in get_installed_distributions(local_only=True): - if dist.key.startswith(lc) and dist.key not in cwords[1:]: - installed.append(dist.key) - # if there are no dists installed, fall back to option completion - if installed: - for dist in installed: - print(dist) - sys.exit(1) - - subcommand = commands_dict[subcommand_name]() - - for opt in subcommand.parser.option_list_all: - if opt.help != optparse.SUPPRESS_HELP: - for opt_str in opt._long_opts + opt._short_opts: - options.append((opt_str, opt.nargs)) - - # filter out previously specified options from available options - prev_opts = [x.split('=')[0] for x in cwords[1:cword - 1]] - options = [(x, v) for (x, v) in options if x not in prev_opts] - # filter options by current input - options = [(k, v) for k, v in options if k.startswith(current)] - # get completion type given cwords and available subcommand options - completion_type = get_path_completion_type( - cwords, cword, subcommand.parser.option_list_all, - ) - # get completion files and directories if ``completion_type`` is - # ````, ```` or ```` - if completion_type: - options = auto_complete_paths(current, completion_type) - options = ((opt, 0) for opt in options) - for option in options: - opt_label = option[0] - # append '=' to options which require args - if option[1] and option[0][:2] == "--": - opt_label += '=' - print(opt_label) - else: - # show main parser options only when necessary - - opts = [i.option_list for i in parser.option_groups] - opts.append(parser.option_list) - opts = (o for it in opts for o in it) - if current.startswith('-'): - for opt in opts: - if opt.help != optparse.SUPPRESS_HELP: - subcommands += opt._long_opts + opt._short_opts - else: - # get completion type given cwords and all available options - completion_type = get_path_completion_type(cwords, cword, opts) - if completion_type: - subcommands = auto_complete_paths(current, completion_type) - - print(' '.join([x for x in subcommands if x.startswith(current)])) - sys.exit(1) - - -def get_path_completion_type(cwords, cword, opts): - """Get the type of path completion (``file``, ``dir``, ``path`` or None) - - :param cwords: same as the environmental variable ``COMP_WORDS`` - :param cword: same as the environmental variable ``COMP_CWORD`` - :param opts: The available options to check - :return: path completion type (``file``, ``dir``, ``path`` or None) - """ - if cword < 2 or not cwords[cword - 2].startswith('-'): - return - for opt in opts: - if opt.help == optparse.SUPPRESS_HELP: - continue - for o in str(opt).split('/'): - if cwords[cword - 2].split('=')[0] == o: - if not opt.metavar or any( - x in ('path', 'file', 'dir') - for x in opt.metavar.split('/')): - return opt.metavar - - -def auto_complete_paths(current, completion_type): - """If ``completion_type`` is ``file`` or ``path``, list all regular files - and directories starting with ``current``; otherwise only list directories - starting with ``current``. - - :param current: The word to be completed - :param completion_type: path completion type(`file`, `path` or `dir`)i - :return: A generator of regular files and/or directories - """ - directory, filename = os.path.split(current) - current_path = os.path.abspath(directory) - # Don't complete paths if they can't be accessed - if not os.access(current_path, os.R_OK): - return - filename = os.path.normcase(filename) - # list all files that start with ``filename`` - file_list = (x for x in os.listdir(current_path) - if os.path.normcase(x).startswith(filename)) - for f in file_list: - opt = os.path.join(current_path, f) - comp_file = os.path.normcase(os.path.join(directory, f)) - # complete regular files when there is not ```` after option - # complete directories when there is ````, ```` or - # ````after option - if completion_type != 'dir' and os.path.isfile(opt): - yield comp_file - elif os.path.isdir(opt): - yield os.path.join(comp_file, '') diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/base_command.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/base_command.py deleted file mode 100644 index 3ceea49..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/base_command.py +++ /dev/null @@ -1,341 +0,0 @@ -"""Base Command class, and related routines""" -from __future__ import absolute_import, print_function - -import logging -import logging.config -import optparse -import os -import platform -import sys -import traceback - -from pip._internal.cli import cmdoptions -from pip._internal.cli.parser import ( - ConfigOptionParser, UpdatingDefaultsHelpFormatter, -) -from pip._internal.cli.status_codes import ( - ERROR, PREVIOUS_BUILD_DIR_ERROR, SUCCESS, UNKNOWN_ERROR, - VIRTUALENV_NOT_FOUND, -) -from pip._internal.download import PipSession -from pip._internal.exceptions import ( - BadCommand, CommandError, InstallationError, PreviousBuildDirError, - UninstallationError, -) -from pip._internal.index import PackageFinder -from pip._internal.locations import running_under_virtualenv -from pip._internal.req.constructors import ( - install_req_from_editable, install_req_from_line, -) -from pip._internal.req.req_file import parse_requirements -from pip._internal.utils.deprecation import deprecated -from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging -from pip._internal.utils.misc import ( - get_prog, normalize_path, redact_password_from_url, -) -from pip._internal.utils.outdated import pip_version_check -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, List, Tuple, Any # noqa: F401 - from optparse import Values # noqa: F401 - from pip._internal.cache import WheelCache # noqa: F401 - from pip._internal.req.req_set import RequirementSet # noqa: F401 - -__all__ = ['Command'] - -logger = logging.getLogger(__name__) - - -class Command(object): - name = None # type: Optional[str] - usage = None # type: Optional[str] - hidden = False # type: bool - ignore_require_venv = False # type: bool - - def __init__(self, isolated=False): - # type: (bool) -> None - parser_kw = { - 'usage': self.usage, - 'prog': '%s %s' % (get_prog(), self.name), - 'formatter': UpdatingDefaultsHelpFormatter(), - 'add_help_option': False, - 'name': self.name, - 'description': self.__doc__, - 'isolated': isolated, - } - - self.parser = ConfigOptionParser(**parser_kw) - - # Commands should add options to this option group - optgroup_name = '%s Options' % self.name.capitalize() - self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) - - # Add the general options - gen_opts = cmdoptions.make_option_group( - cmdoptions.general_group, - self.parser, - ) - self.parser.add_option_group(gen_opts) - - def run(self, options, args): - # type: (Values, List[Any]) -> Any - raise NotImplementedError - - def _build_session(self, options, retries=None, timeout=None): - # type: (Values, Optional[int], Optional[int]) -> PipSession - session = PipSession( - cache=( - normalize_path(os.path.join(options.cache_dir, "http")) - if options.cache_dir else None - ), - retries=retries if retries is not None else options.retries, - insecure_hosts=options.trusted_hosts, - ) - - # 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 - - return session - - def parse_args(self, args): - # type: (List[str]) -> Tuple - # factored out for testability - return self.parser.parse_args(args) - - def main(self, args): - # type: (List[str]) -> int - options, args = self.parse_args(args) - - # Set verbosity so that it can be used elsewhere. - self.verbosity = options.verbose - options.quiet - - level_number = setup_logging( - verbosity=self.verbosity, - no_color=options.no_color, - user_log_file=options.log, - ) - - if sys.version_info[:2] == (3, 4): - deprecated( - "Python 3.4 support has been deprecated. pip 19.1 will be the " - "last one supporting it. Please upgrade your Python as Python " - "3.4 won't be maintained after March 2019 (cf PEP 429).", - replacement=None, - gone_in='19.2', - ) - elif sys.version_info[:2] == (2, 7): - message = ( - "A future version of pip will drop support for Python 2.7." - ) - if platform.python_implementation() == "CPython": - message = ( - "Python 2.7 will reach the end of its life on January " - "1st, 2020. Please upgrade your Python as Python 2.7 " - "won't be maintained after that date. " - ) + message - deprecated(message, replacement=None, gone_in=None) - - # TODO: Try to get these passing down from the command? - # without resorting to os.environ to hold these. - # This also affects isolated builds and it should. - - if options.no_input: - os.environ['PIP_NO_INPUT'] = '1' - - if options.exists_action: - os.environ['PIP_EXISTS_ACTION'] = ' '.join(options.exists_action) - - if options.require_venv and not self.ignore_require_venv: - # If a venv is required check if it can really be found - if not running_under_virtualenv(): - logger.critical( - 'Could not find an activated virtualenv (required).' - ) - sys.exit(VIRTUALENV_NOT_FOUND) - - try: - status = self.run(options, args) - # FIXME: all commands should return an exit status - # and when it is done, isinstance is not needed anymore - if isinstance(status, int): - return status - except PreviousBuildDirError as exc: - logger.critical(str(exc)) - logger.debug('Exception information:', exc_info=True) - - return PREVIOUS_BUILD_DIR_ERROR - except (InstallationError, UninstallationError, BadCommand) as exc: - logger.critical(str(exc)) - logger.debug('Exception information:', exc_info=True) - - return ERROR - except CommandError as exc: - logger.critical('ERROR: %s', exc) - logger.debug('Exception information:', exc_info=True) - - return ERROR - except BrokenStdoutLoggingError: - # Bypass our logger and write any remaining messages to stderr - # because stdout no longer works. - print('ERROR: Pipe to stdout was broken', file=sys.stderr) - if level_number <= logging.DEBUG: - traceback.print_exc(file=sys.stderr) - - return ERROR - except KeyboardInterrupt: - logger.critical('Operation cancelled by user') - logger.debug('Exception information:', exc_info=True) - - return ERROR - except BaseException: - logger.critical('Exception:', exc_info=True) - - return UNKNOWN_ERROR - finally: - allow_version_check = ( - # Does this command have the index_group options? - hasattr(options, "no_index") and - # Is this command allowed to perform this check? - not (options.disable_pip_version_check or options.no_index) - ) - # Check if we're using the latest version of pip available - if allow_version_check: - session = self._build_session( - options, - retries=0, - timeout=min(5, options.timeout) - ) - with session: - pip_version_check(session, options) - - # Shutdown the logging module - logging.shutdown() - - return SUCCESS - - -class RequirementCommand(Command): - - @staticmethod - def populate_requirement_set(requirement_set, # type: RequirementSet - args, # type: List[str] - options, # type: Values - finder, # type: PackageFinder - session, # type: PipSession - name, # type: str - wheel_cache # type: Optional[WheelCache] - ): - # type: (...) -> None - """ - Marshal cmd line args into a requirement set. - """ - # NOTE: As a side-effect, options.require_hashes and - # requirement_set.require_hashes may be updated - - for filename in options.constraints: - for req_to_add in parse_requirements( - filename, - constraint=True, finder=finder, options=options, - session=session, wheel_cache=wheel_cache): - req_to_add.is_direct = True - requirement_set.add_requirement(req_to_add) - - for req in args: - req_to_add = install_req_from_line( - req, None, isolated=options.isolated_mode, - use_pep517=options.use_pep517, - wheel_cache=wheel_cache - ) - req_to_add.is_direct = True - requirement_set.add_requirement(req_to_add) - - for req in options.editables: - req_to_add = install_req_from_editable( - req, - isolated=options.isolated_mode, - use_pep517=options.use_pep517, - wheel_cache=wheel_cache - ) - req_to_add.is_direct = True - requirement_set.add_requirement(req_to_add) - - for filename in options.requirements: - for req_to_add in parse_requirements( - filename, - finder=finder, options=options, session=session, - wheel_cache=wheel_cache, - use_pep517=options.use_pep517): - req_to_add.is_direct = True - requirement_set.add_requirement(req_to_add) - # If --require-hashes was a line in a requirements file, tell - # RequirementSet about it: - requirement_set.require_hashes = options.require_hashes - - if not (args or options.editables or options.requirements): - opts = {'name': name} - if options.find_links: - raise CommandError( - 'You must give at least one requirement to %(name)s ' - '(maybe you meant "pip %(name)s %(links)s"?)' % - dict(opts, links=' '.join(options.find_links))) - else: - raise CommandError( - 'You must give at least one requirement to %(name)s ' - '(see "pip help %(name)s")' % opts) - - def _build_package_finder( - self, - options, # type: Values - session, # type: PipSession - platform=None, # type: Optional[str] - python_versions=None, # type: Optional[List[str]] - abi=None, # type: Optional[str] - implementation=None # type: Optional[str] - ): - # type: (...) -> PackageFinder - """ - Create a package finder appropriate to this requirement command. - """ - index_urls = [options.index_url] + options.extra_index_urls - if options.no_index: - logger.debug( - 'Ignoring indexes: %s', - ','.join(redact_password_from_url(url) for url in index_urls), - ) - index_urls = [] - - return PackageFinder( - find_links=options.find_links, - format_control=options.format_control, - index_urls=index_urls, - trusted_hosts=options.trusted_hosts, - allow_all_prereleases=options.pre, - session=session, - platform=platform, - versions=python_versions, - abi=abi, - implementation=implementation, - prefer_binary=options.prefer_binary, - ) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/cmdoptions.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/cmdoptions.py deleted file mode 100644 index 5cf5ee9..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/cmdoptions.py +++ /dev/null @@ -1,809 +0,0 @@ -""" -shared options and groups - -The principle here is to define options once, but *not* instantiate them -globally. One reason being that options with action='append' can carry state -between parses. pip parses general options twice internally, and shouldn't -pass on state. To be consistent, all options will follow this design. - -""" -from __future__ import absolute_import - -import textwrap -import warnings -from distutils.util import strtobool -from functools import partial -from optparse import SUPPRESS_HELP, Option, OptionGroup - -from pip._internal.exceptions import CommandError -from pip._internal.locations import USER_CACHE_DIR, src_prefix -from pip._internal.models.format_control import FormatControl -from pip._internal.models.index import PyPI -from pip._internal.utils.hashes import STRONG_HASHES -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.utils.ui import BAR_TYPES - -if MYPY_CHECK_RUNNING: - from typing import Any, Callable, Dict, List, Optional, Union # noqa: F401 - from optparse import OptionParser, Values # noqa: F401 - from pip._internal.cli.parser import ConfigOptionParser # noqa: F401 - - -def raise_option_error(parser, option, msg): - """ - Raise an option parsing error using parser.error(). - - Args: - parser: an OptionParser instance. - option: an Option instance. - msg: the error text. - """ - msg = '{} error: {}'.format(option, msg) - msg = textwrap.fill(' '.join(msg.split())) - parser.error(msg) - - -def make_option_group(group, parser): - # type: (Dict[str, Any], ConfigOptionParser) -> OptionGroup - """ - Return an OptionGroup object - group -- assumed to be dict with 'name' and 'options' keys - parser -- an optparse Parser - """ - option_group = OptionGroup(parser, group['name']) - for option in group['options']: - option_group.add_option(option()) - return option_group - - -def check_install_build_global(options, check_options=None): - # type: (Values, Optional[Values]) -> None - """Disable wheels if per-setup.py call options are set. - - :param options: The OptionParser options to update. - :param check_options: The options to check, if not supplied defaults to - options. - """ - if check_options is None: - check_options = options - - def getname(n): - return getattr(check_options, n, None) - names = ["build_options", "global_options", "install_options"] - if any(map(getname, names)): - control = options.format_control - control.disallow_binaries() - warnings.warn( - 'Disabling all use of wheels due to the use of --build-options ' - '/ --global-options / --install-options.', stacklevel=2, - ) - - -def check_dist_restriction(options, check_target=False): - # type: (Values, bool) -> None - """Function for determining if custom platform options are allowed. - - :param options: The OptionParser options. - :param check_target: Whether or not to check if --target is being used. - """ - dist_restriction_set = any([ - options.python_version, - options.platform, - options.abi, - options.implementation, - ]) - - binary_only = FormatControl(set(), {':all:'}) - sdist_dependencies_allowed = ( - options.format_control != binary_only and - not options.ignore_dependencies - ) - - # Installations or downloads using dist restrictions must not combine - # source distributions and dist-specific wheels, as they are not - # gauranteed to be locally compatible. - if dist_restriction_set and sdist_dependencies_allowed: - raise CommandError( - "When restricting platform and interpreter constraints using " - "--python-version, --platform, --abi, or --implementation, " - "either --no-deps must be set, or --only-binary=:all: must be " - "set and --no-binary must not be set (or must be set to " - ":none:)." - ) - - if check_target: - if dist_restriction_set and not options.target_dir: - raise CommandError( - "Can not use any platform or abi specific options unless " - "installing via '--target'" - ) - - -########### -# options # -########### - -help_ = partial( - Option, - '-h', '--help', - dest='help', - action='help', - help='Show help.', -) # type: Callable[..., Option] - -isolated_mode = partial( - Option, - "--isolated", - dest="isolated_mode", - action="store_true", - default=False, - help=( - "Run pip in an isolated mode, ignoring environment variables and user " - "configuration." - ), -) # type: Callable[..., Option] - -require_virtualenv = partial( - Option, - # Run only if inside a virtualenv, bail if not. - '--require-virtualenv', '--require-venv', - dest='require_venv', - action='store_true', - default=False, - help=SUPPRESS_HELP -) # type: Callable[..., Option] - -verbose = partial( - Option, - '-v', '--verbose', - dest='verbose', - action='count', - default=0, - help='Give more output. Option is additive, and can be used up to 3 times.' -) # type: Callable[..., Option] - -no_color = partial( - Option, - '--no-color', - dest='no_color', - action='store_true', - default=False, - help="Suppress colored output", -) # type: Callable[..., Option] - -version = partial( - Option, - '-V', '--version', - dest='version', - action='store_true', - help='Show version and exit.', -) # type: Callable[..., Option] - -quiet = partial( - Option, - '-q', '--quiet', - dest='quiet', - action='count', - default=0, - help=( - 'Give less output. Option is additive, and can be used up to 3' - ' times (corresponding to WARNING, ERROR, and CRITICAL logging' - ' levels).' - ), -) # type: Callable[..., Option] - -progress_bar = partial( - Option, - '--progress-bar', - dest='progress_bar', - type='choice', - choices=list(BAR_TYPES.keys()), - default='on', - help=( - 'Specify type of progress to be displayed [' + - '|'.join(BAR_TYPES.keys()) + '] (default: %default)' - ), -) # type: Callable[..., Option] - -log = partial( - Option, - "--log", "--log-file", "--local-log", - dest="log", - metavar="path", - help="Path to a verbose appending log." -) # type: Callable[..., Option] - -no_input = partial( - Option, - # Don't ask for input - '--no-input', - dest='no_input', - action='store_true', - default=False, - help=SUPPRESS_HELP -) # type: Callable[..., Option] - -proxy = partial( - Option, - '--proxy', - dest='proxy', - type='str', - default='', - help="Specify a proxy in the form [user:passwd@]proxy.server:port." -) # type: Callable[..., Option] - -retries = partial( - Option, - '--retries', - dest='retries', - type='int', - default=5, - help="Maximum number of retries each connection should attempt " - "(default %default times).", -) # type: Callable[..., Option] - -timeout = partial( - Option, - '--timeout', '--default-timeout', - metavar='sec', - dest='timeout', - type='float', - default=15, - help='Set the socket timeout (default %default seconds).', -) # type: Callable[..., Option] - -skip_requirements_regex = partial( - Option, - # A regex to be used to skip requirements - '--skip-requirements-regex', - dest='skip_requirements_regex', - type='str', - default='', - help=SUPPRESS_HELP, -) # type: Callable[..., Option] - - -def exists_action(): - # type: () -> Option - return Option( - # Option when path already exist - '--exists-action', - dest='exists_action', - type='choice', - choices=['s', 'i', 'w', 'b', 'a'], - default=[], - action='append', - metavar='action', - help="Default action when a path already exists: " - "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort).", - ) - - -cert = partial( - Option, - '--cert', - dest='cert', - type='str', - metavar='path', - help="Path to alternate CA bundle.", -) # type: Callable[..., Option] - -client_cert = partial( - Option, - '--client-cert', - dest='client_cert', - type='str', - default=None, - metavar='path', - help="Path to SSL client certificate, a single file containing the " - "private key and the certificate in PEM format.", -) # type: Callable[..., Option] - -index_url = partial( - Option, - '-i', '--index-url', '--pypi-url', - dest='index_url', - metavar='URL', - default=PyPI.simple_url, - help="Base URL of Python Package Index (default %default). " - "This should point to a repository compliant with PEP 503 " - "(the simple repository API) or a local directory laid out " - "in the same format.", -) # type: Callable[..., Option] - - -def extra_index_url(): - return Option( - '--extra-index-url', - dest='extra_index_urls', - metavar='URL', - action='append', - default=[], - help="Extra URLs of package indexes to use in addition to " - "--index-url. Should follow the same rules as " - "--index-url.", - ) - - -no_index = partial( - Option, - '--no-index', - dest='no_index', - action='store_true', - default=False, - help='Ignore package index (only looking at --find-links URLs instead).', -) # type: Callable[..., Option] - - -def find_links(): - # type: () -> Option - return Option( - '-f', '--find-links', - dest='find_links', - action='append', - default=[], - metavar='url', - help="If a url or path to an html file, then parse for links to " - "archives. If a local path or file:// url that's a directory, " - "then look for archives in the directory listing.", - ) - - -def trusted_host(): - # type: () -> Option - return Option( - "--trusted-host", - dest="trusted_hosts", - action="append", - metavar="HOSTNAME", - default=[], - help="Mark this host as trusted, even though it does not have valid " - "or any HTTPS.", - ) - - -def constraints(): - # type: () -> Option - return Option( - '-c', '--constraint', - dest='constraints', - action='append', - default=[], - metavar='file', - help='Constrain versions using the given constraints file. ' - 'This option can be used multiple times.' - ) - - -def requirements(): - # type: () -> Option - return Option( - '-r', '--requirement', - dest='requirements', - action='append', - default=[], - metavar='file', - help='Install from the given requirements file. ' - 'This option can be used multiple times.' - ) - - -def editable(): - # type: () -> Option - return Option( - '-e', '--editable', - dest='editables', - action='append', - default=[], - metavar='path/url', - help=('Install a project in editable mode (i.e. setuptools ' - '"develop mode") from a local project path or a VCS url.'), - ) - - -src = partial( - Option, - '--src', '--source', '--source-dir', '--source-directory', - dest='src_dir', - metavar='dir', - default=src_prefix, - help='Directory to check out editable projects into. ' - 'The default in a virtualenv is "/src". ' - 'The default for global installs is "/src".' -) # type: Callable[..., Option] - - -def _get_format_control(values, option): - # type: (Values, Option) -> Any - """Get a format_control object.""" - return getattr(values, option.dest) - - -def _handle_no_binary(option, opt_str, value, parser): - # type: (Option, str, str, OptionParser) -> None - existing = _get_format_control(parser.values, option) - FormatControl.handle_mutual_excludes( - value, existing.no_binary, existing.only_binary, - ) - - -def _handle_only_binary(option, opt_str, value, parser): - # type: (Option, str, str, OptionParser) -> None - existing = _get_format_control(parser.values, option) - FormatControl.handle_mutual_excludes( - value, existing.only_binary, existing.no_binary, - ) - - -def no_binary(): - # type: () -> Option - format_control = FormatControl(set(), set()) - return Option( - "--no-binary", dest="format_control", action="callback", - callback=_handle_no_binary, type="str", - default=format_control, - help="Do not use binary packages. Can be supplied multiple times, and " - "each time adds to the existing value. Accepts either :all: to " - "disable all binary packages, :none: to empty the set, or one or " - "more package names with commas between them. Note that some " - "packages are tricky to compile and may fail to install when " - "this option is used on them.", - ) - - -def only_binary(): - # type: () -> Option - format_control = FormatControl(set(), set()) - return Option( - "--only-binary", dest="format_control", action="callback", - callback=_handle_only_binary, type="str", - default=format_control, - help="Do not use source packages. Can be supplied multiple times, and " - "each time adds to the existing value. Accepts either :all: to " - "disable all source packages, :none: to empty the set, or one or " - "more package names with commas between them. Packages without " - "binary distributions will fail to install when this option is " - "used on them.", - ) - - -platform = partial( - Option, - '--platform', - dest='platform', - metavar='platform', - default=None, - help=("Only use wheels compatible with . " - "Defaults to the platform of the running system."), -) # type: Callable[..., Option] - - -python_version = partial( - Option, - '--python-version', - dest='python_version', - metavar='python_version', - default=None, - help=("Only use wheels compatible with Python " - "interpreter version . If not specified, then the " - "current system interpreter minor version is used. A major " - "version (e.g. '2') can be specified to match all " - "minor revs of that major version. A minor version " - "(e.g. '34') can also be specified."), -) # type: Callable[..., Option] - - -implementation = partial( - Option, - '--implementation', - dest='implementation', - metavar='implementation', - default=None, - help=("Only use wheels compatible with Python " - "implementation , e.g. 'pp', 'jy', 'cp', " - " or 'ip'. If not specified, then the current " - "interpreter implementation is used. Use 'py' to force " - "implementation-agnostic wheels."), -) # type: Callable[..., Option] - - -abi = partial( - Option, - '--abi', - dest='abi', - metavar='abi', - default=None, - help=("Only use wheels compatible with Python " - "abi , e.g. 'pypy_41'. If not specified, then the " - "current interpreter abi tag is used. Generally " - "you will need to specify --implementation, " - "--platform, and --python-version when using " - "this option."), -) # type: Callable[..., Option] - - -def prefer_binary(): - # type: () -> Option - return Option( - "--prefer-binary", - dest="prefer_binary", - action="store_true", - default=False, - help="Prefer older binary packages over newer source packages." - ) - - -cache_dir = partial( - Option, - "--cache-dir", - dest="cache_dir", - default=USER_CACHE_DIR, - metavar="dir", - help="Store the cache data in ." -) # type: Callable[..., Option] - - -def no_cache_dir_callback(option, opt, value, parser): - """ - Process a value provided for the --no-cache-dir option. - - This is an optparse.Option callback for the --no-cache-dir option. - """ - # The value argument will be None if --no-cache-dir is passed via the - # command-line, since the option doesn't accept arguments. However, - # the value can be non-None if the option is triggered e.g. by an - # environment variable, like PIP_NO_CACHE_DIR=true. - if value is not None: - # Then parse the string value to get argument error-checking. - try: - strtobool(value) - except ValueError as exc: - raise_option_error(parser, option=option, msg=str(exc)) - - # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() - # converted to 0 (like "false" or "no") caused cache_dir to be disabled - # rather than enabled (logic would say the latter). Thus, we disable - # the cache directory not just on values that parse to True, but (for - # backwards compatibility reasons) also on values that parse to False. - # In other words, always set it to False if the option is provided in - # some (valid) form. - parser.values.cache_dir = False - - -no_cache = partial( - Option, - "--no-cache-dir", - dest="cache_dir", - action="callback", - callback=no_cache_dir_callback, - help="Disable the cache.", -) # type: Callable[..., Option] - -no_deps = partial( - Option, - '--no-deps', '--no-dependencies', - dest='ignore_dependencies', - action='store_true', - default=False, - help="Don't install package dependencies.", -) # type: Callable[..., Option] - -build_dir = partial( - Option, - '-b', '--build', '--build-dir', '--build-directory', - dest='build_dir', - metavar='dir', - help='Directory to unpack packages into and build in. Note that ' - 'an initial build still takes place in a temporary directory. ' - 'The location of temporary directories can be controlled by setting ' - 'the TMPDIR environment variable (TEMP on Windows) appropriately. ' - 'When passed, build directories are not cleaned in case of failures.' -) # type: Callable[..., Option] - -ignore_requires_python = partial( - Option, - '--ignore-requires-python', - dest='ignore_requires_python', - action='store_true', - help='Ignore the Requires-Python information.' -) # type: Callable[..., Option] - -no_build_isolation = partial( - Option, - '--no-build-isolation', - dest='build_isolation', - action='store_false', - default=True, - help='Disable isolation when building a modern source distribution. ' - 'Build dependencies specified by PEP 518 must be already installed ' - 'if this option is used.' -) # type: Callable[..., Option] - - -def no_use_pep517_callback(option, opt, value, parser): - """ - Process a value provided for the --no-use-pep517 option. - - This is an optparse.Option callback for the no_use_pep517 option. - """ - # Since --no-use-pep517 doesn't accept arguments, the value argument - # will be None if --no-use-pep517 is passed via the command-line. - # However, the value can be non-None if the option is triggered e.g. - # by an environment variable, for example "PIP_NO_USE_PEP517=true". - if value is not None: - msg = """A value was passed for --no-use-pep517, - probably using either the PIP_NO_USE_PEP517 environment variable - or the "no-use-pep517" config file option. Use an appropriate value - of the PIP_USE_PEP517 environment variable or the "use-pep517" - config file option instead. - """ - raise_option_error(parser, option=option, msg=msg) - - # Otherwise, --no-use-pep517 was passed via the command-line. - parser.values.use_pep517 = False - - -use_pep517 = partial( - Option, - '--use-pep517', - dest='use_pep517', - action='store_true', - default=None, - help='Use PEP 517 for building source distributions ' - '(use --no-use-pep517 to force legacy behaviour).' -) # type: Any - -no_use_pep517 = partial( - Option, - '--no-use-pep517', - dest='use_pep517', - action='callback', - callback=no_use_pep517_callback, - default=None, - help=SUPPRESS_HELP -) # type: Any - -install_options = partial( - Option, - '--install-option', - dest='install_options', - action='append', - metavar='options', - help="Extra arguments to be supplied to the setup.py install " - "command (use like --install-option=\"--install-scripts=/usr/local/" - "bin\"). Use multiple --install-option options to pass multiple " - "options to setup.py install. If you are using an option with a " - "directory path, be sure to use absolute path.", -) # type: Callable[..., Option] - -global_options = partial( - Option, - '--global-option', - dest='global_options', - action='append', - metavar='options', - help="Extra global options to be supplied to the setup.py " - "call before the install command.", -) # type: Callable[..., Option] - -no_clean = partial( - Option, - '--no-clean', - action='store_true', - default=False, - help="Don't clean up build directories." -) # type: Callable[..., Option] - -pre = partial( - Option, - '--pre', - action='store_true', - default=False, - help="Include pre-release and development versions. By default, " - "pip only finds stable versions.", -) # type: Callable[..., Option] - -disable_pip_version_check = partial( - Option, - "--disable-pip-version-check", - dest="disable_pip_version_check", - action="store_true", - default=False, - help="Don't periodically check PyPI to determine whether a new version " - "of pip is available for download. Implied with --no-index.", -) # type: Callable[..., Option] - - -# Deprecated, Remove later -always_unzip = partial( - Option, - '-Z', '--always-unzip', - dest='always_unzip', - action='store_true', - help=SUPPRESS_HELP, -) # type: Callable[..., Option] - - -def _merge_hash(option, opt_str, value, parser): - # type: (Option, str, str, OptionParser) -> None - """Given a value spelled "algo:digest", append the digest to a list - pointed to in a dict by the algo name.""" - if not parser.values.hashes: - parser.values.hashes = {} # type: ignore - try: - algo, digest = value.split(':', 1) - except ValueError: - parser.error('Arguments to %s must be a hash name ' - 'followed by a value, like --hash=sha256:abcde...' % - opt_str) - if algo not in STRONG_HASHES: - parser.error('Allowed hash algorithms for %s are %s.' % - (opt_str, ', '.join(STRONG_HASHES))) - parser.values.hashes.setdefault(algo, []).append(digest) - - -hash = partial( - Option, - '--hash', - # Hash values eventually end up in InstallRequirement.hashes due to - # __dict__ copying in process_line(). - dest='hashes', - action='callback', - callback=_merge_hash, - type='string', - help="Verify that the package's archive matches this " - 'hash before installing. Example: --hash=sha256:abcdef...', -) # type: Callable[..., Option] - - -require_hashes = partial( - Option, - '--require-hashes', - dest='require_hashes', - action='store_true', - default=False, - help='Require a hash to check each requirement against, for ' - 'repeatable installs. This option is implied when any package in a ' - 'requirements file has a --hash option.', -) # type: Callable[..., Option] - - -########## -# groups # -########## - -general_group = { - 'name': 'General Options', - 'options': [ - help_, - isolated_mode, - require_virtualenv, - verbose, - version, - quiet, - log, - no_input, - proxy, - retries, - timeout, - skip_requirements_regex, - exists_action, - trusted_host, - cert, - client_cert, - cache_dir, - no_cache, - disable_pip_version_check, - no_color, - ] -} # type: Dict[str, Any] - -index_group = { - 'name': 'Package Index Options', - 'options': [ - index_url, - extra_index_url, - no_index, - find_links, - ] -} # type: Dict[str, Any] diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/main_parser.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/main_parser.py deleted file mode 100644 index b17c749..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/main_parser.py +++ /dev/null @@ -1,104 +0,0 @@ -"""A single place for constructing and exposing the main parser -""" - -import os -import sys - -from pip import __version__ -from pip._internal.cli import cmdoptions -from pip._internal.cli.parser import ( - ConfigOptionParser, UpdatingDefaultsHelpFormatter, -) -from pip._internal.commands import ( - commands_dict, get_similar_commands, get_summaries, -) -from pip._internal.exceptions import CommandError -from pip._internal.utils.misc import get_prog -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Tuple, List # noqa: F401 - - -__all__ = ["create_main_parser", "parse_command"] - - -def create_main_parser(): - # type: () -> ConfigOptionParser - """Creates and returns the main parser for pip's CLI - """ - - parser_kw = { - 'usage': '\n%prog [options]', - 'add_help_option': False, - 'formatter': UpdatingDefaultsHelpFormatter(), - 'name': 'global', - 'prog': get_prog(), - } - - parser = ConfigOptionParser(**parser_kw) - parser.disable_interspersed_args() - - pip_pkg_dir = os.path.abspath(os.path.join( - os.path.dirname(__file__), "..", "..", - )) - parser.version = 'pip %s from %s (python %s)' % ( - __version__, pip_pkg_dir, sys.version[:3], - ) - - # add the general options - gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) - parser.add_option_group(gen_opts) - - # so the help formatter knows - parser.main = True # type: ignore - - # create command listing for description - command_summaries = get_summaries() - description = [''] + ['%-27s %s' % (i, j) for i, j in command_summaries] - parser.description = '\n'.join(description) - - return parser - - -def parse_command(args): - # type: (List[str]) -> Tuple[str, List[str]] - parser = create_main_parser() - - # Note: parser calls disable_interspersed_args(), so the result of this - # call is to split the initial args into the general options before the - # subcommand and everything else. - # For example: - # args: ['--timeout=5', 'install', '--user', 'INITools'] - # general_options: ['--timeout==5'] - # args_else: ['install', '--user', 'INITools'] - general_options, args_else = parser.parse_args(args) - - # --version - if general_options.version: - sys.stdout.write(parser.version) # type: ignore - sys.stdout.write(os.linesep) - sys.exit() - - # pip || pip help -> print_help() - if not args_else or (args_else[0] == 'help' and len(args_else) == 1): - parser.print_help() - sys.exit() - - # the subcommand name - cmd_name = args_else[0] - - if cmd_name not in commands_dict: - guess = get_similar_commands(cmd_name) - - msg = ['unknown command "%s"' % cmd_name] - if guess: - msg.append('maybe you meant "%s"' % guess) - - raise CommandError(' - '.join(msg)) - - # all the args without the subcommand - cmd_args = args[:] - cmd_args.remove(cmd_name) - - return cmd_name, cmd_args diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/parser.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/parser.py deleted file mode 100644 index e1eaac4..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/parser.py +++ /dev/null @@ -1,261 +0,0 @@ -"""Base option parser setup""" -from __future__ import absolute_import - -import logging -import optparse -import sys -import textwrap -from distutils.util import strtobool - -from pip._vendor.six import string_types - -from pip._internal.cli.status_codes import UNKNOWN_ERROR -from pip._internal.configuration import Configuration, ConfigurationError -from pip._internal.utils.compat import get_terminal_size - -logger = logging.getLogger(__name__) - - -class PrettyHelpFormatter(optparse.IndentedHelpFormatter): - """A prettier/less verbose help formatter for optparse.""" - - def __init__(self, *args, **kwargs): - # help position must be aligned with __init__.parseopts.description - kwargs['max_help_position'] = 30 - kwargs['indent_increment'] = 1 - kwargs['width'] = get_terminal_size()[0] - 2 - optparse.IndentedHelpFormatter.__init__(self, *args, **kwargs) - - def format_option_strings(self, option): - return self._format_option_strings(option, ' <%s>', ', ') - - def _format_option_strings(self, option, mvarfmt=' <%s>', optsep=', '): - """ - Return a comma-separated list of option strings and metavars. - - :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') - :param mvarfmt: metavar format string - evaluated as mvarfmt % metavar - :param optsep: separator - """ - opts = [] - - if option._short_opts: - opts.append(option._short_opts[0]) - if option._long_opts: - opts.append(option._long_opts[0]) - if len(opts) > 1: - opts.insert(1, optsep) - - if option.takes_value(): - metavar = option.metavar or option.dest.lower() - opts.append(mvarfmt % metavar.lower()) - - return ''.join(opts) - - def format_heading(self, heading): - if heading == 'Options': - return '' - return heading + ':\n' - - def format_usage(self, usage): - """ - Ensure there is only one newline between usage and the first heading - if there is no description. - """ - msg = '\nUsage: %s\n' % self.indent_lines(textwrap.dedent(usage), " ") - return msg - - def format_description(self, description): - # leave full control over description to us - if description: - if hasattr(self.parser, 'main'): - label = 'Commands' - else: - label = 'Description' - # some doc strings have initial newlines, some don't - description = description.lstrip('\n') - # some doc strings have final newlines and spaces, some don't - description = description.rstrip() - # dedent, then reindent - description = self.indent_lines(textwrap.dedent(description), " ") - description = '%s:\n%s\n' % (label, description) - return description - else: - return '' - - def format_epilog(self, epilog): - # leave full control over epilog to us - if epilog: - return epilog - else: - return '' - - def indent_lines(self, text, indent): - new_lines = [indent + line for line in text.split('\n')] - return "\n".join(new_lines) - - -class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): - """Custom help formatter for use in ConfigOptionParser. - - This is updates the defaults before expanding them, allowing - them to show up correctly in the help listing. - """ - - def expand_default(self, option): - if self.parser is not None: - self.parser._update_defaults(self.parser.defaults) - return optparse.IndentedHelpFormatter.expand_default(self, option) - - -class CustomOptionParser(optparse.OptionParser): - - def insert_option_group(self, idx, *args, **kwargs): - """Insert an OptionGroup at a given position.""" - group = self.add_option_group(*args, **kwargs) - - self.option_groups.pop() - self.option_groups.insert(idx, group) - - return group - - @property - def option_list_all(self): - """Get a list of all options, including those in option groups.""" - res = self.option_list[:] - for i in self.option_groups: - res.extend(i.option_list) - - return res - - -class ConfigOptionParser(CustomOptionParser): - """Custom option parser which updates its defaults by checking the - configuration files and environmental variables""" - - def __init__(self, *args, **kwargs): - self.name = kwargs.pop('name') - - isolated = kwargs.pop("isolated", False) - self.config = Configuration(isolated) - - assert self.name - optparse.OptionParser.__init__(self, *args, **kwargs) - - def check_default(self, option, key, val): - try: - return option.check_value(key, val) - except optparse.OptionValueError as exc: - print("An error occurred during configuration: %s" % exc) - sys.exit(3) - - def _get_ordered_configuration_items(self): - # Configuration gives keys in an unordered manner. Order them. - override_order = ["global", self.name, ":env:"] - - # Pool the options into different groups - section_items = {name: [] for name in override_order} - for section_key, val in self.config.items(): - # ignore empty values - if not val: - logger.debug( - "Ignoring configuration key '%s' as it's value is empty.", - section_key - ) - continue - - section, key = section_key.split(".", 1) - if section in override_order: - section_items[section].append((key, val)) - - # Yield each group in their override order - for section in override_order: - for key, val in section_items[section]: - yield key, val - - def _update_defaults(self, defaults): - """Updates the given defaults with values from the config files and - the environ. Does a little special handling for certain types of - options (lists).""" - - # Accumulate complex default state. - self.values = optparse.Values(self.defaults) - late_eval = set() - # Then set the options with those values - for key, val in self._get_ordered_configuration_items(): - # '--' because configuration supports only long names - option = self.get_option('--' + key) - - # Ignore options not present in this parser. E.g. non-globals put - # in [global] by users that want them to apply to all applicable - # commands. - if option is None: - continue - - if option.action in ('store_true', 'store_false', 'count'): - try: - val = strtobool(val) - except ValueError: - error_msg = invalid_config_error_message( - option.action, key, val - ) - self.error(error_msg) - - elif option.action == 'append': - val = val.split() - val = [self.check_default(option, key, v) for v in val] - elif option.action == 'callback': - late_eval.add(option.dest) - opt_str = option.get_opt_string() - val = option.convert_value(opt_str, val) - # From take_action - args = option.callback_args or () - kwargs = option.callback_kwargs or {} - option.callback(option, opt_str, val, self, *args, **kwargs) - else: - val = self.check_default(option, key, val) - - defaults[option.dest] = val - - for key in late_eval: - defaults[key] = getattr(self.values, key) - self.values = None - return defaults - - def get_default_values(self): - """Overriding to make updating the defaults after instantiation of - the option parser possible, _update_defaults() does the dirty work.""" - if not self.process_default_values: - # Old, pre-Optik 1.5 behaviour. - return optparse.Values(self.defaults) - - # Load the configuration, or error out in case of an error - try: - self.config.load() - except ConfigurationError as err: - self.exit(UNKNOWN_ERROR, str(err)) - - defaults = self._update_defaults(self.defaults.copy()) # ours - for option in self._get_all_options(): - default = defaults.get(option.dest) - if isinstance(default, string_types): - opt_str = option.get_opt_string() - defaults[option.dest] = option.check_value(opt_str, default) - return optparse.Values(defaults) - - def error(self, msg): - self.print_usage(sys.stderr) - self.exit(UNKNOWN_ERROR, "%s\n" % msg) - - -def invalid_config_error_message(action, key, val): - """Returns a better error message when invalid configuration option - is provided.""" - if action in ('store_true', 'store_false'): - return ("{0} is not a valid value for {1} option, " - "please specify a boolean value like yes/no, " - "true/false or 1/0 instead.").format(val, key) - - return ("{0} is not a valid value for {1} option, " - "please specify a numerical value like 1/0 " - "instead.").format(val, key) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/status_codes.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/status_codes.py deleted file mode 100644 index 275360a..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/status_codes.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import absolute_import - -SUCCESS = 0 -ERROR = 1 -UNKNOWN_ERROR = 2 -VIRTUALENV_NOT_FOUND = 3 -PREVIOUS_BUILD_DIR_ERROR = 4 -NO_MATCHES_FOUND = 23 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__init__.py deleted file mode 100644 index c7d1da3..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__init__.py +++ /dev/null @@ -1,79 +0,0 @@ -""" -Package containing all pip commands -""" -from __future__ import absolute_import - -from pip._internal.commands.completion import CompletionCommand -from pip._internal.commands.configuration import ConfigurationCommand -from pip._internal.commands.download import DownloadCommand -from pip._internal.commands.freeze import FreezeCommand -from pip._internal.commands.hash import HashCommand -from pip._internal.commands.help import HelpCommand -from pip._internal.commands.list import ListCommand -from pip._internal.commands.check import CheckCommand -from pip._internal.commands.search import SearchCommand -from pip._internal.commands.show import ShowCommand -from pip._internal.commands.install import InstallCommand -from pip._internal.commands.uninstall import UninstallCommand -from pip._internal.commands.wheel import WheelCommand - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import List, Type # noqa: F401 - from pip._internal.cli.base_command import Command # noqa: F401 - -commands_order = [ - InstallCommand, - DownloadCommand, - UninstallCommand, - FreezeCommand, - ListCommand, - ShowCommand, - CheckCommand, - ConfigurationCommand, - SearchCommand, - WheelCommand, - HashCommand, - CompletionCommand, - HelpCommand, -] # type: List[Type[Command]] - -commands_dict = {c.name: c for c in commands_order} - - -def get_summaries(ordered=True): - """Yields sorted (command name, command summary) tuples.""" - - if ordered: - cmditems = _sort_commands(commands_dict, commands_order) - else: - cmditems = commands_dict.items() - - for name, command_class in cmditems: - yield (name, command_class.summary) - - -def get_similar_commands(name): - """Command name auto-correct.""" - from difflib import get_close_matches - - name = name.lower() - - close_commands = get_close_matches(name, commands_dict.keys()) - - if close_commands: - return close_commands[0] - else: - return False - - -def _sort_commands(cmddict, order): - def keyfn(key): - try: - return order.index(key[1]) - except ValueError: - # unordered items should come last - return 0xff - - return sorted(cmddict.items(), key=keyfn) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 2ffa96647fabd6af860571094e955ccbd2a1705f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2541 zcmaJ@OK%%D5GJ{+M`THs9mVlG%Ck`$uTlgp8XyP?I8U?{f;f+wXu4Q0DQRPJSK+SW z+K^8%&|Z4#AFz-4Ck6TkioN!fb8o$*LrU@^h_V8?GsD>-=i@x|v{Wh}c>a7}|M{;x zLjP#y_)`MrTNv>Lj1WT3li@eBfUT&A@C3c!s_Yl8y2fe}cGFxIZ?Cc(UZwr zr_JWW=KVTJZGDu~ezM)=;Bszg(uc@9d^1aO zBWs7AV^xlAaPx% zyPXzpvA|DYseAi#?Lii%EF$2NngjC53179J77QOo{54E{q$&wYa6;aYT^!~Uyl)*K z?fV_{qWTlrCA(Ii^sSe6i#$UZy;@`#Vv_89wH|Q6;#v$5##!y^@N6{=(X~-f*5V#S zo7%3|k{-lg>@@3{wCw6{+>tYBX+*i&k+gisMv8HjW&kA_r@4_So94^{XEg6iW>(c1 zaD|QxxxVn?_~?4nEUc!bHc#Avk$}f58URzLEE^X|o)ob<2eK1rX`~J#L!)IX6_R)t zV?b`708$VkeUw=H_5lI}NuMaEPZ*v#EM;fOC{2Z{dAqF=K>I#M!!)P5bF!LjH2QX$e z-)RHy-opgRmkC0~e@P3^JkjHKm5S6`oLYbdyfP*-27a4M&w#uYKG6H>10YOr1((Ur z(#aTfZi&eEM10#Z`s(UntLz}S)ski{nuBoDA*#LrUTHrDJL$ADF{b8$x(_4PQG;+X zXC%!!ep0WeIoD;8@49Khbz8lpr?~4XjWInBY3>}Rxih*yO$@8H(zw%0WA%;|a;5jC z=fp2T-|BYCuy^8uqa^1Qcg=N^2~R*#+{z-&8tL z#~wB|-9$}%YNHq$jM7m~m&a^0>@Q0HJE6L3(ko=^nNh6hz)7#2!rk%7Cd_CSOgg9m{#so=g_x qZ^?-D1i!8GDAw6vTScgNV}4KwY)F%$MIc>1`uo?el&wNBU;ZC|GNZ8o diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/check.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/check.cpython-38.pyc deleted file mode 100644 index c8ffec17a6121d80ceab6f881a1cf6f26ee3deb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1352 zcmZ8hORw8R6rLGB^O8z|iXu@Ni7tYOeW4N$389LMV1up@6)a3!%ki8z?zKJ6jB~3* z&g$|L5MtT8LE@kA8)nO@e}M&X#y2+vCYh5nXXcyv&MV(dCPRYb_rIr4e|8A@!z_-6 zjf;mk)#oTU;j|>N`DG=oSj?!=t87Z zR}?L|B#+t7+Sx7btV@czvvWJ=3-aV-=XF-+-6hZ1&hH$fq4ka3ptWAuoOWL4cLUDu zk}I2%)yeA3&c*!?|ATV(sC$pC-EcSBje9KKir8^C>_%5EVi&7#I!FD~xj1e43%4JU z{+x3~O^Qw8&bIH~R{?${tk#7DqrVqCUl!RiC{$33_TRXLlA>qZ*)?F99zYe;ZI7F; z+h8Ns*KzHSg)e)|TW2DeOK}eM%|iyGf`wSuJe)exRHQT!)!qe2g%Q?nDe@eowu^cp zrW0)|C>Pq>$6wp2%vC%(DzA9bqzJ9^1T!^P+N%m>mU@(ldQlcxYZhbNdit$cGTIFp3*++}k+0(MKc7cSQ9&e^&_XR_^krEz&9@Q0&@^(EMR00p5#I%d9+)TWFw!if8q?-|RkBw4M~(!>Z?UXpN;p<)|@cGe0zT6=1Z4CO|?j%@nS9EsPA4gY({ z2&Xc=;Ug*hFq`%E=}>zn!zL&9(DU%%d6<<&I8PNM`w&R;ClLSdkZ3?++hQw*eSrGv u>FY=ja%jKqi$~r;q#PJwxE%2_nUsd4_CLM$`ZH6h$`pjp#`KmwwEh8EhI0e} diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/completion.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/completion.cpython-38.pyc deleted file mode 100644 index 70c47859f0744ac17cdd3fb951a23b5a82cf72ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3131 zcmai0OK%%T67G4DqNwV*z8OUh^;vQ6(q4)jj$_Pxk6Iyd+GwWtPT zFRC-2)mWX){p>_@pAptz^UnyI=iZSMHJH6kg66-$I|(d(CE1Z>K2SW)`c)~^1CZ6$ z%6>m77!2z@uHs6Rz2V;)@6sx(=zA@>%kw;tG%fp8&Q(?xRH{TM(4-=(R3Klmk{7Iz zT(t;k(8&{n*Ldoy6`X3mKON!HwT*vlZmn;A{?%%WF1O4y{^!QlC)=w_%ip7NJp20n zM~6%Fn=_^-TTObicnxh=m#5=b+ic$7jPHH%a3e;8&(|NWuddML6&lcKxQC~EPENyV zSW?Ej$skuW{FJ_QQh*YX4WzM4KAr`oJ1A0v?8`Q@nB--ew**a6Sa%J3YBDq zq+v$G@Fm|Wpkp2yItPH=S^7>Xh6Fwd^&E~ znmWhSJjs+PgS!b`YQ^W_3zle@o~3Z$Xm=-(yV@B-<09fImYLbdnM~vdFyJJz7=e;z zK{>M{mpPHg+{pidbS>sF|5-h%VIg})qWTZSCD9y|t~q^e?X>d12=8ck`yPd=RB?e- z2_;mObcfS{+oKISLVozI^Re2$e9)m3iZw_ZAf2C)HrWD5UjyltiInVl$3D9{ za-Q2*_5qJ;4~BjiBJM*w+|lz=m4XA)3#o($!D!DE?BUz%eIUa0$S`EwV1u@StNp~3 z9PJrf?J_Qvb`jR07lv@9;D0E5a5;SIQeU_X!ojjYvM)F93QT%bTC zbv=%=B2#g!>uI0GWu>HUB+QK9?zCSeLUN&Bhn(U<;Q|oHJy8xSIEpKI-qmg*dQ#hu z_r*2v`HQ9J;yBF{DdYGT^50Qsx9szd*yV~BrRaQ`XH~V;>0&3sUIMzOym;Elvz<Ipxa>d~30MByzSX`RRtKPN^Ii{y9f)3WQ6zb1!bgdN$=_wW zIuKVOq7UJf*bwWw?c1(p6Wf~n{^$F@Gp`MAuARDs5wgC00$X~LXXqWT4Bs_)rGQ3} zW9vCNbdZbBh_Xk{k@X2VvJTymwFfMH?29jzd+fnFA0-Uf##~i9BAK;Fo?C~Ws;jw? zXLR1r_9EC?q*zpqz4_xN^7?pT#}bUl+` zHpGlcwv7jP1DYNr)T8Dh6pxYh2lA8s#Dy&^AY3SJf;zCZ-M%I8L(9y^%^zW^8+Y zAQi2EYVsb$ylgENT8D!97N}A*m zZ3sp$Ofou!PtrJ^iTnm=1>U%+C%0fAo6yuDaPza9H;pEk$Dq0cH2~+aK&FWRn`LP9 zJCMum(_C(+dDezviPhDlo4_p7H_k2^s4SQ5eg@RQ3llAD{)7!ywwVwSP7|W8-x;HF a7b~G5coSf*+fA!!yPiE~&)fg;-~B)DA3YTS diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/configuration.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/configuration.cpython-38.pyc deleted file mode 100644 index 74d814e83b26d8d9ec7a8b94b1d5bc3c7b1d71b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6503 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/freeze.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/freeze.cpython-38.pyc deleted file mode 100644 index 2d6e7bad9fd891439a403fdca32bf3fbf65959e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2904 zcmb7GTaVku73NK(L`l2$+FmzKldx!vR>hKv8x%;5pa@{cLD0Y{lDa8aqy(2UlDIp( zcxJd4Li@A^@?`&p^<(}*`v>|P_}Zubf&xx~^czxIYu%@kn8P#Y%;nq22|zTWGcD6YU01lljL^W>WM*cCR!g&3FSA3t#e2-j`eDDt zZ8pf<&~0&t4YN@=0^TPB;*#OQ3df&mWJJc#G%}|4xfyN|<7;iQ^)KA2P4s3v-WLU{ zB#qLnEVz6On)}UyQuZKD78En*L6K!~PJoUd6+DaOgCdu_U?A8tPHC-H4TU5u-H*z{ zxoFHXEgM%*S(UOVmz-feNuyIb;N?){}GWm@Fo+xp)BEz!hyb&a0L`_rj76#=YGIp+v0Ezwt&Qy*o; z0me3l_#1%Kq`uV7jRRw;FO3(7ucdZi9#}*t1~G{>*GNxU^SN`$>0(E5hKQU^&X{bG zZE}rVCp+ZEbHw86tefOkOWg&vcS*fXegf)SmNX}gHA@+-&z=bC$p!8Fpj@RUb2#Wt zFJrZbnD$b*JVAW7zDHo@-kj!?$1=_5UeQKP;Qeut3a@h=JfC~})T;!%omEVxB~FrQ zMny2`H5Q>lLa0Q!xp4@c#aPog8I|!-%o}S#SqZIX^~m>UX-<5W=7*wj6&`iC`Q)oF z>W=|bEP9HeWLbyeo_D-RlZAJjGNuHH34tWC=+y26#s#c)e4iCb%$i>JafK{6jU=z= zqx#9`vo4U2QZB2Q(fkMp#L`>D!ke>VKW1K>Bvgn!j}%^B$dxfxOm?cG|BYM%E7a zK;kehmDX_i#xWaqxbNK+wXx?-%nh+xiFSOSo+PXy)Tbns@jjyslB=aeYf63h(~jb; zDeHT@885PRba0h^lR?uHRf&`wV%GGdD9uwDMNL1+NQBUVi{UASslc!fiZpNf4?q1= z^oQSn_H|>IF;^D4p-Kvut7Xxg7gaei8%t0&Ypj@~v>J!U-|NjFiV_wJ5k=o?uTG|m zBBN8jppxbVpFUz~S$;L0sSo$(F?dLTqbbVsv^XsYb%uMIav!S?U{Huxa; z&@WHH4(NQYh*KycDbHgzRcV5h5!22WL3zsGfwFfn#6Ezg?-;gjXoi0IzOo1ZL+M|k z{9rqnuiqbR`}M5M&AzlEe3V7a*bK}gEsDlUQ z(gbcvU0Ub*Sr3$+`1P`PVN2&FDx~a#GQe;#h8QD^F~-)?TB_CCM1MXwv+MWe^_jM` zU+53DZ*QJCa_8X2#m%KdjN6(z=jrSl?Kj%ey14dI)3rZ$Rn2^iU>R-{F@6g|Hg21x zQGw)W1}XtM)KyU)aXP0bO+Q7aj?reCVcSBZM0IFH2bS=+)gih&xy5@5GtqpxGD|aP zS4AY{+`*hHe>HYh5}d?;rY06i6UoPlsYKzo6?jW=Zm({C-5*z?jMt(>S%F5>UhX7} z#(7n?jSm8xqB^5Zp@^d8b41&u&)-+4I;$?o@2c5W*Kwny`>Eg`sN3%WgyU7xA0D@n zZ=pO=K2huz{7UUMd6j<-MEnv!)3@}I-q&s2H4NR_cvXa1|F%a4R_q$}^{a7&GbTfo zv^jDGN$W;Rt%@mp6h%)_AXgkGib#=wY$-z1s|0=`8b?$}4Sw1TSuv0BqeJ6Nw8_Cg zfmF?Sm8}V7EQ&T%_yxFJ>Cu*rEg(XHzHap(y`jcv+VUpbN~&2UE7b6a8*0yefba&A zG`LLCpmlcV_;=snur%1mZwn0F<}p`4pv}*(E>hlPB6!0kDx$*ouC6Rl?9e6gGZS=f y>fCZ(enI1V?KvFyT6MO>@Vh8bSFv;T2t_}{6bDpWHW8GT~}uePr-GXD!*C`M5L diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/hash.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/hash.cpython-38.pyc deleted file mode 100644 index 8743237d697288aa43b99308f8414f120154e333..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2100 zcmZuyTW=gS6t+Fry(OWoq7tAQpn!RE35gx}y-p7;yAl;hb=yFk6N$CqR4obUV2*>5|YCW7|Ii|$Xq+X(%s z7t76r#VzRK7Z@m_I7Jx_FxGRDl7Q4-BQWZ(8JO@jQY*6qyS6b?CvyY0o?B@nYX;4% z6}0NLowl=1(7}iqvlX^_ii5TLh&t4Lf~d>v6C-$oHfZw+3eHiogSxH1zz5XDYBkyu zMOsM~CRtf!vpTdK3OJ9w~tzh2zk z0mBw&5e?&Ul|K@(etWqYi-oub6NUmz5k!k2QUXyLfkn;0rdHrQMMF$&>O6rssY@H+ zZ{sO4QP2dRo2s=HiSfd@$+M;h4OS(1??v7i&b(p>v$Tk#)GMR-Q8a=R9*>hl<~M8m z-7yo)i=*7zV_qc~^&Tg3?Dcx}^(2SuoE=mNXBo?-@P=sL%(p-^L>Bv{+YAdk_qkXf1DKlZj6_Z)4;W$ zuR<4J!61>uQ*=W1$rMk?GZ4=d?Hl_h#gtG(0+14br1s2_)+t^G3H<8RHtwuJU2S_x zv|s?v#`c8tqDiaQi_%fS0fkI8UQI0_3(h8&0kAo=FOM`FfZTPj$eE5|Q%uN5Ue{74 zWkM<^9v4Z>gtDVpW1t+$hEbJDK!~L!*YN?DmZ(a`xeF`hhGCK?G7Oa)XEX%tgla~# zp1}(ovI%iZTblbtk}JE6xL{nJ2M!pQ`U04RBVJTx*HETl=}?&w9|=VsJ${Z=BMjp- z5+V$rqrVUP<04~yK4y~T1@GTWld>H2hx)^NqX^CpS$^10lf8a)#~c>JP>a87@r&BVS>yzN^W`x=Xx5MzD ziqgf26Na>iVcXOj%9=;yhzhD5KLRz4Kn^Tiy5bRo~I-|+t-2syo&pmmTv@{t(PR`4s=E7Hm?{#fu7A1qs z)HH$2m65Z@+yT#&U6nMFOf|;r=lNxz?*llQ^Xx3DDcAB-R$cFxpr}!}3`bX?i~8@7 zv~d%+@jB*uzk6QuGpxW%;D>8GxVBY}7EqFpxTjZ_AeH==spQ9L;_pR*g^QfxIvHMP z1Ql6U0?eQi)#_9m|9+{G2~=zyHW+9I>e`|%zRoI3L_7zjF=F!TTHss@lfS12UAgL* img0XUV)w>egg14$tCid)E@;>VJlc2-w@K4jyZjGUPcZQS diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/help.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/help.cpython-38.pyc deleted file mode 100644 index 27fe7529f26fb60cbe3e92aef1cb73c32c38d8a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1271 zcmZuwPmk0#6u0w#)7b^7t6^6{RfL4pIZOhALn|SKI;FscL#K!~hgzAjHxo9Ajh!sa zD0As@=*QSS@=f>*zH;I#aA}`2JJl57$j{HuelNe@d(SWS_d^8Z!#|@xe{vA|Xg0e8 zZ0He8^)m>HC@xWjQ;dynl~!e^cCXu|Q@N?z>rUxae(GcN1W}iI?-2EveQu`#^`~eQ ze1b@5g!Q#-rg+&lj1-mNvH_Dn;Z>E@)Tq-JlgZ=h6x6|$^|6#(&W-o(uwe5DrurTP zLn)>xwJ1()YNZafQKE^9>B8 z9b;Mz!>Av(h2(kk;Og|@>c-c-;@{>rVA+m6Py(0}nCfp36hrDDjcdEI)(%FiK?i`3 z(b|29>LUj=_Gu{ZV`RR@@z5V=ihf6(+u5hS6rIz#=XmW=yK{#q$7{dy!1r>1s8jleOyR__grGYGqUvlmNB8lywQg_YlteU zqRb@O9<2`B`n2Y6>TPr* zp;Vd7)lT4GUQtqK71M6sGNrU#sa*S45Z)ts1Ag%NELrf1C33+UR&$yBQWiq|nw*$L zj&pEN&RBhxl*KF&%Vxprd+`s6DjGHx+59xinM#1;`0kJKo%r5ZEa5n2d2Wo!f5ek5 z@x)+{#Zud{t*-+BbrS@_*DcE$-~$|50S>GXJNUplfHkyM*PepQWYdr_cs&Q|0qL0$ zqC-L|PTP`!J|N_Eo0Wz$?0iBfpM&CTlF%vut9{kN3zJLzZIJ_CMkIUP7O)zY@))r6 zdD#(1#^!-AHB$ql06h3CGy4+*34olmO$(8TG*420_eJT;BA#W6ZQDtjC-SvRs>zyG u!8OX%rX!C2ABnx4vrWzW9_bP6;5B8H2DAkG`TYH2asg=?0*3`UROc@ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/install.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/install.cpython-38.pyc deleted file mode 100644 index 8d1c3c1f74e30de956a16ab32f81eb46a59e8a76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12667 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/list.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/list.cpython-38.pyc deleted file mode 100644 index 48a86f65f17d1d83ba53f120e57195fe03ee3c16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8816 zcmcgy+mjsES?}BQ^jvm!wOU;wD|Sa=9goq>Iyk9HRI*U)ShfUJ`=_VP@BZ`)n)dJ1nEkWRxQR#n9SWu~J=BJJN7t!t zght0uzh=k8uNhjyQm3TGtk52oJ7rZbh0d_jsi?XgR)@7tP1Va`eYn(FQgtV643|60 zs$L0KhG#lwhO3=b)vktThijcRT?@>kbHVvzy>sC$jn!EFk;dvl?a=I8WJ|2^Nb7ut zEwdH;USen1Dt@11#yzch_GdV|*3{*)za`>uoCIEfIEs0)i9S>GAL6H$_D5bAN4-EK zXjZ#J7LSsC90|0_Z^Xl)A2C$xdG$@sV~+OHUBA2Q_kvsfhy}c9$Q9NXiPsli!1{^5 z6$bLTUVx5BBz_nM%%gGM-x?R2FU=0~E**9D&&(SlL?zHVI@3UO9RxQz7Bf2~W_9cz zXxlm~G5e9zDYG(jaCL`OSQWpOj8L6wPNG^)qIyoEC3cprVP1osW9RX^`~%I>Ix8UC z1zEd;v*s60ld6k9>T#!+aYxzh#Z~lm!!heeJ-4{HXjj#eoI=9&dEkavA27^zeYfk2 zpoP7HNc5BbUf>Gw1cNaLDcfqTv}i$kUNu~IeZ=FQ`@1=3-b*ij!g1PNeTIf5)Ezv_ zctisuiI(US?a&w)6MbTQ2sBT$fq7s~%z?#pW-yakM9vR@Wz`3gs=mrhUloL&EU0Fz!&FDjZYm^}!(iD+YDn3h|uFz)(cdhhmjhM&DYPsV;2 zM0;+s<0tNpFWg=jZ~39?ce{ZADp~ACaiUO{4~6>#xl9(PCuyfPjw=E#Eh^Ki--^P0 z7dIY_lj)=x*aN;auLax&?WQFy2DQNnUwnm%Gbqwht2N?5`kmWKG6GyDXz?HnfO;3o z#AU%=5XPfn5GC$jzy&Frw)^@%1{5)`x}*Ncjp-!Y&@RHosi99!=B7@owH@=JpU9Hp zm#mSrczIvB3tcya0yFt}oJZQ*JP6W2S_2VB>Ff7!lx_mb1;s_Pb*?{z8ocJ_tKFCK z<20|j*#=i3pf2svEM-?dTijcgyE}0ol+OszXth9m-1+{v&jG4BT3*pgZzyIL3MAto zX$ayM3q}F-Y1Hip!i|aD&u|R4QuJ0YSM**5k{*&03Z{sXwG7AGekcODlIf^ms+!aF zH?sv(omDU!SB-}`UD_#j&X-PiPS*>zp1?KJg>y^aZCVS*%m6~_saXZv#-o7qIZ14&#^KF0PSej8zbYh$#Z?8MQl?XPT*RJ01lZUDrsFMhTCO8eE;XdlDvpx2|$ z4O}+~c;ts0-ORiS>?4x)XrDiibGdlLM<_IX)vygqH#9?6|30=$pSo4Hvo%!y!Y*T7 zv4=CQQ_mB-I&FV!pNxHM+tdDh2TQY_T2@0(*9gJ6d2AQl>ypP*{87D(=M6mKB8o(t z=mXdsl=Q&jF#UrPbg+?rGq-WB`vwo7HDMrg8Y=M*xa))H@rd_nFo_{CeUWLloPL?f zBr6S8S4n4hVL#dhj4}?7c_`#Lcp>ov52Xi%lJu0Pe93b1 z77A(7f>%&O?>cpqb3@GAH0O&{{OYv0N;A%RTjPGny!<8}9V*}>42cE`%`$W%uSMlA z($CEi^t6@T!W~kJQP_ACbrV!TQH`$=h51?nC+SfCzMhz9TX;%%Y&>OVd|<)W>jQ`1 zm}p0p3F@$u)T8lt&{HjXqE+bdnaH`6bFD{~dy6AP*|{D}#KuM?4C z+X|pphg*(YIz?pdGmDB#G?%1P803yqSXNG0TC zQr#)G{C(TzW+R}xl99o3(vS7)y`OZfJ6#W-;Tm0~fp z@+GKLUXWjS`I-9Bb}Sy7N*MV~?4EIAUIzJV82B+B^?nWHtv<~h=R$SOzW@J+&c*_r z`RjD}H>p@S{M+dJi{kK~M7#p0rxB0erd_{z%GNi~_mg7lPohh)^&DLYM8r(Op}2-3 z(GImg0))P$H5hrggvd^; z3`XU;2r`lRDebI828XSF`r{Vs5uTW+OM5(`AVfMjiA15bZsG-*z`R8@1-y5tMhD^7 zQT!DiLH3W(;pmt2^z#2kvpI~^u&RQmi%0xDiit7MdeBY-{elK#gW!|DoR~){;5;f# z%wrfK9V!W9+K~+{rvK=D3f_*&a2HGjZ{`6^7!bC7U^DZeJSiPH6MIlO)(;%)Ruv-( zTA>9ULKgZQv3LLNq&9ITr2z%0#zAFL87v)CQ8ot4{3BLAC`T4^uvc|rdn=PN$}jf zK1$oJWC$7PVqViCb5br;>=LpkC%#DmnhH!P>k}&%0M1EAP>;ypw51ll7b5&NRK9pPu9wyv}`$~Sda;lst&YIE=<6aLAc!>pD;~rwI zxF5+z?giye75@?rE6*wijr_3b#RT8P2>&%2Hi!O0dG=(?qvQxl3;zxcJ7gwQ?CpSB z>a3j1pw!*)LmlKoN8tSy>{sk4TNP`P8A@GniwmW}!I$i^1gzUcvFg9pPH`Lmo= zi=6ldHu@Vpg5IGiTfVAWMqO_h4qUvtZW|3Vcle&#u=WmmEd1Jf`r@bK*qo4&dYJmx zB(3CMXR4Q(0K5`6X6+jM+C=Bq5|!^cG=2}>o)Rti-&s~9VkDTXgqe?&kbMQhW*~QC z@0NH(85IVBLr$eMAaSZ3BWnZUqJCNS8c(X^k{m*ubAPcquka}n zB!#cUgj_eIYhXW)(ZTPa3Bjo6i4ZSBz(tVm^9V~KfRGgsT&UdJDd1hOcf3O#z4L8hBd};3lKBA1% z2*iIK8~r1m+z+K_(Ee{5(H#A&0*_VvqX^G7&!d)J`Q_Am29abjNEQV{L5MsACgEFN zoap2jkb{aW9k6()XGolxb7x{=4lEh-@ABVWH6*aniQGxF7*3XGfxFGUcw9;eoUFXkJ(x9Of0~; z1Qko(?2J7O45PkE)duR#dL5d8wYwO8YixArW1AkK4v`5oL~Mu)MrSh zsC5^8|B2_s-F>dW+zdQVb#3VsL@%Y0ub`qFmrD>;{lK8}B%l^30V*9DGr=MfOZyzKxOp!lMpoBb-PtpK`#khynQl=FSm}j!CRl$9x$Tb<8W- zF((Gob}Re}j*EjHA;LY@BZK9!EhJx(GyWs2f;|}^^TYoH_0!JybM$9t)a|Db&G%_d z<7eJXoj5;p;TSoag?^KSsOCUXe1#Vr0^)dy#rzMuf~A^d|9@=B#a2|L1F z=O0e&BNJ^~&B^NJ**(Nj0$<@!=YN~e%y!Gq!T*7J;Voc>T4iB3wb%Wv3B*VVPBryZ zmhg=@g1O9+_eGMBOdlL`BnAa?wnz@bPlrmv7X!6qtN5N#WD$@XR7sqv)>hLx<-1uL zTb93_eUs?ecT@&MTJOT0R3>H)hs25hgWyt3#6P5BA<`#_#rNVFiCv$u_qiK!itKir zJGm>|soc)L6L5IFU!`|EL?KN-+UGx}=7j`YZ?V?4F$d}#E9kqA2E**84eIRGW{p?p$~~pX24;+iC$=3W?t74dtx5y zs9VUkY6eoD7J=`+lhlyrgxdjaUEYMM_+z|3qa67dnLmb* zDElnKPsrI^%7{#ekd*|Hl1EWUwv@P`mMT(b93r937@;_Hk=B*icsLUHymXTWU!_7h z18-4{T!cl6r|5fuutS*$4Uq;>y9&RKyg5W2`ilDHG_QG?Z2I;%8RG+|#|gg5iIrsv z-N0;F!`F#6LY#=joYO@*=Vp4^_zwf^VZ4X0T%_^j88udX%V>AQe)g&6`DgmuTln+` zaZ~@7fK%)uFV0WG_p2aFC971fJUc(EB2JZ%UtEa)O%RIqurIn9o~yL^XXjUEb24>- zYbqYd3X*?!RLIKz5Nk3oj9d++W)&zE)n+KJ&`w4c(MIMP-5?)RxG3sywV;D5zozD9J diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/search.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/search.cpython-38.pyc deleted file mode 100644 index 984f41ecb0a541a5efa7107ccc3510801fcf48af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4377 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 E7qRWoWdHyG diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/uninstall.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/uninstall.cpython-38.pyc deleted file mode 100644 index 24bfa469acd11fab00ebd6dabceae9fc66e600a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2733 zcmZuzUvJ~a5#J>#l9DA~?oWdRDS~a1YfeB!wMh%K#UThTX^W!8p-JxAhCxcx+?BL8 z|9N+5$BO*YJ0N{=`_T8`?lIq@kNp6B;%lG!6@nDb%u<$>YbbL)J2N{wJM)`aJ{*k( z1fG9gjQ{+P9YX$tlkLZY$vg1s1q_^Unv;UYlp^iqPT|I`rQO^sdU4OvUhWq`99X)S zhebc`TiVYD#ZJ6q=^!5#qj*HguL%!%|1sfx(R<{^yL|8=8SnfTb|YijUQ73Nl{ZEt zvZyO%fOS1f%c_)Fn#-j~%Cr!`4BoAZA}u+}e^Y9c=6PylRsK?`N&)jmohmI7C5{@Y zL?KF}f%`q#sUkm_sj5hFS)#c+wW^HBOj66b6BHGfGuRZ3Ch&J6OJ1Gm4E@}G-1S8N z1PDQ5%1P{S8oS(yJ?_Rm?#2G+WJY<9`;Wso-~kUGlQ{gGcqHz_+57Et56iV<>req=wC8E;Kt4;K0W1$eNk34>Kie!%kFM*Fxzl z1-5_s9nNrZEb^+}+w0c1{Y_Yw57&;}hD^`d$5j`DPuSgcT;FC<)U9IdS)GYucejyb zUA7CBH@_o686AU^u=UV~Tv0R}@1U6Du5fwQ73=WkG1D{|l-c${*FyWE=-L<$ei zp`O+fs24uqJABAT=TLFL?LG1NE=r#|SY3dkYxkGVL@h^?$(E<>aBHGlAEQ|E*29o5 z53XE?>S1OfuF{?Z5&%51wCuS&7A4y@Wg`$V_Fw@R>|)8FOd;W{(Xg;+awBVmrYr!m z<6i4=p$&MDA@BbINzSCy|D zmg++`s}#$sawb(_3zSu}tqR~G7Z%~s*j2j_a)rTHH*mnzjDxnP8^Dvo#I#|O$Wodl zX~V4G37iJ@O}VAeSKqc0)!qbj3T03Md%|2*O+9v7Pm6rkda0W0);T=+lD7RM$?{a| zB>9qj_1Sb$6=JFu0Q$00(_iJXu0NR0@SmE@p_@%1xX066?oYegdMoE*#rfLzmoIKWv2I1tWpuL3PKTy2aQMCpul_d-EAoV_=u`Ulf1bILoOvtfJ@Uy9 z&w7CM-ijVTM?81V{FQ&;s#`06T0TgAFhT_!iAJVHH@7$ShtNf&_ZiK!SZ(> zRSlpWS}qm|gLVd;4`vl~x2=M~ws-rEy}LBKqlI9vU;{_YZ}_i_VK)zTS{H;c8QDwd zRF-qRmpbe^?J#Xjm8{|42FF6}S6Ym(wY$lFBXgdteNzGCr5#3R5kHCG+e`gfCfH5R99o_P4s!RuKP^nIcPKBb;HX@;jwJP83Lhk2&vZx z7hTU8-n5eYkVJ4}))=^r!GZ%y?MsmQD1jcqD;0Gu0RR!%d)j8Qec5VUwt^_jWwf8d z$IrSaDEy>rU--7t)n|ZBe|-JhVn~<8#$R7jm!JlUgd dMT3DmHX3bsw~P4O*p)SQ>Y)Qa$hQ5t-vE$S9gF|~ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/wheel.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__pycache__/wheel.cpython-38.pyc deleted file mode 100644 index f87579f7e05d1ff64acb799efa3a448d58f03645..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5076 zcmai2&6C_l6_+#`&G*Oddi`x9LJ~8BtXiv+dvhK4( zXIdFmbiEu_r?pW{*PXCFZHyYz=BTOZO4ypVM{QlNhMj45)YbJ`xHerMt?PO{+?bvk zoznG2xH&yNI<4!?@XYk==&WgQ>*yRme{7B}yk)Q!YkzF8Hm}_;jV?0lJ)_t82V^&T zrt0`xG7htpd%-k`Mfxt<>UVZH4`27kJDjNTl*LIJ#E}HGev5yY1%gj`l)fHMr+&nG zmTDH&H-(6W+WfiTdqJGZ*RmjFZv;X&WAMh(VDKcq-~!FZe!rxOjV;3+bji-1XU> zAEm?)Z@W>P>Peu9c$x%Z5KZ!xWxSp4L&Gl11T}If?!XNqnfhTkaBo7wX-wTb^@C7e zbtUICy`F8KEWl;)SYC5?(ln9RhC|&p5Zq_rqOL&@4|y~U{glgenD1rjC^1y>G)vMr z4&{wkpB=oM?Tw1iPv30h=PO;4g_KEzb7h|;i zXL1T!Ih$5?&q06ZkF7(SzDF0>>A8JuVdR1;5ycFE(3y8|DFvhq2EKFTs4w2(b2;jN9AB(#L6=2VCbb(o;oK%pFeOc63^(Dx;R-J&K5#6U~sOpD@(9+#Rb?>>^qU_+(NWmq;kKX2(Ic9(TRJh$oS3K z`)^0%Fk>7p%=?0e+?T*|9TN6<7$>9;7a&a#CkO6p2a996>Jm!EQFs7oiI{W&;aeep z#M>(gz5Xc@f>a{NfqNHK8G7YHv_Yw==LJ!adY-BxqLXfYr~>0lC(_KF_qB?svaCa+*ZL{X_~`LYmLH3`K9m(tsUjaI=i zhJGW}E(Uu$zTDwbtxf&Ays!&zBH}Dj4XBjgD+mWUiR40UAWm|Tu5k9s%9cFbRyM3x zD(mjPxJ-Jg=M#`ZKQmR$!_qzk@jf%Y*dOl1Q$7?s9HA=~!<%7{B)5j!^b!4ukG?$~ z?G3|VYnbou`N7LW8KiuX1IQuHzW>}SgJ%cN_mcy35BOw4jYAw~%0=Xd!@?M45u%d= zaS4JA@X8$&hPiGzmTg*wWzvJ%mrk{9(u4Zq`O>N6ZI6{Sa`9l?3H6np1HE|uW0%|J zZ1avz91GW2*xPuKe32*=Mb_}Xj#nxjO^(dDsUw5AYfVt!EuAqCP0U?eypWcU9EvGN zm3isdJO&O<^1iD0XgL^AEd(tw(LdD@NjvFN;BU-{^XX5`dN2|`evr})A4^vFhPQsBBJ|({}uL`mQ zTpSz*989^g5qDV66wgs}MUd&L3P3=IwI+-AqcHZFrq+vix6~$v#NT-wg&J^vV6VPD z+?;jNxGw=ua{Hi9aCW=bR8>HkzJ(}L5&v395?x8UT`m*K)cqu9BGDqNm{GOjUE>b&*#K zA8dqzXaFh$J~gSFFrG}Hl``X7*+kj9aS-Xl5iW#LHszJ7f-59d#E+@1T`aWF<7Pn@ z3A&f-S#L}bFsPbVu|C>%e&O*DB2p2Dg6`p>NkxqcG7i7b-SOf~vaekt2QERh^V%ibJ+r<4QwbxFv zFx6QKjERHxg@eEL`D7yg<;mMw&|GbrfoT9 z*Xn|5QaG@hrfnchJgi#ynf61+CU{3n{!lNVo3$s5+I5|ank=!r(G|h zm&TiQJoZVyAnbmbgxdC3mqXcm%2wslZ8}odftb) z-4#6*&%>3}^TcnlJyp&muE%iZ3|X4U!=ac`Ppb&eV;+X!ex#*q=oO?Yoh?xkCCT!t zrrpM7Dz??Up?i9lNQ&(&g_bda1s+u)Hv!1yUa^7TJU9u?18v^9sjofO69&1bUjAD9 zU<=71{6Hs}g05gN@Re!#y)n=Km3d@xiW0@8rDG(2Iw6yT1<;Wjj2@E%)}] list - %prog [] [--editor ] edit - - %prog [] get name - %prog [] set name value - %prog [] unset name - """ - - summary = "Manage local and global configuration." - - def __init__(self, *args, **kwargs): - super(ConfigurationCommand, self).__init__(*args, **kwargs) - - self.configuration = None - - self.cmd_opts.add_option( - '--editor', - dest='editor', - action='store', - default=None, - help=( - 'Editor to use to edit the file. Uses VISUAL or EDITOR ' - 'environment variables if not provided.' - ) - ) - - self.cmd_opts.add_option( - '--global', - dest='global_file', - action='store_true', - default=False, - help='Use the system-wide configuration file only' - ) - - self.cmd_opts.add_option( - '--user', - dest='user_file', - action='store_true', - default=False, - help='Use the user configuration file only' - ) - - self.cmd_opts.add_option( - '--venv', - dest='venv_file', - action='store_true', - default=False, - help='Use the virtualenv configuration file only' - ) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - handlers = { - "list": self.list_values, - "edit": self.open_in_editor, - "get": self.get_name, - "set": self.set_name_value, - "unset": self.unset_name - } - - # Determine action - if not args or args[0] not in handlers: - logger.error("Need an action ({}) to perform.".format( - ", ".join(sorted(handlers))) - ) - return ERROR - - action = args[0] - - # Determine which configuration files are to be loaded - # Depends on whether the command is modifying. - try: - load_only = self._determine_file( - options, need_value=(action in ["get", "set", "unset", "edit"]) - ) - except PipError as e: - logger.error(e.args[0]) - return ERROR - - # Load a new configuration - self.configuration = Configuration( - isolated=options.isolated_mode, load_only=load_only - ) - self.configuration.load() - - # Error handling happens here, not in the action-handlers. - try: - handlers[action](options, args[1:]) - except PipError as e: - logger.error(e.args[0]) - return ERROR - - return SUCCESS - - def _determine_file(self, options, need_value): - file_options = { - kinds.USER: options.user_file, - kinds.GLOBAL: options.global_file, - kinds.VENV: options.venv_file - } - - if sum(file_options.values()) == 0: - if not need_value: - return None - # Default to user, unless there's a virtualenv file. - elif os.path.exists(venv_config_file): - return kinds.VENV - else: - return kinds.USER - elif sum(file_options.values()) == 1: - # There's probably a better expression for this. - return [key for key in file_options if file_options[key]][0] - - raise PipError( - "Need exactly one file to operate upon " - "(--user, --venv, --global) to perform." - ) - - def list_values(self, options, args): - self._get_n_args(args, "list", n=0) - - for key, value in sorted(self.configuration.items()): - logger.info("%s=%r", key, value) - - def get_name(self, options, args): - key = self._get_n_args(args, "get [name]", n=1) - value = self.configuration.get_value(key) - - logger.info("%s", value) - - def set_name_value(self, options, args): - key, value = self._get_n_args(args, "set [name] [value]", n=2) - self.configuration.set_value(key, value) - - self._save_configuration() - - def unset_name(self, options, args): - key = self._get_n_args(args, "unset [name]", n=1) - self.configuration.unset_value(key) - - self._save_configuration() - - def open_in_editor(self, options, args): - editor = self._determine_editor(options) - - fname = self.configuration.get_file_to_edit() - if fname is None: - raise PipError("Could not determine appropriate file.") - - try: - subprocess.check_call([editor, fname]) - except subprocess.CalledProcessError as e: - raise PipError( - "Editor Subprocess exited with exit code {}" - .format(e.returncode) - ) - - def _get_n_args(self, args, example, n): - """Helper to make sure the command got the right number of arguments - """ - if len(args) != n: - msg = ( - 'Got unexpected number of arguments, expected {}. ' - '(example: "{} config {}")' - ).format(n, get_prog(), example) - raise PipError(msg) - - if n == 1: - return args[0] - else: - return args - - def _save_configuration(self): - # We successfully ran a modifying command. Need to save the - # configuration. - try: - self.configuration.save() - except Exception: - logger.error( - "Unable to save configuration. Please report this as a bug.", - exc_info=1 - ) - raise PipError("Internal Error.") - - def _determine_editor(self, options): - if options.editor is not None: - return options.editor - elif "VISUAL" in os.environ: - return os.environ["VISUAL"] - elif "EDITOR" in os.environ: - return os.environ["EDITOR"] - else: - raise PipError("Could not determine editor to use.") diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/download.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/download.py deleted file mode 100644 index a57e4bc..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/download.py +++ /dev/null @@ -1,176 +0,0 @@ -from __future__ import absolute_import - -import logging -import os - -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import RequirementCommand -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req import RequirementSet -from pip._internal.req.req_tracker import RequirementTracker -from pip._internal.resolve import Resolver -from pip._internal.utils.filesystem import check_path_owner -from pip._internal.utils.misc import ensure_dir, normalize_path -from pip._internal.utils.temp_dir import TempDirectory - -logger = logging.getLogger(__name__) - - -class DownloadCommand(RequirementCommand): - """ - Download packages from: - - - PyPI (and other indexes) using requirement specifiers. - - VCS project urls. - - Local project directories. - - Local or remote source archives. - - pip also supports downloading from "requirements files", which provide - an easy way to specify a whole environment to be downloaded. - """ - name = 'download' - - usage = """ - %prog [options] [package-index-options] ... - %prog [options] -r [package-index-options] ... - %prog [options] ... - %prog [options] ... - %prog [options] ...""" - - summary = 'Download packages.' - - def __init__(self, *args, **kw): - super(DownloadCommand, self).__init__(*args, **kw) - - cmd_opts = self.cmd_opts - - cmd_opts.add_option(cmdoptions.constraints()) - cmd_opts.add_option(cmdoptions.requirements()) - cmd_opts.add_option(cmdoptions.build_dir()) - cmd_opts.add_option(cmdoptions.no_deps()) - cmd_opts.add_option(cmdoptions.global_options()) - cmd_opts.add_option(cmdoptions.no_binary()) - cmd_opts.add_option(cmdoptions.only_binary()) - cmd_opts.add_option(cmdoptions.prefer_binary()) - cmd_opts.add_option(cmdoptions.src()) - cmd_opts.add_option(cmdoptions.pre()) - cmd_opts.add_option(cmdoptions.no_clean()) - cmd_opts.add_option(cmdoptions.require_hashes()) - cmd_opts.add_option(cmdoptions.progress_bar()) - cmd_opts.add_option(cmdoptions.no_build_isolation()) - cmd_opts.add_option(cmdoptions.use_pep517()) - cmd_opts.add_option(cmdoptions.no_use_pep517()) - - cmd_opts.add_option( - '-d', '--dest', '--destination-dir', '--destination-directory', - dest='download_dir', - metavar='dir', - default=os.curdir, - help=("Download packages into ."), - ) - - cmd_opts.add_option(cmdoptions.platform()) - cmd_opts.add_option(cmdoptions.python_version()) - cmd_opts.add_option(cmdoptions.implementation()) - cmd_opts.add_option(cmdoptions.abi()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, cmd_opts) - - def run(self, options, args): - options.ignore_installed = True - # editable doesn't really make sense for `pip download`, but the bowels - # of the RequirementSet code require that property. - options.editables = [] - - if options.python_version: - python_versions = [options.python_version] - else: - python_versions = None - - cmdoptions.check_dist_restriction(options) - - options.src_dir = os.path.abspath(options.src_dir) - options.download_dir = normalize_path(options.download_dir) - - ensure_dir(options.download_dir) - - with self._build_session(options) as session: - finder = self._build_package_finder( - options=options, - session=session, - platform=options.platform, - python_versions=python_versions, - abi=options.abi, - implementation=options.implementation, - ) - build_delete = (not (options.no_clean or options.build_dir)) - if options.cache_dir and not check_path_owner(options.cache_dir): - logger.warning( - "The directory '%s' or its parent directory is not owned " - "by the current user and caching wheels has been " - "disabled. check the permissions and owner of that " - "directory. If executing pip with sudo, you may want " - "sudo's -H flag.", - options.cache_dir, - ) - options.cache_dir = None - - with RequirementTracker() as req_tracker, TempDirectory( - options.build_dir, delete=build_delete, kind="download" - ) as directory: - - requirement_set = RequirementSet( - require_hashes=options.require_hashes, - ) - self.populate_requirement_set( - requirement_set, - args, - options, - finder, - session, - self.name, - None - ) - - preparer = RequirementPreparer( - build_dir=directory.path, - src_dir=options.src_dir, - download_dir=options.download_dir, - wheel_download_dir=None, - progress_bar=options.progress_bar, - build_isolation=options.build_isolation, - req_tracker=req_tracker, - ) - - resolver = Resolver( - preparer=preparer, - finder=finder, - session=session, - wheel_cache=None, - use_user_site=False, - upgrade_strategy="to-satisfy-only", - force_reinstall=False, - ignore_dependencies=options.ignore_dependencies, - ignore_requires_python=False, - ignore_installed=True, - isolated=options.isolated_mode, - ) - resolver.resolve(requirement_set) - - downloaded = ' '.join([ - req.name for req in requirement_set.successfully_downloaded - ]) - if downloaded: - logger.info('Successfully downloaded %s', downloaded) - - # Clean up - if not options.no_clean: - requirement_set.cleanup_files() - - return requirement_set diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/freeze.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/freeze.py deleted file mode 100644 index dc9c53a..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/freeze.py +++ /dev/null @@ -1,96 +0,0 @@ -from __future__ import absolute_import - -import sys - -from pip._internal.cache import WheelCache -from pip._internal.cli.base_command import Command -from pip._internal.models.format_control import FormatControl -from pip._internal.operations.freeze import freeze -from pip._internal.utils.compat import stdlib_pkgs - -DEV_PKGS = {'pip', 'setuptools', 'distribute', 'wheel'} - - -class FreezeCommand(Command): - """ - Output installed packages in requirements format. - - packages are listed in a case-insensitive sorted order. - """ - name = 'freeze' - usage = """ - %prog [options]""" - summary = 'Output installed packages in requirements format.' - log_streams = ("ext://sys.stderr", "ext://sys.stderr") - - def __init__(self, *args, **kw): - super(FreezeCommand, self).__init__(*args, **kw) - - self.cmd_opts.add_option( - '-r', '--requirement', - dest='requirements', - action='append', - default=[], - metavar='file', - help="Use the order in the given requirements file and its " - "comments when generating output. This option can be " - "used multiple times.") - self.cmd_opts.add_option( - '-f', '--find-links', - dest='find_links', - action='append', - default=[], - metavar='URL', - help='URL for finding packages, which will be added to the ' - 'output.') - self.cmd_opts.add_option( - '-l', '--local', - dest='local', - action='store_true', - default=False, - help='If in a virtualenv that has global access, do not output ' - 'globally-installed packages.') - self.cmd_opts.add_option( - '--user', - dest='user', - action='store_true', - default=False, - help='Only output packages installed in user-site.') - self.cmd_opts.add_option( - '--all', - dest='freeze_all', - action='store_true', - help='Do not skip these packages in the output:' - ' %s' % ', '.join(DEV_PKGS)) - self.cmd_opts.add_option( - '--exclude-editable', - dest='exclude_editable', - action='store_true', - help='Exclude editable package from output.') - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - format_control = FormatControl(set(), set()) - wheel_cache = WheelCache(options.cache_dir, format_control) - skip = set(stdlib_pkgs) - if not options.freeze_all: - skip.update(DEV_PKGS) - - freeze_kwargs = dict( - requirement=options.requirements, - find_links=options.find_links, - local_only=options.local, - user_only=options.user, - skip_regex=options.skip_requirements_regex, - isolated=options.isolated_mode, - wheel_cache=wheel_cache, - skip=skip, - exclude_editable=options.exclude_editable, - ) - - try: - for line in freeze(**freeze_kwargs): - sys.stdout.write(line + '\n') - finally: - wheel_cache.cleanup() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/hash.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/hash.py deleted file mode 100644 index 423440e..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/hash.py +++ /dev/null @@ -1,57 +0,0 @@ -from __future__ import absolute_import - -import hashlib -import logging -import sys - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR -from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES -from pip._internal.utils.misc import read_chunks - -logger = logging.getLogger(__name__) - - -class HashCommand(Command): - """ - Compute a hash of a local package archive. - - These can be used with --hash in a requirements file to do repeatable - installs. - - """ - name = 'hash' - usage = '%prog [options] ...' - summary = 'Compute hashes of package archives.' - ignore_require_venv = True - - def __init__(self, *args, **kw): - super(HashCommand, self).__init__(*args, **kw) - self.cmd_opts.add_option( - '-a', '--algorithm', - dest='algorithm', - choices=STRONG_HASHES, - action='store', - default=FAVORITE_HASH, - help='The hash algorithm to use: one of %s' % - ', '.join(STRONG_HASHES)) - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - if not args: - self.parser.print_usage(sys.stderr) - return ERROR - - algorithm = options.algorithm - for path in args: - logger.info('%s:\n--hash=%s:%s', - path, algorithm, _hash_of_file(path, algorithm)) - - -def _hash_of_file(path, algorithm): - """Return the hash digest of a file.""" - with open(path, 'rb') as archive: - hash = hashlib.new(algorithm) - for chunk in read_chunks(archive): - hash.update(chunk) - return hash.hexdigest() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/help.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/help.py deleted file mode 100644 index 49a81cb..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/help.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import absolute_import - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.exceptions import CommandError - - -class HelpCommand(Command): - """Show help for commands""" - name = 'help' - usage = """ - %prog """ - summary = 'Show help for commands.' - ignore_require_venv = True - - def run(self, options, args): - from pip._internal.commands import commands_dict, get_similar_commands - - try: - # 'pip help' with no args is handled by pip.__init__.parseopt() - cmd_name = args[0] # the command we need help for - except IndexError: - return SUCCESS - - if cmd_name not in commands_dict: - guess = get_similar_commands(cmd_name) - - msg = ['unknown command "%s"' % cmd_name] - if guess: - msg.append('maybe you meant "%s"' % guess) - - raise CommandError(' - '.join(msg)) - - command = commands_dict[cmd_name]() - command.parser.print_help() - - return SUCCESS diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/install.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/install.py deleted file mode 100644 index 1c244d2..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/install.py +++ /dev/null @@ -1,566 +0,0 @@ -from __future__ import absolute_import - -import errno -import logging -import operator -import os -import shutil -from optparse import SUPPRESS_HELP - -from pip._vendor import pkg_resources - -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import RequirementCommand -from pip._internal.cli.status_codes import ERROR -from pip._internal.exceptions import ( - CommandError, InstallationError, PreviousBuildDirError, -) -from pip._internal.locations import distutils_scheme, virtualenv_no_global -from pip._internal.operations.check import check_install_conflicts -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req import RequirementSet, install_given_reqs -from pip._internal.req.req_tracker import RequirementTracker -from pip._internal.resolve import Resolver -from pip._internal.utils.filesystem import check_path_owner -from pip._internal.utils.misc import ( - ensure_dir, get_installed_version, - protect_pip_from_modification_on_windows, -) -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.wheel import WheelBuilder - -logger = logging.getLogger(__name__) - - -class InstallCommand(RequirementCommand): - """ - Install packages from: - - - PyPI (and other indexes) using requirement specifiers. - - VCS project urls. - - Local project directories. - - Local or remote source archives. - - pip also supports installing from "requirements files", which provide - an easy way to specify a whole environment to be installed. - """ - name = 'install' - - usage = """ - %prog [options] [package-index-options] ... - %prog [options] -r [package-index-options] ... - %prog [options] [-e] ... - %prog [options] [-e] ... - %prog [options] ...""" - - summary = 'Install packages.' - - def __init__(self, *args, **kw): - super(InstallCommand, self).__init__(*args, **kw) - - cmd_opts = self.cmd_opts - - cmd_opts.add_option(cmdoptions.requirements()) - cmd_opts.add_option(cmdoptions.constraints()) - cmd_opts.add_option(cmdoptions.no_deps()) - cmd_opts.add_option(cmdoptions.pre()) - - cmd_opts.add_option(cmdoptions.editable()) - cmd_opts.add_option( - '-t', '--target', - dest='target_dir', - metavar='dir', - default=None, - help='Install packages into . ' - 'By default this will not replace existing files/folders in ' - '. Use --upgrade to replace existing packages in ' - 'with new versions.' - ) - cmd_opts.add_option(cmdoptions.platform()) - cmd_opts.add_option(cmdoptions.python_version()) - cmd_opts.add_option(cmdoptions.implementation()) - cmd_opts.add_option(cmdoptions.abi()) - - cmd_opts.add_option( - '--user', - dest='use_user_site', - action='store_true', - help="Install to the Python user install directory for your " - "platform. Typically ~/.local/, or %APPDATA%\\Python on " - "Windows. (See the Python documentation for site.USER_BASE " - "for full details.)") - cmd_opts.add_option( - '--no-user', - dest='use_user_site', - action='store_false', - help=SUPPRESS_HELP) - cmd_opts.add_option( - '--root', - dest='root_path', - metavar='dir', - default=None, - help="Install everything relative to this alternate root " - "directory.") - cmd_opts.add_option( - '--prefix', - dest='prefix_path', - metavar='dir', - default=None, - help="Installation prefix where lib, bin and other top-level " - "folders are placed") - - cmd_opts.add_option(cmdoptions.build_dir()) - - cmd_opts.add_option(cmdoptions.src()) - - cmd_opts.add_option( - '-U', '--upgrade', - dest='upgrade', - action='store_true', - help='Upgrade all specified packages to the newest available ' - 'version. The handling of dependencies depends on the ' - 'upgrade-strategy used.' - ) - - cmd_opts.add_option( - '--upgrade-strategy', - dest='upgrade_strategy', - default='only-if-needed', - choices=['only-if-needed', 'eager'], - help='Determines how dependency upgrading should be handled ' - '[default: %default]. ' - '"eager" - dependencies are upgraded regardless of ' - 'whether the currently installed version satisfies the ' - 'requirements of the upgraded package(s). ' - '"only-if-needed" - are upgraded only when they do not ' - 'satisfy the requirements of the upgraded package(s).' - ) - - cmd_opts.add_option( - '--force-reinstall', - dest='force_reinstall', - action='store_true', - help='Reinstall all packages even if they are already ' - 'up-to-date.') - - cmd_opts.add_option( - '-I', '--ignore-installed', - dest='ignore_installed', - action='store_true', - help='Ignore the installed packages (reinstalling instead).') - - cmd_opts.add_option(cmdoptions.ignore_requires_python()) - cmd_opts.add_option(cmdoptions.no_build_isolation()) - cmd_opts.add_option(cmdoptions.use_pep517()) - cmd_opts.add_option(cmdoptions.no_use_pep517()) - - cmd_opts.add_option(cmdoptions.install_options()) - cmd_opts.add_option(cmdoptions.global_options()) - - cmd_opts.add_option( - "--compile", - action="store_true", - dest="compile", - default=True, - help="Compile Python source files to bytecode", - ) - - cmd_opts.add_option( - "--no-compile", - action="store_false", - dest="compile", - help="Do not compile Python source files to bytecode", - ) - - cmd_opts.add_option( - "--no-warn-script-location", - action="store_false", - dest="warn_script_location", - default=True, - help="Do not warn when installing scripts outside PATH", - ) - cmd_opts.add_option( - "--no-warn-conflicts", - action="store_false", - dest="warn_about_conflicts", - default=True, - help="Do not warn about broken dependencies", - ) - - cmd_opts.add_option(cmdoptions.no_binary()) - cmd_opts.add_option(cmdoptions.only_binary()) - cmd_opts.add_option(cmdoptions.prefer_binary()) - cmd_opts.add_option(cmdoptions.no_clean()) - cmd_opts.add_option(cmdoptions.require_hashes()) - cmd_opts.add_option(cmdoptions.progress_bar()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, cmd_opts) - - def run(self, options, args): - cmdoptions.check_install_build_global(options) - upgrade_strategy = "to-satisfy-only" - if options.upgrade: - upgrade_strategy = options.upgrade_strategy - - if options.build_dir: - options.build_dir = os.path.abspath(options.build_dir) - - cmdoptions.check_dist_restriction(options, check_target=True) - - if options.python_version: - python_versions = [options.python_version] - else: - python_versions = None - - options.src_dir = os.path.abspath(options.src_dir) - install_options = options.install_options or [] - if options.use_user_site: - if options.prefix_path: - raise CommandError( - "Can not combine '--user' and '--prefix' as they imply " - "different installation locations" - ) - if virtualenv_no_global(): - raise InstallationError( - "Can not perform a '--user' install. User site-packages " - "are not visible in this virtualenv." - ) - install_options.append('--user') - install_options.append('--prefix=') - - target_temp_dir = TempDirectory(kind="target") - if options.target_dir: - options.ignore_installed = True - options.target_dir = os.path.abspath(options.target_dir) - if (os.path.exists(options.target_dir) and not - os.path.isdir(options.target_dir)): - raise CommandError( - "Target path exists but is not a directory, will not " - "continue." - ) - - # Create a target directory for using with the target option - target_temp_dir.create() - install_options.append('--home=' + target_temp_dir.path) - - global_options = options.global_options or [] - - with self._build_session(options) as session: - finder = self._build_package_finder( - options=options, - session=session, - platform=options.platform, - python_versions=python_versions, - abi=options.abi, - implementation=options.implementation, - ) - build_delete = (not (options.no_clean or options.build_dir)) - wheel_cache = WheelCache(options.cache_dir, options.format_control) - - if options.cache_dir and not check_path_owner(options.cache_dir): - logger.warning( - "The directory '%s' or its parent directory is not owned " - "by the current user and caching wheels has been " - "disabled. check the permissions and owner of that " - "directory. If executing pip with sudo, you may want " - "sudo's -H flag.", - options.cache_dir, - ) - options.cache_dir = None - - with RequirementTracker() as req_tracker, TempDirectory( - options.build_dir, delete=build_delete, kind="install" - ) as directory: - requirement_set = RequirementSet( - require_hashes=options.require_hashes, - check_supported_wheels=not options.target_dir, - ) - - try: - self.populate_requirement_set( - requirement_set, args, options, finder, session, - self.name, wheel_cache - ) - preparer = RequirementPreparer( - build_dir=directory.path, - src_dir=options.src_dir, - download_dir=None, - wheel_download_dir=None, - progress_bar=options.progress_bar, - build_isolation=options.build_isolation, - req_tracker=req_tracker, - ) - - resolver = Resolver( - preparer=preparer, - finder=finder, - session=session, - wheel_cache=wheel_cache, - use_user_site=options.use_user_site, - upgrade_strategy=upgrade_strategy, - force_reinstall=options.force_reinstall, - ignore_dependencies=options.ignore_dependencies, - ignore_requires_python=options.ignore_requires_python, - ignore_installed=options.ignore_installed, - isolated=options.isolated_mode, - use_pep517=options.use_pep517 - ) - resolver.resolve(requirement_set) - - protect_pip_from_modification_on_windows( - modifying_pip=requirement_set.has_requirement("pip") - ) - - # Consider legacy and PEP517-using requirements separately - legacy_requirements = [] - pep517_requirements = [] - for req in requirement_set.requirements.values(): - if req.use_pep517: - pep517_requirements.append(req) - else: - legacy_requirements.append(req) - - # We don't build wheels for legacy requirements if we - # don't have wheel installed or we don't have a cache dir - try: - import wheel # noqa: F401 - build_legacy = bool(options.cache_dir) - except ImportError: - build_legacy = False - - wb = WheelBuilder( - finder, preparer, wheel_cache, - build_options=[], global_options=[], - ) - - # Always build PEP 517 requirements - build_failures = wb.build( - pep517_requirements, - session=session, autobuilding=True - ) - - if build_legacy: - # We don't care about failures building legacy - # requirements, as we'll fall through to a direct - # install for those. - wb.build( - legacy_requirements, - session=session, autobuilding=True - ) - - # If we're using PEP 517, we cannot do a direct install - # so we fail here. - if build_failures: - raise InstallationError( - "Could not build wheels for {} which use" - " PEP 517 and cannot be installed directly".format( - ", ".join(r.name for r in build_failures))) - - to_install = resolver.get_installation_order( - requirement_set - ) - - # Consistency Checking of the package set we're installing. - should_warn_about_conflicts = ( - not options.ignore_dependencies and - options.warn_about_conflicts - ) - if should_warn_about_conflicts: - self._warn_about_conflicts(to_install) - - # Don't warn about script install locations if - # --target has been specified - warn_script_location = options.warn_script_location - if options.target_dir: - warn_script_location = False - - installed = install_given_reqs( - to_install, - install_options, - global_options, - root=options.root_path, - home=target_temp_dir.path, - prefix=options.prefix_path, - pycompile=options.compile, - warn_script_location=warn_script_location, - use_user_site=options.use_user_site, - ) - - lib_locations = get_lib_location_guesses( - user=options.use_user_site, - home=target_temp_dir.path, - root=options.root_path, - prefix=options.prefix_path, - isolated=options.isolated_mode, - ) - working_set = pkg_resources.WorkingSet(lib_locations) - - reqs = sorted(installed, key=operator.attrgetter('name')) - items = [] - for req in reqs: - item = req.name - try: - installed_version = get_installed_version( - req.name, working_set=working_set - ) - if installed_version: - item += '-' + installed_version - except Exception: - pass - items.append(item) - installed = ' '.join(items) - if installed: - logger.info('Successfully installed %s', installed) - except EnvironmentError as error: - show_traceback = (self.verbosity >= 1) - - message = create_env_error_message( - error, show_traceback, options.use_user_site, - ) - logger.error(message, exc_info=show_traceback) - - return ERROR - except PreviousBuildDirError: - options.no_clean = True - raise - finally: - # Clean up - if not options.no_clean: - requirement_set.cleanup_files() - wheel_cache.cleanup() - - if options.target_dir: - self._handle_target_dir( - options.target_dir, target_temp_dir, options.upgrade - ) - return requirement_set - - def _handle_target_dir(self, target_dir, target_temp_dir, upgrade): - ensure_dir(target_dir) - - # Checking both purelib and platlib directories for installed - # packages to be moved to target directory - lib_dir_list = [] - - with target_temp_dir: - # Checking both purelib and platlib directories for installed - # packages to be moved to target directory - scheme = distutils_scheme('', home=target_temp_dir.path) - purelib_dir = scheme['purelib'] - platlib_dir = scheme['platlib'] - data_dir = scheme['data'] - - if os.path.exists(purelib_dir): - lib_dir_list.append(purelib_dir) - if os.path.exists(platlib_dir) and platlib_dir != purelib_dir: - lib_dir_list.append(platlib_dir) - if os.path.exists(data_dir): - lib_dir_list.append(data_dir) - - for lib_dir in lib_dir_list: - for item in os.listdir(lib_dir): - if lib_dir == data_dir: - ddir = os.path.join(data_dir, item) - if any(s.startswith(ddir) for s in lib_dir_list[:-1]): - continue - target_item_dir = os.path.join(target_dir, item) - if os.path.exists(target_item_dir): - if not upgrade: - logger.warning( - 'Target directory %s already exists. Specify ' - '--upgrade to force replacement.', - target_item_dir - ) - continue - if os.path.islink(target_item_dir): - logger.warning( - 'Target directory %s already exists and is ' - 'a link. Pip will not automatically replace ' - 'links, please remove if replacement is ' - 'desired.', - target_item_dir - ) - continue - if os.path.isdir(target_item_dir): - shutil.rmtree(target_item_dir) - else: - os.remove(target_item_dir) - - shutil.move( - os.path.join(lib_dir, item), - target_item_dir - ) - - def _warn_about_conflicts(self, to_install): - try: - package_set, _dep_info = check_install_conflicts(to_install) - except Exception: - logger.error("Error checking for conflicts.", exc_info=True) - return - missing, conflicting = _dep_info - - # NOTE: There is some duplication here from pip check - for project_name in missing: - version = package_set[project_name][0] - for dependency in missing[project_name]: - logger.critical( - "%s %s requires %s, which is not installed.", - project_name, version, dependency[1], - ) - - for project_name in conflicting: - version = package_set[project_name][0] - for dep_name, dep_version, req in conflicting[project_name]: - logger.critical( - "%s %s has requirement %s, but you'll have %s %s which is " - "incompatible.", - project_name, version, req, dep_name, dep_version, - ) - - -def get_lib_location_guesses(*args, **kwargs): - scheme = distutils_scheme('', *args, **kwargs) - return [scheme['purelib'], scheme['platlib']] - - -def create_env_error_message(error, show_traceback, using_user_site): - """Format an error message for an EnvironmentError - - It may occur anytime during the execution of the install command. - """ - parts = [] - - # Mention the error if we are not going to show a traceback - parts.append("Could not install packages due to an EnvironmentError") - if not show_traceback: - parts.append(": ") - parts.append(str(error)) - else: - parts.append(".") - - # Spilt the error indication from a helper message (if any) - parts[-1] += "\n" - - # Suggest useful actions to the user: - # (1) using user site-packages or (2) verifying the permissions - if error.errno == errno.EACCES: - user_option_part = "Consider using the `--user` option" - permissions_part = "Check the permissions" - - if not using_user_site: - parts.extend([ - user_option_part, " or ", - permissions_part.lower(), - ]) - else: - parts.append(permissions_part) - parts.append(".\n") - - return "".join(parts).strip() + "\n" diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/list.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/list.py deleted file mode 100644 index a640274..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/list.py +++ /dev/null @@ -1,301 +0,0 @@ -from __future__ import absolute_import - -import json -import logging - -from pip._vendor import six -from pip._vendor.six.moves import zip_longest - -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import Command -from pip._internal.exceptions import CommandError -from pip._internal.index import PackageFinder -from pip._internal.utils.misc import ( - dist_is_editable, get_installed_distributions, -) -from pip._internal.utils.packaging import get_installer - -logger = logging.getLogger(__name__) - - -class ListCommand(Command): - """ - List installed packages, including editables. - - Packages are listed in a case-insensitive sorted order. - """ - name = 'list' - usage = """ - %prog [options]""" - summary = 'List installed packages.' - - def __init__(self, *args, **kw): - super(ListCommand, self).__init__(*args, **kw) - - cmd_opts = self.cmd_opts - - cmd_opts.add_option( - '-o', '--outdated', - action='store_true', - default=False, - help='List outdated packages') - cmd_opts.add_option( - '-u', '--uptodate', - action='store_true', - default=False, - help='List uptodate packages') - cmd_opts.add_option( - '-e', '--editable', - action='store_true', - default=False, - help='List editable projects.') - cmd_opts.add_option( - '-l', '--local', - action='store_true', - default=False, - help=('If in a virtualenv that has global access, do not list ' - 'globally-installed packages.'), - ) - self.cmd_opts.add_option( - '--user', - dest='user', - action='store_true', - default=False, - help='Only output packages installed in user-site.') - - cmd_opts.add_option( - '--pre', - action='store_true', - default=False, - help=("Include pre-release and development versions. By default, " - "pip only finds stable versions."), - ) - - cmd_opts.add_option( - '--format', - action='store', - dest='list_format', - default="columns", - choices=('columns', 'freeze', 'json'), - help="Select the output format among: columns (default), freeze, " - "or json", - ) - - cmd_opts.add_option( - '--not-required', - action='store_true', - dest='not_required', - help="List packages that are not dependencies of " - "installed packages.", - ) - - cmd_opts.add_option( - '--exclude-editable', - action='store_false', - dest='include_editable', - help='Exclude editable package from output.', - ) - cmd_opts.add_option( - '--include-editable', - action='store_true', - dest='include_editable', - help='Include editable package from output.', - default=True, - ) - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, self.parser - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, cmd_opts) - - def _build_package_finder(self, options, index_urls, session): - """ - Create a package finder appropriate to this list command. - """ - return PackageFinder( - find_links=options.find_links, - index_urls=index_urls, - allow_all_prereleases=options.pre, - trusted_hosts=options.trusted_hosts, - session=session, - ) - - def run(self, options, args): - if options.outdated and options.uptodate: - raise CommandError( - "Options --outdated and --uptodate cannot be combined.") - - packages = get_installed_distributions( - local_only=options.local, - user_only=options.user, - editables_only=options.editable, - include_editables=options.include_editable, - ) - - # get_not_required must be called firstly in order to find and - # filter out all dependencies correctly. Otherwise a package - # can't be identified as requirement because some parent packages - # could be filtered out before. - if options.not_required: - packages = self.get_not_required(packages, options) - - if options.outdated: - packages = self.get_outdated(packages, options) - elif options.uptodate: - packages = self.get_uptodate(packages, options) - - self.output_package_listing(packages, options) - - def get_outdated(self, packages, options): - return [ - dist for dist in self.iter_packages_latest_infos(packages, options) - if dist.latest_version > dist.parsed_version - ] - - def get_uptodate(self, packages, options): - return [ - dist for dist in self.iter_packages_latest_infos(packages, options) - if dist.latest_version == dist.parsed_version - ] - - def get_not_required(self, packages, options): - dep_keys = set() - for dist in packages: - dep_keys.update(requirement.key for requirement in dist.requires()) - return {pkg for pkg in packages if pkg.key not in dep_keys} - - def iter_packages_latest_infos(self, packages, options): - index_urls = [options.index_url] + options.extra_index_urls - if options.no_index: - logger.debug('Ignoring indexes: %s', ','.join(index_urls)) - index_urls = [] - - with self._build_session(options) as session: - finder = self._build_package_finder(options, index_urls, session) - - for dist in packages: - typ = 'unknown' - all_candidates = finder.find_all_candidates(dist.key) - if not options.pre: - # Remove prereleases - all_candidates = [candidate for candidate in all_candidates - if not candidate.version.is_prerelease] - - if not all_candidates: - continue - best_candidate = max(all_candidates, - key=finder._candidate_sort_key) - remote_version = best_candidate.version - if best_candidate.location.is_wheel: - typ = 'wheel' - else: - typ = 'sdist' - # This is dirty but makes the rest of the code much cleaner - dist.latest_version = remote_version - dist.latest_filetype = typ - yield dist - - def output_package_listing(self, packages, options): - packages = sorted( - packages, - key=lambda dist: dist.project_name.lower(), - ) - if options.list_format == 'columns' and packages: - data, header = format_for_columns(packages, options) - self.output_package_listing_columns(data, header) - elif options.list_format == 'freeze': - for dist in packages: - if options.verbose >= 1: - logger.info("%s==%s (%s)", dist.project_name, - dist.version, dist.location) - else: - logger.info("%s==%s", dist.project_name, dist.version) - elif options.list_format == 'json': - logger.info(format_for_json(packages, options)) - - def output_package_listing_columns(self, data, header): - # insert the header first: we need to know the size of column names - if len(data) > 0: - data.insert(0, header) - - pkg_strings, sizes = tabulate(data) - - # Create and add a separator. - if len(data) > 0: - pkg_strings.insert(1, " ".join(map(lambda x: '-' * x, sizes))) - - for val in pkg_strings: - logger.info(val) - - -def tabulate(vals): - # From pfmoore on GitHub: - # https://github.com/pypa/pip/issues/3651#issuecomment-216932564 - assert len(vals) > 0 - - sizes = [0] * max(len(x) for x in vals) - for row in vals: - sizes = [max(s, len(str(c))) for s, c in zip_longest(sizes, row)] - - result = [] - for row in vals: - display = " ".join([str(c).ljust(s) if c is not None else '' - for s, c in zip_longest(sizes, row)]) - result.append(display) - - return result, sizes - - -def format_for_columns(pkgs, options): - """ - Convert the package data into something usable - by output_package_listing_columns. - """ - running_outdated = options.outdated - # Adjust the header for the `pip list --outdated` case. - if running_outdated: - header = ["Package", "Version", "Latest", "Type"] - else: - header = ["Package", "Version"] - - data = [] - if options.verbose >= 1 or any(dist_is_editable(x) for x in pkgs): - header.append("Location") - if options.verbose >= 1: - header.append("Installer") - - for proj in pkgs: - # if we're working on the 'outdated' list, separate out the - # latest_version and type - row = [proj.project_name, proj.version] - - if running_outdated: - row.append(proj.latest_version) - row.append(proj.latest_filetype) - - if options.verbose >= 1 or dist_is_editable(proj): - row.append(proj.location) - if options.verbose >= 1: - row.append(get_installer(proj)) - - data.append(row) - - return data, header - - -def format_for_json(packages, options): - data = [] - for dist in packages: - info = { - 'name': dist.project_name, - 'version': six.text_type(dist.version), - } - if options.verbose >= 1: - info['location'] = dist.location - info['installer'] = get_installer(dist) - if options.outdated: - info['latest_version'] = six.text_type(dist.latest_version) - info['latest_filetype'] = dist.latest_filetype - data.append(info) - return json.dumps(data) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/search.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/search.py deleted file mode 100644 index c157a31..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/search.py +++ /dev/null @@ -1,135 +0,0 @@ -from __future__ import absolute_import - -import logging -import sys -import textwrap -from collections import OrderedDict - -from pip._vendor import pkg_resources -from pip._vendor.packaging.version import parse as parse_version -# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is -# why we ignore the type on this import -from pip._vendor.six.moves import xmlrpc_client # type: ignore - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS -from pip._internal.download import PipXmlrpcTransport -from pip._internal.exceptions import CommandError -from pip._internal.models.index import PyPI -from pip._internal.utils.compat import get_terminal_size -from pip._internal.utils.logging import indent_log - -logger = logging.getLogger(__name__) - - -class SearchCommand(Command): - """Search for PyPI packages whose name or summary contains .""" - name = 'search' - usage = """ - %prog [options] """ - summary = 'Search PyPI for packages.' - ignore_require_venv = True - - def __init__(self, *args, **kw): - super(SearchCommand, self).__init__(*args, **kw) - self.cmd_opts.add_option( - '-i', '--index', - dest='index', - metavar='URL', - default=PyPI.pypi_url, - help='Base URL of Python Package Index (default %default)') - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - if not args: - raise CommandError('Missing required argument (search query).') - query = args - pypi_hits = self.search(query, options) - hits = transform_hits(pypi_hits) - - terminal_width = None - if sys.stdout.isatty(): - terminal_width = get_terminal_size()[0] - - print_results(hits, terminal_width=terminal_width) - if pypi_hits: - return SUCCESS - return NO_MATCHES_FOUND - - def search(self, query, options): - index_url = options.index - with self._build_session(options) as session: - transport = PipXmlrpcTransport(index_url, session) - pypi = xmlrpc_client.ServerProxy(index_url, transport) - hits = pypi.search({'name': query, 'summary': query}, 'or') - return hits - - -def transform_hits(hits): - """ - The list from pypi is really a list of versions. We want a list of - packages with the list of versions stored inline. This converts the - list from pypi into one we can use. - """ - packages = OrderedDict() - for hit in hits: - name = hit['name'] - summary = hit['summary'] - version = hit['version'] - - if name not in packages.keys(): - packages[name] = { - 'name': name, - 'summary': summary, - 'versions': [version], - } - else: - packages[name]['versions'].append(version) - - # if this is the highest version, replace summary and score - if version == highest_version(packages[name]['versions']): - packages[name]['summary'] = summary - - return list(packages.values()) - - -def print_results(hits, name_column_width=None, terminal_width=None): - if not hits: - return - if name_column_width is None: - name_column_width = max([ - len(hit['name']) + len(highest_version(hit.get('versions', ['-']))) - for hit in hits - ]) + 4 - - installed_packages = [p.project_name for p in pkg_resources.working_set] - for hit in hits: - name = hit['name'] - summary = hit['summary'] or '' - latest = highest_version(hit.get('versions', ['-'])) - if terminal_width is not None: - target_width = terminal_width - name_column_width - 5 - if target_width > 10: - # wrap and indent summary to fit terminal - summary = textwrap.wrap(summary, target_width) - summary = ('\n' + ' ' * (name_column_width + 3)).join(summary) - - line = '%-*s - %s' % (name_column_width, - '%s (%s)' % (name, latest), summary) - try: - logger.info(line) - if name in installed_packages: - dist = pkg_resources.get_distribution(name) - with indent_log(): - if dist.version == latest: - logger.info('INSTALLED: %s (latest)', dist.version) - else: - logger.info('INSTALLED: %s', dist.version) - logger.info('LATEST: %s', latest) - except UnicodeEncodeError: - pass - - -def highest_version(versions): - return max(versions, key=parse_version) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/show.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/show.py deleted file mode 100644 index f92c9bc..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/show.py +++ /dev/null @@ -1,168 +0,0 @@ -from __future__ import absolute_import - -import logging -import os -from email.parser import FeedParser # type: ignore - -from pip._vendor import pkg_resources -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS - -logger = logging.getLogger(__name__) - - -class ShowCommand(Command): - """ - Show information about one or more installed packages. - - The output is in RFC-compliant mail header format. - """ - name = 'show' - usage = """ - %prog [options] ...""" - summary = 'Show information about installed packages.' - ignore_require_venv = True - - def __init__(self, *args, **kw): - super(ShowCommand, self).__init__(*args, **kw) - self.cmd_opts.add_option( - '-f', '--files', - dest='files', - action='store_true', - default=False, - help='Show the full list of installed files for each package.') - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - if not args: - logger.warning('ERROR: Please provide a package name or names.') - return ERROR - query = args - - results = search_packages_info(query) - if not print_results( - results, list_files=options.files, verbose=options.verbose): - return ERROR - return SUCCESS - - -def search_packages_info(query): - """ - Gather details from installed distributions. Print distribution name, - version, location, and installed files. Installed files requires a - pip generated 'installed-files.txt' in the distributions '.egg-info' - directory. - """ - installed = {} - for p in pkg_resources.working_set: - installed[canonicalize_name(p.project_name)] = p - - query_names = [canonicalize_name(name) for name in query] - - for dist in [installed[pkg] for pkg in query_names if pkg in installed]: - package = { - 'name': dist.project_name, - 'version': dist.version, - 'location': dist.location, - 'requires': [dep.project_name for dep in dist.requires()], - } - file_list = None - metadata = None - if isinstance(dist, pkg_resources.DistInfoDistribution): - # RECORDs should be part of .dist-info metadatas - if dist.has_metadata('RECORD'): - lines = dist.get_metadata_lines('RECORD') - paths = [l.split(',')[0] for l in lines] - paths = [os.path.join(dist.location, p) for p in paths] - file_list = [os.path.relpath(p, dist.location) for p in paths] - - if dist.has_metadata('METADATA'): - metadata = dist.get_metadata('METADATA') - else: - # Otherwise use pip's log for .egg-info's - if dist.has_metadata('installed-files.txt'): - paths = dist.get_metadata_lines('installed-files.txt') - paths = [os.path.join(dist.egg_info, p) for p in paths] - file_list = [os.path.relpath(p, dist.location) for p in paths] - - if dist.has_metadata('PKG-INFO'): - metadata = dist.get_metadata('PKG-INFO') - - if dist.has_metadata('entry_points.txt'): - entry_points = dist.get_metadata_lines('entry_points.txt') - package['entry_points'] = entry_points - - if dist.has_metadata('INSTALLER'): - for line in dist.get_metadata_lines('INSTALLER'): - if line.strip(): - package['installer'] = line.strip() - break - - # @todo: Should pkg_resources.Distribution have a - # `get_pkg_info` method? - feed_parser = FeedParser() - feed_parser.feed(metadata) - pkg_info_dict = feed_parser.close() - for key in ('metadata-version', 'summary', - 'home-page', 'author', 'author-email', 'license'): - package[key] = pkg_info_dict.get(key) - - # It looks like FeedParser cannot deal with repeated headers - classifiers = [] - for line in metadata.splitlines(): - if line.startswith('Classifier: '): - classifiers.append(line[len('Classifier: '):]) - package['classifiers'] = classifiers - - if file_list: - package['files'] = sorted(file_list) - yield package - - -def print_results(distributions, list_files=False, verbose=False): - """ - Print the informations from installed distributions found. - """ - results_printed = False - for i, dist in enumerate(distributions): - results_printed = True - if i > 0: - logger.info("---") - - name = dist.get('name', '') - required_by = [ - pkg.project_name for pkg in pkg_resources.working_set - if name in [required.name for required in pkg.requires()] - ] - - logger.info("Name: %s", name) - logger.info("Version: %s", dist.get('version', '')) - logger.info("Summary: %s", dist.get('summary', '')) - logger.info("Home-page: %s", dist.get('home-page', '')) - logger.info("Author: %s", dist.get('author', '')) - logger.info("Author-email: %s", dist.get('author-email', '')) - logger.info("License: %s", dist.get('license', '')) - logger.info("Location: %s", dist.get('location', '')) - logger.info("Requires: %s", ', '.join(dist.get('requires', []))) - logger.info("Required-by: %s", ', '.join(required_by)) - - if verbose: - logger.info("Metadata-Version: %s", - dist.get('metadata-version', '')) - logger.info("Installer: %s", dist.get('installer', '')) - logger.info("Classifiers:") - for classifier in dist.get('classifiers', []): - logger.info(" %s", classifier) - logger.info("Entry-points:") - for entry in dist.get('entry_points', []): - logger.info(" %s", entry.strip()) - if list_files: - logger.info("Files:") - for line in dist.get('files', []): - logger.info(" %s", line.strip()) - if "files" not in dist: - logger.info("Cannot locate installed-files.txt") - return results_printed diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/uninstall.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/uninstall.py deleted file mode 100644 index 0cd6f54..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/uninstall.py +++ /dev/null @@ -1,78 +0,0 @@ -from __future__ import absolute_import - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.cli.base_command import Command -from pip._internal.exceptions import InstallationError -from pip._internal.req import parse_requirements -from pip._internal.req.constructors import install_req_from_line -from pip._internal.utils.misc import protect_pip_from_modification_on_windows - - -class UninstallCommand(Command): - """ - Uninstall packages. - - pip is able to uninstall most installed packages. Known exceptions are: - - - Pure distutils packages installed with ``python setup.py install``, which - leave behind no metadata to determine what files were installed. - - Script wrappers installed by ``python setup.py develop``. - """ - name = 'uninstall' - usage = """ - %prog [options] ... - %prog [options] -r ...""" - summary = 'Uninstall packages.' - - def __init__(self, *args, **kw): - super(UninstallCommand, self).__init__(*args, **kw) - self.cmd_opts.add_option( - '-r', '--requirement', - dest='requirements', - action='append', - default=[], - metavar='file', - help='Uninstall all the packages listed in the given requirements ' - 'file. This option can be used multiple times.', - ) - self.cmd_opts.add_option( - '-y', '--yes', - dest='yes', - action='store_true', - help="Don't ask for confirmation of uninstall deletions.") - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - with self._build_session(options) as session: - reqs_to_uninstall = {} - for name in args: - req = install_req_from_line( - name, isolated=options.isolated_mode, - ) - if req.name: - reqs_to_uninstall[canonicalize_name(req.name)] = req - for filename in options.requirements: - for req in parse_requirements( - filename, - options=options, - session=session): - if req.name: - reqs_to_uninstall[canonicalize_name(req.name)] = req - if not reqs_to_uninstall: - raise InstallationError( - 'You must give at least one requirement to %(name)s (see ' - '"pip help %(name)s")' % dict(name=self.name) - ) - - protect_pip_from_modification_on_windows( - modifying_pip="pip" in reqs_to_uninstall - ) - - for req in reqs_to_uninstall.values(): - uninstall_pathset = req.uninstall( - auto_confirm=options.yes, verbose=self.verbosity > 0, - ) - if uninstall_pathset: - uninstall_pathset.commit() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/wheel.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/wheel.py deleted file mode 100644 index cd72a3d..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/wheel.py +++ /dev/null @@ -1,186 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import absolute_import - -import logging -import os - -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import RequirementCommand -from pip._internal.exceptions import CommandError, PreviousBuildDirError -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req import RequirementSet -from pip._internal.req.req_tracker import RequirementTracker -from pip._internal.resolve import Resolver -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.wheel import WheelBuilder - -logger = logging.getLogger(__name__) - - -class WheelCommand(RequirementCommand): - """ - Build Wheel archives for your requirements and dependencies. - - Wheel is a built-package format, and offers the advantage of not - recompiling your software during every install. For more details, see the - wheel docs: https://wheel.readthedocs.io/en/latest/ - - Requirements: setuptools>=0.8, and wheel. - - 'pip wheel' uses the bdist_wheel setuptools extension from the wheel - package to build individual wheels. - - """ - - name = 'wheel' - usage = """ - %prog [options] ... - %prog [options] -r ... - %prog [options] [-e] ... - %prog [options] [-e] ... - %prog [options] ...""" - - summary = 'Build wheels from your requirements.' - - def __init__(self, *args, **kw): - super(WheelCommand, self).__init__(*args, **kw) - - cmd_opts = self.cmd_opts - - cmd_opts.add_option( - '-w', '--wheel-dir', - dest='wheel_dir', - metavar='dir', - default=os.curdir, - help=("Build wheels into , where the default is the " - "current working directory."), - ) - cmd_opts.add_option(cmdoptions.no_binary()) - cmd_opts.add_option(cmdoptions.only_binary()) - cmd_opts.add_option(cmdoptions.prefer_binary()) - cmd_opts.add_option( - '--build-option', - dest='build_options', - metavar='options', - action='append', - help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", - ) - cmd_opts.add_option(cmdoptions.no_build_isolation()) - cmd_opts.add_option(cmdoptions.use_pep517()) - cmd_opts.add_option(cmdoptions.no_use_pep517()) - cmd_opts.add_option(cmdoptions.constraints()) - cmd_opts.add_option(cmdoptions.editable()) - cmd_opts.add_option(cmdoptions.requirements()) - cmd_opts.add_option(cmdoptions.src()) - cmd_opts.add_option(cmdoptions.ignore_requires_python()) - cmd_opts.add_option(cmdoptions.no_deps()) - cmd_opts.add_option(cmdoptions.build_dir()) - cmd_opts.add_option(cmdoptions.progress_bar()) - - cmd_opts.add_option( - '--global-option', - dest='global_options', - action='append', - metavar='options', - help="Extra global options to be supplied to the setup.py " - "call before the 'bdist_wheel' command.") - - cmd_opts.add_option( - '--pre', - action='store_true', - default=False, - help=("Include pre-release and development versions. By default, " - "pip only finds stable versions."), - ) - - cmd_opts.add_option(cmdoptions.no_clean()) - cmd_opts.add_option(cmdoptions.require_hashes()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, cmd_opts) - - def run(self, options, args): - cmdoptions.check_install_build_global(options) - - index_urls = [options.index_url] + options.extra_index_urls - if options.no_index: - logger.debug('Ignoring indexes: %s', ','.join(index_urls)) - index_urls = [] - - if options.build_dir: - options.build_dir = os.path.abspath(options.build_dir) - - options.src_dir = os.path.abspath(options.src_dir) - - with self._build_session(options) as session: - finder = self._build_package_finder(options, session) - build_delete = (not (options.no_clean or options.build_dir)) - wheel_cache = WheelCache(options.cache_dir, options.format_control) - - with RequirementTracker() as req_tracker, TempDirectory( - options.build_dir, delete=build_delete, kind="wheel" - ) as directory: - - requirement_set = RequirementSet( - require_hashes=options.require_hashes, - ) - - try: - self.populate_requirement_set( - requirement_set, args, options, finder, session, - self.name, wheel_cache - ) - - preparer = RequirementPreparer( - build_dir=directory.path, - src_dir=options.src_dir, - download_dir=None, - wheel_download_dir=options.wheel_dir, - progress_bar=options.progress_bar, - build_isolation=options.build_isolation, - req_tracker=req_tracker, - ) - - resolver = Resolver( - preparer=preparer, - finder=finder, - session=session, - wheel_cache=wheel_cache, - use_user_site=False, - upgrade_strategy="to-satisfy-only", - force_reinstall=False, - ignore_dependencies=options.ignore_dependencies, - ignore_requires_python=options.ignore_requires_python, - ignore_installed=True, - isolated=options.isolated_mode, - use_pep517=options.use_pep517 - ) - resolver.resolve(requirement_set) - - # build wheels - wb = WheelBuilder( - finder, preparer, wheel_cache, - build_options=options.build_options or [], - global_options=options.global_options or [], - no_clean=options.no_clean, - ) - build_failures = wb.build( - requirement_set.requirements.values(), session=session, - ) - if len(build_failures) != 0: - raise CommandError( - "Failed to build one or more wheels" - ) - except PreviousBuildDirError: - options.no_clean = True - raise - finally: - if not options.no_clean: - requirement_set.cleanup_files() - wheel_cache.cleanup() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/configuration.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/configuration.py deleted file mode 100644 index fe6df9b..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/configuration.py +++ /dev/null @@ -1,387 +0,0 @@ -"""Configuration management setup - -Some terminology: -- name - As written in config files. -- value - Value associated with a name -- key - Name combined with it's section (section.name) -- variant - A single word describing where the configuration key-value pair came from -""" - -import locale -import logging -import os - -from pip._vendor import six -from pip._vendor.six.moves import configparser - -from pip._internal.exceptions import ( - ConfigurationError, ConfigurationFileCouldNotBeLoaded, -) -from pip._internal.locations import ( - legacy_config_file, new_config_file, running_under_virtualenv, - site_config_files, venv_config_file, -) -from pip._internal.utils.misc import ensure_dir, enum -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Any, Dict, Iterable, List, NewType, Optional, Tuple - ) - - RawConfigParser = configparser.RawConfigParser # Shorthand - Kind = NewType("Kind", str) - -logger = logging.getLogger(__name__) - - -# NOTE: Maybe use the optionx attribute to normalize keynames. -def _normalize_name(name): - # type: (str) -> str - """Make a name consistent regardless of source (environment or file) - """ - name = name.lower().replace('_', '-') - if name.startswith('--'): - name = name[2:] # only prefer long opts - return name - - -def _disassemble_key(name): - # type: (str) -> List[str] - return name.split(".", 1) - - -# The kinds of configurations there are. -kinds = enum( - USER="user", # User Specific - GLOBAL="global", # System Wide - VENV="venv", # Virtual Environment Specific - ENV="env", # from PIP_CONFIG_FILE - ENV_VAR="env-var", # from Environment Variables -) - - -class Configuration(object): - """Handles management of configuration. - - Provides an interface to accessing and managing configuration files. - - This class converts provides an API that takes "section.key-name" style - keys and stores the value associated with it as "key-name" under the - section "section". - - This allows for a clean interface wherein the both the section and the - key-name are preserved in an easy to manage form in the configuration files - and the data stored is also nice. - """ - - def __init__(self, isolated, load_only=None): - # type: (bool, Kind) -> None - super(Configuration, self).__init__() - - _valid_load_only = [kinds.USER, kinds.GLOBAL, kinds.VENV, None] - if load_only not in _valid_load_only: - raise ConfigurationError( - "Got invalid value for load_only - should be one of {}".format( - ", ".join(map(repr, _valid_load_only[:-1])) - ) - ) - self.isolated = isolated # type: bool - self.load_only = load_only # type: Optional[Kind] - - # The order here determines the override order. - self._override_order = [ - kinds.GLOBAL, kinds.USER, kinds.VENV, kinds.ENV, kinds.ENV_VAR - ] - - self._ignore_env_names = ["version", "help"] - - # Because we keep track of where we got the data from - self._parsers = { - variant: [] for variant in self._override_order - } # type: Dict[Kind, List[Tuple[str, RawConfigParser]]] - self._config = { - variant: {} for variant in self._override_order - } # type: Dict[Kind, Dict[str, Any]] - self._modified_parsers = [] # type: List[Tuple[str, RawConfigParser]] - - def load(self): - # type: () -> None - """Loads configuration from configuration files and environment - """ - self._load_config_files() - if not self.isolated: - self._load_environment_vars() - - def get_file_to_edit(self): - # type: () -> Optional[str] - """Returns the file with highest priority in configuration - """ - assert self.load_only is not None, \ - "Need to be specified a file to be editing" - - try: - return self._get_parser_to_modify()[0] - except IndexError: - return None - - def items(self): - # type: () -> Iterable[Tuple[str, Any]] - """Returns key-value pairs like dict.items() representing the loaded - configuration - """ - return self._dictionary.items() - - def get_value(self, key): - # type: (str) -> Any - """Get a value from the configuration. - """ - try: - return self._dictionary[key] - except KeyError: - raise ConfigurationError("No such key - {}".format(key)) - - def set_value(self, key, value): - # type: (str, Any) -> None - """Modify a value in the configuration. - """ - self._ensure_have_load_only() - - fname, parser = self._get_parser_to_modify() - - if parser is not None: - section, name = _disassemble_key(key) - - # Modify the parser and the configuration - if not parser.has_section(section): - parser.add_section(section) - parser.set(section, name, value) - - self._config[self.load_only][key] = value - self._mark_as_modified(fname, parser) - - def unset_value(self, key): - # type: (str) -> None - """Unset a value in the configuration. - """ - self._ensure_have_load_only() - - if key not in self._config[self.load_only]: - raise ConfigurationError("No such key - {}".format(key)) - - fname, parser = self._get_parser_to_modify() - - if parser is not None: - section, name = _disassemble_key(key) - - # Remove the key in the parser - modified_something = False - if parser.has_section(section): - # Returns whether the option was removed or not - modified_something = parser.remove_option(section, name) - - if modified_something: - # name removed from parser, section may now be empty - section_iter = iter(parser.items(section)) - try: - val = six.next(section_iter) - except StopIteration: - val = None - - if val is None: - parser.remove_section(section) - - self._mark_as_modified(fname, parser) - else: - raise ConfigurationError( - "Fatal Internal error [id=1]. Please report as a bug." - ) - - del self._config[self.load_only][key] - - def save(self): - # type: () -> None - """Save the currentin-memory state. - """ - self._ensure_have_load_only() - - for fname, parser in self._modified_parsers: - logger.info("Writing to %s", fname) - - # Ensure directory exists. - ensure_dir(os.path.dirname(fname)) - - with open(fname, "w") as f: - parser.write(f) # type: ignore - - # - # Private routines - # - - def _ensure_have_load_only(self): - # type: () -> None - if self.load_only is None: - raise ConfigurationError("Needed a specific file to be modifying.") - logger.debug("Will be working with %s variant only", self.load_only) - - @property - def _dictionary(self): - # type: () -> Dict[str, Any] - """A dictionary representing the loaded configuration. - """ - # NOTE: Dictionaries are not populated if not loaded. So, conditionals - # are not needed here. - retval = {} - - for variant in self._override_order: - retval.update(self._config[variant]) - - return retval - - def _load_config_files(self): - # type: () -> None - """Loads configuration from configuration files - """ - config_files = dict(self._iter_config_files()) - if config_files[kinds.ENV][0:1] == [os.devnull]: - logger.debug( - "Skipping loading configuration files due to " - "environment's PIP_CONFIG_FILE being os.devnull" - ) - return - - for variant, files in config_files.items(): - for fname in files: - # If there's specific variant set in `load_only`, load only - # that variant, not the others. - if self.load_only is not None and variant != self.load_only: - logger.debug( - "Skipping file '%s' (variant: %s)", fname, variant - ) - continue - - parser = self._load_file(variant, fname) - - # Keeping track of the parsers used - self._parsers[variant].append((fname, parser)) - - def _load_file(self, variant, fname): - # type: (Kind, str) -> RawConfigParser - logger.debug("For variant '%s', will try loading '%s'", variant, fname) - parser = self._construct_parser(fname) - - for section in parser.sections(): - items = parser.items(section) - self._config[variant].update(self._normalized_keys(section, items)) - - return parser - - def _construct_parser(self, fname): - # type: (str) -> RawConfigParser - parser = configparser.RawConfigParser() - # If there is no such file, don't bother reading it but create the - # parser anyway, to hold the data. - # Doing this is useful when modifying and saving files, where we don't - # need to construct a parser. - if os.path.exists(fname): - try: - parser.read(fname) - except UnicodeDecodeError: - # See https://github.com/pypa/pip/issues/4963 - raise ConfigurationFileCouldNotBeLoaded( - reason="contains invalid {} characters".format( - locale.getpreferredencoding(False) - ), - fname=fname, - ) - except configparser.Error as error: - # See https://github.com/pypa/pip/issues/4893 - raise ConfigurationFileCouldNotBeLoaded(error=error) - return parser - - def _load_environment_vars(self): - # type: () -> None - """Loads configuration from environment variables - """ - self._config[kinds.ENV_VAR].update( - self._normalized_keys(":env:", self._get_environ_vars()) - ) - - def _normalized_keys(self, section, items): - # type: (str, Iterable[Tuple[str, Any]]) -> Dict[str, Any] - """Normalizes items to construct a dictionary with normalized keys. - - This routine is where the names become keys and are made the same - regardless of source - configuration files or environment. - """ - normalized = {} - for name, val in items: - key = section + "." + _normalize_name(name) - normalized[key] = val - return normalized - - def _get_environ_vars(self): - # type: () -> Iterable[Tuple[str, str]] - """Returns a generator with all environmental vars with prefix PIP_""" - for key, val in os.environ.items(): - should_be_yielded = ( - key.startswith("PIP_") and - key[4:].lower() not in self._ignore_env_names - ) - if should_be_yielded: - yield key[4:].lower(), val - - # XXX: This is patched in the tests. - def _iter_config_files(self): - # type: () -> Iterable[Tuple[Kind, List[str]]] - """Yields variant and configuration files associated with it. - - This should be treated like items of a dictionary. - """ - # SMELL: Move the conditions out of this function - - # environment variables have the lowest priority - config_file = os.environ.get('PIP_CONFIG_FILE', None) - if config_file is not None: - yield kinds.ENV, [config_file] - else: - yield kinds.ENV, [] - - # at the base we have any global configuration - yield kinds.GLOBAL, list(site_config_files) - - # per-user configuration next - should_load_user_config = not self.isolated and not ( - config_file and os.path.exists(config_file) - ) - if should_load_user_config: - # The legacy config file is overridden by the new config file - yield kinds.USER, [legacy_config_file, new_config_file] - - # finally virtualenv configuration first trumping others - if running_under_virtualenv(): - yield kinds.VENV, [venv_config_file] - - def _get_parser_to_modify(self): - # type: () -> Tuple[str, RawConfigParser] - # Determine which parser to modify - parsers = self._parsers[self.load_only] - if not parsers: - # This should not happen if everything works correctly. - raise ConfigurationError( - "Fatal Internal error [id=2]. Please report as a bug." - ) - - # Use the highest priority parser. - return parsers[-1] - - # XXX: This is patched in the tests. - def _mark_as_modified(self, fname, parser): - # type: (str, RawConfigParser) -> None - file_parser_tuple = (fname, parser) - if file_parser_tuple not in self._modified_parsers: - self._modified_parsers.append(file_parser_tuple) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/download.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/download.py deleted file mode 100644 index 2bbe176..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/download.py +++ /dev/null @@ -1,971 +0,0 @@ -from __future__ import absolute_import - -import cgi -import email.utils -import getpass -import json -import logging -import mimetypes -import os -import platform -import re -import shutil -import sys - -from pip._vendor import requests, six, urllib3 -from pip._vendor.cachecontrol import CacheControlAdapter -from pip._vendor.cachecontrol.caches import FileCache -from pip._vendor.lockfile import LockError -from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter -from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth -from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response -from pip._vendor.requests.structures import CaseInsensitiveDict -from pip._vendor.requests.utils import get_netrc_auth -# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is -# why we ignore the type on this import -from pip._vendor.six.moves import xmlrpc_client # type: ignore -from pip._vendor.six.moves.urllib import parse as urllib_parse -from pip._vendor.six.moves.urllib import request as urllib_request -from pip._vendor.urllib3.util import IS_PYOPENSSL - -import pip -from pip._internal.exceptions import HashMismatch, InstallationError -from pip._internal.locations import write_delete_marker_file -from pip._internal.models.index import PyPI -from pip._internal.utils.encoding import auto_decode -from pip._internal.utils.filesystem import check_path_owner -from pip._internal.utils.glibc import libc_ver -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - ARCHIVE_EXTENSIONS, ask_path_exists, backup_dir, call_subprocess, consume, - display_path, format_size, get_installed_version, rmtree, - split_auth_from_netloc, splitext, unpack_file, -) -from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.utils.ui import DownloadProgressProvider -from pip._internal.vcs import vcs - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Optional, Tuple, Dict, IO, Text, Union - ) - from pip._internal.models.link import Link # noqa: F401 - from pip._internal.utils.hashes import Hashes # noqa: F401 - from pip._internal.vcs import AuthInfo # noqa: F401 - -try: - import ssl # noqa -except ImportError: - ssl = None - -HAS_TLS = (ssl is not None) or IS_PYOPENSSL - -__all__ = ['get_file_content', - 'is_url', 'url_to_path', 'path_to_url', - 'is_archive_file', 'unpack_vcs_link', - 'unpack_file_url', 'is_vcs_url', 'is_file_url', - 'unpack_http_url', 'unpack_url'] - - -logger = logging.getLogger(__name__) - - -def user_agent(): - """ - Return a string representing the user agent. - """ - data = { - "installer": {"name": "pip", "version": pip.__version__}, - "python": platform.python_version(), - "implementation": { - "name": platform.python_implementation(), - }, - } - - if data["implementation"]["name"] == 'CPython': - data["implementation"]["version"] = platform.python_version() - elif data["implementation"]["name"] == 'PyPy': - if sys.pypy_version_info.releaselevel == 'final': - pypy_version_info = sys.pypy_version_info[:3] - else: - pypy_version_info = sys.pypy_version_info - data["implementation"]["version"] = ".".join( - [str(x) for x in pypy_version_info] - ) - elif data["implementation"]["name"] == 'Jython': - # Complete Guess - data["implementation"]["version"] = platform.python_version() - elif data["implementation"]["name"] == 'IronPython': - # Complete Guess - data["implementation"]["version"] = platform.python_version() - - if sys.platform.startswith("linux"): - from pip._vendor import distro - distro_infos = dict(filter( - lambda x: x[1], - zip(["name", "version", "id"], distro.linux_distribution()), - )) - libc = dict(filter( - lambda x: x[1], - zip(["lib", "version"], libc_ver()), - )) - if libc: - distro_infos["libc"] = libc - if distro_infos: - data["distro"] = distro_infos - - if sys.platform.startswith("darwin") and platform.mac_ver()[0]: - data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]} - - if platform.system(): - data.setdefault("system", {})["name"] = platform.system() - - if platform.release(): - data.setdefault("system", {})["release"] = platform.release() - - if platform.machine(): - data["cpu"] = platform.machine() - - if HAS_TLS: - data["openssl_version"] = ssl.OPENSSL_VERSION - - setuptools_version = get_installed_version("setuptools") - if setuptools_version is not None: - data["setuptools_version"] = setuptools_version - - return "{data[installer][name]}/{data[installer][version]} {json}".format( - data=data, - json=json.dumps(data, separators=(",", ":"), sort_keys=True), - ) - - -class MultiDomainBasicAuth(AuthBase): - - def __init__(self, prompting=True): - # type: (bool) -> None - self.prompting = prompting - self.passwords = {} # type: Dict[str, AuthInfo] - - def __call__(self, req): - parsed = urllib_parse.urlparse(req.url) - - # Split the credentials from the netloc. - netloc, url_user_password = split_auth_from_netloc(parsed.netloc) - - # Set the url of the request to the url without any credentials - req.url = urllib_parse.urlunparse(parsed[:1] + (netloc,) + parsed[2:]) - - # Use any stored credentials that we have for this netloc - username, password = self.passwords.get(netloc, (None, None)) - - # Use the credentials embedded in the url if we have none stored - if username is None: - username, password = url_user_password - - # Get creds from netrc if we still don't have them - if username is None and password is None: - netrc_auth = get_netrc_auth(req.url) - username, password = netrc_auth if netrc_auth else (None, None) - - if username or password: - # Store the username and password - self.passwords[netloc] = (username, password) - - # Send the basic auth with this request - req = HTTPBasicAuth(username or "", password or "")(req) - - # Attach a hook to handle 401 responses - req.register_hook("response", self.handle_401) - - return req - - def handle_401(self, resp, **kwargs): - # We only care about 401 responses, anything else we want to just - # pass through the actual response - if resp.status_code != 401: - return resp - - # We are not able to prompt the user so simply return the response - if not self.prompting: - return resp - - parsed = urllib_parse.urlparse(resp.url) - - # Prompt the user for a new username and password - username = six.moves.input("User for %s: " % parsed.netloc) - password = getpass.getpass("Password: ") - - # Store the new username and password to use for future requests - if username or password: - self.passwords[parsed.netloc] = (username, password) - - # Consume content and release the original connection to allow our new - # request to reuse the same one. - resp.content - resp.raw.release_conn() - - # Add our new username and password to the request - req = HTTPBasicAuth(username or "", password or "")(resp.request) - req.register_hook("response", self.warn_on_401) - - # Send our new request - new_resp = resp.connection.send(req, **kwargs) - new_resp.history.append(resp) - - return new_resp - - def warn_on_401(self, resp, **kwargs): - # warn user that they provided incorrect credentials - if resp.status_code == 401: - logger.warning('401 Error, Credentials not correct for %s', - resp.request.url) - - -class LocalFSAdapter(BaseAdapter): - - def send(self, request, stream=None, timeout=None, verify=None, cert=None, - proxies=None): - pathname = url_to_path(request.url) - - resp = Response() - resp.status_code = 200 - resp.url = request.url - - try: - stats = os.stat(pathname) - except OSError as exc: - resp.status_code = 404 - resp.raw = exc - else: - modified = email.utils.formatdate(stats.st_mtime, usegmt=True) - content_type = mimetypes.guess_type(pathname)[0] or "text/plain" - resp.headers = CaseInsensitiveDict({ - "Content-Type": content_type, - "Content-Length": stats.st_size, - "Last-Modified": modified, - }) - - resp.raw = open(pathname, "rb") - resp.close = resp.raw.close - - return resp - - def close(self): - pass - - -class SafeFileCache(FileCache): - """ - A file based cache which is safe to use even when the target directory may - not be accessible or writable. - """ - - def __init__(self, *args, **kwargs): - super(SafeFileCache, self).__init__(*args, **kwargs) - - # Check to ensure that the directory containing our cache directory - # is owned by the user current executing pip. If it does not exist - # we will check the parent directory until we find one that does exist. - # If it is not owned by the user executing pip then we will disable - # the cache and log a warning. - if not check_path_owner(self.directory): - logger.warning( - "The directory '%s' or its parent directory is not owned by " - "the current user and the cache has been disabled. Please " - "check the permissions and owner of that directory. If " - "executing pip with sudo, you may want sudo's -H flag.", - self.directory, - ) - - # Set our directory to None to disable the Cache - self.directory = None - - def get(self, *args, **kwargs): - # If we don't have a directory, then the cache should be a no-op. - if self.directory is None: - return - - try: - return super(SafeFileCache, self).get(*args, **kwargs) - except (LockError, OSError, IOError): - # We intentionally silence this error, if we can't access the cache - # then we can just skip caching and process the request as if - # caching wasn't enabled. - pass - - def set(self, *args, **kwargs): - # If we don't have a directory, then the cache should be a no-op. - if self.directory is None: - return - - try: - return super(SafeFileCache, self).set(*args, **kwargs) - except (LockError, OSError, IOError): - # We intentionally silence this error, if we can't access the cache - # then we can just skip caching and process the request as if - # caching wasn't enabled. - pass - - def delete(self, *args, **kwargs): - # If we don't have a directory, then the cache should be a no-op. - if self.directory is None: - return - - try: - return super(SafeFileCache, self).delete(*args, **kwargs) - except (LockError, OSError, IOError): - # We intentionally silence this error, if we can't access the cache - # then we can just skip caching and process the request as if - # caching wasn't enabled. - pass - - -class InsecureHTTPAdapter(HTTPAdapter): - - def cert_verify(self, conn, url, verify, cert): - conn.cert_reqs = 'CERT_NONE' - conn.ca_certs = None - - -class PipSession(requests.Session): - - timeout = None # type: Optional[int] - - def __init__(self, *args, **kwargs): - retries = kwargs.pop("retries", 0) - cache = kwargs.pop("cache", None) - insecure_hosts = kwargs.pop("insecure_hosts", []) - - super(PipSession, self).__init__(*args, **kwargs) - - # Attach our User Agent to the request - self.headers["User-Agent"] = user_agent() - - # Attach our Authentication handler to the session - self.auth = MultiDomainBasicAuth() - - # Create our urllib3.Retry instance which will allow us to customize - # how we handle retries. - retries = urllib3.Retry( - # Set the total number of retries that a particular request can - # have. - total=retries, - - # A 503 error from PyPI typically means that the Fastly -> Origin - # connection got interrupted in some way. A 503 error in general - # is typically considered a transient error so we'll go ahead and - # retry it. - # A 500 may indicate transient error in Amazon S3 - # A 520 or 527 - may indicate transient error in CloudFlare - status_forcelist=[500, 503, 520, 527], - - # Add a small amount of back off between failed requests in - # order to prevent hammering the service. - backoff_factor=0.25, - ) - - # We want to _only_ cache responses on securely fetched origins. We do - # this because we can't validate the response of an insecurely fetched - # origin, and we don't want someone to be able to poison the cache and - # require manual eviction from the cache to fix it. - if cache: - secure_adapter = CacheControlAdapter( - cache=SafeFileCache(cache, use_dir_lock=True), - max_retries=retries, - ) - else: - secure_adapter = HTTPAdapter(max_retries=retries) - - # Our Insecure HTTPAdapter disables HTTPS validation. It does not - # support caching (see above) so we'll use it for all http:// URLs as - # well as any https:// host that we've marked as ignoring TLS errors - # for. - insecure_adapter = InsecureHTTPAdapter(max_retries=retries) - - self.mount("https://", secure_adapter) - self.mount("http://", insecure_adapter) - - # Enable file:// urls - self.mount("file://", LocalFSAdapter()) - - # We want to use a non-validating adapter for any requests which are - # deemed insecure. - for host in insecure_hosts: - self.mount("https://{}/".format(host), insecure_adapter) - - def request(self, method, url, *args, **kwargs): - # Allow setting a default timeout on a session - kwargs.setdefault("timeout", self.timeout) - - # Dispatch the actual request - return super(PipSession, self).request(method, url, *args, **kwargs) - - -def get_file_content(url, comes_from=None, session=None): - # type: (str, Optional[str], Optional[PipSession]) -> Tuple[str, Text] - """Gets the content of a file; it may be a filename, file: URL, or - http: URL. Returns (location, content). Content is unicode. - - :param url: File path or url. - :param comes_from: Origin description of requirements. - :param session: Instance of pip.download.PipSession. - """ - if session is None: - raise TypeError( - "get_file_content() missing 1 required keyword argument: 'session'" - ) - - match = _scheme_re.search(url) - if match: - scheme = match.group(1).lower() - if (scheme == 'file' and comes_from and - comes_from.startswith('http')): - raise InstallationError( - 'Requirements file %s references URL %s, which is local' - % (comes_from, url)) - if scheme == 'file': - path = url.split(':', 1)[1] - path = path.replace('\\', '/') - match = _url_slash_drive_re.match(path) - if match: - path = match.group(1) + ':' + path.split('|', 1)[1] - path = urllib_parse.unquote(path) - if path.startswith('/'): - path = '/' + path.lstrip('/') - url = path - else: - # FIXME: catch some errors - resp = session.get(url) - resp.raise_for_status() - return resp.url, resp.text - try: - with open(url, 'rb') as f: - content = auto_decode(f.read()) - except IOError as exc: - raise InstallationError( - 'Could not open requirements file: %s' % str(exc) - ) - return url, content - - -_scheme_re = re.compile(r'^(http|https|file):', re.I) -_url_slash_drive_re = re.compile(r'/*([a-z])\|', re.I) - - -def is_url(name): - # type: (Union[str, Text]) -> bool - """Returns true if the name looks like a URL""" - if ':' not in name: - return False - scheme = name.split(':', 1)[0].lower() - return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes - - -def url_to_path(url): - # type: (str) -> str - """ - Convert a file: URL to a path. - """ - assert url.startswith('file:'), ( - "You can only turn file: urls into filenames (not %r)" % url) - - _, netloc, path, _, _ = urllib_parse.urlsplit(url) - - # if we have a UNC path, prepend UNC share notation - if netloc: - netloc = '\\\\' + netloc - - path = urllib_request.url2pathname(netloc + path) - return path - - -def path_to_url(path): - # type: (Union[str, Text]) -> str - """ - Convert a path to a file: URL. The path will be made absolute and have - quoted path parts. - """ - path = os.path.normpath(os.path.abspath(path)) - url = urllib_parse.urljoin('file:', urllib_request.pathname2url(path)) - return url - - -def is_archive_file(name): - # type: (str) -> bool - """Return True if `name` is a considered as an archive file.""" - ext = splitext(name)[1].lower() - if ext in ARCHIVE_EXTENSIONS: - return True - return False - - -def unpack_vcs_link(link, location): - vcs_backend = _get_used_vcs_backend(link) - vcs_backend.unpack(location) - - -def _get_used_vcs_backend(link): - for backend in vcs.backends: - if link.scheme in backend.schemes: - vcs_backend = backend(link.url) - return vcs_backend - - -def is_vcs_url(link): - # type: (Link) -> bool - return bool(_get_used_vcs_backend(link)) - - -def is_file_url(link): - # type: (Link) -> bool - return link.url.lower().startswith('file:') - - -def is_dir_url(link): - # type: (Link) -> bool - """Return whether a file:// Link points to a directory. - - ``link`` must not have any other scheme but file://. Call is_file_url() - first. - - """ - link_path = url_to_path(link.url_without_fragment) - return os.path.isdir(link_path) - - -def _progress_indicator(iterable, *args, **kwargs): - return iterable - - -def _download_url( - resp, # type: Response - link, # type: Link - content_file, # type: IO - hashes, # type: Hashes - progress_bar # type: str -): - # type: (...) -> None - try: - total_length = int(resp.headers['content-length']) - except (ValueError, KeyError, TypeError): - total_length = 0 - - cached_resp = getattr(resp, "from_cache", False) - if logger.getEffectiveLevel() > logging.INFO: - show_progress = False - elif cached_resp: - show_progress = False - elif total_length > (40 * 1000): - show_progress = True - elif not total_length: - show_progress = True - else: - show_progress = False - - show_url = link.show_url - - def resp_read(chunk_size): - try: - # Special case for urllib3. - for chunk in resp.raw.stream( - chunk_size, - # We use decode_content=False here because we don't - # want urllib3 to mess with the raw bytes we get - # from the server. If we decompress inside of - # urllib3 then we cannot verify the checksum - # because the checksum will be of the compressed - # file. This breakage will only occur if the - # server adds a Content-Encoding header, which - # depends on how the server was configured: - # - Some servers will notice that the file isn't a - # compressible file and will leave the file alone - # and with an empty Content-Encoding - # - Some servers will notice that the file is - # already compressed and will leave the file - # alone and will add a Content-Encoding: gzip - # header - # - Some servers won't notice anything at all and - # will take a file that's already been compressed - # and compress it again and set the - # Content-Encoding: gzip header - # - # By setting this not to decode automatically we - # hope to eliminate problems with the second case. - decode_content=False): - yield chunk - except AttributeError: - # Standard file-like object. - while True: - chunk = resp.raw.read(chunk_size) - if not chunk: - break - yield chunk - - def written_chunks(chunks): - for chunk in chunks: - content_file.write(chunk) - yield chunk - - progress_indicator = _progress_indicator - - if link.netloc == PyPI.netloc: - url = show_url - else: - url = link.url_without_fragment - - if show_progress: # We don't show progress on cached responses - progress_indicator = DownloadProgressProvider(progress_bar, - max=total_length) - if total_length: - logger.info("Downloading %s (%s)", url, format_size(total_length)) - else: - logger.info("Downloading %s", url) - elif cached_resp: - logger.info("Using cached %s", url) - else: - logger.info("Downloading %s", url) - - logger.debug('Downloading from URL %s', link) - - downloaded_chunks = written_chunks( - progress_indicator( - resp_read(CONTENT_CHUNK_SIZE), - CONTENT_CHUNK_SIZE - ) - ) - if hashes: - hashes.check_against_chunks(downloaded_chunks) - else: - consume(downloaded_chunks) - - -def _copy_file(filename, location, link): - copy = True - download_location = os.path.join(location, link.filename) - if os.path.exists(download_location): - response = ask_path_exists( - 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)abort' % - display_path(download_location), ('i', 'w', 'b', 'a')) - if response == 'i': - copy = False - elif response == 'w': - logger.warning('Deleting %s', display_path(download_location)) - os.remove(download_location) - elif response == 'b': - dest_file = backup_dir(download_location) - logger.warning( - 'Backing up %s to %s', - display_path(download_location), - display_path(dest_file), - ) - shutil.move(download_location, dest_file) - elif response == 'a': - sys.exit(-1) - if copy: - shutil.copy(filename, download_location) - logger.info('Saved %s', display_path(download_location)) - - -def unpack_http_url( - link, # type: Link - location, # type: str - download_dir=None, # type: Optional[str] - session=None, # type: Optional[PipSession] - hashes=None, # type: Optional[Hashes] - progress_bar="on" # type: str -): - # type: (...) -> None - if session is None: - raise TypeError( - "unpack_http_url() missing 1 required keyword argument: 'session'" - ) - - with TempDirectory(kind="unpack") as temp_dir: - # If a download dir is specified, is the file already downloaded there? - already_downloaded_path = None - if download_dir: - already_downloaded_path = _check_download_dir(link, - download_dir, - hashes) - - if already_downloaded_path: - from_path = already_downloaded_path - content_type = mimetypes.guess_type(from_path)[0] - else: - # let's download to a tmp dir - from_path, content_type = _download_http_url(link, - session, - temp_dir.path, - hashes, - progress_bar) - - # unpack the archive to the build dir location. even when only - # downloading archives, they have to be unpacked to parse dependencies - unpack_file(from_path, location, content_type, link) - - # a download dir is specified; let's copy the archive there - if download_dir and not already_downloaded_path: - _copy_file(from_path, download_dir, link) - - if not already_downloaded_path: - os.unlink(from_path) - - -def unpack_file_url( - link, # type: Link - location, # type: str - download_dir=None, # type: Optional[str] - hashes=None # type: Optional[Hashes] -): - # type: (...) -> None - """Unpack link into location. - - If download_dir is provided and link points to a file, make a copy - of the link file inside download_dir. - """ - link_path = url_to_path(link.url_without_fragment) - - # If it's a url to a local directory - if is_dir_url(link): - if os.path.isdir(location): - rmtree(location) - shutil.copytree(link_path, location, symlinks=True) - if download_dir: - logger.info('Link is a directory, ignoring download_dir') - return - - # If --require-hashes is off, `hashes` is either empty, the - # link's embedded hash, or MissingHashes; it is required to - # match. If --require-hashes is on, we are satisfied by any - # hash in `hashes` matching: a URL-based or an option-based - # one; no internet-sourced hash will be in `hashes`. - if hashes: - hashes.check_against_path(link_path) - - # If a download dir is specified, is the file already there and valid? - already_downloaded_path = None - if download_dir: - already_downloaded_path = _check_download_dir(link, - download_dir, - hashes) - - if already_downloaded_path: - from_path = already_downloaded_path - else: - from_path = link_path - - content_type = mimetypes.guess_type(from_path)[0] - - # unpack the archive to the build dir location. even when only downloading - # archives, they have to be unpacked to parse dependencies - unpack_file(from_path, location, content_type, link) - - # a download dir is specified and not already downloaded - if download_dir and not already_downloaded_path: - _copy_file(from_path, download_dir, link) - - -def _copy_dist_from_dir(link_path, location): - """Copy distribution files in `link_path` to `location`. - - Invoked when user requests to install a local directory. E.g.: - - pip install . - pip install ~/dev/git-repos/python-prompt-toolkit - - """ - - # Note: This is currently VERY SLOW if you have a lot of data in the - # directory, because it copies everything with `shutil.copytree`. - # What it should really do is build an sdist and install that. - # See https://github.com/pypa/pip/issues/2195 - - if os.path.isdir(location): - rmtree(location) - - # build an sdist - setup_py = 'setup.py' - sdist_args = [sys.executable] - sdist_args.append('-c') - sdist_args.append(SETUPTOOLS_SHIM % setup_py) - sdist_args.append('sdist') - sdist_args += ['--dist-dir', location] - logger.info('Running setup.py sdist for %s', link_path) - - with indent_log(): - call_subprocess(sdist_args, cwd=link_path, show_stdout=False) - - # unpack sdist into `location` - sdist = os.path.join(location, os.listdir(location)[0]) - logger.info('Unpacking sdist %s into %s', sdist, location) - unpack_file(sdist, location, content_type=None, link=None) - - -class PipXmlrpcTransport(xmlrpc_client.Transport): - """Provide a `xmlrpclib.Transport` implementation via a `PipSession` - object. - """ - - def __init__(self, index_url, session, use_datetime=False): - xmlrpc_client.Transport.__init__(self, use_datetime) - index_parts = urllib_parse.urlparse(index_url) - self._scheme = index_parts.scheme - self._session = session - - def request(self, host, handler, request_body, verbose=False): - parts = (self._scheme, host, handler, None, None, None) - url = urllib_parse.urlunparse(parts) - try: - headers = {'Content-Type': 'text/xml'} - response = self._session.post(url, data=request_body, - headers=headers, stream=True) - response.raise_for_status() - self.verbose = verbose - return self.parse_response(response.raw) - except requests.HTTPError as exc: - logger.critical( - "HTTP error %s while getting %s", - exc.response.status_code, url, - ) - raise - - -def unpack_url( - link, # type: Optional[Link] - location, # type: Optional[str] - download_dir=None, # type: Optional[str] - only_download=False, # type: bool - session=None, # type: Optional[PipSession] - hashes=None, # type: Optional[Hashes] - progress_bar="on" # type: str -): - # type: (...) -> None - """Unpack link. - If link is a VCS link: - if only_download, export into download_dir and ignore location - else unpack into location - for other types of link: - - unpack into location - - if download_dir, copy the file into download_dir - - if only_download, mark location for deletion - - :param hashes: A Hashes object, one of whose embedded hashes must match, - or HashMismatch will be raised. If the Hashes is empty, no matches are - required, and unhashable types of requirements (like VCS ones, which - would ordinarily raise HashUnsupported) are allowed. - """ - # non-editable vcs urls - if is_vcs_url(link): - unpack_vcs_link(link, location) - - # file urls - elif is_file_url(link): - unpack_file_url(link, location, download_dir, hashes=hashes) - - # http urls - else: - if session is None: - session = PipSession() - - unpack_http_url( - link, - location, - download_dir, - session, - hashes=hashes, - progress_bar=progress_bar - ) - if only_download: - write_delete_marker_file(location) - - -def _download_http_url( - link, # type: Link - session, # type: PipSession - temp_dir, # type: str - hashes, # type: Hashes - progress_bar # type: str -): - # type: (...) -> Tuple[str, str] - """Download link url into temp_dir using provided session""" - target_url = link.url.split('#', 1)[0] - try: - resp = session.get( - target_url, - # We use Accept-Encoding: identity here because requests - # defaults to accepting compressed responses. This breaks in - # a variety of ways depending on how the server is configured. - # - Some servers will notice that the file isn't a compressible - # file and will leave the file alone and with an empty - # Content-Encoding - # - Some servers will notice that the file is already - # compressed and will leave the file alone and will add a - # Content-Encoding: gzip header - # - Some servers won't notice anything at all and will take - # a file that's already been compressed and compress it again - # and set the Content-Encoding: gzip header - # By setting this to request only the identity encoding We're - # hoping to eliminate the third case. Hopefully there does not - # exist a server which when given a file will notice it is - # already compressed and that you're not asking for a - # compressed file and will then decompress it before sending - # because if that's the case I don't think it'll ever be - # possible to make this work. - headers={"Accept-Encoding": "identity"}, - stream=True, - ) - resp.raise_for_status() - except requests.HTTPError as exc: - logger.critical( - "HTTP error %s while getting %s", exc.response.status_code, link, - ) - raise - - content_type = resp.headers.get('content-type', '') - filename = link.filename # fallback - # Have a look at the Content-Disposition header for a better guess - content_disposition = resp.headers.get('content-disposition') - if content_disposition: - type, params = cgi.parse_header(content_disposition) - # We use ``or`` here because we don't want to use an "empty" value - # from the filename param. - filename = params.get('filename') or filename - ext = splitext(filename)[1] - if not ext: - ext = mimetypes.guess_extension(content_type) - if ext: - filename += ext - if not ext and link.url != resp.url: - ext = os.path.splitext(resp.url)[1] - if ext: - filename += ext - file_path = os.path.join(temp_dir, filename) - with open(file_path, 'wb') as content_file: - _download_url(resp, link, content_file, hashes, progress_bar) - return file_path, content_type - - -def _check_download_dir(link, download_dir, hashes): - # type: (Link, str, Hashes) -> Optional[str] - """ Check download_dir for previously downloaded file with correct hash - If a correct file is found return its path else None - """ - download_path = os.path.join(download_dir, link.filename) - if os.path.exists(download_path): - # If already downloaded, does its hash match? - logger.info('File was already downloaded %s', download_path) - if hashes: - try: - hashes.check_against_path(download_path) - except HashMismatch: - logger.warning( - 'Previously-downloaded file %s has bad hash. ' - 'Re-downloading.', - download_path - ) - os.unlink(download_path) - return None - return download_path - return None diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/exceptions.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/exceptions.py deleted file mode 100644 index 38ceeea..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/exceptions.py +++ /dev/null @@ -1,274 +0,0 @@ -"""Exceptions used throughout package""" -from __future__ import absolute_import - -from itertools import chain, groupby, repeat - -from pip._vendor.six import iteritems - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional # noqa: F401 - from pip._internal.req.req_install import InstallRequirement # noqa: F401 - - -class PipError(Exception): - """Base pip exception""" - - -class ConfigurationError(PipError): - """General exception in configuration""" - - -class InstallationError(PipError): - """General exception during installation""" - - -class UninstallationError(PipError): - """General exception during uninstallation""" - - -class DistributionNotFound(InstallationError): - """Raised when a distribution cannot be found to satisfy a requirement""" - - -class RequirementsFileParseError(InstallationError): - """Raised when a general error occurs parsing a requirements file line.""" - - -class BestVersionAlreadyInstalled(PipError): - """Raised when the most up-to-date version of a package is already - installed.""" - - -class BadCommand(PipError): - """Raised when virtualenv or a command is not found""" - - -class CommandError(PipError): - """Raised when there is an error in command-line arguments""" - - -class PreviousBuildDirError(PipError): - """Raised when there's a previous conflicting build directory""" - - -class InvalidWheelFilename(InstallationError): - """Invalid wheel filename.""" - - -class UnsupportedWheel(InstallationError): - """Unsupported wheel.""" - - -class HashErrors(InstallationError): - """Multiple HashError instances rolled into one for reporting""" - - def __init__(self): - self.errors = [] - - def append(self, error): - self.errors.append(error) - - def __str__(self): - lines = [] - self.errors.sort(key=lambda e: e.order) - for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__): - lines.append(cls.head) - lines.extend(e.body() for e in errors_of_cls) - if lines: - return '\n'.join(lines) - - def __nonzero__(self): - return bool(self.errors) - - def __bool__(self): - return self.__nonzero__() - - -class HashError(InstallationError): - """ - A failure to verify a package against known-good hashes - - :cvar order: An int sorting hash exception classes by difficulty of - recovery (lower being harder), so the user doesn't bother fretting - about unpinned packages when he has deeper issues, like VCS - dependencies, to deal with. Also keeps error reports in a - deterministic order. - :cvar head: A section heading for display above potentially many - exceptions of this kind - :ivar req: The InstallRequirement that triggered this error. This is - pasted on after the exception is instantiated, because it's not - typically available earlier. - - """ - req = None # type: Optional[InstallRequirement] - head = '' - - def body(self): - """Return a summary of me for display under the heading. - - This default implementation simply prints a description of the - triggering requirement. - - :param req: The InstallRequirement that provoked this error, with - populate_link() having already been called - - """ - return ' %s' % self._requirement_name() - - def __str__(self): - return '%s\n%s' % (self.head, self.body()) - - def _requirement_name(self): - """Return a description of the requirement that triggered me. - - This default implementation returns long description of the req, with - line numbers - - """ - return str(self.req) if self.req else 'unknown package' - - -class VcsHashUnsupported(HashError): - """A hash was provided for a version-control-system-based requirement, but - we don't have a method for hashing those.""" - - order = 0 - head = ("Can't verify hashes for these requirements because we don't " - "have a way to hash version control repositories:") - - -class DirectoryUrlHashUnsupported(HashError): - """A hash was provided for a version-control-system-based requirement, but - we don't have a method for hashing those.""" - - order = 1 - head = ("Can't verify hashes for these file:// requirements because they " - "point to directories:") - - -class HashMissing(HashError): - """A hash was needed for a requirement but is absent.""" - - order = 2 - head = ('Hashes are required in --require-hashes mode, but they are ' - 'missing from some requirements. Here is a list of those ' - 'requirements along with the hashes their downloaded archives ' - 'actually had. Add lines like these to your requirements files to ' - 'prevent tampering. (If you did not enable --require-hashes ' - 'manually, note that it turns on automatically when any package ' - 'has a hash.)') - - def __init__(self, gotten_hash): - """ - :param gotten_hash: The hash of the (possibly malicious) archive we - just downloaded - """ - self.gotten_hash = gotten_hash - - def body(self): - # Dodge circular import. - from pip._internal.utils.hashes import FAVORITE_HASH - - package = None - if self.req: - # In the case of URL-based requirements, display the original URL - # seen in the requirements file rather than the package name, - # so the output can be directly copied into the requirements file. - package = (self.req.original_link if self.req.original_link - # In case someone feeds something downright stupid - # to InstallRequirement's constructor. - else getattr(self.req, 'req', None)) - return ' %s --hash=%s:%s' % (package or 'unknown package', - FAVORITE_HASH, - self.gotten_hash) - - -class HashUnpinned(HashError): - """A requirement had a hash specified but was not pinned to a specific - version.""" - - order = 3 - head = ('In --require-hashes mode, all requirements must have their ' - 'versions pinned with ==. These do not:') - - -class HashMismatch(HashError): - """ - Distribution file hash values don't match. - - :ivar package_name: The name of the package that triggered the hash - mismatch. Feel free to write to this after the exception is raise to - improve its error message. - - """ - order = 4 - head = ('THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS ' - 'FILE. If you have updated the package versions, please update ' - 'the hashes. Otherwise, examine the package contents carefully; ' - 'someone may have tampered with them.') - - def __init__(self, allowed, gots): - """ - :param allowed: A dict of algorithm names pointing to lists of allowed - hex digests - :param gots: A dict of algorithm names pointing to hashes we - actually got from the files under suspicion - """ - self.allowed = allowed - self.gots = gots - - def body(self): - return ' %s:\n%s' % (self._requirement_name(), - self._hash_comparison()) - - def _hash_comparison(self): - """ - Return a comparison of actual and expected hash values. - - Example:: - - Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde - or 123451234512345123451234512345123451234512345 - Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef - - """ - def hash_then_or(hash_name): - # For now, all the decent hashes have 6-char names, so we can get - # away with hard-coding space literals. - return chain([hash_name], repeat(' or')) - - lines = [] - for hash_name, expecteds in iteritems(self.allowed): - prefix = hash_then_or(hash_name) - lines.extend((' Expected %s %s' % (next(prefix), e)) - for e in expecteds) - lines.append(' Got %s\n' % - self.gots[hash_name].hexdigest()) - prefix = ' or' - return '\n'.join(lines) - - -class UnsupportedPythonVersion(InstallationError): - """Unsupported python version according to Requires-Python package - metadata.""" - - -class ConfigurationFileCouldNotBeLoaded(ConfigurationError): - """When there are errors while loading a configuration file - """ - - def __init__(self, reason="could not be loaded", fname=None, error=None): - super(ConfigurationFileCouldNotBeLoaded, self).__init__(error) - self.reason = reason - self.fname = fname - self.error = error - - def __str__(self): - if self.fname is not None: - message_part = " in {}.".format(self.fname) - else: - assert self.error is not None - message_part = ".\n{}\n".format(self.error.message) - return "Configuration file {}{}".format(self.reason, message_part) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/index.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/index.py deleted file mode 100644 index 9eda3a3..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/index.py +++ /dev/null @@ -1,990 +0,0 @@ -"""Routines related to PyPI, indexes""" -from __future__ import absolute_import - -import cgi -import itertools -import logging -import mimetypes -import os -import posixpath -import re -import sys -from collections import namedtuple - -from pip._vendor import html5lib, requests, six -from pip._vendor.distlib.compat import unescape -from pip._vendor.packaging import specifiers -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.requests.exceptions import RetryError, SSLError -from pip._vendor.six.moves.urllib import parse as urllib_parse -from pip._vendor.six.moves.urllib import request as urllib_request - -from pip._internal.download import HAS_TLS, is_url, path_to_url, url_to_path -from pip._internal.exceptions import ( - BestVersionAlreadyInstalled, DistributionNotFound, InvalidWheelFilename, - UnsupportedWheel, -) -from pip._internal.models.candidate import InstallationCandidate -from pip._internal.models.format_control import FormatControl -from pip._internal.models.index import PyPI -from pip._internal.models.link import Link -from pip._internal.pep425tags import get_supported -from pip._internal.utils.compat import ipaddress -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, WHEEL_EXTENSION, normalize_path, - redact_password_from_url, -) -from pip._internal.utils.packaging import check_requires_python -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.wheel import Wheel - -if MYPY_CHECK_RUNNING: - from logging import Logger # noqa: F401 - from typing import ( # noqa: F401 - Tuple, Optional, Any, List, Union, Callable, Set, Sequence, - Iterable, MutableMapping - ) - from pip._vendor.packaging.version import _BaseVersion # noqa: F401 - from pip._vendor.requests import Response # noqa: F401 - from pip._internal.req import InstallRequirement # noqa: F401 - from pip._internal.download import PipSession # noqa: F401 - - SecureOrigin = Tuple[str, str, Optional[str]] - BuildTag = Tuple[Any, ...] # either emply tuple or Tuple[int, str] - CandidateSortingKey = Tuple[int, _BaseVersion, BuildTag, Optional[int]] - -__all__ = ['FormatControl', 'PackageFinder'] - - -SECURE_ORIGINS = [ - # protocol, hostname, port - # Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC) - ("https", "*", "*"), - ("*", "localhost", "*"), - ("*", "127.0.0.0/8", "*"), - ("*", "::1/128", "*"), - ("file", "*", None), - # ssh is always secure. - ("ssh", "*", "*"), -] # type: List[SecureOrigin] - - -logger = logging.getLogger(__name__) - - -def _match_vcs_scheme(url): - # type: (str) -> Optional[str] - """Look for VCS schemes in the URL. - - Returns the matched VCS scheme, or None if there's no match. - """ - from pip._internal.vcs import VcsSupport - for scheme in VcsSupport.schemes: - if url.lower().startswith(scheme) and url[len(scheme)] in '+:': - return scheme - return None - - -def _is_url_like_archive(url): - # type: (str) -> bool - """Return whether the URL looks like an archive. - """ - filename = Link(url).filename - for bad_ext in ARCHIVE_EXTENSIONS: - if filename.endswith(bad_ext): - return True - return False - - -class _NotHTML(Exception): - def __init__(self, content_type, request_desc): - # type: (str, str) -> None - super(_NotHTML, self).__init__(content_type, request_desc) - self.content_type = content_type - self.request_desc = request_desc - - -def _ensure_html_header(response): - # type: (Response) -> None - """Check the Content-Type header to ensure the response contains HTML. - - Raises `_NotHTML` if the content type is not text/html. - """ - content_type = response.headers.get("Content-Type", "") - if not content_type.lower().startswith("text/html"): - raise _NotHTML(content_type, response.request.method) - - -class _NotHTTP(Exception): - pass - - -def _ensure_html_response(url, session): - # type: (str, PipSession) -> None - """Send a HEAD request to the URL, and ensure the response contains HTML. - - Raises `_NotHTTP` if the URL is not available for a HEAD request, or - `_NotHTML` if the content type is not text/html. - """ - scheme, netloc, path, query, fragment = urllib_parse.urlsplit(url) - if scheme not in {'http', 'https'}: - raise _NotHTTP() - - resp = session.head(url, allow_redirects=True) - resp.raise_for_status() - - _ensure_html_header(resp) - - -def _get_html_response(url, session): - # type: (str, PipSession) -> Response - """Access an HTML page with GET, and return the response. - - This consists of three parts: - - 1. If the URL looks suspiciously like an archive, send a HEAD first to - check the Content-Type is HTML, to avoid downloading a large file. - Raise `_NotHTTP` if the content type cannot be determined, or - `_NotHTML` if it is not HTML. - 2. Actually perform the request. Raise HTTP exceptions on network failures. - 3. Check the Content-Type header to make sure we got HTML, and raise - `_NotHTML` otherwise. - """ - if _is_url_like_archive(url): - _ensure_html_response(url, session=session) - - logger.debug('Getting page %s', url) - - resp = session.get( - url, - headers={ - "Accept": "text/html", - # We don't want to blindly returned cached data for - # /simple/, because authors generally expecting that - # twine upload && pip install will function, but if - # they've done a pip install in the last ~10 minutes - # it won't. Thus by setting this to zero we will not - # blindly use any cached data, however the benefit of - # using max-age=0 instead of no-cache, is that we will - # still support conditional requests, so we will still - # minimize traffic sent in cases where the page hasn't - # changed at all, we will just always incur the round - # trip for the conditional GET now instead of only - # once per 10 minutes. - # For more information, please see pypa/pip#5670. - "Cache-Control": "max-age=0", - }, - ) - resp.raise_for_status() - - # The check for archives above only works if the url ends with - # something that looks like an archive. However that is not a - # requirement of an url. Unless we issue a HEAD request on every - # url we cannot know ahead of time for sure if something is HTML - # or not. However we can check after we've downloaded it. - _ensure_html_header(resp) - - return resp - - -def _handle_get_page_fail( - link, # type: Link - reason, # type: Union[str, Exception] - meth=None # type: Optional[Callable[..., None]] -): - # type: (...) -> None - if meth is None: - meth = logger.debug - meth("Could not fetch URL %s: %s - skipping", link, reason) - - -def _get_html_page(link, session=None): - # type: (Link, Optional[PipSession]) -> Optional[HTMLPage] - if session is None: - raise TypeError( - "_get_html_page() missing 1 required keyword argument: 'session'" - ) - - url = link.url.split('#', 1)[0] - - # Check for VCS schemes that do not support lookup as web pages. - vcs_scheme = _match_vcs_scheme(url) - if vcs_scheme: - logger.debug('Cannot look at %s URL %s', vcs_scheme, link) - return None - - # Tack index.html onto file:// URLs that point to directories - scheme, _, path, _, _, _ = urllib_parse.urlparse(url) - if (scheme == 'file' and os.path.isdir(urllib_request.url2pathname(path))): - # add trailing slash if not present so urljoin doesn't trim - # final segment - if not url.endswith('/'): - url += '/' - url = urllib_parse.urljoin(url, 'index.html') - logger.debug(' file: URL is directory, getting %s', url) - - try: - resp = _get_html_response(url, session=session) - except _NotHTTP as exc: - logger.debug( - 'Skipping page %s because it looks like an archive, and cannot ' - 'be checked by HEAD.', link, - ) - except _NotHTML as exc: - logger.debug( - 'Skipping page %s because the %s request got Content-Type: %s', - link, exc.request_desc, exc.content_type, - ) - except requests.HTTPError as exc: - _handle_get_page_fail(link, exc) - except RetryError as exc: - _handle_get_page_fail(link, exc) - except SSLError as exc: - reason = "There was a problem confirming the ssl certificate: " - reason += str(exc) - _handle_get_page_fail(link, reason, meth=logger.info) - except requests.ConnectionError as exc: - _handle_get_page_fail(link, "connection error: %s" % exc) - except requests.Timeout: - _handle_get_page_fail(link, "timed out") - else: - return HTMLPage(resp.content, resp.url, resp.headers) - return None - - -class PackageFinder(object): - """This finds packages. - - This is meant to match easy_install's technique for looking for - packages, by reading pages and looking for appropriate links. - """ - - def __init__( - self, - find_links, # type: List[str] - index_urls, # type: List[str] - allow_all_prereleases=False, # type: bool - trusted_hosts=None, # type: Optional[Iterable[str]] - session=None, # type: Optional[PipSession] - format_control=None, # type: Optional[FormatControl] - platform=None, # type: Optional[str] - versions=None, # type: Optional[List[str]] - abi=None, # type: Optional[str] - implementation=None, # type: Optional[str] - prefer_binary=False # type: bool - ): - # type: (...) -> None - """Create a PackageFinder. - - :param format_control: A FormatControl object or None. Used to control - the selection of source packages / binary packages when consulting - the index and links. - :param platform: A string or None. If None, searches for packages - that are supported by the current system. Otherwise, will find - packages that can be built on the platform passed in. These - packages will only be downloaded for distribution: they will - not be built locally. - :param versions: A list of strings or None. This is passed directly - to pep425tags.py in the get_supported() method. - :param abi: A string or None. This is passed directly - to pep425tags.py in the get_supported() method. - :param implementation: A string or None. This is passed directly - to pep425tags.py in the get_supported() method. - """ - if session is None: - raise TypeError( - "PackageFinder() missing 1 required keyword argument: " - "'session'" - ) - - # Build find_links. If an argument starts with ~, it may be - # a local file relative to a home directory. So try normalizing - # it and if it exists, use the normalized version. - # This is deliberately conservative - it might be fine just to - # blindly normalize anything starting with a ~... - self.find_links = [] # type: List[str] - for link in find_links: - if link.startswith('~'): - new_link = normalize_path(link) - if os.path.exists(new_link): - link = new_link - self.find_links.append(link) - - self.index_urls = index_urls - - # These are boring links that have already been logged somehow: - self.logged_links = set() # type: Set[Link] - - self.format_control = format_control or FormatControl(set(), set()) - - # Domains that we won't emit warnings for when not using HTTPS - self.secure_origins = [ - ("*", host, "*") - for host in (trusted_hosts if trusted_hosts else []) - ] # type: List[SecureOrigin] - - # Do we want to allow _all_ pre-releases? - self.allow_all_prereleases = allow_all_prereleases - - # The Session we'll use to make requests - self.session = session - - # The valid tags to check potential found wheel candidates against - self.valid_tags = get_supported( - versions=versions, - platform=platform, - abi=abi, - impl=implementation, - ) - - # Do we prefer old, but valid, binary dist over new source dist - self.prefer_binary = prefer_binary - - # If we don't have TLS enabled, then WARN if anyplace we're looking - # relies on TLS. - if not HAS_TLS: - for link in itertools.chain(self.index_urls, self.find_links): - parsed = urllib_parse.urlparse(link) - if parsed.scheme == "https": - logger.warning( - "pip is configured with locations that require " - "TLS/SSL, however the ssl module in Python is not " - "available." - ) - break - - def get_formatted_locations(self): - # type: () -> str - lines = [] - if self.index_urls and self.index_urls != [PyPI.simple_url]: - lines.append( - "Looking in indexes: {}".format(", ".join( - redact_password_from_url(url) for url in self.index_urls)) - ) - if self.find_links: - lines.append( - "Looking in links: {}".format(", ".join(self.find_links)) - ) - return "\n".join(lines) - - @staticmethod - def _sort_locations(locations, expand_dir=False): - # type: (Sequence[str], bool) -> Tuple[List[str], List[str]] - """ - Sort locations into "files" (archives) and "urls", and return - a pair of lists (files,urls) - """ - files = [] - urls = [] - - # puts the url for the given file path into the appropriate list - def sort_path(path): - url = path_to_url(path) - if mimetypes.guess_type(url, strict=False)[0] == 'text/html': - urls.append(url) - else: - files.append(url) - - for url in locations: - - is_local_path = os.path.exists(url) - is_file_url = url.startswith('file:') - - if is_local_path or is_file_url: - if is_local_path: - path = url - else: - path = url_to_path(url) - if os.path.isdir(path): - if expand_dir: - path = os.path.realpath(path) - for item in os.listdir(path): - sort_path(os.path.join(path, item)) - elif is_file_url: - urls.append(url) - else: - logger.warning( - "Path '{0}' is ignored: " - "it is a directory.".format(path), - ) - elif os.path.isfile(path): - sort_path(path) - else: - logger.warning( - "Url '%s' is ignored: it is neither a file " - "nor a directory.", url, - ) - elif is_url(url): - # Only add url with clear scheme - urls.append(url) - else: - logger.warning( - "Url '%s' is ignored. It is either a non-existing " - "path or lacks a specific scheme.", url, - ) - - return files, urls - - def _candidate_sort_key(self, candidate): - # type: (InstallationCandidate) -> CandidateSortingKey - """ - Function used to generate link sort key for link tuples. - The greater the return value, the more preferred it is. - If not finding wheels, then sorted by version only. - If finding wheels, then the sort order is by version, then: - 1. existing installs - 2. wheels ordered via Wheel.support_index_min(self.valid_tags) - 3. source archives - If prefer_binary was set, then all wheels are sorted above sources. - Note: it was considered to embed this logic into the Link - comparison operators, but then different sdist links - with the same version, would have to be considered equal - """ - support_num = len(self.valid_tags) - build_tag = tuple() # type: BuildTag - binary_preference = 0 - if candidate.location.is_wheel: - # can raise InvalidWheelFilename - wheel = Wheel(candidate.location.filename) - if not wheel.supported(self.valid_tags): - raise UnsupportedWheel( - "%s is not a supported wheel for this platform. It " - "can't be sorted." % wheel.filename - ) - if self.prefer_binary: - binary_preference = 1 - pri = -(wheel.support_index_min(self.valid_tags)) - if wheel.build_tag is not None: - match = re.match(r'^(\d+)(.*)$', wheel.build_tag) - build_tag_groups = match.groups() - build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) - else: # sdist - pri = -(support_num) - return (binary_preference, candidate.version, build_tag, pri) - - def _validate_secure_origin(self, logger, location): - # type: (Logger, Link) -> bool - # Determine if this url used a secure transport mechanism - parsed = urllib_parse.urlparse(str(location)) - origin = (parsed.scheme, parsed.hostname, parsed.port) - - # The protocol to use to see if the protocol matches. - # Don't count the repository type as part of the protocol: in - # cases such as "git+ssh", only use "ssh". (I.e., Only verify against - # the last scheme.) - protocol = origin[0].rsplit('+', 1)[-1] - - # Determine if our origin is a secure origin by looking through our - # hardcoded list of secure origins, as well as any additional ones - # configured on this PackageFinder instance. - for secure_origin in (SECURE_ORIGINS + self.secure_origins): - if protocol != secure_origin[0] and secure_origin[0] != "*": - continue - - try: - # We need to do this decode dance to ensure that we have a - # unicode object, even on Python 2.x. - addr = ipaddress.ip_address( - origin[1] - if ( - isinstance(origin[1], six.text_type) or - origin[1] is None - ) - else origin[1].decode("utf8") - ) - network = ipaddress.ip_network( - secure_origin[1] - if isinstance(secure_origin[1], six.text_type) - # setting secure_origin[1] to proper Union[bytes, str] - # creates problems in other places - else secure_origin[1].decode("utf8") # type: ignore - ) - except ValueError: - # We don't have both a valid address or a valid network, so - # we'll check this origin against hostnames. - if (origin[1] and - origin[1].lower() != secure_origin[1].lower() and - secure_origin[1] != "*"): - continue - else: - # We have a valid address and network, so see if the address - # is contained within the network. - if addr not in network: - continue - - # Check to see if the port patches - if (origin[2] != secure_origin[2] and - secure_origin[2] != "*" and - secure_origin[2] is not None): - continue - - # If we've gotten here, then this origin matches the current - # secure origin and we should return True - return True - - # If we've gotten to this point, then the origin isn't secure and we - # will not accept it as a valid location to search. We will however - # log a warning that we are ignoring it. - logger.warning( - "The repository located at %s is not a trusted or secure host and " - "is being ignored. If this repository is available via HTTPS we " - "recommend you use HTTPS instead, otherwise you may silence " - "this warning and allow it anyway with '--trusted-host %s'.", - parsed.hostname, - parsed.hostname, - ) - - return False - - def _get_index_urls_locations(self, project_name): - # type: (str) -> List[str] - """Returns the locations found via self.index_urls - - Checks the url_name on the main (first in the list) index and - use this url_name to produce all locations - """ - - def mkurl_pypi_url(url): - loc = posixpath.join( - url, - urllib_parse.quote(canonicalize_name(project_name))) - # For maximum compatibility with easy_install, ensure the path - # ends in a trailing slash. Although this isn't in the spec - # (and PyPI can handle it without the slash) some other index - # implementations might break if they relied on easy_install's - # behavior. - if not loc.endswith('/'): - loc = loc + '/' - return loc - - return [mkurl_pypi_url(url) for url in self.index_urls] - - def find_all_candidates(self, project_name): - # type: (str) -> List[Optional[InstallationCandidate]] - """Find all available InstallationCandidate for project_name - - This checks index_urls and find_links. - All versions found are returned as an InstallationCandidate list. - - See _link_package_versions for details on which files are accepted - """ - index_locations = self._get_index_urls_locations(project_name) - index_file_loc, index_url_loc = self._sort_locations(index_locations) - fl_file_loc, fl_url_loc = self._sort_locations( - self.find_links, expand_dir=True, - ) - - file_locations = (Link(url) for url in itertools.chain( - index_file_loc, fl_file_loc, - )) - - # We trust every url that the user has given us whether it was given - # via --index-url or --find-links. - # We want to filter out any thing which does not have a secure origin. - url_locations = [ - link for link in itertools.chain( - (Link(url) for url in index_url_loc), - (Link(url) for url in fl_url_loc), - ) - if self._validate_secure_origin(logger, link) - ] - - logger.debug('%d location(s) to search for versions of %s:', - len(url_locations), project_name) - - for location in url_locations: - logger.debug('* %s', location) - - canonical_name = canonicalize_name(project_name) - formats = self.format_control.get_allowed_formats(canonical_name) - search = Search(project_name, canonical_name, formats) - find_links_versions = self._package_versions( - # We trust every directly linked archive in find_links - (Link(url, '-f') for url in self.find_links), - search - ) - - page_versions = [] - for page in self._get_pages(url_locations, project_name): - logger.debug('Analyzing links from page %s', page.url) - with indent_log(): - page_versions.extend( - self._package_versions(page.iter_links(), search) - ) - - file_versions = self._package_versions(file_locations, search) - if file_versions: - file_versions.sort(reverse=True) - logger.debug( - 'Local files found: %s', - ', '.join([ - url_to_path(candidate.location.url) - for candidate in file_versions - ]) - ) - - # This is an intentional priority ordering - return file_versions + find_links_versions + page_versions - - def find_requirement(self, req, upgrade): - # type: (InstallRequirement, bool) -> Optional[Link] - """Try to find a Link matching req - - Expects req, an InstallRequirement and upgrade, a boolean - Returns a Link if found, - Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise - """ - all_candidates = self.find_all_candidates(req.name) - - # Filter out anything which doesn't match our specifier - compatible_versions = set( - req.specifier.filter( - # We turn the version object into a str here because otherwise - # when we're debundled but setuptools isn't, Python will see - # packaging.version.Version and - # pkg_resources._vendor.packaging.version.Version as different - # types. This way we'll use a str as a common data interchange - # format. If we stop using the pkg_resources provided specifier - # and start using our own, we can drop the cast to str(). - [str(c.version) for c in all_candidates], - prereleases=( - self.allow_all_prereleases - if self.allow_all_prereleases else None - ), - ) - ) - applicable_candidates = [ - # Again, converting to str to deal with debundling. - c for c in all_candidates if str(c.version) in compatible_versions - ] - - if applicable_candidates: - best_candidate = max(applicable_candidates, - key=self._candidate_sort_key) - else: - best_candidate = None - - if req.satisfied_by is not None: - installed_version = parse_version(req.satisfied_by.version) - else: - installed_version = None - - if installed_version is None and best_candidate is None: - logger.critical( - 'Could not find a version that satisfies the requirement %s ' - '(from versions: %s)', - req, - ', '.join( - sorted( - {str(c.version) for c in all_candidates}, - key=parse_version, - ) - ) - ) - - raise DistributionNotFound( - 'No matching distribution found for %s' % req - ) - - best_installed = False - if installed_version and ( - best_candidate is None or - best_candidate.version <= installed_version): - best_installed = True - - if not upgrade and installed_version is not None: - if best_installed: - logger.debug( - 'Existing installed version (%s) is most up-to-date and ' - 'satisfies requirement', - installed_version, - ) - else: - logger.debug( - 'Existing installed version (%s) satisfies requirement ' - '(most up-to-date version is %s)', - installed_version, - best_candidate.version, - ) - return None - - if best_installed: - # We have an existing version, and its the best version - logger.debug( - 'Installed version (%s) is most up-to-date (past versions: ' - '%s)', - installed_version, - ', '.join(sorted(compatible_versions, key=parse_version)) or - "none", - ) - raise BestVersionAlreadyInstalled - - logger.debug( - 'Using version %s (newest of versions: %s)', - best_candidate.version, - ', '.join(sorted(compatible_versions, key=parse_version)) - ) - return best_candidate.location - - def _get_pages(self, locations, project_name): - # type: (Iterable[Link], str) -> Iterable[HTMLPage] - """ - Yields (page, page_url) from the given locations, skipping - locations that have errors. - """ - seen = set() # type: Set[Link] - for location in locations: - if location in seen: - continue - seen.add(location) - - page = _get_html_page(location, session=self.session) - if page is None: - continue - - yield page - - _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') - - def _sort_links(self, links): - # type: (Iterable[Link]) -> List[Link] - """ - Returns elements of links in order, non-egg links first, egg links - second, while eliminating duplicates - """ - eggs, no_eggs = [], [] - seen = set() # type: Set[Link] - for link in links: - if link not in seen: - seen.add(link) - if link.egg_fragment: - eggs.append(link) - else: - no_eggs.append(link) - return no_eggs + eggs - - def _package_versions( - self, - links, # type: Iterable[Link] - search # type: Search - ): - # type: (...) -> List[Optional[InstallationCandidate]] - result = [] - for link in self._sort_links(links): - v = self._link_package_versions(link, search) - if v is not None: - result.append(v) - return result - - def _log_skipped_link(self, link, reason): - # type: (Link, str) -> None - if link not in self.logged_links: - logger.debug('Skipping link %s; %s', link, reason) - self.logged_links.add(link) - - def _link_package_versions(self, link, search): - # type: (Link, Search) -> Optional[InstallationCandidate] - """Return an InstallationCandidate or None""" - version = None - if link.egg_fragment: - egg_info = link.egg_fragment - ext = link.ext - else: - egg_info, ext = link.splitext() - if not ext: - self._log_skipped_link(link, 'not a file') - return None - if ext not in SUPPORTED_EXTENSIONS: - self._log_skipped_link( - link, 'unsupported archive format: %s' % ext, - ) - return None - if "binary" not in search.formats and ext == WHEEL_EXTENSION: - self._log_skipped_link( - link, 'No binaries permitted for %s' % search.supplied, - ) - return None - if "macosx10" in link.path and ext == '.zip': - self._log_skipped_link(link, 'macosx10 one') - return None - if ext == WHEEL_EXTENSION: - try: - wheel = Wheel(link.filename) - except InvalidWheelFilename: - self._log_skipped_link(link, 'invalid wheel filename') - return None - if canonicalize_name(wheel.name) != search.canonical: - self._log_skipped_link( - link, 'wrong project name (not %s)' % search.supplied) - return None - - if not wheel.supported(self.valid_tags): - self._log_skipped_link( - link, 'it is not compatible with this Python') - return None - - version = wheel.version - - # This should be up by the search.ok_binary check, but see issue 2700. - if "source" not in search.formats and ext != WHEEL_EXTENSION: - self._log_skipped_link( - link, 'No sources permitted for %s' % search.supplied, - ) - return None - - if not version: - version = _egg_info_matches(egg_info, search.canonical) - if not version: - self._log_skipped_link( - link, 'Missing project version for %s' % search.supplied) - return None - - match = self._py_version_re.search(version) - if match: - version = version[:match.start()] - py_version = match.group(1) - if py_version != sys.version[:3]: - self._log_skipped_link( - link, 'Python version is incorrect') - return None - try: - support_this_python = check_requires_python(link.requires_python) - except specifiers.InvalidSpecifier: - logger.debug("Package %s has an invalid Requires-Python entry: %s", - link.filename, link.requires_python) - support_this_python = True - - if not support_this_python: - logger.debug("The package %s is incompatible with the python " - "version in use. Acceptable python versions are: %s", - link, link.requires_python) - return None - logger.debug('Found link %s, version: %s', link, version) - - return InstallationCandidate(search.supplied, version, link) - - -def _find_name_version_sep(egg_info, canonical_name): - # type: (str, str) -> int - """Find the separator's index based on the package's canonical name. - - `egg_info` must be an egg info string for the given package, and - `canonical_name` must be the package's canonical name. - - This function is needed since the canonicalized name does not necessarily - have the same length as the egg info's name part. An example:: - - >>> egg_info = 'foo__bar-1.0' - >>> canonical_name = 'foo-bar' - >>> _find_name_version_sep(egg_info, canonical_name) - 8 - """ - # Project name and version must be separated by one single dash. Find all - # occurrences of dashes; if the string in front of it matches the canonical - # name, this is the one separating the name and version parts. - for i, c in enumerate(egg_info): - if c != "-": - continue - if canonicalize_name(egg_info[:i]) == canonical_name: - return i - raise ValueError("{} does not match {}".format(egg_info, canonical_name)) - - -def _egg_info_matches(egg_info, canonical_name): - # type: (str, str) -> Optional[str] - """Pull the version part out of a string. - - :param egg_info: The string to parse. E.g. foo-2.1 - :param canonical_name: The canonicalized name of the package this - belongs to. - """ - try: - version_start = _find_name_version_sep(egg_info, canonical_name) + 1 - except ValueError: - return None - version = egg_info[version_start:] - if not version: - return None - return version - - -def _determine_base_url(document, page_url): - """Determine the HTML document's base URL. - - This looks for a ```` tag in the HTML document. If present, its href - attribute denotes the base URL of anchor tags in the document. If there is - no such tag (or if it does not have a valid href attribute), the HTML - file's URL is used as the base URL. - - :param document: An HTML document representation. The current - implementation expects the result of ``html5lib.parse()``. - :param page_url: The URL of the HTML document. - """ - for base in document.findall(".//base"): - href = base.get("href") - if href is not None: - return href - return page_url - - -def _get_encoding_from_headers(headers): - """Determine if we have any encoding information in our headers. - """ - if headers and "Content-Type" in headers: - content_type, params = cgi.parse_header(headers["Content-Type"]) - if "charset" in params: - return params['charset'] - return None - - -_CLEAN_LINK_RE = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) - - -def _clean_link(url): - # type: (str) -> str - """Makes sure a link is fully encoded. That is, if a ' ' shows up in - the link, it will be rewritten to %20 (while not over-quoting - % or other characters).""" - return _CLEAN_LINK_RE.sub(lambda match: '%%%2x' % ord(match.group(0)), url) - - -class HTMLPage(object): - """Represents one page, along with its URL""" - - def __init__(self, content, url, headers=None): - # type: (bytes, str, MutableMapping[str, str]) -> None - self.content = content - self.url = url - self.headers = headers - - def __str__(self): - return redact_password_from_url(self.url) - - def iter_links(self): - # type: () -> Iterable[Link] - """Yields all links in the page""" - document = html5lib.parse( - self.content, - transport_encoding=_get_encoding_from_headers(self.headers), - namespaceHTMLElements=False, - ) - base_url = _determine_base_url(document, self.url) - for anchor in document.findall(".//a"): - if anchor.get("href"): - href = anchor.get("href") - url = _clean_link(urllib_parse.urljoin(base_url, href)) - pyrequire = anchor.get('data-requires-python') - pyrequire = unescape(pyrequire) if pyrequire else None - yield Link(url, self.url, requires_python=pyrequire) - - -Search = namedtuple('Search', 'supplied canonical formats') -"""Capture key aspects of a search. - -:attribute supplied: The user supplied package. -:attribute canonical: The canonical package name. -:attribute formats: The formats allowed for this package. Should be a set - with 'binary' or 'source' or both in it. -""" diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/locations.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/locations.py deleted file mode 100644 index c6e2a3e..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/locations.py +++ /dev/null @@ -1,211 +0,0 @@ -"""Locations where we look for configs, install stuff, etc""" -from __future__ import absolute_import - -import os -import os.path -import platform -import site -import sys -import sysconfig -from distutils import sysconfig as distutils_sysconfig -from distutils.command.install import SCHEME_KEYS # type: ignore - -from pip._internal.utils import appdirs -from pip._internal.utils.compat import WINDOWS, expanduser -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, Union, Dict, List, Optional # noqa: F401 - - -# Application Directories -USER_CACHE_DIR = appdirs.user_cache_dir("pip") - - -DELETE_MARKER_MESSAGE = '''\ -This file is placed here by pip to indicate the source was put -here by pip. - -Once this package is successfully installed this source code will be -deleted (unless you remove this file). -''' -PIP_DELETE_MARKER_FILENAME = 'pip-delete-this-directory.txt' - - -def write_delete_marker_file(directory): - # type: (str) -> None - """ - Write the pip delete marker file into this directory. - """ - filepath = os.path.join(directory, PIP_DELETE_MARKER_FILENAME) - with open(filepath, 'w') as marker_fp: - marker_fp.write(DELETE_MARKER_MESSAGE) - - -def running_under_virtualenv(): - # type: () -> bool - """ - Return True if we're running inside a virtualenv, False otherwise. - - """ - if hasattr(sys, 'real_prefix'): - return True - elif sys.prefix != getattr(sys, "base_prefix", sys.prefix): - return True - - return False - - -def virtualenv_no_global(): - # type: () -> bool - """ - Return True if in a venv and no system site packages. - """ - # this mirrors the logic in virtualenv.py for locating the - # no-global-site-packages.txt file - site_mod_dir = os.path.dirname(os.path.abspath(site.__file__)) - no_global_file = os.path.join(site_mod_dir, 'no-global-site-packages.txt') - if running_under_virtualenv() and os.path.isfile(no_global_file): - return True - else: - return False - - -if running_under_virtualenv(): - src_prefix = os.path.join(sys.prefix, 'src') -else: - # FIXME: keep src in cwd for now (it is not a temporary folder) - try: - src_prefix = os.path.join(os.getcwd(), 'src') - except OSError: - # In case the current working directory has been renamed or deleted - sys.exit( - "The folder you are executing pip from can no longer be found." - ) - -# under macOS + virtualenv sys.prefix is not properly resolved -# it is something like /path/to/python/bin/.. -# Note: using realpath due to tmp dirs on OSX being symlinks -src_prefix = os.path.abspath(src_prefix) - -# FIXME doesn't account for venv linked to global site-packages - -site_packages = sysconfig.get_path("purelib") # type: Optional[str] - -# This is because of a bug in PyPy's sysconfig module, see -# https://bitbucket.org/pypy/pypy/issues/2506/sysconfig-returns-incorrect-paths -# for more information. -if platform.python_implementation().lower() == "pypy": - site_packages = distutils_sysconfig.get_python_lib() -try: - # Use getusersitepackages if this is present, as it ensures that the - # value is initialised properly. - user_site = site.getusersitepackages() -except AttributeError: - user_site = site.USER_SITE -user_dir = expanduser('~') -if WINDOWS: - bin_py = os.path.join(sys.prefix, 'Scripts') - bin_user = os.path.join(user_site, 'Scripts') - # buildout uses 'bin' on Windows too? - if not os.path.exists(bin_py): - bin_py = os.path.join(sys.prefix, 'bin') - bin_user = os.path.join(user_site, 'bin') - - config_basename = 'pip.ini' - - legacy_storage_dir = os.path.join(user_dir, 'pip') - legacy_config_file = os.path.join( - legacy_storage_dir, - config_basename, - ) -else: - bin_py = os.path.join(sys.prefix, 'bin') - bin_user = os.path.join(user_site, 'bin') - - config_basename = 'pip.conf' - - legacy_storage_dir = os.path.join(user_dir, '.pip') - legacy_config_file = os.path.join( - legacy_storage_dir, - config_basename, - ) - # Forcing to use /usr/local/bin for standard macOS framework installs - # Also log to ~/Library/Logs/ for use with the Console.app log viewer - if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/': - bin_py = '/usr/local/bin' - -site_config_files = [ - os.path.join(path, config_basename) - for path in appdirs.site_config_dirs('pip') -] - -venv_config_file = os.path.join(sys.prefix, config_basename) -new_config_file = os.path.join(appdirs.user_config_dir("pip"), config_basename) - - -def distutils_scheme(dist_name, user=False, home=None, root=None, - isolated=False, prefix=None): - # type:(str, bool, str, str, bool, str) -> dict - """ - Return a distutils install scheme - """ - from distutils.dist import Distribution - - scheme = {} - - if isolated: - extra_dist_args = {"script_args": ["--no-user-cfg"]} - else: - extra_dist_args = {} - dist_args = {'name': dist_name} # type: Dict[str, Union[str, List[str]]] - dist_args.update(extra_dist_args) - - d = Distribution(dist_args) - # Ignoring, typeshed issue reported python/typeshed/issues/2567 - d.parse_config_files() - # NOTE: Ignoring type since mypy can't find attributes on 'Command' - i = d.get_command_obj('install', create=True) # type: Any - assert i is not None - # NOTE: setting user or home has the side-effect of creating the home dir - # or user base for installations during finalize_options() - # ideally, we'd prefer a scheme class that has no side-effects. - assert not (user and prefix), "user={} prefix={}".format(user, prefix) - i.user = user or i.user - if user: - i.prefix = "" - i.prefix = prefix or i.prefix - i.home = home or i.home - i.root = root or i.root - i.finalize_options() - for key in SCHEME_KEYS: - scheme[key] = getattr(i, 'install_' + key) - - # install_lib specified in setup.cfg should install *everything* - # into there (i.e. it takes precedence over both purelib and - # platlib). Note, i.install_lib is *always* set after - # finalize_options(); we only want to override here if the user - # has explicitly requested it hence going back to the config - - # Ignoring, typeshed issue reported python/typeshed/issues/2567 - if 'install_lib' in d.get_option_dict('install'): # type: ignore - scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib)) - - if running_under_virtualenv(): - scheme['headers'] = os.path.join( - sys.prefix, - 'include', - 'site', - 'python' + sys.version[:3], - dist_name, - ) - - if root is not None: - path_no_drive = os.path.splitdrive( - os.path.abspath(scheme["headers"]))[1] - scheme["headers"] = os.path.join( - root, - path_no_drive[1:], - ) - - return scheme diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__init__.py deleted file mode 100644 index 7855226..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -"""A package that contains models that represent entities. -""" diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 7d41a83acf7e69c36da6ecd656bddf49e6202fd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 279 zcmYk1Jx&BM423h>uv%&FkamiRLE9`6;-{gc0MSqog&8vwkxi_`tQc;@O*q509D$Ao zJS+v4-n0B!vYv03%Y~A9|E}-Pq<>7q|Egp-7nQkKr|wi&-Kcu@y1vll+9%he=E1RU zQ)K63(VNs^D0`TZG8T-iMV>ttv$(3O-GQ}TYOQ@!c_wFn?dt`Gv_Z%NGRBnQGI*kE zc$`{pdMCRr#w`T@05tND;>xU{c*f>0NdfZI937iOvubFRwZXohAXpz6b94dr`M?VC UY^|YjH$M^h9Po5{_EV&O08~3tX#fBK diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__pycache__/candidate.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__pycache__/candidate.cpython-38.pyc deleted file mode 100644 index e94dd76c1fdb9b7ff0cfa3fd1c7c387dbcaad299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1346 zcmZ`(OK%iM5bmDWK0IsQQ65UP;lxOI2E-*q2qjqoL4*}@NH@gLyGKgnfITQh6L#M_tCHSJwpD#kJAJ; z@*S||AUNSvl9HwlMct8Z>7`z)yV5U%G@wKT>IwKfi0h@j*5}K9IY`(2k#3Y> z8dCCr@E-4<5Z)Kwv73(g;AavI|AdoBM6KUsN()dfKN5={GA;O|F2N=q7cYtm>=z$D zee#q|e!Mq%#I|>)(}&XsU=10@{vwnvYK-!JDysd+vF`WP!umTESaUq#G`Xt}eGL>r zQp!o{aGJWW$c%D_yC?nB;~w`wrG^l zqB44%jhotlR%CK~HD8BZ9nWetE>2~~!!b~fc&`a{Wb96V3t~x^gb_oR&M|7v(go=n z&-hDn?Cb?gvPXa&V0Y#kpVQavq@Y)4iV*CJh27+0R#ZhbXSvL@j(WD&sCrN2#*SLV z*DY*4GD(P-+0p*gj)W$1oOo*3&}HR0w9ZiQ*iHchnA8cL-ze$X|#J9GZ1-N4|pQAB>R*X0qjDV zng75SQFRecP**;PPe4P|6>Jw{U%;1cAFtz44;ICH|NnRCQef7QUIEgK*&$;9)qzAk zWbFAtCRd&wW4zAc9E44Mil>fNgUp4L;P}|nB@DsF+MU1!&;f`(_1tiywN0Z<`z4Gh zhP|qIt>SK&uz>Muzm$XdBM|B5ZQy#A@qsC%j=PB}de*V zws9S95^i{kH&OTF) zuI^c#8Rf3CM&%`TVhx@z1b&>vVcYREH-&rMK`T2bAUSbA*wwlD5Nuu%n2Ra&R zQ{PNXec;D_H;lW)Kqakjnq*La+6#kT-LDV*V9W37I<8#b(Dg7*Ge3&7YI=3Fc0guN z8;u3}DtfvEGQlObs%Ac8du*3aM8SPnaALwIOhN_<`8s>S+rZ0838grZ8)595oqRTl zqn#rL({`$(O+$`1vmh^+nZxJRZ>?T3&@I!`nT`|Fx)+7R;aY2xK4!TK2eqE)_(>}Y zH(JA;te3<$o3~nNnCa!C`=za6I9&eX>*kH-&E??^rklFkC1Fd3ai$Gi*cv2CM`^3X zNd_gB&EZa7l~4*ZDao3&2Es&@yBuA(e0=c~_|2(uKv+#1jgPUT9VV;~{Q7JQ4m1dG z3Ot;n!T{&I5QcPeC&_x+6d;sjo}{jndRxj%7^lS#twRMD~O2w%}2 zd(U@2eZIR?f4-MA|pGPRG0?7QNY)E z;zuK$yP0pgIy2{K+KTnl+$N0A0(!CM$12itFv>=LB=xf(8Y!J#$Ex%y2(vt70{uL` zc$62!i9#~IemXSYz1gWyr7%4X)lD#pE723XMNL7*xaKN3paeX=O_ioEApNS4!cm;X zpDBtj(*5Ct?qVS&-N$cqGixIDIKZ{rxqDQX+%y@PK$|N#yOTJI+ndDzU^`=<6UWPI{M#dG(tT SiSHezw6t;br%Qa031+@b(+`zyMxdU}62q7d8RhOzNu-t%kJv)iR<<8hn)kNJ| zsT2R99s5uC4PKe}3oPaN(ug2o$Ov!CDlK7a1@Ita#(+xW{IV!L=&75jP?*C%)3C$ zR)=@z=w|>p$}mG2VL0@4 zWptEBccG|>MR~;{sp=EKxQ=+P1y@mC6kO}b)Df?ktOeZbL@jVual@-x zr5{Qmt12(kNzHhvQ{i+>Tut~ z^`;w!uNW7LTnXpYzqAZu~_$^VAV;NTTaANqeUSbBslKX&W z7LtepFOgC{xhj=Qu4HcfC%NXj*PMLMNryOJ&jKJpvQlwXP@LYLo}QWRp6;F=KAf5= z8TkGE=jwO=m@$lhQfL3qM&~0m^=ANXa26Pi?8_PqeKRmat6?*uSwSw$H}V>{gF;wr z6vK(eL|AH+G%XiQhUG?Crfy!-JLj{ZGHBr}I*9ubH?VPpK!d#)d~DWJWa65>}O*06Hf_#Jr1$5 z_}qW$N1)Gq{?*;D-0Qbju7BpBTUckX&?qDkWJ|B-p=r~U;X3^HlMp8!6^D;h5WKgOpuKFN>s8O$q#c7o4p+7$4Ud`{yPacp~1;XTojLWw9*j_2spMOu`OP==s+n3FVl%C9(bBrP z%>YqfEv6;dR3_?)pR^^pNNQ06DD9m=dTc1(z-nnubvr`J3UL=*7waXii`ci72wD=U z(~u_!%mVDPbi&OxbKPCzMY7b!=`P8(NJJFNrJI4@>D*gt(MK+>c^G>vqQ^^tzq*uJ z<7(~gC52?P*vY(JEp`0P;+1!5mupvHFbvnk+8Pm;AW9-6lFw2Ya}g-45^dBvn{p14 zP*WtFQ7N&anP+)cF-y#5=D&MWcZhMQN)vuP`kBBee6FLZ8vqCdL(Xu7%sSTGVv)^F zgpje$%EiC!qBjTbAR`us-{M-a#1-8 zI?~a{Urrk`GieS2XbYzne7kDOQy`?K?8q}TqQO}r6{S8S#iy3TW z=WJwbOVW&*-txCV5@VaJXzs9Ya$9W6+_C^!Vr|=fYdc2?Y=?Cg`sS7m&V1kAVOw_J zRyUIZrLJ{z4%fgRS>J}xR{aHA>YYV?bS_G#BV*oeB3hytAsmPZPKQ7!!|&mBxD9c8 zrbYDhC74-zq7y6sDcz@OaTS*#%}MhTmh(Glp&LEw#)(KPA1fs!-G3`m#u6u|kB7Nw zJ`za~H&a_LVbkHS!ONW%3U+9dA2~RNX;z(T?P7RXbC50r-E{SiS+4-=Pgfn9%CdK^+nx4>oP* zOn`)C+i%;MJ5qQfLgaa{;qZxDULJz_9mFV|w!8vDm1Ubdzz=McS}4RCpbyn8YIQ*z+k?a@plNMi19C(-+FLnLEmRL? z-|E}kXyx<~u=>#YBUejHh^KC()v4yQgh8oEpTD+DntRk0ax*Qqq_-BL_Bkl`ELL#o znu@y#ii3>F#Ttszvw>LYoz|)x#n(Ib^@U5{;+}Ya;p^`%efwH5ynlr? z?5!x@8de22lg)a^v(wqPOK+Z3QQcLJN~W2_a`XSI(`k4A+WVE0??JFEbG%O&C8~q! zoIG;!BXExEbw=xTBy(?hLAAXreSqcVH|cZrZT(rk_7?T7U0Lpj{8|-idyB2hi|>5< z`Y$|Ad2a70>0sqm$hV8fi`({88~4`#qNz>1TjPqASTD;SH1^9}?2t?p$C5nqNIOqx zN$DQ>(;*Qm+O{KxF*zt3Q*3Kjr|=xcHMur7cT8@bMoe=QH5pFsUd`bGy&#vtu5XeT z>_bHOUS^}q1XUru8IQ_scuuzCC-kuV5sbsUlhs_qkwZd`5**!x6psnpz_UZXg)Zuz zYxqbC{G&JYm5Yag2>t?&@ePL~V;j}j2XE}I7dR-h{T6U%LDbf2j_088UiE^YN-q_^ zHCoP3#;2e6R#9hQ;(1yd&yv935SUIk6ixM2ufBSH&Hgys?0 zvU^T@!@I<6A_o`nc=jj|hBB;1dEj2&@peNq{O%`5A#P0MeF1 zny{NUK>B#G*TF}0heC2dMb;l zhgdj0rw51{xefqbBoT6cR lL+-P(_BH)}DZZC^$p@6M6ul&ic(jq1&01yskeO#?>pv)vlQRGS diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/candidate.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/candidate.py deleted file mode 100644 index 4475458..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/candidate.py +++ /dev/null @@ -1,31 +0,0 @@ -from pip._vendor.packaging.version import parse as parse_version - -from pip._internal.utils.models import KeyBasedCompareMixin -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from pip._vendor.packaging.version import _BaseVersion # noqa: F401 - from pip._internal.models.link import Link # noqa: F401 - from typing import Any, Union # noqa: F401 - - -class InstallationCandidate(KeyBasedCompareMixin): - """Represents a potential "candidate" for installation. - """ - - def __init__(self, project, version, location): - # type: (Any, str, Link) -> None - self.project = project - self.version = parse_version(version) # type: _BaseVersion - self.location = location - - super(InstallationCandidate, self).__init__( - key=(self.project, self.version, self.location), - defining_class=InstallationCandidate - ) - - def __repr__(self): - # type: () -> str - return "".format( - self.project, self.version, self.location, - ) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/format_control.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/format_control.py deleted file mode 100644 index 971a391..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/format_control.py +++ /dev/null @@ -1,73 +0,0 @@ -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, Set, FrozenSet # noqa: F401 - - -class FormatControl(object): - """Helper for managing formats from which a package can be installed. - """ - - def __init__(self, no_binary=None, only_binary=None): - # type: (Optional[Set], Optional[Set]) -> None - if no_binary is None: - no_binary = set() - if only_binary is None: - only_binary = set() - - self.no_binary = no_binary - self.only_binary = only_binary - - def __eq__(self, other): - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - return not self.__eq__(other) - - def __repr__(self): - return "{}({}, {})".format( - self.__class__.__name__, - self.no_binary, - self.only_binary - ) - - @staticmethod - def handle_mutual_excludes(value, target, other): - # type: (str, Optional[Set], Optional[Set]) -> None - new = value.split(',') - while ':all:' in new: - other.clear() - target.clear() - target.add(':all:') - del new[:new.index(':all:') + 1] - # Without a none, we want to discard everything as :all: covers it - if ':none:' not in new: - return - for name in new: - if name == ':none:': - target.clear() - continue - name = canonicalize_name(name) - other.discard(name) - target.add(name) - - def get_allowed_formats(self, canonical_name): - # type: (str) -> FrozenSet - result = {"binary", "source"} - if canonical_name in self.only_binary: - result.discard('source') - elif canonical_name in self.no_binary: - result.discard('binary') - elif ':all:' in self.only_binary: - result.discard('source') - elif ':all:' in self.no_binary: - result.discard('binary') - return frozenset(result) - - def disallow_binaries(self): - # type: () -> None - self.handle_mutual_excludes( - ':all:', self.no_binary, self.only_binary, - ) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/index.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/index.py deleted file mode 100644 index ead1efb..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/index.py +++ /dev/null @@ -1,31 +0,0 @@ -from pip._vendor.six.moves.urllib import parse as urllib_parse - - -class PackageIndex(object): - """Represents a Package Index and provides easier access to endpoints - """ - - def __init__(self, url, file_storage_domain): - # type: (str, str) -> None - super(PackageIndex, self).__init__() - self.url = url - self.netloc = urllib_parse.urlsplit(url).netloc - self.simple_url = self._url_for_path('simple') - self.pypi_url = self._url_for_path('pypi') - - # This is part of a temporary hack used to block installs of PyPI - # packages which depend on external urls only necessary until PyPI can - # block such packages themselves - self.file_storage_domain = file_storage_domain - - def _url_for_path(self, path): - # type: (str) -> str - return urllib_parse.urljoin(self.url, path) - - -PyPI = PackageIndex( - 'https://pypi.org/', file_storage_domain='files.pythonhosted.org' -) -TestPyPI = PackageIndex( - 'https://test.pypi.org/', file_storage_domain='test-files.pythonhosted.org' -) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/link.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/link.py deleted file mode 100644 index ad2f93e..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/link.py +++ /dev/null @@ -1,163 +0,0 @@ -import posixpath -import re - -from pip._vendor.six.moves.urllib import parse as urllib_parse - -from pip._internal.download import path_to_url -from pip._internal.utils.misc import ( - WHEEL_EXTENSION, redact_password_from_url, splitext, -) -from pip._internal.utils.models import KeyBasedCompareMixin -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, Tuple, Union, Text # noqa: F401 - from pip._internal.index import HTMLPage # noqa: F401 - - -class Link(KeyBasedCompareMixin): - """Represents a parsed link from a Package Index's simple URL - """ - - def __init__(self, url, comes_from=None, requires_python=None): - # type: (str, Optional[Union[str, HTMLPage]], Optional[str]) -> None - """ - url: - url of the resource pointed to (href of the link) - comes_from: - instance of HTMLPage where the link was found, or string. - requires_python: - String containing the `Requires-Python` metadata field, specified - in PEP 345. This may be specified by a data-requires-python - attribute in the HTML link tag, as described in PEP 503. - """ - - # url can be a UNC windows share - if url.startswith('\\\\'): - url = path_to_url(url) - - self.url = url - self.comes_from = comes_from - self.requires_python = requires_python if requires_python else None - - super(Link, self).__init__( - key=(self.url), - defining_class=Link - ) - - def __str__(self): - if self.requires_python: - rp = ' (requires-python:%s)' % self.requires_python - else: - rp = '' - if self.comes_from: - return '%s (from %s)%s' % (redact_password_from_url(self.url), - self.comes_from, rp) - else: - return redact_password_from_url(str(self.url)) - - def __repr__(self): - return '' % self - - @property - def filename(self): - # type: () -> str - _, netloc, path, _, _ = urllib_parse.urlsplit(self.url) - name = posixpath.basename(path.rstrip('/')) or netloc - name = urllib_parse.unquote(name) - assert name, ('URL %r produced no filename' % self.url) - return name - - @property - def scheme(self): - # type: () -> str - return urllib_parse.urlsplit(self.url)[0] - - @property - def netloc(self): - # type: () -> str - return urllib_parse.urlsplit(self.url)[1] - - @property - def path(self): - # type: () -> str - return urllib_parse.unquote(urllib_parse.urlsplit(self.url)[2]) - - def splitext(self): - # type: () -> Tuple[str, str] - return splitext(posixpath.basename(self.path.rstrip('/'))) - - @property - def ext(self): - # type: () -> str - return self.splitext()[1] - - @property - def url_without_fragment(self): - # type: () -> str - scheme, netloc, path, query, fragment = urllib_parse.urlsplit(self.url) - return urllib_parse.urlunsplit((scheme, netloc, path, query, None)) - - _egg_fragment_re = re.compile(r'[#&]egg=([^&]*)') - - @property - def egg_fragment(self): - # type: () -> Optional[str] - match = self._egg_fragment_re.search(self.url) - if not match: - return None - return match.group(1) - - _subdirectory_fragment_re = re.compile(r'[#&]subdirectory=([^&]*)') - - @property - def subdirectory_fragment(self): - # type: () -> Optional[str] - match = self._subdirectory_fragment_re.search(self.url) - if not match: - return None - return match.group(1) - - _hash_re = re.compile( - r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)' - ) - - @property - def hash(self): - # type: () -> Optional[str] - match = self._hash_re.search(self.url) - if match: - return match.group(2) - return None - - @property - def hash_name(self): - # type: () -> Optional[str] - match = self._hash_re.search(self.url) - if match: - return match.group(1) - return None - - @property - def show_url(self): - # type: () -> Optional[str] - return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0]) - - @property - def is_wheel(self): - # type: () -> bool - return self.ext == WHEEL_EXTENSION - - @property - def is_artifact(self): - # type: () -> bool - """ - Determines if this points to an actual artifact (e.g. a tarball) or if - it points to an "abstract" thing like a path or a VCS location. - """ - from pip._internal.vcs import vcs - - if self.scheme in vcs.all_schemes: - return False - - return True diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 90e17249551c3d1e30f17312aa2d35fb8cf01fa9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__pycache__/freeze.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__pycache__/freeze.cpython-38.pyc deleted file mode 100644 index ee4a2dacb6ac8fadb5635be86721b6e0a8acfc7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5694 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__pycache__/prepare.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__pycache__/prepare.cpython-38.pyc deleted file mode 100644 index a2313707e61aa27dc5d642d3b901100bc328fbbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10375 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/check.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/check.py deleted file mode 100644 index 0b56eda..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/check.py +++ /dev/null @@ -1,155 +0,0 @@ -"""Validation of dependencies of packages -""" - -import logging -from collections import namedtuple - -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.pkg_resources import RequirementParseError - -from pip._internal.operations.prepare import make_abstract_dist -from pip._internal.utils.misc import get_installed_distributions -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -logger = logging.getLogger(__name__) - -if MYPY_CHECK_RUNNING: - from pip._internal.req.req_install import InstallRequirement # noqa: F401 - from typing import ( # noqa: F401 - Any, Callable, Dict, Optional, Set, Tuple, List - ) - - # Shorthands - PackageSet = Dict[str, 'PackageDetails'] - Missing = Tuple[str, Any] - Conflicting = Tuple[str, str, Any] - - MissingDict = Dict[str, List[Missing]] - ConflictingDict = Dict[str, List[Conflicting]] - CheckResult = Tuple[MissingDict, ConflictingDict] - -PackageDetails = namedtuple('PackageDetails', ['version', 'requires']) - - -def create_package_set_from_installed(**kwargs): - # type: (**Any) -> Tuple[PackageSet, bool] - """Converts a list of distributions into a PackageSet. - """ - # Default to using all packages installed on the system - if kwargs == {}: - kwargs = {"local_only": False, "skip": ()} - - package_set = {} - problems = False - for dist in get_installed_distributions(**kwargs): - name = canonicalize_name(dist.project_name) - try: - package_set[name] = PackageDetails(dist.version, dist.requires()) - except RequirementParseError as e: - # Don't crash on broken metadata - logging.warning("Error parsing requirements for %s: %s", name, e) - problems = True - return package_set, problems - - -def check_package_set(package_set, should_ignore=None): - # type: (PackageSet, Optional[Callable[[str], bool]]) -> CheckResult - """Check if a package set is consistent - - If should_ignore is passed, it should be a callable that takes a - package name and returns a boolean. - """ - if should_ignore is None: - def should_ignore(name): - return False - - missing = dict() - conflicting = dict() - - for package_name in package_set: - # Info about dependencies of package_name - missing_deps = set() # type: Set[Missing] - conflicting_deps = set() # type: Set[Conflicting] - - if should_ignore(package_name): - continue - - for req in package_set[package_name].requires: - name = canonicalize_name(req.project_name) # type: str - - # Check if it's missing - if name not in package_set: - missed = True - if req.marker is not None: - missed = req.marker.evaluate() - if missed: - missing_deps.add((name, req)) - continue - - # Check if there's a conflict - version = package_set[name].version # type: str - if not req.specifier.contains(version, prereleases=True): - conflicting_deps.add((name, version, req)) - - if missing_deps: - missing[package_name] = sorted(missing_deps, key=str) - if conflicting_deps: - conflicting[package_name] = sorted(conflicting_deps, key=str) - - return missing, conflicting - - -def check_install_conflicts(to_install): - # type: (List[InstallRequirement]) -> Tuple[PackageSet, CheckResult] - """For checking if the dependency graph would be consistent after \ - installing given requirements - """ - # Start from the current state - package_set, _ = create_package_set_from_installed() - # Install packages - would_be_installed = _simulate_installation_of(to_install, package_set) - - # Only warn about directly-dependent packages; create a whitelist of them - whitelist = _create_whitelist(would_be_installed, package_set) - - return ( - package_set, - check_package_set( - package_set, should_ignore=lambda name: name not in whitelist - ) - ) - - -def _simulate_installation_of(to_install, package_set): - # type: (List[InstallRequirement], PackageSet) -> Set[str] - """Computes the version of packages after installing to_install. - """ - - # Keep track of packages that were installed - installed = set() - - # Modify it as installing requirement_set would (assuming no errors) - for inst_req in to_install: - dist = make_abstract_dist(inst_req).dist() - name = canonicalize_name(dist.key) - package_set[name] = PackageDetails(dist.version, dist.requires()) - - installed.add(name) - - return installed - - -def _create_whitelist(would_be_installed, package_set): - # type: (Set[str], PackageSet) -> Set[str] - packages_affected = set(would_be_installed) - - for package_name in package_set: - if package_name in packages_affected: - continue - - for req in package_set[package_name].requires: - if canonicalize_name(req.name) in packages_affected: - packages_affected.add(package_name) - break - - return packages_affected diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/freeze.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/freeze.py deleted file mode 100644 index 388bb73..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/freeze.py +++ /dev/null @@ -1,247 +0,0 @@ -from __future__ import absolute_import - -import collections -import logging -import os -import re - -from pip._vendor import six -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.pkg_resources import RequirementParseError - -from pip._internal.exceptions import BadCommand, InstallationError -from pip._internal.req.constructors import ( - install_req_from_editable, install_req_from_line, -) -from pip._internal.req.req_file import COMMENT_RE -from pip._internal.utils.misc import ( - dist_is_editable, get_installed_distributions, -) -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Iterator, Optional, List, Container, Set, Dict, Tuple, Iterable, Union - ) - from pip._internal.cache import WheelCache # noqa: F401 - from pip._vendor.pkg_resources import ( # noqa: F401 - Distribution, Requirement - ) - - RequirementInfo = Tuple[Optional[Union[str, Requirement]], bool, List[str]] - - -logger = logging.getLogger(__name__) - - -def freeze( - requirement=None, # type: Optional[List[str]] - find_links=None, # type: Optional[List[str]] - local_only=None, # type: Optional[bool] - user_only=None, # type: Optional[bool] - skip_regex=None, # type: Optional[str] - isolated=False, # type: bool - wheel_cache=None, # type: Optional[WheelCache] - exclude_editable=False, # type: bool - skip=() # type: Container[str] -): - # type: (...) -> Iterator[str] - find_links = find_links or [] - skip_match = None - - if skip_regex: - skip_match = re.compile(skip_regex).search - - for link in find_links: - yield '-f %s' % link - installations = {} # type: Dict[str, FrozenRequirement] - for dist in get_installed_distributions(local_only=local_only, - skip=(), - user_only=user_only): - try: - req = FrozenRequirement.from_dist(dist) - except RequirementParseError: - logger.warning( - "Could not parse requirement: %s", - dist.project_name - ) - continue - if exclude_editable and req.editable: - continue - installations[req.name] = req - - if requirement: - # the options that don't get turned into an InstallRequirement - # should only be emitted once, even if the same option is in multiple - # requirements files, so we need to keep track of what has been emitted - # so that we don't emit it again if it's seen again - emitted_options = set() # type: Set[str] - # keep track of which files a requirement is in so that we can - # give an accurate warning if a requirement appears multiple times. - req_files = collections.defaultdict(list) # type: Dict[str, List[str]] - for req_file_path in requirement: - with open(req_file_path) as req_file: - for line in req_file: - if (not line.strip() or - line.strip().startswith('#') or - (skip_match and skip_match(line)) or - line.startswith(( - '-r', '--requirement', - '-Z', '--always-unzip', - '-f', '--find-links', - '-i', '--index-url', - '--pre', - '--trusted-host', - '--process-dependency-links', - '--extra-index-url'))): - line = line.rstrip() - if line not in emitted_options: - emitted_options.add(line) - yield line - continue - - if line.startswith('-e') or line.startswith('--editable'): - if line.startswith('-e'): - line = line[2:].strip() - else: - line = line[len('--editable'):].strip().lstrip('=') - line_req = install_req_from_editable( - line, - isolated=isolated, - wheel_cache=wheel_cache, - ) - else: - line_req = install_req_from_line( - COMMENT_RE.sub('', line).strip(), - isolated=isolated, - wheel_cache=wheel_cache, - ) - - if not line_req.name: - logger.info( - "Skipping line in requirement file [%s] because " - "it's not clear what it would install: %s", - req_file_path, line.strip(), - ) - logger.info( - " (add #egg=PackageName to the URL to avoid" - " this warning)" - ) - elif line_req.name not in installations: - # either it's not installed, or it is installed - # but has been processed already - if not req_files[line_req.name]: - logger.warning( - "Requirement file [%s] contains %s, but " - "package %r is not installed", - req_file_path, - COMMENT_RE.sub('', line).strip(), line_req.name - ) - else: - req_files[line_req.name].append(req_file_path) - else: - yield str(installations[line_req.name]).rstrip() - del installations[line_req.name] - req_files[line_req.name].append(req_file_path) - - # Warn about requirements that were included multiple times (in a - # single requirements file or in different requirements files). - for name, files in six.iteritems(req_files): - if len(files) > 1: - logger.warning("Requirement %s included multiple times [%s]", - name, ', '.join(sorted(set(files)))) - - yield( - '## The following requirements were added by ' - 'pip freeze:' - ) - for installation in sorted( - installations.values(), key=lambda x: x.name.lower()): - if canonicalize_name(installation.name) not in skip: - yield str(installation).rstrip() - - -def get_requirement_info(dist): - # type: (Distribution) -> RequirementInfo - """ - Compute and return values (req, editable, comments) for use in - FrozenRequirement.from_dist(). - """ - if not dist_is_editable(dist): - return (None, False, []) - - location = os.path.normcase(os.path.abspath(dist.location)) - - from pip._internal.vcs import vcs, RemoteNotFoundError - vc_type = vcs.get_backend_type(location) - - if not vc_type: - req = dist.as_requirement() - logger.debug( - 'No VCS found for editable requirement {!r} in: {!r}', req, - location, - ) - comments = [ - '# Editable install with no version control ({})'.format(req) - ] - return (location, True, comments) - - try: - req = vc_type.get_src_requirement(location, dist.project_name) - except RemoteNotFoundError: - req = dist.as_requirement() - comments = [ - '# Editable {} install with no remote ({})'.format( - vc_type.__name__, req, - ) - ] - return (location, True, comments) - - except BadCommand: - logger.warning( - 'cannot determine version of editable source in %s ' - '(%s command not found in path)', - location, - vc_type.name, - ) - return (None, True, []) - - except InstallationError as exc: - logger.warning( - "Error when trying to get requirement for VCS system %s, " - "falling back to uneditable format", exc - ) - else: - if req is not None: - return (req, True, []) - - logger.warning( - 'Could not determine repository location of %s', location - ) - comments = ['## !! Could not determine repository location'] - - return (None, False, comments) - - -class FrozenRequirement(object): - def __init__(self, name, req, editable, comments=()): - # type: (str, Union[str, Requirement], bool, Iterable[str]) -> None - self.name = name - self.req = req - self.editable = editable - self.comments = comments - - @classmethod - def from_dist(cls, dist): - # type: (Distribution) -> FrozenRequirement - req, editable, comments = get_requirement_info(dist) - if req is None: - req = dist.as_requirement() - - return cls(dist.project_name, req, editable, comments=comments) - - def __str__(self): - req = self.req - if self.editable: - req = '-e %s' % req - return '\n'.join(list(self.comments) + [str(req)]) + '\n' diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/prepare.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/prepare.py deleted file mode 100644 index 4f31dd5..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/prepare.py +++ /dev/null @@ -1,413 +0,0 @@ -"""Prepares a distribution for installation -""" - -import logging -import os - -from pip._vendor import pkg_resources, requests - -from pip._internal.build_env import BuildEnvironment -from pip._internal.download import ( - is_dir_url, is_file_url, is_vcs_url, unpack_url, url_to_path, -) -from pip._internal.exceptions import ( - DirectoryUrlHashUnsupported, HashUnpinned, InstallationError, - PreviousBuildDirError, VcsHashUnsupported, -) -from pip._internal.utils.compat import expanduser -from pip._internal.utils.hashes import MissingHashes -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import display_path, normalize_path -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.vcs import vcs - -if MYPY_CHECK_RUNNING: - from typing import Any, Optional # noqa: F401 - from pip._internal.req.req_install import InstallRequirement # noqa: F401 - from pip._internal.index import PackageFinder # noqa: F401 - from pip._internal.download import PipSession # noqa: F401 - from pip._internal.req.req_tracker import RequirementTracker # noqa: F401 - -logger = logging.getLogger(__name__) - - -def make_abstract_dist(req): - # type: (InstallRequirement) -> DistAbstraction - """Factory to make an abstract dist object. - - Preconditions: Either an editable req with a source_dir, or satisfied_by or - a wheel link, or a non-editable req with a source_dir. - - :return: A concrete DistAbstraction. - """ - if req.editable: - return IsSDist(req) - elif req.link and req.link.is_wheel: - return IsWheel(req) - else: - return IsSDist(req) - - -class DistAbstraction(object): - """Abstracts out the wheel vs non-wheel Resolver.resolve() logic. - - The requirements for anything installable are as follows: - - we must be able to determine the requirement name - (or we can't correctly handle the non-upgrade case). - - we must be able to generate a list of run-time dependencies - without installing any additional packages (or we would - have to either burn time by doing temporary isolated installs - or alternatively violate pips 'don't start installing unless - all requirements are available' rule - neither of which are - desirable). - - for packages with setup requirements, we must also be able - to determine their requirements without installing additional - packages (for the same reason as run-time dependencies) - - we must be able to create a Distribution object exposing the - above metadata. - """ - - def __init__(self, req): - # type: (InstallRequirement) -> None - self.req = req # type: InstallRequirement - - def dist(self): - # type: () -> Any - """Return a setuptools Dist object.""" - raise NotImplementedError - - def prep_for_dist(self, finder, build_isolation): - # type: (PackageFinder, bool) -> Any - """Ensure that we can get a Dist for this requirement.""" - raise NotImplementedError - - -class IsWheel(DistAbstraction): - - def dist(self): - # type: () -> pkg_resources.Distribution - return list(pkg_resources.find_distributions( - self.req.source_dir))[0] - - def prep_for_dist(self, finder, build_isolation): - # type: (PackageFinder, bool) -> Any - # FIXME:https://github.com/pypa/pip/issues/1112 - pass - - -class IsSDist(DistAbstraction): - - def dist(self): - return self.req.get_dist() - - def prep_for_dist(self, finder, build_isolation): - # type: (PackageFinder, bool) -> None - # Prepare for building. We need to: - # 1. Load pyproject.toml (if it exists) - # 2. Set up the build environment - - self.req.load_pyproject_toml() - should_isolate = self.req.use_pep517 and build_isolation - - def _raise_conflicts(conflicting_with, conflicting_reqs): - raise InstallationError( - "Some build dependencies for %s conflict with %s: %s." % ( - self.req, conflicting_with, ', '.join( - '%s is incompatible with %s' % (installed, wanted) - for installed, wanted in sorted(conflicting)))) - - if should_isolate: - # Isolate in a BuildEnvironment and install the build-time - # requirements. - self.req.build_env = BuildEnvironment() - self.req.build_env.install_requirements( - finder, self.req.pyproject_requires, 'overlay', - "Installing build dependencies" - ) - conflicting, missing = self.req.build_env.check_requirements( - self.req.requirements_to_check - ) - if conflicting: - _raise_conflicts("PEP 517/518 supported requirements", - conflicting) - if missing: - logger.warning( - "Missing build requirements in pyproject.toml for %s.", - self.req, - ) - logger.warning( - "The project does not specify a build backend, and " - "pip cannot fall back to setuptools without %s.", - " and ".join(map(repr, sorted(missing))) - ) - # 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. - with self.req.build_env: - # We need to have the env active when calling the hook. - self.req.spin_message = "Getting requirements to build wheel" - reqs = self.req.pep517_backend.get_requires_for_build_wheel() - conflicting, missing = self.req.build_env.check_requirements(reqs) - if conflicting: - _raise_conflicts("the backend dependencies", conflicting) - self.req.build_env.install_requirements( - finder, missing, 'normal', - "Installing backend dependencies" - ) - - self.req.prepare_metadata() - self.req.assert_source_matches_version() - - -class Installed(DistAbstraction): - - def dist(self): - # type: () -> pkg_resources.Distribution - return self.req.satisfied_by - - def prep_for_dist(self, finder, build_isolation): - # type: (PackageFinder, bool) -> Any - pass - - -class RequirementPreparer(object): - """Prepares a Requirement - """ - - def __init__( - self, - build_dir, # type: str - download_dir, # type: Optional[str] - src_dir, # type: str - wheel_download_dir, # type: Optional[str] - progress_bar, # type: str - build_isolation, # type: bool - req_tracker # type: RequirementTracker - ): - # type: (...) -> None - super(RequirementPreparer, self).__init__() - - self.src_dir = src_dir - self.build_dir = build_dir - self.req_tracker = req_tracker - - # Where still packed archives should be written to. If None, they are - # not saved, and are deleted immediately after unpacking. - self.download_dir = download_dir - - # Where still-packed .whl files should be written to. If None, they are - # written to the download_dir parameter. Separate to download_dir to - # permit only keeping wheel archives for pip wheel. - if wheel_download_dir: - wheel_download_dir = normalize_path(wheel_download_dir) - self.wheel_download_dir = wheel_download_dir - - # NOTE - # download_dir and wheel_download_dir overlap semantically and may - # be combined if we're willing to have non-wheel archives present in - # the wheelhouse output by 'pip wheel'. - - self.progress_bar = progress_bar - - # Is build isolation allowed? - self.build_isolation = build_isolation - - @property - def _download_should_save(self): - # type: () -> bool - # TODO: Modify to reduce indentation needed - if self.download_dir: - self.download_dir = expanduser(self.download_dir) - if os.path.exists(self.download_dir): - return True - else: - logger.critical('Could not find download directory') - raise InstallationError( - "Could not find or access download directory '%s'" - % display_path(self.download_dir)) - return False - - def prepare_linked_requirement( - self, - req, # type: InstallRequirement - session, # type: PipSession - finder, # type: PackageFinder - upgrade_allowed, # type: bool - require_hashes # type: bool - ): - # type: (...) -> DistAbstraction - """Prepare a requirement that would be obtained from req.link - """ - # TODO: Breakup into smaller functions - if req.link and req.link.scheme == 'file': - path = url_to_path(req.link.url) - logger.info('Processing %s', display_path(path)) - else: - logger.info('Collecting %s', req) - - with indent_log(): - # @@ if filesystem packages are not marked - # editable in a req, a non deterministic error - # occurs when the script attempts to unpack the - # build directory - req.ensure_has_source_dir(self.build_dir) - # If a checkout exists, it's unwise to keep going. version - # inconsistencies are logged later, but do not fail the - # installation. - # FIXME: this won't upgrade when there's an existing - # package unpacked in `req.source_dir` - # package unpacked in `req.source_dir` - if os.path.exists(os.path.join(req.source_dir, 'setup.py')): - raise PreviousBuildDirError( - "pip can't proceed with requirements '%s' due to a" - " pre-existing build directory (%s). This is " - "likely due to a previous installation that failed" - ". pip is being responsible and not assuming it " - "can delete this. Please delete it and try again." - % (req, req.source_dir) - ) - req.populate_link(finder, upgrade_allowed, require_hashes) - - # We can't hit this spot and have populate_link return None. - # req.satisfied_by is None here (because we're - # guarded) and upgrade has no impact except when satisfied_by - # is not None. - # Then inside find_requirement existing_applicable -> False - # If no new versions are found, DistributionNotFound is raised, - # otherwise a result is guaranteed. - assert req.link - link = req.link - - # Now that we have the real link, we can tell what kind of - # requirements we have and raise some more informative errors - # than otherwise. (For example, we can raise VcsHashUnsupported - # for a VCS URL rather than HashMissing.) - if require_hashes: - # We could check these first 2 conditions inside - # unpack_url and save repetition of conditions, but then - # we would report less-useful error messages for - # unhashable requirements, complaining that there's no - # hash provided. - if is_vcs_url(link): - raise VcsHashUnsupported() - elif is_file_url(link) and is_dir_url(link): - raise DirectoryUrlHashUnsupported() - if not req.original_link and not req.is_pinned: - # Unpinned packages are asking for trouble when a new - # version is uploaded. This isn't a security check, but - # it saves users a surprising hash mismatch in the - # future. - # - # file:/// URLs aren't pinnable, so don't complain - # about them not being pinned. - raise HashUnpinned() - - hashes = req.hashes(trust_internet=not require_hashes) - if require_hashes and not hashes: - # Known-good hashes are missing for this requirement, so - # shim it with a facade object that will provoke hash - # computation and then raise a HashMissing exception - # showing the user what the hash should be. - hashes = MissingHashes() - - try: - download_dir = self.download_dir - # We always delete unpacked sdists after pip ran. - autodelete_unpacked = True - if req.link.is_wheel and self.wheel_download_dir: - # when doing 'pip wheel` we download wheels to a - # dedicated dir. - download_dir = self.wheel_download_dir - if req.link.is_wheel: - if download_dir: - # When downloading, we only unpack wheels to get - # metadata. - autodelete_unpacked = True - else: - # When installing a wheel, we use the unpacked - # wheel. - autodelete_unpacked = False - unpack_url( - req.link, req.source_dir, - download_dir, autodelete_unpacked, - session=session, hashes=hashes, - progress_bar=self.progress_bar - ) - except requests.HTTPError as exc: - logger.critical( - 'Could not install requirement %s because of error %s', - req, - exc, - ) - raise InstallationError( - 'Could not install requirement %s because of HTTP ' - 'error %s for URL %s' % - (req, exc, req.link) - ) - abstract_dist = make_abstract_dist(req) - with self.req_tracker.track(req): - abstract_dist.prep_for_dist(finder, self.build_isolation) - if self._download_should_save: - # Make a .zip of the source_dir we already created. - if req.link.scheme in vcs.all_schemes: - req.archive(self.download_dir) - return abstract_dist - - def prepare_editable_requirement( - self, - req, # type: InstallRequirement - require_hashes, # type: bool - use_user_site, # type: bool - finder # type: PackageFinder - ): - # type: (...) -> DistAbstraction - """Prepare an editable requirement - """ - assert req.editable, "cannot prepare a non-editable req as editable" - - logger.info('Obtaining %s', req) - - with indent_log(): - if require_hashes: - raise InstallationError( - 'The editable requirement %s cannot be installed when ' - 'requiring hashes, because there is no single file to ' - 'hash.' % req - ) - req.ensure_has_source_dir(self.src_dir) - req.update_editable(not self._download_should_save) - - abstract_dist = make_abstract_dist(req) - with self.req_tracker.track(req): - abstract_dist.prep_for_dist(finder, self.build_isolation) - - if self._download_should_save: - req.archive(self.download_dir) - req.check_if_exists(use_user_site) - - return abstract_dist - - def prepare_installed_requirement(self, req, require_hashes, skip_reason): - # type: (InstallRequirement, bool, Optional[str]) -> DistAbstraction - """Prepare an already-installed requirement - """ - assert req.satisfied_by, "req should have been satisfied but isn't" - assert skip_reason is not None, ( - "did not get skip reason skipped but req.satisfied_by " - "is set to %r" % (req.satisfied_by,) - ) - logger.info( - 'Requirement %s: %s (%s)', - skip_reason, req, req.satisfied_by.version - ) - with indent_log(): - if require_hashes: - logger.debug( - 'Since it is already installed, we are trusting this ' - 'package without checking its hash. To ensure a ' - 'completely repeatable environment, install into an ' - 'empty virtualenv.' - ) - abstract_dist = Installed(req) - - return abstract_dist diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pep425tags.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pep425tags.py deleted file mode 100644 index 1e782d1..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pep425tags.py +++ /dev/null @@ -1,381 +0,0 @@ -"""Generate and work with PEP 425 Compatibility Tags.""" -from __future__ import absolute_import - -import distutils.util -import logging -import platform -import re -import sys -import sysconfig -import warnings -from collections import OrderedDict - -import pip._internal.utils.glibc -from pip._internal.utils.compat import get_extension_suffixes -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Tuple, Callable, List, Optional, Union, Dict - ) - - Pep425Tag = Tuple[str, str, str] - -logger = logging.getLogger(__name__) - -_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') - - -def get_config_var(var): - # type: (str) -> Optional[str] - try: - return sysconfig.get_config_var(var) - except IOError as e: # Issue #1074 - warnings.warn("{}".format(e), RuntimeWarning) - return None - - -def get_abbr_impl(): - # type: () -> str - """Return abbreviated implementation name.""" - if hasattr(sys, 'pypy_version_info'): - pyimpl = 'pp' - elif sys.platform.startswith('java'): - pyimpl = 'jy' - elif sys.platform == 'cli': - pyimpl = 'ip' - else: - pyimpl = 'cp' - return pyimpl - - -def get_impl_ver(): - # type: () -> str - """Return implementation version.""" - impl_ver = get_config_var("py_version_nodot") - if not impl_ver or get_abbr_impl() == 'pp': - impl_ver = ''.join(map(str, get_impl_version_info())) - return impl_ver - - -def get_impl_version_info(): - # type: () -> Tuple[int, ...] - """Return sys.version_info-like tuple for use in decrementing the minor - version.""" - if get_abbr_impl() == 'pp': - # as per https://github.com/pypa/pip/issues/2882 - # attrs exist only on pypy - return (sys.version_info[0], - sys.pypy_version_info.major, # type: ignore - sys.pypy_version_info.minor) # type: ignore - else: - return sys.version_info[0], sys.version_info[1] - - -def get_impl_tag(): - # type: () -> str - """ - Returns the Tag for this specific implementation. - """ - return "{}{}".format(get_abbr_impl(), get_impl_ver()) - - -def get_flag(var, fallback, expected=True, warn=True): - # type: (str, Callable[..., bool], Union[bool, int], bool) -> bool - """Use a fallback method for determining SOABI flags if the needed config - var is unset or unavailable.""" - val = get_config_var(var) - if val is None: - if warn: - logger.debug("Config variable '%s' is unset, Python ABI tag may " - "be incorrect", var) - return fallback() - return val == expected - - -def get_abi_tag(): - # type: () -> Optional[str] - """Return the ABI tag based on SOABI (if available) or emulate SOABI - (CPython 2, PyPy).""" - soabi = get_config_var('SOABI') - impl = get_abbr_impl() - if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'): - d = '' - m = '' - u = '' - if get_flag('Py_DEBUG', - lambda: hasattr(sys, 'gettotalrefcount'), - warn=(impl == 'cp')): - d = 'd' - if get_flag('WITH_PYMALLOC', - lambda: impl == 'cp', - warn=(impl == 'cp')): - m = 'm' - if get_flag('Py_UNICODE_SIZE', - lambda: sys.maxunicode == 0x10ffff, - expected=4, - warn=(impl == 'cp' and - sys.version_info < (3, 3))) \ - and sys.version_info < (3, 3): - u = 'u' - abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) - elif soabi and soabi.startswith('cpython-'): - abi = 'cp' + soabi.split('-')[1] - elif soabi: - abi = soabi.replace('.', '_').replace('-', '_') - else: - abi = None - return abi - - -def _is_running_32bit(): - # type: () -> bool - return sys.maxsize == 2147483647 - - -def get_platform(): - # type: () -> str - """Return our platform name 'win32', 'linux_x86_64'""" - if sys.platform == 'darwin': - # distutils.util.get_platform() returns the release based on the value - # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may - # be significantly older than the user's current machine. - release, _, machine = platform.mac_ver() - split_ver = release.split('.') - - if machine == "x86_64" and _is_running_32bit(): - machine = "i386" - elif machine == "ppc64" and _is_running_32bit(): - machine = "ppc" - - return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine) - - # XXX remove distutils dependency - result = distutils.util.get_platform().replace('.', '_').replace('-', '_') - if result == "linux_x86_64" and _is_running_32bit(): - # 32 bit Python program (running on a 64 bit Linux): pip should only - # install and run 32 bit compiled extensions in that case. - result = "linux_i686" - - return result - - -def is_manylinux1_compatible(): - # type: () -> bool - # Only Linux, and only x86-64 / i686 - if get_platform() not in {"linux_x86_64", "linux_i686"}: - return False - - # Check for presence of _manylinux module - try: - import _manylinux - return bool(_manylinux.manylinux1_compatible) - except (ImportError, AttributeError): - # Fall through to heuristic check below - pass - - # Check glibc version. CentOS 5 uses glibc 2.5. - return pip._internal.utils.glibc.have_compatible_glibc(2, 5) - - -def is_manylinux2010_compatible(): - # type: () -> bool - # Only Linux, and only x86-64 / i686 - if get_platform() not in {"linux_x86_64", "linux_i686"}: - return False - - # Check for presence of _manylinux module - try: - import _manylinux - return bool(_manylinux.manylinux2010_compatible) - except (ImportError, AttributeError): - # Fall through to heuristic check below - pass - - # Check glibc version. CentOS 6 uses glibc 2.12. - return pip._internal.utils.glibc.have_compatible_glibc(2, 12) - - -def get_darwin_arches(major, minor, machine): - # type: (int, int, str) -> List[str] - """Return a list of supported arches (including group arches) for - the given major, minor and machine architecture of an macOS machine. - """ - arches = [] - - def _supports_arch(major, minor, arch): - # type: (int, int, str) -> bool - # Looking at the application support for macOS versions in the chart - # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears - # our timeline looks roughly like: - # - # 10.0 - Introduces ppc support. - # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 - # and x86_64 support is CLI only, and cannot be used for GUI - # applications. - # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. - # 10.6 - Drops support for ppc64 - # 10.7 - Drops support for ppc - # - # Given that we do not know if we're installing a CLI or a GUI - # application, we must be conservative and assume it might be a GUI - # application and behave as if ppc64 and x86_64 support did not occur - # until 10.5. - # - # Note: The above information is taken from the "Application support" - # column in the chart not the "Processor support" since I believe - # that we care about what instruction sets an application can use - # not which processors the OS supports. - if arch == 'ppc': - return (major, minor) <= (10, 5) - if arch == 'ppc64': - return (major, minor) == (10, 5) - if arch == 'i386': - return (major, minor) >= (10, 4) - if arch == 'x86_64': - return (major, minor) >= (10, 5) - if arch in groups: - for garch in groups[arch]: - if _supports_arch(major, minor, garch): - return True - return False - - groups = OrderedDict([ - ("fat", ("i386", "ppc")), - ("intel", ("x86_64", "i386")), - ("fat64", ("x86_64", "ppc64")), - ("fat32", ("x86_64", "i386", "ppc")), - ]) # type: Dict[str, Tuple[str, ...]] - - if _supports_arch(major, minor, machine): - arches.append(machine) - - for garch in groups: - if machine in groups[garch] and _supports_arch(major, minor, garch): - arches.append(garch) - - arches.append('universal') - - return arches - - -def get_all_minor_versions_as_strings(version_info): - # type: (Tuple[int, ...]) -> List[str] - versions = [] - major = version_info[:-1] - # Support all previous minor Python versions. - for minor in range(version_info[-1], -1, -1): - versions.append(''.join(map(str, major + (minor,)))) - return versions - - -def get_supported( - versions=None, # type: Optional[List[str]] - noarch=False, # type: bool - platform=None, # type: Optional[str] - impl=None, # type: Optional[str] - abi=None # type: Optional[str] -): - # type: (...) -> List[Pep425Tag] - """Return a list of supported tags for each version specified in - `versions`. - - :param versions: a list of string versions, of the form ["33", "32"], - or None. The first version will be assumed to support our ABI. - :param platform: specify the exact platform you want valid - tags for, or None. If None, use the local system platform. - :param impl: specify the exact implementation you want valid - tags for, or None. If None, use the local interpreter impl. - :param abi: specify the exact abi you want valid - tags for, or None. If None, use the local interpreter abi. - """ - supported = [] - - # Versions must be given with respect to the preference - if versions is None: - version_info = get_impl_version_info() - versions = get_all_minor_versions_as_strings(version_info) - - impl = impl or get_abbr_impl() - - abis = [] # type: List[str] - - abi = abi or get_abi_tag() - if abi: - abis[0:0] = [abi] - - abi3s = set() - for suffix in get_extension_suffixes(): - if suffix.startswith('.abi'): - abi3s.add(suffix.split('.', 2)[1]) - - abis.extend(sorted(list(abi3s))) - - abis.append('none') - - if not noarch: - arch = platform or get_platform() - arch_prefix, arch_sep, arch_suffix = arch.partition('_') - if arch.startswith('macosx'): - # support macosx-10.6-intel on macosx-10.9-x86_64 - match = _osx_arch_pat.match(arch) - if match: - name, major, minor, actual_arch = match.groups() - tpl = '{}_{}_%i_%s'.format(name, major) - arches = [] - for m in reversed(range(int(minor) + 1)): - for a in get_darwin_arches(int(major), m, actual_arch): - arches.append(tpl % (m, a)) - else: - # arch pattern didn't match (?!) - arches = [arch] - elif arch_prefix == 'manylinux2010': - # manylinux1 wheels run on most manylinux2010 systems with the - # exception of wheels depending on ncurses. PEP 571 states - # manylinux1 wheels should be considered manylinux2010 wheels: - # https://www.python.org/dev/peps/pep-0571/#backwards-compatibility-with-manylinux1-wheels - arches = [arch, 'manylinux1' + arch_sep + arch_suffix] - elif platform is None: - arches = [] - if is_manylinux2010_compatible(): - arches.append('manylinux2010' + arch_sep + arch_suffix) - if is_manylinux1_compatible(): - arches.append('manylinux1' + arch_sep + arch_suffix) - arches.append(arch) - else: - arches = [arch] - - # Current version, current API (built specifically for our Python): - for abi in abis: - for arch in arches: - supported.append(('%s%s' % (impl, versions[0]), abi, arch)) - - # abi3 modules compatible with older version of Python - for version in versions[1:]: - # abi3 was introduced in Python 3.2 - if version in {'31', '30'}: - break - for abi in abi3s: # empty set if not Python 3 - for arch in arches: - supported.append(("%s%s" % (impl, version), abi, arch)) - - # Has binaries, does not use the Python API: - for arch in arches: - supported.append(('py%s' % (versions[0][0]), 'none', arch)) - - # No abi / arch, but requires our implementation: - supported.append(('%s%s' % (impl, versions[0]), 'none', 'any')) - # Tagged specifically as being cross-version compatible - # (with just the major version specified) - supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) - - # No abi / arch, generic Python - for i, version in enumerate(versions): - supported.append(('py%s' % (version,), 'none', 'any')) - if i == 0: - supported.append(('py%s' % (version[0]), 'none', 'any')) - - return supported - - -implementation_tag = get_impl_tag() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pyproject.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pyproject.py deleted file mode 100644 index 8d739a6..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pyproject.py +++ /dev/null @@ -1,171 +0,0 @@ -from __future__ import absolute_import - -import io -import os -import sys - -from pip._vendor import pytoml, six - -from pip._internal.exceptions import InstallationError -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, Tuple, Optional, List # noqa: F401 - - -def _is_list_of_str(obj): - # type: (Any) -> bool - return ( - isinstance(obj, list) and - all(isinstance(item, six.string_types) for item in obj) - ) - - -def make_pyproject_path(setup_py_dir): - # type: (str) -> str - path = os.path.join(setup_py_dir, 'pyproject.toml') - - # Python2 __file__ should not be unicode - if six.PY2 and isinstance(path, six.text_type): - path = path.encode(sys.getfilesystemencoding()) - - return path - - -def load_pyproject_toml( - use_pep517, # type: Optional[bool] - pyproject_toml, # type: str - setup_py, # type: str - req_name # type: str -): - # type: (...) -> Optional[Tuple[List[str], str, List[str]]] - """Load the pyproject.toml file. - - Parameters: - use_pep517 - Has the user requested PEP 517 processing? None - means the user hasn't explicitly specified. - pyproject_toml - Location of the project's pyproject.toml file - setup_py - Location of the project's setup.py file - req_name - The name of the requirement we're processing (for - error reporting) - - Returns: - None if we should use the legacy code path, otherwise a tuple - ( - requirements from pyproject.toml, - name of PEP 517 backend, - requirements we should check are installed after setting - up the build environment - ) - """ - has_pyproject = os.path.isfile(pyproject_toml) - has_setup = os.path.isfile(setup_py) - - if has_pyproject: - with io.open(pyproject_toml, encoding="utf-8") as f: - pp_toml = pytoml.load(f) - build_system = pp_toml.get("build-system") - else: - build_system = None - - # The following cases must use PEP 517 - # We check for use_pep517 being non-None and falsey because that means - # the user explicitly requested --no-use-pep517. The value 0 as - # opposed to False can occur when the value is provided via an - # environment variable or config file option (due to the quirk of - # strtobool() returning an integer in pip's configuration code). - if has_pyproject and not has_setup: - if use_pep517 is not None and not use_pep517: - raise InstallationError( - "Disabling PEP 517 processing is invalid: " - "project does not have a setup.py" - ) - use_pep517 = True - elif build_system and "build-backend" in build_system: - if use_pep517 is not None and not use_pep517: - raise InstallationError( - "Disabling PEP 517 processing is invalid: " - "project specifies a build backend of {} " - "in pyproject.toml".format( - build_system["build-backend"] - ) - ) - use_pep517 = True - - # If we haven't worked out whether to use PEP 517 yet, - # and the user hasn't explicitly stated a preference, - # we do so if the project has a pyproject.toml file. - elif use_pep517 is None: - use_pep517 = has_pyproject - - # At this point, we know whether we're going to use PEP 517. - assert use_pep517 is not None - - # If we're using the legacy code path, there is nothing further - # for us to do here. - if not use_pep517: - return None - - if build_system is None: - # Either the user has a pyproject.toml with no build-system - # section, or the user has no pyproject.toml, but has opted in - # explicitly via --use-pep517. - # In the absence of any explicit backend specification, we - # assume the setuptools backend that most closely emulates the - # traditional direct setup.py execution, and require wheel and - # a version of setuptools that supports that backend. - - build_system = { - "requires": ["setuptools>=40.8.0", "wheel"], - "build-backend": "setuptools.build_meta:__legacy__", - } - - # If we're using PEP 517, we have build system information (either - # from pyproject.toml, or defaulted by the code above). - # Note that at this point, we do not know if the user has actually - # specified a backend, though. - assert build_system is not None - - # Ensure that the build-system section in pyproject.toml conforms - # to PEP 518. - error_template = ( - "{package} has a pyproject.toml file that does not comply " - "with PEP 518: {reason}" - ) - - # Specifying the build-system table but not the requires key is invalid - if "requires" not in build_system: - raise InstallationError( - error_template.format(package=req_name, reason=( - "it has a 'build-system' table but not " - "'build-system.requires' which is mandatory in the table" - )) - ) - - # Error out if requires is not a list of strings - requires = build_system["requires"] - if not _is_list_of_str(requires): - raise InstallationError(error_template.format( - package=req_name, - reason="'build-system.requires' is not a list of strings.", - )) - - backend = build_system.get("build-backend") - check = [] # type: List[str] - if backend is None: - # If the user didn't specify a backend, we assume they want to use - # the setuptools backend. But we can't be sure they have included - # a version of setuptools which supplies the backend, or wheel - # (which is needed by the backend) in their requirements. So we - # make a note to check that those requirements are present once - # we have set up the environment. - # This is quite a lot of work to check for a very specific case. But - # the problem is, that case is potentially quite common - projects that - # adopted PEP 518 early for the ability to specify requirements to - # execute setup.py, but never considered needing to mention the build - # tools themselves. The original PEP 518 code had a similar check (but - # implemented in a different way). - backend = "setuptools.build_meta:__legacy__" - check = ["setuptools>=40.8.0", "wheel"] - - return (requires, backend, check) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__init__.py deleted file mode 100644 index 5e4eb92..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__init__.py +++ /dev/null @@ -1,77 +0,0 @@ -from __future__ import absolute_import - -import logging - -from .req_install import InstallRequirement -from .req_set import RequirementSet -from .req_file import parse_requirements -from pip._internal.utils.logging import indent_log -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import List, Sequence # noqa: F401 - -__all__ = [ - "RequirementSet", "InstallRequirement", - "parse_requirements", "install_given_reqs", -] - -logger = logging.getLogger(__name__) - - -def install_given_reqs( - to_install, # type: List[InstallRequirement] - install_options, # type: List[str] - global_options=(), # type: Sequence[str] - *args, **kwargs -): - # type: (...) -> List[InstallRequirement] - """ - Install everything in the given list. - - (to be called after having downloaded and unpacked the packages) - """ - - if to_install: - logger.info( - 'Installing collected packages: %s', - ', '.join([req.name for req in to_install]), - ) - - with indent_log(): - for requirement in to_install: - if requirement.conflicts_with: - logger.info( - 'Found existing installation: %s', - requirement.conflicts_with, - ) - with indent_log(): - uninstalled_pathset = requirement.uninstall( - auto_confirm=True - ) - try: - requirement.install( - install_options, - global_options, - *args, - **kwargs - ) - except Exception: - should_rollback = ( - requirement.conflicts_with and - not requirement.install_succeeded - ) - # if install did not succeed, rollback previous uninstall - if should_rollback: - uninstalled_pathset.rollback() - raise - else: - should_commit = ( - requirement.conflicts_with and - requirement.install_succeeded - ) - if should_commit: - uninstalled_pathset.commit() - requirement.remove_temporary_source() - - return to_install diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 43a0affeb6b61ae9950962ae7dc04ecd9ff43727..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1741 zcmZuyPj4GV6rUNd*Xxa)KW_P>a$q@7u+-Q=6%wE*LMkm(lmH1;o0ZCFvol_AGP|>x zolP3cxzHZC0OGbO)LnT3(V#9amxA3~ib8W5Cz(`w^9i0VbZ)1)4usg^2Su!S!cz_AixIM=1K4Lf-n za#e?em4QpyK*~-$4S+`RAy3T#`Ohe_tEHO z(A#4?CId3A{Yb{vw~)$vC|$FVZtT127mUo$c$Pl^bz118F>a`z#`dIn3M*fs9h6?V zKehPHSe!UxNBs`#u2~<~Cky6#aP9f2V+1L4MuqFanB~Rehg==&VVp)@oO*i5y$UE# z0IEH=GJR7^Z(c(7-+7%VQ^@+FnN>;88D+ynOCG)5blFu{1`Tfc;2m?j9#0a zXtsqCT!k78=SJ^&ujeCj%?nN4%m)F+WNI5`-T@K;<`3KxJjQ$IdvaiHBh>;m)P|J? z35RMRy|uCiNv`x2`Mc;3Wy1Sv$Td%;>faJ^mTmP1=A%|4*w=^3IP8mfx1RwNGQHk= zr=Q1~ug;_EXK}Xr*1Ns6-u2b&7?yiHij1;P;}qaX1JQ>=`xL}jQ`*apOLyHs7|JBu zxN71zC21pqMpyq^k-c>x0p5HAnE9sBtG8qUnDU39nWm@eq(H|qHE?~=#eOR&w4|X- z2eC@JtYN_MdRR7#bQVV0m^00r4?~_A_x{Q} z#=Hna&LO|0qabO!kkitJOC_-`UxI#?hn#9|dOlFcG?#@6dAI4i5Y^o6(%hG+glqrF2l}LUBr!DciDPG68Ax&3)!rRPU1CFdDc>^;G$ekp{8g)A#BX zsH)z1RrLxTi@Z1URi(1L@_!ckID^BKV~)0Gf_d1K`CBO)ltS}TS~erD?@UX?q15yY v#A`aMLg@l>rmZUYN@qQhtPp&|bY|`WX%UCC@a#t{445H;VFISEjh_As;JxS8 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__pycache__/constructors.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__pycache__/constructors.cpython-38.pyc deleted file mode 100644 index 4b9965a07aec9db4023fe3f4b23bcb8af02312ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7735 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 G!T$x8v@-|* diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__pycache__/req_install.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__pycache__/req_install.cpython-38.pyc deleted file mode 100644 index e93b1545e3c32c40df78b3d02161048305ba4d07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25364 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 H$R++CLq}{n diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__pycache__/req_set.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__pycache__/req_set.cpython-38.pyc deleted file mode 100644 index 2dee41ccbe4e49e33bf051f7c6ffab1cc95a6df4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6117 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__pycache__/req_uninstall.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__pycache__/req_uninstall.cpython-38.pyc deleted file mode 100644 index e5c99b32dfc015a2dd9e67290fe8d555dfb2d26c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17110 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 MXcWF@e9ticFWjN|RR910 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/constructors.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/constructors.py deleted file mode 100644 index 1eed1dd..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/constructors.py +++ /dev/null @@ -1,339 +0,0 @@ -"""Backing implementation for InstallRequirement's various constructors - -The idea here is that these formed a major chunk of InstallRequirement's size -so, moving them and support code dedicated to them outside of that class -helps creates for better understandability for the rest of the code. - -These are meant to be used elsewhere within pip to create instances of -InstallRequirement. -""" - -import logging -import os -import re - -from pip._vendor.packaging.markers import Marker -from pip._vendor.packaging.requirements import InvalidRequirement, Requirement -from pip._vendor.packaging.specifiers import Specifier -from pip._vendor.pkg_resources import RequirementParseError, parse_requirements - -from pip._internal.download import ( - is_archive_file, is_url, path_to_url, url_to_path, -) -from pip._internal.exceptions import InstallationError -from pip._internal.models.index import PyPI, TestPyPI -from pip._internal.models.link import Link -from pip._internal.pyproject import make_pyproject_path -from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.misc import is_installable_dir -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.vcs import vcs -from pip._internal.wheel import Wheel - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Optional, Tuple, Set, Any, Union, Text, Dict, - ) - from pip._internal.cache import WheelCache # noqa: F401 - - -__all__ = [ - "install_req_from_editable", "install_req_from_line", - "parse_editable" -] - -logger = logging.getLogger(__name__) -operators = Specifier._operators.keys() - - -def _strip_extras(path): - # type: (str) -> Tuple[str, Optional[str]] - m = re.match(r'^(.+)(\[[^\]]+\])$', path) - extras = None - if m: - path_no_extras = m.group(1) - extras = m.group(2) - else: - path_no_extras = path - - return path_no_extras, extras - - -def parse_editable(editable_req): - # type: (str) -> Tuple[Optional[str], str, Optional[Set[str]]] - """Parses an editable requirement into: - - a requirement name - - an URL - - extras - - editable options - Accepted requirements: - svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir - .[some_extra] - """ - - url = editable_req - - # If a file path is specified with extras, strip off the extras. - url_no_extras, extras = _strip_extras(url) - - if os.path.isdir(url_no_extras): - if not os.path.exists(os.path.join(url_no_extras, 'setup.py')): - msg = ( - 'File "setup.py" not found. Directory cannot be installed ' - 'in editable mode: {}'.format(os.path.abspath(url_no_extras)) - ) - pyproject_path = make_pyproject_path(url_no_extras) - if os.path.isfile(pyproject_path): - msg += ( - '\n(A "pyproject.toml" file was found, but editable ' - 'mode currently requires a setup.py based build.)' - ) - raise InstallationError(msg) - - # Treating it as code that has already been checked out - url_no_extras = path_to_url(url_no_extras) - - if url_no_extras.lower().startswith('file:'): - package_name = Link(url_no_extras).egg_fragment - if extras: - return ( - package_name, - url_no_extras, - Requirement("placeholder" + extras.lower()).extras, - ) - else: - return package_name, url_no_extras, None - - for version_control in vcs: - if url.lower().startswith('%s:' % version_control): - url = '%s+%s' % (version_control, url) - break - - if '+' not in url: - raise InstallationError( - '%s should either be a path to a local project or a VCS url ' - 'beginning with svn+, git+, hg+, or bzr+' % - editable_req - ) - - vc_type = url.split('+', 1)[0].lower() - - if not vcs.get_backend(vc_type): - error_message = 'For --editable=%s only ' % editable_req + \ - ', '.join([backend.name + '+URL' for backend in vcs.backends]) + \ - ' is currently supported' - raise InstallationError(error_message) - - package_name = Link(url).egg_fragment - if not package_name: - raise InstallationError( - "Could not detect requirement name for '%s', please specify one " - "with #egg=your_package_name" % editable_req - ) - return package_name, url, None - - -def deduce_helpful_msg(req): - # type: (str) -> str - """Returns helpful msg in case requirements file does not exist, - or cannot be parsed. - - :params req: Requirements file path - """ - msg = "" - if os.path.exists(req): - msg = " It does exist." - # Try to parse and check if it is a requirements file. - try: - with open(req, 'r') as fp: - # parse first line only - next(parse_requirements(fp.read())) - msg += " The argument you provided " + \ - "(%s) appears to be a" % (req) + \ - " requirements file. If that is the" + \ - " case, use the '-r' flag to install" + \ - " the packages specified within it." - except RequirementParseError: - logger.debug("Cannot parse '%s' as requirements \ - file" % (req), exc_info=True) - else: - msg += " File '%s' does not exist." % (req) - return msg - - -# ---- The actual constructors follow ---- - - -def install_req_from_editable( - editable_req, # type: str - comes_from=None, # type: Optional[str] - use_pep517=None, # type: Optional[bool] - isolated=False, # type: bool - options=None, # type: Optional[Dict[str, Any]] - wheel_cache=None, # type: Optional[WheelCache] - constraint=False # type: bool -): - # type: (...) -> InstallRequirement - name, url, extras_override = parse_editable(editable_req) - if url.startswith('file:'): - source_dir = url_to_path(url) - else: - source_dir = None - - if name is not None: - try: - req = Requirement(name) - except InvalidRequirement: - raise InstallationError("Invalid requirement: '%s'" % name) - else: - req = None - return InstallRequirement( - req, comes_from, source_dir=source_dir, - editable=True, - link=Link(url), - constraint=constraint, - use_pep517=use_pep517, - isolated=isolated, - options=options if options else {}, - wheel_cache=wheel_cache, - extras=extras_override or (), - ) - - -def install_req_from_line( - name, # type: str - comes_from=None, # type: Optional[Union[str, InstallRequirement]] - use_pep517=None, # type: Optional[bool] - isolated=False, # type: bool - options=None, # type: Optional[Dict[str, Any]] - wheel_cache=None, # type: Optional[WheelCache] - constraint=False # type: bool -): - # type: (...) -> InstallRequirement - """Creates an InstallRequirement from a name, which might be a - requirement, directory containing 'setup.py', filename, or URL. - """ - if is_url(name): - marker_sep = '; ' - else: - marker_sep = ';' - if marker_sep in name: - name, markers_as_string = name.split(marker_sep, 1) - markers_as_string = markers_as_string.strip() - if not markers_as_string: - markers = None - else: - markers = Marker(markers_as_string) - else: - markers = None - name = name.strip() - req_as_string = None - path = os.path.normpath(os.path.abspath(name)) - link = None - extras_as_string = None - - if is_url(name): - link = Link(name) - else: - p, extras_as_string = _strip_extras(path) - looks_like_dir = os.path.isdir(p) and ( - os.path.sep in name or - (os.path.altsep is not None and os.path.altsep in name) or - name.startswith('.') - ) - if looks_like_dir: - if not is_installable_dir(p): - raise InstallationError( - "Directory %r is not installable. Neither 'setup.py' " - "nor 'pyproject.toml' found." % name - ) - link = Link(path_to_url(p)) - elif is_archive_file(p): - if not os.path.isfile(p): - logger.warning( - 'Requirement %r looks like a filename, but the ' - 'file does not exist', - name - ) - link = Link(path_to_url(p)) - - # it's a local file, dir, or url - if link: - # Handle relative file URLs - if link.scheme == 'file' and re.search(r'\.\./', link.url): - link = Link( - path_to_url(os.path.normpath(os.path.abspath(link.path)))) - # wheel file - if link.is_wheel: - wheel = Wheel(link.filename) # can raise InvalidWheelFilename - req_as_string = "%s==%s" % (wheel.name, wheel.version) - else: - # set the req to the egg fragment. when it's not there, this - # will become an 'unnamed' requirement - req_as_string = link.egg_fragment - - # a requirement specifier - else: - req_as_string = name - - if extras_as_string: - extras = Requirement("placeholder" + extras_as_string.lower()).extras - else: - extras = () - if req_as_string is not None: - try: - req = Requirement(req_as_string) - except InvalidRequirement: - if os.path.sep in req_as_string: - add_msg = "It looks like a path." - add_msg += deduce_helpful_msg(req_as_string) - elif ('=' in req_as_string and - not any(op in req_as_string for op in operators)): - add_msg = "= is not a valid operator. Did you mean == ?" - else: - add_msg = "" - raise InstallationError( - "Invalid requirement: '%s'\n%s" % (req_as_string, add_msg) - ) - else: - req = None - - return InstallRequirement( - req, comes_from, link=link, markers=markers, - use_pep517=use_pep517, isolated=isolated, - options=options if options else {}, - wheel_cache=wheel_cache, - constraint=constraint, - extras=extras, - ) - - -def install_req_from_req_string( - req_string, # type: str - comes_from=None, # type: Optional[InstallRequirement] - isolated=False, # type: bool - wheel_cache=None, # type: Optional[WheelCache] - use_pep517=None # type: Optional[bool] -): - # type: (...) -> InstallRequirement - try: - req = Requirement(req_string) - except InvalidRequirement: - raise InstallationError("Invalid requirement: '%s'" % req) - - domains_not_allowed = [ - PyPI.file_storage_domain, - TestPyPI.file_storage_domain, - ] - if req.url and comes_from.link.netloc in domains_not_allowed: - # Explicitly disallow pypi packages that depend on external urls - raise InstallationError( - "Packages installed from PyPI cannot depend on packages " - "which are not also hosted on PyPI.\n" - "%s depends on %s " % (comes_from.name, req) - ) - - return InstallRequirement( - req, comes_from, isolated=isolated, wheel_cache=wheel_cache, - use_pep517=use_pep517 - ) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_file.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_file.py deleted file mode 100644 index 726f2f6..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_file.py +++ /dev/null @@ -1,382 +0,0 @@ -""" -Requirements file parsing -""" - -from __future__ import absolute_import - -import optparse -import os -import re -import shlex -import sys - -from pip._vendor.six.moves import filterfalse -from pip._vendor.six.moves.urllib import parse as urllib_parse - -from pip._internal.cli import cmdoptions -from pip._internal.download import get_file_content -from pip._internal.exceptions import RequirementsFileParseError -from pip._internal.req.constructors import ( - install_req_from_editable, install_req_from_line, -) -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Iterator, Tuple, Optional, List, Callable, Text - ) - from pip._internal.req import InstallRequirement # noqa: F401 - from pip._internal.cache import WheelCache # noqa: F401 - from pip._internal.index import PackageFinder # noqa: F401 - from pip._internal.download import PipSession # noqa: F401 - - ReqFileLines = Iterator[Tuple[int, Text]] - -__all__ = ['parse_requirements'] - -SCHEME_RE = re.compile(r'^(http|https|file):', re.I) -COMMENT_RE = re.compile(r'(^|\s)+#.*$') - -# Matches environment variable-style values in '${MY_VARIABLE_1}' with the -# variable name consisting of only uppercase letters, digits or the '_' -# (underscore). This follows the POSIX standard defined in IEEE Std 1003.1, -# 2013 Edition. -ENV_VAR_RE = re.compile(r'(?P\$\{(?P[A-Z0-9_]+)\})') - -SUPPORTED_OPTIONS = [ - cmdoptions.constraints, - cmdoptions.editable, - cmdoptions.requirements, - cmdoptions.no_index, - cmdoptions.index_url, - cmdoptions.find_links, - cmdoptions.extra_index_url, - cmdoptions.always_unzip, - cmdoptions.no_binary, - cmdoptions.only_binary, - cmdoptions.pre, - cmdoptions.trusted_host, - cmdoptions.require_hashes, -] # type: List[Callable[..., optparse.Option]] - -# options to be passed to requirements -SUPPORTED_OPTIONS_REQ = [ - cmdoptions.install_options, - cmdoptions.global_options, - cmdoptions.hash, -] # type: List[Callable[..., optparse.Option]] - -# the 'dest' string values -SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] - - -def parse_requirements( - filename, # type: str - finder=None, # type: Optional[PackageFinder] - comes_from=None, # type: Optional[str] - options=None, # type: Optional[optparse.Values] - session=None, # type: Optional[PipSession] - constraint=False, # type: bool - wheel_cache=None, # type: Optional[WheelCache] - use_pep517=None # type: Optional[bool] -): - # type: (...) -> Iterator[InstallRequirement] - """Parse a requirements file and yield InstallRequirement instances. - - :param filename: Path or url of requirements file. - :param finder: Instance of pip.index.PackageFinder. - :param comes_from: Origin description of requirements. - :param options: cli options. - :param session: Instance of pip.download.PipSession. - :param constraint: If true, parsing a constraint file rather than - requirements file. - :param wheel_cache: Instance of pip.wheel.WheelCache - :param use_pep517: Value of the --use-pep517 option. - """ - if session is None: - raise TypeError( - "parse_requirements() missing 1 required keyword argument: " - "'session'" - ) - - _, content = get_file_content( - filename, comes_from=comes_from, session=session - ) - - lines_enum = preprocess(content, options) - - for line_number, line in lines_enum: - req_iter = process_line(line, filename, line_number, finder, - comes_from, options, session, wheel_cache, - use_pep517=use_pep517, constraint=constraint) - for req in req_iter: - yield req - - -def preprocess(content, options): - # type: (Text, Optional[optparse.Values]) -> ReqFileLines - """Split, filter, and join lines, and return a line iterator - - :param content: the content of the requirements file - :param options: cli options - """ - lines_enum = enumerate(content.splitlines(), start=1) # type: ReqFileLines - lines_enum = join_lines(lines_enum) - lines_enum = ignore_comments(lines_enum) - lines_enum = skip_regex(lines_enum, options) - lines_enum = expand_env_variables(lines_enum) - return lines_enum - - -def process_line( - line, # type: Text - filename, # type: str - line_number, # type: int - finder=None, # type: Optional[PackageFinder] - comes_from=None, # type: Optional[str] - options=None, # type: Optional[optparse.Values] - session=None, # type: Optional[PipSession] - wheel_cache=None, # type: Optional[WheelCache] - use_pep517=None, # type: Optional[bool] - constraint=False # type: bool -): - # type: (...) -> Iterator[InstallRequirement] - """Process a single requirements line; This can result in creating/yielding - requirements, or updating the finder. - - For lines that contain requirements, the only options that have an effect - are from SUPPORTED_OPTIONS_REQ, and they are scoped to the - requirement. Other options from SUPPORTED_OPTIONS may be present, but are - ignored. - - For lines that do not contain requirements, the only options that have an - effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may - be present, but are ignored. These lines may contain multiple options - (although our docs imply only one is supported), and all our parsed and - affect the finder. - - :param constraint: If True, parsing a constraints file. - :param options: OptionParser options that we may update - """ - parser = build_parser(line) - defaults = parser.get_default_values() - defaults.index_url = None - if finder: - defaults.format_control = finder.format_control - args_str, options_str = break_args_options(line) - # Prior to 2.7.3, shlex cannot deal with unicode entries - if sys.version_info < (2, 7, 3): - # https://github.com/python/mypy/issues/1174 - options_str = options_str.encode('utf8') # type: ignore - # https://github.com/python/mypy/issues/1174 - opts, _ = parser.parse_args( - shlex.split(options_str), defaults) # type: ignore - - # preserve for the nested code path - line_comes_from = '%s %s (line %s)' % ( - '-c' if constraint else '-r', filename, line_number, - ) - - # yield a line requirement - if args_str: - isolated = options.isolated_mode if options else False - if options: - cmdoptions.check_install_build_global(options, opts) - # get the options that apply to requirements - req_options = {} - for dest in SUPPORTED_OPTIONS_REQ_DEST: - if dest in opts.__dict__ and opts.__dict__[dest]: - req_options[dest] = opts.__dict__[dest] - yield install_req_from_line( - args_str, line_comes_from, constraint=constraint, - use_pep517=use_pep517, - isolated=isolated, options=req_options, wheel_cache=wheel_cache - ) - - # yield an editable requirement - elif opts.editables: - isolated = options.isolated_mode if options else False - yield install_req_from_editable( - opts.editables[0], comes_from=line_comes_from, - use_pep517=use_pep517, - constraint=constraint, isolated=isolated, wheel_cache=wheel_cache - ) - - # parse a nested requirements file - elif opts.requirements or opts.constraints: - if opts.requirements: - req_path = opts.requirements[0] - nested_constraint = False - else: - req_path = opts.constraints[0] - nested_constraint = True - # original file is over http - if SCHEME_RE.search(filename): - # do a url join so relative paths work - req_path = urllib_parse.urljoin(filename, req_path) - # original file and nested file are paths - elif not SCHEME_RE.search(req_path): - # do a join so relative paths work - req_path = os.path.join(os.path.dirname(filename), req_path) - # TODO: Why not use `comes_from='-r {} (line {})'` here as well? - parsed_reqs = parse_requirements( - req_path, finder, comes_from, options, session, - constraint=nested_constraint, wheel_cache=wheel_cache - ) - for req in parsed_reqs: - yield req - - # percolate hash-checking option upward - elif opts.require_hashes: - options.require_hashes = opts.require_hashes - - # set finder options - elif finder: - if opts.index_url: - finder.index_urls = [opts.index_url] - if opts.no_index is True: - finder.index_urls = [] - if opts.extra_index_urls: - finder.index_urls.extend(opts.extra_index_urls) - if opts.find_links: - # FIXME: it would be nice to keep track of the source - # of the find_links: support a find-links local path - # relative to a requirements file. - value = opts.find_links[0] - req_dir = os.path.dirname(os.path.abspath(filename)) - relative_to_reqs_file = os.path.join(req_dir, value) - if os.path.exists(relative_to_reqs_file): - value = relative_to_reqs_file - finder.find_links.append(value) - if opts.pre: - finder.allow_all_prereleases = True - if opts.trusted_hosts: - finder.secure_origins.extend( - ("*", host, "*") for host in opts.trusted_hosts) - - -def break_args_options(line): - # type: (Text) -> Tuple[str, Text] - """Break up the line into an args and options string. We only want to shlex - (and then optparse) the options, not the args. args can contain markers - which are corrupted by shlex. - """ - tokens = line.split(' ') - args = [] - options = tokens[:] - for token in tokens: - if token.startswith('-') or token.startswith('--'): - break - else: - args.append(token) - options.pop(0) - return ' '.join(args), ' '.join(options) # type: ignore - - -def build_parser(line): - # type: (Text) -> optparse.OptionParser - """ - Return a parser for parsing requirement lines - """ - parser = optparse.OptionParser(add_help_option=False) - - option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ - for option_factory in option_factories: - option = option_factory() - parser.add_option(option) - - # By default optparse sys.exits on parsing errors. We want to wrap - # that in our own exception. - def parser_exit(self, msg): - # add offending line - msg = 'Invalid requirement: %s\n%s' % (line, msg) - raise RequirementsFileParseError(msg) - # NOTE: mypy disallows assigning to a method - # https://github.com/python/mypy/issues/2427 - parser.exit = parser_exit # type: ignore - - return parser - - -def join_lines(lines_enum): - # type: (ReqFileLines) -> ReqFileLines - """Joins a line ending in '\' with the previous line (except when following - comments). The joined line takes on the index of the first line. - """ - primary_line_number = None - new_line = [] # type: List[Text] - for line_number, line in lines_enum: - if not line.endswith('\\') or COMMENT_RE.match(line): - if COMMENT_RE.match(line): - # this ensures comments are always matched later - line = ' ' + line - if new_line: - new_line.append(line) - yield primary_line_number, ''.join(new_line) - new_line = [] - else: - yield line_number, line - else: - if not new_line: - primary_line_number = line_number - new_line.append(line.strip('\\')) - - # last line contains \ - if new_line: - yield primary_line_number, ''.join(new_line) - - # TODO: handle space after '\'. - - -def ignore_comments(lines_enum): - # type: (ReqFileLines) -> ReqFileLines - """ - Strips comments and filter empty lines. - """ - for line_number, line in lines_enum: - line = COMMENT_RE.sub('', line) - line = line.strip() - if line: - yield line_number, line - - -def skip_regex(lines_enum, options): - # type: (ReqFileLines, Optional[optparse.Values]) -> ReqFileLines - """ - Skip lines that match '--skip-requirements-regex' pattern - - Note: the regex pattern is only built once - """ - skip_regex = options.skip_requirements_regex if options else None - if skip_regex: - pattern = re.compile(skip_regex) - lines_enum = filterfalse(lambda e: pattern.search(e[1]), lines_enum) - return lines_enum - - -def expand_env_variables(lines_enum): - # type: (ReqFileLines) -> ReqFileLines - """Replace all environment variables that can be retrieved via `os.getenv`. - - The only allowed format for environment variables defined in the - requirement file is `${MY_VARIABLE_1}` to ensure two things: - - 1. Strings that contain a `$` aren't accidentally (partially) expanded. - 2. Ensure consistency across platforms for requirement files. - - These points are the result of a discusssion on the `github pull - request #3514 `_. - - Valid characters in variable names follow the `POSIX standard - `_ and are limited - to uppercase letter, digits and the `_` (underscore). - """ - for line_number, line in lines_enum: - for env_var, var_name in ENV_VAR_RE.findall(line): - value = os.getenv(var_name) - if not value: - continue - - line = line.replace(env_var, value) - - yield line_number, line diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_install.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_install.py deleted file mode 100644 index a4834b0..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_install.py +++ /dev/null @@ -1,1021 +0,0 @@ -from __future__ import absolute_import - -import logging -import os -import shutil -import sys -import sysconfig -import zipfile -from distutils.util import change_root - -from pip._vendor import pkg_resources, six -from pip._vendor.packaging.requirements import Requirement -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import Version -from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.pep517.wrappers import Pep517HookCaller - -from pip._internal import wheel -from pip._internal.build_env import NoOpBuildEnvironment -from pip._internal.exceptions import InstallationError -from pip._internal.locations import ( - PIP_DELETE_MARKER_FILENAME, running_under_virtualenv, -) -from pip._internal.models.link import Link -from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path -from pip._internal.req.req_uninstall import UninstallPathSet -from pip._internal.utils.compat import native_str -from pip._internal.utils.hashes import Hashes -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - _make_build_dir, ask_path_exists, backup_dir, call_subprocess, - display_path, dist_in_site_packages, dist_in_usersite, ensure_dir, - get_installed_version, redact_password_from_url, rmtree, -) -from pip._internal.utils.packaging import get_metadata -from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.utils.ui import open_spinner -from pip._internal.vcs import vcs -from pip._internal.wheel import move_wheel_files - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Optional, Iterable, List, Union, Any, Text, Sequence, Dict - ) - from pip._internal.build_env import BuildEnvironment # noqa: F401 - from pip._internal.cache import WheelCache # noqa: F401 - from pip._internal.index import PackageFinder # noqa: F401 - from pip._vendor.pkg_resources import Distribution # noqa: F401 - from pip._vendor.packaging.specifiers import SpecifierSet # noqa: F401 - from pip._vendor.packaging.markers import Marker # noqa: F401 - - -logger = logging.getLogger(__name__) - - -class InstallRequirement(object): - """ - Represents something that may be installed later on, may have information - about where to fetch the relavant requirement and also contains logic for - installing the said requirement. - """ - - def __init__( - self, - req, # type: Optional[Requirement] - comes_from, # type: Optional[Union[str, InstallRequirement]] - source_dir=None, # type: Optional[str] - editable=False, # type: bool - link=None, # type: Optional[Link] - update=True, # type: bool - markers=None, # type: Optional[Marker] - use_pep517=None, # type: Optional[bool] - isolated=False, # type: bool - options=None, # type: Optional[Dict[str, Any]] - wheel_cache=None, # type: Optional[WheelCache] - constraint=False, # type: bool - extras=() # type: Iterable[str] - ): - # type: (...) -> None - assert req is None or isinstance(req, Requirement), req - self.req = req - self.comes_from = comes_from - self.constraint = constraint - if source_dir is not None: - self.source_dir = os.path.normpath(os.path.abspath(source_dir)) - else: - self.source_dir = None - self.editable = editable - - self._wheel_cache = wheel_cache - if link is None and req and req.url: - # PEP 508 URL requirement - link = Link(req.url) - self.link = self.original_link = link - - if extras: - self.extras = extras - elif req: - self.extras = { - pkg_resources.safe_extra(extra) for extra in req.extras - } - else: - self.extras = set() - if markers is None and req: - markers = req.marker - self.markers = markers - - self._egg_info_path = None # type: Optional[str] - # This holds the pkg_resources.Distribution object if this requirement - # is already available: - self.satisfied_by = None - # This hold the pkg_resources.Distribution object if this requirement - # conflicts with another installed distribution: - self.conflicts_with = None - # Temporary build location - self._temp_build_dir = TempDirectory(kind="req-build") - # Used to store the global directory where the _temp_build_dir should - # have been created. Cf _correct_build_location method. - self._ideal_build_dir = None # type: Optional[str] - # True if the editable should be updated: - self.update = update - # Set to True after successful installation - self.install_succeeded = None # type: Optional[bool] - # UninstallPathSet of uninstalled distribution (for possible rollback) - self.uninstalled_pathset = None - self.options = options if options else {} - # Set to True after successful preparation of this requirement - self.prepared = False - self.is_direct = False - - self.isolated = isolated - self.build_env = NoOpBuildEnvironment() # type: BuildEnvironment - - # For PEP 517, the directory where we request the project metadata - # gets stored. We need this to pass to build_wheel, so the backend - # can ensure that the wheel matches the metadata (see the PEP for - # details). - self.metadata_directory = None # type: Optional[str] - - # The static build requirements (from pyproject.toml) - self.pyproject_requires = None # type: Optional[List[str]] - - # Build requirements that we will check are available - self.requirements_to_check = [] # type: List[str] - - # The PEP 517 backend we should use to build the project - self.pep517_backend = None # type: Optional[Pep517HookCaller] - - # Are we using PEP 517 for this requirement? - # After pyproject.toml has been loaded, the only valid values are True - # and False. Before loading, None is valid (meaning "use the default"). - # Setting an explicit value before loading pyproject.toml is supported, - # but after loading this flag should be treated as read only. - self.use_pep517 = use_pep517 - - def __str__(self): - if self.req: - s = str(self.req) - if self.link: - s += ' from %s' % redact_password_from_url(self.link.url) - elif self.link: - s = redact_password_from_url(self.link.url) - else: - s = '' - if self.satisfied_by is not None: - s += ' in %s' % display_path(self.satisfied_by.location) - if self.comes_from: - if isinstance(self.comes_from, six.string_types): - comes_from = self.comes_from - else: - comes_from = self.comes_from.from_path() - if comes_from: - s += ' (from %s)' % comes_from - return s - - def __repr__(self): - return '<%s object: %s editable=%r>' % ( - self.__class__.__name__, str(self), self.editable) - - def populate_link(self, finder, upgrade, require_hashes): - # type: (PackageFinder, bool, bool) -> None - """Ensure that if a link can be found for this, that it is found. - - Note that self.link may still be None - if Upgrade is False and the - requirement is already installed. - - If require_hashes is True, don't use the wheel cache, because cached - wheels, always built locally, have different hashes than the files - downloaded from the index server and thus throw false hash mismatches. - Furthermore, cached wheels at present have undeterministic contents due - to file modification times. - """ - if self.link is None: - self.link = finder.find_requirement(self, upgrade) - if self._wheel_cache is not None and not require_hashes: - old_link = self.link - self.link = self._wheel_cache.get(self.link, self.name) - if old_link != self.link: - logger.debug('Using cached wheel link: %s', self.link) - - # Things that are valid for all kinds of requirements? - @property - def name(self): - # type: () -> Optional[str] - if self.req is None: - return None - return native_str(pkg_resources.safe_name(self.req.name)) - - @property - def specifier(self): - # type: () -> SpecifierSet - return self.req.specifier - - @property - def is_pinned(self): - # type: () -> bool - """Return whether I am pinned to an exact version. - - For example, some-package==1.2 is pinned; some-package>1.2 is not. - """ - specifiers = self.specifier - return (len(specifiers) == 1 and - next(iter(specifiers)).operator in {'==', '==='}) - - @property - def installed_version(self): - return get_installed_version(self.name) - - def match_markers(self, extras_requested=None): - # type: (Optional[Iterable[str]]) -> bool - if not extras_requested: - # Provide an extra to safely evaluate the markers - # without matching any extra - extras_requested = ('',) - if self.markers is not None: - return any( - self.markers.evaluate({'extra': extra}) - for extra in extras_requested) - else: - return True - - @property - def has_hash_options(self): - # type: () -> bool - """Return whether any known-good hashes are specified as options. - - These activate --require-hashes mode; hashes specified as part of a - URL do not. - - """ - return bool(self.options.get('hashes', {})) - - def hashes(self, trust_internet=True): - # type: (bool) -> Hashes - """Return a hash-comparer that considers my option- and URL-based - hashes to be known-good. - - Hashes in URLs--ones embedded in the requirements file, not ones - downloaded from an index server--are almost peers with ones from - flags. They satisfy --require-hashes (whether it was implicitly or - explicitly activated) but do not activate it. md5 and sha224 are not - allowed in flags, which should nudge people toward good algos. We - always OR all hashes together, even ones from URLs. - - :param trust_internet: Whether to trust URL-based (#md5=...) hashes - downloaded from the internet, as by populate_link() - - """ - good_hashes = self.options.get('hashes', {}).copy() - link = self.link if trust_internet else self.original_link - if link and link.hash: - good_hashes.setdefault(link.hash_name, []).append(link.hash) - return Hashes(good_hashes) - - def from_path(self): - # type: () -> Optional[str] - """Format a nice indicator to show where this "comes from" - """ - if self.req is None: - return None - s = str(self.req) - if self.comes_from: - if isinstance(self.comes_from, six.string_types): - comes_from = self.comes_from - else: - comes_from = self.comes_from.from_path() - if comes_from: - s += '->' + comes_from - return s - - def build_location(self, build_dir): - # type: (str) -> Optional[str] - assert build_dir is not None - if self._temp_build_dir.path is not None: - return self._temp_build_dir.path - if self.req is None: - # for requirement via a path to a directory: the name of the - # package is not available yet so we create a temp directory - # Once run_egg_info will have run, we'll be able - # to fix it via _correct_build_location - # Some systems have /tmp as a symlink which confuses custom - # builds (such as numpy). Thus, we ensure that the real path - # is returned. - self._temp_build_dir.create() - self._ideal_build_dir = build_dir - - return self._temp_build_dir.path - if self.editable: - name = self.name.lower() - else: - name = self.name - # FIXME: Is there a better place to create the build_dir? (hg and bzr - # need this) - if not os.path.exists(build_dir): - logger.debug('Creating directory %s', build_dir) - _make_build_dir(build_dir) - return os.path.join(build_dir, name) - - def _correct_build_location(self): - # type: () -> None - """Move self._temp_build_dir to self._ideal_build_dir/self.req.name - - For some requirements (e.g. a path to a directory), the name of the - package is not available until we run egg_info, so the build_location - will return a temporary directory and store the _ideal_build_dir. - - This is only called by self.run_egg_info to fix the temporary build - directory. - """ - if self.source_dir is not None: - return - assert self.req is not None - assert self._temp_build_dir.path - assert (self._ideal_build_dir is not None and - self._ideal_build_dir.path) # type: ignore - old_location = self._temp_build_dir.path - self._temp_build_dir.path = None - - new_location = self.build_location(self._ideal_build_dir) - if os.path.exists(new_location): - raise InstallationError( - 'A package already exists in %s; please remove it to continue' - % display_path(new_location)) - logger.debug( - 'Moving package %s from %s to new location %s', - self, display_path(old_location), display_path(new_location), - ) - shutil.move(old_location, new_location) - self._temp_build_dir.path = new_location - self._ideal_build_dir = None - self.source_dir = os.path.normpath(os.path.abspath(new_location)) - self._egg_info_path = None - - # Correct the metadata directory, if it exists - if self.metadata_directory: - old_meta = self.metadata_directory - rel = os.path.relpath(old_meta, start=old_location) - new_meta = os.path.join(new_location, rel) - new_meta = os.path.normpath(os.path.abspath(new_meta)) - self.metadata_directory = new_meta - - def remove_temporary_source(self): - # type: () -> None - """Remove the source files from this requirement, if they are marked - for deletion""" - if self.source_dir and os.path.exists( - os.path.join(self.source_dir, PIP_DELETE_MARKER_FILENAME)): - logger.debug('Removing source in %s', self.source_dir) - rmtree(self.source_dir) - self.source_dir = None - self._temp_build_dir.cleanup() - self.build_env.cleanup() - - def check_if_exists(self, use_user_site): - # type: (bool) -> bool - """Find an installed distribution that satisfies or conflicts - with this requirement, and set self.satisfied_by or - self.conflicts_with appropriately. - """ - if self.req is None: - return False - try: - # get_distribution() will resolve the entire list of requirements - # anyway, and we've already determined that we need the requirement - # in question, so strip the marker so that we don't try to - # evaluate it. - no_marker = Requirement(str(self.req)) - no_marker.marker = None - self.satisfied_by = pkg_resources.get_distribution(str(no_marker)) - if self.editable and self.satisfied_by: - self.conflicts_with = self.satisfied_by - # when installing editables, nothing pre-existing should ever - # satisfy - self.satisfied_by = None - return True - except pkg_resources.DistributionNotFound: - return False - except pkg_resources.VersionConflict: - existing_dist = pkg_resources.get_distribution( - self.req.name - ) - if use_user_site: - if dist_in_usersite(existing_dist): - self.conflicts_with = existing_dist - elif (running_under_virtualenv() and - dist_in_site_packages(existing_dist)): - raise InstallationError( - "Will not install to the user site because it will " - "lack sys.path precedence to %s in %s" % - (existing_dist.project_name, existing_dist.location) - ) - else: - self.conflicts_with = existing_dist - return True - - # Things valid for wheels - @property - def is_wheel(self): - # type: () -> bool - if not self.link: - return False - return self.link.is_wheel - - def move_wheel_files( - self, - wheeldir, # type: str - root=None, # type: Optional[str] - home=None, # type: Optional[str] - prefix=None, # type: Optional[str] - warn_script_location=True, # type: bool - use_user_site=False, # type: bool - pycompile=True # type: bool - ): - # type: (...) -> None - move_wheel_files( - self.name, self.req, wheeldir, - user=use_user_site, - home=home, - root=root, - prefix=prefix, - pycompile=pycompile, - isolated=self.isolated, - warn_script_location=warn_script_location, - ) - - # Things valid for sdists - @property - def setup_py_dir(self): - # type: () -> str - return os.path.join( - self.source_dir, - self.link and self.link.subdirectory_fragment or '') - - @property - def setup_py(self): - # type: () -> str - assert self.source_dir, "No source dir for %s" % self - - setup_py = os.path.join(self.setup_py_dir, 'setup.py') - - # Python2 __file__ should not be unicode - if six.PY2 and isinstance(setup_py, six.text_type): - setup_py = setup_py.encode(sys.getfilesystemencoding()) - - return setup_py - - @property - def pyproject_toml(self): - # type: () -> str - assert self.source_dir, "No source dir for %s" % self - - return make_pyproject_path(self.setup_py_dir) - - def load_pyproject_toml(self): - # type: () -> None - """Load the pyproject.toml file. - - After calling this routine, all of the attributes related to PEP 517 - processing for this requirement have been set. In particular, the - use_pep517 attribute can be used to determine whether we should - follow the PEP 517 or legacy (setup.py) code path. - """ - pep517_data = load_pyproject_toml( - self.use_pep517, - self.pyproject_toml, - self.setup_py, - str(self) - ) - - if pep517_data is None: - self.use_pep517 = False - else: - self.use_pep517 = True - requires, backend, check = pep517_data - self.requirements_to_check = check - self.pyproject_requires = requires - self.pep517_backend = Pep517HookCaller(self.setup_py_dir, backend) - - # Use a custom function to call subprocesses - self.spin_message = "" - - def runner(cmd, cwd=None, extra_environ=None): - with open_spinner(self.spin_message) as spinner: - call_subprocess( - cmd, - cwd=cwd, - extra_environ=extra_environ, - show_stdout=False, - spinner=spinner - ) - self.spin_message = "" - - self.pep517_backend._subprocess_runner = runner - - def prepare_metadata(self): - # type: () -> None - """Ensure that project metadata is available. - - Under PEP 517, call the backend hook to prepare the metadata. - Under legacy processing, call setup.py egg-info. - """ - assert self.source_dir - - with indent_log(): - if self.use_pep517: - self.prepare_pep517_metadata() - else: - self.run_egg_info() - - if not self.req: - if isinstance(parse_version(self.metadata["Version"]), Version): - op = "==" - else: - op = "===" - self.req = Requirement( - "".join([ - self.metadata["Name"], - op, - self.metadata["Version"], - ]) - ) - self._correct_build_location() - else: - metadata_name = canonicalize_name(self.metadata["Name"]) - if canonicalize_name(self.req.name) != metadata_name: - logger.warning( - 'Generating metadata for package %s ' - 'produced metadata for project name %s. Fix your ' - '#egg=%s fragments.', - self.name, metadata_name, self.name - ) - self.req = Requirement(metadata_name) - - def prepare_pep517_metadata(self): - # type: () -> None - assert self.pep517_backend is not None - - metadata_dir = os.path.join( - self.setup_py_dir, - 'pip-wheel-metadata' - ) - ensure_dir(metadata_dir) - - with self.build_env: - # Note that Pep517HookCaller implements a fallback for - # prepare_metadata_for_build_wheel, so we don't have to - # consider the possibility that this hook doesn't exist. - backend = self.pep517_backend - self.spin_message = "Preparing wheel metadata" - distinfo_dir = backend.prepare_metadata_for_build_wheel( - metadata_dir - ) - - self.metadata_directory = os.path.join(metadata_dir, distinfo_dir) - - def run_egg_info(self): - # type: () -> None - if self.name: - logger.debug( - 'Running setup.py (path:%s) egg_info for package %s', - self.setup_py, self.name, - ) - else: - logger.debug( - 'Running setup.py (path:%s) egg_info for package from %s', - self.setup_py, self.link, - ) - script = SETUPTOOLS_SHIM % self.setup_py - base_cmd = [sys.executable, '-c', script] - if self.isolated: - base_cmd += ["--no-user-cfg"] - egg_info_cmd = base_cmd + ['egg_info'] - # We can't put the .egg-info files at the root, because then the - # source code will be mistaken for an installed egg, causing - # problems - if self.editable: - egg_base_option = [] # type: List[str] - else: - egg_info_dir = os.path.join(self.setup_py_dir, 'pip-egg-info') - ensure_dir(egg_info_dir) - egg_base_option = ['--egg-base', 'pip-egg-info'] - with self.build_env: - call_subprocess( - egg_info_cmd + egg_base_option, - cwd=self.setup_py_dir, - show_stdout=False, - command_desc='python setup.py egg_info') - - @property - def egg_info_path(self): - # type: () -> str - if self._egg_info_path is None: - if self.editable: - base = self.source_dir - else: - base = os.path.join(self.setup_py_dir, 'pip-egg-info') - filenames = os.listdir(base) - if self.editable: - filenames = [] - for root, dirs, files in os.walk(base): - for dir in vcs.dirnames: - if dir in dirs: - dirs.remove(dir) - # Iterate over a copy of ``dirs``, since mutating - # a list while iterating over it can cause trouble. - # (See https://github.com/pypa/pip/pull/462.) - for dir in list(dirs): - # Don't search in anything that looks like a virtualenv - # environment - if ( - os.path.lexists( - os.path.join(root, dir, 'bin', 'python') - ) or - os.path.exists( - os.path.join( - root, dir, 'Scripts', 'Python.exe' - ) - )): - dirs.remove(dir) - # Also don't search through tests - elif dir == 'test' or dir == 'tests': - dirs.remove(dir) - filenames.extend([os.path.join(root, dir) - for dir in dirs]) - filenames = [f for f in filenames if f.endswith('.egg-info')] - - if not filenames: - raise InstallationError( - "Files/directories not found in %s" % base - ) - # if we have more than one match, we pick the toplevel one. This - # can easily be the case if there is a dist folder which contains - # an extracted tarball for testing purposes. - if len(filenames) > 1: - filenames.sort( - key=lambda x: x.count(os.path.sep) + - (os.path.altsep and x.count(os.path.altsep) or 0) - ) - self._egg_info_path = os.path.join(base, filenames[0]) - return self._egg_info_path - - @property - def metadata(self): - if not hasattr(self, '_metadata'): - self._metadata = get_metadata(self.get_dist()) - - return self._metadata - - def get_dist(self): - # type: () -> Distribution - """Return a pkg_resources.Distribution for this requirement""" - if self.metadata_directory: - base_dir, distinfo = os.path.split(self.metadata_directory) - metadata = pkg_resources.PathMetadata( - base_dir, self.metadata_directory - ) - dist_name = os.path.splitext(distinfo)[0] - typ = pkg_resources.DistInfoDistribution - else: - egg_info = self.egg_info_path.rstrip(os.path.sep) - base_dir = os.path.dirname(egg_info) - metadata = pkg_resources.PathMetadata(base_dir, egg_info) - dist_name = os.path.splitext(os.path.basename(egg_info))[0] - # https://github.com/python/mypy/issues/1174 - typ = pkg_resources.Distribution # type: ignore - - return typ( - base_dir, - project_name=dist_name, - metadata=metadata, - ) - - def assert_source_matches_version(self): - # type: () -> None - assert self.source_dir - version = self.metadata['version'] - if self.req.specifier and version not in self.req.specifier: - logger.warning( - 'Requested %s, but installing version %s', - self, - version, - ) - else: - logger.debug( - 'Source in %s has version %s, which satisfies requirement %s', - display_path(self.source_dir), - version, - self, - ) - - # For both source distributions and editables - def ensure_has_source_dir(self, parent_dir): - # type: (str) -> str - """Ensure that a source_dir is set. - - This will create a temporary build dir if the name of the requirement - isn't known yet. - - :param parent_dir: The ideal pip parent_dir for the source_dir. - Generally src_dir for editables and build_dir for sdists. - :return: self.source_dir - """ - if self.source_dir is None: - self.source_dir = self.build_location(parent_dir) - return self.source_dir - - # For editable installations - def install_editable( - self, - install_options, # type: List[str] - global_options=(), # type: Sequence[str] - prefix=None # type: Optional[str] - ): - # type: (...) -> None - logger.info('Running setup.py develop for %s', self.name) - - if self.isolated: - global_options = list(global_options) + ["--no-user-cfg"] - - if prefix: - prefix_param = ['--prefix={}'.format(prefix)] - install_options = list(install_options) + prefix_param - - with indent_log(): - # FIXME: should we do --install-headers here too? - with self.build_env: - call_subprocess( - [ - sys.executable, - '-c', - SETUPTOOLS_SHIM % self.setup_py - ] + - list(global_options) + - ['develop', '--no-deps'] + - list(install_options), - - cwd=self.setup_py_dir, - show_stdout=False, - ) - - self.install_succeeded = True - - def update_editable(self, obtain=True): - # type: (bool) -> None - if not self.link: - logger.debug( - "Cannot update repository at %s; repository location is " - "unknown", - self.source_dir, - ) - return - assert self.editable - assert self.source_dir - if self.link.scheme == 'file': - # Static paths don't get updated - return - assert '+' in self.link.url, "bad url: %r" % self.link.url - if not self.update: - return - vc_type, url = self.link.url.split('+', 1) - backend = vcs.get_backend(vc_type) - if backend: - vcs_backend = backend(self.link.url) - if obtain: - vcs_backend.obtain(self.source_dir) - else: - vcs_backend.export(self.source_dir) - else: - assert 0, ( - 'Unexpected version control type (in %s): %s' - % (self.link, vc_type)) - - # Top-level Actions - def uninstall(self, auto_confirm=False, verbose=False, - use_user_site=False): - # type: (bool, bool, bool) -> Optional[UninstallPathSet] - """ - Uninstall the distribution currently satisfying this requirement. - - Prompts before removing or modifying files unless - ``auto_confirm`` is True. - - Refuses to delete or modify files outside of ``sys.prefix`` - - thus uninstallation within a virtual environment can only - modify that virtual environment, even if the virtualenv is - linked to global site-packages. - - """ - if not self.check_if_exists(use_user_site): - logger.warning("Skipping %s as it is not installed.", self.name) - return None - dist = self.satisfied_by or self.conflicts_with - - uninstalled_pathset = UninstallPathSet.from_dist(dist) - uninstalled_pathset.remove(auto_confirm, verbose) - return uninstalled_pathset - - def _clean_zip_name(self, name, prefix): # only used by archive. - assert name.startswith(prefix + os.path.sep), ( - "name %r doesn't start with prefix %r" % (name, prefix) - ) - name = name[len(prefix) + 1:] - name = name.replace(os.path.sep, '/') - return name - - def _get_archive_name(self, path, parentdir, rootdir): - # type: (str, str, str) -> str - path = os.path.join(parentdir, path) - name = self._clean_zip_name(path, rootdir) - return self.name + '/' + name - - # TODO: Investigate if this should be kept in InstallRequirement - # Seems to be used only when VCS + downloads - def archive(self, build_dir): - # type: (str) -> None - assert self.source_dir - create_archive = True - archive_name = '%s-%s.zip' % (self.name, self.metadata["version"]) - archive_path = os.path.join(build_dir, archive_name) - if os.path.exists(archive_path): - response = ask_path_exists( - 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)bort ' % - display_path(archive_path), ('i', 'w', 'b', 'a')) - if response == 'i': - create_archive = False - elif response == 'w': - logger.warning('Deleting %s', display_path(archive_path)) - os.remove(archive_path) - elif response == 'b': - dest_file = backup_dir(archive_path) - logger.warning( - 'Backing up %s to %s', - display_path(archive_path), - display_path(dest_file), - ) - shutil.move(archive_path, dest_file) - elif response == 'a': - sys.exit(-1) - if create_archive: - zip = zipfile.ZipFile( - archive_path, 'w', zipfile.ZIP_DEFLATED, - allowZip64=True - ) - dir = os.path.normcase(os.path.abspath(self.setup_py_dir)) - for dirpath, dirnames, filenames in os.walk(dir): - if 'pip-egg-info' in dirnames: - dirnames.remove('pip-egg-info') - for dirname in dirnames: - dir_arcname = self._get_archive_name(dirname, - parentdir=dirpath, - rootdir=dir) - zipdir = zipfile.ZipInfo(dir_arcname + '/') - zipdir.external_attr = 0x1ED << 16 # 0o755 - zip.writestr(zipdir, '') - for filename in filenames: - if filename == PIP_DELETE_MARKER_FILENAME: - continue - file_arcname = self._get_archive_name(filename, - parentdir=dirpath, - rootdir=dir) - filename = os.path.join(dirpath, filename) - zip.write(filename, file_arcname) - zip.close() - logger.info('Saved %s', display_path(archive_path)) - - def install( - self, - install_options, # type: List[str] - global_options=None, # type: Optional[Sequence[str]] - root=None, # type: Optional[str] - home=None, # type: Optional[str] - prefix=None, # type: Optional[str] - warn_script_location=True, # type: bool - use_user_site=False, # type: bool - pycompile=True # type: bool - ): - # type: (...) -> None - global_options = global_options if global_options is not None else [] - if self.editable: - self.install_editable( - install_options, global_options, prefix=prefix, - ) - return - if self.is_wheel: - version = wheel.wheel_version(self.source_dir) - wheel.check_compatibility(version, self.name) - - self.move_wheel_files( - self.source_dir, root=root, prefix=prefix, home=home, - warn_script_location=warn_script_location, - use_user_site=use_user_site, pycompile=pycompile, - ) - self.install_succeeded = True - return - - # Extend the list of global and install options passed on to - # the setup.py call with the ones from the requirements file. - # Options specified in requirements file override those - # specified on the command line, since the last option given - # to setup.py is the one that is used. - global_options = list(global_options) + \ - self.options.get('global_options', []) - install_options = list(install_options) + \ - self.options.get('install_options', []) - - if self.isolated: - # https://github.com/python/mypy/issues/1174 - global_options = global_options + ["--no-user-cfg"] # type: ignore - - with TempDirectory(kind="record") as temp_dir: - record_filename = os.path.join(temp_dir.path, 'install-record.txt') - install_args = self.get_install_args( - global_options, record_filename, root, prefix, pycompile, - ) - msg = 'Running setup.py install for %s' % (self.name,) - with open_spinner(msg) as spinner: - with indent_log(): - with self.build_env: - call_subprocess( - install_args + install_options, - cwd=self.setup_py_dir, - show_stdout=False, - spinner=spinner, - ) - - if not os.path.exists(record_filename): - logger.debug('Record file %s not found', record_filename) - return - self.install_succeeded = True - - def prepend_root(path): - if root is None or not os.path.isabs(path): - return path - else: - return change_root(root, path) - - with open(record_filename) as f: - for line in f: - directory = os.path.dirname(line) - if directory.endswith('.egg-info'): - egg_info_dir = prepend_root(directory) - break - else: - logger.warning( - 'Could not find .egg-info directory in install record' - ' for %s', - self, - ) - # FIXME: put the record somewhere - # FIXME: should this be an error? - return - new_lines = [] - with open(record_filename) as f: - for line in f: - filename = line.strip() - if os.path.isdir(filename): - filename += os.path.sep - new_lines.append( - os.path.relpath(prepend_root(filename), egg_info_dir) - ) - new_lines.sort() - ensure_dir(egg_info_dir) - inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt') - with open(inst_files_path, 'w') as f: - f.write('\n'.join(new_lines) + '\n') - - def get_install_args( - self, - global_options, # type: Sequence[str] - record_filename, # type: str - root, # type: Optional[str] - prefix, # type: Optional[str] - pycompile # type: bool - ): - # type: (...) -> List[str] - install_args = [sys.executable, "-u"] - install_args.append('-c') - install_args.append(SETUPTOOLS_SHIM % self.setup_py) - install_args += list(global_options) + \ - ['install', '--record', record_filename] - install_args += ['--single-version-externally-managed'] - - if root is not None: - install_args += ['--root', root] - if prefix is not None: - install_args += ['--prefix', prefix] - - if pycompile: - install_args += ["--compile"] - else: - install_args += ["--no-compile"] - - if running_under_virtualenv(): - py_ver_str = 'python' + sysconfig.get_python_version() - install_args += ['--install-headers', - os.path.join(sys.prefix, 'include', 'site', - py_ver_str, self.name)] - - return install_args diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_set.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_set.py deleted file mode 100644 index d1410e9..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_set.py +++ /dev/null @@ -1,197 +0,0 @@ -from __future__ import absolute_import - -import logging -from collections import OrderedDict - -from pip._internal.exceptions import InstallationError -from pip._internal.utils.logging import indent_log -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.wheel import Wheel - -if MYPY_CHECK_RUNNING: - from typing import Optional, List, Tuple, Dict, Iterable # noqa: F401 - from pip._internal.req.req_install import InstallRequirement # noqa: F401 - - -logger = logging.getLogger(__name__) - - -class RequirementSet(object): - - def __init__(self, require_hashes=False, check_supported_wheels=True): - # type: (bool, bool) -> None - """Create a RequirementSet. - """ - - self.requirements = OrderedDict() # type: Dict[str, InstallRequirement] # noqa: E501 - self.require_hashes = require_hashes - self.check_supported_wheels = check_supported_wheels - - # Mapping of alias: real_name - self.requirement_aliases = {} # type: Dict[str, str] - self.unnamed_requirements = [] # type: List[InstallRequirement] - self.successfully_downloaded = [] # type: List[InstallRequirement] - self.reqs_to_cleanup = [] # type: List[InstallRequirement] - - def __str__(self): - reqs = [req for req in self.requirements.values() - if not req.comes_from] - reqs.sort(key=lambda req: req.name.lower()) - return ' '.join([str(req.req) for req in reqs]) - - def __repr__(self): - reqs = [req for req in self.requirements.values()] - reqs.sort(key=lambda req: req.name.lower()) - reqs_str = ', '.join([str(req.req) for req in reqs]) - return ('<%s object; %d requirement(s): %s>' - % (self.__class__.__name__, len(reqs), reqs_str)) - - def add_requirement( - self, - install_req, # type: InstallRequirement - parent_req_name=None, # type: Optional[str] - extras_requested=None # type: Optional[Iterable[str]] - ): - # type: (...) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]] # noqa: E501 - """Add install_req as a requirement to install. - - :param parent_req_name: The name of the requirement that needed this - added. The name is used because when multiple unnamed requirements - resolve to the same name, we could otherwise end up with dependency - links that point outside the Requirements set. parent_req must - already be added. Note that None implies that this is a user - supplied requirement, vs an inferred one. - :param extras_requested: an iterable of extras used to evaluate the - environment markers. - :return: Additional requirements to scan. That is either [] if - the requirement is not applicable, or [install_req] if the - requirement is applicable and has just been added. - """ - name = install_req.name - - # If the markers do not match, ignore this requirement. - if not install_req.match_markers(extras_requested): - logger.info( - "Ignoring %s: markers '%s' don't match your environment", - name, install_req.markers, - ) - return [], None - - # If the wheel is not supported, raise an error. - # Should check this after filtering out based on environment markers to - # allow specifying different wheels based on the environment/OS, in a - # single requirements file. - if install_req.link and install_req.link.is_wheel: - wheel = Wheel(install_req.link.filename) - if self.check_supported_wheels and not wheel.supported(): - raise InstallationError( - "%s is not a supported wheel on this platform." % - wheel.filename - ) - - # This next bit is really a sanity check. - assert install_req.is_direct == (parent_req_name is None), ( - "a direct req shouldn't have a parent and also, " - "a non direct req should have a parent" - ) - - # Unnamed requirements are scanned again and the requirement won't be - # added as a dependency until after scanning. - if not name: - # url or path requirement w/o an egg fragment - self.unnamed_requirements.append(install_req) - return [install_req], None - - try: - existing_req = self.get_requirement(name) - except KeyError: - existing_req = None - - has_conflicting_requirement = ( - parent_req_name is None and - existing_req and - not existing_req.constraint and - existing_req.extras == install_req.extras and - existing_req.req.specifier != install_req.req.specifier - ) - if has_conflicting_requirement: - raise InstallationError( - "Double requirement given: %s (already in %s, name=%r)" - % (install_req, existing_req, name) - ) - - # When no existing requirement exists, add the requirement as a - # dependency and it will be scanned again after. - if not existing_req: - self.requirements[name] = install_req - # FIXME: what about other normalizations? E.g., _ vs. -? - if name.lower() != name: - self.requirement_aliases[name.lower()] = name - # We'd want to rescan this requirements later - return [install_req], install_req - - # Assume there's no need to scan, and that we've already - # encountered this for scanning. - if install_req.constraint or not existing_req.constraint: - return [], existing_req - - does_not_satisfy_constraint = ( - install_req.link and - not ( - existing_req.link and - install_req.link.path == existing_req.link.path - ) - ) - if does_not_satisfy_constraint: - self.reqs_to_cleanup.append(install_req) - raise InstallationError( - "Could not satisfy constraints for '%s': " - "installation from path or url cannot be " - "constrained to a version" % name, - ) - # If we're now installing a constraint, mark the existing - # object for real installation. - existing_req.constraint = False - existing_req.extras = tuple(sorted( - set(existing_req.extras) | set(install_req.extras) - )) - logger.debug( - "Setting %s extras to: %s", - existing_req, existing_req.extras, - ) - # Return the existing requirement for addition to the parent and - # scanning again. - return [existing_req], existing_req - - def has_requirement(self, project_name): - # type: (str) -> bool - name = project_name.lower() - if (name in self.requirements and - not self.requirements[name].constraint or - name in self.requirement_aliases and - not self.requirements[self.requirement_aliases[name]].constraint): - return True - return False - - @property - def has_requirements(self): - # type: () -> List[InstallRequirement] - return list(req for req in self.requirements.values() if not - req.constraint) or self.unnamed_requirements - - def get_requirement(self, project_name): - # type: (str) -> InstallRequirement - for name in project_name, project_name.lower(): - if name in self.requirements: - return self.requirements[name] - if name in self.requirement_aliases: - return self.requirements[self.requirement_aliases[name]] - raise KeyError("No project with the name %r" % project_name) - - def cleanup_files(self): - # type: () -> None - """Clean up files, remove builds.""" - logger.debug('Cleaning up...') - with indent_log(): - for req in self.reqs_to_cleanup: - req.remove_temporary_source() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_tracker.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_tracker.py deleted file mode 100644 index 82e084a..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_tracker.py +++ /dev/null @@ -1,88 +0,0 @@ -from __future__ import absolute_import - -import contextlib -import errno -import hashlib -import logging -import os - -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Set, Iterator # noqa: F401 - from pip._internal.req.req_install import InstallRequirement # noqa: F401 - from pip._internal.models.link import Link # noqa: F401 - -logger = logging.getLogger(__name__) - - -class RequirementTracker(object): - - def __init__(self): - # type: () -> None - self._root = os.environ.get('PIP_REQ_TRACKER') - if self._root is None: - self._temp_dir = TempDirectory(delete=False, kind='req-tracker') - self._temp_dir.create() - self._root = os.environ['PIP_REQ_TRACKER'] = self._temp_dir.path - logger.debug('Created requirements tracker %r', self._root) - else: - self._temp_dir = None - logger.debug('Re-using requirements tracker %r', self._root) - self._entries = set() # type: Set[InstallRequirement] - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.cleanup() - - def _entry_path(self, link): - # type: (Link) -> str - hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest() - return os.path.join(self._root, hashed) - - def add(self, req): - # type: (InstallRequirement) -> None - link = req.link - info = str(req) - entry_path = self._entry_path(link) - try: - with open(entry_path) as fp: - # Error, these's already a build in progress. - raise LookupError('%s is already being built: %s' - % (link, fp.read())) - except IOError as e: - if e.errno != errno.ENOENT: - raise - assert req not in self._entries - with open(entry_path, 'w') as fp: - fp.write(info) - self._entries.add(req) - logger.debug('Added %s to build tracker %r', req, self._root) - - def remove(self, req): - # type: (InstallRequirement) -> None - link = req.link - self._entries.remove(req) - os.unlink(self._entry_path(link)) - logger.debug('Removed %s from build tracker %r', req, self._root) - - def cleanup(self): - # type: () -> None - for req in set(self._entries): - self.remove(req) - remove = self._temp_dir is not None - if remove: - self._temp_dir.cleanup() - logger.debug('%s build tracker %r', - 'Removed' if remove else 'Cleaned', - self._root) - - @contextlib.contextmanager - def track(self, req): - # type: (InstallRequirement) -> Iterator[None] - self.add(req) - yield - self.remove(req) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_uninstall.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_uninstall.py deleted file mode 100644 index c80959e..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_uninstall.py +++ /dev/null @@ -1,596 +0,0 @@ -from __future__ import absolute_import - -import csv -import functools -import logging -import os -import sys -import sysconfig - -from pip._vendor import pkg_resources - -from pip._internal.exceptions import UninstallationError -from pip._internal.locations import bin_py, bin_user -from pip._internal.utils.compat import WINDOWS, cache_from_source, uses_pycache -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - FakeFile, ask, dist_in_usersite, dist_is_local, egg_link_path, is_local, - normalize_path, renames, rmtree, -) -from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory - -logger = logging.getLogger(__name__) - - -def _script_names(dist, script_name, is_gui): - """Create the fully qualified name of the files created by - {console,gui}_scripts for the given ``dist``. - Returns the list of file names - """ - if dist_in_usersite(dist): - bin_dir = bin_user - else: - bin_dir = bin_py - exe_name = os.path.join(bin_dir, script_name) - paths_to_remove = [exe_name] - if WINDOWS: - paths_to_remove.append(exe_name + '.exe') - paths_to_remove.append(exe_name + '.exe.manifest') - if is_gui: - paths_to_remove.append(exe_name + '-script.pyw') - else: - paths_to_remove.append(exe_name + '-script.py') - return paths_to_remove - - -def _unique(fn): - @functools.wraps(fn) - def unique(*args, **kw): - seen = set() - for item in fn(*args, **kw): - if item not in seen: - seen.add(item) - yield item - return unique - - -@_unique -def uninstallation_paths(dist): - """ - Yield all the uninstallation paths for dist based on RECORD-without-.py[co] - - Yield paths to all the files in RECORD. For each .py file in RECORD, add - the .pyc and .pyo in the same directory. - - UninstallPathSet.add() takes care of the __pycache__ .py[co]. - """ - r = csv.reader(FakeFile(dist.get_metadata_lines('RECORD'))) - for row in r: - path = os.path.join(dist.location, row[0]) - yield path - if path.endswith('.py'): - dn, fn = os.path.split(path) - base = fn[:-3] - path = os.path.join(dn, base + '.pyc') - yield path - path = os.path.join(dn, base + '.pyo') - yield path - - -def compact(paths): - """Compact a path set to contain the minimal number of paths - necessary to contain all paths in the set. If /a/path/ and - /a/path/to/a/file.txt are both in the set, leave only the - shorter path.""" - - sep = os.path.sep - short_paths = set() - for path in sorted(paths, key=len): - should_skip = any( - path.startswith(shortpath.rstrip("*")) and - path[len(shortpath.rstrip("*").rstrip(sep))] == sep - for shortpath in short_paths - ) - if not should_skip: - short_paths.add(path) - return short_paths - - -def compress_for_rename(paths): - """Returns a set containing the paths that need to be renamed. - - This set may include directories when the original sequence of paths - included every file on disk. - """ - case_map = dict((os.path.normcase(p), p) for p in paths) - remaining = set(case_map) - unchecked = sorted(set(os.path.split(p)[0] - for p in case_map.values()), key=len) - wildcards = set() - - def norm_join(*a): - return os.path.normcase(os.path.join(*a)) - - for root in unchecked: - if any(os.path.normcase(root).startswith(w) - for w in wildcards): - # This directory has already been handled. - continue - - all_files = set() - all_subdirs = set() - for dirname, subdirs, files in os.walk(root): - all_subdirs.update(norm_join(root, dirname, d) - for d in subdirs) - all_files.update(norm_join(root, dirname, f) - for f in files) - # If all the files we found are in our remaining set of files to - # remove, then remove them from the latter set and add a wildcard - # for the directory. - if not (all_files - remaining): - remaining.difference_update(all_files) - wildcards.add(root + os.sep) - - return set(map(case_map.__getitem__, remaining)) | wildcards - - -def compress_for_output_listing(paths): - """Returns a tuple of 2 sets of which paths to display to user - - The first set contains paths that would be deleted. Files of a package - are not added and the top-level directory of the package has a '*' added - at the end - to signify that all it's contents are removed. - - The second set contains files that would have been skipped in the above - folders. - """ - - will_remove = list(paths) - will_skip = set() - - # Determine folders and files - folders = set() - files = set() - for path in will_remove: - if path.endswith(".pyc"): - continue - if path.endswith("__init__.py") or ".dist-info" in path: - folders.add(os.path.dirname(path)) - files.add(path) - - _normcased_files = set(map(os.path.normcase, files)) - - folders = compact(folders) - - # This walks the tree using os.walk to not miss extra folders - # that might get added. - for folder in folders: - for dirpath, _, dirfiles in os.walk(folder): - for fname in dirfiles: - if fname.endswith(".pyc"): - continue - - file_ = os.path.join(dirpath, fname) - if (os.path.isfile(file_) and - os.path.normcase(file_) not in _normcased_files): - # We are skipping this file. Add it to the set. - will_skip.add(file_) - - will_remove = files | { - os.path.join(folder, "*") for folder in folders - } - - return will_remove, will_skip - - -class StashedUninstallPathSet(object): - """A set of file rename operations to stash files while - tentatively uninstalling them.""" - def __init__(self): - # Mapping from source file root to [Adjacent]TempDirectory - # for files under that directory. - self._save_dirs = {} - # (old path, new path) tuples for each move that may need - # to be undone. - self._moves = [] - - def _get_directory_stash(self, path): - """Stashes a directory. - - Directories are stashed adjacent to their original location if - possible, or else moved/copied into the user's temp dir.""" - - try: - save_dir = AdjacentTempDirectory(path) - save_dir.create() - except OSError: - save_dir = TempDirectory(kind="uninstall") - save_dir.create() - self._save_dirs[os.path.normcase(path)] = save_dir - - return save_dir.path - - def _get_file_stash(self, path): - """Stashes a file. - - If no root has been provided, one will be created for the directory - in the user's temp directory.""" - path = os.path.normcase(path) - head, old_head = os.path.dirname(path), None - save_dir = None - - while head != old_head: - try: - save_dir = self._save_dirs[head] - break - except KeyError: - pass - head, old_head = os.path.dirname(head), head - else: - # Did not find any suitable root - head = os.path.dirname(path) - save_dir = TempDirectory(kind='uninstall') - save_dir.create() - self._save_dirs[head] = save_dir - - relpath = os.path.relpath(path, head) - if relpath and relpath != os.path.curdir: - return os.path.join(save_dir.path, relpath) - return save_dir.path - - def stash(self, path): - """Stashes the directory or file and returns its new location. - """ - if os.path.isdir(path): - new_path = self._get_directory_stash(path) - else: - new_path = self._get_file_stash(path) - - self._moves.append((path, new_path)) - if os.path.isdir(path) and os.path.isdir(new_path): - # If we're moving a directory, we need to - # remove the destination first or else it will be - # moved to inside the existing directory. - # We just created new_path ourselves, so it will - # be removable. - os.rmdir(new_path) - renames(path, new_path) - return new_path - - def commit(self): - """Commits the uninstall by removing stashed files.""" - for _, save_dir in self._save_dirs.items(): - save_dir.cleanup() - self._moves = [] - self._save_dirs = {} - - def rollback(self): - """Undoes the uninstall by moving stashed files back.""" - for p in self._moves: - logging.info("Moving to %s\n from %s", *p) - - for new_path, path in self._moves: - try: - logger.debug('Replacing %s from %s', new_path, path) - if os.path.isfile(new_path): - os.unlink(new_path) - elif os.path.isdir(new_path): - rmtree(new_path) - renames(path, new_path) - except OSError as ex: - logger.error("Failed to restore %s", new_path) - logger.debug("Exception: %s", ex) - - self.commit() - - @property - def can_rollback(self): - return bool(self._moves) - - -class UninstallPathSet(object): - """A set of file paths to be removed in the uninstallation of a - requirement.""" - def __init__(self, dist): - self.paths = set() - self._refuse = set() - self.pth = {} - self.dist = dist - self._moved_paths = StashedUninstallPathSet() - - def _permitted(self, path): - """ - Return True if the given path is one we are permitted to - remove/modify, False otherwise. - - """ - return is_local(path) - - def add(self, path): - head, tail = os.path.split(path) - - # we normalize the head to resolve parent directory symlinks, but not - # the tail, since we only want to uninstall symlinks, not their targets - path = os.path.join(normalize_path(head), os.path.normcase(tail)) - - if not os.path.exists(path): - return - if self._permitted(path): - self.paths.add(path) - else: - self._refuse.add(path) - - # __pycache__ files can show up after 'installed-files.txt' is created, - # due to imports - if os.path.splitext(path)[1] == '.py' and uses_pycache: - self.add(cache_from_source(path)) - - def add_pth(self, pth_file, entry): - pth_file = normalize_path(pth_file) - if self._permitted(pth_file): - if pth_file not in self.pth: - self.pth[pth_file] = UninstallPthEntries(pth_file) - self.pth[pth_file].add(entry) - else: - self._refuse.add(pth_file) - - def remove(self, auto_confirm=False, verbose=False): - """Remove paths in ``self.paths`` with confirmation (unless - ``auto_confirm`` is True).""" - - if not self.paths: - logger.info( - "Can't uninstall '%s'. No files were found to uninstall.", - self.dist.project_name, - ) - return - - dist_name_version = ( - self.dist.project_name + "-" + self.dist.version - ) - logger.info('Uninstalling %s:', dist_name_version) - - with indent_log(): - if auto_confirm or self._allowed_to_proceed(verbose): - moved = self._moved_paths - - for_rename = compress_for_rename(self.paths) - - for path in sorted(compact(for_rename)): - moved.stash(path) - logger.debug('Removing file or directory %s', path) - - for pth in self.pth.values(): - pth.remove() - - logger.info('Successfully uninstalled %s', dist_name_version) - - def _allowed_to_proceed(self, verbose): - """Display which files would be deleted and prompt for confirmation - """ - - def _display(msg, paths): - if not paths: - return - - logger.info(msg) - with indent_log(): - for path in sorted(compact(paths)): - logger.info(path) - - if not verbose: - will_remove, will_skip = compress_for_output_listing(self.paths) - else: - # In verbose mode, display all the files that are going to be - # deleted. - will_remove = list(self.paths) - will_skip = set() - - _display('Would remove:', will_remove) - _display('Would not remove (might be manually added):', will_skip) - _display('Would not remove (outside of prefix):', self._refuse) - if verbose: - _display('Will actually move:', compress_for_rename(self.paths)) - - return ask('Proceed (y/n)? ', ('y', 'n')) == 'y' - - def rollback(self): - """Rollback the changes previously made by remove().""" - if not self._moved_paths.can_rollback: - logger.error( - "Can't roll back %s; was not uninstalled", - self.dist.project_name, - ) - return False - logger.info('Rolling back uninstall of %s', self.dist.project_name) - self._moved_paths.rollback() - for pth in self.pth.values(): - pth.rollback() - - def commit(self): - """Remove temporary save dir: rollback will no longer be possible.""" - self._moved_paths.commit() - - @classmethod - def from_dist(cls, dist): - dist_path = normalize_path(dist.location) - if not dist_is_local(dist): - logger.info( - "Not uninstalling %s at %s, outside environment %s", - dist.key, - dist_path, - sys.prefix, - ) - return cls(dist) - - if dist_path in {p for p in {sysconfig.get_path("stdlib"), - sysconfig.get_path("platstdlib")} - if p}: - logger.info( - "Not uninstalling %s at %s, as it is in the standard library.", - dist.key, - dist_path, - ) - return cls(dist) - - paths_to_remove = cls(dist) - develop_egg_link = egg_link_path(dist) - develop_egg_link_egg_info = '{}.egg-info'.format( - pkg_resources.to_filename(dist.project_name)) - egg_info_exists = dist.egg_info and os.path.exists(dist.egg_info) - # Special case for distutils installed package - distutils_egg_info = getattr(dist._provider, 'path', None) - - # Uninstall cases order do matter as in the case of 2 installs of the - # same package, pip needs to uninstall the currently detected version - if (egg_info_exists and dist.egg_info.endswith('.egg-info') and - not dist.egg_info.endswith(develop_egg_link_egg_info)): - # if dist.egg_info.endswith(develop_egg_link_egg_info), we - # are in fact in the develop_egg_link case - paths_to_remove.add(dist.egg_info) - if dist.has_metadata('installed-files.txt'): - for installed_file in dist.get_metadata( - 'installed-files.txt').splitlines(): - path = os.path.normpath( - os.path.join(dist.egg_info, installed_file) - ) - paths_to_remove.add(path) - # FIXME: need a test for this elif block - # occurs with --single-version-externally-managed/--record outside - # of pip - elif dist.has_metadata('top_level.txt'): - if dist.has_metadata('namespace_packages.txt'): - namespaces = dist.get_metadata('namespace_packages.txt') - else: - namespaces = [] - for top_level_pkg in [ - p for p - in dist.get_metadata('top_level.txt').splitlines() - if p and p not in namespaces]: - path = os.path.join(dist.location, top_level_pkg) - paths_to_remove.add(path) - paths_to_remove.add(path + '.py') - paths_to_remove.add(path + '.pyc') - paths_to_remove.add(path + '.pyo') - - elif distutils_egg_info: - 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.project_name, - ) - ) - - elif dist.location.endswith('.egg'): - # package installed by easy_install - # We cannot match on dist.egg_name because it can slightly vary - # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg - paths_to_remove.add(dist.location) - easy_install_egg = os.path.split(dist.location)[1] - easy_install_pth = os.path.join(os.path.dirname(dist.location), - 'easy-install.pth') - paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg) - - elif egg_info_exists and dist.egg_info.endswith('.dist-info'): - for path in uninstallation_paths(dist): - paths_to_remove.add(path) - - elif develop_egg_link: - # develop egg - with open(develop_egg_link, 'r') as fh: - link_pointer = os.path.normcase(fh.readline().strip()) - assert (link_pointer == dist.location), ( - 'Egg-link %s does not match installed location of %s ' - '(at %s)' % (link_pointer, dist.project_name, dist.location) - ) - paths_to_remove.add(develop_egg_link) - easy_install_pth = os.path.join(os.path.dirname(develop_egg_link), - 'easy-install.pth') - paths_to_remove.add_pth(easy_install_pth, dist.location) - - else: - logger.debug( - 'Not sure how to uninstall: %s - Check: %s', - dist, dist.location, - ) - - # find distutils scripts= scripts - if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'): - for script in dist.metadata_listdir('scripts'): - if dist_in_usersite(dist): - bin_dir = bin_user - else: - bin_dir = bin_py - paths_to_remove.add(os.path.join(bin_dir, script)) - if WINDOWS: - paths_to_remove.add(os.path.join(bin_dir, script) + '.bat') - - # find console_scripts - _scripts_to_remove = [] - console_scripts = dist.get_entry_map(group='console_scripts') - for name in console_scripts.keys(): - _scripts_to_remove.extend(_script_names(dist, name, False)) - # find gui_scripts - gui_scripts = dist.get_entry_map(group='gui_scripts') - for name in gui_scripts.keys(): - _scripts_to_remove.extend(_script_names(dist, name, True)) - - for s in _scripts_to_remove: - paths_to_remove.add(s) - - return paths_to_remove - - -class UninstallPthEntries(object): - def __init__(self, pth_file): - if not os.path.isfile(pth_file): - raise UninstallationError( - "Cannot remove entries from nonexistent file %s" % pth_file - ) - self.file = pth_file - self.entries = set() - self._saved_lines = None - - def add(self, entry): - entry = os.path.normcase(entry) - # On Windows, os.path.normcase converts the entry to use - # backslashes. This is correct for entries that describe absolute - # paths outside of site-packages, but all the others use forward - # slashes. - if WINDOWS and not os.path.splitdrive(entry)[0]: - entry = entry.replace('\\', '/') - self.entries.add(entry) - - def remove(self): - logger.debug('Removing pth entries from %s:', self.file) - with open(self.file, 'rb') as fh: - # windows uses '\r\n' with py3k, but uses '\n' with py2.x - lines = fh.readlines() - self._saved_lines = lines - if any(b'\r\n' in line for line in lines): - endline = '\r\n' - else: - endline = '\n' - # handle missing trailing newline - if lines and not lines[-1].endswith(endline.encode("utf-8")): - lines[-1] = lines[-1] + endline.encode("utf-8") - for entry in self.entries: - try: - logger.debug('Removing entry: %s', entry) - lines.remove((entry + endline).encode("utf-8")) - except ValueError: - pass - with open(self.file, 'wb') as fh: - fh.writelines(lines) - - def rollback(self): - if self._saved_lines is None: - logger.error( - 'Cannot roll back changes to %s, none were made', self.file - ) - return False - logger.debug('Rolling %s back to previous state', self.file) - with open(self.file, 'wb') as fh: - fh.writelines(self._saved_lines) - return True diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/resolve.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/resolve.py deleted file mode 100644 index 33f572f..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/resolve.py +++ /dev/null @@ -1,393 +0,0 @@ -"""Dependency Resolution - -The dependency resolution in pip is performed as follows: - -for top-level requirements: - a. only one spec allowed per project, regardless of conflicts or not. - otherwise a "double requirement" exception is raised - b. they override sub-dependency requirements. -for sub-dependencies - a. "first found, wins" (where the order is breadth first) -""" - -import logging -from collections import defaultdict -from itertools import chain - -from pip._internal.exceptions import ( - BestVersionAlreadyInstalled, DistributionNotFound, HashError, HashErrors, - UnsupportedPythonVersion, -) -from pip._internal.req.constructors import install_req_from_req_string -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import dist_in_usersite, ensure_dir -from pip._internal.utils.packaging import check_dist_requires_python -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, DefaultDict, List, Set # noqa: F401 - from pip._internal.download import PipSession # noqa: F401 - from pip._internal.req.req_install import InstallRequirement # noqa: F401 - from pip._internal.index import PackageFinder # noqa: F401 - from pip._internal.req.req_set import RequirementSet # noqa: F401 - from pip._internal.operations.prepare import ( # noqa: F401 - DistAbstraction, RequirementPreparer - ) - from pip._internal.cache import WheelCache # noqa: F401 - -logger = logging.getLogger(__name__) - - -class Resolver(object): - """Resolves which packages need to be installed/uninstalled to perform \ - the requested operation without breaking the requirements of any package. - """ - - _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} - - def __init__( - self, - preparer, # type: RequirementPreparer - session, # type: PipSession - finder, # type: PackageFinder - wheel_cache, # type: Optional[WheelCache] - use_user_site, # type: bool - ignore_dependencies, # type: bool - ignore_installed, # type: bool - ignore_requires_python, # type: bool - force_reinstall, # type: bool - isolated, # type: bool - upgrade_strategy, # type: str - use_pep517=None # type: Optional[bool] - ): - # type: (...) -> None - super(Resolver, self).__init__() - assert upgrade_strategy in self._allowed_strategies - - self.preparer = preparer - self.finder = finder - self.session = session - - # NOTE: This would eventually be replaced with a cache that can give - # information about both sdist and wheels transparently. - self.wheel_cache = wheel_cache - - # This is set in resolve - self.require_hashes = None # type: Optional[bool] - - self.upgrade_strategy = upgrade_strategy - self.force_reinstall = force_reinstall - self.isolated = isolated - self.ignore_dependencies = ignore_dependencies - self.ignore_installed = ignore_installed - self.ignore_requires_python = ignore_requires_python - self.use_user_site = use_user_site - self.use_pep517 = use_pep517 - - self._discovered_dependencies = \ - defaultdict(list) # type: DefaultDict[str, List] - - def resolve(self, requirement_set): - # type: (RequirementSet) -> None - """Resolve what operations need to be done - - As a side-effect of this method, the packages (and their dependencies) - are downloaded, unpacked and prepared for installation. This - preparation is done by ``pip.operations.prepare``. - - Once PyPI has static dependency metadata available, it would be - possible to move the preparation to become a step separated from - dependency resolution. - """ - # make the wheelhouse - if self.preparer.wheel_download_dir: - ensure_dir(self.preparer.wheel_download_dir) - - # If any top-level requirement has a hash specified, enter - # hash-checking mode, which requires hashes from all. - root_reqs = ( - requirement_set.unnamed_requirements + - list(requirement_set.requirements.values()) - ) - self.require_hashes = ( - requirement_set.require_hashes or - any(req.has_hash_options for req in root_reqs) - ) - - # Display where finder is looking for packages - locations = self.finder.get_formatted_locations() - if locations: - logger.info(locations) - - # Actually prepare the files, and collect any exceptions. Most hash - # exceptions cannot be checked ahead of time, because - # req.populate_link() needs to be called before we can make decisions - # based on link type. - discovered_reqs = [] # type: List[InstallRequirement] - hash_errors = HashErrors() - for req in chain(root_reqs, discovered_reqs): - try: - discovered_reqs.extend( - self._resolve_one(requirement_set, req) - ) - except HashError as exc: - exc.req = req - hash_errors.append(exc) - - if hash_errors: - raise hash_errors - - def _is_upgrade_allowed(self, req): - # type: (InstallRequirement) -> bool - if self.upgrade_strategy == "to-satisfy-only": - return False - elif self.upgrade_strategy == "eager": - return True - else: - assert self.upgrade_strategy == "only-if-needed" - return req.is_direct - - def _set_req_to_reinstall(self, req): - # type: (InstallRequirement) -> None - """ - Set a requirement to be installed. - """ - # Don't uninstall the conflict if doing a user install and the - # conflict is not a user install. - if not self.use_user_site or dist_in_usersite(req.satisfied_by): - req.conflicts_with = req.satisfied_by - req.satisfied_by = None - - # XXX: Stop passing requirement_set for options - def _check_skip_installed(self, req_to_install): - # type: (InstallRequirement) -> Optional[str] - """Check if req_to_install should be skipped. - - This will check if the req is installed, and whether we should upgrade - or reinstall it, taking into account all the relevant user options. - - After calling this req_to_install will only have satisfied_by set to - None if the req_to_install is to be upgraded/reinstalled etc. Any - other value will be a dist recording the current thing installed that - satisfies the requirement. - - Note that for vcs urls and the like we can't assess skipping in this - routine - we simply identify that we need to pull the thing down, - then later on it is pulled down and introspected to assess upgrade/ - reinstalls etc. - - :return: A text reason for why it was skipped, or None. - """ - if self.ignore_installed: - return None - - req_to_install.check_if_exists(self.use_user_site) - if not req_to_install.satisfied_by: - return None - - if self.force_reinstall: - self._set_req_to_reinstall(req_to_install) - return None - - if not self._is_upgrade_allowed(req_to_install): - if self.upgrade_strategy == "only-if-needed": - return 'already satisfied, skipping upgrade' - return 'already satisfied' - - # Check for the possibility of an upgrade. For link-based - # requirements we have to pull the tree down and inspect to assess - # the version #, so it's handled way down. - if not req_to_install.link: - try: - self.finder.find_requirement(req_to_install, upgrade=True) - except BestVersionAlreadyInstalled: - # Then the best version is installed. - return 'already up-to-date' - except DistributionNotFound: - # No distribution found, so we squash the error. It will - # be raised later when we re-try later to do the install. - # Why don't we just raise here? - pass - - self._set_req_to_reinstall(req_to_install) - return None - - def _get_abstract_dist_for(self, req): - # type: (InstallRequirement) -> DistAbstraction - """Takes a InstallRequirement and returns a single AbstractDist \ - representing a prepared variant of the same. - """ - assert self.require_hashes is not None, ( - "require_hashes should have been set in Resolver.resolve()" - ) - - if req.editable: - return self.preparer.prepare_editable_requirement( - req, self.require_hashes, self.use_user_site, self.finder, - ) - - # satisfied_by is only evaluated by calling _check_skip_installed, - # so it must be None here. - assert req.satisfied_by is None - skip_reason = self._check_skip_installed(req) - - if req.satisfied_by: - return self.preparer.prepare_installed_requirement( - req, self.require_hashes, skip_reason - ) - - upgrade_allowed = self._is_upgrade_allowed(req) - abstract_dist = self.preparer.prepare_linked_requirement( - req, self.session, self.finder, upgrade_allowed, - self.require_hashes - ) - - # NOTE - # The following portion is for determining if a certain package is - # going to be re-installed/upgraded or not and reporting to the user. - # This should probably get cleaned up in a future refactor. - - # req.req is only avail after unpack for URL - # pkgs repeat check_if_exists to uninstall-on-upgrade - # (#14) - if not self.ignore_installed: - req.check_if_exists(self.use_user_site) - - if req.satisfied_by: - should_modify = ( - self.upgrade_strategy != "to-satisfy-only" or - self.force_reinstall or - self.ignore_installed or - req.link.scheme == 'file' - ) - if should_modify: - self._set_req_to_reinstall(req) - else: - logger.info( - 'Requirement already satisfied (use --upgrade to upgrade):' - ' %s', req, - ) - - return abstract_dist - - def _resolve_one( - self, - requirement_set, # type: RequirementSet - req_to_install # type: InstallRequirement - ): - # type: (...) -> List[InstallRequirement] - """Prepare a single requirements file. - - :return: A list of additional InstallRequirements to also install. - """ - # Tell user what we are doing for this requirement: - # obtain (editable), skipping, processing (local url), collecting - # (remote url or package name) - if req_to_install.constraint or req_to_install.prepared: - return [] - - req_to_install.prepared = True - - # register tmp src for cleanup in case something goes wrong - requirement_set.reqs_to_cleanup.append(req_to_install) - - abstract_dist = self._get_abstract_dist_for(req_to_install) - - # Parse and return dependencies - dist = abstract_dist.dist() - try: - check_dist_requires_python(dist) - except UnsupportedPythonVersion as err: - if self.ignore_requires_python: - logger.warning(err.args[0]) - else: - raise - - more_reqs = [] # type: List[InstallRequirement] - - def add_req(subreq, extras_requested): - sub_install_req = install_req_from_req_string( - str(subreq), - req_to_install, - isolated=self.isolated, - wheel_cache=self.wheel_cache, - use_pep517=self.use_pep517 - ) - parent_req_name = req_to_install.name - to_scan_again, add_to_parent = requirement_set.add_requirement( - sub_install_req, - parent_req_name=parent_req_name, - extras_requested=extras_requested, - ) - if parent_req_name and add_to_parent: - self._discovered_dependencies[parent_req_name].append( - add_to_parent - ) - more_reqs.extend(to_scan_again) - - with indent_log(): - # We add req_to_install before its dependencies, so that we - # can refer to it when adding dependencies. - if not requirement_set.has_requirement(req_to_install.name): - # 'unnamed' requirements will get added here - req_to_install.is_direct = True - requirement_set.add_requirement( - req_to_install, parent_req_name=None, - ) - - if not self.ignore_dependencies: - if req_to_install.extras: - logger.debug( - "Installing extra requirements: %r", - ','.join(req_to_install.extras), - ) - missing_requested = sorted( - set(req_to_install.extras) - set(dist.extras) - ) - for missing in missing_requested: - logger.warning( - '%s does not provide the extra \'%s\'', - dist, missing - ) - - available_requested = sorted( - set(dist.extras) & set(req_to_install.extras) - ) - for subreq in dist.requires(available_requested): - add_req(subreq, extras_requested=available_requested) - - if not req_to_install.editable and not req_to_install.satisfied_by: - # XXX: --no-install leads this to report 'Successfully - # downloaded' for only non-editable reqs, even though we took - # action on them. - requirement_set.successfully_downloaded.append(req_to_install) - - return more_reqs - - def get_installation_order(self, req_set): - # type: (RequirementSet) -> List[InstallRequirement] - """Create the installation order. - - The installation order is topological - requirements are installed - before the requiring thing. We break cycles at an arbitrary point, - and make no other guarantees. - """ - # The current implementation, which we may change at any point - # installs the user specified things in the order given, except when - # dependencies must come earlier to achieve topological order. - order = [] - ordered_reqs = set() # type: Set[InstallRequirement] - - def schedule(req): - if req.satisfied_by or req in ordered_reqs: - return - if req.constraint: - return - ordered_reqs.add(req) - for dep in self._discovered_dependencies[req.name]: - schedule(dep) - order.append(req) - - for install_req in req_set.requirements.values(): - schedule(install_req) - return order diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 25a68395200580df1f014306d315e5a51b2e7d02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/encoding.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/encoding.cpython-38.pyc deleted file mode 100644 index ea1cdd0c5f27d4b7d4ec4e07e2038419edc0c069..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1295 zcmZuv&2A$_5bmBIdpveR$cELjLNF4S7}hf+mR11)LTfvK$a+`#IqYn**4W*)hqPyg z?)C<+oD*>20XQO?8*c)y&{s}5bAroKJ&r9O=uy{KUsZK=O?91ZY`6&4AFrz~{)c2Pz&=?hW;j&&z;$-mrlg}>B#Rt33Yv)(~#fQ}%)`i?I=q9pZ zH(-n3KuFX?7Z1*jYkX}?(F{-V9CK@mq%p-mV1j=#-bOQXYRs{LFgiisfp2CJ-~ zd*OWZ+MJriBDUtFaB1+Sv}c8>3At99(ywNdMW3$C)va!RD$BkA@yjoXo>53 zunr@}x)J1oaF+HWM*RVm8K->;XUQ^n7vco1dMv)AUYgNlx9X*d_jDqMX;N?ht=s9| z7$CV;Z?wpb?<+eJy*NIsR+I&0ohVnxh)Z!5%b_wEO;mwUs0bcXWGt4d+-f(TG+`b( z$1PP5G~&IXDhzl!&V(u~YE(P_SEMq20!7v@sfDfTnNy>vm7H8RU(AU6gg9v;tY4S2)aW}{o|Lq?HB9^q4K?9=! z6+sqfwY`u1kNkQqo7DXSpAH7v7E7XuK6E`%4Q`1 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/filesystem.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/filesystem.cpython-38.pyc deleted file mode 100644 index 36d804f5988364b4d512d75979fbb1810ef34b6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 681 zcmYjO&2G~`5T0E-v5B0hLWl$60q`MSP%j`MgoNk?sg+1kA%{lByN$Q;AG@1CkaMAk z=SYsc3D2+xEGDJKK<qjU!a8khZ zT9Z!Gf|lOYBfvfGe}}2h$pqrw6;{JxOl&k4X4a%8pDiWNhzs8kqCtrK3R(X^VZabh zE~p-HIzfyLX`v+xPkl4woNm1qc0^T%Z2cXgEvP#E8kt@T7i2?Ept|pa=`RNAn1K5} z0QV>G9$M;ZC)j%%v?$NR9eSVcb~fGKaa}25Z7}9u#Jxis;Lrl+JyveugLq(rJk_Z& z%F11?pSmLm34AIqj;qr^(q zOO4jeWqyK+F!g86^12jEm|&8(f<13RA^%)z}@ zZ2gV~PTY=dkn{0e?11dV^Kl1cHzs??>;4OWLmrl|g$KOMYC(fEuSzERpj-ZK|M`Bf z^>lmd+hF%)zyD4DYmZ3#`%0u`5oWUWqOLL;DTG-wU}8hxg3fng5a=Ao_yV7z6Q@Ck zwU` z6*VikJId07$UUNrgGDYEEG>xoWFt(;P{`2ErISo(M!sl_Eb2j=yviAc)gq5o-*r-E((@HiY%-mB7TLf&Xx$n!vVCMP){t=v zh_?DCt7~68f0T!ZC42nigN@CfKk|O^wJHTC%~U6!Z~s=&NYMCBKpdwcaX)dR5<B#bJZh!SZZhpYgnK%A(VT-dD(k>>Q(R4ol~ zt!#~0Sy!IP7UB7Ffze;4qm%1|92 z*M^}6l3p7IDIFUP8Y&4!dgjR=FWAHtr5i&oFmM`mMM7^=>o_j7Ss4gjp(>GE4zFqe zch?}W*JqW%bB~iWN&s*e)|pV)G_S;Dc3Oj_g&T!@`md}k$93fnL&z3i@AjecA@)AJ z1K3tc<6)f&9v*aW5qH;b_AJ9xHJrMttzAXfDrmd~=>);BhI&SWfGJ0@wi*=o>HXT!~ z8Bsa594oFkmAL9u)w@zO71x}a8kU^F!6&xc-5Uw>|&pF!=7C% z_CEKrjBz{fdAYqa2%|vQ@gT~>EMhi_%Y+RpY2q{6O9I>PF~2W>oyE4-^+M2N)rO~^ zr2ENAH%$Y(FhEtkZu=StKY4JB?G7}t2xLS9+P8QuB#AbnBjN&v!SdQLRbS)Aw=$1= z@mQ2w_L?1l0qnG6dr>z91oUD%@nVoNOT#1w@G za{9gv=CNEr1adbtX$Tf|q**B7CE=Gr*nbaNy)m&Vyjxq@FVD8F>a9ytzTEm#qVTw)n?nrd_&ehZpKYjj$hg|S74S5PNR zG++1q1xz9CP<(}{Sr`;}8qp)|IYg!{@{+b28aH7@spzGq?!@227bwJ;wESI|-iKCz zSsT{JLKNEg!Lg`zb?h_@05T+}a4bE+P(g>@n<3-boiJi6QP>BR>^xhB$eo{b}h?gX@FG zp3pBLklrA_C!6H2pnL4Uf~=3Rvn@5ggCQ)Jk=H)$(JN^&Bk?#?(3Di8% zYV-}FBcD%^XZ+y!G{EB>CP7D8>ir@|+WQbddysQBRMvpBa&SI#TzJTM>bl!-TA^r&Z4*45Ex%bz^il-X322Z13?>cAKZK62B6;ORh{Y(B z>wW`^6ZoFR;$p1CH!W!DW--*x#_JWGKLeM4D| zU&oP>RZ^=yEL?aHUHFKf0y$q*d`mhs z&;tF11$6~f7Emvgz9j}!6<|D5)**0W?Nq3C_;)BBQr`EJZ*@|xVk-pbfnWg|II;KH zH4f3W_{#Q*Xo{Sk&DriCO_YmkmAoS6OONdej?Pwf7_$Gc5{&@yb*ZWyv822fw|TQF5tmi159zId>? z@#vnrzP7clQ1+6_itGB3Cj?;O%)E$-rzjHo6e$fCFWBJqxgS~a8h47eJL6Z#rw&35`OpNW5WuooD=V!v-a!ZI44}LQ2jX}?{tgg117%awg^DXk zc~gYXRCXEuj#~3Hg z@ni}`t093uYlLIA;xkClJNX=vc_gTCS>JlJ`JjDYf#BYjG>iPCe6|3~nH^36A+6g* kAo(>0TJa+wHO0Pd&l=R_XOAc6W+;B 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/models.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/models.cpython-38.pyc deleted file mode 100644 index 37bc18dbc23361395ae6a11869693b3d8b29497f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1980 zcmb_c&2AGh5Vm(WX__YeqXi@cS|lzxGz;Pa5}=AoAcUw86%xt;YrEqlPB*)Y?N+49 ztvm=E`zAcYUODj!TwrE5Y0FPUMe)iW+hfmuGvoPQH=A{a?eq86+f|RTFSIz@aF1vG{JHWNhkR z(F)s+Xgu2-Tx?=DZ*Y*T!|_iJaIy;S2iEbxg9^$DRACNf6>2b#at`XSfU*V+Xri2l zMOZ>vhh9UX7(BG4zx{ob#5%aXsoSfOhZkBNv^Dz@_?BIw_?XY9M-E#7V zDE}k{TFIBhG)y9jLt|QQ?im?(bCKP!)!o=3ai_Je*pl!5L`E0a_QPhyp2uYxWK zz0nI%cOa94AXd9UHnRORx!b-M7-i)~7DjtvPnsZ8*~Xpw?c43U8`%ieZQ1M5W*}5z zrB1>)*vE95pv+!78|5{DI%S1eAP?zvFka<{*Z&mQ_VjGT>D;8z{3Jy5_$(W<0YBn9 zOjGzUJYGLEeNDz&Tvt&PE|&w{AQW^&h$UPZvc_g(C{ISkDLRRb=48G|(;`mB>?5Yi z@`3XS-*Jh<#otWQl-JTs>d>Y-uL=>P`^QcJEU%=tFZD0@G-ZAj`xM%>8Q~#I{{T!A zWKF&oaHJ4=g?8v+oJL7s!sR;lzoI|`7e>)TSN@1%4G~;D2MRK9aTK#+L2SiFu|wpcjCa|3tG z2ky~H8F_gf2{kb`Od_c(cq?DrPVKW{7R#YTo`JH`-LlfDZ1U<*B4fd?51O9+E$oIk zf$;|SoLS5>DctQ=lgJ`LIus(W3xQ0wAJe=c#Jl}4o@nNTfHcCa5v}Pa4OGKL32A!4 znjVm*{AmhbS%IhZR?LW+G*QbOc0;#n+;eMQ%{}`SCt9AS_)Tg!-5tot7K$@2pV-W6 P4@%gNh&v0?MYHY?K{ci< diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/outdated.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/outdated.cpython-38.pyc deleted file mode 100644 index abed9099a3da080a87c335a35638ccb018fc1090..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4147 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/packaging.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/packaging.cpython-38.pyc deleted file mode 100644 index ea079cb0932d564783b8ffc04dd8f0310b01807d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/typing.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__pycache__/typing.cpython-38.pyc deleted file mode 100644 index 33edad299fa8b4daebce3cb89c18759ef8376728..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1354 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/appdirs.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/appdirs.py deleted file mode 100644 index 9af9fa7..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/appdirs.py +++ /dev/null @@ -1,270 +0,0 @@ -""" -This code was taken from https://github.com/ActiveState/appdirs and modified -to suit our purposes. -""" -from __future__ import absolute_import - -import os -import sys - -from pip._vendor.six import PY2, text_type - -from pip._internal.utils.compat import WINDOWS, expanduser -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - List, Union - ) - - -def user_cache_dir(appname): - # type: (str) -> str - r""" - Return full path to the user-specific cache dir for this application. - - "appname" is the name of application. - - Typical user cache directories are: - macOS: ~/Library/Caches/ - Unix: ~/.cache/ (XDG default) - Windows: C:\Users\\AppData\Local\\Cache - - On Windows the only suggestion in the MSDN docs is that local settings go - in the `CSIDL_LOCAL_APPDATA` directory. This is identical to the - non-roaming app data dir (the default returned by `user_data_dir`). Apps - typically put cache data somewhere *under* the given dir here. Some - examples: - ...\Mozilla\Firefox\Profiles\\Cache - ...\Acme\SuperApp\Cache\1.0 - - OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. - """ - if WINDOWS: - # Get the base path - path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) - - # When using Python 2, return paths as bytes on Windows like we do on - # other operating systems. See helper function docs for more details. - if PY2 and isinstance(path, text_type): - path = _win_path_to_bytes(path) - - # Add our app name and Cache directory to it - path = os.path.join(path, appname, "Cache") - elif sys.platform == "darwin": - # Get the base path - path = expanduser("~/Library/Caches") - - # Add our app name to it - path = os.path.join(path, appname) - else: - # Get the base path - path = os.getenv("XDG_CACHE_HOME", expanduser("~/.cache")) - - # Add our app name to it - path = os.path.join(path, appname) - - return path - - -def user_data_dir(appname, roaming=False): - # type: (str, bool) -> str - r""" - Return full path to the user-specific data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - - for a discussion of issues. - - Typical user data directories are: - macOS: ~/Library/Application Support/ - if it exists, else ~/.config/ - Unix: ~/.local/share/ # or in - $XDG_DATA_HOME, if defined - Win XP (not roaming): C:\Documents and Settings\\ ... - ...Application Data\ - Win XP (roaming): C:\Documents and Settings\\Local ... - ...Settings\Application Data\ - Win 7 (not roaming): C:\\Users\\AppData\Local\ - Win 7 (roaming): C:\\Users\\AppData\Roaming\ - - For Unix, we follow the XDG spec and support $XDG_DATA_HOME. - That means, by default "~/.local/share/". - """ - if WINDOWS: - const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" - path = os.path.join(os.path.normpath(_get_win_folder(const)), appname) - elif sys.platform == "darwin": - path = os.path.join( - expanduser('~/Library/Application Support/'), - appname, - ) if os.path.isdir(os.path.join( - expanduser('~/Library/Application Support/'), - appname, - ) - ) else os.path.join( - expanduser('~/.config/'), - appname, - ) - else: - path = os.path.join( - os.getenv('XDG_DATA_HOME', expanduser("~/.local/share")), - appname, - ) - - return path - - -def user_config_dir(appname, roaming=True): - # type: (str, bool) -> str - """Return full path to the user-specific config dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "roaming" (boolean, default True) can be set False to not use the - Windows roaming appdata directory. That means that for users on a - Windows network setup for roaming profiles, this user data will be - sync'd on login. See - - for a discussion of issues. - - Typical user data directories are: - macOS: same as user_data_dir - Unix: ~/.config/ - Win *: same as user_data_dir - - For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. - That means, by default "~/.config/". - """ - if WINDOWS: - path = user_data_dir(appname, roaming=roaming) - elif sys.platform == "darwin": - path = user_data_dir(appname) - else: - path = os.getenv('XDG_CONFIG_HOME', expanduser("~/.config")) - path = os.path.join(path, appname) - - return path - - -# for the discussion regarding site_config_dirs locations -# see -def site_config_dirs(appname): - # type: (str) -> List[str] - r"""Return a list of potential user-shared config dirs for this application. - - "appname" is the name of application. - - Typical user config directories are: - macOS: /Library/Application Support// - Unix: /etc or $XDG_CONFIG_DIRS[i]// for each value in - $XDG_CONFIG_DIRS - Win XP: C:\Documents and Settings\All Users\Application ... - ...Data\\ - Vista: (Fail! "C:\ProgramData" is a hidden *system* directory - on Vista.) - Win 7: Hidden, but writeable on Win 7: - C:\ProgramData\\ - """ - if WINDOWS: - path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) - pathlist = [os.path.join(path, appname)] - elif sys.platform == 'darwin': - pathlist = [os.path.join('/Library/Application Support', appname)] - else: - # try looking in $XDG_CONFIG_DIRS - xdg_config_dirs = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') - if xdg_config_dirs: - pathlist = [ - os.path.join(expanduser(x), appname) - for x in xdg_config_dirs.split(os.pathsep) - ] - else: - pathlist = [] - - # always look in /etc directly as well - pathlist.append('/etc') - - return pathlist - - -# -- Windows support functions -- - -def _get_win_folder_from_registry(csidl_name): - # type: (str) -> str - """ - This is a fallback technique at best. I'm not sure if using the - registry for this guarantees us the correct answer for all CSIDL_* - names. - """ - import _winreg - - shell_folder_name = { - "CSIDL_APPDATA": "AppData", - "CSIDL_COMMON_APPDATA": "Common AppData", - "CSIDL_LOCAL_APPDATA": "Local AppData", - }[csidl_name] - - key = _winreg.OpenKey( - _winreg.HKEY_CURRENT_USER, - r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" - ) - directory, _type = _winreg.QueryValueEx(key, shell_folder_name) - return directory - - -def _get_win_folder_with_ctypes(csidl_name): - # type: (str) -> str - csidl_const = { - "CSIDL_APPDATA": 26, - "CSIDL_COMMON_APPDATA": 35, - "CSIDL_LOCAL_APPDATA": 28, - }[csidl_name] - - buf = ctypes.create_unicode_buffer(1024) - ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) - - # Downgrade to short path name if have highbit chars. See - # . - has_high_char = False - for c in buf: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - buf2 = ctypes.create_unicode_buffer(1024) - if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): - buf = buf2 - - return buf.value - - -if WINDOWS: - try: - import ctypes - _get_win_folder = _get_win_folder_with_ctypes - except ImportError: - _get_win_folder = _get_win_folder_from_registry - - -def _win_path_to_bytes(path): - """Encode Windows paths to bytes. Only used on Python 2. - - Motivation is to be consistent with other operating systems where paths - are also returned as bytes. This avoids problems mixing bytes and Unicode - elsewhere in the codebase. For more details and discussion see - . - - If encoding using ASCII and MBCS fails, return the original Unicode path. - """ - for encoding in ('ASCII', 'MBCS'): - try: - return path.encode(encoding) - except (UnicodeEncodeError, LookupError): - pass - return path diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/compat.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/compat.py deleted file mode 100644 index 2d8b3bf..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/compat.py +++ /dev/null @@ -1,264 +0,0 @@ -"""Stuff that differs in different Python versions and platform -distributions.""" -from __future__ import absolute_import, division - -import codecs -import locale -import logging -import os -import shutil -import sys - -from pip._vendor.six import text_type - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Tuple, Text # noqa: F401 - -try: - import ipaddress -except ImportError: - try: - from pip._vendor import ipaddress # type: ignore - except ImportError: - import ipaddr as ipaddress # type: ignore - ipaddress.ip_address = ipaddress.IPAddress # type: ignore - ipaddress.ip_network = ipaddress.IPNetwork # type: ignore - - -__all__ = [ - "ipaddress", "uses_pycache", "console_to_str", "native_str", - "get_path_uid", "stdlib_pkgs", "WINDOWS", "samefile", "get_terminal_size", - "get_extension_suffixes", -] - - -logger = logging.getLogger(__name__) - -if sys.version_info >= (3, 4): - uses_pycache = True - from importlib.util import cache_from_source -else: - import imp - - try: - cache_from_source = imp.cache_from_source # type: ignore - except AttributeError: - # does not use __pycache__ - cache_from_source = None - - uses_pycache = cache_from_source is not None - - -if sys.version_info >= (3, 5): - backslashreplace_decode = "backslashreplace" -else: - # In version 3.4 and older, backslashreplace exists - # but does not support use for decoding. - # We implement our own replace handler for this - # situation, so that we can consistently use - # backslash replacement for all versions. - def backslashreplace_decode_fn(err): - raw_bytes = (err.object[i] for i in range(err.start, err.end)) - if sys.version_info[0] == 2: - # Python 2 gave us characters - convert to numeric bytes - raw_bytes = (ord(b) for b in raw_bytes) - return u"".join(u"\\x%x" % c for c in raw_bytes), err.end - codecs.register_error( - "backslashreplace_decode", - backslashreplace_decode_fn, - ) - backslashreplace_decode = "backslashreplace_decode" - - -def console_to_str(data): - # type: (bytes) -> Text - """Return a string, safe for output, of subprocess output. - - We assume the data is in the locale preferred encoding. - If it won't decode properly, we warn the user but decode as - best we can. - - We also ensure that the output can be safely written to - standard output without encoding errors. - """ - - # First, get the encoding we assume. This is the preferred - # encoding for the locale, unless that is not found, or - # it is ASCII, in which case assume UTF-8 - encoding = locale.getpreferredencoding() - if (not encoding) or codecs.lookup(encoding).name == "ascii": - encoding = "utf-8" - - # Now try to decode the data - if we fail, warn the user and - # decode with replacement. - try: - decoded_data = data.decode(encoding) - except UnicodeDecodeError: - logger.warning( - "Subprocess output does not appear to be encoded as %s", - encoding, - ) - decoded_data = data.decode(encoding, errors=backslashreplace_decode) - - # Make sure we can print the output, by encoding it to the output - # encoding with replacement of unencodable characters, and then - # decoding again. - # We use stderr's encoding because it's less likely to be - # redirected and if we don't find an encoding we skip this - # step (on the assumption that output is wrapped by something - # that won't fail). - # The double getattr is to deal with the possibility that we're - # being called in a situation where sys.__stderr__ doesn't exist, - # or doesn't have an encoding attribute. Neither of these cases - # should occur in normal pip use, but there's no harm in checking - # in case people use pip in (unsupported) unusual situations. - output_encoding = getattr(getattr(sys, "__stderr__", None), - "encoding", None) - - if output_encoding: - output_encoded = decoded_data.encode( - output_encoding, - errors="backslashreplace" - ) - decoded_data = output_encoded.decode(output_encoding) - - return decoded_data - - -if sys.version_info >= (3,): - def native_str(s, replace=False): - # type: (str, bool) -> str - if isinstance(s, bytes): - return s.decode('utf-8', 'replace' if replace else 'strict') - return s - -else: - def native_str(s, replace=False): - # type: (str, bool) -> str - # Replace is ignored -- unicode to UTF-8 can't fail - if isinstance(s, text_type): - return s.encode('utf-8') - return s - - -def get_path_uid(path): - # type: (str) -> int - """ - Return path's uid. - - Does not follow symlinks: - https://github.com/pypa/pip/pull/935#discussion_r5307003 - - Placed this function in compat due to differences on AIX and - Jython, that should eventually go away. - - :raises OSError: When path is a symlink or can't be read. - """ - if hasattr(os, 'O_NOFOLLOW'): - fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) - file_uid = os.fstat(fd).st_uid - os.close(fd) - else: # AIX and Jython - # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW - if not os.path.islink(path): - # older versions of Jython don't have `os.fstat` - file_uid = os.stat(path).st_uid - else: - # raise OSError for parity with os.O_NOFOLLOW above - raise OSError( - "%s is a symlink; Will not return uid for symlinks" % path - ) - return file_uid - - -if sys.version_info >= (3, 4): - from importlib.machinery import EXTENSION_SUFFIXES - - def get_extension_suffixes(): - return EXTENSION_SUFFIXES -else: - from imp import get_suffixes - - def get_extension_suffixes(): - return [suffix[0] for suffix in get_suffixes()] - - -def expanduser(path): - # type: (str) -> str - """ - Expand ~ and ~user constructions. - - Includes a workaround for https://bugs.python.org/issue14768 - """ - expanded = os.path.expanduser(path) - if path.startswith('~/') and expanded.startswith('//'): - expanded = expanded[1:] - return expanded - - -# 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']`, -# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may -# make this ineffective, so hard-coding -stdlib_pkgs = {"python", "wsgiref", "argparse"} - - -# windows detection, covers cpython and ironpython -WINDOWS = (sys.platform.startswith("win") or - (sys.platform == 'cli' and os.name == 'nt')) - - -def samefile(file1, file2): - # type: (str, str) -> bool - """Provide an alternative for os.path.samefile on Windows/Python2""" - if hasattr(os.path, 'samefile'): - return os.path.samefile(file1, file2) - else: - path1 = os.path.normcase(os.path.abspath(file1)) - path2 = os.path.normcase(os.path.abspath(file2)) - return path1 == path2 - - -if hasattr(shutil, 'get_terminal_size'): - def get_terminal_size(): - # type: () -> Tuple[int, int] - """ - Returns a tuple (x, y) representing the width(x) and the height(y) - in characters of the terminal window. - """ - return tuple(shutil.get_terminal_size()) # type: ignore -else: - def get_terminal_size(): - # type: () -> Tuple[int, int] - """ - Returns a tuple (x, y) representing the width(x) and the height(y) - in characters of the terminal window. - """ - def ioctl_GWINSZ(fd): - try: - import fcntl - import termios - import struct - cr = struct.unpack_from( - 'hh', - fcntl.ioctl(fd, termios.TIOCGWINSZ, '12345678') - ) - except Exception: - return None - if cr == (0, 0): - return None - return cr - cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) - if not cr: - try: - fd = os.open(os.ctermid(), os.O_RDONLY) - cr = ioctl_GWINSZ(fd) - os.close(fd) - except Exception: - pass - if not cr: - cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80)) - return int(cr[1]), int(cr[0]) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/deprecation.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/deprecation.py deleted file mode 100644 index 0beaf74..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/deprecation.py +++ /dev/null @@ -1,90 +0,0 @@ -""" -A module that implements tooling to enable easy warnings about deprecations. -""" -from __future__ import absolute_import - -import logging -import warnings - -from pip._vendor.packaging.version import parse - -from pip import __version__ as current_version -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, Optional # noqa: F401 - - -class PipDeprecationWarning(Warning): - pass - - -_original_showwarning = None # type: Any - - -# Warnings <-> Logging Integration -def _showwarning(message, category, filename, lineno, file=None, line=None): - if file is not None: - if _original_showwarning is not None: - _original_showwarning( - message, category, filename, lineno, file, line, - ) - elif issubclass(category, PipDeprecationWarning): - # We use a specially named logger which will handle all of the - # deprecation messages for pip. - logger = logging.getLogger("pip._internal.deprecations") - logger.warning(message) - else: - _original_showwarning( - message, category, filename, lineno, file, line, - ) - - -def install_warning_logger(): - # type: () -> None - # Enable our Deprecation Warnings - warnings.simplefilter("default", PipDeprecationWarning, append=True) - - global _original_showwarning - - if _original_showwarning is None: - _original_showwarning = warnings.showwarning - warnings.showwarning = _showwarning - - -def deprecated(reason, replacement, gone_in, issue=None): - # type: (str, Optional[str], Optional[str], Optional[int]) -> None - """Helper to deprecate existing functionality. - - reason: - Textual reason shown to the user about why this functionality has - been deprecated. - replacement: - Textual suggestion shown to the user about what alternative - functionality they can use. - gone_in: - The version of pip does this functionality should get removed in. - Raises errors if pip's current version is greater than or equal to - this. - issue: - Issue number on the tracker that would serve as a useful place for - users to find related discussion and provide feedback. - - Always pass replacement, gone_in and issue as keyword arguments for clarity - at the call site. - """ - - # Construct a nice message. - # This is purposely eagerly formatted as we want it to appear as if someone - # typed this entire message out. - message = "DEPRECATION: " + reason - if replacement is not None: - message += " A possible replacement is {}.".format(replacement) - if issue is not None: - url = "https://github.com/pypa/pip/issues/" + str(issue) - message += " You can find discussion regarding this at {}.".format(url) - - # Raise as an error if it has to be removed. - if gone_in is not None and parse(current_version) >= parse(gone_in): - raise PipDeprecationWarning(message) - warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/encoding.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/encoding.py deleted file mode 100644 index d36defa..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/encoding.py +++ /dev/null @@ -1,39 +0,0 @@ -import codecs -import locale -import re -import sys - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import List, Tuple, Text # noqa: F401 - -BOMS = [ - (codecs.BOM_UTF8, 'utf8'), - (codecs.BOM_UTF16, 'utf16'), - (codecs.BOM_UTF16_BE, 'utf16-be'), - (codecs.BOM_UTF16_LE, 'utf16-le'), - (codecs.BOM_UTF32, 'utf32'), - (codecs.BOM_UTF32_BE, 'utf32-be'), - (codecs.BOM_UTF32_LE, 'utf32-le'), -] # type: List[Tuple[bytes, Text]] - -ENCODING_RE = re.compile(br'coding[:=]\s*([-\w.]+)') - - -def auto_decode(data): - # type: (bytes) -> Text - """Check a bytes string for a BOM to correctly detect the encoding - - Fallback to locale.getpreferredencoding(False) like open() on Python3""" - for bom, encoding in BOMS: - if data.startswith(bom): - return data[len(bom):].decode(encoding) - # Lets check the first two lines as in PEP263 - for line in data.split(b'\n')[:2]: - if line[0:1] == b'#' and ENCODING_RE.search(line): - encoding = ENCODING_RE.search(line).groups()[0].decode('ascii') - return data.decode(encoding) - return data.decode( - locale.getpreferredencoding(False) or sys.getdefaultencoding(), - ) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/filesystem.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/filesystem.py deleted file mode 100644 index 1e6b033..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/filesystem.py +++ /dev/null @@ -1,30 +0,0 @@ -import os -import os.path - -from pip._internal.utils.compat import get_path_uid - - -def check_path_owner(path): - # type: (str) -> bool - # If we don't have a way to check the effective uid of this process, then - # we'll just assume that we own the directory. - if not hasattr(os, "geteuid"): - return True - - previous = None - while path != previous: - if os.path.lexists(path): - # Check if path is writable by current user. - if os.geteuid() == 0: - # Special handling for root user in order to handle properly - # cases where users use sudo without -H flag. - try: - path_uid = get_path_uid(path) - except OSError: - return False - return path_uid == 0 - else: - return os.access(path, os.W_OK) - else: - previous, path = path, os.path.dirname(path) - return False # assume we don't own the path diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/glibc.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/glibc.py deleted file mode 100644 index 8a51f69..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/glibc.py +++ /dev/null @@ -1,93 +0,0 @@ -from __future__ import absolute_import - -import ctypes -import re -import warnings - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, Tuple # noqa: F401 - - -def glibc_version_string(): - # type: () -> Optional[str] - "Returns glibc version string, or None if not using glibc." - - # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen - # manpage says, "If filename is NULL, then the returned handle is for the - # main program". This way we can let the linker do the work to figure out - # which libc our process is actually using. - process_namespace = ctypes.CDLL(None) - try: - gnu_get_libc_version = process_namespace.gnu_get_libc_version - except AttributeError: - # Symbol doesn't exist -> therefore, we are not linked to - # glibc. - return None - - # Call gnu_get_libc_version, which returns a string like "2.5" - gnu_get_libc_version.restype = ctypes.c_char_p - version_str = gnu_get_libc_version() - # py2 / py3 compatibility: - if not isinstance(version_str, str): - version_str = version_str.decode("ascii") - - return version_str - - -# Separated out from have_compatible_glibc for easier unit testing -def check_glibc_version(version_str, required_major, minimum_minor): - # type: (str, int, int) -> bool - # Parse string and check against requested version. - # - # We use a regexp instead of str.split because we want to discard any - # random junk that might come after the minor version -- this might happen - # in patched/forked versions of glibc (e.g. Linaro's version of glibc - # uses version strings like "2.20-2014.11"). See gh-3588. - m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) - if not m: - warnings.warn("Expected glibc version with 2 components major.minor," - " got: %s" % version_str, RuntimeWarning) - return False - return (int(m.group("major")) == required_major and - int(m.group("minor")) >= minimum_minor) - - -def have_compatible_glibc(required_major, minimum_minor): - # type: (int, int) -> bool - version_str = glibc_version_string() # type: Optional[str] - if version_str is None: - return False - return check_glibc_version(version_str, required_major, minimum_minor) - - -# platform.libc_ver regularly returns completely nonsensical glibc -# versions. E.g. on my computer, platform says: -# -# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' -# ('glibc', '2.7') -# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' -# ('glibc', '2.9') -# -# But the truth is: -# -# ~$ ldd --version -# ldd (Debian GLIBC 2.22-11) 2.22 -# -# This is unfortunate, because it means that the linehaul data on libc -# versions that was generated by pip 8.1.2 and earlier is useless and -# misleading. Solution: instead of using platform, use our code that actually -# works. -def libc_ver(): - # type: () -> Tuple[str, str] - """Try to determine the glibc version - - Returns a tuple of strings (lib, version) which default to empty strings - in case the lookup fails. - """ - glibc_version = glibc_version_string() - if glibc_version is None: - return ("", "") - else: - return ("glibc", glibc_version) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/hashes.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/hashes.py deleted file mode 100644 index c6df7a1..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/hashes.py +++ /dev/null @@ -1,115 +0,0 @@ -from __future__ import absolute_import - -import hashlib - -from pip._vendor.six import iteritems, iterkeys, itervalues - -from pip._internal.exceptions import ( - HashMismatch, HashMissing, InstallationError, -) -from pip._internal.utils.misc import read_chunks -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Dict, List, BinaryIO, NoReturn, Iterator - ) - from pip._vendor.six import PY3 - if PY3: - from hashlib import _Hash # noqa: F401 - else: - from hashlib import _hash as _Hash # noqa: F401 - - -# The recommended hash algo of the moment. Change this whenever the state of -# the art changes; it won't hurt backward compatibility. -FAVORITE_HASH = 'sha256' - - -# Names of hashlib algorithms allowed by the --hash option and ``pip hash`` -# Currently, those are the ones at least as collision-resistant as sha256. -STRONG_HASHES = ['sha256', 'sha384', 'sha512'] - - -class Hashes(object): - """A wrapper that builds multiple hashes at once and checks them against - known-good values - - """ - def __init__(self, hashes=None): - # type: (Dict[str, List[str]]) -> None - """ - :param hashes: A dict of algorithm names pointing to lists of allowed - hex digests - """ - self._allowed = {} if hashes is None else hashes - - def check_against_chunks(self, chunks): - # type: (Iterator[bytes]) -> None - """Check good hashes against ones built from iterable of chunks of - data. - - Raise HashMismatch if none match. - - """ - gots = {} - for hash_name in iterkeys(self._allowed): - try: - gots[hash_name] = hashlib.new(hash_name) - except (ValueError, TypeError): - raise InstallationError('Unknown hash name: %s' % hash_name) - - for chunk in chunks: - for hash in itervalues(gots): - hash.update(chunk) - - for hash_name, got in iteritems(gots): - if got.hexdigest() in self._allowed[hash_name]: - return - self._raise(gots) - - def _raise(self, gots): - # type: (Dict[str, _Hash]) -> NoReturn - raise HashMismatch(self._allowed, gots) - - def check_against_file(self, file): - # type: (BinaryIO) -> None - """Check good hashes against a file-like object - - Raise HashMismatch if none match. - - """ - return self.check_against_chunks(read_chunks(file)) - - def check_against_path(self, path): - # type: (str) -> None - with open(path, 'rb') as file: - return self.check_against_file(file) - - def __nonzero__(self): - # type: () -> bool - """Return whether I know any known-good hashes.""" - return bool(self._allowed) - - def __bool__(self): - # type: () -> bool - return self.__nonzero__() - - -class MissingHashes(Hashes): - """A workalike for Hashes used when we're missing a hash for a requirement - - It computes the actual hash of the requirement and raises a HashMissing - exception showing it to the user. - - """ - def __init__(self): - # type: () -> None - """Don't offer the ``hashes`` kwarg.""" - # Pass our favorite hash in to generate a "gotten hash". With the - # empty list, it will never match, so an error will always raise. - super(MissingHashes, self).__init__(hashes={FAVORITE_HASH: []}) - - def _raise(self, gots): - # type: (Dict[str, _Hash]) -> NoReturn - raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/logging.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/logging.py deleted file mode 100644 index 579d696..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/logging.py +++ /dev/null @@ -1,318 +0,0 @@ -from __future__ import absolute_import - -import contextlib -import errno -import logging -import logging.handlers -import os -import sys - -from pip._vendor.six import PY2 - -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.misc import ensure_dir - -try: - import threading -except ImportError: - import dummy_threading as threading # type: ignore - - -try: - from pip._vendor import colorama -# Lots of different errors can come from this, including SystemError and -# ImportError. -except Exception: - colorama = None - - -_log_state = threading.local() -_log_state.indentation = 0 - - -class BrokenStdoutLoggingError(Exception): - """ - Raised if BrokenPipeError occurs for the stdout stream while logging. - """ - pass - - -# BrokenPipeError does not exist in Python 2 and, in addition, manifests -# differently in Windows and non-Windows. -if WINDOWS: - # In Windows, a broken pipe can show up as EINVAL rather than EPIPE: - # https://bugs.python.org/issue19612 - # https://bugs.python.org/issue30418 - if PY2: - def _is_broken_pipe_error(exc_class, exc): - """See the docstring for non-Windows Python 3 below.""" - return (exc_class is IOError and - exc.errno in (errno.EINVAL, errno.EPIPE)) - else: - # In Windows, a broken pipe IOError became OSError in Python 3. - def _is_broken_pipe_error(exc_class, exc): - """See the docstring for non-Windows Python 3 below.""" - return ((exc_class is BrokenPipeError) or # noqa: F821 - (exc_class is OSError and - exc.errno in (errno.EINVAL, errno.EPIPE))) -elif PY2: - def _is_broken_pipe_error(exc_class, exc): - """See the docstring for non-Windows Python 3 below.""" - return (exc_class is IOError and exc.errno == errno.EPIPE) -else: - # Then we are in the non-Windows Python 3 case. - def _is_broken_pipe_error(exc_class, exc): - """ - Return whether an exception is a broken pipe error. - - Args: - exc_class: an exception class. - exc: an exception instance. - """ - return (exc_class is BrokenPipeError) # noqa: F821 - - -@contextlib.contextmanager -def indent_log(num=2): - """ - A context manager which will cause the log output to be indented for any - log messages emitted inside it. - """ - _log_state.indentation += num - try: - yield - finally: - _log_state.indentation -= num - - -def get_indentation(): - return getattr(_log_state, 'indentation', 0) - - -class IndentingFormatter(logging.Formatter): - def __init__(self, *args, **kwargs): - """ - A logging.Formatter obeying containing indent_log contexts. - - :param add_timestamp: A bool indicating output lines should be prefixed - with their record's timestamp. - """ - self.add_timestamp = kwargs.pop("add_timestamp", False) - super(IndentingFormatter, self).__init__(*args, **kwargs) - - def format(self, record): - """ - Calls the standard formatter, but will indent all of the log messages - by our current indentation level. - """ - formatted = super(IndentingFormatter, self).format(record) - prefix = '' - if self.add_timestamp: - prefix = self.formatTime(record, "%Y-%m-%dT%H:%M:%S ") - prefix += " " * get_indentation() - formatted = "".join([ - prefix + line - for line in formatted.splitlines(True) - ]) - return formatted - - -def _color_wrap(*colors): - def wrapped(inp): - return "".join(list(colors) + [inp, colorama.Style.RESET_ALL]) - return wrapped - - -class ColorizedStreamHandler(logging.StreamHandler): - - # Don't build up a list of colors if we don't have colorama - if colorama: - COLORS = [ - # This needs to be in order from highest logging level to lowest. - (logging.ERROR, _color_wrap(colorama.Fore.RED)), - (logging.WARNING, _color_wrap(colorama.Fore.YELLOW)), - ] - else: - COLORS = [] - - def __init__(self, stream=None, no_color=None): - logging.StreamHandler.__init__(self, stream) - self._no_color = no_color - - if WINDOWS and colorama: - self.stream = colorama.AnsiToWin32(self.stream) - - def _using_stdout(self): - """ - Return whether the handler is using sys.stdout. - """ - if WINDOWS and colorama: - # Then self.stream is an AnsiToWin32 object. - return self.stream.wrapped is sys.stdout - - return self.stream is sys.stdout - - def should_color(self): - # Don't colorize things if we do not have colorama or if told not to - if not colorama or self._no_color: - return False - - real_stream = ( - self.stream if not isinstance(self.stream, colorama.AnsiToWin32) - else self.stream.wrapped - ) - - # If the stream is a tty we should color it - if hasattr(real_stream, "isatty") and real_stream.isatty(): - return True - - # If we have an ANSI term we should color it - if os.environ.get("TERM") == "ANSI": - return True - - # If anything else we should not color it - return False - - def format(self, record): - msg = logging.StreamHandler.format(self, record) - - if self.should_color(): - for level, color in self.COLORS: - if record.levelno >= level: - msg = color(msg) - break - - return msg - - # The logging module says handleError() can be customized. - def handleError(self, record): - exc_class, exc = sys.exc_info()[:2] - # If a broken pipe occurred while calling write() or flush() on the - # stdout stream in logging's Handler.emit(), then raise our special - # exception so we can handle it in main() instead of logging the - # broken pipe error and continuing. - if (exc_class and self._using_stdout() and - _is_broken_pipe_error(exc_class, exc)): - raise BrokenStdoutLoggingError() - - return super(ColorizedStreamHandler, self).handleError(record) - - -class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): - - def _open(self): - ensure_dir(os.path.dirname(self.baseFilename)) - return logging.handlers.RotatingFileHandler._open(self) - - -class MaxLevelFilter(logging.Filter): - - def __init__(self, level): - self.level = level - - def filter(self, record): - return record.levelno < self.level - - -def setup_logging(verbosity, no_color, user_log_file): - """Configures and sets up all of the logging - - Returns the requested logging level, as its integer value. - """ - - # Determine the level to be logging at. - if verbosity >= 1: - level = "DEBUG" - elif verbosity == -1: - level = "WARNING" - elif verbosity == -2: - level = "ERROR" - elif verbosity <= -3: - level = "CRITICAL" - else: - level = "INFO" - - level_number = getattr(logging, level) - - # The "root" logger should match the "console" level *unless* we also need - # to log to a user log file. - include_user_log = user_log_file is not None - if include_user_log: - additional_log_file = user_log_file - root_level = "DEBUG" - else: - additional_log_file = "/dev/null" - root_level = level - - # Disable any logging besides WARNING unless we have DEBUG level logging - # enabled for vendored libraries. - vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG" - - # Shorthands for clarity - log_streams = { - "stdout": "ext://sys.stdout", - "stderr": "ext://sys.stderr", - } - handler_classes = { - "stream": "pip._internal.utils.logging.ColorizedStreamHandler", - "file": "pip._internal.utils.logging.BetterRotatingFileHandler", - } - - logging.config.dictConfig({ - "version": 1, - "disable_existing_loggers": False, - "filters": { - "exclude_warnings": { - "()": "pip._internal.utils.logging.MaxLevelFilter", - "level": logging.WARNING, - }, - }, - "formatters": { - "indent": { - "()": IndentingFormatter, - "format": "%(message)s", - }, - "indent_with_timestamp": { - "()": IndentingFormatter, - "format": "%(message)s", - "add_timestamp": True, - }, - }, - "handlers": { - "console": { - "level": level, - "class": handler_classes["stream"], - "no_color": no_color, - "stream": log_streams["stdout"], - "filters": ["exclude_warnings"], - "formatter": "indent", - }, - "console_errors": { - "level": "WARNING", - "class": handler_classes["stream"], - "no_color": no_color, - "stream": log_streams["stderr"], - "formatter": "indent", - }, - "user_log": { - "level": "DEBUG", - "class": handler_classes["file"], - "filename": additional_log_file, - "delay": True, - "formatter": "indent_with_timestamp", - }, - }, - "root": { - "level": root_level, - "handlers": ["console", "console_errors"] + ( - ["user_log"] if include_user_log else [] - ), - }, - "loggers": { - "pip._vendor": { - "level": vendored_log_level - } - }, - }) - - return level_number diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/misc.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/misc.py deleted file mode 100644 index 84605ee..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/misc.py +++ /dev/null @@ -1,1040 +0,0 @@ -from __future__ import absolute_import - -import contextlib -import errno -import io -import locale -# we have a submodule named 'logging' which would shadow this if we used the -# regular name: -import logging as std_logging -import os -import posixpath -import re -import shutil -import stat -import subprocess -import sys -import tarfile -import zipfile -from collections import deque - -from pip._vendor import pkg_resources -# NOTE: retrying is not annotated in typeshed as on 2017-07-17, which is -# why we ignore the type on this import. -from pip._vendor.retrying import retry # type: ignore -from pip._vendor.six import PY2 -from pip._vendor.six.moves import input -from pip._vendor.six.moves.urllib import parse as urllib_parse -from pip._vendor.six.moves.urllib.parse import unquote as urllib_unquote - -from pip._internal.exceptions import CommandError, InstallationError -from pip._internal.locations import ( - running_under_virtualenv, site_packages, user_site, virtualenv_no_global, - write_delete_marker_file, -) -from pip._internal.utils.compat import ( - WINDOWS, console_to_str, expanduser, stdlib_pkgs, -) -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if PY2: - from io import BytesIO as StringIO -else: - from io import StringIO - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Optional, Tuple, Iterable, List, Match, Union, Any, Mapping, Text, - AnyStr, Container - ) - from pip._vendor.pkg_resources import Distribution # noqa: F401 - from pip._internal.models.link import Link # noqa: F401 - from pip._internal.utils.ui import SpinnerInterface # noqa: F401 - - -__all__ = ['rmtree', 'display_path', 'backup_dir', - 'ask', 'splitext', - 'format_size', 'is_installable_dir', - 'is_svn_page', 'file_contents', - 'split_leading_dir', 'has_leading_dir', - 'normalize_path', - 'renames', 'get_prog', - 'unzip_file', 'untar_file', 'unpack_file', 'call_subprocess', - 'captured_stdout', 'ensure_dir', - 'ARCHIVE_EXTENSIONS', 'SUPPORTED_EXTENSIONS', 'WHEEL_EXTENSION', - 'get_installed_version', 'remove_auth_from_url'] - - -logger = std_logging.getLogger(__name__) - -WHEEL_EXTENSION = '.whl' -BZ2_EXTENSIONS = ('.tar.bz2', '.tbz') -XZ_EXTENSIONS = ('.tar.xz', '.txz', '.tlz', '.tar.lz', '.tar.lzma') -ZIP_EXTENSIONS = ('.zip', WHEEL_EXTENSION) -TAR_EXTENSIONS = ('.tar.gz', '.tgz', '.tar') -ARCHIVE_EXTENSIONS = ( - ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS) -SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS - -try: - import bz2 # noqa - SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS -except ImportError: - logger.debug('bz2 module is not available') - -try: - # Only for Python 3.3+ - import lzma # noqa - SUPPORTED_EXTENSIONS += XZ_EXTENSIONS -except ImportError: - logger.debug('lzma module is not available') - - -def ensure_dir(path): - # type: (AnyStr) -> None - """os.path.makedirs without EEXIST.""" - try: - os.makedirs(path) - except OSError as e: - if e.errno != errno.EEXIST: - raise - - -def get_prog(): - # type: () -> str - try: - prog = os.path.basename(sys.argv[0]) - if prog in ('__main__.py', '-c'): - return "%s -m pip" % sys.executable - else: - return prog - except (AttributeError, TypeError, IndexError): - pass - return 'pip' - - -# Retry every half second for up to 3 seconds -@retry(stop_max_delay=3000, wait_fixed=500) -def rmtree(dir, ignore_errors=False): - # type: (str, bool) -> None - shutil.rmtree(dir, ignore_errors=ignore_errors, - onerror=rmtree_errorhandler) - - -def rmtree_errorhandler(func, path, exc_info): - """On Windows, the files in .svn are read-only, so when rmtree() tries to - remove them, an exception is thrown. We catch that here, remove the - read-only attribute, and hopefully continue without problems.""" - # if file type currently read only - if os.stat(path).st_mode & stat.S_IREAD: - # convert to read/write - os.chmod(path, stat.S_IWRITE) - # use the original function to repeat the operation - func(path) - return - else: - raise - - -def display_path(path): - # type: (Union[str, Text]) -> str - """Gives the display value for a given path, making it relative to cwd - if possible.""" - path = os.path.normcase(os.path.abspath(path)) - if sys.version_info[0] == 2: - path = path.decode(sys.getfilesystemencoding(), 'replace') - path = path.encode(sys.getdefaultencoding(), 'replace') - if path.startswith(os.getcwd() + os.path.sep): - path = '.' + path[len(os.getcwd()):] - return path - - -def backup_dir(dir, ext='.bak'): - # type: (str, str) -> str - """Figure out the name of a directory to back up the given dir to - (adding .bak, .bak2, etc)""" - n = 1 - extension = ext - while os.path.exists(dir + extension): - n += 1 - extension = ext + str(n) - return dir + extension - - -def ask_path_exists(message, options): - # type: (str, Iterable[str]) -> str - for action in os.environ.get('PIP_EXISTS_ACTION', '').split(): - if action in options: - return action - return ask(message, options) - - -def ask(message, options): - # type: (str, Iterable[str]) -> str - """Ask the message interactively, with the given possible responses""" - while 1: - if os.environ.get('PIP_NO_INPUT'): - raise Exception( - 'No input was expected ($PIP_NO_INPUT set); question: %s' % - message - ) - response = input(message) - response = response.strip().lower() - if response not in options: - print( - 'Your response (%r) was not one of the expected responses: ' - '%s' % (response, ', '.join(options)) - ) - else: - return response - - -def format_size(bytes): - # type: (float) -> str - if bytes > 1000 * 1000: - return '%.1fMB' % (bytes / 1000.0 / 1000) - elif bytes > 10 * 1000: - return '%ikB' % (bytes / 1000) - elif bytes > 1000: - return '%.1fkB' % (bytes / 1000.0) - else: - return '%ibytes' % bytes - - -def is_installable_dir(path): - # type: (str) -> bool - """Is path is a directory containing setup.py or pyproject.toml? - """ - if not os.path.isdir(path): - return False - setup_py = os.path.join(path, 'setup.py') - if os.path.isfile(setup_py): - return True - pyproject_toml = os.path.join(path, 'pyproject.toml') - if os.path.isfile(pyproject_toml): - return True - return False - - -def is_svn_page(html): - # type: (Union[str, Text]) -> Optional[Match[Union[str, Text]]] - """ - Returns true if the page appears to be the index page of an svn repository - """ - return (re.search(r'[^<]*Revision \d+:', html) and - re.search(r'Powered by (?:<a[^>]*?>)?Subversion', html, re.I)) - - -def file_contents(filename): - # type: (str) -> Text - with open(filename, 'rb') as fp: - return fp.read().decode('utf-8') - - -def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE): - """Yield pieces of data from a file-like object until EOF.""" - while True: - chunk = file.read(size) - if not chunk: - break - yield chunk - - -def split_leading_dir(path): - # type: (Union[str, Text]) -> List[Union[str, Text]] - path = path.lstrip('/').lstrip('\\') - if '/' in path and (('\\' in path and path.find('/') < path.find('\\')) or - '\\' not in path): - return path.split('/', 1) - elif '\\' in path: - return path.split('\\', 1) - else: - return [path, ''] - - -def has_leading_dir(paths): - # type: (Iterable[Union[str, Text]]) -> bool - """Returns true if all the paths have the same leading path name - (i.e., everything is in one subdirectory in an archive)""" - common_prefix = None - for path in paths: - prefix, rest = split_leading_dir(path) - if not prefix: - return False - elif common_prefix is None: - common_prefix = prefix - elif prefix != common_prefix: - return False - return True - - -def normalize_path(path, resolve_symlinks=True): - # type: (str, bool) -> str - """ - Convert a path to its canonical, case-normalized, absolute version. - - """ - path = expanduser(path) - if resolve_symlinks: - path = os.path.realpath(path) - else: - path = os.path.abspath(path) - return os.path.normcase(path) - - -def splitext(path): - # type: (str) -> Tuple[str, str] - """Like os.path.splitext, but take off .tar too""" - base, ext = posixpath.splitext(path) - if base.lower().endswith('.tar'): - ext = base[-4:] + ext - base = base[:-4] - return base, ext - - -def renames(old, new): - # type: (str, str) -> None - """Like os.renames(), but handles renaming across devices.""" - # Implementation borrowed from os.renames(). - head, tail = os.path.split(new) - if head and tail and not os.path.exists(head): - os.makedirs(head) - - shutil.move(old, new) - - head, tail = os.path.split(old) - if head and tail: - try: - os.removedirs(head) - except OSError: - pass - - -def is_local(path): - # type: (str) -> bool - """ - Return True if path is within sys.prefix, if we're running in a virtualenv. - - If we're not in a virtualenv, all paths are considered "local." - - """ - if not running_under_virtualenv(): - return True - return normalize_path(path).startswith(normalize_path(sys.prefix)) - - -def dist_is_local(dist): - # type: (Distribution) -> bool - """ - Return True if given Distribution object is installed locally - (i.e. within current virtualenv). - - Always True if we're not in a virtualenv. - - """ - return is_local(dist_location(dist)) - - -def dist_in_usersite(dist): - # type: (Distribution) -> bool - """ - Return True if given Distribution is installed in user site. - """ - norm_path = normalize_path(dist_location(dist)) - return norm_path.startswith(normalize_path(user_site)) - - -def dist_in_site_packages(dist): - # type: (Distribution) -> bool - """ - Return True if given Distribution is installed in - sysconfig.get_python_lib(). - """ - return normalize_path( - dist_location(dist) - ).startswith(normalize_path(site_packages)) - - -def dist_is_editable(dist): - # type: (Distribution) -> bool - """ - Return True if given Distribution is an editable install. - """ - for path_item in sys.path: - egg_link = os.path.join(path_item, dist.project_name + '.egg-link') - if os.path.isfile(egg_link): - return True - return False - - -def get_installed_distributions(local_only=True, - skip=stdlib_pkgs, - include_editables=True, - editables_only=False, - user_only=False): - # type: (bool, Container[str], bool, bool, bool) -> List[Distribution] - """ - Return a list of installed Distribution objects. - - If ``local_only`` is True (default), only return installations - local to the current virtualenv, if in a virtualenv. - - ``skip`` argument is an iterable of lower-case project names to - ignore; defaults to stdlib_pkgs - - If ``include_editables`` is False, don't report editables. - - If ``editables_only`` is True , only report editables. - - If ``user_only`` is True , only report installations in the user - site directory. - - """ - if local_only: - local_test = dist_is_local - else: - def local_test(d): - return True - - if include_editables: - def editable_test(d): - return True - else: - def editable_test(d): - return not dist_is_editable(d) - - if editables_only: - def editables_only_test(d): - return dist_is_editable(d) - else: - def editables_only_test(d): - return True - - if user_only: - user_test = dist_in_usersite - else: - def user_test(d): - return True - - # because of pkg_resources vendoring, mypy cannot find stub in typeshed - return [d for d in pkg_resources.working_set # type: ignore - if local_test(d) and - d.key not in skip and - editable_test(d) and - editables_only_test(d) and - user_test(d) - ] - - -def egg_link_path(dist): - # type: (Distribution) -> Optional[str] - """ - Return the path for the .egg-link file if it exists, otherwise, None. - - There's 3 scenarios: - 1) not in a virtualenv - try to find in site.USER_SITE, then site_packages - 2) in a no-global virtualenv - try to find in site_packages - 3) in a yes-global virtualenv - try to find in site_packages, then site.USER_SITE - (don't look in global location) - - For #1 and #3, there could be odd cases, where there's an egg-link in 2 - locations. - - This method will just return the first one found. - """ - sites = [] - if running_under_virtualenv(): - if virtualenv_no_global(): - sites.append(site_packages) - else: - sites.append(site_packages) - if user_site: - sites.append(user_site) - else: - if user_site: - sites.append(user_site) - sites.append(site_packages) - - for site in sites: - egglink = os.path.join(site, dist.project_name) + '.egg-link' - if os.path.isfile(egglink): - return egglink - return None - - -def dist_location(dist): - # type: (Distribution) -> str - """ - Get the site-packages location of this distribution. Generally - this is dist.location, except in the case of develop-installed - packages, where dist.location is the source code location, and we - want to know where the egg-link file is. - - """ - egg_link = egg_link_path(dist) - if egg_link: - return egg_link - return dist.location - - -def current_umask(): - """Get the current umask which involves having to set it temporarily.""" - mask = os.umask(0) - os.umask(mask) - return mask - - -def unzip_file(filename, location, flatten=True): - # type: (str, str, bool) -> None - """ - Unzip 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 - no-ops per the python docs. - """ - ensure_dir(location) - zipfp = open(filename, 'rb') - try: - zip = zipfile.ZipFile(zipfp, allowZip64=True) - leading = has_leading_dir(zip.namelist()) and flatten - for info in zip.infolist(): - name = info.filename - fn = name - if leading: - fn = split_leading_dir(name)[1] - fn = os.path.join(location, fn) - dir = os.path.dirname(fn) - if fn.endswith('/') or fn.endswith('\\'): - # A directory - ensure_dir(fn) - else: - ensure_dir(dir) - # Don't use read() to avoid allocating an arbitrarily large - # chunk of memory for the file's content - fp = zip.open(name) - try: - with open(fn, 'wb') as destfp: - shutil.copyfileobj(fp, destfp) - finally: - fp.close() - mode = info.external_attr >> 16 - # if mode and regular file and any execute permissions for - # user/group/world? - if mode and stat.S_ISREG(mode) and mode & 0o111: - # make dest file have execute for user/group/world - # (chmod +x) no-op on windows per python docs - os.chmod(fn, (0o777 - current_umask() | 0o111)) - finally: - zipfp.close() - - -def untar_file(filename, location): - # type: (str, 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 - no-ops per the python docs. - """ - ensure_dir(location) - if filename.lower().endswith('.gz') or filename.lower().endswith('.tgz'): - mode = 'r:gz' - elif filename.lower().endswith(BZ2_EXTENSIONS): - mode = 'r:bz2' - elif filename.lower().endswith(XZ_EXTENSIONS): - mode = 'r:xz' - elif filename.lower().endswith('.tar'): - mode = 'r' - else: - logger.warning( - 'Cannot determine compression type for file %s', filename, - ) - mode = 'r:*' - tar = tarfile.open(filename, mode) - try: - leading = has_leading_dir([ - member.name for member in tar.getmembers() - ]) - for member in tar.getmembers(): - fn = member.name - if leading: - # https://github.com/python/mypy/issues/1174 - fn = split_leading_dir(fn)[1] # type: ignore - path = os.path.join(location, fn) - if member.isdir(): - ensure_dir(path) - elif member.issym(): - try: - # https://github.com/python/typeshed/issues/2673 - tar._extract_member(member, path) # type: ignore - 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)) - with open(path, 'wb') as destfp: - shutil.copyfileobj(fp, destfp) - fp.close() - # Update the timestamp (useful for cython compiled files) - # https://github.com/python/typeshed/issues/2673 - tar.utime(member, path) # type: ignore - # member have any execute permissions for user/group/world? - if member.mode & 0o111: - # make dest file have execute for user/group/world - # no-op on windows per python docs - os.chmod(path, (0o777 - current_umask() | 0o111)) - finally: - tar.close() - - -def unpack_file( - filename, # type: str - location, # type: str - content_type, # type: Optional[str] - link # type: Optional[Link] -): - # type: (...) -> None - filename = os.path.realpath(filename) - if (content_type == 'application/zip' or - filename.lower().endswith(ZIP_EXTENSIONS) or - zipfile.is_zipfile(filename)): - unzip_file( - filename, - location, - flatten=not filename.endswith('.whl') - ) - elif (content_type == 'application/x-gzip' or - tarfile.is_tarfile(filename) or - filename.lower().endswith( - TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS)): - untar_file(filename, location) - elif (content_type and content_type.startswith('text/html') and - is_svn_page(file_contents(filename))): - # We don't really care about this - from pip._internal.vcs.subversion import Subversion - Subversion('svn+' + link.url).unpack(location) - else: - # FIXME: handle? - # FIXME: magic signatures? - logger.critical( - 'Cannot unpack file %s (downloaded from %s, content-type: %s); ' - 'cannot detect archive format', - filename, location, content_type, - ) - raise InstallationError( - 'Cannot determine archive format of %s' % location - ) - - -def call_subprocess( - cmd, # type: List[str] - show_stdout=True, # type: bool - cwd=None, # type: Optional[str] - on_returncode='raise', # type: str - extra_ok_returncodes=None, # type: Optional[Iterable[int]] - command_desc=None, # type: Optional[str] - extra_environ=None, # type: Optional[Mapping[str, Any]] - unset_environ=None, # type: Optional[Iterable[str]] - spinner=None # type: Optional[SpinnerInterface] -): - # type: (...) -> Optional[Text] - """ - Args: - extra_ok_returncodes: an iterable of integer return codes that are - acceptable, in addition to 0. Defaults to None, which means []. - unset_environ: an iterable of environment variable names to unset - prior to calling subprocess.Popen(). - """ - if extra_ok_returncodes is None: - extra_ok_returncodes = [] - if unset_environ is None: - unset_environ = [] - # This function's handling of subprocess output is confusing and I - # previously broke it terribly, so as penance I will write a long comment - # explaining things. - # - # The obvious thing that affects output is the show_stdout= - # kwarg. show_stdout=True means, let the subprocess write directly to our - # stdout. Even though it is nominally the default, it is almost never used - # inside pip (and should not be used in new code without a very good - # reason); as of 2016-02-22 it is only used in a few places inside the VCS - # wrapper code. Ideally we should get rid of it entirely, because it - # creates a lot of complexity here for a rarely used feature. - # - # Most places in pip set show_stdout=False. What this means is: - # - We connect the child stdout to a pipe, which we read. - # - By default, we hide the output but show a spinner -- unless the - # subprocess exits with an error, in which case we show the output. - # - If the --verbose option was passed (= loglevel is DEBUG), then we show - # the output unconditionally. (But in this case we don't want to show - # the output a second time if it turns out that there was an error.) - # - # stderr is always merged with stdout (even if show_stdout=True). - if show_stdout: - stdout = None - else: - stdout = subprocess.PIPE - if command_desc is None: - cmd_parts = [] - for part in cmd: - if ' ' in part or '\n' in part or '"' in part or "'" in part: - part = '"%s"' % part.replace('"', '\\"') - cmd_parts.append(part) - command_desc = ' '.join(cmd_parts) - logger.debug("Running command %s", command_desc) - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - for name in unset_environ: - env.pop(name, None) - try: - proc = subprocess.Popen( - cmd, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, - stdout=stdout, cwd=cwd, env=env, - ) - proc.stdin.close() - except Exception as exc: - logger.critical( - "Error %s while executing command %s", exc, command_desc, - ) - raise - all_output = [] - if stdout is not None: - while True: - line = console_to_str(proc.stdout.readline()) - if not line: - break - line = line.rstrip() - all_output.append(line + '\n') - if logger.getEffectiveLevel() <= std_logging.DEBUG: - # Show the line immediately - logger.debug(line) - else: - # Update the spinner - if spinner is not None: - spinner.spin() - try: - proc.wait() - finally: - if proc.stdout: - proc.stdout.close() - if spinner is not None: - if proc.returncode: - spinner.finish("error") - else: - spinner.finish("done") - if proc.returncode and proc.returncode not in extra_ok_returncodes: - if on_returncode == 'raise': - if (logger.getEffectiveLevel() > std_logging.DEBUG and - not show_stdout): - logger.info( - 'Complete output from command %s:', command_desc, - ) - logger.info( - ''.join(all_output) + - '\n----------------------------------------' - ) - raise InstallationError( - 'Command "%s" failed with error code %s in %s' - % (command_desc, proc.returncode, cwd)) - elif on_returncode == 'warn': - logger.warning( - 'Command "%s" had error code %s in %s', - command_desc, proc.returncode, cwd, - ) - elif on_returncode == 'ignore': - pass - else: - raise ValueError('Invalid value: on_returncode=%s' % - repr(on_returncode)) - if not show_stdout: - return ''.join(all_output) - return None - - -def read_text_file(filename): - # type: (str) -> str - """Return the contents of *filename*. - - Try to decode the file contents with utf-8, the preferred system encoding - (e.g., cp1252 on some Windows machines), and latin1, in that order. - Decoding a byte string with latin1 will never raise an error. In the worst - case, the returned string will contain some garbage characters. - - """ - with open(filename, 'rb') as fp: - data = fp.read() - - encodings = ['utf-8', locale.getpreferredencoding(False), 'latin1'] - for enc in encodings: - try: - # https://github.com/python/mypy/issues/1174 - data = data.decode(enc) # type: ignore - except UnicodeDecodeError: - continue - break - - assert not isinstance(data, bytes) # Latin1 should have worked. - return data - - -def _make_build_dir(build_dir): - os.makedirs(build_dir) - write_delete_marker_file(build_dir) - - -class FakeFile(object): - """Wrap a list of lines in an object with readline() to make - ConfigParser happy.""" - def __init__(self, lines): - self._gen = (l for l in lines) - - def readline(self): - try: - try: - return next(self._gen) - except NameError: - return self._gen.next() - except StopIteration: - return '' - - def __iter__(self): - return self._gen - - -class StreamWrapper(StringIO): - - @classmethod - def from_stream(cls, orig_stream): - cls.orig_stream = orig_stream - return cls() - - # compileall.compile_dir() needs stdout.encoding to print to stdout - @property - def encoding(self): - return self.orig_stream.encoding - - -@contextlib.contextmanager -def captured_output(stream_name): - """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(): - """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(): - """ - See captured_stdout(). - """ - return captured_output('stderr') - - -class cached_property(object): - """A property that is only computed once per instance and then replaces - itself with an ordinary attribute. Deleting the attribute resets the - property. - - Source: https://github.com/bottlepy/bottle/blob/0.11.5/bottle.py#L175 - """ - - def __init__(self, func): - self.__doc__ = getattr(func, '__doc__') - self.func = func - - def __get__(self, obj, cls): - if obj is None: - # We're being accessed from the class itself, not from an object - return self - value = obj.__dict__[self.func.__name__] = self.func(obj) - return value - - -def get_installed_version(dist_name, working_set=None): - """Get the installed version of dist_name avoiding pkg_resources cache""" - # Create a requirement that we'll look for inside of setuptools. - req = pkg_resources.Requirement.parse(dist_name) - - if working_set is None: - # We want to avoid having this cached, so we need to construct a new - # working set each time. - working_set = pkg_resources.WorkingSet() - - # Get the installed distribution from our working set - dist = working_set.find(req) - - # Check to see if we got an installed distribution or not, if we did - # we want to return it's version. - return dist.version if dist else None - - -def consume(iterator): - """Consume an iterable at C speed.""" - deque(iterator, maxlen=0) - - -# Simulates an enum -def enum(*sequential, **named): - enums = dict(zip(sequential, range(len(sequential))), **named) - reverse = {value: key for key, value in enums.items()} - enums['reverse_mapping'] = reverse - return type('Enum', (), enums) - - -def make_vcs_requirement_url(repo_url, rev, project_name, subdir=None): - """ - Return the URL for a VCS requirement. - - Args: - repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+"). - project_name: the (unescaped) project name. - """ - egg_project_name = pkg_resources.to_filename(project_name) - req = '{}@{}#egg={}'.format(repo_url, rev, egg_project_name) - if subdir: - req += '&subdirectory={}'.format(subdir) - - return req - - -def split_auth_from_netloc(netloc): - """ - Parse out and remove the auth information from a netloc. - - Returns: (netloc, (username, password)). - """ - if '@' not in netloc: - return netloc, (None, None) - - # Split from the right because that's how urllib.parse.urlsplit() - # behaves if more than one @ is present (which can be checked using - # the password attribute of urlsplit()'s return value). - auth, netloc = netloc.rsplit('@', 1) - if ':' in auth: - # Split from the left because that's how urllib.parse.urlsplit() - # behaves if more than one : is present (which again can be checked - # using the password attribute of the return value) - user_pass = auth.split(':', 1) - else: - user_pass = auth, None - - user_pass = tuple( - None if x is None else urllib_unquote(x) for x in user_pass - ) - - return netloc, user_pass - - -def redact_netloc(netloc): - # type: (str) -> str - """ - Replace the password in a netloc with "****", if it exists. - - For example, "user:pass@example.com" returns "user:****@example.com". - """ - netloc, (user, password) = split_auth_from_netloc(netloc) - if user is None: - return netloc - password = '' if password is None else ':****' - return '{user}{password}@{netloc}'.format(user=urllib_parse.quote(user), - password=password, - netloc=netloc) - - -def _transform_url(url, transform_netloc): - purl = urllib_parse.urlsplit(url) - netloc = transform_netloc(purl.netloc) - # stripped url - url_pieces = ( - purl.scheme, netloc, purl.path, purl.query, purl.fragment - ) - surl = urllib_parse.urlunsplit(url_pieces) - return surl - - -def _get_netloc(netloc): - return split_auth_from_netloc(netloc)[0] - - -def remove_auth_from_url(url): - # type: (str) -> str - # Return a copy of url with 'username:password@' removed. - # username/pass params are passed to subversion through flags - # and are not recognized in the url. - return _transform_url(url, _get_netloc) - - -def redact_password_from_url(url): - # type: (str) -> str - """Replace the password in a given url with ****.""" - return _transform_url(url, redact_netloc) - - -def protect_pip_from_modification_on_windows(modifying_pip): - """Protection of pip.exe from modification on Windows - - On Windows, any operation modifying pip should be run as: - python -m pip ... - """ - pip_names = [ - "pip.exe", - "pip{}.exe".format(sys.version_info[0]), - "pip{}.{}.exe".format(*sys.version_info[:2]) - ] - - # See https://github.com/pypa/pip/issues/1299 for more discussion - should_show_use_python_msg = ( - modifying_pip and - WINDOWS and - os.path.basename(sys.argv[0]) in pip_names - ) - - if should_show_use_python_msg: - new_command = [ - sys.executable, "-m", "pip" - ] + sys.argv[1:] - raise CommandError( - 'To modify pip, please run the following command:\n{}' - .format(" ".join(new_command)) - ) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/models.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/models.py deleted file mode 100644 index d5cb80a..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/models.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Utilities for defining models -""" - -import operator - - -class KeyBasedCompareMixin(object): - """Provides comparision capabilities that is based on a key - """ - - def __init__(self, key, defining_class): - self._compare_key = key - self._defining_class = defining_class - - def __hash__(self): - return hash(self._compare_key) - - def __lt__(self, other): - return self._compare(other, operator.__lt__) - - def __le__(self, other): - return self._compare(other, operator.__le__) - - def __gt__(self, other): - return self._compare(other, operator.__gt__) - - def __ge__(self, other): - return self._compare(other, operator.__ge__) - - def __eq__(self, other): - return self._compare(other, operator.__eq__) - - def __ne__(self, other): - return self._compare(other, operator.__ne__) - - def _compare(self, other, method): - if not isinstance(other, self._defining_class): - return NotImplemented - - return method(self._compare_key, other._compare_key) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/outdated.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/outdated.py deleted file mode 100644 index 37c47a4..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/outdated.py +++ /dev/null @@ -1,164 +0,0 @@ -from __future__ import absolute_import - -import datetime -import json -import logging -import os.path -import sys - -from pip._vendor import lockfile, pkg_resources -from pip._vendor.packaging import version as packaging_version - -from pip._internal.index import PackageFinder -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.filesystem import check_path_owner -from pip._internal.utils.misc import ensure_dir, get_installed_version -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - import optparse # noqa: F401 - from typing import Any, Dict # noqa: F401 - from pip._internal.download import PipSession # noqa: F401 - - -SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" - - -logger = logging.getLogger(__name__) - - -class SelfCheckState(object): - def __init__(self, cache_dir): - # type: (str) -> None - self.state = {} # type: Dict[str, Any] - self.statefile_path = None - - # Try to load the existing state - if cache_dir: - self.statefile_path = os.path.join(cache_dir, "selfcheck.json") - try: - with open(self.statefile_path) as statefile: - self.state = json.load(statefile)[sys.prefix] - except (IOError, ValueError, KeyError): - # Explicitly suppressing exceptions, since we don't want to - # error out if the cache file is invalid. - pass - - def save(self, pypi_version, current_time): - # type: (str, datetime.datetime) -> None - # If we do not have a path to cache in, don't bother saving. - if not self.statefile_path: - return - - # Check to make sure that we own the directory - if not check_path_owner(os.path.dirname(self.statefile_path)): - return - - # Now that we've ensured the directory is owned by this user, we'll go - # ahead and make sure that all our directories are created. - ensure_dir(os.path.dirname(self.statefile_path)) - - # Attempt to write out our version check file - with lockfile.LockFile(self.statefile_path): - if os.path.exists(self.statefile_path): - with open(self.statefile_path) as statefile: - state = json.load(statefile) - else: - state = {} - - state[sys.prefix] = { - "last_check": current_time.strftime(SELFCHECK_DATE_FMT), - "pypi_version": pypi_version, - } - - with open(self.statefile_path, "w") as statefile: - json.dump(state, statefile, sort_keys=True, - separators=(",", ":")) - - -def was_installed_by_pip(pkg): - # type: (str) -> bool - """Checks whether pkg was installed by pip - - This is used not to display the upgrade message when pip is in fact - installed by system package manager, such as dnf on Fedora. - """ - try: - dist = pkg_resources.get_distribution(pkg) - return (dist.has_metadata('INSTALLER') and - 'pip' in dist.get_metadata_lines('INSTALLER')) - except pkg_resources.DistributionNotFound: - return False - - -def pip_version_check(session, options): - # type: (PipSession, optparse.Values) -> None - """Check for an update for pip. - - Limit the frequency of checks to once per week. State is stored either in - the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix - of the pip script path. - """ - installed_version = get_installed_version("pip") - if not installed_version: - return - - pip_version = packaging_version.parse(installed_version) - pypi_version = None - - try: - state = SelfCheckState(cache_dir=options.cache_dir) - - current_time = datetime.datetime.utcnow() - # Determine if we need to refresh the state - if "last_check" in state.state and "pypi_version" in state.state: - last_check = datetime.datetime.strptime( - state.state["last_check"], - SELFCHECK_DATE_FMT - ) - if (current_time - last_check).total_seconds() < 7 * 24 * 60 * 60: - pypi_version = state.state["pypi_version"] - - # Refresh the version if we need to or just see if we need to warn - if pypi_version is None: - # Lets use PackageFinder to see what the latest pip version is - finder = PackageFinder( - find_links=options.find_links, - index_urls=[options.index_url] + options.extra_index_urls, - allow_all_prereleases=False, # Explicitly set to False - trusted_hosts=options.trusted_hosts, - session=session, - ) - all_candidates = finder.find_all_candidates("pip") - if not all_candidates: - return - pypi_version = str( - max(all_candidates, key=lambda c: c.version).version - ) - - # save that we've performed a check - state.save(pypi_version, current_time) - - remote_version = packaging_version.parse(pypi_version) - - # Determine if our pypi_version is older - if (pip_version < remote_version and - pip_version.base_version != remote_version.base_version and - was_installed_by_pip('pip')): - # Advise "python -m pip" on Windows to avoid issues - # with overwriting pip.exe. - if WINDOWS: - pip_cmd = "python -m pip" - else: - pip_cmd = "pip" - logger.warning( - "You are using pip version %s, however version %s is " - "available.\nYou should consider upgrading via the " - "'%s install --upgrade pip' command.", - pip_version, pypi_version, pip_cmd - ) - except Exception: - logger.debug( - "There was an error checking the latest version of pip", - exc_info=True, - ) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/packaging.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/packaging.py deleted file mode 100644 index 7aaf7b5..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/packaging.py +++ /dev/null @@ -1,85 +0,0 @@ -from __future__ import absolute_import - -import logging -import sys -from email.parser import FeedParser - -from pip._vendor import pkg_resources -from pip._vendor.packaging import specifiers, version - -from pip._internal import exceptions -from pip._internal.utils.misc import display_path -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional # noqa: F401 - from email.message import Message # noqa: F401 - from pip._vendor.pkg_resources import Distribution # noqa: F401 - - -logger = logging.getLogger(__name__) - - -def check_requires_python(requires_python): - # type: (Optional[str]) -> bool - """ - Check if the python version in use match the `requires_python` specifier. - - Returns `True` if the version of python in use matches the requirement. - Returns `False` if the version of python in use does not matches the - requirement. - - Raises an InvalidSpecifier if `requires_python` have an invalid format. - """ - if requires_python is None: - # The package provides no information - return True - requires_python_specifier = specifiers.SpecifierSet(requires_python) - - # We only use major.minor.micro - python_version = version.parse('.'.join(map(str, sys.version_info[:3]))) - return python_version in requires_python_specifier - - -def get_metadata(dist): - # type: (Distribution) -> Message - if (isinstance(dist, pkg_resources.DistInfoDistribution) and - dist.has_metadata('METADATA')): - metadata = dist.get_metadata('METADATA') - elif dist.has_metadata('PKG-INFO'): - metadata = dist.get_metadata('PKG-INFO') - else: - logger.warning("No metadata found in %s", display_path(dist.location)) - metadata = '' - - feed_parser = FeedParser() - feed_parser.feed(metadata) - return feed_parser.close() - - -def check_dist_requires_python(dist): - pkg_info_dict = get_metadata(dist) - requires_python = pkg_info_dict.get('Requires-Python') - try: - if not check_requires_python(requires_python): - raise exceptions.UnsupportedPythonVersion( - "%s requires Python '%s' but the running Python is %s" % ( - dist.project_name, - requires_python, - '.'.join(map(str, sys.version_info[:3])),) - ) - except specifiers.InvalidSpecifier as e: - logger.warning( - "Package %s has an invalid Requires-Python entry %s - %s", - dist.project_name, requires_python, e, - ) - return - - -def get_installer(dist): - # type: (Distribution) -> str - if dist.has_metadata('INSTALLER'): - for line in dist.get_metadata_lines('INSTALLER'): - if line.strip(): - return line.strip() - return '' diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/setuptools_build.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/setuptools_build.py deleted file mode 100644 index 03973e9..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/setuptools_build.py +++ /dev/null @@ -1,8 +0,0 @@ -# Shim to wrap setup.py invocation with setuptools -SETUPTOOLS_SHIM = ( - "import setuptools, tokenize;__file__=%r;" - "f=getattr(tokenize, 'open', open)(__file__);" - "code=f.read().replace('\\r\\n', '\\n');" - "f.close();" - "exec(compile(code, __file__, 'exec'))" -) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/temp_dir.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/temp_dir.py deleted file mode 100644 index 2c81ad5..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/temp_dir.py +++ /dev/null @@ -1,155 +0,0 @@ -from __future__ import absolute_import - -import errno -import itertools -import logging -import os.path -import tempfile - -from pip._internal.utils.misc import rmtree - -logger = logging.getLogger(__name__) - - -class TempDirectory(object): - """Helper class that owns and cleans up a temporary directory. - - This class can be used as a context manager or as an OO representation of a - temporary directory. - - Attributes: - path - Location to the created temporary directory or None - delete - Whether the directory should be deleted when exiting - (when used as a contextmanager) - - Methods: - create() - Creates a temporary directory and stores its path in the path - attribute. - cleanup() - Deletes the temporary directory and sets path attribute to None - - When used as a context manager, a temporary directory is created on - entering the context and, if the delete attribute is True, on exiting the - context the created directory is deleted. - """ - - def __init__(self, path=None, delete=None, kind="temp"): - super(TempDirectory, self).__init__() - - if path is None and delete is None: - # If we were not given an explicit directory, and we were not given - # an explicit delete option, then we'll default to deleting. - delete = True - - self.path = path - self.delete = delete - self.kind = kind - - def __repr__(self): - return "<{} {!r}>".format(self.__class__.__name__, self.path) - - def __enter__(self): - self.create() - return self - - def __exit__(self, exc, value, tb): - if self.delete: - self.cleanup() - - def create(self): - """Create a temporary directory and store its path in self.path - """ - if self.path is not None: - logger.debug( - "Skipped creation of temporary directory: {}".format(self.path) - ) - return - # We realpath here because some systems have their default tmpdir - # symlinked to another directory. This tends to confuse build - # scripts, so we canonicalize the path by traversing potential - # symlinks here. - self.path = os.path.realpath( - tempfile.mkdtemp(prefix="pip-{}-".format(self.kind)) - ) - logger.debug("Created temporary directory: {}".format(self.path)) - - def cleanup(self): - """Remove the temporary directory created and reset state - """ - if self.path is not None and os.path.exists(self.path): - rmtree(self.path) - self.path = None - - -class AdjacentTempDirectory(TempDirectory): - """Helper class that creates a temporary directory adjacent to a real one. - - Attributes: - original - The original directory to create a temp directory for. - path - After calling create() or entering, contains the full - path to the temporary directory. - delete - Whether the directory should be deleted when exiting - (when used as a contextmanager) - - """ - # The characters that may be used to name the temp directory - # We always prepend a ~ and then rotate through these until - # a usable name is found. - # pkg_resources raises a different error for .dist-info folder - # with leading '-' and invalid metadata - LEADING_CHARS = "-~.=%0123456789" - - def __init__(self, original, delete=None): - super(AdjacentTempDirectory, self).__init__(delete=delete) - self.original = original.rstrip('/\\') - - @classmethod - def _generate_names(cls, name): - """Generates a series of temporary names. - - The algorithm replaces the leading characters in the name - with ones that are valid filesystem characters, but are not - valid package names (for both Python and pip definitions of - package). - """ - for i in range(1, len(name)): - for candidate in itertools.combinations_with_replacement( - cls.LEADING_CHARS, i - 1): - new_name = '~' + ''.join(candidate) + name[i:] - if new_name != name: - yield new_name - - # If we make it this far, we will have to make a longer name - for i in range(len(cls.LEADING_CHARS)): - for candidate in itertools.combinations_with_replacement( - cls.LEADING_CHARS, i): - new_name = '~' + ''.join(candidate) + name - if new_name != name: - yield new_name - - def create(self): - root, name = os.path.split(self.original) - for candidate in self._generate_names(name): - path = os.path.join(root, candidate) - try: - os.mkdir(path) - except OSError as ex: - # Continue if the name exists already - if ex.errno != errno.EEXIST: - raise - else: - self.path = os.path.realpath(path) - break - - if not self.path: - # Final fallback on the default behavior. - self.path = os.path.realpath( - tempfile.mkdtemp(prefix="pip-{}-".format(self.kind)) - ) - logger.debug("Created temporary directory: {}".format(self.path)) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/typing.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/typing.py deleted file mode 100644 index e085cdf..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/typing.py +++ /dev/null @@ -1,29 +0,0 @@ -"""For neatly implementing static typing in pip. - -`mypy` - the static type analysis tool we use - uses the `typing` module, which -provides core functionality fundamental to mypy's functioning. - -Generally, `typing` would be imported at runtime and used in that fashion - -it acts as a no-op at runtime and does not have any run-time overhead by -design. - -As it turns out, `typing` is not vendorable - it uses separate sources for -Python 2/Python 3. Thus, this codebase can not expect it to be present. -To work around this, mypy allows the typing import to be behind a False-y -optional to prevent it from running at runtime and type-comments can be used -to remove the need for the types to be accessible directly during runtime. - -This module provides the False-y guard in a nicely named fashion so that a -curious maintainer can reach here to read this. - -In pip, all static-typing related imports should be guarded as follows: - - from pip._internal.utils.typing import MYPY_CHECK_RUNNING - - if MYPY_CHECK_RUNNING: - from typing import ... # noqa: F401 - -Ref: https://github.com/python/mypy/issues/3216 -""" - -MYPY_CHECK_RUNNING = False diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/ui.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/ui.py deleted file mode 100644 index 433675d..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/ui.py +++ /dev/null @@ -1,441 +0,0 @@ -from __future__ import absolute_import, division - -import contextlib -import itertools -import logging -import sys -import time -from signal import SIGINT, default_int_handler, signal - -from pip._vendor import six -from pip._vendor.progress.bar import ( - Bar, ChargingBar, FillingCirclesBar, FillingSquaresBar, IncrementalBar, - ShadyBar, -) -from pip._vendor.progress.helpers import HIDE_CURSOR, SHOW_CURSOR, WritelnMixin -from pip._vendor.progress.spinner import Spinner - -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.logging import get_indentation -from pip._internal.utils.misc import format_size -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, Iterator, IO # noqa: F401 - -try: - from pip._vendor import colorama -# Lots of different errors can come from this, including SystemError and -# ImportError. -except Exception: - colorama = None - -logger = logging.getLogger(__name__) - - -def _select_progress_class(preferred, fallback): - encoding = getattr(preferred.file, "encoding", None) - - # If we don't know what encoding this file is in, then we'll just assume - # that it doesn't support unicode and use the ASCII bar. - if not encoding: - return fallback - - # Collect all of the possible characters we want to use with the preferred - # bar. - characters = [ - getattr(preferred, "empty_fill", six.text_type()), - getattr(preferred, "fill", six.text_type()), - ] - characters += list(getattr(preferred, "phases", [])) - - # Try to decode the characters we're using for the bar using the encoding - # of the given file, if this works then we'll assume that we can use the - # fancier bar and if not we'll fall back to the plaintext bar. - try: - six.text_type().join(characters).encode(encoding) - except UnicodeEncodeError: - return fallback - else: - return preferred - - -_BaseBar = _select_progress_class(IncrementalBar, Bar) # type: Any - - -class InterruptibleMixin(object): - """ - Helper to ensure that self.finish() gets called on keyboard interrupt. - - This allows downloads to be interrupted without leaving temporary state - (like hidden cursors) behind. - - This class is similar to the progress library's existing SigIntMixin - helper, but as of version 1.2, that helper has the following problems: - - 1. It calls sys.exit(). - 2. It discards the existing SIGINT handler completely. - 3. It leaves its own handler in place even after an uninterrupted finish, - which will have unexpected delayed effects if the user triggers an - unrelated keyboard interrupt some time after a progress-displaying - download has already completed, for example. - """ - - def __init__(self, *args, **kwargs): - """ - Save the original SIGINT handler for later. - """ - super(InterruptibleMixin, self).__init__(*args, **kwargs) - - self.original_handler = signal(SIGINT, self.handle_sigint) - - # If signal() returns None, the previous handler was not installed from - # Python, and we cannot restore it. This probably should not happen, - # but if it does, we must restore something sensible instead, at least. - # The least bad option should be Python's default SIGINT handler, which - # just raises KeyboardInterrupt. - if self.original_handler is None: - self.original_handler = default_int_handler - - def finish(self): - """ - Restore the original SIGINT handler after finishing. - - This should happen regardless of whether the progress display finishes - normally, or gets interrupted. - """ - super(InterruptibleMixin, self).finish() - signal(SIGINT, self.original_handler) - - def handle_sigint(self, signum, frame): - """ - Call self.finish() before delegating to the original SIGINT handler. - - This handler should only be in place while the progress display is - active. - """ - self.finish() - self.original_handler(signum, frame) - - -class SilentBar(Bar): - - def update(self): - pass - - -class BlueEmojiBar(IncrementalBar): - - suffix = "%(percent)d%%" - bar_prefix = " " - bar_suffix = " " - phases = (u"\U0001F539", u"\U0001F537", u"\U0001F535") # type: Any - - -class DownloadProgressMixin(object): - - def __init__(self, *args, **kwargs): - super(DownloadProgressMixin, self).__init__(*args, **kwargs) - self.message = (" " * (get_indentation() + 2)) + self.message - - @property - def downloaded(self): - return format_size(self.index) - - @property - def download_speed(self): - # Avoid zero division errors... - if self.avg == 0.0: - return "..." - return format_size(1 / self.avg) + "/s" - - @property - def pretty_eta(self): - if self.eta: - return "eta %s" % self.eta_td - return "" - - def iter(self, it, n=1): - for x in it: - yield x - self.next(n) - self.finish() - - -class WindowsMixin(object): - - def __init__(self, *args, **kwargs): - # The Windows terminal does not support the hide/show cursor ANSI codes - # even with colorama. So we'll ensure that hide_cursor is False on - # Windows. - # This call neds to go before the super() call, so that hide_cursor - # is set in time. The base progress bar class writes the "hide cursor" - # code to the terminal in its init, so if we don't set this soon - # enough, we get a "hide" with no corresponding "show"... - if WINDOWS and self.hide_cursor: - self.hide_cursor = False - - super(WindowsMixin, self).__init__(*args, **kwargs) - - # Check if we are running on Windows and we have the colorama module, - # if we do then wrap our file with it. - if WINDOWS and colorama: - self.file = colorama.AnsiToWin32(self.file) - # The progress code expects to be able to call self.file.isatty() - # but the colorama.AnsiToWin32() object doesn't have that, so we'll - # add it. - self.file.isatty = lambda: self.file.wrapped.isatty() - # The progress code expects to be able to call self.file.flush() - # but the colorama.AnsiToWin32() object doesn't have that, so we'll - # add it. - self.file.flush = lambda: self.file.wrapped.flush() - - -class BaseDownloadProgressBar(WindowsMixin, InterruptibleMixin, - DownloadProgressMixin): - - file = sys.stdout - message = "%(percent)d%%" - suffix = "%(downloaded)s %(download_speed)s %(pretty_eta)s" - -# NOTE: The "type: ignore" comments on the following classes are there to -# work around https://github.com/python/typing/issues/241 - - -class DefaultDownloadProgressBar(BaseDownloadProgressBar, - _BaseBar): - pass - - -class DownloadSilentBar(BaseDownloadProgressBar, SilentBar): # type: ignore - pass - - -class DownloadIncrementalBar(BaseDownloadProgressBar, # type: ignore - IncrementalBar): - pass - - -class DownloadChargingBar(BaseDownloadProgressBar, # type: ignore - ChargingBar): - pass - - -class DownloadShadyBar(BaseDownloadProgressBar, ShadyBar): # type: ignore - pass - - -class DownloadFillingSquaresBar(BaseDownloadProgressBar, # type: ignore - FillingSquaresBar): - pass - - -class DownloadFillingCirclesBar(BaseDownloadProgressBar, # type: ignore - FillingCirclesBar): - pass - - -class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar, # type: ignore - BlueEmojiBar): - pass - - -class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin, - DownloadProgressMixin, WritelnMixin, Spinner): - - file = sys.stdout - suffix = "%(downloaded)s %(download_speed)s" - - def next_phase(self): - if not hasattr(self, "_phaser"): - self._phaser = itertools.cycle(self.phases) - return next(self._phaser) - - def update(self): - message = self.message % self - phase = self.next_phase() - suffix = self.suffix % self - line = ''.join([ - message, - " " if message else "", - phase, - " " if suffix else "", - suffix, - ]) - - self.writeln(line) - - -BAR_TYPES = { - "off": (DownloadSilentBar, DownloadSilentBar), - "on": (DefaultDownloadProgressBar, DownloadProgressSpinner), - "ascii": (DownloadIncrementalBar, DownloadProgressSpinner), - "pretty": (DownloadFillingCirclesBar, DownloadProgressSpinner), - "emoji": (DownloadBlueEmojiProgressBar, DownloadProgressSpinner) -} - - -def DownloadProgressProvider(progress_bar, max=None): - if max is None or max == 0: - return BAR_TYPES[progress_bar][1]().iter - else: - return BAR_TYPES[progress_bar][0](max=max).iter - - -################################################################ -# Generic "something is happening" spinners -# -# We don't even try using progress.spinner.Spinner here because it's actually -# simpler to reimplement from scratch than to coerce their code into doing -# what we need. -################################################################ - -@contextlib.contextmanager -def hidden_cursor(file): - # type: (IO) -> Iterator[None] - # The Windows terminal does not support the hide/show cursor ANSI codes, - # even via colorama. So don't even try. - if WINDOWS: - yield - # We don't want to clutter the output with control characters if we're - # writing to a file, or if the user is running with --quiet. - # See https://github.com/pypa/pip/issues/3418 - elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: - yield - else: - file.write(HIDE_CURSOR) - try: - yield - finally: - file.write(SHOW_CURSOR) - - -class RateLimiter(object): - def __init__(self, min_update_interval_seconds): - # type: (float) -> None - self._min_update_interval_seconds = min_update_interval_seconds - self._last_update = 0 # type: float - - def ready(self): - # type: () -> bool - now = time.time() - delta = now - self._last_update - return delta >= self._min_update_interval_seconds - - def reset(self): - # type: () -> None - self._last_update = time.time() - - -class SpinnerInterface(object): - def spin(self): - # type: () -> None - raise NotImplementedError() - - def finish(self, final_status): - # type: (str) -> None - raise NotImplementedError() - - -class InteractiveSpinner(SpinnerInterface): - def __init__(self, message, file=None, spin_chars="-\\|/", - # Empirically, 8 updates/second looks nice - min_update_interval_seconds=0.125): - self._message = message - if file is None: - file = sys.stdout - self._file = file - self._rate_limiter = RateLimiter(min_update_interval_seconds) - self._finished = False - - self._spin_cycle = itertools.cycle(spin_chars) - - self._file.write(" " * get_indentation() + self._message + " ... ") - self._width = 0 - - def _write(self, status): - assert not self._finished - # Erase what we wrote before by backspacing to the beginning, writing - # spaces to overwrite the old text, and then backspacing again - backup = "\b" * self._width - self._file.write(backup + " " * self._width + backup) - # Now we have a blank slate to add our status - self._file.write(status) - self._width = len(status) - self._file.flush() - self._rate_limiter.reset() - - def spin(self): - # type: () -> None - if self._finished: - return - if not self._rate_limiter.ready(): - return - self._write(next(self._spin_cycle)) - - def finish(self, final_status): - # type: (str) -> None - if self._finished: - return - self._write(final_status) - self._file.write("\n") - self._file.flush() - self._finished = True - - -# Used for dumb terminals, non-interactive installs (no tty), etc. -# We still print updates occasionally (once every 60 seconds by default) to -# act as a keep-alive for systems like Travis-CI that take lack-of-output as -# an indication that a task has frozen. -class NonInteractiveSpinner(SpinnerInterface): - def __init__(self, message, min_update_interval_seconds=60): - # type: (str, float) -> None - self._message = message - self._finished = False - self._rate_limiter = RateLimiter(min_update_interval_seconds) - self._update("started") - - def _update(self, status): - assert not self._finished - self._rate_limiter.reset() - logger.info("%s: %s", self._message, status) - - def spin(self): - # type: () -> None - if self._finished: - return - if not self._rate_limiter.ready(): - return - self._update("still running...") - - def finish(self, final_status): - # type: (str) -> None - if self._finished: - return - self._update("finished with status '%s'" % (final_status,)) - self._finished = True - - -@contextlib.contextmanager -def open_spinner(message): - # type: (str) -> Iterator[SpinnerInterface] - # Interactive spinner goes directly to sys.stdout rather than being routed - # through the logging system, but it acts like it has level INFO, - # i.e. it's only displayed if we're at level INFO or better. - # Non-interactive spinner goes through the logging system, so it is always - # in sync with logging configuration. - if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: - spinner = InteractiveSpinner(message) # type: SpinnerInterface - else: - spinner = NonInteractiveSpinner(message) - try: - with hidden_cursor(sys.stdout): - yield spinner - except KeyboardInterrupt: - spinner.finish("canceled") - raise - except Exception: - spinner.finish("error") - raise - else: - spinner.finish("done") diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__init__.py deleted file mode 100644 index 9cba764..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__init__.py +++ /dev/null @@ -1,534 +0,0 @@ -"""Handles all VCS (version control) support""" -from __future__ import absolute_import - -import errno -import logging -import os -import shutil -import sys - -from pip._vendor.six.moves.urllib import parse as urllib_parse - -from pip._internal.exceptions import BadCommand -from pip._internal.utils.misc import ( - display_path, backup_dir, call_subprocess, rmtree, ask_path_exists, -) -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Any, Dict, Iterable, List, Mapping, Optional, Text, Tuple, Type - ) - from pip._internal.utils.ui import SpinnerInterface # noqa: F401 - - AuthInfo = Tuple[Optional[str], Optional[str]] - -__all__ = ['vcs'] - - -logger = logging.getLogger(__name__) - - -class RemoteNotFoundError(Exception): - pass - - -class RevOptions(object): - - """ - Encapsulates a VCS-specific revision to install, along with any VCS - install options. - - Instances of this class should be treated as if immutable. - """ - - def __init__(self, vcs, rev=None, extra_args=None): - # type: (VersionControl, Optional[str], Optional[List[str]]) -> None - """ - Args: - vcs: a VersionControl object. - 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.vcs = vcs - - def __repr__(self): - return '<RevOptions {}: rev={!r}>'.format(self.vcs.name, self.rev) - - @property - def arg_rev(self): - # type: () -> Optional[str] - if self.rev is None: - return self.vcs.default_arg_rev - - return self.rev - - def to_args(self): - # type: () -> List[str] - """ - Return the VCS-specific command arguments. - """ - args = [] # type: List[str] - rev = self.arg_rev - if rev is not None: - args += self.vcs.get_base_rev_args(rev) - args += self.extra_args - - return args - - def to_display(self): - # type: () -> str - if not self.rev: - return '' - - return ' (to revision {})'.format(self.rev) - - def make_new(self, rev): - # type: (str) -> RevOptions - """ - Make a copy of the current instance, but with a new rev. - - Args: - rev: the name of the revision for the new object. - """ - return self.vcs.make_rev_options(rev, extra_args=self.extra_args) - - -class VcsSupport(object): - _registry = {} # type: Dict[str, Type[VersionControl]] - schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] - - def __init__(self): - # type: () -> None - # Register more schemes with urlparse for various version control - # systems - urllib_parse.uses_netloc.extend(self.schemes) - # Python >= 2.7.4, 3.3 doesn't have uses_fragment - if getattr(urllib_parse, 'uses_fragment', None): - urllib_parse.uses_fragment.extend(self.schemes) - super(VcsSupport, self).__init__() - - def __iter__(self): - return self._registry.__iter__() - - @property - def backends(self): - # type: () -> List[Type[VersionControl]] - return list(self._registry.values()) - - @property - def dirnames(self): - # type: () -> List[str] - return [backend.dirname for backend in self.backends] - - @property - def all_schemes(self): - # type: () -> List[str] - schemes = [] # type: List[str] - for backend in self.backends: - schemes.extend(backend.schemes) - return schemes - - def register(self, cls): - # type: (Type[VersionControl]) -> None - if not hasattr(cls, 'name'): - logger.warning('Cannot register VCS %s', cls.__name__) - return - if cls.name not in self._registry: - self._registry[cls.name] = cls - logger.debug('Registered VCS backend: %s', cls.name) - - def unregister(self, cls=None, name=None): - # type: (Optional[Type[VersionControl]], Optional[str]) -> None - if name in self._registry: - del self._registry[name] - elif cls in self._registry.values(): - del self._registry[cls.name] - else: - logger.warning('Cannot unregister because no class or name given') - - def get_backend_type(self, location): - # type: (str) -> Optional[Type[VersionControl]] - """ - Return the type of the version control backend if found at given - location, e.g. vcs.get_backend_type('/path/to/vcs/checkout') - """ - for vc_type in self._registry.values(): - if vc_type.controls_location(location): - logger.debug('Determine that %s uses VCS: %s', - location, vc_type.name) - return vc_type - return None - - def get_backend(self, name): - # type: (str) -> Optional[Type[VersionControl]] - name = name.lower() - if name in self._registry: - return self._registry[name] - return None - - -vcs = VcsSupport() - - -class VersionControl(object): - name = '' - dirname = '' - repo_name = '' - # List of supported schemes for this Version Control - schemes = () # type: Tuple[str, ...] - # Iterable of environment variable names to pass to call_subprocess(). - unset_environ = () # type: Tuple[str, ...] - default_arg_rev = None # type: Optional[str] - - def __init__(self, url=None, *args, **kwargs): - self.url = url - super(VersionControl, self).__init__(*args, **kwargs) - - def get_base_rev_args(self, rev): - """ - Return the base revision arguments for a vcs command. - - Args: - rev: the name of a revision to install. Cannot be None. - """ - raise NotImplementedError - - def make_rev_options(self, rev=None, extra_args=None): - # type: (Optional[str], Optional[List[str]]) -> RevOptions - """ - Return a RevOptions object. - - Args: - rev: the name of a revision to install. - extra_args: a list of extra options. - """ - return RevOptions(self, rev, extra_args=extra_args) - - @classmethod - def _is_local_repository(cls, repo): - # type: (str) -> bool - """ - posix absolute paths start with os.path.sep, - win32 ones start with drive (like c:\\folder) - """ - drive, tail = os.path.splitdrive(repo) - return repo.startswith(os.path.sep) or bool(drive) - - def export(self, location): - """ - Export the repository at the url to the destination location - i.e. only download the files, without vcs informations - """ - raise NotImplementedError - - def get_netloc_and_auth(self, netloc, scheme): - """ - Parse the repository URL's netloc, and return the new netloc to use - along with auth information. - - Args: - netloc: the original repository URL netloc. - scheme: the repository URL's scheme without the vcs prefix. - - This is mainly for the Subversion class to override, so that auth - information can be provided via the --username and --password options - instead of through the URL. For other subclasses like Git without - such an option, auth information must stay in the URL. - - Returns: (netloc, (username, password)). - """ - return netloc, (None, None) - - def get_url_rev_and_auth(self, url): - # type: (str) -> Tuple[str, Optional[str], AuthInfo] - """ - Parse the repository URL to use, and return the URL, revision, - and auth info to use. - - Returns: (url, rev, (username, password)). - """ - scheme, netloc, path, query, frag = urllib_parse.urlsplit(url) - if '+' not in scheme: - raise ValueError( - "Sorry, {!r} is a malformed VCS url. " - "The format is <vcs>+<protocol>://<url>, " - "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp".format(url) - ) - # Remove the vcs prefix. - scheme = scheme.split('+', 1)[1] - netloc, user_pass = self.get_netloc_and_auth(netloc, scheme) - rev = None - if '@' in path: - path, rev = path.rsplit('@', 1) - url = urllib_parse.urlunsplit((scheme, netloc, path, query, '')) - return url, rev, user_pass - - def make_rev_args(self, username, password): - """ - Return the RevOptions "extra arguments" to use in obtain(). - """ - return [] - - def get_url_rev_options(self, url): - # type: (str) -> Tuple[str, RevOptions] - """ - Return the URL and RevOptions object to use in obtain() and in - some cases export(), as a tuple (url, rev_options). - """ - url, rev, user_pass = self.get_url_rev_and_auth(url) - username, password = user_pass - extra_args = self.make_rev_args(username, password) - rev_options = self.make_rev_options(rev, extra_args=extra_args) - - return url, rev_options - - def normalize_url(self, url): - # type: (str) -> str - """ - Normalize a URL for comparison by unquoting it and removing any - trailing slash. - """ - return urllib_parse.unquote(url).rstrip('/') - - def compare_urls(self, url1, url2): - # type: (str, str) -> bool - """ - Compare two repo URLs for identity, ignoring incidental differences. - """ - return (self.normalize_url(url1) == self.normalize_url(url2)) - - def fetch_new(self, dest, url, rev_options): - """ - Fetch a revision from a repository, in the case that this is the - first fetch from the repository. - - Args: - dest: the directory to fetch the repository to. - rev_options: a RevOptions object. - """ - raise NotImplementedError - - def switch(self, dest, url, rev_options): - """ - Switch the repo at ``dest`` to point to ``URL``. - - Args: - rev_options: a RevOptions object. - """ - raise NotImplementedError - - def update(self, dest, url, rev_options): - """ - Update an already-existing repo to the given ``rev_options``. - - Args: - rev_options: a RevOptions object. - """ - raise NotImplementedError - - def is_commit_id_equal(self, dest, name): - """ - Return whether the id of the current commit equals the given name. - - Args: - dest: the repository directory. - name: a string name. - """ - raise NotImplementedError - - def obtain(self, dest): - # type: (str) -> None - """ - Install or update in editable mode the package represented by this - VersionControl object. - - Args: - dest: the repository directory in which to install or update. - """ - url, rev_options = self.get_url_rev_options(self.url) - - if not os.path.exists(dest): - self.fetch_new(dest, url, rev_options) - return - - rev_display = rev_options.to_display() - if self.is_repository_directory(dest): - existing_url = self.get_remote_url(dest) - if self.compare_urls(existing_url, url): - logger.debug( - '%s in %s exists, and has correct URL (%s)', - self.repo_name.title(), - display_path(dest), - url, - ) - if not self.is_commit_id_equal(dest, rev_options.rev): - logger.info( - 'Updating %s %s%s', - display_path(dest), - self.repo_name, - rev_display, - ) - self.update(dest, url, rev_options) - else: - logger.info('Skipping because already up-to-date.') - return - - logger.warning( - '%s %s in %s exists with URL %s', - self.name, - self.repo_name, - display_path(dest), - existing_url, - ) - prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ', - ('s', 'i', 'w', 'b')) - else: - logger.warning( - 'Directory %s already exists, and is not a %s %s.', - dest, - self.name, - self.repo_name, - ) - # https://github.com/python/mypy/issues/1174 - prompt = ('(i)gnore, (w)ipe, (b)ackup ', # type: ignore - ('i', 'w', 'b')) - - logger.warning( - 'The plan is to install the %s repository %s', - self.name, - url, - ) - response = ask_path_exists('What to do? %s' % prompt[0], prompt[1]) - - if response == 'a': - sys.exit(-1) - - if response == 'w': - logger.warning('Deleting %s', display_path(dest)) - rmtree(dest) - self.fetch_new(dest, url, rev_options) - return - - if response == 'b': - dest_dir = backup_dir(dest) - logger.warning( - 'Backing up %s to %s', display_path(dest), dest_dir, - ) - shutil.move(dest, dest_dir) - self.fetch_new(dest, url, rev_options) - return - - # Do nothing if the response is "i". - if response == 's': - logger.info( - 'Switching %s %s to %s%s', - self.repo_name, - display_path(dest), - url, - rev_display, - ) - self.switch(dest, url, rev_options) - - def unpack(self, location): - # type: (str) -> None - """ - Clean up current location and download the url repository - (and vcs infos) into location - """ - if os.path.exists(location): - rmtree(location) - self.obtain(location) - - @classmethod - def get_src_requirement(cls, location, project_name): - """ - Return a string representing the requirement needed to - redownload the files currently present in location, something - like: - {repository_url}@{revision}#egg={project_name}-{version_identifier} - """ - raise NotImplementedError - - @classmethod - def get_remote_url(cls, location): - """ - Return the url used at location - - Raises RemoteNotFoundError if the repository does not have a remote - url configured. - """ - raise NotImplementedError - - @classmethod - def get_revision(cls, location): - """ - Return the current commit id of the files at the given location. - """ - raise NotImplementedError - - @classmethod - def run_command( - cls, - cmd, # type: List[str] - show_stdout=True, # type: bool - cwd=None, # type: Optional[str] - on_returncode='raise', # type: str - extra_ok_returncodes=None, # type: Optional[Iterable[int]] - command_desc=None, # type: Optional[str] - extra_environ=None, # type: Optional[Mapping[str, Any]] - spinner=None # type: Optional[SpinnerInterface] - ): - # type: (...) -> Optional[Text] - """ - Run a VCS subcommand - This is simply a wrapper around call_subprocess that adds the VCS - command name, and checks that the VCS is available - """ - cmd = [cls.name] + cmd - try: - return call_subprocess(cmd, show_stdout, cwd, - on_returncode=on_returncode, - extra_ok_returncodes=extra_ok_returncodes, - command_desc=command_desc, - extra_environ=extra_environ, - unset_environ=cls.unset_environ, - spinner=spinner) - except OSError as e: - # errno.ENOENT = no such file or directory - # In other words, the VCS executable isn't available - if e.errno == errno.ENOENT: - raise BadCommand( - 'Cannot find command %r - do you have ' - '%r installed and in your ' - 'PATH?' % (cls.name, cls.name)) - else: - raise # re-raise exception if a different error occurred - - @classmethod - def is_repository_directory(cls, path): - # type: (str) -> bool - """ - Return whether a directory path is a repository directory. - """ - logger.debug('Checking in %s for %s (%s)...', - path, cls.dirname, cls.name) - return os.path.exists(os.path.join(path, cls.dirname)) - - @classmethod - def controls_location(cls, location): - # type: (str) -> bool - """ - Check if a location is controlled by the vcs. - It is meant to be overridden to implement smarter detection - mechanisms for specific vcs. - - This can do more than is_repository_directory() alone. For example, - the Git override checks that Git is actually available. - """ - return cls.is_repository_directory(location) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 50b6a05f19eb242e6dd17a34ab1d0aff3022b22f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15543 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 PrOcc?_srbqa+&`F0(EaS diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__pycache__/bazaar.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__pycache__/bazaar.cpython-38.pyc deleted file mode 100644 index 6e8da98cbda4ead29e30428544414b2b17e83642..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3879 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__pycache__/git.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__pycache__/git.cpython-38.pyc deleted file mode 100644 index 922bd923f38300c71fd53501f8f7b703e7eebb16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9536 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__pycache__/mercurial.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__pycache__/mercurial.cpython-38.pyc deleted file mode 100644 index b8ae00cba722f3cd09f4c1aeb019d0a9c46c49af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3839 zcmbtXOLrSd74GVX)RJXcb`mEulK}yfVZ<Csz`z_B!aT@Kcnt;;AVV+c)9ETp?es%a z)w1G7X5%bakTZY5US`M7;5XEk6@Ot4hw$B!E!#?1(K=myyIx)QyZ3(g>i6sGO$*mQ zp7;JVTeqx#(#yrm#mk4d)nCzYi?h_qSil&`c4`N<c{+iEr<1yw7kFmOO>0>_s2kZ! z{j3o*vS!dU@3nL-YXvPM*VFZ^9kjEJV1rr0KJJLk6Bca!)Z#vGJh6B~w2z$Nir6^5 zDz2Q+ckTODulX;W#_BP>5j|8zIxR(*WRpUcJLqf0MZTMiCXrM^;(curmE*81!l_Jq zwr=r6P15Kfq;7p9iynz^KUSd>pHCAhGLe^NCe!P`6WQcr^u=W%53scT2O(8b<adg^ zltro?tc&R+7cU1dAL3SXG{OoPw}27@LU!PCC-Ar%)VRlMPpqKM>)gi^y7DHT4Zg-( zcsBVuZ{xWpT6}|do>)gLSckmHw~X9|e1%^%@&@E<eA~z!ex2XIx=sEHP<mB2ekEi) zl}VIpdpxR~!FZ&-I4yF~^W+-NSJlU(x5s5Usr*wxRW(RTjjJ|2%cxA^KFx@2%s;zG zX1MR*Ry8zpHe&cB+j(XIC|8MeS36SdOE{HfnlJZ<<02D7IToeJ3pu=-CX>m%;VwO7 ze-vSCU*!A4G<i6j9F*fCe`oN6p-M{8pG5JaXe88dl1%#F`QhN(gLnFq0}KzuXhfaE zFv&|H^C%s{Cd2GZ?ZM<gZ;nJ6K8%!riTA@uj?^}t+Ni^-*Om|sUYK`DWwL7nw^8{v zgc8xf?WgREw+`*Ob<F1Wo=qM)xAq+F01%tI)W^N24znIu-?x5i-LpQkcnv_+s}DYT zOdi`U$D;eQQCEsd0bSu}-DuGXckPyi8RtTkNe)vKc{eR$Bj}ni8^FWeM@i0gJ(BS_ z*%x=8*?LWli&>~jUQA2v#52Crb7dWe*0pI)XlmEE|C*fUVO(Tcl=Ge=+cd*pe!(vh z03lE0xfNvxQ{)z!S8yv@VA(C!vRziQY|DLKb<P1@955yhIlIVL=o|*cdl2T%v2|h{ zx+ObCl+5k9TLQZycH$C}$1b<ILpTCY&%{6CXJliQcVb<)4n3gl&b>L~wWl^Q3Sqlb zUAqG(Px4WBJnG(3w-f<+OUV{KST+0oyqHdSREjU{{^vl%$j_L(j^SQSH^CLBB%y0* zF&YV}-6Y>Fq=yOeRW!PeIpj*c+5$9}Or#yyOs|of6%#U+TD+WX=EoT~t5)#Tja^a3 z<1iPquVZs{6^+Gw<}%y-YX5d?S6PQuSI)6ruDAp*IVcgjf%oqaN^1|m&Y5vacH#hN zm!LcJs@rq#xHfl<%X-Ik0(x$rz*S3s?sE6Y{-SeO!<@#vMsv;`_<@zb>sn>AbobVF z?MF@dH)b7z>Z`4?b-d0!7^_bE&<c)`ztlgo{%GZ0a(!Mm#%mkn`8d_a+=ub}rSTd& zfjb__SbOB4O4qsAjiza-*{mAgDW)m!=0(|6vjm8Bmv~%^A7ktH$lhN80`hfgzKW*T z(RQIEIj(m1iX_M82{<DYl7d@z?nk=<+>Ye&8<RY=D@DY$qeQ9QVj^<w%_R6p*MEKg z6DbR++dIX5qz9PVyvwiAKJ{57$@%0r@Mhel*Dzip-=L0L)Vzr%fTv6fgdcrT*G`{n zi)Xl-q(VF5aV+1W1xp?^5vXem00tORq@~5S;4n68vNmh68*H1L2LWk6-*(|R7lLxJ z@RHY%TT_r4ulXJX*u{_=Y{j@^Y=b~FmSe_pF3p&`%TWqD50;xu)ASs0gMZI95Ew9! zb%-%maCn)5X6gHwYqASzcUg-?%)UU-q>0huyO*>eI_B<E=NP9qWNpLKnfw;0#y(=` zv1w$XLzAd;VS{Sj_~78w1@Fph*cC)-7{F7dOeXqjn5d8#Gevqiqi{)R_8c&8s^n{s z7e-&PVVe>TDvko>3y8y<o9NXdG9~N%r|C3d)#}F5%}tIvU-G~8zlm+mt+=8;l~CS} zuA@XkwWF#|zfVk`f)RiGXRz1dLepobmZM~c<UrOi$^;$M6tt2OYC;9ks&}>)nk@!D z#X3dIdr_}ydsU~!<o`<}`5``1ZC=zSFSs~WM}CCSi+bpbdW7RhjaT(BrNfz$X2yN& z@uD&-MZ~2Qv4bUN*QH2%7rjVvsGUyOp@WnLAEYFB!c><d#UZ^p7>Dm-9K1bu5OMaA z1M4|El`|f_N6p&^st>S}_R?a8Ow~lqCQFL)vHTeQl2R__EX}7|6ItwmwL+pk;yBbH z<b12zUm+_h8N<xW(m238W&SeQL^VDLr+WReDOXlp(x0$c){PV-oT^5<dh?@n79FT= zq|`JMrsmmS)Y^ce$iG>3vj}{D*BtS*P%$i`UBllik+p@Gq^c$<!-R)8eUv_=gPWSq zu5O+m_{E7ky)EsB2AeR{%`nUgK1~JWRv6Mw^uaKczrcoah(<RIjT<oQDjwr6gp!*y zN@bGlQS&2eh^O^hoI=S=puXkCZt^EIW-Rq{l730exjsfRMHit?f_eiD6$j>L`;Oo6 zTYks)!2Uk&+UZ@Fw4!&7bl9DiQ%R>L1azH>8cI-oyam@#KMz8b-n@_ll{_9~#XdA3 zQ|WCpc2-*tcrnY<BI1VM^o`4d(=tibAWKxdsFTR=^v##eS(cTiBHg?^1@*i1u~bqm zqZ{zSPfZCXiAPL=HF{}Zicz9a^uG)&?cZLQ?S1k#Q&6>RpZRtR#cBr`vST-$&V&B~ D;0VDF diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__pycache__/subversion.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__pycache__/subversion.cpython-38.pyc deleted file mode 100644 index f3a60f60c1e42683f754ed0ac02e25bc96ef0e1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6047 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/bazaar.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/bazaar.py deleted file mode 100644 index 4c6ac79..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/bazaar.py +++ /dev/null @@ -1,114 +0,0 @@ -from __future__ import absolute_import - -import logging -import os - -from pip._vendor.six.moves.urllib import parse as urllib_parse - -from pip._internal.download import path_to_url -from pip._internal.utils.misc import ( - display_path, make_vcs_requirement_url, rmtree, -) -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.vcs import VersionControl, vcs - -logger = logging.getLogger(__name__) - - -class Bazaar(VersionControl): - name = 'bzr' - dirname = '.bzr' - repo_name = 'branch' - schemes = ( - 'bzr', 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp', - 'bzr+lp', - ) - - def __init__(self, url=None, *args, **kwargs): - super(Bazaar, self).__init__(url, *args, **kwargs) - # This is only needed for python <2.7.5 - # Register lp but do not expose as a scheme to support bzr+lp. - if getattr(urllib_parse, 'uses_fragment', None): - urllib_parse.uses_fragment.extend(['lp']) - - def get_base_rev_args(self, rev): - return ['-r', rev] - - def export(self, location): - """ - Export the Bazaar repository at the url to the destination location - """ - # Remove the location to make sure Bazaar can export it correctly - if os.path.exists(location): - rmtree(location) - - with TempDirectory(kind="export") as temp_dir: - self.unpack(temp_dir.path) - - self.run_command( - ['export', location], - cwd=temp_dir.path, show_stdout=False, - ) - - def fetch_new(self, dest, url, rev_options): - rev_display = rev_options.to_display() - logger.info( - 'Checking out %s%s to %s', - url, - rev_display, - display_path(dest), - ) - cmd_args = ['branch', '-q'] + rev_options.to_args() + [url, dest] - self.run_command(cmd_args) - - def switch(self, dest, url, rev_options): - self.run_command(['switch', url], cwd=dest) - - def update(self, dest, url, rev_options): - cmd_args = ['pull', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - - def get_url_rev_and_auth(self, url): - # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it - url, rev, user_pass = super(Bazaar, self).get_url_rev_and_auth(url) - if url.startswith('ssh://'): - url = 'bzr+' + url - return url, rev, user_pass - - @classmethod - def get_remote_url(cls, location): - urls = cls.run_command(['info'], show_stdout=False, cwd=location) - for line in urls.splitlines(): - line = line.strip() - for x in ('checkout of branch: ', - 'parent branch: '): - if line.startswith(x): - repo = line.split(x)[1] - if cls._is_local_repository(repo): - return path_to_url(repo) - return repo - return None - - @classmethod - def get_revision(cls, location): - revision = cls.run_command( - ['revno'], show_stdout=False, cwd=location, - ) - return revision.splitlines()[-1] - - @classmethod - def get_src_requirement(cls, location, project_name): - repo = cls.get_remote_url(location) - if not repo: - return None - if not repo.lower().startswith('bzr:'): - repo = 'bzr+' + repo - current_rev = cls.get_revision(location) - return make_vcs_requirement_url(repo, current_rev, project_name) - - def is_commit_id_equal(self, dest, name): - """Always assume the versions don't match""" - return False - - -vcs.register(Bazaar) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/git.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/git.py deleted file mode 100644 index dd2bd61..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/git.py +++ /dev/null @@ -1,369 +0,0 @@ -from __future__ import absolute_import - -import logging -import os.path -import re - -from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.six.moves.urllib import parse as urllib_parse -from pip._vendor.six.moves.urllib import request as urllib_request - -from pip._internal.exceptions import BadCommand -from pip._internal.utils.compat import samefile -from pip._internal.utils.misc import ( - display_path, make_vcs_requirement_url, redact_password_from_url, -) -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.vcs import RemoteNotFoundError, VersionControl, vcs - -urlsplit = urllib_parse.urlsplit -urlunsplit = urllib_parse.urlunsplit - - -logger = logging.getLogger(__name__) - - -HASH_REGEX = re.compile('[a-fA-F0-9]{40}') - - -def looks_like_hash(sha): - return bool(HASH_REGEX.match(sha)) - - -class Git(VersionControl): - name = 'git' - dirname = '.git' - repo_name = 'clone' - schemes = ( - 'git', 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file', - ) - # Prevent the user's environment variables from interfering with pip: - # https://github.com/pypa/pip/issues/1130 - unset_environ = ('GIT_DIR', 'GIT_WORK_TREE') - default_arg_rev = 'HEAD' - - def __init__(self, url=None, *args, **kwargs): - - # Works around an apparent Git bug - # (see https://article.gmane.org/gmane.comp.version-control.git/146500) - if url: - scheme, netloc, path, query, fragment = urlsplit(url) - if scheme.endswith('file'): - initial_slashes = path[:-len(path.lstrip('/'))] - newpath = ( - initial_slashes + - urllib_request.url2pathname(path) - .replace('\\', '/').lstrip('/') - ) - url = urlunsplit((scheme, netloc, newpath, query, fragment)) - after_plus = scheme.find('+') + 1 - url = scheme[:after_plus] + urlunsplit( - (scheme[after_plus:], netloc, newpath, query, fragment), - ) - - super(Git, self).__init__(url, *args, **kwargs) - - def get_base_rev_args(self, rev): - return [rev] - - def get_git_version(self): - VERSION_PFX = 'git version ' - version = self.run_command(['version'], show_stdout=False) - if version.startswith(VERSION_PFX): - version = version[len(VERSION_PFX):].split()[0] - else: - version = '' - # get first 3 positions of the git version becasue - # on windows it is x.y.z.windows.t, and this parses as - # LegacyVersion which always smaller than a Version. - version = '.'.join(version.split('.')[:3]) - return parse_version(version) - - def get_current_branch(self, location): - """ - Return the current branch, or None if HEAD isn't at a branch - (e.g. detached HEAD). - """ - # git-symbolic-ref exits with empty stdout if "HEAD" is a detached - # HEAD rather than a symbolic ref. In addition, the -q causes the - # command to exit with status code 1 instead of 128 in this case - # and to suppress the message to stderr. - args = ['symbolic-ref', '-q', 'HEAD'] - output = self.run_command( - args, extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, - ) - ref = output.strip() - - if ref.startswith('refs/heads/'): - return ref[len('refs/heads/'):] - - return None - - def export(self, location): - """Export the Git repository at the url to the destination location""" - if not location.endswith('/'): - location = location + '/' - - with TempDirectory(kind="export") as temp_dir: - self.unpack(temp_dir.path) - self.run_command( - ['checkout-index', '-a', '-f', '--prefix', location], - show_stdout=False, cwd=temp_dir.path - ) - - def get_revision_sha(self, dest, rev): - """ - Return (sha_or_none, is_branch), where sha_or_none is a commit hash - if the revision names a remote branch or tag, otherwise None. - - Args: - dest: the repository directory. - rev: the revision name. - """ - # Pass rev to pre-filter the list. - output = self.run_command(['show-ref', rev], cwd=dest, - show_stdout=False, on_returncode='ignore') - refs = {} - for line in output.strip().splitlines(): - try: - sha, ref = line.split() - except ValueError: - # Include the offending line to simplify troubleshooting if - # this error ever occurs. - raise ValueError('unexpected show-ref line: {!r}'.format(line)) - - refs[ref] = sha - - branch_ref = 'refs/remotes/origin/{}'.format(rev) - tag_ref = 'refs/tags/{}'.format(rev) - - sha = refs.get(branch_ref) - if sha is not None: - return (sha, True) - - sha = refs.get(tag_ref) - - return (sha, False) - - def resolve_revision(self, dest, url, rev_options): - """ - Resolve a revision to a new RevOptions object with the SHA1 of the - branch, tag, or ref if found. - - Args: - rev_options: a RevOptions object. - """ - rev = rev_options.arg_rev - sha, is_branch = self.get_revision_sha(dest, rev) - - if sha is not None: - rev_options = rev_options.make_new(sha) - rev_options.branch_name = rev if is_branch else None - - return rev_options - - # Do not show a warning for the common case of something that has - # the form of a Git commit hash. - if not looks_like_hash(rev): - logger.warning( - "Did not find branch or tag '%s', assuming revision or ref.", - rev, - ) - - if not rev.startswith('refs/'): - return rev_options - - # If it looks like a ref, we have to fetch it explicitly. - self.run_command( - ['fetch', '-q', url] + rev_options.to_args(), - cwd=dest, - ) - # Change the revision to the SHA of the ref we fetched - sha = self.get_revision(dest, rev='FETCH_HEAD') - rev_options = rev_options.make_new(sha) - - return rev_options - - def is_commit_id_equal(self, dest, name): - """ - Return whether the current commit hash equals the given name. - - Args: - dest: the repository directory. - name: a string name. - """ - if not name: - # Then avoid an unnecessary subprocess call. - return False - - return self.get_revision(dest) == name - - def fetch_new(self, dest, url, rev_options): - rev_display = rev_options.to_display() - logger.info( - 'Cloning %s%s to %s', redact_password_from_url(url), - rev_display, display_path(dest), - ) - self.run_command(['clone', '-q', url, dest]) - - if rev_options.rev: - # Then a specific revision was requested. - rev_options = self.resolve_revision(dest, url, rev_options) - branch_name = getattr(rev_options, 'branch_name', None) - if branch_name is None: - # Only do a checkout if the current commit id doesn't match - # the requested revision. - if not self.is_commit_id_equal(dest, rev_options.rev): - cmd_args = ['checkout', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - elif self.get_current_branch(dest) != branch_name: - # Then a specific branch was requested, and that branch - # is not yet checked out. - track_branch = 'origin/{}'.format(branch_name) - cmd_args = [ - 'checkout', '-b', branch_name, '--track', track_branch, - ] - self.run_command(cmd_args, cwd=dest) - - #: repo may contain submodules - self.update_submodules(dest) - - def switch(self, dest, url, rev_options): - self.run_command(['config', 'remote.origin.url', url], cwd=dest) - cmd_args = ['checkout', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - - self.update_submodules(dest) - - def update(self, dest, url, rev_options): - # First fetch changes from the default remote - if self.get_git_version() >= parse_version('1.9.0'): - # fetch tags in addition to everything else - self.run_command(['fetch', '-q', '--tags'], cwd=dest) - else: - self.run_command(['fetch', '-q'], cwd=dest) - # Then reset to wanted revision (maybe even origin/master) - rev_options = self.resolve_revision(dest, url, rev_options) - cmd_args = ['reset', '--hard', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - #: update submodules - self.update_submodules(dest) - - @classmethod - def get_remote_url(cls, location): - """ - Return URL of the first remote encountered. - - Raises RemoteNotFoundError if the repository does not have a remote - url configured. - """ - # We need to pass 1 for extra_ok_returncodes since the command - # exits with return code 1 if there are no matching lines. - stdout = cls.run_command( - ['config', '--get-regexp', r'remote\..*\.url'], - extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, - ) - remotes = stdout.splitlines() - try: - found_remote = remotes[0] - except IndexError: - raise RemoteNotFoundError - - for remote in remotes: - if remote.startswith('remote.origin.url '): - found_remote = remote - break - url = found_remote.split(' ')[1] - return url.strip() - - @classmethod - def get_revision(cls, location, rev=None): - if rev is None: - rev = 'HEAD' - current_rev = cls.run_command( - ['rev-parse', rev], show_stdout=False, cwd=location, - ) - return current_rev.strip() - - @classmethod - def _get_subdirectory(cls, location): - """Return the relative path of setup.py to the git repo root.""" - # find the repo root - git_dir = cls.run_command(['rev-parse', '--git-dir'], - show_stdout=False, cwd=location).strip() - if not os.path.isabs(git_dir): - git_dir = os.path.join(location, git_dir) - root_dir = os.path.join(git_dir, '..') - # find setup.py - orig_location = location - while not os.path.exists(os.path.join(location, 'setup.py')): - last_location = location - location = os.path.dirname(location) - if location == last_location: - # We've traversed up to the root of the filesystem without - # finding setup.py - logger.warning( - "Could not find setup.py for directory %s (tried all " - "parent directories)", - orig_location, - ) - return None - # relative path of setup.py to repo root - if samefile(root_dir, location): - return None - return os.path.relpath(location, root_dir) - - @classmethod - def get_src_requirement(cls, location, project_name): - repo = cls.get_remote_url(location) - if not repo.lower().startswith('git:'): - repo = 'git+' + repo - current_rev = cls.get_revision(location) - subdir = cls._get_subdirectory(location) - req = make_vcs_requirement_url(repo, current_rev, project_name, - subdir=subdir) - - return req - - def get_url_rev_and_auth(self, url): - """ - Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. - That's required because although they use SSH they sometimes don't - work with a ssh:// scheme (e.g. GitHub). But we need a scheme for - parsing. Hence we remove it again afterwards and return it as a stub. - """ - if '://' not in url: - assert 'file:' not in url - url = url.replace('git+', 'git+ssh://') - url, rev, user_pass = super(Git, self).get_url_rev_and_auth(url) - url = url.replace('ssh://', '') - else: - url, rev, user_pass = super(Git, self).get_url_rev_and_auth(url) - - return url, rev, user_pass - - def update_submodules(self, location): - if not os.path.exists(os.path.join(location, '.gitmodules')): - return - self.run_command( - ['submodule', 'update', '--init', '--recursive', '-q'], - cwd=location, - ) - - @classmethod - def controls_location(cls, location): - if super(Git, cls).controls_location(location): - return True - try: - r = cls.run_command(['rev-parse'], - cwd=location, - show_stdout=False, - on_returncode='ignore') - return not r - except BadCommand: - logger.debug("could not determine if %s is under git control " - "because git is not available", location) - return False - - -vcs.register(Git) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/mercurial.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/mercurial.py deleted file mode 100644 index 26e75de..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/mercurial.py +++ /dev/null @@ -1,103 +0,0 @@ -from __future__ import absolute_import - -import logging -import os - -from pip._vendor.six.moves import configparser - -from pip._internal.download import path_to_url -from pip._internal.utils.misc import display_path, make_vcs_requirement_url -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.vcs import VersionControl, vcs - -logger = logging.getLogger(__name__) - - -class Mercurial(VersionControl): - name = 'hg' - dirname = '.hg' - repo_name = 'clone' - schemes = ('hg', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http') - - def get_base_rev_args(self, rev): - return [rev] - - def export(self, location): - """Export the Hg repository at the url to the destination location""" - with TempDirectory(kind="export") as temp_dir: - self.unpack(temp_dir.path) - - self.run_command( - ['archive', location], show_stdout=False, cwd=temp_dir.path - ) - - def fetch_new(self, dest, url, rev_options): - rev_display = rev_options.to_display() - logger.info( - 'Cloning hg %s%s to %s', - url, - rev_display, - display_path(dest), - ) - self.run_command(['clone', '--noupdate', '-q', url, dest]) - cmd_args = ['update', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - - def switch(self, dest, url, rev_options): - repo_config = os.path.join(dest, self.dirname, 'hgrc') - config = configparser.SafeConfigParser() - try: - config.read(repo_config) - config.set('paths', 'default', url) - with open(repo_config, 'w') as config_file: - config.write(config_file) - except (OSError, configparser.NoSectionError) as exc: - logger.warning( - 'Could not switch Mercurial repository to %s: %s', url, exc, - ) - else: - cmd_args = ['update', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - - def update(self, dest, url, rev_options): - self.run_command(['pull', '-q'], cwd=dest) - cmd_args = ['update', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - - @classmethod - def get_remote_url(cls, location): - url = cls.run_command( - ['showconfig', 'paths.default'], - show_stdout=False, cwd=location).strip() - if cls._is_local_repository(url): - url = path_to_url(url) - return url.strip() - - @classmethod - def get_revision(cls, location): - current_revision = cls.run_command( - ['parents', '--template={rev}'], - show_stdout=False, cwd=location).strip() - return current_revision - - @classmethod - def get_revision_hash(cls, location): - current_rev_hash = cls.run_command( - ['parents', '--template={node}'], - show_stdout=False, cwd=location).strip() - return current_rev_hash - - @classmethod - def get_src_requirement(cls, location, project_name): - repo = cls.get_remote_url(location) - if not repo.lower().startswith('hg:'): - repo = 'hg+' + repo - current_rev_hash = cls.get_revision_hash(location) - return make_vcs_requirement_url(repo, current_rev_hash, project_name) - - def is_commit_id_equal(self, dest, name): - """Always assume the versions don't match""" - return False - - -vcs.register(Mercurial) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/subversion.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/subversion.py deleted file mode 100644 index 42ac5ac..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/subversion.py +++ /dev/null @@ -1,200 +0,0 @@ -from __future__ import absolute_import - -import logging -import os -import re - -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - display_path, make_vcs_requirement_url, rmtree, split_auth_from_netloc, -) -from pip._internal.vcs import VersionControl, vcs - -_svn_xml_url_re = re.compile('url="([^"]+)"') -_svn_rev_re = re.compile(r'committed-rev="(\d+)"') -_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') -_svn_info_xml_url_re = re.compile(r'<url>(.*)</url>') - - -logger = logging.getLogger(__name__) - - -class Subversion(VersionControl): - name = 'svn' - dirname = '.svn' - repo_name = 'checkout' - schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') - - def get_base_rev_args(self, rev): - return ['-r', rev] - - def export(self, location): - """Export the svn repository at the url to the destination location""" - url, rev_options = self.get_url_rev_options(self.url) - - logger.info('Exporting svn repository %s to %s', url, location) - with indent_log(): - if os.path.exists(location): - # Subversion doesn't like to check out over an existing - # directory --force fixes this, but was only added in svn 1.5 - rmtree(location) - cmd_args = ['export'] + rev_options.to_args() + [url, location] - self.run_command(cmd_args, show_stdout=False) - - def fetch_new(self, dest, url, rev_options): - rev_display = rev_options.to_display() - logger.info( - 'Checking out %s%s to %s', - url, - rev_display, - display_path(dest), - ) - cmd_args = ['checkout', '-q'] + rev_options.to_args() + [url, dest] - self.run_command(cmd_args) - - def switch(self, dest, url, rev_options): - cmd_args = ['switch'] + rev_options.to_args() + [url, dest] - self.run_command(cmd_args) - - def update(self, dest, url, rev_options): - cmd_args = ['update'] + rev_options.to_args() + [dest] - self.run_command(cmd_args) - - @classmethod - def get_revision(cls, location): - """ - Return the maximum revision for all files under a given location - """ - # Note: taken from setuptools.command.egg_info - revision = 0 - - for base, dirs, files in os.walk(location): - if cls.dirname not in dirs: - dirs[:] = [] - continue # no sense walking uncontrolled subdirs - dirs.remove(cls.dirname) - entries_fn = os.path.join(base, cls.dirname, 'entries') - if not os.path.exists(entries_fn): - # FIXME: should we warn? - continue - - dirurl, localrev = cls._get_svn_url_rev(base) - - if base == location: - base = dirurl + '/' # save the root url - elif not dirurl or not dirurl.startswith(base): - dirs[:] = [] - continue # not part of the same svn tree, skip it - revision = max(revision, localrev) - return revision - - def get_netloc_and_auth(self, netloc, scheme): - """ - This override allows the auth information to be passed to svn via the - --username and --password options instead of via the URL. - """ - if scheme == 'ssh': - # The --username and --password options can't be used for - # svn+ssh URLs, so keep the auth information in the URL. - return super(Subversion, self).get_netloc_and_auth( - netloc, scheme) - - return split_auth_from_netloc(netloc) - - def get_url_rev_and_auth(self, url): - # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it - url, rev, user_pass = super(Subversion, self).get_url_rev_and_auth(url) - if url.startswith('ssh://'): - url = 'svn+' + url - return url, rev, user_pass - - def make_rev_args(self, username, password): - extra_args = [] - if username: - extra_args += ['--username', username] - if password: - extra_args += ['--password', password] - - return extra_args - - @classmethod - def get_remote_url(cls, location): - # In cases where the source is in a subdirectory, not alongside - # setup.py we have to look up in the location until we find a real - # setup.py - orig_location = location - while not os.path.exists(os.path.join(location, 'setup.py')): - last_location = location - location = os.path.dirname(location) - if location == last_location: - # We've traversed up to the root of the filesystem without - # finding setup.py - logger.warning( - "Could not find setup.py for directory %s (tried all " - "parent directories)", - orig_location, - ) - return None - - return cls._get_svn_url_rev(location)[0] - - @classmethod - def _get_svn_url_rev(cls, location): - from pip._internal.exceptions import InstallationError - - entries_path = os.path.join(location, cls.dirname, 'entries') - if os.path.exists(entries_path): - with open(entries_path) as f: - data = f.read() - else: # subversion >= 1.7 does not have the 'entries' file - data = '' - - if (data.startswith('8') or - data.startswith('9') or - data.startswith('10')): - data = list(map(str.splitlines, data.split('\n\x0c\n'))) - del data[0][0] # get rid of the '8' - url = data[0][3] - revs = [int(d[9]) for d in data if len(d) > 9 and d[9]] + [0] - elif data.startswith('<?xml'): - match = _svn_xml_url_re.search(data) - if not match: - raise ValueError('Badly formatted data: %r' % data) - url = match.group(1) # get repository URL - revs = [int(m.group(1)) for m in _svn_rev_re.finditer(data)] + [0] - else: - try: - # subversion >= 1.7 - xml = cls.run_command( - ['info', '--xml', location], - show_stdout=False, - ) - url = _svn_info_xml_url_re.search(xml).group(1) - revs = [ - int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml) - ] - except InstallationError: - url, revs = None, [] - - if revs: - rev = max(revs) - else: - rev = 0 - - return url, rev - - @classmethod - def get_src_requirement(cls, location, project_name): - repo = cls.get_remote_url(location) - if repo is None: - return None - repo = 'svn+' + repo - rev = cls.get_revision(location) - return make_vcs_requirement_url(repo, rev, project_name) - - def is_commit_id_equal(self, dest, name): - """Always assume the versions don't match""" - return False - - -vcs.register(Subversion) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/wheel.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/wheel.py deleted file mode 100644 index 67bcc7f..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/wheel.py +++ /dev/null @@ -1,1095 +0,0 @@ -""" -Support for installing and building the "wheel" binary package format. -""" -from __future__ import absolute_import - -import collections -import compileall -import csv -import hashlib -import logging -import os.path -import re -import shutil -import stat -import sys -import warnings -from base64 import urlsafe_b64encode -from email.parser import Parser - -from pip._vendor import pkg_resources -from pip._vendor.distlib.scripts import ScriptMaker -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.six import StringIO - -from pip._internal import pep425tags -from pip._internal.download import path_to_url, unpack_url -from pip._internal.exceptions import ( - InstallationError, InvalidWheelFilename, UnsupportedWheel, -) -from pip._internal.locations import ( - PIP_DELETE_MARKER_FILENAME, distutils_scheme, -) -from pip._internal.models.link import Link -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - call_subprocess, captured_stdout, ensure_dir, read_chunks, -) -from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.utils.ui import open_spinner - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Dict, List, Optional, Sequence, Mapping, Tuple, IO, Text, Any, - Union, Iterable - ) - from pip._vendor.packaging.requirements import Requirement # noqa: F401 - from pip._internal.req.req_install import InstallRequirement # noqa: F401 - from pip._internal.download import PipSession # noqa: F401 - from pip._internal.index import FormatControl, PackageFinder # noqa: F401 - from pip._internal.operations.prepare import ( # noqa: F401 - RequirementPreparer - ) - from pip._internal.cache import WheelCache # noqa: F401 - from pip._internal.pep425tags import Pep425Tag # noqa: F401 - - InstalledCSVRow = Tuple[str, ...] - - -VERSION_COMPATIBLE = (1, 0) - - -logger = logging.getLogger(__name__) - - -def normpath(src, p): - return os.path.relpath(src, p).replace(os.path.sep, '/') - - -def rehash(path, blocksize=1 << 20): - # type: (str, int) -> Tuple[str, str] - """Return (hash, length) for path using hashlib.sha256()""" - h = hashlib.sha256() - length = 0 - with open(path, 'rb') as f: - for block in read_chunks(f, size=blocksize): - length += len(block) - h.update(block) - digest = 'sha256=' + urlsafe_b64encode( - h.digest() - ).decode('latin1').rstrip('=') - # unicode/str python2 issues - return (digest, str(length)) # type: ignore - - -def open_for_csv(name, mode): - # type: (str, Text) -> IO - if sys.version_info[0] < 3: - nl = {} # type: Dict[str, Any] - bin = 'b' - else: - nl = {'newline': ''} # type: Dict[str, Any] - bin = '' - return open(name, mode + bin, **nl) - - -def replace_python_tag(wheelname, new_tag): - # type: (str, str) -> str - """Replace the Python tag in a wheel file name with a new value. - """ - parts = wheelname.split('-') - parts[-3] = new_tag - return '-'.join(parts) - - -def fix_script(path): - # type: (str) -> Optional[bool] - """Replace #!python with #!/path/to/python - Return True if file was changed.""" - # XXX RECORD hashes will need to be updated - if os.path.isfile(path): - with open(path, 'rb') as script: - firstline = script.readline() - if not firstline.startswith(b'#!python'): - return False - exename = sys.executable.encode(sys.getfilesystemencoding()) - firstline = b'#!' + exename + os.linesep.encode("ascii") - rest = script.read() - with open(path, 'wb') as script: - script.write(firstline) - script.write(rest) - return True - return None - - -dist_info_re = re.compile(r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>.+?))?) - \.dist-info$""", re.VERBOSE) - - -def root_is_purelib(name, wheeldir): - # type: (str, str) -> bool - """ - Return True if the extracted wheel in wheeldir should go into purelib. - """ - name_folded = name.replace("-", "_") - for item in os.listdir(wheeldir): - match = dist_info_re.match(item) - if match and match.group('name') == name_folded: - with open(os.path.join(wheeldir, item, 'WHEEL')) as wheel: - for line in wheel: - line = line.lower().rstrip() - if line == "root-is-purelib: true": - return True - return False - - -def get_entrypoints(filename): - # type: (str) -> Tuple[Dict[str, str], Dict[str, str]] - if not os.path.exists(filename): - return {}, {} - - # This is done because you can pass a string to entry_points wrappers which - # means that they may or may not be valid INI files. The attempt here is to - # strip leading and trailing whitespace in order to make them valid INI - # files. - with open(filename) as fp: - data = StringIO() - for line in fp: - data.write(line.strip()) - data.write("\n") - data.seek(0) - - # get the entry points and then the script names - entry_points = pkg_resources.EntryPoint.parse_map(data) - console = entry_points.get('console_scripts', {}) - gui = entry_points.get('gui_scripts', {}) - - def _split_ep(s): - """get the string representation of EntryPoint, remove space and split - on '='""" - return str(s).replace(" ", "").split("=") - - # convert the EntryPoint objects into strings with module:function - console = dict(_split_ep(v) for v in console.values()) - gui = dict(_split_ep(v) for v in gui.values()) - return console, gui - - -def message_about_scripts_not_on_PATH(scripts): - # type: (Sequence[str]) -> Optional[str] - """Determine if any scripts are not on PATH and format a warning. - - Returns a warning message if one or more scripts are not on PATH, - otherwise None. - """ - if not scripts: - return None - - # Group scripts by the path they were installed in - grouped_by_dir = collections.defaultdict(set) # type: Dict[str, set] - for destfile in scripts: - parent_dir = os.path.dirname(destfile) - script_name = os.path.basename(destfile) - grouped_by_dir[parent_dir].add(script_name) - - # We don't want to warn for directories that are on PATH. - not_warn_dirs = [ - os.path.normcase(i).rstrip(os.sep) for i in - os.environ.get("PATH", "").split(os.pathsep) - ] - # If an executable sits with sys.executable, we don't warn for it. - # This covers the case of venv invocations without activating the venv. - not_warn_dirs.append(os.path.normcase(os.path.dirname(sys.executable))) - warn_for = { - parent_dir: scripts for parent_dir, scripts in grouped_by_dir.items() - if os.path.normcase(parent_dir) not in not_warn_dirs - } - if not warn_for: - return None - - # Format a message - msg_lines = [] - for parent_dir, scripts in warn_for.items(): - scripts = sorted(scripts) - if len(scripts) == 1: - start_text = "script {} is".format(scripts[0]) - else: - start_text = "scripts {} are".format( - ", ".join(scripts[:-1]) + " and " + scripts[-1] - ) - - msg_lines.append( - "The {} installed in '{}' which is not on PATH." - .format(start_text, parent_dir) - ) - - last_line_fmt = ( - "Consider adding {} to PATH or, if you prefer " - "to suppress this warning, use --no-warn-script-location." - ) - if len(msg_lines) == 1: - msg_lines.append(last_line_fmt.format("this directory")) - else: - msg_lines.append(last_line_fmt.format("these directories")) - - # Returns the formatted multiline message - return "\n".join(msg_lines) - - -def sorted_outrows(outrows): - # type: (Iterable[InstalledCSVRow]) -> List[InstalledCSVRow] - """ - Return the given rows of a RECORD file in sorted order. - - Each row is a 3-tuple (path, hash, size) and corresponds to a record of - a RECORD file (see PEP 376 and PEP 427 for details). For the rows - passed to this function, the size can be an integer as an int or string, - or the empty string. - """ - # Normally, there should only be one row per path, in which case the - # second and third elements don't come into play when sorting. - # However, in cases in the wild where a path might happen to occur twice, - # we don't want the sort operation to trigger an error (but still want - # determinism). Since the third element can be an int or string, we - # coerce each element to a string to avoid a TypeError in this case. - # For additional background, see-- - # https://github.com/pypa/pip/issues/5868 - return sorted(outrows, key=lambda row: tuple(str(x) for x in row)) - - -def get_csv_rows_for_installed( - old_csv_rows, # type: Iterable[List[str]] - installed, # type: Dict[str, str] - changed, # type: set - generated, # type: List[str] - lib_dir, # type: str -): - # type: (...) -> List[InstalledCSVRow] - """ - :param installed: A map from archive RECORD path to installation RECORD - path. - """ - installed_rows = [] # type: List[InstalledCSVRow] - for row in old_csv_rows: - if len(row) > 3: - logger.warning( - 'RECORD line has more than three elements: {}'.format(row) - ) - # Make a copy because we are mutating the row. - row = list(row) - old_path = row[0] - new_path = installed.pop(old_path, old_path) - row[0] = new_path - if new_path in changed: - digest, length = rehash(new_path) - row[1] = digest - row[2] = length - installed_rows.append(tuple(row)) - for f in generated: - digest, length = rehash(f) - installed_rows.append((normpath(f, lib_dir), digest, str(length))) - for f in installed: - installed_rows.append((installed[f], '', '')) - return installed_rows - - -def move_wheel_files( - name, # type: str - req, # type: Requirement - wheeldir, # type: str - user=False, # type: bool - home=None, # type: Optional[str] - root=None, # type: Optional[str] - pycompile=True, # type: bool - scheme=None, # type: Optional[Mapping[str, str]] - isolated=False, # type: bool - prefix=None, # type: Optional[str] - warn_script_location=True # type: bool -): - # type: (...) -> None - """Install a wheel""" - # TODO: Investigate and break this up. - # TODO: Look into moving this into a dedicated class for representing an - # installation. - - if not scheme: - scheme = distutils_scheme( - name, user=user, home=home, root=root, isolated=isolated, - prefix=prefix, - ) - - if root_is_purelib(name, wheeldir): - lib_dir = scheme['purelib'] - else: - lib_dir = scheme['platlib'] - - info_dir = [] # type: List[str] - data_dirs = [] - source = wheeldir.rstrip(os.path.sep) + os.path.sep - - # Record details of the files moved - # installed = files copied from the wheel to the destination - # changed = files changed while installing (scripts #! line typically) - # generated = files newly generated during the install (script wrappers) - installed = {} # type: Dict[str, str] - changed = set() - generated = [] # type: List[str] - - # Compile all of the pyc files that we're going to be installing - if pycompile: - with captured_stdout() as stdout: - with warnings.catch_warnings(): - warnings.filterwarnings('ignore') - compileall.compile_dir(source, force=True, quiet=True) - logger.debug(stdout.getvalue()) - - def record_installed(srcfile, destfile, modified=False): - """Map archive RECORD paths to installation RECORD paths.""" - oldpath = normpath(srcfile, wheeldir) - newpath = normpath(destfile, lib_dir) - installed[oldpath] = newpath - if modified: - changed.add(destfile) - - def clobber(source, dest, is_base, fixer=None, filter=None): - ensure_dir(dest) # common for the 'include' path - - for dir, subdirs, files in os.walk(source): - basedir = dir[len(source):].lstrip(os.path.sep) - destdir = os.path.join(dest, basedir) - if is_base and basedir.split(os.path.sep, 1)[0].endswith('.data'): - continue - for s in subdirs: - destsubdir = os.path.join(dest, basedir, s) - if is_base and basedir == '' and destsubdir.endswith('.data'): - data_dirs.append(s) - continue - elif (is_base and - s.endswith('.dist-info') and - canonicalize_name(s).startswith( - canonicalize_name(req.name))): - assert not info_dir, ('Multiple .dist-info directories: ' + - destsubdir + ', ' + - ', '.join(info_dir)) - info_dir.append(destsubdir) - for f in files: - # Skip unwanted files - if filter and filter(f): - continue - srcfile = os.path.join(dir, f) - destfile = os.path.join(dest, basedir, f) - # directory creation is lazy and after the file filtering above - # to ensure we don't install empty dirs; empty dirs can't be - # uninstalled. - ensure_dir(destdir) - - # copyfile (called below) truncates the destination if it - # exists and then writes the new contents. This is fine in most - # cases, but can cause a segfault if pip has loaded a shared - # object (e.g. from pyopenssl through its vendored urllib3) - # Since the shared object is mmap'd an attempt to call a - # symbol in it will then cause a segfault. Unlinking the file - # allows writing of new contents while allowing the process to - # continue to use the old copy. - if os.path.exists(destfile): - os.unlink(destfile) - - # We use copyfile (not move, copy, or copy2) to be extra sure - # that we are not moving directories over (copyfile fails for - # directories) as well as to ensure that we are not copying - # over any metadata because we want more control over what - # metadata we actually copy over. - shutil.copyfile(srcfile, destfile) - - # Copy over the metadata for the file, currently this only - # includes the atime and mtime. - st = os.stat(srcfile) - if hasattr(os, "utime"): - os.utime(destfile, (st.st_atime, st.st_mtime)) - - # If our file is executable, then make our destination file - # executable. - if os.access(srcfile, os.X_OK): - st = os.stat(srcfile) - permissions = ( - st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH - ) - os.chmod(destfile, permissions) - - changed = False - if fixer: - changed = fixer(destfile) - record_installed(srcfile, destfile, changed) - - clobber(source, lib_dir, True) - - assert info_dir, "%s .dist-info directory not found" % req - - # Get the defined entry points - ep_file = os.path.join(info_dir[0], 'entry_points.txt') - console, gui = get_entrypoints(ep_file) - - def is_entrypoint_wrapper(name): - # EP, EP.exe and EP-script.py are scripts generated for - # entry point EP by setuptools - if name.lower().endswith('.exe'): - matchname = name[:-4] - elif name.lower().endswith('-script.py'): - matchname = name[:-10] - elif name.lower().endswith(".pya"): - matchname = name[:-4] - else: - matchname = name - # Ignore setuptools-generated scripts - return (matchname in console or matchname in gui) - - for datadir in data_dirs: - fixer = None - filter = None - for subdir in os.listdir(os.path.join(wheeldir, datadir)): - fixer = None - if subdir == 'scripts': - fixer = fix_script - filter = is_entrypoint_wrapper - source = os.path.join(wheeldir, datadir, subdir) - dest = scheme[subdir] - clobber(source, dest, False, fixer=fixer, filter=filter) - - maker = ScriptMaker(None, scheme['scripts']) - - # Ensure old scripts are overwritten. - # See https://github.com/pypa/pip/issues/1800 - maker.clobber = True - - # Ensure we don't generate any variants for scripts because this is almost - # never what somebody wants. - # See https://bitbucket.org/pypa/distlib/issue/35/ - maker.variants = {''} - - # This is required because otherwise distlib creates scripts that are not - # executable. - # See https://bitbucket.org/pypa/distlib/issue/32/ - maker.set_mode = True - - # Simplify the script and fix the fact that the default script swallows - # every single stack trace. - # See https://bitbucket.org/pypa/distlib/issue/34/ - # See https://bitbucket.org/pypa/distlib/issue/33/ - def _get_script_text(entry): - if entry.suffix is None: - raise InstallationError( - "Invalid script entry point: %s for req: %s - A callable " - "suffix is required. Cf https://packaging.python.org/en/" - "latest/distributing.html#console-scripts for more " - "information." % (entry, req) - ) - return maker.script_template % { - "module": entry.prefix, - "import_name": entry.suffix.split(".")[0], - "func": entry.suffix, - } - # ignore type, because mypy disallows assigning to a method, - # see https://github.com/python/mypy/issues/2427 - maker._get_script_text = _get_script_text # type: ignore - maker.script_template = r"""# -*- coding: utf-8 -*- -import re -import sys - -from %(module)s import %(import_name)s - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(%(func)s()) -""" - - # Special case pip and setuptools to generate versioned wrappers - # - # The issue is that some projects (specifically, pip and setuptools) use - # code in setup.py to create "versioned" entry points - pip2.7 on Python - # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into - # 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 - # 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 - # 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. - # - # 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 - # variable which will control which version scripts get installed. - # - # ENSUREPIP_OPTIONS=altinstall - # - Only pipX.Y and easy_install-X.Y will be generated and installed - # ENSUREPIP_OPTIONS=install - # - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note - # that this option is technically if ENSUREPIP_OPTIONS is set and is - # not altinstall - # DEFAULT - # - The default behavior is to install pip, pipX, pipX.Y, easy_install - # and easy_install-X.Y. - pip_script = console.pop('pip', None) - if pip_script: - if "ENSUREPIP_OPTIONS" not in os.environ: - spec = 'pip = ' + pip_script - generated.extend(maker.make(spec)) - - if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall": - spec = 'pip%s = %s' % (sys.version[:1], pip_script) - generated.extend(maker.make(spec)) - - spec = 'pip%s = %s' % (sys.version[:3], pip_script) - generated.extend(maker.make(spec)) - # Delete any other versioned pip entry points - pip_ep = [k for k in console if re.match(r'pip(\d(\.\d)?)?$', k)] - for k in pip_ep: - del console[k] - easy_install_script = console.pop('easy_install', None) - if easy_install_script: - if "ENSUREPIP_OPTIONS" not in os.environ: - spec = 'easy_install = ' + easy_install_script - generated.extend(maker.make(spec)) - - spec = 'easy_install-%s = %s' % (sys.version[:3], easy_install_script) - generated.extend(maker.make(spec)) - # Delete any other versioned easy_install entry points - easy_install_ep = [ - k for k in console if re.match(r'easy_install(-\d\.\d)?$', k) - ] - for k in easy_install_ep: - del console[k] - - # Generate the console and GUI entry points specified in the wheel - if len(console) > 0: - generated_console_scripts = maker.make_multiple( - ['%s = %s' % kv for kv in console.items()] - ) - generated.extend(generated_console_scripts) - - if warn_script_location: - msg = message_about_scripts_not_on_PATH(generated_console_scripts) - if msg is not None: - logger.warning(msg) - - if len(gui) > 0: - generated.extend( - maker.make_multiple( - ['%s = %s' % kv for kv in gui.items()], - {'gui': True} - ) - ) - - # Record pip as the installer - installer = os.path.join(info_dir[0], 'INSTALLER') - temp_installer = os.path.join(info_dir[0], 'INSTALLER.pip') - with open(temp_installer, 'wb') as installer_file: - installer_file.write(b'pip\n') - shutil.move(temp_installer, installer) - generated.append(installer) - - # Record details of all files installed - record = os.path.join(info_dir[0], 'RECORD') - temp_record = os.path.join(info_dir[0], 'RECORD.pip') - with open_for_csv(record, 'r') as record_in: - with open_for_csv(temp_record, 'w+') as record_out: - reader = csv.reader(record_in) - outrows = get_csv_rows_for_installed( - reader, installed=installed, changed=changed, - generated=generated, lib_dir=lib_dir, - ) - writer = csv.writer(record_out) - # Sort to simplify testing. - for row in sorted_outrows(outrows): - writer.writerow(row) - shutil.move(temp_record, record) - - -def wheel_version(source_dir): - # type: (Optional[str]) -> Optional[Tuple[int, ...]] - """ - Return the Wheel-Version of an extracted wheel, if possible. - - Otherwise, return None if we couldn't parse / extract it. - """ - try: - dist = [d for d in pkg_resources.find_on_path(None, source_dir)][0] - - wheel_data = dist.get_metadata('WHEEL') - wheel_data = Parser().parsestr(wheel_data) - - version = wheel_data['Wheel-Version'].strip() - version = tuple(map(int, version.split('.'))) - return version - except Exception: - return None - - -def check_compatibility(version, name): - # type: (Optional[Tuple[int, ...]], str) -> None - """ - Raises errors or warns if called with an incompatible Wheel-Version. - - Pip should refuse to install a Wheel-Version that's a major series - ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when - installing a version only minor version ahead (e.g 1.2 > 1.1). - - version: a 2-tuple representing a Wheel-Version (Major, Minor) - name: name of wheel or package to raise exception about - - :raises UnsupportedWheel: when an incompatible Wheel-Version is given - """ - if not version: - raise UnsupportedWheel( - "%s is in an unsupported or invalid wheel" % name - ) - if version[0] > VERSION_COMPATIBLE[0]: - raise UnsupportedWheel( - "%s's Wheel-Version (%s) is not compatible with this version " - "of pip" % (name, '.'.join(map(str, version))) - ) - elif version > VERSION_COMPATIBLE: - logger.warning( - 'Installing from a newer Wheel-Version (%s)', - '.'.join(map(str, version)), - ) - - -class Wheel(object): - """A wheel file""" - - # TODO: Maybe move the class into the models sub-package - # TODO: Maybe move the install code into this class - - wheel_file_re = re.compile( - r"""^(?P<namever>(?P<name>.+?)-(?P<ver>.*?)) - ((-(?P<build>\d[^-]*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?) - \.whl|\.dist-info)$""", - re.VERBOSE - ) - - def __init__(self, filename): - # type: (str) -> None - """ - :raises InvalidWheelFilename: when the filename is invalid for a wheel - """ - wheel_info = self.wheel_file_re.match(filename) - if not wheel_info: - raise InvalidWheelFilename( - "%s is not a valid wheel filename." % filename - ) - self.filename = filename - self.name = wheel_info.group('name').replace('_', '-') - # we'll assume "_" means "-" due to wheel naming scheme - # (https://github.com/pypa/pip/issues/1150) - self.version = wheel_info.group('ver').replace('_', '-') - self.build_tag = wheel_info.group('build') - self.pyversions = wheel_info.group('pyver').split('.') - self.abis = wheel_info.group('abi').split('.') - self.plats = wheel_info.group('plat').split('.') - - # All the tag combinations from this file - self.file_tags = { - (x, y, z) for x in self.pyversions - for y in self.abis for z in self.plats - } - - def support_index_min(self, tags=None): - # type: (Optional[List[Pep425Tag]]) -> Optional[int] - """ - Return the lowest index that one of the wheel's file_tag combinations - achieves in the supported_tags list e.g. if there are 8 supported tags, - and one of the file tags is first in the list, then return 0. Returns - None is the wheel is not supported. - """ - if tags is None: # for mock - tags = pep425tags.get_supported() - indexes = [tags.index(c) for c in self.file_tags if c in tags] - return min(indexes) if indexes else None - - def supported(self, tags=None): - # type: (Optional[List[Pep425Tag]]) -> bool - """Is this wheel supported on this system?""" - if tags is None: # for mock - tags = pep425tags.get_supported() - return bool(set(tags).intersection(self.file_tags)) - - -def _contains_egg_info( - s, _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)): - """Determine whether the string looks like an egg_info. - - :param s: The string to parse. E.g. foo-2.1 - """ - return bool(_egg_info_re.search(s)) - - -def should_use_ephemeral_cache( - req, # type: InstallRequirement - format_control, # type: FormatControl - autobuilding, # type: bool - cache_available # type: bool -): - # type: (...) -> Optional[bool] - """ - Return whether to build an InstallRequirement object using the - ephemeral cache. - - :param cache_available: whether a cache directory is available for the - autobuilding=True case. - - :return: True or False to build the requirement with ephem_cache=True - or False, respectively; or None not to build the requirement. - """ - if req.constraint: - return None - if req.is_wheel: - if not autobuilding: - logger.info( - 'Skipping %s, due to already being wheel.', req.name, - ) - return None - if not autobuilding: - return False - - if req.editable or not req.source_dir: - return None - - if req.link and not req.link.is_artifact: - # VCS checkout. Build wheel just for this run. - return True - - if "binary" not in format_control.get_allowed_formats( - canonicalize_name(req.name)): - logger.info( - "Skipping bdist_wheel for %s, due to binaries " - "being disabled for it.", req.name, - ) - return None - - link = req.link - base, ext = link.splitext() - if cache_available and _contains_egg_info(base): - return False - - # Otherwise, build the wheel just for this run using the ephemeral - # cache since we are either in the case of e.g. a local directory, or - # no cache directory is available to use. - return True - - -def format_command( - command_args, # type: List[str] - command_output, # type: str -): - # type: (...) -> str - """ - Format command information for logging. - """ - text = 'Command arguments: {}\n'.format(command_args) - - if not command_output: - text += 'Command output: None' - elif logger.getEffectiveLevel() > logging.DEBUG: - text += 'Command output: [use --verbose to show]' - else: - if not command_output.endswith('\n'): - command_output += '\n' - text += ( - 'Command output:\n{}' - '-----------------------------------------' - ).format(command_output) - - return text - - -def get_legacy_build_wheel_path( - names, # type: List[str] - temp_dir, # type: str - req, # type: InstallRequirement - command_args, # type: List[str] - command_output, # type: str -): - # type: (...) -> Optional[str] - """ - Return the path to the wheel in the temporary build directory. - """ - # Sort for determinism. - names = sorted(names) - if not names: - msg = ( - 'Legacy build of wheel for {!r} created no files.\n' - ).format(req.name) - msg += format_command(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(req.name, names) - msg += format_command(command_args, command_output) - logger.warning(msg) - - return os.path.join(temp_dir, names[0]) - - -class WheelBuilder(object): - """Build wheels from a RequirementSet.""" - - def __init__( - self, - finder, # type: PackageFinder - preparer, # type: RequirementPreparer - wheel_cache, # type: WheelCache - build_options=None, # type: Optional[List[str]] - global_options=None, # type: Optional[List[str]] - no_clean=False # type: bool - ): - # type: (...) -> None - self.finder = finder - self.preparer = preparer - self.wheel_cache = wheel_cache - - self._wheel_dir = preparer.wheel_download_dir - - self.build_options = build_options or [] - self.global_options = global_options or [] - self.no_clean = no_clean - - def _build_one(self, req, output_dir, python_tag=None): - """Build one wheel. - - :return: The filename of the built wheel, or None if the build failed. - """ - # Install build deps into temporary directory (PEP 518) - with req.build_env: - return self._build_one_inside_env(req, output_dir, - python_tag=python_tag) - - def _build_one_inside_env(self, req, output_dir, python_tag=None): - with TempDirectory(kind="wheel") as temp_dir: - if req.use_pep517: - builder = self._build_one_pep517 - else: - builder = self._build_one_legacy - wheel_path = builder(req, temp_dir.path, python_tag=python_tag) - if wheel_path is not None: - wheel_name = os.path.basename(wheel_path) - dest_path = os.path.join(output_dir, wheel_name) - try: - shutil.move(wheel_path, dest_path) - logger.info('Stored in directory: %s', output_dir) - return dest_path - except Exception: - pass - # Ignore return, we can't do anything else useful. - self._clean_one(req) - return None - - def _base_setup_args(self, req): - # NOTE: Eventually, we'd want to also -S to the flags here, when we're - # isolating. Currently, it breaks Python in virtualenvs, because it - # relies on site.py to find parts of the standard library outside the - # virtualenv. - return [ - sys.executable, '-u', '-c', - SETUPTOOLS_SHIM % req.setup_py - ] + list(self.global_options) - - def _build_one_pep517(self, req, tempd, python_tag=None): - """Build one InstallRequirement using the PEP 517 build process. - - Returns path to wheel if successfully built. Otherwise, returns None. - """ - assert req.metadata_directory is not None - try: - req.spin_message = 'Building wheel for %s (PEP 517)' % (req.name,) - logger.debug('Destination directory: %s', tempd) - wheel_name = req.pep517_backend.build_wheel( - tempd, - metadata_directory=req.metadata_directory - ) - if python_tag: - # General PEP 517 backends don't necessarily support - # a "--python-tag" option, so we rename the wheel - # file directly. - new_name = replace_python_tag(wheel_name, python_tag) - os.rename( - os.path.join(tempd, wheel_name), - os.path.join(tempd, new_name) - ) - # Reassign to simplify the return at the end of function - wheel_name = new_name - except Exception: - logger.error('Failed building wheel for %s', req.name) - return None - return os.path.join(tempd, wheel_name) - - def _build_one_legacy(self, req, tempd, python_tag=None): - """Build one InstallRequirement using the "legacy" build process. - - Returns path to wheel if successfully built. Otherwise, returns None. - """ - base_args = self._base_setup_args(req) - - spin_message = 'Building wheel for %s (setup.py)' % (req.name,) - with open_spinner(spin_message) as spinner: - logger.debug('Destination directory: %s', tempd) - wheel_args = base_args + ['bdist_wheel', '-d', tempd] \ - + self.build_options - - if python_tag is not None: - wheel_args += ["--python-tag", python_tag] - - try: - output = call_subprocess(wheel_args, cwd=req.setup_py_dir, - show_stdout=False, spinner=spinner) - except Exception: - spinner.finish("error") - logger.error('Failed building wheel for %s', req.name) - return None - names = os.listdir(tempd) - wheel_path = get_legacy_build_wheel_path( - names=names, - temp_dir=tempd, - req=req, - command_args=wheel_args, - command_output=output, - ) - return wheel_path - - def _clean_one(self, req): - base_args = self._base_setup_args(req) - - logger.info('Running setup.py clean for %s', req.name) - clean_args = base_args + ['clean', '--all'] - try: - call_subprocess(clean_args, cwd=req.source_dir, show_stdout=False) - return True - except Exception: - logger.error('Failed cleaning build dir for %s', req.name) - return False - - def build( - self, - requirements, # type: Iterable[InstallRequirement] - session, # type: PipSession - autobuilding=False # type: bool - ): - # type: (...) -> List[InstallRequirement] - """Build wheels. - - :param unpack: If True, replace the sdist we built from with the - newly built wheel, in preparation for installation. - :return: True if all the wheels built correctly. - """ - buildset = [] - format_control = self.finder.format_control - # Whether a cache directory is available for autobuilding=True. - cache_available = bool(self._wheel_dir or self.wheel_cache.cache_dir) - - for req in requirements: - ephem_cache = should_use_ephemeral_cache( - req, format_control=format_control, autobuilding=autobuilding, - cache_available=cache_available, - ) - if ephem_cache is None: - continue - - buildset.append((req, ephem_cache)) - - if not buildset: - return [] - - # Is any wheel build not using the ephemeral cache? - if any(not ephem_cache for _, ephem_cache in buildset): - have_directory_for_build = self._wheel_dir or ( - autobuilding and self.wheel_cache.cache_dir - ) - assert have_directory_for_build - - # TODO by @pradyunsg - # Should break up this method into 2 separate methods. - - # Build the wheels. - logger.info( - 'Building wheels for collected packages: %s', - ', '.join([req.name for (req, _) in buildset]), - ) - _cache = self.wheel_cache # shorter name - with indent_log(): - build_success, build_failure = [], [] - for req, ephem in buildset: - python_tag = None - if autobuilding: - python_tag = pep425tags.implementation_tag - if ephem: - output_dir = _cache.get_ephem_path_for_link(req.link) - else: - output_dir = _cache.get_path_for_link(req.link) - try: - ensure_dir(output_dir) - except OSError as e: - logger.warning("Building wheel for %s failed: %s", - req.name, e) - build_failure.append(req) - continue - else: - output_dir = self._wheel_dir - wheel_file = self._build_one( - req, output_dir, - python_tag=python_tag, - ) - if wheel_file: - build_success.append(req) - if autobuilding: - # XXX: This is mildly duplicative with prepare_files, - # but not close enough to pull out to a single common - # method. - # The code below assumes temporary source dirs - - # prevent it doing bad things. - if req.source_dir and not os.path.exists(os.path.join( - req.source_dir, PIP_DELETE_MARKER_FILENAME)): - raise AssertionError( - "bad source dir - missing marker") - # Delete the source we built the wheel from - req.remove_temporary_source() - # set the build directory again - name is known from - # the work prepare_files did. - req.source_dir = req.build_location( - self.preparer.build_dir - ) - # Update the link for this. - req.link = Link(path_to_url(wheel_file)) - assert req.link.is_wheel - # extract the wheel into the dir - unpack_url( - req.link, req.source_dir, None, False, - session=session, - ) - else: - build_failure.append(req) - - # notify success/failure - if build_success: - logger.info( - 'Successfully built %s', - ' '.join([req.name for req in build_success]), - ) - if build_failure: - logger.info( - 'Failed to build %s', - ' '.join([req.name for req in build_failure]), - ) - # Return a list of requirements that failed to build - return build_failure diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__init__.py deleted file mode 100644 index b919b54..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__init__.py +++ /dev/null @@ -1,111 +0,0 @@ -""" -pip._vendor is for vendoring dependencies of pip to prevent needing pip to -depend on something external. - -Files inside of pip._vendor should be considered immutable and should only be -updated to versions from upstream. -""" -from __future__ import absolute_import - -import glob -import os.path -import sys - -# Downstream redistributors which have debundled our dependencies should also -# patch this value to be true. This will trigger the additional patching -# to cause things like "six" to be available as pip. -DEBUNDLED = False - -# By default, look in this directory for a bunch of .whl files which we will -# add to the beginning of sys.path before attempting to import anything. This -# is done to support downstream re-distributors like Debian and Fedora who -# wish to create their own Wheels for our dependencies to aid in debundling. -WHEEL_DIR = os.path.abspath(os.path.dirname(__file__)) - - -# Define a small helper function to alias our vendored modules to the real ones -# if the vendored ones do not exist. This idea of this was taken from -# https://github.com/kennethreitz/requests/pull/2567. -def vendored(modulename): - vendored_name = "{0}.{1}".format(__name__, modulename) - - try: - __import__(vendored_name, globals(), locals(), level=0) - except ImportError: - try: - __import__(modulename, globals(), locals(), level=0) - except ImportError: - # We can just silently allow import failures to pass here. If we - # got to this point it means that ``import pip._vendor.whatever`` - # failed and so did ``import whatever``. Since we're importing this - # upfront in an attempt to alias imports, not erroring here will - # just mean we get a regular import error whenever pip *actually* - # tries to import one of these modules to use it, which actually - # gives us a better error message than we would have otherwise - # gotten. - pass - else: - sys.modules[vendored_name] = sys.modules[modulename] - base, head = vendored_name.rsplit(".", 1) - setattr(sys.modules[base], head, sys.modules[modulename]) - - -# If we're operating in a debundled setup, then we want to go ahead and trigger -# the aliasing of our vendored libraries as well as looking for wheels to add -# to our sys.path. This will cause all of this code to be a no-op typically -# however downstream redistributors can enable it in a consistent way across -# all platforms. -if DEBUNDLED: - # Actually look inside of WHEEL_DIR to find .whl files and add them to the - # front of our sys.path. - sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path - - # Actually alias all of our vendored dependencies. - vendored("cachecontrol") - vendored("colorama") - vendored("distlib") - vendored("distro") - vendored("html5lib") - vendored("lockfile") - vendored("six") - vendored("six.moves") - vendored("six.moves.urllib") - vendored("six.moves.urllib.parse") - vendored("packaging") - vendored("packaging.version") - vendored("packaging.specifiers") - vendored("pep517") - vendored("pkg_resources") - vendored("progress") - vendored("pytoml") - vendored("retrying") - vendored("requests") - vendored("requests.packages") - vendored("requests.packages.urllib3") - vendored("requests.packages.urllib3._collections") - vendored("requests.packages.urllib3.connection") - vendored("requests.packages.urllib3.connectionpool") - vendored("requests.packages.urllib3.contrib") - vendored("requests.packages.urllib3.contrib.ntlmpool") - vendored("requests.packages.urllib3.contrib.pyopenssl") - vendored("requests.packages.urllib3.exceptions") - vendored("requests.packages.urllib3.fields") - vendored("requests.packages.urllib3.filepost") - vendored("requests.packages.urllib3.packages") - vendored("requests.packages.urllib3.packages.ordered_dict") - vendored("requests.packages.urllib3.packages.six") - vendored("requests.packages.urllib3.packages.ssl_match_hostname") - vendored("requests.packages.urllib3.packages.ssl_match_hostname." - "_implementation") - vendored("requests.packages.urllib3.poolmanager") - vendored("requests.packages.urllib3.request") - vendored("requests.packages.urllib3.response") - vendored("requests.packages.urllib3.util") - vendored("requests.packages.urllib3.util.connection") - vendored("requests.packages.urllib3.util.request") - vendored("requests.packages.urllib3.util.response") - vendored("requests.packages.urllib3.util.retry") - vendored("requests.packages.urllib3.util.ssl_") - vendored("requests.packages.urllib3.util.timeout") - vendored("requests.packages.urllib3.util.url") - vendored("urllib3") diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 3a9ddd9dce168e8cec2e7112d9e7d6d137f84c81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2902 zcmbuB-EQ1O6vxLO>;1@Xo3^2CfEM?=+Y)a>2nAFj1W84usux97i-j<bXLi@g*kfj9 zL)T5N0+&cU0ZJrp5HG?rSln^dUhn|iz!`h8RFrHgu(k6W&-{HnbLPyMebDK&5M00f z+5O_@;|Tqx9-hA(c=!;0;&%ffjC_O*Y*HgJebZ2Ni(0-_()Md59pAyWUnjNo#%{AL zTV!U>*fab#u3_gJ<abE@dxJkC)~;3dA0cgA-!u0N;;c7LAyr}vTi=?u5b5B?j$tS^ zHCvi9nr+RF<`K=KnzNe6G>>bZ(45nJMf0TQDb3TG^O~<}zNY!Q<{8binr~>jn&&jn zYhKX2sCh~AvgQ@dtD0TSYns<J-_%^t^fY^#H#8SD-_l&td|Pu_^BqNOeTup_^Iuz8 zoO!_}NipMYEZjbzdWzG5i%AAOB#mMsT-J9%>`LZloPb8UDIr+Ns^(Uuc3J8QmJm5q zUF5MOJPoPWYTb@0Scy{+W1@{szAT1pM6tU@+=!I|POuv%$w-E4l(=DvT`gfL9fPhl z%5W$_1jE@RT*UC2+vhBCN12eEgo)RBs^YwB6i34~!RSbmAWkyI<-OYx#QNm2p*91* zkKreNgaRA8NE%yc&)hch)6(2Bq_u;jy@Rlct?z6DJw$14BU#&M@gEGN?ox;TMK`B) zUsk%$Q2PEOB%Ss87MibU+(KK%ZUfu6wr75BZkyYdY?cah9&K6s+8xV4@V5B~b}6i# zb1$zyxv}j%S={DoHZac`g=L|I;XN%IT7?6vnS`=v1VI`mBnXODpnU-K`hc>vkcz^g zEK;1gQ@UrBbH)oxj73pT7#_i@6%H2}jb%|6M21rGuI;y~K4sYNR3Srf`JKXE3k50c zAqnwMh(p#vf3V&VVxq@~M3R*8-fbFZ+5KK$fiDceNDpjm_GrA;%f@oZ(k1WRo`@w` z$iiqN91ziiFk4uB&%5C*Eo5Wp_Q+tM8hbi^doZ~)mO<cU<D#)Yq%&$+PeOr=wrLut zjUz@`HXU=;m^Jtu^yIZ`-q%Cwx1%r`5(q)b8TA_xql|}1=+|*9Bn%BQA5=K=8$+4U zW!2IE=WX;Mw83NX<Gcxlm#|GD^4Uq%8*vKS{Nz7dye#D4sb)1r*f069N!8O~ozMN< zBr+1k{TSlicQTSKFWxLV*~TE?M6eN$i0~U3X9IXtg0W-?%z_ii$6#C4z8VoBMSg6* z1_P*^o6o<{q({A!Up}zQ3&2H`L{e?P{NlknaA{h}@~bbS${3^hxv5IY!K2p>m3XP7 z5Y}Ms`r+Da%pl<jL8r}yJdQ|K&DcHIB&-s}B0oP(K}p7hoTiy9Pw!wm`x=jNOdxLt zIF97BMVq{!0(SW&41+@g$Rp7(7{Ykfj?Y*B(`%l}K9nSIc!bJ>`K2jlV9k;+g`Ll* zMS?ak&55ubGKf!-pFQ|%BN@}YJH6j~E{dn@31!OLAJ&yaOiso&W%Fo*u#58xhnQ0< zHErojQ!-8n8%>S7QU_VfuUDySse81j2LWbLb%^vwa>U_4;U;8H-&QAyUuOc+i5wOt z6TGe3n=7jyJ-D}WcXg$(%bq%%#8m~y@UI{t>S$8QGYI_V!%tRM?*=P(?w2XKu-93f xmWRi4#R)K5G;UQ#&j;$56B!hCy=^uOxNEjE=QPeZ)<vs)R&D?1uB^Ub;V%$aftCOO diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/appdirs.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/appdirs.cpython-38.pyc deleted file mode 100644 index 04c5dbeabf68e53f2da9b1debaa4bfa78b8fb3ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20492 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 Zq2~q=$w*(acpksxl1abxpMI%@{{x0oKGOgI diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/distro.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/distro.cpython-38.pyc deleted file mode 100644 index 25ac89c1c3b7564e674e545abb39bf9cec398eee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36406 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/pyparsing.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/pyparsing.cpython-38.pyc deleted file mode 100644 index 51d9955a35a258ab77a5663f8029ace63889462d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219080 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�{ooFW@G`pWASW@G5#DXh#$3wWKMW2JIYn&UENI z!PTDe%3SwrHVOHPZje*}Iu9}rLNUD%sv)w)A%f6W;)PSi&CE=5ck1hM-OG150Z&1| zZks%lg)8BZ`=Q6hu)l#>o#sUZn)EFto!-ipXw3*Z4}rWF{|q<}X(8t$xf&W?ZOiCz zErn}NF~amw{G1)QU?4QXu^Fs=`bFAIS8|kD6VuU`NT}D7ig0vJqLMyVU_0xl9=*;; z@i(yQdhWqmGPOj}Ovj4B5VDiWCzaHWdbDgG`i?}dn1Ex3Z(Nn_+76OoJM^AY_J1H@ zxN0oBT+nD_JFCQ=fNZ#4!ND_tVHNy8K10T#`;2}>C@^0X7mZJ{I@ljCfH;FYJh)|$ z+4*wv;g=0~iiqaI@;Esh{<?61oY;htkl+8CD4JPFmNU>5z`agt99!a_M`~#+20$jo z=lP-zEmO?i&4#j25wq9NXUw438sLlAUrs*SZP=e+o<jC6Bg_(8vaU!s)?-x3TeLi5 zXq9ydy7CkP(4i%Q!&3R^0Puogn{Xv$!ucqcR-!v}3VdP!P2NtAZj0$_3DCsGMd-~g zLcgk(V#mW5Bf`E?jow}gDIQWqFj+1*=R_y-6fp;T5M3%(WH4WzhU>|hs(lpWRo{(| z;N2~3sP^neW8tjKzBbG`&wJBZU(YyNMr`m22*K*coJ8k>z#~KgH7*KQ5FsFceC{Im zSDJC)F$I>K3_&V7WIGB!0Gl+3u^_|=4<<pIu~&UPThCV~_07nit`RtLOT`FINli|e zC5Kmej_Ch02N-aWH;O}MX2x+=4;txZCS<e-pmmMmH31s|^8G~+27V^w3~+@mBC^oa zMii|FeaM0|Sx&2P-#EZG%klVs1LBX!><seii{{lym3wIbx$e>)KIk_%n}kL9e_Af0 zwT>Z^#^y`h?qM4PA&FF4I03OVy488EX6Q#9>hrUR#az-5Nd)m=B#XKxG1u2<fM53* zuo6%?NzdUYOm<nqH%D+4)(Wl>Wne6=daKtjZ+(z$2(_1iMTnm0(shXwP_EC%ee@*y zw{i5OJ0VJJ1S|6nPSfR(63aXgAf;7xTN$0>l9m!BAx*+LfJ+rb6EXTc@G$NmT0#Y> zXF%Ua=)2@XK;L&a6h4G3g7Jz@UM(J2c?t_LfFq~u+1F+Z{r{Br4&xeFG3^rLndMlF z^|No<_UB?9z^*t4yI}VcGvL7-)Mh=j@qwk?<DD>g>FhTj?(z*}_IKlTCk<S@*G#`# zUTS+Li42>a9&>N^qw{r43~y3#aH8|_7{Xnz(L{Jp!*LLtmq9!AtGdQA8fK?obHCnx zmAwZ0b)|LDd_BI2;?O!<G*33~$e}?RiE7J7SW$tSA|6=jgGB`Q{@G-3@(FAuNdj0V zhVV|Mns6$ic%SbzPU35k6gzdp8hFF#Hv^N0e({#A#l7ae=gtg5+rWl%zT#Zq^nf|@ zZ-v}}9`!KzGL*+Vq?0=O%?{YoK}th|Gz18b42tO@!+SgCgJ#9h09R+C0NJx>G~l^Y z@6*Jv5XIQwor~y8*1VOw4A-FE=6)HiNn#htb{!skqXp_sE<`b>COWvAe-YcVYULy} zX1sSuCR=(76%4oZw?!8zuSY^$sWS+}p~XXtjJyNo(awt9iCxxnEDC<&JrYP%5(@|p zvt(_mK-wp3tTX1ezK-%^UCi!fU+lwAeDQ($-QaBssVONWeI3m!J@8^G-1lk2fVwJ@ z&Mo?#lg2i0ZpW)uF7U?<#oP4#Z_Dq~0_)q@@GLG^w1g}ao>_jZtj9qLl`a`UoV$ZA zSx4_L*oHMNS!~#=u`b}U%5FHyE*QYY-_wZQ04%;p-GUL2gteI%$K+u;Gm(M)01Pzr z)_(%_V|n~U_ww!lnEmxepDIY+2#LZ%+-Uf$CQ|()%0f-6?j~)jBD6kxAR>}UGALZ2 zvwTY6f<1@W0lWt-(0vo~p13KTWZzI#G?Au19qp;LPCt`XJQ1@sWF9p1m(DqbY!vJY zu{p?8VK+o?BwUqAb7-C#6wttB*_eQ<y0mk<YM4*qm&Fgp`SakFsLW&&T<9g|n}mIy zvfqmIDST;i#<0m4p}$Afh;RlxnUsQgg=!jaz}6xoo_@6n#)kl(x%p=BXPU*<<#V-M ztr0xHPaqZD)iu^~P_r{CKOyD8X&&6Kr^m^(&%pdo;;0P1e`e|Ti%+1QEna^Au5&`T z1%`Xz9KnPxeenr!4IAfMs!i2gt(i7b^Q}_bENa`Lnrf{o$NP8_%e(l5*Ah6|^IM`C z7Mp7T8~{u6+|vQDbRDCoFFCKG+w>u4*=+{S9f4af977@}!f9d_+BnpU)T(b}-;&7m zoW#lU0oMF7+L1x&_Gd82v1vi9z@NjPzb}rki`vOUBddt+CImyY!Sy~`1wbT!NK4J_ zGlb7&w!k%lBY8kT4d4QS2eiEoJ+PVKDG0$P*Z|xA1I*t|pFDs3^vlVCmy?HHHU@UV z!)e_t;k3|(GBSq(_K@39aFDxrjn@W(pFoD)Z5qL3;1#usLvGrHL?p_0c(w}#qjY`d zHgVU3-I%3Zqg<j<C74NJTz3@|a;m351C&nc1da57h4HdKk5cSB<HKy$!5g<3{`HSk z)GSXjsqdvJM7+dadJM@D@O7VtE39macl<Me;9yaOzQdD*;q<CqcERLA8A;<Sxd!ft z<tfA1)V!hYO&WYEILS&H*!seGR=T~OH7~sr;}7_3S3v{)s1ByB=$nH-KrL73xe7yd z3!cePh2a@IXl|$(2F8HDbBT)^F6M+~^<E?gG8YCO*>*lxj&6`O=k0zziLu#-5Vx*h z=-8c_z%$byW#{MxupJG`0;?@y8|j!az$U&YU`t!xfd{rlwil=+(V0!^0=o3HVzj%s zrJ^}C5EFjoL7I%v0v9Z~E4~ey7ouGmY|$1Qxn3X+gb#9NNE*oLiddcTD=f`C(@HN- zY*WaL3+7^U@@s-uD>Hkl&mhudo=1ED%Hf1O?M-}SITWQ8N<n_AI5vj!(4fu$O)+FB zUIRVXk;0*%;)e(Zp|dN8=laSJUx%%a<COC(7Ua5|bJb;cJObAzkEq_@!iPFO1o#h* zmDjE*{p8d<X6?H=w|3IwMW94VwhB&UjXTc(p-R;cI}gTh0fl$T$z)wiGVbo`h`y_< z2XpcNYNpP@ZxK@B@pUBdwugw1W8I?eGMKZ}5yuwsu-8zI8`ON+{STrB$>JI^d-s}q z_U!51ySH~A{>-g=_wG4TS3|B7<Z@H8s-Y|H$AXp8BtBzNGiwl9a9!9rb@pRZ#+PtP z5vi9%UZN6-rkefc-q5Q7^F@E*Wu%4yjPh%A93<_YBf<AUSyMFg-xES`>VifRB%cJv zSYl|d=f1Y(BesDD1ESe(VwVHF?8n6?D^t^uW5(Ahx6y0-&k@lGm;X9qP@W<Iej{)% z@F?^ew?MBEX2Nk+tCv)2JW6!q|B;$vIf8zMPy<j?kV67#rWb|hthYAw7cRsl-2>c@ zci86GAFHO7M|CYW1T<HsmH`^JfqENBciE3fP7RV8dBV&9#sM{BU82@F27?2>2cpUf z?exR7to=TTp9SRveKVCox#Fz&;?MFuBx~6P&CER^;ifQLexaIEjhYJ7^q;Qld=}=i zNafY4X+DSYax4$uw=oycN`9S46{2=57d517;-D5|8C~0ppMAA7s9_F*haj$MT5JKu z2jtqFE6}nk0HR}|$5qe%gp+}k5>-RNX%>zrtww<?>6Iu*xdP1&t^84*mLe7|74JMk zsBUUXVHjo+zHNgODuaqGix|OZR;qW#uo)bYi-{SWF|3L>O9zfjux}6<6}2o2Uk9}8 zD{BIkc<9O3ztp~jqCR)@Hr{hG6#bw*%mkgpIjk`Xa`g*{;iuQ)Na@r|)!UaxF|W>i zidD;Vyb^d+VO9ATxL=95WYO<E7c3$ET1p`UE6B!CC}hf?!o4%LkRSl)C$DbrjQ#vG zh-s4|sY5q%V9<XN)ev3Cj(J;*B&NTeWhmmg+;(TX(+g2sziD4!z9hewC3&Q#qD-B5 zbalu#uCJpJ3TS{Hg;i`^s(08R)y<-+p&)CG)a2pq>d}6A+U{t7BCT5LBjPdgf^E&= z&?kWDZGK3br`b%AqQMDmc~;Z!pFpbaX1&3kW)uGkFWfYJN^1h#7(AsjqH(*X9Y4>K z=9lT`Z^XO5Vn6pFMq)k5=M93?;dX<F9X@Ay4#Xy7wdg3OL07gU_ZvO+){LxZtebs+ z5SuV+;NUDN00n8uG0>9V3tfqKCw&c^!d65Nfb@PFhhfk53ZTPtG4T=>B-$(KIROlV z|AMP}u=snb>_PHjkVcrt=D>w&b=v9QwTp*T<5XA(a>{);dUw}8o-}KNo4rfN?BjWu zhlcZTKcr?#R>*Y-5Smir7XasT_$~tQh-yWQ45U*2#u8PouTI~as?}DnhWf@jz7BlH zof)u>(1cq5ZAGdObfO<~DalCp-uQY#pKV*mQ-&QSlZppyoG-|Xe4?<ks}q<}Qo|Qp zcW0a#E$;^g{G_*dl%#)xEj+SEPIvBNF;Qn>L`VT%WmYkq+A&rxn1!B^p02U-h&kG$ zdiL(dxd?l9@2(^KJmjjowd-<GRWBUe4@0eB)K<c>D4<gg+-61e-@~0tUYVUE^|2tM z>!Mf=6~pb}&QS&wFQ_8L1L&wn>vD#(FMf+@dAb>0X>q*+#-s4LXs%+@X>>grUBJ6` z;w5hM64%u+0Ci5WX^Z%w@VgHIZV0&%Bwq`6a5=!Wx>3_$(<a?d!Qlv4fnzY`tP^j` zuJ$BrmE=WObV8vnBNyZG(I6A)YZ?bj_p!<(3=_aTbg2Qn^cAp0>Kz`0DPlWxqz)S~ z$VNbIgub9~IvaMY*Cig|32e~y!A>2@OP=>E;coIo1}HFz$1D37r1xO@B2K295l>sV zqLDl%2hMebks^(hR)s9cK;y<2-{YJfw99@R>2Q#D8F<BW2vs*;>;*W0@p|D__QD3~ zg<LxGl?>Sw=n0bA@bGOc>5VYuk|AY}9L3MmysAG?${)D2Zj&@8#W73svfOaB$#B77 zf)-Nw{1H}FV9Y<Z>8!7Bz+nyItz0p##QJDaG6bMfAymFTDM))FN!!1MINIgASl)BX zvRvilWS--Z8pU@b-q}Ij>A}JC=ev`1e@-46!YAb6Jd||!LbfaCyZ765&RyvhU7WgU z%HX36eu<Y2tj|_nw(+u^mrh*hZ5P(GbCz9!!qHB??%_pzMC|3$K3)_r(k9uEZDCNH z3*5>l;r)|Vun+M<yBhm2pQz7mALG*rUa0A4-^Zs1czKW)>Jw?t%8xK8WXA}fWO9<X zX3z3c<AoG~y}-*;yj<nw8D2igTsSEs7m+qlmi}SHa4z5h+rgc=rgfd!rk2+1dYpJ9 z8$@2S8HC8POW|MA;1&O}Y5CWXy)Cy9@mFQnW*f6@*@o=uY?kqJ&Dk~CZQ17BLA>wE z?apq&y%o-%1=>&`|43|*Ehiv;0uSJ-8+4PG#wRElZUGI7iHxWHWq@>f9X(1ZV-q;G zif8BHTrje`sIUVEx=42|wFwiwJ6-r!w9Dr~X~#i0ZcU$J$CJBcd!n~4JamW0Mq>8_ zaOXi9LK5%+@<R|X^wb9B7AzX)p-ZAq6!x;BtWh7Uw@0t<gW<^-o`o|hAm%+{@t8yM zEyP<p*h%DYR|_MekU}1L^hh$6He!JsK^>|EJ2=n7&ka6k;Rp#9)#f=%)Yq5y;VR_U zIZ@9U7J7_FWiW3tYsdhml@$K_+3Fr~sNUlr(>FXkaQ^TSI*aw}Gn|?6ak!wf#4bZ` zL8V1gILCsCK;a>|@8bVb5w=-za}U4U1GxYz<a6sl@d)D|ozDlapMC00AJ&XAg0#M7 zzl@K}e9dH`C;)Unl`G+k3St8V>_AQ|PI;)><M#XTSU(?*<K4YPKg7C;=5#U!tAyJ? zy{sJpFjc`$r9;JQaNaE1dFjG`E(3Q0N*<iNdEkpcpJccM_Ha%OOl*3kZ$QxUMCo8) z-#GNWe(;Nn0s{~IQP|@M2k`eb0H5R&0HEi9<4r@K<R;bp`hcG)+v^Yrp+4LoxCMYH zLV$MxIO>7!t$?J5f;BG}13AKB0CE~Vh9Ji?zJT_K^h9z2{(XbJR~SzKMtx8skRusU z2<sES!T*N_G)`|0+_!Kd2{>_%g0mQ%`k0e&TJdI)C5ODOLul;uEu4{QnULwQSKJJp zbR0eFX2{+=dbYlo&Y>q1dr3qksWu^{RvR$`R4yis_{m~&J02k3h59iU5VRkD^Y9E3 z1<xs}!_wI-)nR$3#xKlGli1hF@-aA<IbEp2czQ1D8I+oHja@jNQ%>e|8)TQErEVNQ zIj9t8MrUFBr+ss3OhcJLT}#|ed2eo>BVIpdjm(T|*AC?X2$J>-=%knkn@|uy!nUw& z&{6f;22)wGR~Zi4ks6%KN;|LxpG(sd1qj>s5D0~hAxs<+6)>!Sp2L!rwFbk^W7ie# z_IqWtAgZa?v2!;E?U)(mQWR;)#YjuOgDpWg_~SEwGD=ij@kU8n64V@rq^=26e7s}G z`T;#b<<SsUSwj$OY5yhis_*PAekFsvBGs%$s`;I)CNc>A5GFO9xEnuN4=6b6Hs<c` zJXYz2O*SZq@lM!^VfZ}n6f`Upw<Xx4LN$tC#<}o&=VHarQ0w#Tv6HrJ0YmCc2(w2~ z=;fexhW(8Q#}EU-oN{M^yu+pLD!g<;K)3E`!?zs4R8Ng3pMfR=u9yZ28st2X584Y2 z_6Zylz+*H>ZLL>LD)(ga85jdr4d^i#xTc>;sAj56<Is(kXOpUx-aTt+?fOTxVM_*- zGG;u}@O0wo<kQB}si)IVH;iTE0PigHB-YGl<~CIut{SRcu4@;JiOfQ3J_CooTj0>Q z5mr#Yrmdi=*{hhK^BL{PmzoB7{Lt4M2A9lkF2QTrWVT%^_INuW8F=ifxvaa%lKmv^ zK)+zFmAx~~rDLDM>le_m+6LtYoHSLO$`{~RYBs`?ENROV!Q&^S?*Vx8Ncj?HU~DJE z{^yVA$?;JR=+YKtl!11^os^Tcn?a)z1#iL_JPRa*-UJ&BBa-2Wj1#gNX_Ll6?C$~C zN!c%b<&{@ndFiXT2uTC&tp<I-7Qq47rp=iJ88(%t%^~PGw<$O`%Wb8M2ztRdxCKZ4 zAm?k$^fWGRs~n(3<5`?LH(NJh>>osw_Yv|)l_#Kuz8MGBEZa@75@NuK<TAshQ??<% z)97ggr;<1&k_|_rwc>?7!dE&VJ!mholJ7tQztew!70&r3RY#yzWmHF`F*xl@&I_~O z&qQ_e=L2~6eL*W|F_xUW=~Y`%9eIf@j#NST&v+I5ahz#<v=KjN5tq4+tDya^iiweS z&i!tP+m&$@4IMypBNl(ag8auX*I^_0M54TZu1_D$$vHJ|5SVG-_bi|WbJSa|uhMze z#1pU`yfyK5;~}rCtLaIc$jovZxDU$Q1`wnp?2Cyf<oXbvWEpGJ4qMNMeX85XrU53z zjmo?5>}GN95{`@?tKhBRBhkP5AbRn|jLpt;b8;ltVa^o$yV>IeD7SH{aD{vXw|%;h z=P7E?8|T@@v+xG5$3$k`r%}d7I2<M(5^xH=4g->bQx)tv5o$?pp#liZjp#~xZp*R* z<)28`HlPVM05@R%knHi@COA_C{Q!Ojcmk*x?YiXF<gU?X^oQ;7BQr&ulvsA`?`Qo9 zS_195eUy^YaL~&yST01+0hW=p`A7XUZquoggU9p7PM$b{SqE2e(r%mWgk}v;j+{TI zd*DZyh}{5gLWpjjXLt1AZ311<g3idK;8DAwr2$V3Y0x+8j18Nx*~XXLD_QYAlQHa{ zMqZ;#6#bK#iWkoFK##ElW(*vflp1QVGTL$!XAw8zIinh%1c`v-WZo%<%p`|^|8c+! z50q(9t++R<rxlNwNe;EBt7?sE$5X3XtJdLL8`g^rxUW(h)h66mtLxNe+}Eh<)fU{_ z)eY)K+}EmS)J@7n%5~~y)qywb)i<lHY8&2cP}|iGyxFKaRTu7??oOy~we!h@+G$<4 zkQ&--U9WBdxAJp%FUQHKUU|Qzyc%!%c)*PRrideFtQ!}2(9ABiYuvy=Gv6Xd&LoF! zwl)lPpuKYN4BERDeX$MUcd1*|fhR!-;;@-#)oto_)M$s*sZwKxx<mCN)TQoJ1E^QG z)rr;gpgM$iJG~hCP?}qmK9r_M=|gFHy+djG)ZOYHq}-)Ws(W$Yt?pB&aNna&t3llN z%E2@|a7G_Yv)?<I=2q`ungia!G`A^zFwO1i-8d%b5tM%i4#as3IrQUjn_=AVR0TDH z`+yo%3ipG`Qe(IuQse3Z?r%}ws)}j?DeqE~s)RR()s!mZeneH&H10>$MTK>8=-4>j zw8CE>;vQGesTp+%Pbb70;j+5&WOnFoHLK<j^B(oMs^NZ8&8xTLey{pQ^$y(cQ}0pV zq@F;kQ|fv3q<RWZr=P|eFf@pj?Y(k3<6QUQ5zxk%w&n<2*qd@rs}>L0fsYHB#C@Pt zb4{%$Vhb$*KeTb;9soMjJVil>vI0nnPzrSh>!A(t2DXLR+xQz{oX3d+L8ftVn>l&` zESXSZu!5Tmob}@Eq3e^1#-e1^V+wCXI29i6NcNQ2`N&_W3lov)bk`Z_7e+=|)Fb8b z3q=zq_;9iY6DB#21D{0NV2$yH@4O)j+{eYr*~&JR$KhY2qLuD(Bq!9Nyed)Z<`l=v zaMUykmxi&F_ftL>Y}vtxKBgP}V9;Gh*;`#5<|EZQQOwt|aWO%OKFo9NvEwHWKXB@N z{=s{oA(=mV&*8J@NCC;<)vfpLbt_i<kBDc5<JdN*ZGc|8v2OtIE+FfmKhIg%J#!i2 zFpOAKZ_*mAavCm4G%~{U1`&I1$Q5uN3pE#b*t4u^_G=3XL$LI6@QReez!Ey8^9?FR zIP{bw%>U2bYAvfjA+{6#;Y0zbi-8ZId)WhZR)%(8pDxzkI8YaHEN$8H`o(#G^gx%N zEH2^ntBa2Ey6o$tPvYkr7kRS9D|UmnNP=C?a#I7;h5*kw;WZp3$i0}9gKp|4#@b~X z|98QZST}d`Yj#zPvgbtN?<juGJ8{9$5R}egb4hueTvKv|x)$E>@E*wEs*Tm`M3czl z;9VAPn#nZHW0QnytCvTcgjUIQwZvM(Q|a^V^1K!bV2S)X$$P!L*&s1D3ZdIDcwUQu z;9GofuzQm@cy^m*PHE-}2w0rF?L9YQ4xWXgy4$S9$qtnR-JAmprNjDQpf+c+I340Z z`%lnT!AthfV5xC)vLpy*bl20~Ac{5h>oy$ytmO~Kr>3j3Zg$eLrq6@h?=}M!gA0Eg zydj5&5ra?QHls#XVTypN+*Tx|*0nyn1*{kwCrXdIEpoVwC!VA8wt#cwxQ1=HEhNC9 zf+4MTTNyeg=eD1>XR(2$ycrB0w2``Eb$}u#zI=s%(S>NFNkuE0bg8CJao3vHeB=M~ zyut?<6%GY(<`QUeuGan^;e}f#ff;R?vIuCw(N2Jb39R7s?Lq~7oIC`h$VeE_F_E%w zucmpJ3z!0Wt*3o`FxyXSPd>g?3Q6(hxzX_3OV6TIFNWZQ>n*BU9uG1K)r+P3JeE%A zsM!I81k7}rBwIE-q-h-%lwJh25z(|G;Zd=RVE<6_giEYX;=DG3Uk+LG$h-TQjRxQ@ z&7q(MHPoe$fKG!PDzwJ&nU~dlAwKJ4Pjz+o!Fj@p`FVNm+_QV{e(KBlxU#F`zB&rP z%m4J7&wrUhPNR@uSh#u#ueB?rHiA~wd@Ow$8Z6%1I@;>i`%GwJm<RUnzR%oy>jC5) z$$SM>kz4odg_k)b>oE`9dh5OexbHo1`~H2m?!Wawgzh>XKO~S#`|vOszFr>>!+)lu zsWJVYegvb(CPr4~NDsb&!C9g6m@of$ys5~Ee*x3c{v<EI%F8ZHMnPltuOR4ShSccv z5@rxnuLI9ZTU>3R#TCym2Qx)`K?){5p=!xO5ls4>C{UIIu;VeM!9W2j7fk^k4QB5k z8sJpN5olz-rwX(#2|xg-m6BN6rpVNlInI6tmlY&ckNE0}@>?l31U~~Bt)#f%cG`g& zH$<9r@?^aZ3M){_uY;w-M~()hdB7j&H-X2s<Jt%NyLQ9fa$jFxH$3`-6a?W6qu?I1 zi)g)n59Q3I{yp(28Yv8OT$I#1JW%d<gXMe4USHWSHwE=}n}Xhg9N@nQ9iJkc^zrfs zy!<HN-OZ;spUs6)kkok(fkY%TO<XVNKgKg+2|&b)8Dr^Uy$P3w{e+T)xMhM+hJvkY zNxOq;KblDh&RUuxuUZOTi;Na<pm}f};H9B(Cb}fl!wZgpqTR?SS@B{h!Uy0ux>px< zM9BLg%!Zf;)D#YG51qkzQfnwR!v8;FXhiOj456~&;F<Hs`?1%=Y}Zk#<G7PkVy7?o z4%UKYrS!hl<edS`OJ>N=p$|lW64#T_QjzL`*um-5%R(vGNf$@`r3J><boa|Pm4lo- zpwLovzbl|>PzAya53q%HHbgig>w|%|Z)n3Q7j^3KHkfp?c<fpr=)h*j>k55HL8#Da z7Dh(k39ksvDM;tR3oKj-_2WET*ul&@fDu^_DL#Tgk+(<Y=n3J+4O$gHwiW~jS&#YQ z*IrzGN*pT|eL-5|KnV4viAneW^V4X9wi1=U%8|7E9BGx;s5iZDVRrm;lRNcsc|38G z>i~GfW#v#BZ2uxL!EfQ>X~_xBaN9^$9xj!%yb%X}f&1XVX0RS-w8i`TE}{;imBe}) z`cZdTR+ue9pG46|1SHPK78@=!J}PnULI4(TTvQSeVnIL!<`z)MlTDh*4k{CLWu9kI z;tt<}X}U?{6Bi-q8FC5A%zf~*1+`-yv;Y9T1Z*L5&^xzeT8&^1QoaW*XR%h(i<0Mo zxadR&uP`Du8Nv||45Ip=vr`4JfJsuAJW(o)V-}zsp5V&6Ri?Ls9(`IXUPLp4B?Ui* z$me`awu-(KDY3}NJZDmgl8EjWlh-JKK>L6~;q7PvdH~|J4QGp_&>%TQ9Smw90#6#O zwPl)AMH8J)u))wH^H~4@7&0wzlL^99cb6V(VRko4>nvMwe1$~~x&f5KQYOq1c0(wB z^U}HN@;=s-@^k^+1~mUtZblbs|1}|z>lEY`vcG8x`qcg_ev|d;b9|CYWdVCq+@q}3 zYV=m3f$-Lr2FyYJfMsigZryP`mP8JcU=(=-e*`#o^%?v;KW99tQrk-`K$;0ag6wn= z7EubmuMvW8KA~*ZL2w(4r?*m7K;2+VLd~pT+W|0`wrr|sdDf6x#!gd#*>Dw;p7+te zx2GY|6M}~{#>*8)K9eFX0Ed@wsDqqaE-=nXZSL;f7a00L(Tj1oC^~@Cu`<qphB818 zcLqe+QEZNnu}?aF5R)wvHz1OYBxZ|jD?AOIhmZr~9F!U6kGan#8?m@tOG6coqQ+t6 zkiA>ru9Yg6LrSWb`a50@c=FWRwA<@o&Btkv*!M;^eNdG`i;&Jci``rBB?TI<iG&`M zJ~{~!QhH+r8!G>J?qF<B>cS}t;)sZj-xzM#!xzV9rKx`QSlnl2UDebBzu`n1&AryI zf?Okqt&D;46$L_&29ha{z99-0nnRN}a^MUY0$kl=y&D3^8I)#UE;_(B01s6G6@U%~ z=UCeB5i}@hRv*z4Sz&#>|EMj69D(D6rkK3~M*$ZCJq;@XQA|4sIFaM10Z!dOv2a)e za)BofXrM0W13w&?Q<fB&srC%2C+rN2b!D<}!73<HIvAA_H{(pr<H0$;L4Q#pj-**A z24L=ls5hYx$7S(#t7HaT2x-nafxAEfE~wwvOAC`#`&yOZbjJr(^QY09*T)R9T0y|# z?^oUcR~p<1Fo;9zz4~xC^6U_wEP4ZM*X6m-%*_AOzW8H63S{lM!{hReW&tj><|RO~ zSm#}OxmLeP_Kx2^Oe;UvH`G5{H7=DMhMxh>@_-L$k#LnOm!&a1f)O<8j8Qgkpo7Wl z_L%#7_IeNd_Jq7``_ouoPr!*n1MY4LuG&S`Z42w-&#=r&gctqOD}YItwVHW1Vpalz zWBWS#EnP}T-XC((mMrU3tdeD2Z%5%Q7g~c@+EZG0kc+!G&IKJck)H0sA`c$7x5#_! zi@EO#ApbC2*+-Z6DA<UUDCA>wIsx{M#Uil?BXp4~^$&v_iPS#2;bAQ6N@2=BV$V;( zeJJAj;2U(b^elVZ{ySc%Ss>rEfx_Q2Shv}4i!%+sBk1SM79N67*U$0Dv3@44&L2rK zXABqgq9{^dGoHcL9?wu(yJkT7KUsz{8eJg62)hePY^keBagQuYXJc^7qcTrsX$u68 z6mYde3!sbJ5XwwHCiyfnACO=0XaVvoTlg3#H;xH*&Nxla!d@0^ByZ{Qmuk-8*EuXf zulk)`H#~yygM3L+i5#{7egY3edjNtdY%GTBM|C))ul&Rgu(KRBhsq5Pqi>J$_%%`% zSU>9)YrkpW22d|^7X=?aBLa9zCws#SxyMHXuE7dUh8*a~8K;Wl>HIIKnlJS96!h%^ z2#W|aF6ggba|{;XB>*K**O=^ldi3#ll0=_yae`3-MjM9(#ZAjH#TC3bg#$s!V<^qu zsm;ns#w^Jt$RJ!B-oSeFCNVQv2#|%)nA1b79#c5z0nSH17P;}kc*c4Aq))-uHxC^& zVQmObwAa}OJLt_vv`ul2q2%O9455fh=oPz;S07m{{BrA8&-!rKW2~)a_Hg`>JM;?e z*IZVEuJ4Cakk_c~>*HEN;Y_o0=WZZW1GeZwq*p^EjYT}@b{hn~PK;u{2Y-C#u1z+_ zCLXHL$J5*41t=doTlD4_+Nh}~Akg$p>yq~EM27Ff<wa<CgIAiT&q>#S_cmdS3YwJd zr7>OjSz<*Zw**+_p0l`si4h&=aKj69&(#mydRgeG6lRlU9$5j!R7@gix5D;ItdiJ` z{tKU^3SZ=t)T1R@(D$=Ovej*G5yd;W7@~fe?_YS?+Qs-QF{!WU-h`ZzWT6?Ky`8K_ zv}30Fn^%vX=X~XW31L*nzz^3Z0NDxRDr5u3{gU0Pj|)N1lO+ntpWY++?kQrlNo3bb zWZnZADmS0r)|2q;{c-boaJk)PbgKIMOP?s#`9zipy(c#>llcnSASAwkO>Ry!n8x#B zg-|B9C3>k3mmA%-WfR$c8bF{Y+W;@Fa=9GM{5<ju`pM@;<9JfpI6?$^vWl8=`-y}B zQ6UsX9NP{@GsPg1UrZT`Q^b1tYN)smnwK93Ain51^84oiJi}?yie-`mt@%nH4`xg* z<J+JHFd2&(o6Te?Q5*Lte$F5+O3p*D?^R+PEKa}o&!^`$!z=<C*F1wvTzr9Cn@?Tb z^kCv5%&V&g^w5uK-CXF;wnKBa{bHK#zF$m1r2t$d5u1IUjo_5@y?i~-7h>W8<z$HQ zPr!gsxk(G+e5h5|%hB9bd8!kfq}ZQ)7w1!KGEE<7CCz_ua0XRt9&G^*)D1EoK^N4e zjdcR@5lTur;T{CY$F$oaM)8^qfeB>l_Ay*j^C^8IFBJJ<D*}_sW9$~H^22c87}SqJ z*~0tz4r#ujeHDQfC_V6HHu#r$q0CU9xY(dg*u%asE>}GZn3CmrwhRY73rb5G_9p>8 z0^_ZPzTdzWTo;}(A2i%g5aVzXwFVj}v;wFZP+!D=g~y-2=;6qqV)mc2&Qg`2KKAb* z?ccB}%nh#k^@-(S;oKvf1U0>+bmXOhj#Z%m>QzdHaxghD%P3s9O)zQHwEW+{N-g|2 zF<T%uB5-Fpgk_DR&I3T4)p$zUU*MRFqIr-1Bs|~5LJAi0X$=j$E>cSe69X<K0TVch z83*vq9h=*LFZ6zw0Y#mXNt1=yMi-__2Ga#LZ2VWn5q(v-IU=)jq6s!s=_iufgadJ5 z&sNPLF18W#P07SuztjV;W`DweLjLeQT5DQJ^Vkv8`VT#*mABXMR;#@$<nZ>UhoIPA zh5~%~xmp_Tm$FDfmr}Sd*9LrThO^5ZwT!OeWCP+(tkABVx?PAd_F63~b7s}`4BoUz z?`E&1;4-Qejye+)ZTPLiZ?#H2o1Vu3Koe`8OW8YXsI&9a2(?S7;W@*8-`orQiv7*i z`R2LRwPxv;986`{=LfvH89bI}9{T!o8>-mTh`Y{~T5Eo7t@R0*8QhvcFSWeA#qXtB zmd+l~qF+I6a{4J+v*(P;UDb7Pp4D1iKL!zeSkvc{7k>rip3vim`hA->f|RF--3H!0 z=|4xuaD~x&J#G7kH_<l3Ui8|Ar&!xkl`Si@&A7N&Ye3JRmHOj|oanQ(1w8>bT-X%@ zL*|H8a2Srw3GW-Ee1*?n#bqv{V&H9aD99w%@YwBQv(vr7{tY4@E{XPU^YXjA{1-38 zKz1vigxcH0ClS0;1<U?T28rsl|J+|>@RxX@;7#*INDzwYLjhDU927jwbllQ=PCz3D za)JT>LgEL8X>dqlgN;7wHfv6_*dx+GG)3cX3KWyu1QO!Bgl#V5L#w5Mc}?fRrQzsu zMtAn_q8?u$QoD+W1T@KVIIoFbJ=+W}c65fZ0ZZMDI9VnK%+C{cH_*aCzHX4OtCL&c z3AD}FAWn^V>XU(3?N})?h%0VIkTU(1wsbqhHtX<ir5JF)ffyT%x$EneRcXp#<!E8_ zf)!g-xliEAB8%!>cp&0{;|-unvU;9{t#@#mR}x6B-$NVJP2f}lJ0e7eo;m3W=x53p zpcg4N6^bIH^f~Mvb1O1v@fFL>R_$47!&^Z6=mRLdo~##I`4N{iD<GK2-2%2rEK0Mk z8A+HJl{aJ7gV!}iq6p3|`0s5Xt9V2i-7H8`QiCVxW+O+y6tEQl=81uI3oNCDWvT8U z?6;1y%G^5e2rn5(!#mz2SaGA#M;SBv$3^-s{Df)>ZCsQA>jR7jCTe;K-Sj{il2@ov zDm}#PdH)Z<8A^=bjzAHzV(Ou$u@>cd02eq+FbBbKgTJJYX#h_O&-xH9kMAV1WtvfD z=hIajZVLc_EjDt{Av|f}pL_#YXkL_r(q5=hdbMeA$%c#6h3r&Y@NiWI>T2?uPv`)g zxLNe6?6(kp3@FDFnB5jgaKL?lRs=$NShy{e6lXaQ>`jn7`|4&yyu)}VmuPc_J5|_7 zEdeRcmY|+B+OZ`E1XLnqk>~7)wX|<$Rg?Cr0Ai$S)USQuYpEJG3Zu~x<};faRE=GD z4G<k{>`{pmtdKa#X^&TjA0CQS=hipcQ~F%M6)Qya0`5a%0h3Gm36&B2zf5J^CK<;( zXzGU}Rl4I1SBcQTTyRwSmr=gG8f|tP$jfltoEES1Bn8cd5QS&ypY3P`wgD8c*MC|c z^jaIAWF$X|c!R8`zrSfQ+EOj@k4LD3A+J5?2lGC^0@w|Lj<0jz!@MJCCLrdq!HQ>c z+V7}r(&mBDgKq|*yu7Kdi%%5CyyfEmlJ_p)ai4dcuQVEsMzSQ!iefuynoi`Tk{nC1 zoit5S$Eo5=VzA}ZR-52lq_JjXTb3pJKjXxij<Y2RZCJLY1rE!lXOGRLXS3S{4jg*e z!>v%Z6w2)Zb`K0J2lioMVOf@CS(cM6^nAX*_x;~yMzWozJkNQKZ2k4WzW4WczfffK zLsc;>d6|nO9I0kr0kWi^2@nJ)Z7fm@p17nh4xVHa@T9v+#D1X@4?%PlLl9j>5X9cZ zz`)*w@&g#&FgywRHGu;<*i=SCYg4`y4rfQ_8!m%UJbTfgTqnHH(zi{ymy-})xV`Wi zIlqI4YJ+T5v;GrOx{wDc2_X?$$swc*dAM}z=IfamvFO@3jh^!uVIz2P`6V~e5e!=e zWC-_ih5$}+hqSWKsY3#+&igWB3-gA$cH{6SxJjeiW`i3Tx|kT^oolVTHbZ=)fF>AO zs}<VJmlCbG??ze?!Is_xZ0Vmn8k8{gC@EV-uvryv(ZR%=X#j(pu>qLd+dPk;40CO0 zLx3x=HzSBsR>K{{L8Ji08O#gjIEeGc9oOv2Ot4jj#uQhyUK)LK(Go9(!vk2ki}&9Q zR0(d?hx|rA6dD7Nk8_a#AcVMsFoCo<h3_}&F%c#L9*!^(DCzu27mBb5m>Aj84xC6q z7J?J<P)J=Ck|1^!f|I;mh2W(3s{u}43x~0zGkBXuLo`JAqw|RN5t*8R5eOSz%K#(Z zDG2eJMK&w}_E7rexq|$X0x&}GklBV)_lEFcxx83)QP&JUxYZ=boEPU70qt%{MH6p6 zKi{OL3S>DzG29uvLk(UNv1<v2lm<;oQyeh_@USTuqp$>M62AR}YSaLz#-OlnZ7pQP z`n&soN{ss*6iform=M^2ar!cb>@rr8R}vY&*Wa?iwy^OGwCzjlO`Fa6vg+MzUFwI& z6G1SP8_b5=Gq{t2*4}`&)4o1zI%A^2PszhXB}DSD5gwO1ky>>l&ob@?Oxd;AeYr<b zD8Bj6kz66kAjEi{1=E8U5@}oN`6Xp~_&iU#>p2Umka0m3YGg{kg69!ir%MS~F89JG zJpf8l029eZ`jE-oN?De$1vyyXQs2jHNk;OJzL)w;E;B`<XZK#Og;D8M6pSkyh^mVO z4v7OLXOQH)uj5$9_kzP$-fOMtPPV4nU+=9BV6XZ|_1>2|NyY*r$}uV@U4rC7Dh=*U zGy(B7W*8e69Zh41l;9rzD0aibS%Ta-eu1<U3uhYxse2A$8@+f_>Vd+GR4c~t2ji6G z{N#R6)%=hyWjO4_5<kpY82h+MFl%CoF1&mj*&~OJA14x&CB|@TO6)@Lqbe(g&4T&_ zQ#dbSi}7~fr`2&MceQ5}>_cg6C2~-ti6O)VBbnPs7cCJ)w$n%7j47D7oECVleYlTb z^NQ2@Q7~0NOy?<V5x7PYH=^~FEiuO5knxPqU-1PLvj#V~Tbsn_XoE#N!adX6oj%m7 z<*N1OC)FE+00=c|O+;w?+Mj%g@>?L0z^Ap?1*2K&tlUQoEO^>FJUnZ>P_+cS-033R zkEEw~;^|7OjlVf@`ncfyIt@5rhRBt|sGsvulW(ERLsx(Lj9d*!8;?f%-0GQ{G<@j& zLY<Z_msd}nSx9O3@VUe-9R-pNd8jG#N<ji0%Eiao8Ab8f3gfP-)5Y`W5lbc2QmczZ zxJSQ^Mho*q<yBrTUn-m;Dhz>bDidZ>nJ^NFY#Dg~CscAevDnn2AU|n5L5i5{Eb{VX z`BHh|q6J=5bLr7NXwlA~{Z{7|R!e2{X-A^YOFd?$K5@K#N<2xRC{=VO5ds^npf50% zAtv1{`0NRSPM#~H#K)F0*=5;Nii;CTixcoU)N+$4lgeGYADEw?;3hgdtXo2>E@wAN z6A2snJfRURbR+fnAF~s6#c2XndT21>r{2~39u+&IUaBZFNFnIe>2gX1S+GT5?Q|ts z>9Pz7<uO*w&ZaV44Q9TP?6FKP3uQb~z)X0qzKDB@S-_VP1}yYqR^B(2^H{B3JZ~CK zvjb;*eOd(it%V_lF}h>KrQs6v*15W!tk$wkRT!yBS2xx=3a8EI)Pub`SqYt8FmN-P zO&*1<lY%%kDoTgwB8U2XhjBVeT2BA~^^d(_gBK3^BD)1sp&bRj4wB9D-NAtedtb9F z(!9CY1FRc4E`%mYETu$%2j^Sxgah~qvoMBG-8+c^tvB@WHsA&PbqoynZ{)<7G`%Sl z*@daLx&CR7#9d4+;x)`~Xu@KEInntu=cfp1wNj!z&101u1FhY-hIP7`h<`pSpGZS` z8$ln2^&F5ZnV7&qYf<*WP8}qro#<=~HE+6R;60EUqR$C_8*}+Kr`+sE0NpHpPJNLg zfJM|vQfg5A2RH#rcM9uBYf+JIuFGF#(HiwDj+VP~;Wpmrt~`MAT<$7?sA_n%kl#<N zv{c{9Xq5>9?kPD5c5%oodtX6M_X-Y~(*5aO-8WhAPH3DB&^X@*jne~-GYo#{4?a%d zs%*W->zqi{@=}k{HaTb;CB1XFL*9VVOdT*N8m?=pM-tW!=6Rr{dy37y;$eS`GHh3~ ztMrDV%Njfj7R{R7;hNAX4rsgsOUngUkHZBCPrgKzr!mnuS*Eg+3I~;dB8L{W%`oA> zY|EPD5Q(r_05y!^1Gi;(LSt~m({(anFNH>Z_Lg_fTSKtETyk*IyyoWT?G~<5Y$ZxJ zzn^hc0hpGHANN@P?4YQ?WP5DP=I5PB`GJ*^cH~5&AI|38SK{8XEqi|X%)*%}5LEC& zZXFB?7AgurY?~UB8 +Q;ZxL`&IGsZZyuz<_s8wun<JJeDU0hkAiG&4%R!b1ao1N zwN(p@Z*%!F*iyt`W>{g6X-(T61FnT`w04~4DFMb+<orA|D}4+Nfz(JPueqf4V(TO- z)>9WruM&f<49W_FUIE(LD)7l_X<xfI#x_PRWxkle)z0xjK+sRblla&u`UA~mpasuE zN`-|3?+Nr~S`r_GGZ$4;aPBW5T(|LvN=>@Lc>7GNBROiIJ(aH!)5@e}O>RAk5#$k0 zaw=r{=Uiyr?n<tZM48E|FlNT8H8CYoFDAA9S&3SRZUI_@Z2nnf*636P>CuVGDTD(X zjZ^e!4g6xB)?|E0dsUAW^>dP6(y>Khmvk=?c}2_jnxBgvV2QG=AJ&czOG_9*9tb_f z+1*B8p%{x=ZEWq##DHTPb_xCbBIt*xBvE7#XNvRlb~oO<PM2sJWkn_oBr`E)tT9X= ztdpy#hAjxBbM4E=Mmvps*x=x=#bte3A9ho5BLl_o2fAwJx$FZs;(rwJTyGb@m4{d9 z(_eTlMe$Q|Mi(t0+lBJ=mM2nVNTQqt<8-J@KjQ3!`xf}EAn_H>!#fn56=6Wbc}TzA zoeS{iOI?-woMqFMZs9%BbRj4r2q{5DdD=rd*N&w;wi&%w`W*LmxwrOx3N%U>#W&#o zGuT4CQ7d4Ng3Ze-q-DjjfOK5)8vUs3Up8FshwE3^QenhTb($cW=SmSv*wPCpz<wk{ zMKJXjaN}95sCw&4zq(<uOG%09UBRD5We?Ozw91>mU*AAt)jzKjnveH$7yibsPlTmj zI6;l~QDgtvKI}Mlf`tdc!Xwq*r2(#QGdw)#@o@L$!IuU@+Ycq5oyZke8P;fR9T#+K z0lq+;BrbMdZz6OLz+-@K75><JkjVjF1w<v<Q-daE9f0e(f*D6#n{yh{G7l{##VcWW z2r(}>2lr)YEX+0*l{-IAM9Cwnx|{?b7Frivf4)$mD+=7==+45}%9v{@7=q{y7~G@r zrLIFU7dAh?%05^wo);E0CSid<Xc0#C56`PiKLoDVG!@r5FkLyxYY4kC5}poly_TJ4 zvahZw;m4GMJvQ`>(2^#B4NYZHmy@`NmM6VE65Aw>-Vah^=4dLCx<u&ys61D^cjk}M zu?fH?h=es@WCgqg4fSwgw6a`US|pmqa;3DibawIH``*Q!vrCH)y!*lBvrCo5(t{7Y zdo-$30MdnNaV5m)NKdrToK?vV8?YT3EP%a%RF~&yVoDS1Aj`NfBX%QHA^LGuj1|VV zyMf2s>AA7(;}kb(H=4rVwEx7l<a)9{Ue6e$hTu8<r0!S|sXNvY4)$)-+u<`m=xx6X z-w8{&#!GJ2uJKY-rfbyozU>x5^tNFz8M;WIXJW<~M2tdW!TmyKW=JaR<${mDTlY*T zX1GhdRs#2#ZHb8#AK<--jR~~X7lVjKkKeuygZ&ScAvD(L!?ekE&%qT`gTg&J@%uaI z5|Sf60U3@7ac(Hjt^ihT@m^oNIB&&4tnw&Tbi6~z4y0!pG?h!!F?+Ia8sfLlY@8J0 zR`FeB;tQI@5(?#%*)e6inninYB`Nh#iXZ%aDkjxt2He(V@y|MHpA>eK>I2Mp;+Zb- zdEmVa`F;tNQn!%bmKiA<oG03SwyJms$B<{E0=n7(?#Zm&Zuh}_0qM)@!bh2vJ}V(> zU*<5FzBMe-1!FNq3*m}iMLnaWnY0N0u?mhQp*TKruaJDxhd&n1Y(!jS|I$G4`4kt~ z6>*W+cbX|rPw{EQn9;gAa0xk|MNb5PhU9NNSo4M)ykE7=u;C>p*WsARIofS}2fQ(Y zkIFYd??b$p1i}Yn^vnh@d3M!AM)UK~P%9NdUk9n?sXOw9@`A?{7lSW=aA~?gV^73K zf<%1d9E<Dh^}&tSQga84dErBfLZP0uv?Ao*if~Z@COV-A)o?cm2fkYPUr^X@fS9in z>SCuv4&v?wTA<<cVa`Bj3kz_6HmnYXnP^uaT=>kkS2UWALu1g|w=?uf(1*^W$chce zmCif-b!}YrLJ2&TL?KZV1kPS4t?RnQ2+OZ(stQL;THr)bFn#Rs3`I1}_xPy!#Jbsf zLBiEQbi9~31b<>?#lD{_mJnzx6Ul)5&$wver-o!rP8T9SaAW6_7gvL`Q`ZrUYz8-t zLlw*X@}#Tp=wjh0_3e-AJEHm?3+p@X>U;D>ClftReSGqDsxKNKgVeJ#3xLb$2ass7 zn2z(;H0h@xz7a10S^~_(KashR#a1a|2+&}D8*er`SL1um0B94Xene0b27%m88ML{z zT~DOQ|E6J$4b1k)QeM)Vy)LuYU|{%SKaF#WTQhN0+A5a|OUACjXLb3<I#W^$GOI5_ zZ!r^2BV}3`!yyUQ$EDlsCU9o;fTap>>41z4`U4dg_0#p~o4I#VeG*3M7{Q9QOG({E zfaHSga@&xNYmVzd;J$*S0pFV(IhuOC0E~-%!~{h`zhhj~$b4m5er6$b=5X1GJy?}Z z%wfQ4mkH;(ma@SE23GN1GlOv4JznaHm;$qqEM7^1)oH8*F%N_VxE6S=AckEgYK84o z_ATH5FT9YP^<dQ~?`VYqsST7EfN;V+0}}~`0}%1na0K{TE+`wvx-3B~fnJ03-3F9i zC}Kl|vZf~f1c>Lj8c#|CLdo4;4i;SWYDIt~W(G?0)faf3{jD@{Q6LxHO}?7aT&bct zs~`ozrmTD=DR)HilohfDbP9_A%&GsLbRIn-Q4*+SrEn;);CRvXVKiI#k4D#ztrA${ zkaHd;+6@*uk`KO^0!jjg+iVU2W8)J}W(wFBJ^^ham@{WE035NW9XO8y8cWzjj2YYc z$6QXqFiMJw4Szh_K=EJ29wp$r)z^~f{pqL2G;&Jk`Sh4Z&Yfw@+?htpKXrc+LzYbR zsc!kQ2y<X1@z=`Xua%<visPLsA=)`9pe(Q;TV(^vvY;@aJP4KNa$vTC<*b3_W|-Cl z&IF=AC2*$la~QkVnymVgYpNY|o<Y5BP}m@|k?Ap<O}bw_EXdskqBi=IReW4+F^$R1 zna<ln@Of(*X(T^L35{gbu8u75TbbnmaqM!@hgSQUk3ytAyPaXf!3ook&U$yfM?q)3 zcxDe`81i!171?VpY}Ol&(A7O>UtT;$U!rMxth_?_ZW06fuq%RwBsoVRTMX&1SlsFW zAR;@qh!L`K6GayQNK_FqVqOOzLQlc>SQQ8|LQ%KTzOm-k=a_@Quoo+FL_raHqPaqe z3&mMf@>2PD*o>sWC8bpMae9DDsDD+6Z#f%08jm#L9f$4ll^DNopV}CCP;qS{?>zC7 zAoEZ;A6+DjW~DklI<@0H58X3)$0Gt%ArR4D2T1H4eKlnxFg_|Bl9VrJDv!87v|e=D z0tzGOv6ICTl4yNUy(rU!J1F+r&|*xbY7bk%I*Bf#;_XhG8tm;v<P-Ly(v@hZD5I%% z)I@KB-OY#7-q_SKV~w1f=SEhf%r$oXcT>?1Xs4Mo_>f$2wnDCmfWh(hrl#Gdc}nr2 zw98=8KK@n?a!|OlDx6+0;(Q+z(b?|dQC4|KQJb+mF<I<p?4_JEmCXbhiB}%qo`O$A zR@q&YYkf48hh)Zajwy<Qc-_sS^?Pj+BqL5O4)Q#`QX;hTG<m)u037RJlu6Mcp3urC zDjp&oX&@1LSd8biX+wt6$A_P1Nnm8)f>d35eVz)+FkC4tuE>$2J4QJsnG@Z-BP}pH zU50j$tnG1~?9l7WtiPzK(V{Ml+p9YYqmz3_cc3?-&Q$OPdwlI>o2thpn6O(~kvnv- z7U<-Tg!1E!`}QGnB_<ej`AG%-DElynKp8m?6z=i_QfdL2!yMrOQD2~Ew`3nPEbEW3 zZUSuPyr}2LIcwxeMJ$nSrIFQH@bkRW7&vZmL!Wey0xj9#1NyEBm3=MueqM`um^V5$ zN(mu)Jkyc+at>R=<|wptbJ#2qFI0;;{7EhBN4fjv7dChUWx5u1Z9baEbyu`SkCb7m zTjUaqx(IAdf#$-692XlLq2V^n!3<|Jujkv1Zt#TOdY=v&*FZ?D?LaEu@b5(fnQa-! zrnrc>8(w21zve3&Nr1$a-m8peorH!qqO<Fa=wt*VcC-Z%P85VoBM4hjWTK*)M-iLY zk7%6IYqaesYE5Dten5pDr_6T4+UOxK_{EcRbAP(d(B7QdIT-od7hlaaYB`eEU!(De znk^IgdftLH8XR9^`N6f%1=j7qUT2_M*I?^NiCmWCp^M+jkFltu-3(P%0x&3f{K_AO zhze(UZ0VH})FnujyhF4g*`@Qr<HRfPEa51;m~p60PYmT<arf;lo$HHE^8P*VLR2a3 zs@)@hTksF7S%s}Su4prM7n4y7WTka|;SIGUD)(3HiW;q!U#ZKG*^;}~GY`P)^ES5q zLaO@W6+^FT9|BkS{*^(V_BfRLN(KXA#KdPiP#5-te)F$%a;MARxt%+`b_c`eEQ576 z!+ZCu5Bz=9a&6~%r_X)Gy>ItUOdCr5ujUEKrT6|3HPA!Os;_n8`DZCSFJ}p@i#`4+ z>K~zHiTinX&KtK!Uw-N}sC8PN_(GW`+3^F#KW7r7o!SaU39s!5198kS%M}yTf|p#7 z>B9EHz0k_=t6_lYs4)M+-6oF!H;Xo(SB?mD^qxq^vK57;#k$5U^&H8R&p;D7R=-%- zJ?U*Lqav#pAzV;|VwJgEG((yB`465uv$6yF?J~`XN(jtKCMch}sP|&7K&sbS6%xw| zq850{kB-UwQVf6!NodF>eV@0Fuk6q(GSdUrxqj-V+3i&dv6)fSa7RQ#3i+2;7>^Uk zGL8mfiO1DIK5lw_93#k*S}}?gn@DQd4az(VY!79vTo}Hz`T1lVs<@SE<BpY<Mu{Q| z+q~1BuUYR-y?f(zhJyo|jmN@OyI!Z`mhXzjw@nd8VN}w?7PUXt9ETl@#~_Nk>cXEP zU5SJIoQYN0vG7JO5O;<nJdswoc&o^6hD<W=;SMtc?-Mm(oodTcDK8+|W6fVWbME4~ zFsnWDsEVR8Ru>j728yPy_;t>tODs+zwY`rKBwh>6!wV#gjI9QmTEIGcNu?(imr154 zG9>YFl#Mb~*4~Y{Nd&0hK`$24F{H<&aw&|D-33Rc!-N+zRcbr0=R<uGeQ{6o7b(;% z)?lT4%4ze>rn>gtN*R^{-dY>inUp)LT*PA#>adik2-xKpE)wpJ1?y~p6K~h<zGjs> zRl@kr9Xlr$z-Q5q&V}vFn^H0uO#J0RiR9RzF;`oGze)!U%f&tYHSZ|psE5^jC*MG# zcdp<%K6H+FT46}v!z?Ptff}_ftDN8jnEPIIkx?w~kxcEL)aXFCFhg^5vB0Rg%#Z<i znF8@V){q4ctMEH@=%-bV`0x8bart7|2rHxfL-*sa;f=-yU@D?Bv54eSLY@&`1fNhT z*5a=dnW1Kj{<218)b#z_=@?Ovd8IOuiPEk7N<W(?(!_1j=Vopv>V$N)`sEJV-9d74 zDt5(Ii(?`EZ7Ww{b+k}yqCxiYYmpC-<Adq1G6&}I&G^r)M+{ks2i0oc!m*_}#sl<H z`%1MWtkSoVN3R`@KtL-Vu19zn$Ae}D{fLZt4xR}r)fk1e5Z!GV!?r~C9rUg(p`Du} zUi{qLA&r>vf~_pfNb_>l2Q8Bpjo+hG6%mg&EaMO>_^4xC;*PI7c5fXkxHg&1c7R)% zn|uE{!_>l#*cWS$(_6aE_OG+fo?CC79S!1P{tDLD*jnq0k-MakE8fV+*%xb%+*iKB zrmwxi5~KF_vBJd2S+~!vGf=IJ+%-n(EnQ;=*I8rlTyKrZF!C)~Wm4s|g<`BSh?%*$ z7uOlQmi=j8d^K0ud#}C9665ywwaTp9->}X=wXQNZQcw}mkIsc)4P#Q4Aifby6P>lk z*I6eot+!4f^`}=}j8_V{ej7!*;16j5CITeF>_{X%H}?tk#jt(0*)}YGsb!wK!qzL_ ziv$BC&Q_c{Pi)A1;41T1g7BEg6h-<)-8z06^HzKu%{C|$gyV+l)wN2#goTq?>f&Po zQHXK7;q!9kVXqWQh{$p9n4edwCRk6H0;lw{kBbFtAI^C1hOzBqyrAT0m<maUZj3^6 z`Ml!&2BX&c2-xtP^YgN>hhLAi`f=r|dlk<}lsRzYG)G)&=v)zY(nm#)%3jkbfX2z~ z1f_b+Ek<97b4CXq;1gPGQUb{OC^3v!4$%_Q$9b&)in_|(qm!g~Ykse?x&TYDvYKR@ z*RE#Ga>qy86f}d?&hM}QoL}~1I%`^uKyMAz+}uCbTFkMcIyQ<bZlylmYb^}PT6^hZ z(V&ItB#{z`X(c(*c~+p539^q0Cn!a#&A&&(tlXV&P|BkkDePneEt|cl^o8Y%vdoY+ z2v5++qR!P4D_Yr+_tUqwJ2GFv4nsnqe;)0}?&ki7udLmFS@T$)THuN8JnZ-5orn3B zMS`^<P;gkYKW7juv8+o|?mb^(%_^f6Z5xvzF@90U+YcO$IL<&(KF1oE6$zO%(EKMH z?Kvj<MbxVt%$UP$%t%_w^~u;mQu7qKTFPeeq9k49$}<reoUS6!BN;;uQCVff#hsW$ z*;*k^J=X7`V|F|VvK9WE7NG^jX<CUJ5h^`jelki!{==FKsrfr{Xe*mctD4?zfsxUw z6yo)>0)0;2;tWTAnW3)Q1JPh!X9{^IIb%Q-hRAyIbL!5&;=oR`fHwb9H=4RO%$|=s zX6b@|T)pELO9q!*x0cpl3QRP8a{WuM_GfK6=2e`r?1rs{Fa`_>c(ttd^XNjkX^T-Z z9z;aW*i)NJOCpjtaU-79Bl1aRO?W>K|6Q{`q7eykA))cCY$(kk&?^}QBNCq3win{| zCALFc|15jktOnbyD&ksT3;v{c#{0R{nraFVnR>HjMMYfVVdgC25{JntC*Pw;4<6hn zK5(h)Y)|mG{t|D&g4C>--_jN01mdlW9ri1B*VbWYQHv;=vHdRFg5+f0c!W7&cwG`{ z<X+{eQ&UPUikT@AkqK=+BvGYR&63~qQDGr0c~7`;{Ul)mY=Ie;Uj!YmhBnQ}7bNp$ zDqZ0cLz&HBRGu}$Qi+AO!U>eT22RzRAj?=%npBfFnRM`KO3^(=UB#usJ=>!uZNI0m zTsgZ`Lh858skH4C^w&`%wM$j$lpC_~h2zy1m&^NHpWd<x(VDx4#HJlY3y*b)hHlIS z!h-o*WRx}v?MBYE@|U$V1vfedkwlqu-5`NXYE3c>_j1Y{N-#2_2}il8cb?C&LNn+4 z$zjuVo;A8i=%+bUL5fuAuv0Bot~!T!88o9c0XHnN9F*!%>&a(dK;hrI$XHTHdQzZZ z7Qx-O2>^bF4&SN6ujrtVxC9LnfK=vlJjbRj4nt$Wdrteyjgb`G-Dn1+8-a@Z6KT-@ zy#~$f$Q%^?yBub^&A6iJo3(egqo)H!0J6BKRia^ccC2737LQv|F_of~_7)D^amx^i zCG)BI*hyR<x+yti7;)m-`>w@aUN}W0{`jbwo4$a-YZKAwRa_xyE27m1R`(T`ZN7oV zIL8On7UkqlZ$<1$<xL3T7OyM$CcF?ke{07&1Ad!b0ysoNtVc2EP-SU<-qGU8g#vzS zg-b8i3J*NElO9Fiwm1DeVvdf{5D=9{PK$+|<GXe=<!ZJ!A#>t)C--9PNsS3}88vW? zBJZWh`_cd>@(wPzAkq&V2z`X(O2%oC<&wUyIhXXi(uJ*2?YpV=fi`cp_JlFJzMkyb zrP0})F7$@_!pF^tvF}Y6w?=Pvy-QW!pMLkos(x2X)f5-4lG&Ik!Hn?*G>nc2!N3s0 zcfl!uMY)6&lr7^ZG6A0dE-g~}HcB3_c2o(WYMd7;WVZloNWC`!Cp6Me;6`HFWRdUW z72)lu6yU)*TfJ(|{QL_gU`0$Q7-yZ>WMQ5rRI+Yt_vl^mrF+9gzh`CdI6fFF<-I%h z5ZGbw#Are{$2i!4OvxREVR5#gMkXoq^a4BpmX<{t;>s_V_&P)x8b$k>FdYF3JH6FB zYst#O#)h9^<EO0Cr~zf(Zl>o#O^I<6P%=<STq4jS4LN<0$WW6~R2zw+o{GBB=ZR5@ zMiZQ7e$UD)6N4rZ#N{aCN`wH>c%MPFM{x=<jdnxtk=BaNg<9}%{4L*QRExD@!8C(p zhtbs1oUj`rg_2WfvKOTf7M-Sb0!{9KHY3Z>Fo<NGCo%ngWu0gIVlwz3xHo|BX-2?? zdmVGq$O^wSBUR<dHL&}ig-!YG=(sCO6g4nulRzzeaRGE5{pei3`}j2h0%R}jRjBi_ z^zv;e^WZ0V|5i-7Lv>e+loORC!inapBF;_?4P|#$S@4tGX~$XyKgEN$C#q`d76R<@ z`E~1(<(K0kOK|s!twsm`J2&C_%-{91G_!5ha)d3YY7?zscgv_YMR=p1=<l@&TS${= zTt(wWaW35i{zq;#PvszP^b2Q?5yp)8WveT9CHmZytuOszOT`gADT-9|&?%zEDGr__ z8?~iqaqm-o0*tg?+a}~$Dz?(mm=gz${$0e_T4AlMR=;QX1XBSdHr80=1y+isxJv|) zk%ja{#?Z6ZjR7kYE&HqzS2y=RA3hzAdY)}w#NjIo>SOq$*%2LSi}+PeYUKD(G|$Uj z#AVo>g&xHHiol}!CmybZ9rQO3%5W)sD~!G9@|M&T!-7an%C_PixU!V+5)NGWun}FU zdnp$znFCjM6kVzNrS8aq%OWe)ek~g5b;Bw_TM4Q-3GAZSLEw!33i!kz0-0$sx@`bD z!b;<bP<ZYgZz3@f+mjd^b%Btq4&V{?SWLW3Fy(6`khri+0217zQqqIC360KxkX((d zJ_vq{fo^0~M(`d%u5qrNOSt*(xe&pPAyp<_Z`h&WL0)bQ*lo!V%rKyHv8~%luc51h zlrW_wA#qSgE`tHUAirC2=^G5aPuk@J(syn5hSpByaSo9rU{n_FXY=O^$}*3kp2-Ey zGK=;`7gqE4vm#6yz`brbvkvmGV1DOKG`^L>LjF;%HI3}^NG_aN>a_aXjR+EZR<V$X z(SA?>$HYu#^?)+Gd|__xQT0)R$PNq`w(^T0w~2vtFSc}w8r<U7*VdIxe+b20J#Bf{ zxw#b*k$g?G+gkWl_d*L4*ZA39)26GkyEJApS8-?~)5sFG>vSV?rqm9q%6L@I=jM(i zYHoq*?v=H>Dh%Sf>g!#*qf(=5fS*Xz*MhL@jkT-0p^;UE8rtLQR;V{pa7^Q>ZrRu> zFi>r)&@to7=*m3wqZaK=aod1taw(m1Fpaz)xQybDFGI}k;?J<WBGBVf1sK>SW*P9_ zr`;Ak<~`k^@J>mLCvPY{^`041g~wJ2O(?3zd`e?__zXF+a4k4@W+8yWtKgqOVHo$O zaEKE+C~lj1dm!J(fbtYnm~Cp@sG=r5k%*ruhRlA*_D;#iT`F#+es@g^TWacu7-d;2 zWe<l?BPtgP&+3{cd{#Q}rc+2M@}_7i6)ts^{)V)jeduaOw<QXil;#%7#yT7~ehs;q znwH|k<5tl<1>+<Dk6xOxHkT{oqq}yB|MlH3044+}XAjOGtu_EFe`$lV+%REGUpzwg zZWBTc1bIH7C1^lpFoVA{_E9bNP`&|gbZ%SF>I;8ls20U(UZSWNT3Uu>JceBC!Ye&U zMDY$XIVzc#ftL5-GlY5ZWdfmJ&hy)glV4xGbAQLjGtb_7c>{*c8T6jd5eu=mzM({@ z^vYtrmuQC@DnXsNPxTF=S1#=5`qG8{rR<dr_1>$U^$n*om-|&(?T6|cuJn^nnD~cR z21+@6nKrOf28rvGDfN6bb9tcNPbmXr^~#p=A9d2&zSYmybN$4CuH)TgS+*Xi-ASaU z4RvBPUmmOvTATh#UlN~c(8+kAAKuGe8?v}g_k;g8g8vJ8r__68Q@v+txO!84<13v@ z!}X0<Eu*oyb7wAZd}(7y4N%5kQpSjt@u!qAL>V7vG>57;zan$&=SqDmnbL;Kn@ZXG zhO;^De2=wabA4!OOMQc)a}bwGb@o@chWAPXTRTQNN`tsuY}#V<-O5(?j^0Q=vHKh8 z)sPGftu*3Pt^Ot%<ofDEmj`^Chh7@8Ht+X6&ICJX?J%vq(@GekgyBR9nbpl!!f;f= z@Jl3RbTkyXyA-)3%W=PbZF5?^#b&erDiDo6<u%v!0b**q`6iZ^<?-57{4H=xv=^>L zJ{57}3(h!0X6=d4wG53iG68X7Wo$vB;`EAR_iUHP!G3{sY;|+V4nxkm<epQ7_ZjRo z_Oe)cvG4-2*6M0hBCsI@rU@9B0IO2R8<4b=-(mZ%4+d5MQ^hFVxcBBPCm}VAJWU7u zNd;h_8M0m71}rDXBWmwg6EYUUA7m?D6OjhKW7{w(5bSLN-vog?vw*d(rt93va!ESM zP*Eafr6^eSChmpR<huGE2f<~eEijHe+@uI$3m`Y0o;m&)*iT%={TI)jrzzuJJoGS3 zdW;-M4=Sy6g<-`7*r$9?1`!CKiBdNm?+Wds*$4qN4Y5P78xw>uW{9ESr|4|0c>jeK zNV07v{XFKYZr?s9AaxV$_44$*QY~?jEJ{ll25y$7X(=VU8u|(|ye_XgoiITWRumd) z7aNUvBH#esqIeZ%Se0o?RubjMY^p&MqS=l-nI#)JiIbtDD_qiZ*$UWJ3<vu?p+2%0 zdsnz2oL^iSSId;rnkM)#j?i~DNfWqQz{Z4Dt-uAh4`?__I9%XdC&HEF%^6~3e$4r+ zKEz%c_sR{iN3LvVHLhst0ulakV&u$(pWgYA^Fp>n^zL!-b&Ma4V3f&uoR}CVA=1)A z+^IgOjp6e0de#IK(CRX(s|B!OL*N!e+^aQ66z6_UUO=N%B8!1J?U~h;Dfc+cgdWc| z^WfSAd6Ot&3K(chY<z5NEcLb~ZX1F($@$cEcs|I$mRBHuTJCL&4fxmkY_k1#i_5DB z;?16^vTz0_lPH1<5=fe(a!W<`Pwm`Y-hFS&{cT}$ufM2W<;h*UTMA-OV%kn4V!L;I z^tjsrqgoMeSd~D&yvzn1J!oqMANP1F_2ruxef9wuE3!vvX&!@kqUGi`D14-|z+)^n zjEFCtIYrC_FCG}1YMtlFsrJ)RU6t^g!2j(&x_4^VeN(&M^<YZ_7&L;mBzB35)tY+m z&5fgjoew2q0BdBgu}Yh}_B1z|G}qTyuq})AY29fl;|3OQyM_C--MoAEy)6ZYD#Gj9 z7p)8VX}i@_s$aqBHM&iZcg+<?pIcU2Iuhf-=|hJfl6#*+JPJW+v<z|1A_d#M&59wk zb*ZIsgX_0-?XKIV4<ZFy4n42d8c@`#$=B*|(n%nAIquEQ=H8&rZ0gOLn`q4qv~CC5 z4r)8CWvUr1({1r*g_1*LYiSNZx5za?z<>`Vn!;C8@<5A&wucOT_?e+k%$Eok5t_0@ z6&t!k0?k+=b@oz<<uhlYQm~F|-p0acAvzilMom<JxYK?1j74;Fbb(hDx=ML)ueGz1 z1i0f^2dfs4NnB1)d?9Q#aW{x|vFyT<ThBx1Pa*ISZjJ?GQ!)6TojDl%I^6XenP*lm zc5(8bfBdI|Z-m1}T>kaQZfYYR+<Dnk3J(=Nxa%^9-Ir@U;|Hf_rw>n9u(jZq_|9bq z`en{)Ik#hKL;5>;;HiBFo|rv!bmpPL#H|Ul7Nplc_}Vw>^Pl0+$e|7k&YUOqgMx_I zNC)rGQ;82;9JkNv@_)9Mm+fUIkoX5G?T2;vH+n(B0vEPmTxUCUP$(o9s``M=KEcZq zH#zA=w-K059NgpS^hQ3U$s7F!qK`S+tI?mt0+wjG(Fds&KF)`HLZipXu1dv4S9y;5 z=%5vHB7gq;9Qp$?W&O3<Y-x)AOlN<frZrjp<wJ62NdlB-c%$Q4CzVz3Q2p!cyp7)s zXOcs6Bx8|+g(?<<0*dB2AMV`E?+91Jop)xoa#RXs-6!BEIy&d7Hq>IU8&*EidC>l2 zB{w^fnRUON!EReCJVL?3BTi-~a<joVaeGz*qoZyvB%Tchbod1w{txw4viabTb@_kl z@+Wop5nY;z)4$QB*&P3o&OW9GNGv*n|DwZx)!}b+uo$qvs;4r?cNwKD$?yhUTADH? z@(f0GunZlRSxJhTV7u;FW~C@=M_>We@705M=^$|zV&WsyPt6^gnYAE0!8hyM$MsZ^ zae}W^GZY0Qc)#v_KnL^Co7Y)Uhm$%;q8pTSDC@AO!zmq3>u^SgvpOv6a88F69ZVNn z)tNM%rh{~0aiz`*UeMts9bVSq6&*gT!$)*@O$XaN-^p2H04Xo=eku#ZjX^FPud}b$ zdr|<H)<h|sD&NDEUtby4&_;f5?%R@odwyfz+xv#|6Zt;Q2l&_D*Okxq9na_T`Jv6M zw6_nvT_J6`w<W7Dvs#t?qkZ=cKAxZIzkTqQ{FZ#b{o9}K@@MWk*Ef>y$@kj7t@*yb zyLsM~@6LDi^Q1p-SKR3vL3ieUzP#X1qCbLR`l%E+#QC02xOAzRQrD~b6QoPccAQYS z^K9^LUaNiG^hwbO3)M*G`b0A9<h%sRHgJmDN61d8DMgDCgA2j4p$3y&>RxQmC^D|C z!a{8{4U$(_WR^0PAG{OAD7uo@NtKPr_1Ebn;?)mnYSc=%H%tR=(-kRg?16$nh8pm} zS;bb5a(<E`)8Jv#9<;6Y-73A^I#7*Y61<Vdn03(g6_4~53aX7w<A9DaibPhlQ9dGY zsl{c4SPGkf$lR&;)*iPzDJC4ZFsYguC892y%a&xI*d3;=Q<a!l=iDIb$_=8~5`11e z_KP~KHKsipQ<FmjO-<uIctCBBMmG2-YYm_3%Ib4Je3`X}Z#%E9wNOhvNS1T2cAn_A zC7WZ(=7Ui_sBN2eBk1S>8^x6}-aywkh^q6NgNTJES>0HW6Wudb>FmMUruVPdESW^h zrjWcywnWvcwxjz?>kaWHjS;^n8r=|M)-W`)dc;;jm`8lJ#Y{Caq8_o1U@Fb*FG=~A zeYrETZ$Q_tjt16(zg08hm2SXJXk)8dz%<f=+NQ8(lK{!*7IgM{&)VBZ1q5sEAq~l( ziWjnB4`up$-oj-d!l)=9VY^)dvGOHA7{WZ8p+XS@{Log+(U@Mw+eQZCW0;MPVI_UK zInjx`7v(sy%h*==nx8JNu6|`DMEO-Bv#$g@Hmb5m9eZ*R*sLI{L|BQvM{F<v%sb?# z62bR<yhgl~if?`B5T+8y>MHA0H;RJj<G_4ET-Z&Q9nMP~Bpb6VW^6*`nF4wtRB~hO z%^i|;eyuCm!mEV3y|5kOGY|c2Ju<)g(Yb(77r&KPIixqP+yqF%h(Q2~SzsRqBN&yC z-jmIXx@UWq5PGO*(Yl+-Nq&j6pVdA^E&6B|CMYPY=K7tQq|{v<U>Bh*+pMn#OG<(w zrB27(#uBMe=7#LJ$v{GWCSd7x)ON2ZBarK}$-SLe(~qmUUlj~!5(L(phQy)A-pG#L zRT&L_ladZj3_Cbt^uBOYquWN*W$7lCA)|Y^ywVu7Kp01KDF>KfK>Iq5Rc2wz4APrr zgDENv+#3*xVE*ggkZpsNd)!2`K^wHXUE5do+zvj8oK|XRVmMozIHjuT=c+d3I~<{g zbzs)lP?{i?=4grdNiyhIV$RNHD(^&%DM)7KKHN8`rWsi3k}^uOZ1>2r96>sZ$&m}b zmvs_+4+o2!N1#H<0fMW#yPXQx2Z9f)n*xsNX8z02YhTV}h5(3Rw~_!c_+M0L3`%X- z44!K4Zc|Yn;0^TO)B^B?5cN|z%pr;Q%2|ceI?-Jkv~2dmd%Y)erH!S0sTT~`V|V*X z8zA8F<=#?%Y2a0CJx=r)X50Xl8VYWs$l}+tQLY;#N|jO!x4aZ_FxO$|8^nvD{2-YP zG^uncBF0^r3?W7&)5KM7AF;@B{xsUqBr@TS4<Sw{?^Apre{X#B%;Kmb8yPycm1&SA zWZmcI$IdLGuwo-wxzLw(YkH-06eZ3fJ@Xb)D%Hc3bg77)$)YK7G~3oxKP~m7%68Sc zdJ2~w-o>?P_^jgb7ax9j_XM{b{GG;>_dJT4>I;Ok#^87re?Zh`SaZm556~J0pEdmy zDiAZ$6XpVbTCL$oI(U*CA~I^ORJGw1Y}O<w9_Ap6i^kmxQC?WRNQ7#{K4zj9cE?Ik z0w0h>=tGRQ(reoU=xK;_CT2j7IsrZILIuCu(YaBnLBeuI@AQ#2HO4|W!Xq?_PZdaP z9R%d7a`v}rH|RDvIhsE6bHU-)_Mih*IO)py1-IaWcV4pVgbn_6d`*|50wUD<rZK6n z&@aF@GIMv%9BiT6B0Tm3?9?VamML`*Iq$Y==Tg^Y4BEgq*(zoohShQjtkwfoyA!OI z2dg1eF|5|RMAEG)<{J*Hh4>7(nKfM2Z@8@AaM^%iu|Yd-R4)6uArfs}0rGCTDqJ^A z!V=CdXE3M0l!QAY*MsqV|F41Zf-8cZ4&mMG5T1aR5zdX9_a8Vo{r<zVb6<Pl>z+J% zZ2#Q8$ES}ScQD-Y-3YupK;I7QwLx=@e7Hax-4-LhF%aIcZEtC}8-4NS^3GMk_p7E) z>+re`2I39k8=Mz<o)?@KW-*ju>`@v!DtW1JqyD)pHnkx?NY{fUbKrI6uOp}%&hwa1 zvA4zb2_u3z|FWJ5DW4@`R-Nsx9QGIz<C5sjZk#B2(=hCko|iIPTb@!P-*C(c)2=+P z_Y6b#SUtkf88Gzsuucd<yhNg$tL^IlLb86|OV<7G;=1D}oF(e5_WJMp5*U69LqQ63 zn+aP2|4ei8&vme6Ve@2|-iUxt>49cueVl($6DZTZ4kn1$>0tfMVEx?RWilgwm+2ZN zTvbE~aBrA<xxdYH4gGB<E6O08%7`*ppq0@NO)!Ghh}K)VNN#qlv)JVIPJ9R>OU>@Y zW-$5RKUFW(GjFjS{4+{vUWj`074<^|hg*oX{;*{V)sSkG8mNZt<JXwZI?ckB+Zm(p zXz#o2OEa7iTL35^f^A%D=8sWwf*{f!X>2wp2Xo=@MHu#aO|4ZUI<mFf!<M#xm1uS* zPVH~Ye?CGHfz@t;9OFc7;7p?WFEn~<GNx+z0X0Nh8pd>MJ~Mc8-(Y`trgMQisUOXt zer&HN={2Lryg;q3oMM=-ii-?QM2$I8qu9cj5>WjVF$IK!1)ii|TP`c;fH&Zm;^QGB zg{%Zv3@1ld{ODMG1j6^GIbk7U%gmPDaJQ@7kqtWvGe>8w#N@lqFI_2&)@GGsAHscU z9&&ti-;w<UfluS<g>$6>_Y3>Zm3CoM8KP@$DO`5qk5^@m@52y1P*hB#8e!=b*4)I7 zAq5%M>sQabSLaB)9R28Al(y|Zc@W3@4*=G6)mh#dl9fM-N0Z%(YOvI8Xwpf3x@Kxw z#W^&T6^eQ^u};(@K-B1WHZG1b31TeteOiNUFvoXl<vFq12#N<%TyG7#6tWxFA^CYP zjWAfLCKK)1Fhi$d2H<qC!}ugcfnJYy`c?`-JQxF2gQ7p6hHqCV*OeSyQ9m5uQR<1> zEzP}%KqFG5wV5W3=EuUK*o=K`q(l+ZG|J1#O;|!OxY#MW2WBajYv+PZyjc6!w(i4b z6%Y?v5(&0fxR#<d<mkROWN7Pp_ustP^?u_EJ!F~uLZ4X(VG@0`6)th0t@I?OSrQTH z1nXT+us+c>GmBtdcr+BOYnW^)dqd^~;nQa2{-CCbuR%5Onhk+?xMop>tt}T;ec!KA zG^0#*?}AE8{zOwPrDbZW^U0|$^_Fs_o|I&`FSx`f#ZNLC)383l8M7~v?mL|Aa3HZ8 za~_M5SP_ZWd~HU(1j`404Ow9?+X-_S!4t0noGg9nnTml_1KSZt<rvVg#(nbQIU->V z9+m_OwRGHAC<?YG**h!98`8l`O@<OBXDw$>L+drMT?Csw;%m2bub2|f&xdxCyJY0o z5{@=x->@Tc#liTCV{`JV1=7Fbb0A@WJ$2h*HevYY6a0CdZfquK7$~%gOUeO-Myyi% zQcsd$Pa?xQCr;29%5pQpY^lMCnruT88{n!?tR0=Nn;{H`0HeNY;Qgq2Tfs#4$us5i z-n#cSupnXLH58R#9!Cd?4{x|(3CpsOKg<of?nugkG@|HzH<~-^MiY|@W-i$m@$sQP zNLHt23GJ+FZ5FU?c5g_qZH=_sYa?eLA|zgQ<D=8F`}qIZ^z`gwk4-0>8Z59!ilvU; ze9GQ*sCxYAvDAI#aQfg_+>5b?3Qs@%;IrHv3x`U#;*V7A*t3^olZ*BhKcyxnD~>qw zgs{7*)WW#Y2)MH_6}x01=U4W`b=vZ5b1DPB<e5PGY2U!a7`Bd#>tvgext@UuS1ZLD zAac!dyHoqZ^>25gf6*7$oNw}$B|!z!s?@h>T1^w(G7o+MMEBb+fcth7u6qrbrA!M7 z6Z$d~_9!PYv33>t251Zkza6upYS3>Q$tF^5F=O(LoQ0#pnS`f#lU6{uy)&{|yNf8$ ziKTKE%8huf93;51Y4C(SVhvuS-xibK@r{AhI6A`Ui(-2uQV)^m4}lwl|4oNB$n!UZ z_QY^FQM$weassN|6z|qG<O1TSB8}fKa#7D*&dLP{x1Mei(~8F9d<*H&eRB5C=+5OH zTz$;thbxk^S4~U82<Aj9+Be8|$nUkATnTyHb~f<0Uk*F<fwNt~4DLVO^}O6csG%20 zP#-a}XK)7k%!QeHUczc*L}XN`Gb<|bl-h&4E_%qpQr8~7;cu3|nfjnf@0BKA)GG3W zP<k)bDg)@uryBVXgf#jR6V&Ut{CIF1`rwl~SVSPpr?y>}B3F|ckDa;G?{OEePYDbI zB|2{8m`i0WR*8*`$!XTz9|<S1(N&o{$01l~bn#N7$1`0`oNgf2^LI75<D7IL>&X-I znw-U)VF;2baIL7=$bz^lb0e;CCrwOyf>5^Iu`a!=W%|Ra&MO%TgRMlAQRTc>d4NNT zh#D{=N~9C?a%m7Us?QNoP|=p5;zZ6A3Oy(kHU<yzc~O3Aj)j%+hYgp&lJtRyd%=L_ zs0>jZ(i4$*8DF5PXJPky*LK^6UUcoL1{LPy&W;?BKl>R;&Lf&?2WZmZRwPw#TY}3c zxmrqCS62$-SaXL_Ev*bsCYg(&L)1;xsny={AM6}eN%V9D_;+sHp1e}SO7}1-@TpkO z;3s~ndK&G=ER;hi?KV3%V_=2-SD-A;I62BLuoQsEO7#Ko_khMA3Q$rw+5LpF5i}KL zApxu>Mh8-!^svehKofKYRkIVgUoM)B&WfzPU21}`o%XS7s{{!s|15|UkwOyPRe{8W zER{`cL%A$cN4O%RaI;~aRPij)RJ2Fu&YU`JVeBlgX(*9!q~HAfNoL0vXsvMbn2b`% zu*spd==9BQRXGcN*<2`bgOn^bo^mi+4XhlgT;i5EGbO28l~lu%OCd>KA!YKZvMEs@ z<3z}6SzEPQi9QHTRG3yn$OBkaski6nE%Hb*^awf?7n;WEiToVmXq&AGOyZ{d9b*+u zo68mK3$ReUgH{HFPEw_AmFuSMN(RlFJS<>6YsRpNL1wL*-pMr?!mw0g^0Ba0`j%s) z1;EiuK~<Q;aHy<!D}qX;T*BAJdGUmrEY<C2Y`Zo)nPnDTW6VM(8buEUW)(nFHo-n3 zpVL&i#;ZXjX&arMp4OkzbU+*&=S_#Rf=jt8m}Bj+RM8Md)TUO&^%TaYC0Huy5a>|m zpbaus86*BqG*WH_`)%vS%J(g8C=s!YtdVe7nuG?CyAF%pc1)!}UO8e6gv-VjSmb@J zK~3;}VWFmVtIS*P;61|I=;2y#h8nuoC#TDo*8ZaMz{xY!d7#en`P0Rd<?5M*<iNo? zO&{NP=nw(5*dK%fdth?+yWZv6Q=mmkUW~sG;VE!z#CwZzI=5WBXm`rhh0v%vZn|<q z`WmGrzMfjc+I;2I>a(U0Ua|7xxs$8Q>@JJnP+7oGx+?wUnIfn3g@i*p3hf($WVLG0 zL!D<asX2%MuzEgE@RN8DyqSL+DUgyJYw@M<ow?w|GV#!(!zVS=JV@Rdhd<V4(d>_p z?j+FKeeb&e-48s7NR*XjcO78j;Usqx9tTm~hCAVYy$29!f0cCEE${X@l*91^WZS!M zE_d>_!f9k4&aqP1C0u?|5c??CVVmrc-*A($Pg3}OA(ilv_p}l<P<M|_;*=FNcUytb z#2{ZD$)vw9E{q6tGgRgL6N!JV6)Al?VZbdw&bc#}1Q23i5HmZjIA8ndp$|NDc;Egb zN#_CvnT6q@8-=X3M6||Y3`E|XsLczN=bcS^*h#aRw`FJFM7Z=}l3co$%{Z?C5x@r* zOd`ygesr$iE`BSbYSSFiYaPMC5@PIF1tEuixyh4-Et7bLJ?N|Xdd5GKKrp3M=G|rE zsCv*eJ6&&nWys#r9q4)SQ#kH-pOrCWFTnzGXFGy#$9}5E<u~K*2KPMpG<*QIR4X}I zQO)&}2biyd&yz9OuJmRV?!d~#s0BV?qY2uFO1(VW1m}Y8xrE+tiE@^Dwsf5B!TtUV zR;OI^zhL#aGnMVmcvD~4)dQss=&ZT&7F;7Mk5_MY*R)&jFXFbp`N|gEyV_~*(htu= zj;!2T8VJ8{e#RHWeE%IK@i!x6y>oV9BLpDYd_|!_MhJ?~F}E4r{B7vwZ?OOau!j0) zp{_Q2oxIFRH_n*f$b#lQ{DJAP*}j**6^U`{9nTIcr`~IfL%_@_pYjE41X3YZUgt#; z5%niYHOHQaXAHib!#&tO8>^5-_ea8NgEbMO8K)fDbBYK=VCKDVQL};{7atYt%+;1% z>9)k2U+sj?<>crWvd2Y)v8Pj^jGbx0QEyl?ZZLBKtGY!?AV29}G$;*~0seKd?47lN zIqB58pT4W|?A^7VyDB=_UhCB#cba+TB>p)j2oTrf1OcDrtT7;lWS>lLjv^g&CIh|E zy~aR9)9P`fH@cJr;nMNY1~qs_+-44X|1eg3VnO*Ee3u5P$w=>u;!%5x6;Ea~HqVtS z!0+-ge047!6LPl3H1a|DxHH@{E%>kMvz&XiAupcuxHp?m5H`~aQWE@>D*LRO(M2=F z)Lv?I8wnKroF4sz4ko#<xw9oC<?0Si+cTU<a-rPE`jx+o{2cmGVfB&VNldL6Tz5pe zLFipGf5`0Qt6>yG=85y=%$M`oj96gKa$R}5ucx&EO=z?*)Aoa~yRighFCAsabp(5K zyuu!lErLRbRmK%A%47`KwMfQ5Sh1{ZS-6+I(tVYDl*%yaEgN#|tP?F?WRR(3N}cbP zbOVV6G7Z^*<}ddMk}dTj^~hHVj#1AMssz|t&jS%Z<;(0jo8#Pnec`oI=5jA@bZ=FA zH}Kw1l)AXnvD6<lxGz}RNPOAwPX~ZBTY;Zh;OCckj=W3u8g)wlcxPqAeQEEwp4k0h zt9{+e{i)VIsT3!r(FjQD@{bwPgR`~;Ck6v8o+e|-Mi*X*jqX#y>c#VJ>DV&U`UyU# z!!PLYvpW2Y4q8Gafwh(PEh_HQ)DTGc5`2fA|L;1O{KdA2uyiH(QEoN{G1Odr;XoKG zvYmY8q?VxcxH8tzA{=6=^<$zjl##qe(iS;;;oilyp5MxE9+$5y%M+)rL0eproTUZE zMacGfs;CVm(XEd<*M+&&oerS;s45^4Gub*X=apAG0M-a3`OP6bo5vBuu0ePDn~Ts) zc4dgzGX9wfFNN;1HYurQF>r<vj`O#2CkM&-Ucp*Jnd-<`M-V|t-6V%&P4nyJo_`_@ z+8bTOwG2iWT@-%b#f_#xZS>jrPgj5-9}A&!2OE~L3NZx4P%<Z7{6Vdk*qL`#cHC8& zsO9W*B2<kV===%Q_rsd_&+71#n)sjQ5L&YQhHf-TNcGJ(s3G!b=m1s>F^#z{;7YE) z^R^7l>i6)$nl+J2&`!39@wLNOA>Y<kL_o~Mbk2orO}h}a{=ZAKX7pEQ_P)XU`?f8p zLCGHxW%{WUI3$H@F*%k{MQ4M(yjJ_xX$8Ous*}nZW4=^rv4iKzHOPo@&<=`b<m};H z@aInEWTCGjIfYl$iQqNL71@OX&WGPi@KTKFS))>;hn^e1K8p$Ik<C4eh-am)Du6X2 zu)3?cD<Z$TjregE6InMgEW0l<&2MCdT|q#GSTzz3vHmM90b3ZK*O`HzFL36U2>46j zp<HcVCYs5s@p>IG#IcWeBgC<`?pd{eQr~*rbGBt>Bi-{1uO?@<oGo`>LCK(4Nhf+z z7TWp9Lc7=I-&trAA4>MwCpMTcwV&NR6zrzZqV_=>VJeH73H0{6p)kjVq4eS+o55Ig zGF8~$MxyG;C&{rS7HK1C@}|>-rX+_6FD$H{S~*ig?@ESFC*LV8pE+50;>GG|Bu|BT z*gcoFq_F37wR*nt&^`B*NVGF`-d>nm4Nl#2?>&4G6oVJ<3CdHatLK*Y&d*I*bJ2LJ z%%~sbOYqM=PleO=8g@ZQ>tskJFFBi^AAjVDJ$hrW!t<ifb~}K=u#Pf~GsaGmB9(*Z zX*+@~SDXQO$ut!vXl*sA;sC%}!l)Tdg=6~DcTYb1$TOw8pP725v^}9EB|%X+er-(6 zda+y#_C8bk;C+`TCUs4Kmg;G4JX3na-6$1b^p}Y^BXG3k#fJ*v7$VSHIJ=5L3h^ag zAh651doEl=5{t=r<(}R5zx&<?AH0WfS(ByJNxbwYZ9z=RT7A+u-AQ9-Cp~vunUr8) zvPi&Y%Zxl3uM(RDDK$g>H|+0`5ANJ?-{tXrN9z0b*Y`id)xDP|#-G|(f9i1k@FP$8 z>qAe~4}GBifkzIxYd<bf(bJPBo^?=nL5ivHN9PeH{ZlTIcoa1fII)@~Cf$eYos}Jm z+*;}+RW>$sAMNsLJ`q$fnzh@jeMFiwRnb!KRoxR~2-7&%|76F7AA`jjSQ-Q)zw9uw zl?7JajI&Qz-pd_d$D2<Pb=K<bT-r#@KP1dM*H?wfeWf!C+JwCodup|=<g1%X-C}I3 z<N-5A^(Hf%zR4KX5i^;-S*+{aW;2}LVl400QZM_vub2hd&9dAhLAk<AOG8WYp!rZr zuONqJEzibsdAXuFLOP_~GS8mViV*oe&e|t7){4pJS>}^x$R2#WT(%e89*sVKvs*RX z-;!&4!M;`ui)gvH;!SAWK6dgJ6YTnK$vT0sl<Je)@%pm1v%OE0t-Wj5hre-WD9rIS z6d*Jv{76ZDW`)%D*&hVWJ_Qrd0Kfte#m@qG;00w4s7k(8G`XFHdpdT&2jq2p;q1)B zEe<&eJUiqR=N?J>RW*8iqZ-}T<rr-R!eS)h2+D+PGPMIKcDso(yBahG{alug9jLwt zSNe^rN6cV5zR%RjjSa=hV<Ni`BlvIh6e~w$#}el9{cU~P(Bb!V_`h{%BBq2TKO;;h zl-H3{US6?k=Ceg&j~s64!=m+|n4KS2AGYebOzz9lS>k3MvTl4+8?>R0&}*76Lo*oj zWgp^#O`7J&Mq7B1kRyX^z{4whxqIbNzRCp$;m`<Q$@OkRR%WmCUS$hPzkQ{TyJ)t9 zOZD894OctRSP!A8?t%Nt!`1Zc>A0}S2F4a3413$(j-LsBDH<*fTqEajPhjffU)G&o zyF>J~YH%BS8M}ZrnVC<}*G6Y47!iR>5Xolx+NjOn(-hpsn~rZ5%Ob76_~m|>6POq# zptjKsaC_c_l4FQ^kc%7SP2LNHHJ-$a#6n&pGgIq1Ru&Z>k?ywsn@IQnMvZ|jxOP6` zdigKZM`zXGX?7M5)cQcUY>Zq_QJSKkg(>v6vdrPNPMCQ)zGP@E@kkv$08@0l+{v@< z;Jww{Yb*x->YZ%ccV><HlGj}Ra%N@lBOM<>u!mi?UBA`|oeK2^oX!_N%%Db4(}kIH zV8z1?2<Iy3S-z}}o`4Kjx;(*WbR!j`oCK-uY2+8>$qv)9A%sSwO#x05D2Pr7g>fNf z1+hDi(B1*3i5noRwz*P_x{BK0Mpq#itOVk7qQwd^jWhnt3wKXEG(NTck%@<tKamCn zqkB5{X7=3Exi>-c=zAB+D=K9w>iBUZRL4h8?|SGQfr`-uRhP>Y7mM2U`8HPorj>h6 z@7f!`xaS@&z55ui)h4~zPdZJtha_B(GM*|+06`aQEOwl&J=p$3;5_4Q7%Eke0Z>;+ zTORu+Ek&(jWrD|VrsFjX#DOM%#jS}>q-vJm4W6bOIKd6VuAg5{2si(NCAF!aGI-2x zuiflcKV6Citf-o_o5LTSYZqA6!<=XrTtVFHns8OX%&N~gV0JSf1b;~RuV;dP&mRYy zV)?3?FcLQbmdnsX69(IG{6*;ROD;paP=`FE+=y9pnb4BSYEY4`lYgWNO&+Lb{15H< z0!{ANAZX@Lh|;^q=Ll)K1~awZXdEb*FFOvJN5?>0F8$|uo<OPpR&@%KB{+8*gf-cB zL9qW-ZDSZ@Ts(lQ@_65H|ArPuZ*BV+7&a_nobzoKCa$NHkL+V)E0a&y#|#8Jsi=52 zrP+SG7GGC{<|~z#&mfluG{A6OxVUODR+Egmm6YP`1ZrX{*_gTvO=Q_flU9_;g*gxD z9t>a1LIMhpn&V1hV+V?kAW6ZM5w=h~q$?<TgD|m`1u@&w%SM6*z@ig6yYCTPK;}pt zt5le9ITa%A!~uT`si3DbG!P0m1|C+$`xut8`XSjl+CL2w@Bu|?8FLQ7VPByc&-(DR z_EOZ;LO2MD9eP?Y`S|+|6OWU;FQZi0z6c(|Y9`7^#%FEQ)HufPWZ~rMDmqY-`^1rR zk=HQ3fgcuG&CsI+g$<Mr^8~sWqRHyKdu(cGF0NQ7k2&_10a~Y0EgEARS!t0aHY<f6 z<WSx}*cV7HMELI_jfrFKrYc4dY;)r0{>`qhFv=ZGb5j~`247^d9e%(I5AQAbWW<S? zvG3KKc)Aqh*z!R?8EN(pnBGK@cKsv2aNrQ4cM^qSLqGOR)jYg)wqj>yQJ@6_6>yQo z*#66Q<7Xwe!Os^eAY~iR(s74P$3_#90*87pRLC+{3>Hp@uPj%VN{fY2v!Ib7P&kOA zh01biX>lxpfyHnvmoLq=spx|r#2h9$oez&)zT8rITtM4KeDH(GR*c$Qj9$Ln+K|eH z<#vr2RU0Y`HUtlkjkb2)eb=_`)&X!N!{}%jsCsnN@3_Rs*i_iSrXmzR{q$I}C)Sa% zXXDr|P0xK#*LlNA@C}OE<C_zHHgj;cMb|I=mXX6VAUz39Aa^q^x|4HPlP0*bvr3?U zNMr<&o<!~uiCjnUis$&=I-07LQFx>-$1hdp?fq=a`;<PHm#6J3IwKiCsrwcv9yIxo z*>n9oL0!SwKt028u-?USW4)W>P`!uarg}E`57ptNoA@1hRA1g)%2kK2Y<>+94SMx0 z{3Rv8EfS%iu_nF1?^d_SzTo`tm3kJtHtUP6D|<>R5pl|TU!u*r)qVT%&hxj$Usroo z2ilO{vsvCb{~F$YOIu3_U$5L^7+m7leD&7&y{#Q!^}$!VoGk<ze5?=N-I1Xs^)5>I zm@i>St*MhfU~~9Xb^|}<pKh|JFcRTY-}b?)ou%O|>et)+n~aT(2jTU@cM)n0U%8ET zZ{_#qs~X#3cQyBR>;`rs)Vh7?9as)zf_Hkcmgajz?;zNUW?h1<mCREe)q<EJO1YzS zGw<AC^^caAg}H4d=3wql(+F*ysoiPo(xA7en-Q1@g1As*4)`Xh>#-z+5aN>gO}kG- z($)I!s*FGK(9_S|RYBBmmJPL`=+-kU&jh+Hbz?1C=fzt0g#M(6VOD)d55M>FYd+an zKkT?nB&({C#9|EVrtM;Nu^Oe4(CU)qhPR7wKFm_=(~f6n@Z&d~!p~DO<`D_}6`1Pb zgh*TCX=4gn77C|DK}&>5=)S)jAq-4y+`yEF)R7n@ChH@+iQq$g_D1JKtw-IHZY=Lk zrY34#;~cUR+wZCbza_HP0wByz+~p)sq9Pro`!hOAlkCACs|&r+47zwg{n53o30zDd zYp5nU_!E7yG1+Uq)dS4c<3>INzKy{&NzvH477De|Z1f%>I>VvEhh`2ma{G@G0QImF zL}`@WxSFisv+BhyjBw*-U*$2_B`ocpaKg|)njRCG1;3-S-__w;^wF1eFsIWmYJxDJ zQNTBo!u&_Q^q+P33l5Fmi1-Tri*BmR!C&g|^*Y$pMg|OzXjbc#jUWb-0|{Pas-RzY z?zG1`Isr}2w8%18=<mew|I7JqSR1?A%vFv60MaUt{9T?^!ZlB25TT%=w|d!{<ZF&G z3Z-eao7=9Wg;43F=B4CmzsU{6)#!L7Rl}zjt?!cJBXRF)=KSrY4zqc<PvUI}uw^&p zZ62_6z~&))B`0|rPkMr1GV29dUG;7-U*XH$STS^0Nof-N61%G#%Y`dE?GLU9yOgl` zD&;<zmE7&hfXUoOyv(ip${?v)@>pDSU-*Z7u`&2ewe!jlXPXd^cVF$Y8i!RQZ(=va z?@f9;l+jJ(XWr<1=8eu?7kRg{|BcRpi7XL#tHD2F?rNE57WoZo-Orrbvup3fNbsLD zqqd!|>TEmX;ueWX^d!1-Yv9jx_UAgp5?osnlIB^^T(^LXi~MhTPfN*`&NXFyxfgH- zDV}e1zfi%ny20gwcA7zt7=-*PP5Y1*o7&jXS<v!gkzo@<Jc+){AdAEPeJPhizl|t% zNWa9KO)ZV<5CuL?@i!<6e3V)C1`6KdEg=k?GI$aOZ<BNiZyB+GCPujnqiy(__%c-Y z8|0E0Frn_ZjcVI*Et%o>YJ@ask)9u!;V>>SsZp4d>($&Gntmvz8HL>qepAyG54r7h z+vIA;)(~{Fsoyy`-9~XA?zC2~7{~Rq=FKbST3o+GHpMT|mNpE(%+JzZF<K{1rC-<% z9^LLV^Kn=P`4`}wMjVGQTy@N1=-rTuOO%7jn=rEcFJSMyN>})tOuNq$%*GP0E+czH zYN_I3rO_E-PawWvqOI!KC}g026``Ic8ur~Xw|E!fxN>LQ3orZsBgdFEg9B^}ogYlW zbgnoVrUWWUQG2m0!2{MARb_XF;IiOqHg(0qTBgJMST2>B)#{;@abAhpTgMhg9J5qI z<B`d6Q_zjlS#05#E2Xnbi#sa2b{FowZ^wJ@*tTQ$u6rZH@;1!Sm_C!sg!@uw?qi+t zz5Y;y53&`TF1M(F#mN{q^I=ZXDqz8&*q4)tLV)vXcZryb@G;=9xg7SsvU_{4DOh{3 zCYHLj2isrWJz)x0uJk5+iZ~27n38Z@pDAgjG|us^%Ide;28;^M5$N4$&_z$q-hicP zVoF-=O|>%$rZ|#+PHc4w%5iia)^%q5BB<f0ywCBhk!J^6!A=)wc64S|*UltVgpkGR z4V8dj79=zSykFFrOl{gJ0Y4|0cqbKmpHpxV_~*;nY^$XvVMuO@I~ozXX?>q)bP28Z z@mu*ghXj3+3vO3>M59C)eWOHVm6>t2l*|jX2(*e}oh_v96#t10C6T1e67r-kOA(_^ zhF_6*4m!r{CuJ@9q1GDs%KM+1{?DR8_5?OQF`-~1Wut30j2diESUc^WtQ2i-G_Mus zDvF(MjC2g&2+#jpjqR<RXl$JsVh#gDTs?^*1+EufA4!bpbzt>H3cEq9J|C+0%r0=& z0@xrAaJGTYyl|yoQK6S|DPu#-w0@1Q*81)+13sDA)Oy@`q!F|g+l1Y1{A_gB!tQ^r zagjnJiQNZ@vEQGm4JXDU#P3}(Brz4ix`<v)`oRREziIH+zD*0NEcvt5UsUEfN!oG6 zq^$(|a(<Q5YiR&S*o~#3(x%dI>88?1>E_br(w5TJ(k-9df|Km12^8L5x*g)6yR@xT zDBXcdAa;|zGkB0{ir>i|HEVB#god*P^J7cD=vIu~rwWA`tgs|04=wy6pCn+3#e{N- zg4o6E6i%4uSebllqAOQ{-gdrcP915cf|XU$w#T(eBJT1>gOkt)DE)~tF%?&;6y`Jz zM(!CYPz(j=37S9@Mxs3J5Kq`39z{IhDV6sKDN34b1<^F*>V;>j&jin`AYZ30OGxjc zp+rQ4_l<Sq;2m2Xsgd+-J%vBeioCwSt5kxcXp{=xDhs{lWGXuE2H)AG)UtbyKe4yg zy=Qj%(Y;(8KB(iqV>%w>Jhx}&QN1v{=jdaPPal~({>1dY17tlo_O*L!Z`*U^=*(kB z4<DMInft)eCl4H+JAUAa>0{HgNBO*W&w-h__q~65znvcOr+vC>W$dkS?#tU-8`(4a z_^|^ACZ9NPY%;!k)1HGz-+!#>=J1~5hn{M>H@N5Ep~v2T>_AxbO?#er|IEJG_fIRo zNO-fKIu0eS9-lsREPOV+=fr_yN9UeAw14*T@LtcJ8Q1sRo+C#z1~=_FwEw`-$Bs=u z@%W*A{;i2EF3ZW^2+{mH%RP8QXaA2tNcLjK^iGb05A3XUU+jEf=Yfl&v@ibbhjxZ1 zyTX&*;mN(>$$jC;yTX(E!;^Q1Cl7=t4~8ex;mM=^<mH3@<Qx3S=RUOajclQJpf3h5 zErg2DnGq@yJ~WG65uhPzx{}4w$_1H%Eq*nR@G0j+hzg9LXRyj$uOj+e@}fn)BWgXz zd<k)?9GN)B4S-`G#7z%mOw~lH8z64_xhn@M-ThcS>#p>s5iJCn{uC{15tXUU_wsAT zC5XyKoTCszf_AP#=&So|Yd$HZM<Ab}cA~F4NKX<u3iWl=?y%P*LZFSrt8Kd~YL@^o z?HW=ZTEamftZQ;#!p>Jfv(ant1RY1kwW|rwN+h>U?b3ph0~0);NFjbZCI%c`rE(ly z)y25D>>;1ky`R&YU(%V8PbOAMlUbgcYGhuhv?Zp}Ql#6}kPzYLItwI`G4~h8;B%C< zRC>_T)KiYOtVKQbT!VTN)zpRWNjLF6yCd4kWGc`_A?+kNQ7%C}J^JRTCmYC^dNRVv zNT`^4ayjLLZ_yZkT4QXE9_HgApN@6}({7F5X5KY|3DJn6Vn7&R4rRpBMmKg5orDZG zqZt+1ZZjT|2Z#jG@^=K#0m-B~S-t!tx+n5%?dXqMFkcc4aX%*r3wpg!#))RGb^Mdu zErTNqe3|;8YWuMr8B!cZH^?_6uk<UVT#=VYS7UJQ2_Lh{<Oiu;q=l`r^jjI{kY=B> z2qflnA#lh}AvUK+up;;?J`L^cbA0Yb;s-T9HdygS_@eH$quw-j`!q=sfNPQ@4y|oT zH#Y(ZuXi`kf{p!})){Klqbi-{!LSFqUQk8JAMV*tWjBAqaV&MF)7MBiiEVv1^qVu! zh-tCDKpV7HbdniqZA;H9281ba<LC$rtIHS9S@y9w<Yg3u0{bo_CU6<QNS<`rYvH(2 zz~dYz>XlQDph#J?sYhzLehv0D&6+X2HcQ{i8?0+%2-Q+IO9yn<N96COZNvgK*_J^= zV>mRlM>KdQ!(wV`H$ApGySmT%5lzWLIDEX#dUL<~_-o#K_zxjFeuX6il;{eca>?v3 zi#H%qNWJ5V$&r!N%3H1rsPdHK$mBuC+f83b9NPA}OqGo9>JHQs7p~_ET4jI3q0vL; zO8MD`v6W+(A#bo|Nbx1^y-z(==R1(p3$FHe-pOK2^%?8`C*&fM2C*pybw34!&6cR# zI-Vs9ow2DB4mc)N_YoezW+J2(1KTafDj3u5x&=cf5N+*kvxKuV(G4Ow%)wkTM7NHx z$g+M5Vzy^18$F1CD!kput(0F-lpz_AHg{cM>x8;4z}7*B1s(_Kd~GB#*)e=1)mVE- zXd6)jc@0RY6?jM$YQqBwyZW>F-UU^j{0SG;jYq(}onndtK}Tf3Oau`GmoA_~HHzCO zsR?p1@fIh`#NIRMqnw&70iZD?Ndc#(+_NTYO64pA;==_}mde~kKg1NF25OR_jcxAm zuI$%apSUkh;;JP%t3Ah3Df;kHD^Q;r69QF*ty9}Km4G+;OcwT}S6C^GAEp_{C1S_o z@oqwvOiz#T7r&M2(M3JOIx}hfp$<(v6qTd4J8@vu$4qD^%~PRB?Bd=fqT>^v&p%D| zpEs<MwNa7?yEJff5<MeV*(RG0gj>Tj2=Y$TkcS{o3&MdsqsG=kLNBHu-EcHo5ui(N zdO^B~uF@t9H@zaB2b=4eQ|9;EEITrQY;db9-oH+<v{tgD%W9a&IAO;;04Z)-a$Bw) z>{bJ?5EjCYyScyB3+>JCx3^PzZT9*$8wwrs9ZYUB){0x?)|qgdX}Ptm2n~W7TG_!N zy&{B3WO;(a9K_F6tR>_)7!oQINS=&={FE9y60H~C9$PKmT~OU|t7Tav<vqHz%!$f> z=_YEe74+e7j5SdsmY-&&d|+iQ|MJudI!Woo)kn7ZN+($Geuo8ZE!_#$!{4@q<pJ4f znxvg8<Iz_cqUYJ0Yp*<l@w#ykdHZ^oLz*$oz19l+CUwlAMx__%C)1^l%2eYzczx?o zL;G?#Mh5x27r2%BdGqV=U6fNhe0}RM1@ujaB@l05$l0a5^$<z+kRe1;Q?COeeV4{c zt3>OmHUh&6C1?=*dSH^&lcJZPx>zIZ57t(x^J+%d&8sMcR?hgl%jNgH_PY2dYM`Ur z^JFd}p2E$^Mqb~l&|rLfYE`_I(CI!(uRVHwtHMKrXg#b8i?mP;7F`QFwLqKXN>KBz zV<r64)Jhn3gM6Kk<vFT|U_?hN$G@^CdaA5gte7nw4uVAYv%%MdE2MelMEEQiU^IfY zAjqfHfe?Zi^Z<eokn*OuE7!MLG+^JKSS^`0xXiW;?^UKaB>A~=cCpj=V@cH{R}V8i z#=KlU*uzJ~7t{2kmc;ebkP-wtnX(8S2tZM3unr4lX~{9cm+yQe$QEr@^zO>io3Ab! z@R^^NR^L<?^F$Ey(rwvF8{Oq1i_N1~pT#mAyCnGxhnRGJKF>EN%cqOapMm^?9txb7 zu9yf2KI!O@XX60lt5S;{X&42^!U=SW%AzL}=<_~QqIh;r*sj580jL!NR@|3D!lstk zZE}iirMj&Rj`F@1n>)(fr18G&kW3$o$kap>h$X~2-8#dV`^qA!(1lYAQ<G|<-QN3c z&X5X*<84?T{>oH!gId;Y7~`J~7on3`)P|#xx*p*CUTXBf`2nGNmmJ4<#aw0FA%DB- z2_9(Pa^Y4CEJaOMU@g2hu>LtU*fDvE2<wy0-4r)FxdC5q&*O<oaYMGgv`a(#nQ(x> z^!cGyO#hYb()Un9aqfn8sR!>x3pL`@JU%F@_Gc=?-1_^IZ4s>%(y)nCz3%<Vw@rJ~ zzF%v9`W*<UcL5X?wl1+Vx$hg$x;F(4WI?6vuhVPnNZz!TL|pK-_F}7`uw^ewP#C5( zIau48*pj|oena|fwwlv;L%MbSISCYuZ`-)WM*Iz}vy|{~NNbv*Sz{xLYl}FyC%AA_ zw}dsO&wd<gDGLq$c(e^W&*m!WZQ6;_<M9?RW6$%sjhS`Sb$WM(rWCO_%0$@hWK!B; zzpcJGw5gy~NUVK|$gqdWJsS*Zg!HyM#FlCr*e@owW6w}-fm^AcXgj{j?IhAHZ84PT zvz?fin#7<If_9K9QvPWjK2fBL<(#+oQEwxHcHv1-b93HT+G<Zwc!PX5oRZHQif`1~ z{dOM(IByXv8lm+dQ2dtQZkkeiHp&x@XQR_Rvqql~!5$n~CWPz?DGVg#z=7nXw<Ggw znIO^CNzBt0gz_Rhgjkj=*gkf^!372_`q8<TlKxhHfJ2OI<jI?eCNb*NA?TVEUxKh) z!JcXlNy-R^cuI(<cjdG_>Ep?z=-mxsPG5x(mo^XI;^k_8wTB23GD(rov_oaRD?4g~ z@s$tnH$dcx?{Oyjbzg@M?<Y2Q(1an`nFaPs^aBHH64?rWQ|d9AOqH$bvB-oK!SJ{7 zQShzWe({ppsC&|n{e@POmW=dcwYzOL;Ho`s5pBFS`n!Wf_%=zjCfDtDtF=cpb?eZl zgYn%z&Y6P6okvqAA#0-xvxVS~^}Jt)U*iB5Yj}DSb7tw=+ac>eQgbB+k!+V(=yDgg zzmAc0`DNj;wyxEY7RkGYb|1e!rP&g5dW$q7CTs5utTlhh^X9?(uiSe>tx*9u?Y^zG z##02zt(MQt&9zjjWoea4p(XM_ap+9a!POklHf%tbYrwzeH5U$xOvEis(bK;Tp@PD2 zp?BHb+??Y1^T6tsRTZ^FT&7W8!~~N{npWB3raf!}oj=<zMX~cMx^TPNIFYS==)k2a z<;qM0560)qriC+sJ#=PhWC3A(QkltY(>sJsyxmm@=I7bL?Y~`JF)SvW%#RF8y)B8^ zr-lo(GIg+}OIppx`L$qRr=&@C4ez+x@rld@v}kTBAJ>}myW_9hjOr%t<=8Q{J963` z_co7dQ;!pyM8>u9gWHSe^5;~zt)sK76*i<T^LAD0c}7+C(fkgKyA|&r&BZ&eQE_U0 zX-0(=^|umm5LOhF2p$CwqOAertyne(d5Hn4wC=c%VFIQAXm7a3Tk>SrlMCBdcHF?* zPubeNn=YfvFnAz6X<+)C7+S2*Q5zD5$4298G)6WgO%%G`+@K*DrWmKy(1ssDN`cjP zn|1E&o>Gf~vSVa0!^I6+$vv)pu|&WjB0A!u76;?wiskgW!eQK1ap5q0HV}h}KS5Oq z)Am@K`Yn23E25nQQlD*6m-(g3abS$Cs8gF)g13W9^;a{mO<*fvJH3yQ-&Nwk(rS!N zQoDHsy8!N5d_Z}uDJCtUG*Dw@Kwr}N2{B%&XO?;@I_Ax1P-ne%-G$Ad`GwebUCQQR z_O#pweh_>K|GEvlz2PYP2$L0E6E<n7->&=Zt8BV9YX$WYvvO-#qrXR#O75wJ9i^;g zBgxpgwctkTbvfIW`$UM>AR3VY{{chiEC$SW;6u8U-AD@G-5;)CM;zKpw+a3!t>mB4 z;TLqU7>1DnuJcn86&x;nTl2R1n-;z*xI?QzEEudQn69r|i@v`z3+<REp=g$5qPGF; z5!msRxRqbdazD%cZ1#44pD+ryHm?~Nh;s3qWaTNE$x#7**$6Sk%SHq=s@<-7SB#kA z-TXW1Pu6YZFKM)XTRs1T&YC)<H}|Pis;fi$_x6^?m8-{`i~0-^+)|J&Y~Vh=HS-JP zpwYV1iUWFqOIh24YAQI@NWBZJl`By64!_17unqWv=J6tjumjI?-sq~HJMX}e_MpQT zMl$L3$J7DGrwBeP17mY1EY2E&oYc1DQ`?fZE$`$a9$y@-EJ~uGU9$uuzbo{pEI!&( zg4c=Qf)Q$KCS8Qtj)t>fm~Fhd1Iqr|7M*$P1A}jtFx5tJQ4`)Y*Lr$HwS*ckW_zSv zJrkXT^$<0=L1Qh!MgTFx{?Xw_bP%oOvh@f<28KNhxY{n%q6%yttwC#=kf_c7PGpkS zwzL+5BSfp}&iD5B_xJUW4rcq;VW#H!Cdo`a=E<Z|S2_Di7i`ofV|`rc52TQ=L}IM+ z#Csez)~fSF-csaroamLsFsxRetcLj;M|r#{7^0fu+vubbKgSgPA5z@N9~TEPv{7vu z$oYb0_c-ZO(n%C4QGxpgCb}FrDL_oxS1`CG#D*ecoW~N^#}qMxIwRlQ`$yb6kX`@{ z7aq+8B~s~xIk=lB2l(<3W}gi8@h3*zQTCeOO(wr13xH)*l<33yO^ya5@GJrd!Gjjg zn&pf=YZDToUFrmT7sAm(JI;yoC_G#^x>7zG93h;E3;%5*QbJh8I(GlwG*X(UeW~N4 zXG)_JI}{<(iWwi(DR-jh#Zz298~fU9a}iU@#mX5J`!A4Q0ty+M<5&gntBFcb4QTLN z>fm1Vj@4qlT40T&egshTa~<YmwL$teHD?igj#pRDrvQ}7(XSv~<((V^pzxN4PE^9_ zdgf!$gT^C3EnLA%lq+!o89Xv4Lt(5|a4@TFYFpRvf$iE?+rS9DQjTH7h&Y!m=@v#T zXwXC35}?e$jR9rVR#GYam2H@=XH%$6y%P4&-^wu#G3a%uO#%VW(nHfZrXHFAO8AQ6 zcVnb`3&yyfQg&DJEXos%84-bvLU${mR(mS?9pMo2Axq8HtOSNK0-+tK{&qfG4neiC z=<l%MnNtM$WPIh=k(^=fm?f09;b)r-n}}hJo&jsC%yi;r<N7(xix}|WCcV-G#r5ry z8el957<)6nFxdUcW~5e;>eo2iShtfcwjbyAsP6hkFxaY=uQh(6qhk@r9cp+?0VR-J zn8F~nk`2Q&ja@sUUGH5`MIpA^j5%+*ss$r@7#aP@S6ldQAHS8q;~>gKJeLffp}1Wj zyDVPQctH^fUOXApuA{P{a6W%Ihtx7x#h??)e1EAMf9k1vcknB<&G=mVGOl*n_dNtX z{rxOHQwW}_PVi*mO?5BFz3=NJDt#yB6j1B=IdXR({vr~`%biblyo()vIsa1rDWXPL z8NIy!i>?d_w(tTsQ5V#Ghs@#h7C}>oTia0Ysr*^J=Sn};fKwRL^$;OHON)`vT1<K9 zZY`XH!5#+EjCN-+(YE#ahgzFPV8^g!igyDouHd(H_>2w%de3Z(P0aitm+c+18-3tZ zJWRx-H+n73reL8Fe2qQ<XD3(;epJOWsYwd(SGjy%6Rp}ix^BY~S+b`re42hYvpGbO z=ZGOc*m;{7Sir##XeoeaE9FCY(Wa<cEphD?TL}_vMg00mH6yD^%gcf*fzCYjiuJ4w zNT0fV58nimusIUx13GJJ^!vH@&1$q;ohDQWcW|*(YLZZ0Kb^fbNoUu)mNFH_|HAGI zTTPq%tuzci$0kuEwt>0VJ)`hvJZx-45`3&oT#53+S^1>4rMdO#x2f?V2vYMw6vG-* z3<DR=Qp80|&fNltBK5#~sg8kVi?LmX*h~y1$BZ$u4@u;8#ljXC1#Sr7Dhx#_XRM*v z3QTq;dS=Wc;Em1?nm<dbws0B^-iyKn-Ve%yK^vq=KpXrd&)0-kSJYQG2MC>RS1&!6 z-v(H{(RrE0Fr_&+RBQa^XH~onyMd~v#URT0yW{a>Ea4stnc9X#O}NqNfBR5-TU30E z;tfP<TLfBW#!Ou!Qoi=_F||M^P~w}0a)Ukn-F>$}jrS~YFZC0G&B_zpPSW6|A)~Xs zLL;KT^P<M(pC>;%`RGZl;UlW&<*Uav>WnNDICDB2j8Sayr)hdbZkw+)I%nj2Wb0NK zyfw*gi~=lG;Z)&}Q}-*Epg@RM&O5g@OU<0P4RKEK=e%93XzAruGP6{i9-e(5C5LGO zA)?Xlm!=BWqQswrqBim{rpDKzm&p_y(({F*0p+W<vFFAjLOv#lQBx|fUn(itbA^4T zpz&0+X)<MpIwdPq>9fY|R!k5(Yg1QL+B9{POlF09r*_@9>;8hJGh5pt_31I*Rr=tk z$J__*oUg*rSgjf$tsH^Y%0nDlNj`RUS3p>-h#={T3BQ$`869@7rH#>cx2?V|X}3OM z@-NdH{b-zqpv^{~4apKMS4Ugh4*!t$oRM^Ek#C<-HKDwMI5X_@L{%vuMp=K~v>Vj# z&#DV+QExw;8YI^1^$~A2N(Py1fNZF&p0$X#pHw{w;%y*RQ`%%$gj+<s9i#Q7PKY$@ z|4+&8--)2U>vB(xfM-#Hp*-5Z=OMT<5Kt!}xOySD2*OkEMb6WUSB?S{9IN+2=y7#9 z>q)QPmwJu#8usMdCq3y!;$)0v^v!ojd96gsT=yuQ*((IacGs7)kYmG7bwG?M*mcjM z6Nf>ZAxIss=azb%s;89wD2!cQ3V`Pz82f1X2rY-S6CrxF>q&&RoiKW?^?ZA$Z+{`( zex8i1*@G`U)p6kqBqJiA8}GfBQ6k(AqTueAJ68ss0$za_L`2%2gCP76!`!kwwegPg z>-BXanKy953?7Z_!C|rUQZoVc4Sex`F~h-!IjP;w+(yJ$Vy`V1&z&q4_fB*Mk1(lk zVD1&Eu!_qH#7{u`=Ml%?8Dy|~qTgZJJ{lElr({Qsep+Wu)TnfHjcf&1pup(af5G*{ z1}8I3+Yk_(iV(Y(77nj2SPrl_v(dDwk-)f-#R+70kmI`1IoI4*q2iy_YTm<%GD_<o zvDzgkhHmQPN>pk;md%4*L&|W(d4?+`6c;6XEA)WkTh;oL<Mb61t-)=;;-C$A+Q`q% zow>A1xSszIZ$hI{J)p8@Ei2)xLfZxJppmt%!gFb(b*(zXB>Xk`;hU!J{!(3xsJpi_ z!fO+EK|v#ShYo8Ia{o!iIl?$1<oe=5Q<LUu^_<2IdUCz;^N5;9Um8>MZ&$mhKFJ-4 zR{!gG5+xt6ZK648GTkJ;vn+oB(Y6xbn5NvWT12us!g5XNt^oe`t7f$bnsUe}%6Ce> zyTF~)&sUqGyo1_`KgLjewJFNQGl3^i#mk}@ha43(DU#Jl%t)ka@ao!BWIZXDT{{I% zl7cjo?1R=2Pf6C>QIgvVFNoZA&67Y{=4?qqIRvV)<hBj%S^sL%o`r3N!olL1<vR+K zdkaKwjR{UiYl=)wQJqm!iCB-fmj%kMl$Y`D15G44SFm}C-j0as>!YI!^#oNN6>=j) zwL11_S*c`NdS<kDs#6l0|9_5@9@?0Ms_%@~WF$ULp!rbH7m?K3uQx<e52(5XN!?Yu zsZEtF7z<G5u!v+wF+U<f`dZ@WuShI9D%iOeVZ9|aWaEkUUzc>$#_UE2?3-0zg22AH zZH;L{J0&Ik{QpbdyFkgE-FKbc)$dlT^%#xj;qj!VrBPQ)>Xurgc~~RKqo-$VO>2;3 zk1c83UFxcqT547I{HuB-m8+d#IWW$~Cb5&i8VDMe^<rQb!WtF=hjqvjmg7JmXW?)f zSe6`ife^B=WS1O6;{AMo_ul`b9+D=p$)0RWUHz~B|Nig&-PiB_-aiH{5Za!|{?b~1 z{qeM{kvyA7JJaN9H0Pz8k2eO<Vu)mZqcI4X&9|7$4ie5$NZeis^sgooPETh4gpt|K zu&@6*M81*P_T9+rQOMg-N8U!?06N@%i941iZly;F#4X-iKR|DyolFp3xOS!*S!hIL zJNnV+#r7#>c4?N!^<l;Yrgs-<*nBqs0xdqNN!ZDSqYFh9%28i-1qoHSxz}=H5`Zc- zMKQgcAt?e~bb=bqF7F|Pm!0Xr0q8)Hfd`VMVr1af6db-t%ij9lQG?&^0Rv~+3%&mB z%lZzhr!h77Y^I-V!}c1U2UCSFs@f*1Fgu7=d1fkq`_y5yM~ko%S@=pasYVt)k?QPk zojlyDCLe-46uSCP8S-!tf#c)%Cl6ocrHsH4n`RXI?F5daA(%w4qxQ;vY^V`5D#hET zNK)Zqbs$9+%B=DI==JyJ<y9WCFyh?cRQvf;8G+;d)%r$3JV=_j>*44?ViI7leMI!; z*@eQ`xl<?eXU`p*`N*mKr%s(YbN0>rM~GK7lRtju<EQd(eEi%SXHIc_?8L|NZ@&84 z1+LGXeRC$2JE(e%MAfs(bC%S3p72=bPUTO$cJ2gkUpPk`t&ebV{=%_y`BzVU^4Let z&g9RYxS+qOn!MUPBe;x7C)W(oqy_qzeLFOU>@sP-;O?d>!~(rC8(z^Dd&Baq6=EIz zZByeDc$3QFn|FwsSs2qRsp@Rt;`;2HRcKd*G5eD$UM0z9Tv}hOaNLCMP&)454#|x3 zr^rH;FF2Y!2!-?GyT&IhoXPxrc}0#@$eLMGimrf-LRe9$nhG{5JR+YJeX!tfk+Vy| z5zGL!hl0T#hM;VT{MU`ELS{1F?u(7&F00Y?Ygax_&2Dwt-HCkac02~DjwUrvMXQwy z2+*qq1x*kQ8-A?JAu_nwI<m?S`BiB1n4jLie{X*J!2Wh``DJHAo_~J7>#tsCLA$q~ z-@o^z?5nN`xAN`91N&XC55=q3UOhk(&Fq`apm&spzyCg68h7s~sDm2{T{%#7W!q90 z1{xQzKl}IV#$J6eJVDH^aaBqbcD^6Sc;F`en6!B}E~A%kAJU*_Zr$NlY6^%sEL;$# zZ8%xm{{H)&m~{W$yXuxrk1n3KuBM0M<EL~#84Xv$2IHkpWAX7*ai5Z*XnHX&;RoXR zmT^cer+63~$nm?}7ZPAarbfn3NowKc<CT{nPPb~aYwuEOA=vAgv0>^pR5l;F3adCf zKCYCF&%yTNV>PF`;2^m)-t=Z%!VgetRp<^2CADkf0SZ9HZ-*iBuiwWW=qSf>!i?SD z9>|nJPBk=O*Mr|n1<~)#P=|)l@6XSA>vItrj-PF^T>05<B*vq%9TLT0r&rafUpgs| zzCWQPW&5K92lb6QSz<sklri-ihYMBKE&|#2gv-6J@z1-NAsjQvABw-VF*N?RX$(6l zkbYl6-zqF!eN$6g8S|eljE|UG8>e4o)Wpz6U#=xqz`0l#*<%E!Su5xsnkJ$~nw^4` zft4kwpV=w&mIz**Jdpt#WNG$JKbrCE9dt&R<IA<7-%{EPln9MIi&wMhvWO4ojE-Qf zWeDfLeSy#dYlEfXwV{UeIoFliM=)GBNUmcyu{KPJ4UJ*6O7E<VpbHz3S6!nYJMw;X zVR=|>jEQ)6vtza!8_+nB@TOa)M*kSC)ga%|(B9in8)=ZNhi9h0YK$}nZb*am3OcHd z?v1zqaf4Wx1TXx@#N3SU)kYf|?soGzOemII^wXuGwV}6vx`9hU^kby@*@R6%j?o&> zsA6QZQAv&P;NIBSxV`Ic4<W^!1LP><rPLQWmBValkbaFe2I<$>8jz8^!t2S**lJT_ z6u393A3xIl_BU!<8l$zXS9uf9z|H8>Hk-NArdDG?@n6PJ?&1RV!qd)p#5{L$l0L{k zqe1MLCSwu|*MC26M0zdyLGk_O>(@!_^Tn`CWlg9+owiJ4?!JwfEVIGI`ij*y72H!? zn1dA|L}SJuJEiNnl%v(xds6Uq1Wh*SUkaefCLPe+Zfyrz>|WIwwtRr?ae1w=xq9V( zU(4OiRe>-C9~MfcK2HX*-OvfXKOp!d^%H#kK-jtUhZ-4LwnmRoW#>s#%RibOneS4& zk^|kp-7i0&U3giy67pQwN?^3zN~q;(Jqtapqn%!@)^UTP(~y594Z!BE(-)#oF&r)Z zH#7<ezdhC5f2YQr7zD$s-LDgQP?j-LroiQzbU$!Dd8GUnOxiMxx4@$v@`&J3=WJY_ z3gd$Lne7lmSJ{;q?UOJ=L-BR8#^QnkOXP%j0ER&qJ^%9pF)YDhmf*xA(Uji8e$$zJ ztq;I}O)J^VP~gO>>!X(MDEYq8zK71N4~DBK(PW#;=|54s!YS+hQTgWbJ7s5I`AyxH zymGy#x_Z-cU{7pmtIO^cFzfm}U_Fvjdw`yuE5BXxafQ!H8MHofqg-Awi4a4+K1dN! zD1^{oKp|5uIkoq|O*bXc6YBC$3$78uco&zv$B-MW{d#C4_6xxIUueW+Io1W~vfXsx zavan@X~TPwf8ses#wLZ|S5#T2C*MqbUitP6@=H0i<l9KM^El-cb7Pd4v-Qy|=FBVt z#wH0(@Cskp6yFuw!=Rtu^}Uiv{*1;e-UQ!gef(`{sQ;=eY?4Keq^teUDuw(Tg2rhf zObYpkLDDRLG~>tNhfz;Igy>O}<Y_fK!UdY?mrOG~eLubQ5+yT&$8BlBBN+zzO9NOp z_L-F<!5i$UEFJMTvTI9Vh{ut)cDyRFB^e5MXV{*TserPH=h60Pf+p(=Z9_C<j2}a& zhPm%*tOhMOwryASt9+!Gv23h{S87-`T_30of<zD0`pL>}#?jahaqUu4nz6LvHV^}y z&kZthAcf>lKmy=qIy=JOjr`@8^kUuDjZWh)7Qv*a?7qH*zgzfA+Ob(nJ$7#!-yX@j z4nFF9D>Pz`%d%5kw%F^#ASfT)B4wBTqDp?BK8*hPrf~JQ^wG{0!>rWIAH$rcPf`vN z%DklQ?O)W3ZM-yoK}#$Nji9)GGDYtPVd<Yxnf}$EdP8RDKH$cw$~6Tzj+wcv`c1Q< zy>fzIi>VA14E@h|;{Ja<aaAA|#ussfu3<$Dg$vD|Qg!u`I>&7KzeXj{s@8`@*JY;q zoq~=1vt+Z%<-7jDcA&@fVG9Blt!ki4tL9=G0GvfIV0ta8fpun=-R+SY*1XrB;zc0+ zSq-#-Ykr01#MI6VM-TpmAazJiHdLmy+R+Z$rjP*{+$VVBjqrXv_pKKddeNWt-EZ%? z->LM2JojzAoA0F!iWzb>twTNiRSiW4Z+-8I>}aR3_Bwd%3mq6r5Mz^|1UF0a_huQ6 zX|efCw=x3!3PqW@9{>zPXpu4S25u*|{o4Xp6qO7Ag}st@NzMY9$P6-57J#&6cAQEY z7*)ZCZWj^UFgJKhPSws)*<q%mZb>><<=D^))?k|2-10N`WRC)VMR%X3*=Fso3Uy&m z?^od<RE-^QW9?R9_Pp!dqZibpcCb4vPylv?E^&N$tCKZ&%f>!-vJQys9Zk^oHoZ{E z0rkSoh<bp3bz79x*2kJHn}mA!BwyZVsE2d($ZS-ja~AZ$P8;284*C#13iP-aB}>gH zfj=*tVffuT-W2ko-5S(u8`WdkttHVOwvi7s#FWXdL{E%)8@l!$8vi|2x#-=A!?bM$ ztrF)eZQyparqf>kR@lhqE4_8Ne{cX#X??c(Ni!Js^ZuiJE9z$P3h$p;UcOPhRxXyD zZLM)$F5sEdkQ$y(8C5xN<GH!h%Pz~{@jG)woLNSb<q{>vvHP)y)4Qq=k@I3rc@34A zG8Guy#qnp4Q)q8~Q9d8I?!xYn;z;(s^45@DolE<+h@qW9W5VXdhAnpJ@THprO-|); znNEXi?-!SD74K9D>{wfkD!6**E30UQ%>#|-%2m=Uy+%B9G;_{rjUbfxAG;(>KE94s z<2}BY;!#ZClK06n3c=m72HY*5Z`T;zP`Irks=#WMaF$k&YQLZ1pEQd}A7WEz;9e?T zDKEK^BT_qqXudH%1*C#y=En~us<~3JR-9GzJ#>QRG~&In4G8I&Ty;nCNx?m-h6~h{ zXc(nV3{KuoC+ptclRxiW$*nwU*|V_=cwDdYl`gNGtsJp;6g<6VIP(~0e9Pof#Ixo4 z@?s_JC!W+2x7?IOF{8f9Xv@5g47f1ITPiQq#(33P^L5nsVT@=MO6B6UcjgIWDj(f+ z>N~q9wTf;f4Ft_y2G8rbVAr`LR-ycpBi4lkGJ=U?mSgol@HiZ++OLl474eEea6*|j z5d%U(Q^IVbX%w%k{z$TLI#8UVHe*Yk0$+5(#4fSjUz9^D{tYs;l2rN#QtC#ZNmO$) z(I9;yypmyFQJ8ql7;stp`e=e~cg&!0KmZGhE`$XT1KUy{+n$&IrjpG4F=0~SZ1-V( z2VvrY%E#lO7EouqAni6Hl(YEf8Ai{=*$XlHhP_oupIMRgV@0wd%JW`vg&Kq~2@Si5 zX8xv3Yabe8zTqR-CKyw3Gamw93I}>*BYW5PjW1K!+p00J!DXy|@DK*T!m(|!W(H)3 zF|CG<Skqg|fH^aGQ#dI^CF2+f{c$Hu8e=;274W1-h@b_qBWAS3a&UNR(z=9NGI^Iu z<=eN4VYc<JL+`|dxjH~~%ky}agotO8LeE6#QRdxrIMNvek#lnsx{Kw<1hwB@yt#Ul z^TK@eFsF_~5m!UajHylpzf9VXvmi-8us1nzG!>~=Q~hHIi}Bo_QBttt(%$^X%6Ej# z6&u*9aM4*MIJMBngbaPn9lLrNQxKi3$}~(4K$EWe&McKHS8LbIU$SEL2#zowY(O{u zAr^CxTTbQAQZBl+SS|03OWPD&af6(+$cSjRf#QDSr^Tq=TLhB)LbQA{1}0vgHf}LR zVJB&N#BB2KcanbM_++(qXQ`Zjrx-0N475MlEortHLE%NZuz0&1&!&uuW+}~)nQVx{ z*bXy0inBb<5_s<Ba%GBC&Xt;m*-ePfRCa8e_jf+<ee3*8=a3qI4V=_`ejs6irB?bM zm~Db<@Y!b>r+nTiQuB7#hLGfZ)CCb(%UPL$$|vjzTE7L9HPHg{myPkWL-uU6w#lCT zFwZvEwh##4uHsVLtkhQCzE|oAcO{vaeWcXu<V2<~-DdDSYAXD`nG2^Qu@Cjl!iEfe z9OZjryCd_3dEL=xM~soyCc*iZsQz#1Krl(r7gWvy5tz*9DSiFpdMY>6=n;MVtiFC# zAN@UujRyP*cL8!Gcz^*+4%SyG(@x}bLC1_vNu91v*dzZgiFx#G5FSFGvh9^12$}UG z$-0S8VC!{O@FPiO?BMth`J!VuBECF-mDS>D=dj1O9#fRseG(ukid?T^3O0J*%W+iq zt@T%aNcRY=ih39oGR$NnX9<!9({-#3)dou4Oq<oD$n|%bd{nHjt_@@1JwTm$HvD*3 zs23ITE~i3{ei{q!4Y*SdHa4scdB@2OpWR@Nlea&KROjuVd;4}{2!*b4+Xk}1k~6u? zQ^RiZY?vi0a?=pg5z#^2dqR_JdF(Xexc;@HExw^CjR}m4L(08lgy}`BF5G!JTU}b5 zFJBy5!nfQWMXyuy#hw)$trL2}NQqydq3fFCF)pOPP?R?$VLeLTF-nAq95cL`<hcF0 zUVQcluN9x{iGSln_Y6c4O_2VuBhixQ@k=S9<pZPJ=ed>nVG-KT{j;kLSzuwwrhQ;x zBV7g{U529_ykGpw)FaZx@p|Cd(qa`m*yURZ72_}<i2weaA7{$3%KPW~;#2>($n~Yp zdc%t;p3@!po!LL-uH6e0n1S3XaXf4F#^Op|YBq%)D2bp;1>{P<mt`8QhBl1j{euRK ze>U;c>U>Ten>o1`qu#ywnX?!2N0_6P!U<xzF2OR!NB$UvD5D}{Q`MEFMKV*RtTcDz zm995Gue`y+t;{)!JiB+pQ4I>B5ap8tD|O=O5To7C7Su*Vtu)k*;$^jE8?P)cGj^3( z$da49cXmaDRdK1{-?26lYr-93^2y;4t(M4r;9gD5FSHiGDjb<|_(6UE44KHFfUZW% zt1A#fK0vh&*Bw57g5(R=ICYEB{IxrloPl$jbDT*}QF*)&KoxBTsNt(Yz9)aN94-53 zWpUrt>vXZqAbWFQFRsvFFL=?2QdNvijhT5a^wuid?M{ASX}MTS4RobezRJSOgnHPM z|E#FD0xvseyE6;9pS|5o0(cfO$H7a?EaC+zjwraD@0NCwY)+>y)VH5rUWJEQt=uA+ zG&G@!KKABAI!Yl8cj}rz-VR&~plbNp^amdSrL;RAzbcI8B#H8K#&m6y+j;TXmp%5x zmc`ts#LfV0p_vu^GJWVd{YIR>;VTpks*Mdg0g^+clWOC=fNUjphBe;o0gHLed137E zqig!;v>7^$I;xYWO4wcK#ML;L$oa}xGyWF7hTK{IiFfO{&wj={i(3Q7B;(pn(IJuH z*95mybU1%w)H0*-po+en6?go<XcUsuEa8qdn|H&sz#VTN85q7#N(mjcF@Nk-n<$xx zI^TopQ^6LyFZS92)5ifbL~_*EiR-kuvQ&Ou9C4On)$D2z^;<p7NBia4AkHb_a9OU< zk5i^)>_MwYKv7dU9B%Y%>Z%Yoh=CnUq$6Gu{81`*i`CS4v0^Y$2CffPmO1w;7(K9L zVj6F~-wC0JlCDSXR`Z|Ju!%AgwI|C3(=t7l?Q(~et=ES5J;85P)Vfyob!-W>G?1r2 z$f<W&{PjmW^^F)516&_yK(aL;#ZZl5tO5yUVe-D{0+S8aKS9~Pk**QqSx|Z|ReC5| zAp@qpyEa_uWmJc)2C`V+bz#XiG&WR!1gpP(LV}%xyxSn#y0_0k*gXzmhn9Ciu`<5l ztOH$yeA?$OA(wl+RuKt&LZ&HSX!J47fSIwF`czTC+;&tzhW1n&VW`SW3r360+WuSL zW;b*i&zg41lJu-^Ftv%ByY-E==+10Bl~ErHetq;>vHIFo@~@Up$#^B|(aj-jS$sUP zWJAQ{-CxqA3SD$TsJq|{gT0#CZ4h_En45@rAK|ZpG)SdGScb=&raZ<OBK3&c)Zc8l zAW7T<l6h+3{#n7IT>|?s80pTu089VSp{`f>wIl@b#w5e8izITfw}c*;+!#A4Q@l=H z=gKRJg0C|X0Y%!Bim&4Bn?)~eL@hd8y@<vCalw^ZBrWOcYl}$9jWFUJx3{=xFHcDc zHyj(UBN)4)nkcZUxadmRMJ6>+@&!{51mQy-X}5Y33g&MuuP%|TC4zv1v*)OFWTDEC z4cHHd1I_A7n)l~<n;56Dv^pHnzhmO^hZ2x0H5!n5=c?d*<1GFY!E{D0J{FJ21EuSh zcr6y1i}G@A`v}cS-l=7rfUBlDfc7FX0{2;O6+z`R1J1+0NvQ7Nk+?jD#ko@X^%Hwb z8MzvRDH^f(&hlc3>2*}QYs2w-0)!o^d|<XrG?Q`lvHF0)`W`AS+_KH5v>$Q9S-nNm z$nMC74QLuJ7dD`szCrFo&AN%qpw8PC31Nbh7`gGl6k-7LyYq$Vy%YC?)86{t5lqhJ zu6J!}YASk7$4e*T=>HS~Z6c1g#LI-E+32Gg@MF8cC#I22jtIN5b3(}U?<csq_lXv? zETpZU>PviN(6Tf43i<>Lz81R8cuYz26e7=z$M8@UgFX_;Ah&pfgEFv9DTJl<TZbnx zX)Q-wSkK>01fHq?cLN5;PwVEQ(!hfvf*D=BAY8n@ERo9c>e6iLuXm`&Ze0<W@c>Yw zxi3PBnb;D7jXCS##E;HU`a)39nNhW!_+phZazvGDM_Kl4p)p%SkRA0$63(*&HL0Sa zCJo5LT-335abVsvFkRFzix>tiZFJlV-pj*MYxU#falY%52;+j$PM;I88t@W(B{Z8$ zMQI#FvL#exKu|mGPH|TiUOokROcZ?&@xmt=;BWW7^+3F^QIIy_g{>)AW0MY%Z=HE3 z4bHC%52(}dPQ#<UqphYGF^QI^RDuiS>T<EC+yjXwY@p0v;+gu_hi7LnIJlrxS}j9G z{~XJp87~nsHIi+dW9-@?!Es)AOq~@FBt?28shg!F$pxWiRcZLqb!#Jkn!BAF5uSW9 z)yURNBOb-J(7*yM`XPOE#Iv7ZJ#SaV(*Ghvhw6@WZ=SE2AKNP2u_P495Hq~Zc}asb z6nkAuvjz(bvK?gLhs|N9DA7fXY>iHAQR61$;ctgF?u=S}MpCF+FDsLZ5$meevanX# zTEr8&p<G%}hDZ!%2)YPSPG@1_j{L{Z%l@HOT!Pj@<ThU<HI$Tb&rg;XucCCVFRtv( zuPm)r5vDoGUH+hd^fq#<tU8Or&`m8-l=eEc;*sYiE(?QO7@y3<Ck=%TP9Ulb^br+y zb|goP8A0B8s4l+thIJu+S9K6E>frMU@u*un@|4_jP!yxnA?l`nrVmW-pPt;mfB$sz z3#7%OrzO3Zsr^GQz4*fOlbKt1jCV8|c>uf)RtHO7?%slZJVT|mfjk9u`qj{t?ECFH z(xwynPse>aeeAU}hZN3&7+O*f`>dCu+o1?e!JU78VsE~n>@|m`_ljaa^n#a7vX$Z= zU2B`_Z*_`~a6suCRlrxBqfXEv>7?{ds3(<x&*iz4+43I+i(Md%mD%`79GFu6nRw?F zp_7(V_K@y2omV=KPYAWR^J*JxJ<`Z6VR3diXC;e_r8afG)Sm+6ls$~>u2HjL6NA*` z0#Xw>T}f)P;!j(t-uf_<y=L$AN1wJ7R=rn=7V4CB$YfMw|KYB;m$>4|T5qKn4@Y8$ zR&sb@`T*_G3?qq1Hj%bSXyKw<Y8ciZnGG8jX`o5p@Y?wq4aFn{A$fmF<(o`#BsEEi z31g|qYZ@v=)|ElzQ)b9&jySntskyes!}g!+kdH2@Blo5K-xSDAXZ+?E(D;PEfW)dD z@&6{n>z0>MKXyiSw9eF8d^)Tq2!WlO`-ey8HC*YR_>|hq-SjC{az;k@5hF<LB|^5& zCNy>_BctbdrTFWtJ);YZ-IX+K#SSOwrxdvcRF8c^MIw7`&{gCl7%n2^uyd^J($FTS zm$L^<&WAUGHAl#d5*yRhiV?XJ)5purVx$}}R(n7SG$dZyA5sRMZ<F(Du`<6TolaKd za~h7*Y-l*iE<~#siwNA-=49fc1ckP~Tt6JPE0~~1BN2M7z$mR1Nc$3uha><f<_}DI zmq9b?oN(5w0@UP%O>hQNABFx_|J*pEbSmCtB&zuW<{^vorp9@Dby=9w$r`c>sXW;6 zrg<q6^2Lmj7O!3di7r=aMa)GPG#GxaET(PSv2dt)lG2MyXDc1x^zbEfol-)HEHM49 z>xwtXal`3niMW+6Uy+|g)>F0ivgB$;Pe37XdNNO)=E_RBMD4C#l|0WZT_DG#BTQuO zgGRs|wQb~U2<D{XJCbjX!E$!B2Dwr(W$bG>_h7DuOjBhi^V9i{Lcbi~49_0n0I>r# z<@vHKh--JaJXx;JM~g<$I0!p_HuCwCMeKpklCCp87FBvuKYQ%6`7*iL;VSi7mVO`( z%QWDf08FhXE?+|jhwxK5i?Hy!gY4`k>d|8LS_{NL8h&2LK$_2g=%6ZHu3{{=IM3zz zmGTlN_SL*4+dvGQKeK$5IWLSaEnjU^2uT!vl1ir!HdXrKhp6fGMa1hWOr;LEs!RuN zT_eR3A%H4|B$gGQ*(|0tQB}%@pMx)EDoszeSD&&3Os{M)?Bl}cPrbo|#F)5|GCp=9 zLciSDtg!qmvCvmb;Ers~ujW@*QYg|yk<=Quup_|**)5HEvJ4}kelVaWv}$bRC&?!2 zY;I>>a5nJTb#BFnuB!pVXBd2&Jl^sP2#J7UVEz<WeQ~8QVaUF$*ijyhyT_QtPnD+} z!Yrj$^Ofb2GaOet4hzj1T4uOx2NvihFB_UW;vhY5hV}{BoqDa=`r1Hy9is!vI0#eZ zI*aQ@*%{F=JF<$D3Y&~w+NZP3pc%HMM>!0J`%B0#gTw$P=2!Wh_xFOv;el_&P?gx$ z5J_d?fTi^IQaIFZD5zUL)tzjb1c#g^k_2J`-%Q5!>Qrg<CiCV{kln2w3ihd#Q!u7! z8H9&TuIrAwTn`Cy8!yXA&R7rjp?tE<xlP{>b;cH{3gX#N)Timx1IGJMjC$hxm&QMI z(7^TRgX^&e;*T-Fo<7(K?i4BsfIqOt7#@!3u$&Ho*i!c${2t8s{-yC3KP31KQ|aQN z@stW5e6dp}Qm8BL#KU617`RMlUi?t%zIDc6wwtGC=EZ%4A6@tO-|8F}ft`}P&(fla zb#hjoq^lA$Wh_-<>xtbZ`t;Ma;d>h}4wN<MNTpxg$Lt8EA^787AN8gon@q6Ti#=xj zkr^Lp-xC7bEEAg@Lnac{C}x~)W1Xw>sQs20k`Yf_ysmTK1vzS`j<)~<XDco<Yiv>y z_?3^UrU74*OFVgzacIZheKp}(q@EA|FxkWOq`t`^!w!s|1e-CVw~IDWm-otr5H?N9 z`ECovLtGUL!h_@&mToWiQPay5VNKy_oZH%QU0v_DyF;dQA8z#B=#GA|F=%fsplI(V zAP$DLZ~sz*%yrcChw7sZg}&kL+Az7oDln1*Fp)nNRPS&9Awu$0h;Um`VhELlgEpt% z?k>vz66FVLL&kVwkE4H-=s}%7%zGc@y<d9!qcX|WlDJM#AH~6K43n)DJ5g^9x}k<S z0KHW%;1L4!Jnc*g%-o>YGr0uzX>6ocG6y#>4n~O9H**@>#{X5!*+13CAJm$Vw=tQE z%m6oGS8dwNIOmg^K(i2#bxBIlY_>$=R-;c*WMZ@}%lhML=RfL0b-Q$7-fG}+vl?)O z@+^`q7@TT(2G(fZJxP}7EXD)&)PiDQ{=Yt0<**bRwLYvX=j#>y<qrJuf1|Y~Yhs1* zmEFJ~0`Tp~D<!ogsBdntM}d7w@{qH{4!O~u-rmhUSQ7Aj5F!6yuD;o?NTUhNtEK1k zj0vDST8V1Q&8cZ8AnpCo=*D>gk^YIf&MVx_aGj5s@+qjIWV|CGw6_v%4x4&aiYnzv z?IvHU%aiI<SzAh5Gm#6nMNiOBah4f7y&T;t;!sv9lW3ldq~7QN5<Ou|JhvDa*Ci64 z5)|D~o-td(Fc{G)ofu96f#HG%TZJGJBe!(5d?hME)tXJ8gr3%r<LBNK87k%@)gTPW zjmq+^iuo0au_UU@Rb!f+zl&S~4Q`*mDfR|%kvmn}_~FAXrkY4u2mqKERvHED>UK0R z=Av=M!R%6|rE+Vq{(2L4-2bJ@3lT!AUV6&`DIX1EGC7wZJTY#`<K?$}ixEq`3u#(0 z2xCGuO?@ofDxH#f<Ke@++sI$xcivGdMt;WDhzNnpk~v!<T5_eP2$({;j)`m~j80U> zx>0WR>h=|jMLM5f#y!dD-K%ADtw`r@!4LB_^G;-<jX^GnH5G+@XL;3zhUvpdd$9%? zZ-$;WrzR3toYZPLvRn%lh<!~@YM|3_r@$`6efMPAiRB7YVfH0dBA-e>&qtDpR!e5N z;6};}4B#Z>F13ue$jvZO<)-vxJ{XR-kC-!h-u6HdzQpFbm@IL(5`?HC*gTw$7z(%W zQoVAEd#1(sGZwJQ=PghKX#uP0_x_0RagRH+wO5^(t6lg2NlE{m@C$E9eYDvx;P}*R zfq-4_6jax_(1B^;($a|&MQQY!wVn>rUWIO-RgR`!MZ6<KdlymZ^liwf7+rBdDP=uZ zB(+qs`s*Xal+$;MPG?~fzCv>x5N!wwCn5c&4v25*!|YX?vaOo%IF9boHYLvR?CetY z+TsF9UVlv^q98I|X7MM&LY9B>1W@Gm`qpHW!YeJ~qyas_ugRYkqu^-JygKo#&4#I0 zV;$@I212ce3cCsD5M~80PQzE4mGHbpsTVgWk*L`LBW(}*!|Ob4YeXTJnqD<!rwARb zKNcEm4xGW*#y`4_8{EkkW~&SHAI-h4aXNv_$?GZ=EW*56dz8)8$5}8B`F3heJs1>N zPQDvvAQ^es$a3+fbP}17*XoQ{sKSg|bclgy|9xUA>=*3!iK!5sqQ>a7KC<&=ZvC4Q zC>5v5q9??=$h1oA@XTas++r9%!IyTX#aM^t9%K6Iiu;0sgwZ@`ngq<b*SagHl-Dd- zEKfzzOK*T(DR1>+fQ%usk!sHPxbILNeffH?M4a{9A(?q6*(>9C3F{-Xkwho86S&D# z*SF02WiYdR&JO3Y+h$(|UI@US;?MdJ^49al&NmN?gz4KgFkurBqNPV<Di)SdNTQhP zo5DKtlKQq|q;aZF@u4}gQFy#YNI{ur$k$B~aPD>~++d^YWA^ua%EG~izA<Hzp+So( zv!K=2q%6{d@nj+$2SMbXkpScT^2#0Adfq4a!xb%%d3|V4xi}~mhQl-q)^tbpf}r~c zLOQ@8JA)@jdj>ZS_6+tC`e9&j%RF~8KUzYs@M{{IgyeG;2c;e+zc*R{l+2iF&+7Mt zUetD%c>$@!qrWG3ZE3gLiUNPX#zu{DL_E>5GC)gg$JyB#T5Zy_Sl^RfV^^kg5_J1Q ztz-~4Xw^Xa$8Zui%o{7|Cbq9=PM}sjWgDBL_eZkEs=sMR?1KYqiA-{Kt#N3rm_{%f zUFL;KTMUIJ`A=((9y(!Lx%vQie%WvYYaxN?4rDu&PEtqna@48(q6WtyWlo&OOe^GR zm~xV~l9(jXPsY<{!)r_1##k*q7ph@Z^~`f4^AiuS!p>v{*pdETVP%7@0BB0|+HAwN zA(Gm#`1gS#hEFs<N{@L^A2z)ROc8mSY||0S$UaT|QABcExeA5kgo19AkKd8<rO2>5 z(P#YL3I>W~1gttw?_kMDGquI5tIOCgIF*J?Roc<)WhgypIB)nM-#2Kvl00;(MseQ( z27764ZoF8!UYth`f5h}wO3C2$Bs2q%tMj$xsI##JN77P0EzQOnqB%*cwWQT#a>IgN zah`(?lNLg*)rko-8nT%ke@;@WDSfzfSaA&`_#(WB)0;`mUnw&Ru^e3Ft#d~T{kwmw zd8_?C&BpEeZnju~$oQkVyNSs8;rr_|WX0|6fSGd3$7vmm1u@quNqWf<xx`E|ZHa4D z=eDxFj59r^EFj)IRM?MY21llYJ^C8UyVYwc-ul{Qff7$-a}jm}I-wBENKQw_TRww? zPS@s+<>Gt{I!ayJ$RP$DAnSu+Em~N#^<hOsacd+}tUAz%4q<mHFA9lV>wrmK7YYz+ zz>CEM7EVxB-|Q!_Gp#T5pnjUivrgb>TMc?nG}U_;b5u6h<hP@<ILIVLa2loF=fK&= z+fImQr?7Rg9Ur1FW^W2kXRU$fbPlXH8X$CXocVyRsMNg12Kak|UyC-{=(*SRo*bg# zJ-o{?0f<Y2mrUcLliovadX=$9aECDpVl805-XFc%=)E_9M+|?jaw0Z*9Swn@r%gT9 zp1(;OP)&A*o3!ei+=wnS3z3cd-`3U7=tIsgL6VtRUVMkU=5Y=duQt<4qN6{pt~*B~ zIggJij$p37C3Ii*TPD1M^0L(kFii*T-x5SRH{58e(x@Z3p=o$Ij5Y_umeJvnfq8Cb zel+v?vDr@_4t5;KDQr;QC)hL~Rf;Vc`lAo<PElRX90yJ}Z%lVa%O&wl9w7(rsi@1~ z%NJIc#6a8bcQ2(54a6qFs5i0ZoHG$bxStsNres1v#?nR)ZT_hNYd8CNpwSACvg%2x zY<c2dZYUy1jII_|D@wcK9;M9TO64U?lVSJI(AR=0NGaAF#?q^q(_n0Y{4aa2>?L^z zIxH!<?MPU#ctb^<30Lf3AaO{_j;sj+=jISBV{pi6g`*iwzb`;8jW<E!lvx?ZjP+=! zM2o8W6dx@plW6OpMI`M3h4`p~T23i?sgvjFEv@I6UK+JNCzvgbIdskHbeKbO)kcr@ zz2PmlIe(MK?Y8M>)P{Nj8NA805O2+|4|Lv=_uq}`;5F4OSlErDBfa0Xz4$0q7C%hI z?e=03^42*=Wpii78`6dJ5v65|+wPYZO_yDa?o3&Fj1ZUG=&L}K5k&<lA#%<j+A?B9 z8B47qQ!xk1DkZq3fkli5a8aMie>}znh+MC%%A(&XWvvEmJBnr+WkT4vb{QwG-mC;# z&*aMnHQVl{)!We=MH=+~Z$wA?9=LlgnHka*GcZQuu^J)BzOouE6;~1;u*Cfb#s2p; zm>bDkiTj7VILU>@EUhfbM#`kW&6He>(=kc)ap&53CpoozO4Yw3mgsVDB$a5%VbW?m z9!HMOmy;~(LQ=w^Oe+W4owUcE+Fq?KPdcf;iyjo?ea9<;`P<f&0N&2ADy}3@u3|gA znL(yMK6IdB1`<nfvAk5W15~>b+g*e)<*EWgNgS_$VGOGtwXHrxxO=M^`MZux6|2^f zU^-!tWz+<r0#2bM!BrdQG@i$<X~{~|xh3@*i_y+8TaGDJe5VL}Z5qf%=1VnU585=6 zwze?P4ncs(QcqhX9;}d2Dsi7oJ<5a|Ox^dbh5Z#jaU&Fe{fr-yL;3NfWsQS%kGn~u z>4D;b+qb&uoCCS#M}N&BxAUkcEOi2*zNCL(fz)EE$;ilaPO32{EtFeO+5&zx!54d} zhplhNly^SMA0YWi2Qt)Q^bjZcf1NqWH);{KKgh)^=rBLQZ}nICK#)qt7GfCvT}-qI zT8M)bVPs26Mf3FAgM={bexhrwAMs&-jXW9AD=;s1?{4?KK3Io-Up`0q%QfYk>b(o| z(CEihd(c1Y<=GEW11!W7=<Lb1@k2E-&+1#cbffRyAT^R3x72+^j#>l2k-O1T{foRi zp!cGmYYf~Qg6;S@-XBQ6tM7s|eGf)uIQl;vq0&IUX9gR6GZtjX>EOi|MBmQ`0Sni4 zZQ6KKmwZlNzpRg+(Z|2hhp{on(3rozm=~A|<0!LyOZ3kvzTU%;z23XX$-F)!gkqYx zb|li*HF-OEMIjSLkoSt8(bZ;xCv8I$-rxN+Z0I%x2O*AyO>Rs>MK>T1Q?(|dEG?bS zrf8&HZD=GBX0PyD&GV7wR}xQo$E%bS)^Q+`%&T~bw-VY2zQftg8OwnHCF}%k6mOfH z;wm~zf~w1_5n5jSv5OE<I8E#=B`58zjuBXIm1e~VP4gm!G7)K9j>}u6W@H^+$*>Ks z`GC14_aRiy0>Zex$krV7k4>{Pam38mb6urXMdP(@>aQ%SuPdlxO0MRrB7APXNOey6 zZ(Lh!sVUK)GK+}QyJ=cs#!dv9m#DgfDaL~y`~z)zoY;Qu#awj{BhsPo2kz7NcBhtc zE0#CUm?yiM7eckGQu+)^aW+;$4-NK$u&j~0f$t0hYwX>e7aq+EKZPG%$Bc)*Tn)U= z{n?IxsD-c94coCbjLKBJYwj=PkCmscjdl|LMe6=XsW!I6ZB#jh*aFp=)(96Sa4^P3 zuctO`BIDNv`|GJq`{-b+1X|sCh2It-L+hqR{*3Q*Nv?cD(X+f$KlvtHfP(sJ-#Ti} zS=vGau?&$iLtJR_v0S;Z7!oqCfOJAQP0(d6=a!>QAlZ>3F^Mw?gE8e8;S<v@I7JiZ z_e6hDY~sJ9_<FyqH7Lf0vBJK#TslEhsev(>yhJp=q%pCD0dB-4iOAPy(<vb`i$->U z`Zb8AxZo(jPZ{Z=v|b!f?~zp9>s^stalFWBIj10jc1ZNhTySEno@iOvRq&bxRuEHt zl{%w8tgd`sSIY6z4D>bb{qF)gXk!)Yur~|3Mxc$WDQ`N^6RmVIgxwCLHfwUdk7ZY` z{p-}K9F51x9?gKkJIcTWaP+piYpXH&usP7$`KPK`1OyB>wp)Y!nO!8P^^h8z)mN?S z-LAXcU+6N?7bp4W2iMRJzH5$QvnXOK+px%!8`wc-jptptq+shQ3Xqc+zF;85I@MY& zm9MN`#T?%uTM&uy)ImrU+cc$@wA?D(DwA4-FW6l98chpeh|U)D+}zmFqhbbdg`fqu z7AM6qI3K>lKA!5VJ0&=AD&?bl^M|dq*$^35cf6o(*7)`6(TTCSIk#upLpZ-IauZLI zV6)yCz{7{B%d01xE=EU0?7w5=h4C?RDk$Gp=49EH*@+b&Cc&&8<1oB-Iv>WZ=WTra zyn=)2eEAJo;~cX&h@YT?0v=`Hnk}u$HVHk}tULj#1veZ`#^GMRIqpK27pk~HluHHH zFzJyknt6Cl-mh^hw_x80nHPsh=ZtH%$8Qfr>rq(EoPuN3r5mN|)qIt>IQ;TaT3XP@ z^@Z3NzV&Q8dNf`(?VEKg2-c%x?VO_|cP_viS`p(@mP-DQ`wJxYUBD=!$!FG5g3!Z< zgJoHJ2=b`RYVbUzh3hw#swt<COW~H6KC*S=A1MlifF9$w`VBtVxiS|(1@2O9UM6Vm z8i*81oqZ0a-W$Ed)1D_}RM8cTD#$2@{qH^e_%VCxhch5d7oWWgz1zEF%p{D^==xIE zS|1qUB`|_)dcR7n)P9~l>EG=KK@$npz41A$d7p=xU+e#DzoMtg0o0e1)h~h8UAcxL z2Mo?cKPf!DMhA@YU+<o(v)AJ}d$t<p=h-SF{4BAdpN%Gl>mN)8^;ulm;{9|e|7?}V zk7Xa*`0Bl&WiU>{3`KsJmK8Tm@zU1&6hx*RofkBJ9=Ik3*85kA$D*rMvdMv=P9w~Y znogG=RpEce$Je`~H6iJkT3GL{4?e=|JkCP}Ufl}Munk@zXS~BUt_hU!f#&U+B+sm4 z@MZ_H9SVPmN;r+JiQDlxa7$Nq1XOtbt2zSIe%BMYx^7fMI@iA4y*I1q*GV0pz;k?& zy^h$*$2@gF*gtG_++7y}kl1y(=(rY>oyV*@S=!(2Mh`_~J9JFkhxx?Vyy2gPCoY;- z@$WD;ua=iY+d#;8XTM@hyqBE51j;&*o>mc42{i^f)M-$>D&5rW(6>|hX7#!$UgF$} z@~w<3FrB%fs%u3g#HMV0r)&;iNs!dN&i>Q8JvxbTO5bj;%Lq1FED=~#TK5%6&p4Ro z<~T5}aQGaNV`zI-JDE7FhPbSXfz|L;WnAXw+?!2?0uDcm<g<6<Qw3pIF<2Z}8E<#6 z*OHTD2T#@n=FeJs*>!=T_0i5X$gxpE(pGYMSvxkaVtwT4RdueCag^QE5C;<beg{}6 z?lec~Agoy_=vWb5(UraPa*^_yqM}pH7^5>kpJHv=)OoFZ+mu|MNjyTr54rm%bJWz@ zv15mhA3t>B#G#WX51l%dw3)r{+pOpEm!h9%_e39O7b+stm-WRo!WM((9|*OHWk9oS zhW>p9;`)GxV7<SzGy@TnBI#@^pW&6Kg*i-hylE$d>65t(QBQlef%Ug~osU}A-7e8` zzn|Q`@~VKEgKRGK+!&1Z%e+h*)hRZW+^&Kjg@UTf%naP$Z)U6An6>6)N^emOx|NEV zXT;QgmrV^47=DZs0i3;|c$8+_Y-QqcL7}zX$exn9AS&;gLjn#1X#ILCm=FsJYVu~< z1X`O^L1l#(k`Ig-9L<5c#BoG%xa06b4S!LZv!KvMbNTn3ft11pD`K=G|1N|b0Q`Of zxJ@RRLYa*hAt3O`DHKRHg`p|iRGjqY<!fW%3fk`WTxYx`URz+R1L!F_<q<&0XJ9t| z)oT{q42yQg=Z@%D;g<w8T4P2#V#r-u#Zm;MW%x`(WyEG@>d{ZsF?FiYdGC!M$QQ5V z=ZT=PAm`e!{oKZj#Rg(HrIcWtm|UZ{BZs}hScLg7s5BZb+83{YD$%+nPS-my2--hR zWeDV4;6&@<0oNhA$V@xYjhhi01p(kHLh2<qYk6Q>ug39NY#~0EiZ`#6ig^ew;40KE z?T1`DkfPQ)4i59;=IcndwJZvu0}mKA!7HQ6_$Qpk?D($g6dwxFg;=)-(yNEl5@GAR zvhwKJ#(8_Udu11Q*w9CjyqLJ<*LVd|!L-UmcIt}G>PBxfq4G%%;IHS_hiolt-8n;> zgj{*lx_(+3m=yc)F(D%9aTQ#2th>G^JwOSu()QhKf^x8-v7hJpYo;NhFVxe!(p6h8 zx}(qWFuJP`11yFv`a$l!0W8t)<D&j_dngXO**%J>krwxva^(VK+25n(dVhhmAQO2r z4TTIe>)AtU=hOQ5l0Hm$Y)Jc;g}H^z8CS#HxbN9sjlQ3mbD*v1%JB886nsv@q|xts z3{#(8{G*Tz%fNnK-3~vR_L%U}$v}`42qxtFg|!^Rku%qWU0`KJU}lnqnUV8@tzCjV zU3<ko=Z(q2`vj{pd`725ek$kkM9+Hn8JC{upYyeOC{^xF!RzdE<ne_>J2%p8HDmy$ zWOC35;Be4jtLlXYNN+esWVxz?<6ScNmHHGuT8D<fe;4`EM1S!hRka=(S+^>=&wwAa z|8c94=Zrfg&<m!sr+5S%jBdaPAW2NU7iBV;;7DO1tI#m2T$U_Eyde$T;AJULtl=tS zg7DVY@$fl~V8g4N(kIe_)cyg<WQ}O5h%g{H72_U{(KmdpKEX}FUQGC0E2EuAc~|G2 z{Mex}1jDWxf56Ei(u#6qj7=Y!M$X`fQu*iGtpgHc<cYI6UqtY2nAm#hM##?C&_Ckp zyIebop{1)^$DGI5_HNvkFs}Qu-<sj*GE~n*2>^V!nJoA+TDBL1^w_EmBcNUa;>l&7 zSWjRY?TD4*4WvkRaB##~4OrO9p4AI8wP(VQP^ErZyxv4kObPoY=)^#ohzg(R5^{X| z4D1SqeDARog-mNbW?l_aJ!yzkWh%qm@4ai~g9geRK(%XIc7i~u>UTRIjjp#wT|)M| z-Jei%PLlc+9${dotSw*9ML))$^&A@hCT#W-+`pwQ=z2t|_>-CO@+&5dUsvv25aE3R z?*%PfOr{S@vb9t_I(7JJnOG1j(NS=Mv9^W@euFk5I}ju!XgLtp`)UigE|Mm`hppfM z6gpdfM6Ll%ZLJ8_fG*%F$sY1}u1<>h)>WQ>)ux^c(eGstzdcaUex1kzlp$inw}yEQ z>H7R@U!bUi>-X!*aP1`^oD(o6xZQ*o#;_t<XQoQiBrL1HK1jQ$V+oi=^Rh;|KW5Z& zjKp#vu^cNWL1Gx>n;~cxiCy^rF%r`j{vE?$Fxgt*o^%&`3sQ9XPFm1cf+h`{WYCu^ z=hL3Gj;2h!Mhy)+0RROnR)K`TP@bSTf~W`+f(CU=h5HVX>48I#X(VSAv_o`AvmXk{ z?Pd)N!D;C>iR*jb#hD-HcE4yn`kL3O4?h`vxs$s|RZ2$iZWn2<@}%76C@*!V6fCA+ zF@YQeP=ZVZOe-GQz(`fghA^sNlMOZ@?rRFGY*Q+=*M%=GB*nk1o$QE9yvn=lXEF#y zEAGD7Bzf4ba))a&9T1t<(t+qp!Y+nleppwAXM}rxBn{n2Z++_hLFd|!eu$dD%Za;I z6SDIZX0Ci7YKQPH0`g}Ch)$3$5S}t~jSRFPJyB{J$rJpVTYsq=vT~cq%X=U^jzXcb z+*;S$*ofalzE|qeH@n8-S=UJRSYx8rX6n6{KRx+Y^ovv${V-KWzpjt}$Oq&3N4dK` zFngtnU)?oFCg&Wt@uyV2>8Se~y!3}-j15&RIViNI?qA5PR-yD*NA+`@z>V(cNh331 zhFIpg&tu?T19MllA<NJ=u(ZF6CJS1+PhBuenA3Eu7i`~G*=hHbh~pv>ZqWjLnE4M} zA1w9PhD_ekgG)nSwN@Lx3#nSN1QtY+kev;=!ftdCNdl{yMn5dsKy5@<l7*BuC<B?< z=A6SeXOQF-Jw(8e9n8<GOk>c=Opb^&xc&Cmh*B}o7~<*IvQM$A*+}UjxgRu!)&_iO z+Q6K@pPXaeKhj<O6O9~D{E7OKgR8coG;(jW(f1zg;0-;wP}@YH1MZbZOPfAVZ$#m| z*S($3dz(v}UD@~0>Y+~ERN6wht?6>DrI7aTLfXIO#xS-2ai;;aF?%E#GcViUY8u3C z)Q3HiqpZ?xvYZ|*c7uo#;{WYcVlKtReZFYIPm$qEP&LY!fN0heKq%fMz`aTCCuc$F z^xp`Om0PiLl^Ac6j&xSIH_1qX`K&|*qI{vp7tnRpoRlFdUnRPO5>Ewjlk=-0(Lx!q z#T5(;z1+tzcQLjyGt6~bguio!ze00)gxQi-6;1PQFTgmv?2@VMo_JYFl1(?wvs4Y6 zbI)WfutfH4RJk*B6wGM!U4X4+CoM*1;NK2KtvRZl_ldN)Oedy@qZA^W!n+B(Ne;~L zE=H8@btDn~^-vvz`8mXGx0|YSQfb+ZO6o-(4z!my7wZ<b!kxyULXn~n^kw?%Dq6mB zoxZ%BU*?$b@@6}|L&5N3`>}R!6PHT@vjD6YubVn`F&-cbJ)k9!)MOCM<xQPxaL0-w zud!_7J)vV=A-2SoEu+R<D2yHE@@W1rA4l@f9Pw$am=fetak8s6eikI-<Ha_S;FxT= zTIg+aw4h)Z1y5BhR+lRw8MT$(V-Fl$dx&kA3IuFQ&w`^y;`g$_zs8Q!-1LEb{@Af2 z2cF9xKYZlaF|LnJAGnX|6m!+%(rO;j$MgZ0so~hM_|}2v+$}3~*h=x#3{+jIqv6H- zcu$-M=bPL_2hn?Ae0|=?1sO+o^rtu`V5H7)9ISU=X+B(jkk|h@hl`U6J!bQjPz6C8 zl#!iNpYf2^@>agMHZeXi2qfcn4qrKIJNg<gL_gZoda$YOpABudG@)j!37u%>vmZL; z`p~JypX*p7Ah;TJP73IT3FIBH-S>y{Z-!dyFTCa>LlYl$Re?Q`QoD7oXx2Vva==vB z4hk{Bjhi86G^4Q)Yit&p&YLXy2i(l?U+TJmt?Ku|tg;A!z$*7t@7!#jWAV!W68IBd z`SIp?4*YL4NxR?fZnS{I`QyNmG8WE#vp9Fz8@<=UyXT@`poh`lR9C;!X4(bLFK57c zF?PCi;ZKBv9PX24jKQj-WpT+=1IbC!0;LA+IYF8XnwZrV`GOlE0SCRk#boZM2<F0M zTBrl}*vMD``|r}gPCOE6&6|886?)_k>z-^1A`>URq0avveVo(Bm>!s5VO>|pG(O+d z)d77N-!64|^bB7ohSz&_;zeKQ&Go@>o)7@7T2}P+^}d_M>W%9905g4Md8z8Hab>}i zR~;YKhmnv!p~1Ia%u?@vrCwa%qU&i3QH8OsDB<3m%V9<w6AW;3UAgb{b4R~hdHR%z zU|r7Bk#5}|&MBPL<K4S+yD{K(Z;bS{?A|`wIl-@mBaj4MM5HKaN#Kn}?k@f-3ME8M zxmZ=2CQ&Q%$kC!SeIxr~jD65`wDHmAScK+~<F*k#u}`?xj-FwmY_&S2PCkD@v=HaE z%>UfkXF^gfIu#G%H`yU0Ck$UxzJ*3o*?AKlns3Nl&}(@O3yLKjf<_r3T)f~x@$lLE zazOV=<)C917z(sZesei(tY9%wBOnvKr`f8}Z2AkNX2EFHBno3w9A$zrsY{A=WnrX1 zRvHaCBzTByP^^-mMNGrwd`cKxMLdW@OSKM@#$QERI^`;;N$%#I2|8=l1Qn<3L#C@r zTqLYJzeD~@qG9yoNQkqs(N^NxlQF?k7bjYMc&xPZuR7vVW7$BeVteEif5dY2TF?S& zcuT7gw->vrF-f)Mm9v#2R$YtoZX9oXd5x#+&33Rn;`BIL^p1+R0J<z+85qhy5!O8h z%FQ-&rF{u~m%z^&l{c0FoYm`D*W()8c)5Dw@lb#DlYST+iaL2DnZt`IS3RMt_7`D8 zpr7Z_>Q+ev7ooSPEjx$B=K3GPr73^_5$C;Xj70n0;dJz{K1j`uMGVHnx+SgItRwa? zXP=!M3Z`ns7VE=y=Edig9a?r?y-uNjuk(r{u&e9Y%;_Q-ji?bjU8H-IM(v){ra{kP zwqYs@2|OA-vnT;ez0RfzNgpDK$K>PR9lb&VE(t*TDuXWiAt63{p=S^YAVyFGrCt(J z^ul}(6@Q%Ol5@(jw}u0kBhsZ1YXaR3Vd%hdi*=bl2#@LTDLO^Hbw3flf_Ojf99f|o z*#Q^;OXC!KLwKJnvGbMus~28B!;U6%oz+q+UX>EvMZAlOxA24I&{BIi$&x<P7&@y~ zVVe*OK-!3vG~n0@i?wT34|SBI7Q3zd6?93WW(7^?o70@>RC0{IT9e6`)#FXc_6DAx zlgY8@2n`h8KAfp>WkzbbA@T=-X~SqPB$}C<D^|~2C3ABaDR>eaNrY^~7+ueK6BrN8 z4JKlC;<<Q_er6oDTy%#~!pb695NmGd)SRRm0YDd|-0nN~P5SSV9Z?pOk$@mE`K1Ke zqEd=k!?9G2>G891^6&YjfhyL9I31CORdJp;`OYsUSuCN~HHW<dy%EOq0+VriIf}cJ z*51154hmoc!{J-hj)+(|&Iz>W0_VtfE;H_|fp~xgR0zqa<j`6mQY2^r(T!ykk?DH9 zsY&N!z8WbM!dOs&O6-(BeB~%9wXsV+ym(X#?C`!t#0C4fOQ89i1aq-9p14aHX=i&O zUl_YGws&lCtjYFTA-)kv%`X9;ga{IVX)|3YUd39wcr{TX+lj!bL7}E$B^Q$_L7nWP zv=&@#I(hw-jjAfpk2|(RMrCCOba(<Q8GqzjsV1M<j@?fg=Up04jg7yb5&rgo3PGig z!xe&z4IPXd0RNid?VsU^bL(glGm9I4aT^cKKIECEv1pYEoL=8F8wwHZ3lz1!F}Xp0 zkQV3!;dy?&xT1j>HNV{w11BPbpQKdu$Mk`fbc-xpKpqZ2wlpB7!y4Gd1?)x+F+B{b z{ms2+4Pgd^npqa!hxr7(6VfGa61DSDHQJ`-^$jdb90O|Faz}w6cwg-dW8n8<GEk`( zP+v%eoU)Qpyq@TP<^wk>Gmse!Xm5Q8t@P{00j!TOjLEklLnBh^ME5j6O%qt9g(n3W zzg=A)+zk8HkA*bsokiCh%<6b)Iypwg(W2Rsv^zdXH8%Ad$+<_)7&d+|r5l&GiG}2H z?)k#>99hS}iwXAfHm<}Fgw2t7ddURDF!W}LR#~o0mdVR}#~UgLr0}C_9sV|*P68xL zC)UZYao2VIZhVzc4q70uG5~HBKe1Y|-~q{`1c?^ZhoUsuj4<t*g68q8@%$uJxtZ>5 z5jMm`$UzD=5g}rCG3gQEA@V~37!~?S8Wl%`I5ko6r|4rc#NL00(eVdrFs5`GQU$`W zji$lY3B>B)(vVQ_(Fq~X{AuluV~>o})}zG|ZYDaX;&@;gES{3SQ**`bZ!lzNMp^=n z#&E7BQ%;%~NFpyCpHz9ouz>n7uTn04F|a%WkzI$}!z^4F5P#S>+n(dfUPovV0tET9 zGoez#8DHfrJAC2T@uLtFao!Gh{Q1NAPCguL#_fbt)+mO^3x*sY_a+q7h2oX!oNK;~ z^t;uw$PNcSbZFUtF*j}?%NCZo;5>Ya(fl<>_!P#Lu2)M7L>ybXQ7v7+?yhcJzdn87 z0P^NG87K-?Z|4){68<;iRw)wY=Si&`V7heaB|UM?@N7E!aN0ekX`UT;&cE1#cePn< zqqZJ9?Qp4?BF@K~^n<pj+*q`3)b-(H0Y=Zz()wUnR2i&l)|+O4s8DHaZ^NnsR`+t$ zytm&0;*V-?3*xRP6j<!?rMD(`Pwm|E=?@nsKAVpeys)LC!bm6hHA@~25-^gCrNBy$ z#R#O$;b9%Fgbv%c`nJoL_kZ}(?N7dSY5(Mhijxb+CQrY$r=>xiXx5;_t`;B38pTAA z^9=lg-4=Md*LnTddoJ(49es<E*e~|4Ru)OQ;Os&F0DyO#iRA!TeF&HU=f(R0@?-`O zwBQ`2j6xGACf@#6!rRQmpX{Oa&vD%mgq0YC+~v2T$5j548qmMZOY8j=bdI(1dattF zSQ5AlD%RqQmENcM;uPLr=&FyEdhR**OhqIkT!Z4&y+=?fr`(k?7Zq(U4q2}R7fl69 zB_pmy11Ju%I1=RS<&(~!GAI+HqEx81wPlgV#+J6qwio;W*q88-i0)vRScA*Az~6V^ zJ8qjfCYTI8;Yxn|(p%%1`s{Tllhn%@VzFv17RIz{-on3vlvGFaV~S3A@c9>BeCb08 zjU1OOPS%r>#VhmFeD&HQu5vdk%PViAkX?P}*6lm>_HXW-)w^n=^P4+o#~eDm0J2Uq zHIBQug1r!qGZ5mIVvOE`e06*Yw>zGVC+?)OuEXr<5o1Fs9>qx8^xP6(SxxXE#lV93 zb5255tHO>CxS>?Ls#0x(gOMVaLu`A~D|3nxax`wos*tJ{>)PskQEBGlXYME_I$ha0 zDu`z`JC1xIq$il0yFBUh2rxfjeQvxpH|JT7Ottvebgr7<qnB?JaMXd5&ljlY_JL{f zyf|Bt3c>XAlzN6jNi`EzaR2QcJCavbQn~abDK<A$Te5;($r`*VR&DXhA{y>H?Eqb# zw{)>MyK)-C6PZa?G7189e-o(t4?Y;wc%)G=vy((ZiXG>VrmJ`bH!&odUW{P@TJd;O z9yG>coP|x3vG+r{Ht$0$*wo#T!dIRK+C!Nd-OFXHo$sXIcQqcHyvWv?-Ki(}q{_A^ z$IiUNpd8W8vOKSjDz<_GOv*gy^H|cz2C~#EI~Tj^(^aVtHAv1OA+UG9Qv+sN&_M$h zd?*bd2Kt6!zfSq)b5823KM>BjUMTAN9)}lN58Bk7SQ{wZYN(u})@<c1M$9*L_X(b@ z_kipsy4SnC^=p<4SG$f3f4ozhW+vCR<ImB?Luv6iUw(|T>%EAUWQ#i_t-s+7Hx{uL z??*Gk@I(tpq0{n1QxDfiiGF^Z<xY09Q{uT^)*<?*bvBu<?icmddi>{f&)T`cd#h?k z8s@Gi2XR#$Yj$A>Q)|;J>*90(0rBjxUCaL1agO@7SKWC4;cp_e5FUVSf@w;GVh|g0 zM_n3o;KYTXN9PnZ&t9-7cwRM?5Xo(9#08k>jz{>lFx#wd_?Wvnvvz!1F0Al2SOH@l z6+%knX6jD|X25BCWZDjBzTIa_(J=KQg!o~tn_iJ{(I4b8dNUqIjo|tag3HB)J13Tx z{>w05U5sG;8LM6K9*)&`m@L+~yv+rxL2f$HH#8+SIaa?-&ZnsV$Ky(SM|v^~PfJ}r z*RPRx$+T!nihqFut+N7(xe0b@GbcU)p*!CU%_*X(i~*LMhzyC}DVrYH;yWSUju~G; zNt6;<ZQw?bK2)mk5H}r@a5&4IG(9~!moJds)Y@&sq~LP_N0u1YGzS<6K3;fycsDPu zB*RL?W|bl}m}<T-HnZ<oe&*O%i?#`~_$6W~h-ngsa&4+otfZ=7Fa!oQxoD~3oJ$2i zP?4-2Y3#WJ2Vq4H=G7>FV;@uQi$~#uR_w}K&1go$kFGV-wzm7Zc(<!5(5J|E(8z#b zXQWd|M52X1&H8aT?SrY#C95%r7u;)qf#y<IwhFIN%TH<*3J-K`Y@zrC;R$}7kj%3f zr5-0Fo9Hb*%6ontrdOTe2n&y({jUs<?%b0q8TwQrXDjY#(@d_)5M!jxI@uw0JDA6X zUT>~d8uZ{2Ez;LD5Hsk3$4sZ2%xFW$#%J&?_0-;*rjyV)O`I&^B~~R*#~@=op5TWp zo(g*Fl7hOR5x++%dZh<6N^|9YLv;ThAS}17=YoR}dO`s~T<yv3_^$Q&Ax3D-t@FgJ zDEa}`k6U-`n9&8E{<o<WsQnOr#14y@k|j%ZhL5aAbp3In-oSU-Cz0^3WAnb&gRSdR zFj9(jbKG0HVp=bsAs_PwCEP4>SMX?G@eD^x!c^I*2BDY1pjvb{iQ;4@Szd96jf4}u zzqDjXA`VU<dNFU)an5OWEDFLDF#?Q^M9M`@T?|K-q)LJYX2m)^lA{_SGF==f@Tv%5 z@Gh;0^mHz^aoaN5%+zI;UtYzeuxIv?oqX^%62cjrb8`^*vs&5mD)tyR_|!KeU3*(u zRw<7p=7ougK-@ZN-;6%l6{gw~jDEjaqE`)0;=k+ym|np&m3p$rK;9cVN_T_98VWmg zx$NRXY8Qv|#zr-kel?vhb7^-z-^Xm&8arG<S6fbo*1pEbKh!owCgBSxhpI%&8IPX| zsqEjMpPtSiz`MGbKYcpCznI@&%1;+FWq2oL;{ex#=`6%*m;-NY+HnftC#USC)Nz$q zcf{3AbO!R~oxGBzmq5G{{1x$|NB?*q7+VB~_XVy-UbJ#s;M&9simg66gG+L}fQfHq zFfqw7JSJvOme?3eC_LmRT3scrd8EB+s=Vr|F<E!8w&>8wR?XLgCQ@R{=@<9rb*N9j z$d?1pKhKr!KF60AQmFm`!+mM|^-sx|_G7QjeB|WW*L8XN>^c20bKF<Yo;!aErCJR6 z_hdLO*?IR`)l9+sd3Tl|#F_Ih|GGx`BVm-!yHP%VhnF}h&oj!r@+n5SlMb*4tZn2C zC_aO}8^&^qn4QT`z9K|odSBwbt8lY#ZN<+I^Uek6{GZHysq05`Z}%eRG?H2$G26vX zu6#Wg{W<PMe}tpN6){q03t#`44jP>*{bD{{z$<WELNTorlk3BZkRm(mqp8#DFVUe? zrT>;n|F`(`>aK4Ks3fTdyl4@B{wzgtR{AMHWjBm(`+}hFb+8)LsxcCI?^?0;4E{Tm z{Htn8>anh!qoni167oBPq+(DqhRh)Hy6LM<@YmRfpiWapDzh+VkiN`AXA^x_SMgvv z=27(Juh5*)m%p{j*ZV9pWJmx1e;ZeC)F%z<M+g28zXm(LDzP|&1h8GW)#t?UjUd+e zB0f&!3nt|)cYAAn1jHrE5eaL1u&DV%wE+dVy*E@F#tNqw7n_v&t2R>GSQ~BhaMx^b z8ssE%mY_sQ+Jr66z}0RAPQmeo9Dw(RO2efMpGQ{9Q(Se-YNxOA`$`+{ZE+4dwXIHk zLV(^!l2#G1^xy41E+?n9tpnS(_quDF925?Q2f(qp6^`1Ywe6)XQtjcOG@|zj>e~n8 zTLmA==Eq8pl(xN>yZ1Pw@x*)93;OhA>CuLT?!wY&fYRF^Q2H@ndVq+IeX}3nbAV6Y zwWPa`*U!BsBOZ}9*W##9vCLVSM9um}a#qP+MN7$82;m3{w5r6)dp(g;v<I>YiT*6h zqTVw*c__NhG9bin@#?p`k9@m(-)V$QhqOh`vQAof7A>ap{ASc5@<I4I+I8)W=&!|_ zxE)2RmEVnZnB%NIFe_sX8EPb3I_9fx2#BvyKC?jt04+FinNXNRV2CNYZVW`IV!eO4 zq${~db<DWk*GXp912pDWDVf<|SN*AWFa?Rx!;eSw%?FOdU>JvJNnQO0UHf+TAq$gK z?>+o%^=S0-nxwwN`?#KXDrJKH6#cgJe$gRay`ql~>*J&PFxA+XbS3&fdO;s%kY|yW zOnbIV_x_Pu{id$2=%cKU8GV2{@Wh`z<GdI9i~xzu?A`3w|0+G37$lW)@hWWdde7~f zOJbs{T372ExO)u4%o%+d@n1ecrrGlPfL1D#z5b}t2Xd9Do?(TaJ4S}z`5Wtlra7QM z6S_pu7naGd0a{g=9lJ;(*h?UeelT<|IC`}E$?xQHPyJ>t*Z-USz1v97tb3#18T?MJ z=c(Vw_4NNnZ|}C;RQD8ky}vv9dAg8URt$wLs}uY+k)Dt`e!k*la>b8QJmF;C*VZ$V zQ07RE4ROpyvJa;q0`T({yUH#QQC>!b0<mR;r!)#K0q{HozN;a&di7RcX5nQCuwV<E zFv&Px7#!YStvLSlfwo#^c6Efr!nM-T*JY<jzGWB<SO$29!_c&--j9r3tJPMjhxYBe z3XrQ;rZ~X&#dad8t6PgV7RQdpPY&-Z9!1J^V-Y^)YWeU!nn=j}9T1y|!4?cTIRQxX z7QdXvV>XxqD24N4LT*PI`@zKVKYw7dM)=Nz7BB8CdK-mwqlGafT5&x@M7<IG$%=_Z zn7ufG!d{OxT1YGQ<n3-kOp5+j0Zn9F57d21<F8kn6#F~Ol-f+0W2274$Br7ZCZ^+! za(+z1Kb9xd)vXGLKvbR(gByb^R*6ca_VE$@*;^U`Esn&FLdC+5Ghq{qQ*n==ktgMd zW_Q(MM>B(DcF-5Tk40e+>x9t;<j?=apQha&y~!5bBBU%--?jbWw`u*a{C4)}Cm(W) zS{!MnSIf}tX4|U!l6{)x!Vjg5?gPi2UVTpKcOm-Q8jHWvW<Wm4FigY)(m$_Z2|pA! zyd^5ODl?}>SF}}_t7JBC_<t)R5`KbTFgNzkcfCslr8qc(Da&O>4VLRKz5sQY8bP_j zvWSE^77;v%tS~WzS4c>ffW9}DU?Xfx*)F4JwD&ziO81+A2FF*)KjAz%)6at4Ch>2u zoJN}}<)e-h+Z=Q9y8*cY(1No{F1l6&$>UX(UP*%8Zg|t7KMaW3AePvBK_<nv8l5f! z4;&H)IT62M;zYxH_`*rq6S1=~E;{+zC-~xL_=L>dT4D51V2w&X7SnUaU>LF%p0=i) z>Ut`F-c&c@t`XC~7wMgaMR|B9J@BTyhU2};o3!m7^GwRu$Aliij9Pkk!zFWb1%~Tt z<;WNo?AJhAQg-^0k6n}@6)pd|d3iX6@7&z(-Rd>c6a}u99vag=1W)mp2JE9gnSR>P zPyUTNSPEApSe4l@^N%bh0cQ8^&y3A0$1uU0P7vi{8B%m?FD3_qk$VovwV=+H%07&U z+L^Sj=MAZ+yI2^jRHxlSQf+a~<oVH~1BYDwd&3|w3U265Gp%utoVB#;f6;x>!73Z* zg~i(`D{2{lXtI3lDdAKw|4sBf@mlqDNet;$m@Fcy1Or7%DQjx7&`VO)iZ+mETHb}= zq^~0dcW#Xt^HH$H#V!3Mn*!rwYf5m^Spc(X342PV%+E0_*$c~gr$z&Qf4C>zFW+YI zF|2a!5A{2>qOznqRIuvF5Xn}X*Z$P8nNQ7r;@Fvwp8`^rpN7aLtO+BAWy`Q#tKC%6 z)MmNg;nLzeN5cZMBkMdX#cabfcU3N5yR%Y0GIo_1vtvi6^9S?D4D<UB?`x?dQ@FTt zjnaFc%OBu(dhc|H@<&bLbxlVp(qbBFSI#vR1D5U#K<wqWEz!Y!$d33ml60W+bgPAp zNWWm>h`sBEUTvpVsx1Sz8C=ifYSfy>f>GrX)nJnrLvO~bw2&IRl!#I92NEc*FSd;r zYz<YeUO^GbSSv+8X~9|r*RY!bg>hEK^<_yRO@0$8<j9iL>r<*dGfD~hUG#%xgCS!Q zL3W=}lk-Y*ObZ*s%-~Vctc~`=4`60YlU<M+Q5!87ayKipaU1VvP*q1VrlH1%9Ma_F z^oX_!YU2%*EX?GV?L<CO`^JVYD`o6~43Qkr<OH&2G%4d|BEQIG3+>QCu35$y&5IXp zl9EZNcvEzb6Dsz1)t|`@bQ07pmL|@t@$e&2rzBn`BfZFlh@ZFK01$$`D}Xx^gPmgZ zWaQB3LB4~LLxV8z*GbkyAR8h^DG`&deJKTe_jeb1oKeKvz23Q?zC9!=wjCRv`Sm>s zh8-s~JA1n7&|+R+_r|7k`i9xWZUBwm=3{**#-|vnd{wtCQ%4_!F;P2dU`9;#kgh%< z4jW~5pT77kvnJV;$g`qB)ZlgzOlS~a?(KYze5d|Ihv8f)PIO04@gmSjZt5D7!)Rm@ zRGX(?WTc%mQ?O2}2@87n66`qc=A#5&$~g0dRdIsS)u;JDkT}Ay6M3hC4V7YgF5t(} z=vwUll9|R7{}!*DUnHvp4$Tk}oLdrRi8x9hZ^yzw&l!ng>(NeJ%>u=-A_FVf`3b#a zijC6Z!ouP_Ud#}%E(~OHz{bvG83IN~%n>%<+oR0DeCV?*F8#g^vt3KIml={>R|z!Z z4>qglyMD3-Y$4PmjDEip>4fN;f;-AUn=wL;PY#bbt)BOTG*d^(cljhzw_-egpR>Ys zExXl{jh)CHRG(zFzdMhJ`rxxww{6$^Y`KAAggCHYAF}TvW7mgbV%FakI%_@`Zt>df za4vN1*i6!fLiEcZ#d#eR;YXSr*)|xy`7=EIh`3@LflFW-Y#BiFcX0}q?^pvXO`(6( z3Ca(MJ;TYaAIZH{;h-2;8*B`gc&3Q(vdp>MyEe2oytZL&q%mCTztI)Vm55aa4kI^} z{;qAb`<N;=hDyCR2CJVZ!0!;2phFxZKV0iA4d3nNkQt)x(X~y2;a*>3BWje*jSaQ_ z>jM^}Y=t^DkZbT4iG)VHGbtWwgXAq7Qce1XYx9=MAEDHcmEUb`4H18AB)rk+Prv29 z#cw`krP3u(ro>NAx*ky5f|VO(bST@{<o-HX8ZCDXra^j$66bT>m0z*`3<F;-y5Ral zjen7-Y(uq?yF_BEew7Gu^oMA0y^W#k8ylNF#6#{X)5lyi8u#(v#(fNL*vN#p{OGto zrb}#Y)5l!&(YTM4wLZr0SRXTYoBF8UZnXIvp_lK{w~^XtZPNmoVfg;p#+K`w8zW!B z46QQU*m93+b2;D4was~>|9IEOx|sRRM6a7ttUJE-S+<wa;u40XUK*3K4ULIkoo-hN zpoZ0#$rw`F9(TyCu5eNs9t}La3y`1}In68#G%1>ur#XLZ5iTF6Br-4O&w7qOSkEIu zCK!vW2pa$wh8~;vh1#TKBF3;QCGPV4B0{2f%2Z+YB(dG9qKuem@`~e4+0sQM-e!Lj zKuZgGr%Y)sjf))GOHSw{h8JOr>M>A=dA&@ele*)>#g9W4AfCdEOd&JP`pYLCF=??0 zF~rFGE<1Z3GBnBgz!IfG3n0P^mXtG?kYNvL{?OjBT9kxR8^$n;==4GX{0vkTLnk?a zg4`LDi`D8Xuy|8XH}XglsN78Uko=Uh{JM=?Y>DIIp1y%@1n^xfJy@PH4hogUDvsqi zX#!@YwkW$&*WgV;(I8&Hi`(bK<4*#VCthd;WQ%wS0g@fklf(n4mQU&MnM_Ru?2@^E z(*lb|-2BaDq*Ih#oX>m1tRRwi73K34?0CvfyhUBhD`zCn!aLB5wSweEj-g@{%PfUt zM3ebpfxT097GOZ=#jVL24@>`LSAo?k85D~^U}_Q&PT<w8J~_P!)nE&I0V`7^9JXrD zu!fIm;re9I&dkpQWajgjh$++&8y#=Kn25hqAgMcQJgkqG*@u{%g%xW9jli_%{a=D- zhplVwv$JLH<@QA}f5sUQzpOPF;0|NVfK>C(A;yb=LZKu*hxPxKY`ipYUiBN`s@+QB zqQpQdn-1H?iFXD4a|l@&qR`Z2+<34V0vHAB(@3kJpMQ<LM;!TrBFsuQJROgG9x;os z#d9&aGubo;p?aUtg0jp30A<HirEKm3eCBi`WQ4paMnRH;g%ul56(J-S%$>+kDA5h# zKIT~}%PY1Lrp~?gkykHBdW9-2xqIf+X>K|LdghVT(26kO)=L1~Ze?ZT0VL*B<X-}F zYJQvu!$F%K#H2{Rpm|AGpH$>#{bt#w#CbdAmv1iCSVj}Jbedlkw9YItsU%)J(p`D! zv$w=#tC#?cx8!($ump4?#3S!nfKDozn`@FY?Ov!z%4*AAABDiQy`iy-aa{JT#B*wi z4rh^()^W_(+4)0}fbT;)>A0Rr45h+2p!lW7!n=Rf?nHa&x+h%S20&Z8Y8PH9K4#cB z3t;ET#Nd=fYS%!=;8d*=kR8t7K}DdE+kvzoT9mrn$$CRyRnl9V#;bhR=`f}g2drEQ z_Neh2R3r);7Ng~jMM!~~IPECmzG${~Eiff0gp;F7maEowL%^xd)LsYXOL3FxL1BCn zImfgxR%)9~WM3&b7lZNL`F-PvvV|~wX>Gp_h4<tqA6z&D<Pa!HmpWTWKELO=-7jQ2 zz^#d<dy@wyC#R<~#gP2&#fo`p>E!Col_M6mrlSfq+sLI$m^+T|;q^-(_VL|ZyzmxI z*m3oRCI~JiZ#+kks_;hgLKAqDw@Eml!kP{Db$VK@Xkg|8;}rh(aPbPi=9?8~)Fy~D z?rz-|iKH&2Vg1R>vPjH$W=|i#km1L~o5fPW?R>$w%%`!nc+R=2T{3qv13D~sEKI{N zY+LjjZA62=!2AC?W&sg4)pvG=!+9dSh9GHXqWb~{fo35nVO6wIAF3?HW14hJva|Ib zI`PYD1u#ezi>V6*zryuQ^mhf>8khBfXCXE@3F|}8R{f;~0Ik2`PHsCTk0hscI2_wx zT~6rq(QWQ{^%vrEHN0sAdA=~sCUN9=zHoqRksq=WBXVNlxrzFL?0f!P#SK?#KoxE} zHRTPuC6c(-#b007l?AfAtiGD%&m8yGd$k>13Z<R;-e+f~vraO*BAYs;R(An1zeJ&l zt?Pq<#9Z%pR3WZmAlda^p<_3+$`6UpKZfe3AYh_@uCFp0icXdn^p@@-;RGq&Ss%@k za3+`}^CS~7BS8YMsq}QXIN-8UTD^Zl(`d6CPj$3PTYp?rJ;z1YtDF1!5tD8u_~qk> zO1I(Mm-`Nxf-M^RAbBYXq1nAFr@z~~w|}R<XP761%cQKrXf{3LJ=HdX$<kJ?h~0m1 ztnlGOmp(mqxpFzWeEF>g-^Ru!^yl(rdvg1&#_e>p0Mf?p{&x3R-P4X4Z|BnTs*VP; z^QqPkj#~xesj9J$e_++)ZL1a)l~lbu?dsx5EMJ1<lmTPCd$qn@VF{M8aK^%3^o@6k z%OC|w=wl&`(wj;akKki-O~zLelpq?uF^J$`x67v~!9g^p2>s;sa@UqWiS&I$A3)T? zTke_|aJd^p(dT5n+UVKTrGWN|N~+N8h;u9xgai(EWrIp$KiQzJ<p_a4d~d^hO{J~O zfGdLtAXmBVYyXwF_7R2D*@T@aLJjJ)t9}aupKXay`o5)uW>@Rqd%#;m@mqt8jERtH z8xdcj#ZWI9lM;FhL=S?ZwpnRuk0aPR&Nm?1B#6{k#0$NZotctoIog#XLf)3r28~#p zgjV=|r1%q<54VaXjJDP!JND1$$gEF3+c;RMy5q)Ms)oSsNHGdyg)t+%$0qoT;#|Zl zHOnO}@a1o`vaYHbHbFd^Ya(&r7s-f%+*neBDIBM1GLcpx4qt|(jpY=)6w^m3jO^Yf zj=T#s<}TFh_uJyc`)<*B$h8v0aEb6>q8mMroa$`M;G}yy1C^Dcg&`9$_7hrcQ@5U} zdtqS36nP8dFp%l#^HX&sR?npI1?0EAgLwnvT&6+Cpo$@p1F_^5kf5Y5(>cb(!=_2L z!9s9>0WJEURpGmss>At96<07FEW>dx!8<ZA&6xvyjaJ8%a_v?bgO(KhXyp=PlMsl& zDe8jXq->G|8~G^XaTBu`Vi&>~*-pr&%`r<0m@{iwKoBl59#eW7jJD%dB+ChmGkju8 zjSkGTr6yo}d{o3RC+*+YAZnPHJ%TE%B4eR<>FIy~FmQ@y^rUf4h7$>1ut>Ve)?1Wd zA$eN$n7`=!-U3&5me7PW8os_Rt5%l-!pZae;$XV1-B2zK6NX8$JQ3NHp@SSQFl#e6 z?AQ}A3$A@{hvJrXB8&)A(pg<+adf?&-*FyeW*G)!qmd`3rjlmZ*3K_1Ei)hPgiBdE z5X5U~HeJsNmoB%E+}ndZ)ww0Q?4i)<N&zo|TR+Bh!Ht;<o%2-NGd>G-Zr6xfs`{Fg z_rjMp?3;TMS4{t@)`C^D`!itfajhnmo_XWgxxMH3;0>HH3xRLOkg70|wouV&J}Y|+ z3c5{rihW!d{|o?+ukn%WiX(;e%wjGwf4+8SsmuT=^m<yuH$NM5!bg;rBMoa|OcRtE zaW`t=)As}mFG#-olu`$=)s1H&Y<ibbnW2JuzVsHBEL>L2tXHEEk7a1i{Z)1eKMcY2 zB^k=3GgEFX3fX=q>{%5Vz<e2Y9RjJ<{z;2)u{yh4Dv8m~-=4^SrUe`y1GRAb*#i?U zO?3ctEonx#R0HEWTU*9_<aR-5CVx$z?P_KB73`rBc#M-_cGoUfSUEk$KSVI<R!G!H zfCg(n_x{ABE~#On2|ATtLwpP_y?<5H`}Z{0cC3AEnXy@mzoiYagb}sSBuh@sQpPkp zH79M&lE$7bXr)a+syu6!QxjF$VP7S3!m|baov4oGpS5N<?F@`o0~<H3WNBd=_?KbL z`KC>Ddps4fEt#|C(waOKw}}d`)ThFkkUFP5@vR{Em2i-7fK}<njPaK)`WcjW{G)3z zyos9+wD=QUG9rdO|23XqxcxKy>F9g*4(z>i@Odgh6NzXbc=*WXC;oYGtI@v^-*#6G zH!*KN$h|wE&F^Zh-~T<S^=_!Oezx6|v67t6d2AWvI4JCS?Pv^?QF11Wh%#GrY>*tW zYqE%>z{J+bxOj`~Gt5{!&R&i_k(l^MCQ{Kpef$r4DxTdOz??IYGITnrfO!wSps(gk zB&onepLlc8;OqU4GFH}hBi^D<YRbgcH&5AR?oBcb)mORbI;Qj#!=BrQ-^TG$Zaj~7 z_kU-wN6&EM(Qj_#HwSU$>F?W)`I0Lm-g=l66+7Xr=V>kek&vgKU)`%pl#oPuS?jTD z7&CIe_u91>z(I1NDYlc+@(#RbQ9RL3_bcbAe$m<X%1!YentoWt0e`QDlKpaJTtgdd zr3fs}9l1shHOOIB8<6fEC&B?(v988oZ9q&K*LK%w-JOnqZ5Z~`m+n*&h=$3&gX^Ur zb!mee!?d@-GR}__|F6V~KczP|vQ)HuGf|9Ohy&Twk@+jc>bc<~xdx)qg?&cBYWiAF z-C99V3;J0d=VoZ`?Y<ojwKKAfw$Y(x)QxKCe0X0}M3((Xz;!|N5SquW8F3tNJPRKs zr92g!j>U69u2<Z%hC-|EF3l4A+^Zymmjb@+QfWxtv<wkc!B2^kA{iQ5pO3xWQE+*( zI0ouXII!2Oe7SU7oy$<no<A%47<K`8ufGq3K7seez8FQ0;aUn>Phd>?djNlBd6}?u zRw(3u5Bf4UIYC(HYSBoP?~raeG%YU1xGZwXi265m>&qwuO}k@~Ya^yzWemS5T%`UD zHN;)#H1x#%5f~$%{mh+y$HYEi_>}@F@ITPgbU@lBG{JLoR)U#v3o7=oXroXOZQVpM z(R}_`p`JOjkEJE^meOng{s1}z$VaH+*n!lI?3d@_C&%L}wQ~G;p}6<T-uX;Z$B(Dm za>b4nGDY(FD_4r?Qg$QVzTHTgJrOs1GQLvHY~P!O+k5Xc)h@O(U%pDf^Xw>y*5XG@ zQe2IwqJ%(9tult>(zH_s=%s4yrXr=EcJWdQDWkkZRmAfY>ylzy5|UU%*GZ^)iWbHI zQ#rd+73}d$3cQA%#58)$nL8pqd4o*Il#__a{vJxv{c0-kCt=+m*JdoJFR&-JL0M(< zH=5yF06fPn8Tn=a@3Bi)VXF6$nT%&fM#H5a0bou+p|S*Q!JO@3mJ4yUPWZkh;Q7`L zAI=xz+8gNsY@~vFC9g5zFd&w*tUWA8G}^w=cxl*_t0_MS3ove}nlkOCM&#ylX>}>) z49~`?YE)gS7;=7c-$vNUz-K0}WCBHLcPG7w-<Vo)jsd>5R;n5jnzc2a)+j38N8B?s zlH&!D%yoTCka{omh#WiVuheyH+LH5Svij}c52X#Gcxn72s>3DmBh{a!h&dK={*ma9 zJ4xlr3z&Rs1Lg5dfdFPvO<d8({6hf@4)PG&FyzONA6K{&-)Z$XuU-mzVInK5D-SkT z26z+fC(^KwpG<#i(-YyQbdk{dZS~;J!*s(}njaS`OTdrkEbfC4ng&`wHo6(ouNP`h zzh?J8!v)#`Gz%nv?Ta?cT3`ADzAKsqiJisWV4V5U__{Yb>LOv3a`Fg3t3VCJxCkK- z3BvpX)LP$!Ng56%OF`6D-z*jj*>M><f>SlRgR;?7Xs0M1?bU~@`@i0svgZFhHz1r> zBVrw5z`r4dq#V&~s>n@P%+23;gNk1>B=%25JBtm%q`ymP-IOPIq`ST=gZC1itLgR5 z!*zfv8LZ~v>5azTm9`dY7i-3m^zek-3O~S`^-(th)zvGm|2>g){qOV4IX3(|=<(>^ z>%*8h>)fb8cYgJX>)XFj-{iN^<@%MYKYPDk#qV|Q)cx1MyTnL{=RRCx>U*QRdfa!^ z=AHo{uzz=#b=a?g=#Rkx)i+tME0{_;Kr_>B{v4KUqFvuNTHinJU;I^d-P|brv_7Rt zMYk<V)KivClNw&F=Z5m@{jbfOJT-H{!e*=wetgD#t&fHZ93?if!7+Uw)T}H?QM;&* zByWW&dy_yB6+QhC=4@ia`qnI^Cel6nHBIM=_{RTRSO1Sb{)0X~r+dH7)q3w6r%s() z@Bg@gx87g9X)oFmu*INt5Jh}^Nh46;qU-mJ42}$p3~Ylf+{!;P8Rl}tci7Hv?l%W} z2c>w;5zc+bC1Rn^@1Nwe^nyNK(&d6K7u@B-TlL3Os5q@BR~Gmvy{N}8zE#i79;y$> zcMQL=`r}ujO4-3TSMrrBRTnuhUnKigz5nRpUHP%``pB-rhu=8NWT1mS8vQt3tLG+O zu5b0O!<NL!J#CRgP}UivYkn=GX4iE>yQ5X>uAlQNH9PRoS;b-SeCWx*6D0M^wb;ys zpyC%J7yT7Xl;{vJtRJ0~hutXymPky|KcV6Eeg|G#LCRGMU~TSQ?{oES`!4S`b@J}F z8oGLBAA0C|Zuh?WrW4SI2y_iFYOHTM{LJL!rOVaJ=il1>;mOIP^$~+r<D$p8sonJv zR6ge0jOAFlzGdG&(|2F4G%kJma^)>59^SVvu5ZhUJ$ss(=-ELf+XA1NZaw-dtk7@g z@<VtH&|vX3*of$VWWeX?Q07O<=2!Tw{z=}5jao2gDfgE9?si}7=kEZ22g^fc)U5Y5 zDEj`rk#hfg-4{1<Z`AII=O57<Wc=Xy#ZBeS3U)+k%K6e;%3F{IjFgcTl;Hf6Z%7a} zNP=*2YkBLvM@j@hl0vw<tGu<mrM#`Yt+auf9(|ARPBw5{<*^*UxV^mn-XrD5tn6ml zopXQG+EZ<h1H&e}w>iG|MEQyG<Hu>6I-Y#5>*5C}v&G76jmtbmuRd6M1PGtj=iMB& z5<2PP_fhsyE4!U<dA>bn-yY}NGv#MWPn4fQjZPLC>(2+cI|lUO{!_Y-D*l7i+j7_5 zc$znMly}_QS^B;(0;D;~+p}kQ_H21qd93^_(C@Gj7*hs!VB_z_aiG~@-*)n?P@X6q zDeWqaf1VN-ck}INX`-~-zU`sp9xJ(*l6(0!Y2T*!Hp#br_H94krpo(l)c5Q2c-O^g z>X|Mb_&mM1cmP<QD<3R9C&hmG`MX_G?=x;Ml%6Xc{33y|=;Mo}=VeTwUQ;Kd4XiIv z?@Q$m@$}HWmzmL*j(3$_EWPwaayjtyLp(iPo+$U04rv7R-o+#K{pI-k(b8cM#D}9g zYqt1($h2NnG8V}Rs&a_-Xa~dfN#o!%Qiq^-l=ct-j%7}9O0(;jr%l4ZM@du%3^-(Q zy}Y9B8Z4j9`j;>U|8H^E0vu;`omaan>6g5gf6KCLj4@k*v1ChYNq%4y$CfPH_$dq$ z4@)*{S-TP|+p@ST8GCKV1~UZGOhVcOmxd`0m;eb(fRMyMTGA(zv|~s!6T{NXXoi-? znWnT%r=4M@xZii~|J;Wx7}8kY^WXQq=iYnn^W1X=cou+rW`~Cp$JONiORu&JYjAgG zU+F>a!~XPYLb%#XU)wW1kmC4*=XbpIm1C#XaD)792DeuJxLDVc80=WM9G0^Z9$>j! zD&+3)EUvLQO;KXp>_TQ9g?RFc8N;Mg>g^q!s}J-K#4WD^#oN5&(DK!((L>8UVI0KZ zxsskMT~DXLo4apXwX(Uz35$J966H%Dq$}?TlaSNwVd}IoqYu=>Cw)Qb;38xPz4g}3 z>sODDrxN*IGUzqgch(7EbyzKqamO)E-d;qN76BUtu3z*t<B=j^XN5x=@}l<~+^pN# zsocB(8+kKY+<QIHo7|VU=7r#S_oyQaME9X4r*6kbDGjNIS{R|7hx=|Eh}k7eKthh! zTl@<gBRTvXHpi^KKrPM`3i&!%C7{3anw#B~oblj<w>2W-hz)n_JX3=_Tj&D@$1c?| z;{H+>QOb#@)4pRUlswmANv^}PSj+O36*u@&Ss80?O}4tnMNGUU+0^1cQNl@&cl&KC z^s+G?{A^H`%W+@naxwTl;%JGO<zO{g(;}GFobEZ9)M-v@ZQSTX^l}wU4H|f|JXy|z zR+yZ8m-<_>Y1z`{pCso4slzV!_hi{iKnM-Dh5}z6{`1O~%N42RGKIuTZgN#{1aq>< zqeA-TO02NOe%6a8hd~bqMd1{R3KWK%aBu$7#+E`IP|vdEO;oMpnrvk|PJtQ0ZT0+f zsLx=O@KR47EFLCsA0hS8=JE6m961ql$B;hD!4o}qNa+)YB~S(C9v1tDm_D(3yr+h| zf4s=WHs(bsA77t$9>zZ3|1X>ijU7I$T32|*7kh?~J_tGXRbM_Gda16jIpz)SBe%Y$ z=GgUKUx?M?7*K$;U9#qBztginbxwY|?`z2|hmYWFf^tdBHQ9bnk@`sM^^0tGH>7K_ z{T4OobHHr5wIa<-W4l-u(Ug`k`j#~9Ub`!?BvYlI$2i`US(-KM+AqFyH?az*a5YE; z5p8f+;w-Vj7JPaVp88Phlw)$vxI`1&KVoaG`68~!8@6nw2vLcask6(%#fEN33za6@ zCo|nfXIE@jVsU1gXHAk>V*AziB{%H0EypCJT;L*`mfOns(MV3nS^%1&ih40X6T zCzWiuwVF^3tjkJwWuDnu-?{?4>??L3YsF`|Xu;cktYxj}H9OkU*m}I7epl@Bff|l3 zJD!Pfg>J9yGp2_}9w{w9o@J}sub$Ljq9_-+<Il|Gqns!g@OE50F~Q+fKt0RzyI@;e zrdl)odBYU%2sos|5l%wn2^<rNdf4lR_OUyJyL{1b%phmcX?(TVlfdrU<2a8Vrj9zO ztX088z?E66hEN`eUEzK&TN#(#1`dVBR0k4L_XD9^PKrkm@&lgPklBGUY$Jh8W6|#A z9v-f?W!kD|kt(DytYYG)kVtM0WUpZky6cv=wGHAQDopoFZ-q(oI8~f!^EOZG@%p~D zSkrDONOrU!9)%;`Jhb?o8jdbMo|%Ttn%!0(84GtdEj-Y)Fp*caD6{79AZdCyJaE8I z((L~gs?!-ytV1?FUqqJ|;f8YHW}ml_N6gy#aHlDL2`C{$Nb3y)qFU!q_QowngFA|1 zW7Ut1a+8xMwkCtPM+M}=aJgN_c3eNfB(H&!4srmeDE9Q;+w?jcaWag%xfIyXaACr< z?ALmEJ;1vch2YlFBe>CJB>SHeId}P$my)wPT#x+fJ!>&0rSIw7#H13t<poH6UCRwO z+<>vWX<191mjyI`8O4<Pm<Ve`s<@tU@rDr30++Q|gFQp#9r{CTf_w3ksg;9P(XI1f z0D`)M-wIgDAVbh$vZ*9+JX8{ZWO?Xr!zB?Oir^Fm*F3ieRs<68`$FiBfYxlnLw{j@ zgBE9Yx~yS0ST@XpYW^xY>!;ZH{41W|A<Ab8p)+`HKFS6Tjl~B?D)8*ey736&MG+3Q zW0TjqOU60@NfKh`XW-gPnFKQPRM8|?EYp3B_CFji;1>u~M@lmbCeQ1m8oLwrEZo$# zaC_Ur?%2Y?PfUq(Fo1n30(5$*-5)MPjO;Qlsr;@8(pwi(BhIlYk*0L`LgcBVe=_1^ zVnqnlO0Ecb_Ovc*TX6&a$3S(Tm{uiQFTLV5FCIXy0R8fZB%7O?r$obB&_y%Vej2vu zmpX{nJM=48w4mZC&~K^Guc{<%2vej(v??N$BLEp|>1L#+Ixl@zlRjG~rx|HQM?9T} zM%7Fwb(c72`iPTpO=gIYnn3F=pIPR5-b)>Upy@Tc5|}?5Ft0Yz2|DY>?t<GcNNTj4 z68%TC0~UX4F=bmvmn5&u13Ag$rXhAGfxe#TZbpD4Qs#?1+9c1^$T$u>b*AE?1*M7$ z)_PbzGV6x53_O-u(|e3-O9pSl(h{kx&6wU&u|_gnJlfimkFGji-{iFeVXO{)PA#p+ zvte!^d@}@xZq{ojexi5HT8POEA(wGM(YuCW!#N=3G_7@iMdeOQ<O7SIwR@6#F_nW= zP~0`^qdW8znWe9h@oQAap{Q+3X&W9}9l)s~<%2sz9%s1Un`Cy$JkdA?QJ{GE#kV1@ zoc8*<p7kEiD+x*o1tJ+8VaF0+FY4Zx8tpk)uM@}<M4H#BxyEu%eI2=?NJl5&s}#M= z7<01pF%gM~b+4F97H<chvW@u^EYmel)V)(G?1U_V^-jjJW3U(J`f@ccg~k(Q^;PsJ z`1!>&<}9VN(|tHDBb9T55HJf&!oHyD2zstub1L><RYLG>#FT5!OpP4&+p=7+?dM^? zZ;Iw-hgnI-*Ei7Qh&fXtT>XE{lwM&Lr)biP2b$zwo*RHID64D$K5442PL}F+J5{{Q zR~5hspIQ8@RXLCJf6CHOO^>J-&zjDVxmjOPWJ~2-DO=@u$kl{akZ~vD2~)#YXbQ6O zcF<Ht6Ioue){%g-cMQ?zH>fowZ`#Qqk)19(9w!JlOnAPIs{kwptvf8Wk^#%~$+`+N zk#=Sz+Br&L%|^V}ONxrev(<P4wST|f>{)kH*;#SfkNO<df1*6_v5MijiP9=Nn6z^_ zm7V6f>Qev8LR7OjHM$U<o2jhn-5YSQ&4zhsqdFOB9YHN)&LOy#R(TH~+#`Ewy#XLQ zU9J^yF*C|HscIWNk_1#olGPnF=Qc`>(!Yzq?Qvp~ZpS@vBUh@o!C;hxPXuNfrABE@ zXkMr$R2QrY)&(nrHKCeP6ZW~Gs!$cy&aI;OV?J!blE_^C;Eq2NZ}=-`MxoRxB5(N@ zgiN>%AZ6b_v|gYczcf{>xcmW>8wimXd@&H{g(N`iEz8hs`};FTM0g=Dd~jiQ#3%8T zY4OKuOwR)#S5+Kvm|yHrhlBWH`)^CV2&oU);iRie_y3Sqw`!zTzK?`%;lRQDen86; zxH7*au{io^YAhc2O@C-XQ2>UX8%Xa50QXy9pTYO`d?Wr4IOE6<cPgmb#)7h)rnC>^ zLFj>k0K@<VAX0t6sS?$mLfkmEO~a+bWtxv}I1G8Zd+|7-6k9E%GmPcfYJ}qV3LcG= zc4f<jden$-6k#P1n`JCj6aYGX=0YhM1cZ=NF989<r$YM-_ml*OH;q80%leAmFPOiM zsJ)d?e4bR&D(c5h{YlmFsHB%w$7&E2*-Zs2ZYYU*bGKOTNy%x%YbaN5;G<$p`y>Ex ziXTu1<8djIZbG&mn803Sz=sK52GC-3`GQQhsg#ZdV+xYz?JS%LmjK_qlq{Ckt>k)h zUh#rbi*?Rm$v&c%0!vTlap`IaJZ`qD0r`|Fy5x}p`$#)}=^X$rDfEVhKmuTW5w+)F zStv`EQ#htDN*FLh!<U#VU^WsJVy=W)^n4*am|4&lrmJH}w*LYuQ0CVTd3%6|2H<Ct zN0BZk6GZCZU}itG#*bsI)ubiTgMok(<Or1Jz*mykvq!(6-2-NXJ$o<&Lts8l&Rbeq z`8ICP9$7wc@qi#&tXBt__vB?K-$3A53HWG5To_)4xX;2xb-g@y;YDv=QKcA&PgZlp zl1><<2vbpCfqdgS0T#r1VB^)UY58LL)K}kpxVgC%>JRz7o}&H5rQdQH9BgQ`&hDLp zO9gs`7}ywSVQ9{qmDC8Ns-?y#q>xhF4gwSE39@8$B>ih7jY8*^t@WLdFaXJljnOUr zP`WOrtq>j1Ka%ql!Fg-oBXLq3SvouMOZNf{1&(7B9L8|6dlfa1jFn&*npYCId;PKC za1gFhs+v0!;+{?p+#%@V3W)6>hY~rU?vCDFsk<GO({b>k)Yelx^((V9k)1>~^2X6u z5)L*jO*ejNK7bSH<PjdpG8M06^5;MT>RANwkdX`|luVwnDM-{EuJH7pm=H7jZ#s^? zX|<|nJdwp2bsu6ZX+l|q6fg+r&cR(RUfU6Tf#4k!0AmS95P3?M4Gs+S234+D-0bXv z*;1m9W)u#RO&HTCU=&)`FI!+=t)U<?L`(be^gB^<27~iha2Px9GvRMZtDx?Kkamuf z_K|}lO|A?E4_6`yLnO)xuCju~@bweo#zs*O5>&9>TUjyg0PYT7dlBRqv0_UGLXMmn zEH1`kE@6Ml;xA(HWyFAp2n;grFjTzg*)pxIMM{qwsI<f{jzK%heXj?DYHwTUG3-;8 zez8<OUXPMzE0Kblt|=j)ma(!~_bk1{D_(jorXTQ>-t?B9qi$Z=*-+APxbGm*;|E4L zbeED$gHzv#D#b2V<Cx&v5nst-zEH>D8v74D1)J?Hm@^4<HAHf!OIdI=vkHF345a6A zO4NGs+)QN=?=HvOF3G8EFLTC^E7j@YAXb|d_=Vly0Q`Laxa4WaFZ~|?-U&7lOooR` z2ZKYHTp_huR-Fm*rG|P9*hN@T0@E(+6|iHPg;Z-yy|7opE*zx^Ou4X6gB=qt{3BwI zz&<@u1$&j)r^7xYVZv^Ty$bf3iE7xZ#XbXesJMi^COJJ>m7H;^wAX~&>_jcxY9-7} z*ykkX!ai5*)v#ZYm<RhjvCo42%EWxw=Zn22aTS_=fjSDbGn%2M!_{JA&6=F@Wdh?( zjKvOUF9Gb?iWCpgEZoOmj3TkT8fM39$4}bDU&D#eP!KEmFiKLInd|KO<5r)EZKFuk zmdw&y-HB0_A>!WD;>`V>80Nt|gDLbDEKri@q$|;LE`9;IHUux8!RO*7fUalr7HMv; zE6}B~Wx4>T*{hHsdsT`0987sga%gVH&o8Hs68hMI!if-23>QVQqZo=E#ZkP7M-YM3 z34kuuMmi~uK*u+I2z>stM_^qs1lAQtAjNfi>LzrL%ObGuaUTL}3L!AlZh@6B<aRSI zQn)7OT9|9#M1%xLq9dUV%|r{$LJQSo=Hz$68}V3fUnZ8@2gSJ<cIk#-YBU7&E&;$C zz-B!)8vy3HG+(97QJObs^Cp_NYx548Z>PB=wNrok^k+9e!BiZd)NyS-N%PCv{6m`m zMw|bR=3i*@FKK>Pn}0>~2ip80&Hts%|4sA90F$&wsi6HNn}bI(Ac$ZvVEvUiCc3z` z|5a-XHQ3ZhW?p`SbRJQ7^OYLNH0QR7?Nh8-*b*p8>Jq>tNE&uJ-}QC7_Ci=pb#(JE zo7kh9wV2N*9m}IQ78e6u#Nu&WaRQ@enAZYKf>F7Z<oA3CbrwPhZh9nJpF>C7abgmY z9cLnhhZ-T77-iR)C>47-{AK5vC>OhtFhErmnF5VyZ(uTeavRb1DTaO{XClbl<eap% ze`Gk-7~Pao{X>u!pm&yA@qBe3Y*D?G&l{_!+GMWyIcGw$%NCQ2GflZ=7w2LH$F$Ue z+D*NVc2nzMnxw%>C8Zzvnrl6x<RLRPD!L}0iX2qz%F8Dw+ow1}sdje0$0zT6hMmr9 zK6EzxZqTt?Khu)mI99)y1fMg+=h9{Hv9oyHhtEc~XhTKubuAaDijAm<x?=c(leS?u z&G(spr5<K6(3)X0tZqcCyiVXOVxu`UOKP>}zM(SAa+)3sEVcA8LjE+T-6yHBz;mdv z?_JQ-946t^B>)Vx%`Gs06#(Wv*uSSv0KohLf~GD3T#f|Fbk=|EtK?0E(06FS%tIf; zPbf1xzxU%XCDW7JLG-wSi<<(+EIhKZ>Y^Tz8;aFPm-;mdQLtS@i1&sMo6Uu=nd<OV zn~zn`UHz#{V=h{BEmmAKNC_5>sWt$Z*V5bvFv-vqW_o|`!(&S!Jh1Z76A4e<^A}`8 zA#_JM!!NWf?oj=EF~jGry0rTw*zkZPbtM3>SwQn8ZKj0V)Cqt|Fe}rkzv;tmYa!g6 z9>-G{KW>vR_ctZ?s^mTScxm@Z@OrqExByI6ex1rMeC6L(sQgpyWApR-*!tulO6Gw8 z=uB&FPjmey!6Z<@mH<EtO*})a04Bkz(oOY(53}vStgB&m!2$QnXqRl|f&Rnedh4j< zWI;w??%x#mK#KbaS(_>@?G%?oGQKK~GK$2h*s~S8fMPu=W?6`~WgGo9mTmzu#;Q0J zk>MIcw!vZBG|g}gzxW#mc?I5n`knjVe&y{K-+tzuFTMTjIQnSdpU*x2{v%%;uZHoh zSKm7K^OJ9#d+Rm)o%{I%Z@n<iq3!%P&cBAgAD#d6^RJwL_55>^(uF5}`SOLYU3doY z(F@-hN4*B#KmFAEk3IM6@BEph`~Hug_?PETkMr2)z5BlV-hHnVp8Aq@xc8;^?tAFH zd%yhNy*lb|zwy{_e(?OiJ@T?7H1W#)6X#A(oO@y%s0Aj@etY7nFHW5O!Nl2TCeHrF z#M#pmXJ43j>SWfy-3!F2#^ZQX4vjPeW7#k{Gt|@QW{QkHxKKWd4@HvgA3rdXR=jcO zEfdaxG+psrcqGxk72)L|frkm#P@FzrbLlv8nJyOxiG$Rvfv4iOE(Rxx&OEvp{PqVA zM7wu($L`qK+q=_c27z{Z+>PSGfqIo78<naF>$*2=+tAqqjl~?|;SWh#dnud>3@3Fu z#X2Vk9oEi4Qg4iQtn2h<VXN=3%FU~$v`$>}>aqw?D<Ml`w41(EU$mp6aoxJc&Q1%F zBk5QI`nJ89I2Q@J4)YRdjIL{p=EQG|_OQ-cz3HSzv~VbYdB7=a$-N!yPwjUSzr!kB zp~U@(qD3LF7A(6~(-ujvTN3m~)#dS2-lTD(ciwp?Yw2*bJFk{9t{5fnQxM;K7T@cY z+{Y@puW|e@Z!%G*V!X+Fo|a@>{T22T3HQ;2YqI^E<UlSbKyTPDkl|!wLkaF!p?m{s z6H4@9Jxm|T4Rv-}JZ`Dv1oh2uEIr^KfJ0?G-aiiEaSHdMPb0-_`8~=0eNd#WI02|x zph7KMki(_gL2`YQZtv1mPjHIXCkbk4<(!_a0B?aBgY2`kTo+`gL8}8Em2FV!pi-Ej zc$GSK7jC5zisM?gLR+w3%g#W%a)7{lymYL8?|{OD98d-U2QF2IOnRq5;3ytgClb_k z%H=PwW^qCdB&g6J8?iBlwuyu42^KB^kS)h>pN2Lv^`|WALrjlS7PFy&yOeqcMb{S_ ze?$-Avlpo_yxz$g3h%DLY?jd45_sDq*UGAz(SFMGen#*D0{507AFwfH%MR=N6W$W_ zq9OK<LtQ+FLG?`*x^z%(nMLZ#iwL65G1WH+%4vO)foAlBX(bgGHRK!^YzI6h$Nf1R zR68Tcar+LM))G9-QvC#`Y=v{zqR+`+V#@UlvzVZfAVz?NIHZ6O{Fa~zfLITKMG1UU z8|Zc$0dM5g*O|(n5Ijn-n{Gd(X(>(D6U-r~Be<I2uUMkj7-T-JoWvCN0ReTGpp9S+ zK`TKs!7KtYt*A1_<swmW@>IgovVx}N1gi-?N3eu|^PpNp@CO83f2jrn&QK~!a1Fs0 zCVDMRpC`DD*4qiLqjed<6$FEHTSZe1fyi5d3JOS|Ay`N-La>cs6TwDygg%;hg{uCR z);LYu3DN{(1cwNO-{~frZYAg;I6$zU;41*xNIaPy=pRicc0h0$XxOrCN*?C1w(D@y zz?e8pi)(!kVyTP|AdsATt9M!bFA<-8OnfK7T?B&!M+im<x(NP3Dukvx2<|3$lWzCW zw1?nbTK|b)oYsDVEd;{^NrHm}y9g9P2f+YAC&4-bgQa?mrjMD_a$0Ysb%<a+!OaBw zSdS^1wi0Y6xP>4=K#nfez}44AS~CQ4J9LbuqXgU;>+Q9y^_)F+wj4JUqQX?xak9#j z^&U?p^|DUZd$QD%1s)kWdZ+2RUtYNPR&Yfj#%!s)s_L!OGgKF5_g=8Oaalw2Hqevp zNBQl&6*56fu<4FbLRDy;RNXgkQ;!n6t63ajRuhJ}dRk`_R1rHD@bWurfTx)9-qx_g zrawgd;HBWkFzzR`h7^(4D*P+9DFTT-Cit?daVuthp)18KF#)w3xwBx0i~iP>`3`iw zN4omR*FECRwYxs9iDA4pui5M4buVo8x)zS<hHy>ZkpCW@T@9g5W%!di!-9Q&2<D(M z2O^H(6NJ7Q)<kX4sEi<tuEpA*xysyamYTE8O8lJ&*nbNugGQARF)AS`mw#7A+C9E@ zs1t$Z*bY>hRpxc!5{OOOY|b&Kn;Q`FI&+$NH@<Vt?dC?a+?;1#ZPu7G%$dk(jyY;} zo41==;9my+sJYc_G_NzSF&CKS&}p;IJY?>~#=<b0%vy83d6hZCXpYQ|Tx(Pq3yiA_ zBeKI-6j^MP84I+0GQgk~=QI~sHV2I;Le9Wnb0i!IBgS0AFg6&$$aU0{V+7})2n567 z`OvC^esc-61T8!Zg7f>U#-U{=7zMvyeMx2M{7`kMwxl`~4TWJc$>sog!DW}imm<ON z$Kg=akQ!N3JF|Le^%kTHNy5g*hUoZ_UMGF81|^c3FEO!&V)`b^T7xfOur35n!pf?O Ks!{{OsQwQr0*{;k diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/retrying.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/retrying.cpython-38.pyc deleted file mode 100644 index 509500c4849a65e471b747873feb6f5b7a3d0e55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8061 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/six.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__pycache__/six.cpython-38.pyc deleted file mode 100644 index a5171d3d0011734c2c6653f2e9bbada44056ac3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26451 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/appdirs.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/appdirs.py deleted file mode 100644 index 2bd3911..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/appdirs.py +++ /dev/null @@ -1,604 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (c) 2005-2010 ActiveState Software Inc. -# Copyright (c) 2013 Eddy Petrișor - -"""Utilities for determining application-specific dirs. - -See <http://github.com/ActiveState/appdirs> for details and usage. -""" -# Dev Notes: -# - MSDN on where to store app data files: -# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 -# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html -# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html - -__version_info__ = (1, 4, 3) -__version__ = '.'.join(map(str, __version_info__)) - - -import sys -import os - -PY3 = sys.version_info[0] == 3 - -if PY3: - unicode = str - -if sys.platform.startswith('java'): - import platform - os_name = platform.java_ver()[3][0] - if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. - system = 'win32' - elif os_name.startswith('Mac'): # "Mac OS X", etc. - system = 'darwin' - else: # "Linux", "SunOS", "FreeBSD", etc. - # Setting this to "linux2" is not ideal, but only Windows or Mac - # are actually checked for and the rest of the module expects - # *sys.platform* style strings. - system = 'linux2' -else: - system = sys.platform - - - -def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is 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>". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> - for a discussion of issues. - - Typical user data directories are: - Mac OS X: ~/Library/Application Support/<AppName> - Unix: ~/.local/share/<AppName> # or in $XDG_DATA_HOME, if defined - Win XP (not roaming): C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName> - Win XP (roaming): C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName> - Win 7 (not roaming): C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName> - Win 7 (roaming): C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName> - - For Unix, we follow the XDG spec and support $XDG_DATA_HOME. - That means, by default "~/.local/share/<AppName>". - """ - if system == "win32": - if appauthor is None: - appauthor = appname - const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" - path = os.path.normpath(_get_win_folder(const)) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - elif system == 'darwin': - path = os.path.expanduser('~/Library/Application Support/') - if appname: - path = os.path.join(path, appname) - else: - path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): - r"""Return full path to the user-shared data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is 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>". - Only applied when appname is present. - "multipath" is an optional parameter only applicable to *nix - which indicates that the entire list of data dirs should be - returned. By default, the first item from XDG_DATA_DIRS is - returned, or '/usr/local/share/<AppName>', - if XDG_DATA_DIRS is not set - - Typical site data directories are: - Mac OS X: /Library/Application Support/<AppName> - Unix: /usr/local/share/<AppName> or /usr/share/<AppName> - Win XP: C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName> - Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) - Win 7: C:\ProgramData\<AppAuthor>\<AppName> # Hidden, but writeable on Win 7. - - For Unix, this is using the $XDG_DATA_DIRS[0] default. - - WARNING: Do not use this on Windows. See the Vista-Fail note above for why. - """ - if system == "win32": - if appauthor is None: - appauthor = appname - path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - elif system == 'darwin': - path = os.path.expanduser('/Library/Application Support') - if appname: - path = os.path.join(path, appname) - else: - # XDG default for $XDG_DATA_DIRS - # only first, if multipath is False - path = os.getenv('XDG_DATA_DIRS', - os.pathsep.join(['/usr/local/share', '/usr/share'])) - pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] - if appname: - if version: - appname = os.path.join(appname, version) - pathlist = [os.sep.join([x, appname]) for x in pathlist] - - if multipath: - path = os.pathsep.join(pathlist) - else: - path = pathlist[0] - return path - - if appname and version: - path = os.path.join(path, version) - return path - - -def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific config dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is 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>". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> - for a discussion of issues. - - Typical user config directories are: - Mac OS X: same as user_data_dir - Unix: ~/.config/<AppName> # or in $XDG_CONFIG_HOME, if defined - Win *: same as user_data_dir - - For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. - That means, by default "~/.config/<AppName>". - """ - if system in ["win32", "darwin"]: - path = user_data_dir(appname, appauthor, None, roaming) - else: - path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): - r"""Return full path to the user-shared data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is 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>". - Only applied when appname is present. - "multipath" is an optional parameter only applicable to *nix - which indicates that the entire list of config dirs should be - returned. By default, the first item from XDG_CONFIG_DIRS is - returned, or '/etc/xdg/<AppName>', if XDG_CONFIG_DIRS is not set - - Typical site config directories are: - Mac OS X: same as site_data_dir - Unix: /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> for each value in - $XDG_CONFIG_DIRS - Win *: same as site_data_dir - Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) - - For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False - - WARNING: Do not use this on Windows. See the Vista-Fail note above for why. - """ - if system in ["win32", "darwin"]: - path = site_data_dir(appname, appauthor) - if appname and version: - path = os.path.join(path, version) - else: - # XDG default for $XDG_CONFIG_DIRS - # only first, if multipath is False - path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') - pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] - if appname: - if version: - appname = os.path.join(appname, version) - pathlist = [os.sep.join([x, appname]) for x in pathlist] - - if multipath: - path = os.pathsep.join(pathlist) - else: - path = pathlist[0] - return path - - -def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): - r"""Return full path to the user-specific cache dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is 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>". - Only applied when appname is present. - "opinion" (boolean) can be False to disable the appending of - "Cache" to the base app data dir for Windows. See - discussion below. - - Typical user cache directories are: - Mac OS X: ~/Library/Caches/<AppName> - Unix: ~/.cache/<AppName> (XDG default) - Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache - Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Cache - - On Windows the only suggestion in the MSDN docs is that local settings go in - the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming - app data dir (the default returned by `user_data_dir` above). Apps typically - put cache data somewhere *under* the given dir here. Some examples: - ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache - ...\Acme\SuperApp\Cache\1.0 - OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. - This can be disabled with the `opinion=False` option. - """ - if system == "win32": - if appauthor is None: - appauthor = appname - path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - if opinion: - path = os.path.join(path, "Cache") - elif system == 'darwin': - path = os.path.expanduser('~/Library/Caches') - if appname: - path = os.path.join(path, appname) - else: - path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def user_state_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific state dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is 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>". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> - for a discussion of issues. - - Typical user state directories are: - Mac OS X: same as user_data_dir - Unix: ~/.local/state/<AppName> # or in $XDG_STATE_HOME, if defined - Win *: same as user_data_dir - - For Unix, we follow this Debian proposal <https://wiki.debian.org/XDGBaseDirectorySpecification#state> - to extend the XDG spec and support $XDG_STATE_HOME. - - That means, by default "~/.local/state/<AppName>". - """ - if system in ["win32", "darwin"]: - path = user_data_dir(appname, appauthor, None, roaming) - else: - path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): - r"""Return full path to the user-specific log dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is 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>". - Only applied when appname is present. - "opinion" (boolean) can be False to disable the appending of - "Logs" to the base app data dir for Windows, and "log" to the - base cache dir for Unix. See discussion below. - - Typical user log directories are: - Mac OS X: ~/Library/Logs/<AppName> - Unix: ~/.cache/<AppName>/log # or under $XDG_CACHE_HOME if defined - Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs - Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Logs - - On Windows the only suggestion in the MSDN docs is that local settings - go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in - examples of what some windows apps use for a logs dir.) - - OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` - value for Windows and appends "log" to the user cache dir for Unix. - This can be disabled with the `opinion=False` option. - """ - if system == "darwin": - path = os.path.join( - os.path.expanduser('~/Library/Logs'), - appname) - elif system == "win32": - path = user_data_dir(appname, appauthor, version) - version = False - if opinion: - path = os.path.join(path, "Logs") - else: - path = user_cache_dir(appname, appauthor, version) - version = False - if opinion: - path = os.path.join(path, "log") - if appname and version: - path = os.path.join(path, version) - return path - - -class AppDirs(object): - """Convenience wrapper for getting application dirs.""" - def __init__(self, appname=None, appauthor=None, version=None, - roaming=False, multipath=False): - self.appname = appname - self.appauthor = appauthor - self.version = version - self.roaming = roaming - self.multipath = multipath - - @property - def user_data_dir(self): - return user_data_dir(self.appname, self.appauthor, - version=self.version, roaming=self.roaming) - - @property - def site_data_dir(self): - return site_data_dir(self.appname, self.appauthor, - version=self.version, multipath=self.multipath) - - @property - def user_config_dir(self): - return user_config_dir(self.appname, self.appauthor, - version=self.version, roaming=self.roaming) - - @property - def site_config_dir(self): - return site_config_dir(self.appname, self.appauthor, - version=self.version, multipath=self.multipath) - - @property - def user_cache_dir(self): - return user_cache_dir(self.appname, self.appauthor, - version=self.version) - - @property - def user_state_dir(self): - return user_state_dir(self.appname, self.appauthor, - version=self.version) - - @property - def user_log_dir(self): - return user_log_dir(self.appname, self.appauthor, - version=self.version) - - -#---- internal support stuff - -def _get_win_folder_from_registry(csidl_name): - """This is a fallback technique at best. I'm not sure if using the - registry for this guarantees us the correct answer for all CSIDL_* - names. - """ - if PY3: - import winreg as _winreg - else: - import _winreg - - shell_folder_name = { - "CSIDL_APPDATA": "AppData", - "CSIDL_COMMON_APPDATA": "Common AppData", - "CSIDL_LOCAL_APPDATA": "Local AppData", - }[csidl_name] - - key = _winreg.OpenKey( - _winreg.HKEY_CURRENT_USER, - r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" - ) - dir, type = _winreg.QueryValueEx(key, shell_folder_name) - return dir - - -def _get_win_folder_with_pywin32(csidl_name): - from win32com.shell import shellcon, shell - dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) - # Try to make this a unicode path because SHGetFolderPath does - # not return unicode strings when there is unicode data in the - # path. - try: - dir = unicode(dir) - - # Downgrade to short path name if have highbit chars. See - # <http://bugs.activestate.com/show_bug.cgi?id=85099>. - has_high_char = False - for c in dir: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - try: - import win32api - dir = win32api.GetShortPathName(dir) - except ImportError: - pass - except UnicodeError: - pass - return dir - - -def _get_win_folder_with_ctypes(csidl_name): - import ctypes - - csidl_const = { - "CSIDL_APPDATA": 26, - "CSIDL_COMMON_APPDATA": 35, - "CSIDL_LOCAL_APPDATA": 28, - }[csidl_name] - - buf = ctypes.create_unicode_buffer(1024) - ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) - - # Downgrade to short path name if have highbit chars. See - # <http://bugs.activestate.com/show_bug.cgi?id=85099>. - has_high_char = False - for c in buf: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - buf2 = ctypes.create_unicode_buffer(1024) - if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): - buf = buf2 - - return buf.value - -def _get_win_folder_with_jna(csidl_name): - import array - from com.sun import jna - from com.sun.jna.platform import win32 - - buf_size = win32.WinDef.MAX_PATH * 2 - buf = array.zeros('c', buf_size) - shell = win32.Shell32.INSTANCE - shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) - dir = jna.Native.toString(buf.tostring()).rstrip("\0") - - # Downgrade to short path name if have highbit chars. See - # <http://bugs.activestate.com/show_bug.cgi?id=85099>. - has_high_char = False - for c in dir: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - buf = array.zeros('c', buf_size) - kernel = win32.Kernel32.INSTANCE - if kernel.GetShortPathName(dir, buf, buf_size): - dir = jna.Native.toString(buf.tostring()).rstrip("\0") - - return dir - -if system == "win32": - try: - from ctypes import windll - _get_win_folder = _get_win_folder_with_ctypes - except ImportError: - try: - import com.sun.jna - _get_win_folder = _get_win_folder_with_jna - except ImportError: - _get_win_folder = _get_win_folder_from_registry - - -#---- self test code - -if __name__ == "__main__": - appname = "MyApp" - appauthor = "MyCompany" - - props = ("user_data_dir", - "user_config_dir", - "user_cache_dir", - "user_state_dir", - "user_log_dir", - "site_data_dir", - "site_config_dir") - - print("-- app dirs %s --" % __version__) - - print("-- app dirs (with optional 'version')") - dirs = AppDirs(appname, appauthor, version="1.0") - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (without optional 'version')") - dirs = AppDirs(appname, appauthor) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (without optional 'appauthor')") - dirs = AppDirs(appname) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (with disabled 'appauthor')") - dirs = AppDirs(appname, appauthor=False) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__init__.py deleted file mode 100644 index 8fdee66..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -"""CacheControl import Interface. - -Make it easy to import from cachecontrol without long namespaces. -""" -__author__ = "Eric Larson" -__email__ = "eric@ionrock.org" -__version__ = "0.12.5" - -from .wrapper import CacheControl -from .adapter import CacheControlAdapter -from .controller import CacheController diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index c53effa8ab07532b727a1bec6ed5df0168518b86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 568 zcmYjN!H&}~5KY>&Y16Ji;s<i=q4q8-q(wq#S1XW^fCGq24p`oJnp$;iYwUK_iXY-n z_=a3L@e5pFvMf?;dFH*bXZ&WqoShX3tsj3@Us;+YKYKD<BO=#y!W9{nREbKfRE?^U z8dqbLsfo$jNi|6m!c#MC^D2M9xtX=|YEF3eIa$q5cek?M!mYCrohfze9mevVjer|j z11pLTatEc3CCG3rqx=74gRU*>KDU0%z1MN;_OUe1Hl>v<1Wy$LD^80ysO$2*#Nh1d zDG<5V&Z4V#%wcnyp0kVR?8Pr?Gg+nGa;S*-vmw7x(vvm{KN*G%;Kx<b<w7V|3(*xq z$UVtH!gC>@mD&(o2yp-m^f{6I9;Nqy*pITy<-f`}CRP=XO;KIUDDXYO1-S?F`y1c7 z7C3Gpf_2E>8twfjzUdvV8|s`Nz#h2KcibOIg}r1~Jm?5(n#fKz5V+TVeesf=v&*$V v(lvvo>4TgET17>Nqvb+qtD_LiAG_JB)~UUL*ZsJ{l1!FmDeciRU8a8lGAXOa diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-38.pyc deleted file mode 100644 index cd63d3efc28b6fd40b1722158b04d3850b12bac8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3094 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/cache.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/cache.cpython-38.pyc deleted file mode 100644 index 0e333f46375527aeb4dfbacadb15b2a0a724311c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1801 zcma)7&2G~`5Z<*N$8j4P{t8Hdd;la%#0C{4kPs@AA5}sTP!K2wEZ4h9+&H#bJC#!9 z1ikYLaLk+V48C&W6}Z66y7{35sT=KhcW1ow&CECP+j`w3Fuwn`KU`M{`GK3op}}So zW_AYzBW=PcQzAN0+6pDl2~(MNNSMae&uUwPeTC_;*SQA!3ajoA+c?-Y-}JZ@_yNdd zcaI0T_2}ic)k%aE4$_DZc$|lEx3tI{3#}RN_`@i-!p!omyeGKN%*^j_D~y{1K1jsK zVquVnN$iV}WBvqm#HNMzA_@8dZWf0En@yP6O%R;4DFmWmAcv%_mLasY5;}rr2Au1x z2H?%2_Snz(7Ge+Zn(4qbg}DVY!xZM^Gx-D;?~n;?O=xkpmE_yg=s0^SL?R|ip=CVk z6l$N3CPd(Szea8^8E{whc+TTQxX+?6O<%hme28Y(2i-o8_uVMmb<<JaOX3aZo|}a^ zZ>E0G_q#lE(=ct`zVF;}Hk#=O)DG`<@zC|)RR)*J<OfNdizF&HPC6>oF3%A|CL^N< z^;xVAXaW^f(}C;%#4C^^q5@)~3Io?Q5JhF*kA_^vSc(-qRWqK~VX?#|Xil2qxl2(+ zhZw|y6P@u0ve{Vh)0l@=Dg%sWI&eLU4#UAZmQL_$o0f4Mb5jYTB;#knU>eQZ+>6w; z>}p|nUJOO_yu$RnLBfU+u2((p<Is;vjaY>{#2O03EKZ}CJCiHSp1>+#hBFj~VyO6& zrvV)NHPCbuX6AsHao%JKQx7Sy9{3I{*O<<#@T@R{)g<dFuzsbeJ%Q$utZ)5O6C}$P z-n<S1X+I_&9n<twh%055I$ITJT4)jUWT7!X_iaTcvRw<~F!!*57s8bMfNV*fcL_aU zDF`*_!I>EzXKL^dE;N?7PQhYK_Q+R2#mG11sFdLR0%*!)FQJW8Tmg$|HS2Sy%h~~1 zF8$p&^7mz(qF?$|8Pl;6(r=WKcjPX4MP8Hlb4o#8Fmn=2p$}6?3>VlF$8sSFVZr%4 z4GV~tb;}G9{?B0szFY=G6fyO6adnFAB)HTxNtgAOB<M8+rGvoQnDn4APgL1lHU;L3 zGhiUFJ;XT_7f~Ez`ZAKA2Rkg(5y?#rNUjMyZP|KJ^*ojY&_T8Gs{kL4l4g4OX_4I^ ZtryZc>!8ATP`2PhY<C%hrmd=twLb=kSyli5 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/compat.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/compat.cpython-38.pyc deleted file mode 100644 index 276543944d37e313f328f1c9eb7c41fd9e678715..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 775 zcmZ`#PjAyO6t|Of&APO!IPI_lC!`|P9_ocj2yq#L%QTH4zz3?3ytScDY;1R0`x*Em zd;)Hq`3yNBAtCV<xWG%3l?(}6vHjlfPu_bk`~4ol_4W7Y?PrgW?^V!VAqG$Ivp?`y z4^xs-NpdPEC9g<vHz43Gdgh3dYHv`#M&FRadrj66<~$jQ4zdp$w%D>g*%6(FS$X?% zC+~{xE$@$8wlBjPZ7Bk|oA*TTmg37+5y-t7Z4@CyqK}mvU?l^r`&-R~ebKKOsrQ16 zIzO>jGNNU7Y2<sA6{q-)o?Tp=orBe?uu#RBonGo`B9(=7G%O?J%IqD}v9Vxql%(8y zo@-^?i80EQA>tdX>?UVfvXD^j=*=yd&NQ1|L6IuM418FEbry}1MLYw`YU2qa_0Nru z=Hjp|`j;Z^x6%JwE?p)~P}O?S7TnlXFb<)}5|u)^>)_f=-Ad#0G|r*!%eT&aB4!^= zHpj0upQ{|WnS+Bu8U9peTA%aF>N4XQ3OTlV#c^0%uiRV}6ZVkX%)$7kWsb#+9~`qI zHW}*`!VG4!D#@EE@gz>>kf_2LC3&K99XqC1W%wvp=~BXDisjgQczAS32lS5b(FpHB Mr-{A4`4IDe0Ne@F!~g&Q diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/controller.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/controller.cpython-38.pyc deleted file mode 100644 index 2dc4ada34fc85bb8a6e2ec028c04a1800795a137..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7715 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-38.pyc deleted file mode 100644 index 476b2768c0b8450e72968185008e1e0e0ba77c75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2194 zcmZ`)&2Aev5GJ`RX}z{pr$4C^6e*ii1jJI?Tv{M4@`I%9#RcjXNp&c(T2j`=EA5uM zvSUF-56*+wN54s*VXs9Gd4*ouZ@99prV0fPxg2u%eZ!g2Pn(+|L;K^O&M$whG4>~Y zEH@t?56}w<p_%3>8}mNr>>H+q_FggV8FAwEJ?-zYPUAIpu@0|VkB&=IeD{4!-^<Oz z#{=}@5rkoVu32Abj`Pl1-`Bowykh-^Zt51srVjKP#+H6Zuj`FhydUUI-NwqA4sqjF z_1@zsO$SkY@H9!yGaKc(vC$!CER<+_V`$}3y(}Y}O($ALa+u3(@WRBUJQ^kONFF8F zRT?ABp|Qv1D4Fa_Ya%U^NtwyWnHo%oLu2pC2o{b;W+KZ`RLUW4l}RDvG%F1D!y?%- zFHJlx4X%n8@UUKvaK<=eaW*N<q%34MtnJj+yP?xQgoUUqZ8Ct30<ewDZT2$31%Lw^ z5;TlWj|rzkP_tPa|8e91MMWW}1<sGncwlT%BZ#EVrUQU>CW<(N@jFU&WD34yFSllx zyp#oa7Y@xNE9u%OjuQ>c;BzdCQKYjY_~Hs@w<bm}e9>qw&>y20+Ylu?VRNSVoI{Ga zfb=xmW9NLg<6GKV-B2qYR4MqU+Fq?1=GCp$nhW1|yvi?3I;;ft1{bU6%&z0czklzI zva#vek-?K>w)Zqm^8AP1kOsT6A3=9$CWpN=8T4`lM>e_F{i0VSrP;|5chSBndU=xX zeD-Dc)9$^U{21!4+25zdp2ATLqj40E486L|(jGn8A||`}aTO?)Op;QmE%H+ng7JVi z`Rt<=uIOHDj>%mYjXX`=dHQ`!=Ij*Ndd7bfC5NB+i9oi9T}#$GqS{hw-;|dzrc~8h ze0Mw>U{B>wK-{7x)LwF~vKypXzdWnd2UsYmNU*h#&puv_cVStn7-@OgXihgd$lqcz zYtPvW_5vm0Ab5tL@L4GiLVKGt`u)r%;yIgzZjZO5f3&RE+|hiBXd<Q#f7O0?kxNgk z&1}`Ill7cCrZqE)1V^vmhJy<=%vHVX6DW#zAs83DE!w;(1P^KSXSY}LT|WLl%H%9Z zSz<zD>~(r8%=oD|V`r$XnsNkkk6GG{7inRz4Tvg$GY_M5YAn6-8`!I64f=Da7ID<% zTdmp6l{g*0-M5F)U05N2r$|={B+SLBHx~pEko_}e?_g}4;dSN+uNrLAIll6#eAbW~ zM;5tK-Cmue%g(abapn0U0KI5jR=$qP=na<kL+tvBD7ybHzJXuB12NlPMU!y6o#O+T z`42~~`GK%<F0`n}J<`9)`~EWTj<@@oa<L$>8Fm&P2vrdcjk@%Mr2=SgkRY1&CJ7gI zm$7GWVeJWe(S~5)wdMI@!S2>7c2{?FP(nj0C6u?w=TNC}rl%>*H<bEy8l?+OODUbj zO4&`^VXu+6LPfrHFqWWQ;iD2mA?ff1++PnG!A5W`SPuhBI#lsWBw1a_oAsZPQ>?O9 Q1@~)&UsEY?-rMm01ug^|WdHyG diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-38.pyc deleted file mode 100644 index 03bcb8eaefa8efd6351945f29f12b011aba8a9bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4266 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-38.pyc deleted file mode 100644 index 8d621d3c13ca2c69032efaa4e1d085c1c57784f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 684 zcmYjPy^ho{5VrHbf9QaY2S7@(G3XjVCj=~_+yag!1uI`{k_acUZ1166ycM)O15olN zJVRP4-T++#<LsT3vHazm8GG`1?6-@>6oLKvm%jVvA@tihV~fFg22<Y$V2ELX8k}S7 zxF@{E&wb!A3t999=K=HIpfve|VR4H4yDM5$eATr^b>car(r^Xg$;-MhLu!3qB(U_x zCP19Of~j8sSS%BRKBEJ+kvuW@5ZTCL>sj9hHncIrU!y}}(RYt|Hu>RUG;sfhgP35Q zhW)H?LN?scQukBMRZT^`=c=Dne5-10>Y_g>jyeTbn?g{n``g1VdLj6x;il@C-p7?O z@(CgP#1RcF^_34w6*Ld^Vbg6}lTPwLb0`oF1ytbjp@YbQYiYiq$95clrQE6e_&W9z zsX6#ppGeg;oT!Q$-gb(-619}C$$R%v%aTIwlDC&c)E7kVKwx{CJtDd`d?{)1ftFko zS<B_a$JvAIbSZa`&Ujh6AlblH21N&n*GDHG6_t{!Oz!&mYIJu_yuJs3W>cJCZ#=G| zWRB;ax&_%ZUZ1a>rJ<UEKXgU87j|rtTQi((1Ph4u$yw8}t>91H%h7iLpk|2hX#D*T D1TCqE diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/_cmd.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/_cmd.py deleted file mode 100644 index f1e0ad9..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/_cmd.py +++ /dev/null @@ -1,57 +0,0 @@ -import logging - -from pip._vendor import requests - -from pip._vendor.cachecontrol.adapter import CacheControlAdapter -from pip._vendor.cachecontrol.cache import DictCache -from pip._vendor.cachecontrol.controller import logger - -from argparse import ArgumentParser - - -def setup_logging(): - logger.setLevel(logging.DEBUG) - handler = logging.StreamHandler() - logger.addHandler(handler) - - -def get_session(): - adapter = CacheControlAdapter( - DictCache(), cache_etags=True, serializer=None, heuristic=None - ) - sess = requests.Session() - sess.mount("http://", adapter) - sess.mount("https://", adapter) - - sess.cache_controller = adapter.controller - return sess - - -def get_args(): - parser = ArgumentParser() - parser.add_argument("url", help="The URL to try and cache") - return parser.parse_args() - - -def main(args=None): - args = get_args() - sess = get_session() - - # Make a request to get a response - resp = sess.get(args.url) - - # Turn on logging - setup_logging() - - # try setting the cache - sess.cache_controller.cache_response(resp.request, resp.raw) - - # Now try to get it - if sess.cache_controller.cached_request(resp.request): - print("Cached!") - else: - print("Not cached :(") - - -if __name__ == "__main__": - main() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/adapter.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/adapter.py deleted file mode 100644 index 780eb28..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/adapter.py +++ /dev/null @@ -1,133 +0,0 @@ -import types -import functools -import zlib - -from pip._vendor.requests.adapters import HTTPAdapter - -from .controller import CacheController -from .cache import DictCache -from .filewrapper import CallbackFileWrapper - - -class CacheControlAdapter(HTTPAdapter): - invalidating_methods = {"PUT", "DELETE"} - - def __init__( - self, - cache=None, - cache_etags=True, - controller_class=None, - serializer=None, - heuristic=None, - cacheable_methods=None, - *args, - **kw - ): - super(CacheControlAdapter, self).__init__(*args, **kw) - self.cache = cache or DictCache() - self.heuristic = heuristic - self.cacheable_methods = cacheable_methods or ("GET",) - - controller_factory = controller_class or CacheController - self.controller = controller_factory( - self.cache, cache_etags=cache_etags, serializer=serializer - ) - - def send(self, request, cacheable_methods=None, **kw): - """ - Send a request. Use the request information to see if it - exists in the cache and cache the response if we need to and can. - """ - cacheable = cacheable_methods or self.cacheable_methods - if request.method in cacheable: - try: - cached_response = self.controller.cached_request(request) - except zlib.error: - cached_response = None - if cached_response: - return self.build_response(request, cached_response, from_cache=True) - - # check for etags and add headers if appropriate - request.headers.update(self.controller.conditional_headers(request)) - - resp = super(CacheControlAdapter, self).send(request, **kw) - - return resp - - def build_response( - self, request, response, from_cache=False, cacheable_methods=None - ): - """ - Build a response by making a request or using the cache. - - This will end up calling send and returning a potentially - cached response - """ - cacheable = cacheable_methods or self.cacheable_methods - if not from_cache and request.method in cacheable: - # Check for any heuristics that might update headers - # before trying to cache. - if self.heuristic: - response = self.heuristic.apply(response) - - # apply any expiration heuristics - if response.status == 304: - # We must have sent an ETag request. This could mean - # that we've been expired already or that we simply - # have an etag. In either case, we want to try and - # update the cache if that is the case. - cached_response = self.controller.update_cached_response( - request, response - ) - - if cached_response is not response: - from_cache = True - - # We are done with the server response, read a - # possible response body (compliant servers will - # not return one, but we cannot be 100% sure) and - # release the connection back to the pool. - response.read(decode_content=False) - response.release_conn() - - response = cached_response - - # We always cache the 301 responses - elif response.status == 301: - self.controller.cache_response(request, response) - else: - # Wrap the response file with a wrapper that will cache the - # response when the stream has been consumed. - response._fp = CallbackFileWrapper( - response._fp, - functools.partial( - self.controller.cache_response, request, response - ), - ) - if response.chunked: - super_update_chunk_length = response._update_chunk_length - - def _update_chunk_length(self): - super_update_chunk_length() - if self.chunk_left == 0: - self._fp._close() - - response._update_chunk_length = types.MethodType( - _update_chunk_length, response - ) - - resp = super(CacheControlAdapter, self).build_response(request, response) - - # See if we should invalidate the cache. - if request.method in self.invalidating_methods and resp.ok: - cache_url = self.controller.cache_url(request.url) - self.cache.delete(cache_url) - - # Give the request a from_cache attr to let people use it - resp.from_cache = from_cache - - return resp - - def close(self): - self.cache.close() - super(CacheControlAdapter, self).close() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/cache.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/cache.py deleted file mode 100644 index 94e0773..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/cache.py +++ /dev/null @@ -1,39 +0,0 @@ -""" -The cache object API for implementing caches. The default is a thread -safe in-memory dictionary. -""" -from threading import Lock - - -class BaseCache(object): - - def get(self, key): - raise NotImplementedError() - - def set(self, key, value): - raise NotImplementedError() - - def delete(self, key): - raise NotImplementedError() - - def close(self): - pass - - -class DictCache(BaseCache): - - def __init__(self, init_dict=None): - self.lock = Lock() - self.data = init_dict or {} - - def get(self, key): - return self.data.get(key, None) - - def set(self, key, value): - with self.lock: - self.data.update({key: value}) - - def delete(self, key): - with self.lock: - if key in self.data: - self.data.pop(key) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__init__.py deleted file mode 100644 index 0e1658f..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .file_cache import FileCache # noqa -from .redis_cache import RedisCache # noqa diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 2e68f45351b108efa71e1ca86919635bb6c92a77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 312 zcmYjMF;2uV5VVsN5V#-kffTVp*MNi&64I3vhoDG-72>_b!m%yeoRpf^@Dtu}?N#>$ z8dwJkR@$AN8GE(+xLA|~<MX?EenQ+Q@;@>px0vA!izJe2GSY_9)Mq*y^CrhWe;`$H zp!lSsyW^G8aMyMNASu@%RhZd*RW#)WJ<%o8r_s%cPyU~hqw+y~fiRb^cRtt=xE~;b zv7WEAa&FBx34GnR=xxDlxmGXSO>wYh$u4<N5o*_VuWb*3JLT$&D|XJ7wVTjp(DzB? n0>4TeI&afi6TQ{HByb^=QBeryrrpu?Xyu!Rn{;1DTc6S&{g_n% diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-38.pyc deleted file mode 100644 index 5a7044be2875cdb0a57bd3d0cbc0a6e09a87bff9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3310 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 Kw7k~Z!~X$0E&Rp+ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-38.pyc deleted file mode 100644 index 5591a19f6a84bcfa8f0b8d3e0e04fa69ae9a900a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1584 zcmZ`(&2HQ_5GF-QD{pok7yU~wEerG_pq5(Xk^(_mG(~?ddx#OB5YP&WNbjoQN(#w! zVnaE_=yQ0Fev>|fu08b?dTD2<6}&Z40wjkV4rjiPGkiLqPYJX?{)vD6nGy0QF7}%b zi*KNt2QUaCs3L2cQHrvsytS8kPG*X&{miH22O@kCToMsT{|(Cm5uT8E@)uZ>nD&vV z&MH$iwUY}gZMBvlAADOF`M4-ovc!}74Wb$%cm#qZ85Jb+1Qp&T$(UfmhuIg0A{3KL z3jQK-06U?WiaRh*#7xX#jzj=)-0i1Nq^Qi`$=h>-GWN&N4N}t4j^u#ygj~}FMCg}I zUB_PU8>vq91WsHNeE`$nzo)BaEmOUcR@RM9zgJb;K1ok;(#OjJbZ4?YOI7tOZO`qh zsqZHbQd3!Z+!p2YVku49R_*bZUnO58_mA6iP$zP^#LYAZQvsKjj+>^ox>3Wzq#B{* zPLs6feU#@_UD-UxsEh+gFW$Yun~eJMHgKfa0iS`;k>AJ_?dX=C5FNrs>^ZnSTS|NF z=?J!Z_FSGj^uvIJX*9+@x<1@<4W^3{b7^cS<K@onLl8P<-Wy$a-WIZ|{;XrxyJA~% zkGy71=XcZw9lHv*<PC*W40CS`bFvH5NUIT1A8u?}H!rgQcI2y`RkiKswy}lEjfCeE zCiWd1eTc_{vqEiTKasE6N=tJa-d#9@-5>#k`t-<~(TjbM;O76SJp!W<-`3U78266e zP)G%F>Ny;|?fZS$`vCe#?K^wa4rV0<_1N%zkzhwI2Vro$CEt->j$T7z!wY-(!j!z2 z3V7$(yZGrxsamP|X`^|mWTC5i$qS{pT}ckFZFp7lf{Vfy&!AQl{?thRva+iw-?g&X zSg7nz7cm=N!bdZWvA+#eA2>H3f!estV2AYLXb+fE{|6Uh#O`pR%`Wz@ofY30X*iat zEHMz?HjM%lpYyumwUmO}2B0+%H)6Uum@FLMF&&Zt%jYJoF-$P|1U3iuy<0(oGKL@G z0PC-YV$bt_n&<0AY!u3~Jb$q%)S%IK@NO&;jj1$n^C3$2aJcd8Bv(}dDDby2Xcc)8 zi`aAmW2jNHh(q*ty0IG#-ZZ|vOaAO*_&t){?~#;yzsIo9NT0jnZC?B6;Q-(f(rvI% JXOQhP_Aks^TFn3e diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/file_cache.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/file_cache.py deleted file mode 100644 index 1ba0080..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/file_cache.py +++ /dev/null @@ -1,146 +0,0 @@ -import hashlib -import os -from textwrap import dedent - -from ..cache import BaseCache -from ..controller import CacheController - -try: - FileNotFoundError -except NameError: - # py2.X - FileNotFoundError = (IOError, OSError) - - -def _secure_open_write(filename, fmode): - # We only want to write to this file, so open it in write only mode - flags = os.O_WRONLY - - # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only - # will open *new* files. - # We specify this because we want to ensure that the mode we pass is the - # mode of the file. - flags |= os.O_CREAT | os.O_EXCL - - # Do not follow symlinks to prevent someone from making a symlink that - # we follow and insecurely open a cache file. - if hasattr(os, "O_NOFOLLOW"): - flags |= os.O_NOFOLLOW - - # On Windows we'll mark this file as binary - if hasattr(os, "O_BINARY"): - flags |= os.O_BINARY - - # Before we open our file, we want to delete any existing file that is - # there - try: - os.remove(filename) - except (IOError, OSError): - # The file must not exist already, so we can just skip ahead to opening - pass - - # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a - # race condition happens between the os.remove and this line, that an - # error will be raised. Because we utilize a lockfile this should only - # happen if someone is attempting to attack us. - fd = os.open(filename, flags, fmode) - try: - return os.fdopen(fd, "wb") - - except: - # An error occurred wrapping our FD in a file object - os.close(fd) - raise - - -class FileCache(BaseCache): - - def __init__( - self, - directory, - forever=False, - filemode=0o0600, - dirmode=0o0700, - use_dir_lock=None, - lock_class=None, - ): - - if use_dir_lock is not None and lock_class is not None: - raise ValueError("Cannot use use_dir_lock and lock_class together") - - try: - from pip._vendor.lockfile import LockFile - from pip._vendor.lockfile.mkdirlockfile import MkdirLockFile - except ImportError: - notice = dedent( - """ - NOTE: In order to use the FileCache you must have - lockfile installed. You can install it via pip: - pip install lockfile - """ - ) - raise ImportError(notice) - - else: - if use_dir_lock: - lock_class = MkdirLockFile - - elif lock_class is None: - lock_class = LockFile - - self.directory = directory - self.forever = forever - self.filemode = filemode - self.dirmode = dirmode - self.lock_class = lock_class - - @staticmethod - def encode(x): - return hashlib.sha224(x.encode()).hexdigest() - - def _fn(self, name): - # NOTE: This method should not change as some may depend on it. - # See: https://github.com/ionrock/cachecontrol/issues/63 - hashed = self.encode(name) - parts = list(hashed[:5]) + [hashed] - return os.path.join(self.directory, *parts) - - def get(self, key): - name = self._fn(key) - try: - with open(name, "rb") as fh: - return fh.read() - - except FileNotFoundError: - return None - - def set(self, key, value): - name = self._fn(key) - - # Make sure the directory exists - try: - os.makedirs(os.path.dirname(name), self.dirmode) - except (IOError, OSError): - pass - - with self.lock_class(name) as lock: - # Write our actual file - with _secure_open_write(lock.path, self.filemode) as fh: - fh.write(value) - - def delete(self, key): - name = self._fn(key) - if not self.forever: - try: - os.remove(name) - except FileNotFoundError: - pass - - -def url_to_file_path(url, filecache): - """Return the file cache path based on the URL. - - This does not ensure the file exists! - """ - key = CacheController.cache_url(url) - return filecache._fn(key) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/redis_cache.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/redis_cache.py deleted file mode 100644 index ed705ce..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/redis_cache.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import division - -from datetime import datetime -from pip._vendor.cachecontrol.cache import BaseCache - - -class RedisCache(BaseCache): - - def __init__(self, conn): - self.conn = conn - - def get(self, key): - return self.conn.get(key) - - def set(self, key, value, expires=None): - if not expires: - self.conn.set(key, value) - else: - expires = expires - datetime.utcnow() - self.conn.setex(key, int(expires.total_seconds()), value) - - def delete(self, key): - self.conn.delete(key) - - def clear(self): - """Helper for clearing all the keys in a database. Use with - caution!""" - for key in self.conn.keys(): - self.conn.delete(key) - - def close(self): - """Redis uses connection pooling, no need to close the connection.""" - pass diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/compat.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/compat.py deleted file mode 100644 index 33b5aed..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/compat.py +++ /dev/null @@ -1,29 +0,0 @@ -try: - from urllib.parse import urljoin -except ImportError: - from urlparse import urljoin - - -try: - import cPickle as pickle -except ImportError: - import pickle - - -# Handle the case where the requests module has been patched to not have -# urllib3 bundled as part of its source. -try: - from pip._vendor.requests.packages.urllib3.response import HTTPResponse -except ImportError: - from pip._vendor.urllib3.response import HTTPResponse - -try: - from pip._vendor.requests.packages.urllib3.util import is_fp_closed -except ImportError: - from pip._vendor.urllib3.util import is_fp_closed - -# Replicate some six behaviour -try: - text_type = unicode -except NameError: - text_type = str diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/controller.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/controller.py deleted file mode 100644 index 1b2b943..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/controller.py +++ /dev/null @@ -1,367 +0,0 @@ -""" -The httplib2 algorithms ported for use with requests. -""" -import logging -import re -import calendar -import time -from email.utils import parsedate_tz - -from pip._vendor.requests.structures import CaseInsensitiveDict - -from .cache import DictCache -from .serialize import Serializer - - -logger = logging.getLogger(__name__) - -URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") - - -def parse_uri(uri): - """Parses a URI using the regex given in Appendix B of RFC 3986. - - (scheme, authority, path, query, fragment) = parse_uri(uri) - """ - groups = URI.match(uri).groups() - return (groups[1], groups[3], groups[4], groups[6], groups[8]) - - -class CacheController(object): - """An interface to see if request should cached or not. - """ - - def __init__( - self, cache=None, cache_etags=True, serializer=None, status_codes=None - ): - self.cache = cache or DictCache() - self.cache_etags = cache_etags - self.serializer = serializer or Serializer() - self.cacheable_status_codes = status_codes or (200, 203, 300, 301) - - @classmethod - def _urlnorm(cls, uri): - """Normalize the URL to create a safe key for the cache""" - (scheme, authority, path, query, fragment) = parse_uri(uri) - if not scheme or not authority: - raise Exception("Only absolute URIs are allowed. uri = %s" % uri) - - scheme = scheme.lower() - authority = authority.lower() - - if not path: - path = "/" - - # Could do syntax based normalization of the URI before - # computing the digest. See Section 6.2.2 of Std 66. - request_uri = query and "?".join([path, query]) or path - defrag_uri = scheme + "://" + authority + request_uri - - return defrag_uri - - @classmethod - def cache_url(cls, uri): - return cls._urlnorm(uri) - - def parse_cache_control(self, headers): - known_directives = { - # https://tools.ietf.org/html/rfc7234#section-5.2 - "max-age": (int, True), - "max-stale": (int, False), - "min-fresh": (int, True), - "no-cache": (None, False), - "no-store": (None, False), - "no-transform": (None, False), - "only-if-cached": (None, False), - "must-revalidate": (None, False), - "public": (None, False), - "private": (None, False), - "proxy-revalidate": (None, False), - "s-maxage": (int, True), - } - - cc_headers = headers.get("cache-control", headers.get("Cache-Control", "")) - - retval = {} - - for cc_directive in cc_headers.split(","): - if not cc_directive.strip(): - continue - - parts = cc_directive.split("=", 1) - directive = parts[0].strip() - - try: - typ, required = known_directives[directive] - except KeyError: - logger.debug("Ignoring unknown cache-control directive: %s", directive) - continue - - if not typ or not required: - retval[directive] = None - if typ: - try: - retval[directive] = typ(parts[1].strip()) - except IndexError: - if required: - logger.debug( - "Missing value for cache-control " "directive: %s", - directive, - ) - except ValueError: - logger.debug( - "Invalid value for cache-control directive " "%s, must be %s", - directive, - typ.__name__, - ) - - return retval - - def cached_request(self, request): - """ - Return a cached response if it exists in the cache, otherwise - return False. - """ - cache_url = self.cache_url(request.url) - logger.debug('Looking up "%s" in the cache', cache_url) - cc = self.parse_cache_control(request.headers) - - # Bail out if the request insists on fresh data - if "no-cache" in cc: - logger.debug('Request header has "no-cache", cache bypassed') - return False - - if "max-age" in cc and cc["max-age"] == 0: - logger.debug('Request header has "max_age" as 0, cache bypassed') - return False - - # Request allows serving from the cache, let's see if we find something - cache_data = self.cache.get(cache_url) - if cache_data is None: - logger.debug("No cache entry available") - return False - - # Check whether it can be deserialized - resp = self.serializer.loads(request, cache_data) - if not resp: - logger.warning("Cache entry deserialization failed, entry ignored") - return False - - # If we have a cached 301, return it immediately. We don't - # need to test our response for other headers b/c it is - # intrinsically "cacheable" as it is Permanent. - # See: - # https://tools.ietf.org/html/rfc7231#section-6.4.2 - # - # Client can try to refresh the value by repeating the request - # with cache busting headers as usual (ie no-cache). - if resp.status == 301: - msg = ( - 'Returning cached "301 Moved Permanently" response ' - "(ignoring date and etag information)" - ) - logger.debug(msg) - return resp - - headers = CaseInsensitiveDict(resp.headers) - if not headers or "date" not in headers: - if "etag" not in headers: - # Without date or etag, the cached response can never be used - # and should be deleted. - logger.debug("Purging cached response: no date or etag") - self.cache.delete(cache_url) - logger.debug("Ignoring cached response: no date") - return False - - now = time.time() - date = calendar.timegm(parsedate_tz(headers["date"])) - current_age = max(0, now - date) - logger.debug("Current age based on date: %i", current_age) - - # TODO: There is an assumption that the result will be a - # urllib3 response object. This may not be best since we - # could probably avoid instantiating or constructing the - # response until we know we need it. - resp_cc = self.parse_cache_control(headers) - - # determine freshness - freshness_lifetime = 0 - - # Check the max-age pragma in the cache control header - if "max-age" in resp_cc: - freshness_lifetime = resp_cc["max-age"] - logger.debug("Freshness lifetime from max-age: %i", freshness_lifetime) - - # If there isn't a max-age, check for an expires header - elif "expires" in headers: - expires = parsedate_tz(headers["expires"]) - if expires is not None: - expire_time = calendar.timegm(expires) - date - freshness_lifetime = max(0, expire_time) - logger.debug("Freshness lifetime from expires: %i", freshness_lifetime) - - # Determine if we are setting freshness limit in the - # request. Note, this overrides what was in the response. - if "max-age" in cc: - freshness_lifetime = cc["max-age"] - logger.debug( - "Freshness lifetime from request max-age: %i", freshness_lifetime - ) - - if "min-fresh" in cc: - min_fresh = cc["min-fresh"] - # adjust our current age by our min fresh - current_age += min_fresh - logger.debug("Adjusted current age from min-fresh: %i", current_age) - - # Return entry if it is fresh enough - if freshness_lifetime > current_age: - logger.debug('The response is "fresh", returning cached response') - logger.debug("%i > %i", freshness_lifetime, current_age) - return resp - - # we're not fresh. If we don't have an Etag, clear it out - if "etag" not in headers: - logger.debug('The cached response is "stale" with no etag, purging') - self.cache.delete(cache_url) - - # return the original handler - return False - - def conditional_headers(self, request): - cache_url = self.cache_url(request.url) - resp = self.serializer.loads(request, self.cache.get(cache_url)) - new_headers = {} - - if resp: - headers = CaseInsensitiveDict(resp.headers) - - if "etag" in headers: - new_headers["If-None-Match"] = headers["ETag"] - - if "last-modified" in headers: - new_headers["If-Modified-Since"] = headers["Last-Modified"] - - return new_headers - - def cache_response(self, request, response, body=None, status_codes=None): - """ - Algorithm for caching requests. - - This assumes a requests Response object. - """ - # From httplib2: Don't cache 206's since we aren't going to - # handle byte range requests - cacheable_status_codes = status_codes or self.cacheable_status_codes - if response.status not in cacheable_status_codes: - logger.debug( - "Status code %s not in %s", response.status, cacheable_status_codes - ) - return - - response_headers = CaseInsensitiveDict(response.headers) - - # If we've been given a body, our response has a Content-Length, that - # Content-Length is valid then we can check to see if the body we've - # been given matches the expected size, and if it doesn't we'll just - # skip trying to cache it. - if ( - body is not None - and "content-length" in response_headers - and response_headers["content-length"].isdigit() - and int(response_headers["content-length"]) != len(body) - ): - return - - cc_req = self.parse_cache_control(request.headers) - cc = self.parse_cache_control(response_headers) - - cache_url = self.cache_url(request.url) - logger.debug('Updating cache with response from "%s"', cache_url) - - # Delete it from the cache if we happen to have it stored there - no_store = False - if "no-store" in cc: - no_store = True - logger.debug('Response header has "no-store"') - if "no-store" in cc_req: - no_store = True - logger.debug('Request header has "no-store"') - if no_store and self.cache.get(cache_url): - logger.debug('Purging existing cache entry to honor "no-store"') - self.cache.delete(cache_url) - if no_store: - return - - # If we've been given an etag, then keep the response - if self.cache_etags and "etag" in response_headers: - logger.debug("Caching due to etag") - self.cache.set( - cache_url, self.serializer.dumps(request, response, body=body) - ) - - # Add to the cache any 301s. We do this before looking that - # the Date headers. - elif response.status == 301: - logger.debug("Caching permanant redirect") - self.cache.set(cache_url, self.serializer.dumps(request, response)) - - # Add to the cache if the response headers demand it. If there - # is no date header then we can't do anything about expiring - # the cache. - elif "date" in response_headers: - # cache when there is a max-age > 0 - if "max-age" in cc and cc["max-age"] > 0: - logger.debug("Caching b/c date exists and max-age > 0") - self.cache.set( - cache_url, self.serializer.dumps(request, response, body=body) - ) - - # If the request can expire, it means we should cache it - # in the meantime. - elif "expires" in response_headers: - if response_headers["expires"]: - logger.debug("Caching b/c of expires header") - self.cache.set( - cache_url, self.serializer.dumps(request, response, body=body) - ) - - def update_cached_response(self, request, response): - """On a 304 we will get a new set of headers that we want to - update our cached value with, assuming we have one. - - This should only ever be called when we've sent an ETag and - gotten a 304 as the response. - """ - cache_url = self.cache_url(request.url) - - cached_response = self.serializer.loads(request, self.cache.get(cache_url)) - - if not cached_response: - # we didn't have a cached response - return response - - # Lets update our headers with the headers from the new request: - # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 - # - # The server isn't supposed to send headers that would make - # the cached body invalid. But... just in case, we'll be sure - # to strip out ones we know that might be problmatic due to - # typical assumptions. - excluded_headers = ["content-length"] - - cached_response.headers.update( - dict( - (k, v) - for k, v in response.headers.items() - if k.lower() not in excluded_headers - ) - ) - - # we want a 200 b/c we have content via the cache - cached_response.status = 200 - - # update our cache - self.cache.set(cache_url, self.serializer.dumps(request, cached_response)) - - return cached_response diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/filewrapper.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/filewrapper.py deleted file mode 100644 index 30ed4c5..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/filewrapper.py +++ /dev/null @@ -1,80 +0,0 @@ -from io import BytesIO - - -class CallbackFileWrapper(object): - """ - Small wrapper around a fp object which will tee everything read into a - buffer, and when that file is closed it will execute a callback with the - contents of that buffer. - - All attributes are proxied to the underlying file object. - - This class uses members with a double underscore (__) leading prefix so as - not to accidentally shadow an attribute. - """ - - def __init__(self, fp, callback): - self.__buf = BytesIO() - self.__fp = fp - self.__callback = callback - - def __getattr__(self, name): - # The vaguaries of garbage collection means that self.__fp is - # not always set. By using __getattribute__ and the private - # name[0] allows looking up the attribute value and raising an - # AttributeError when it doesn't exist. This stop thigns from - # infinitely recursing calls to getattr in the case where - # self.__fp hasn't been set. - # - # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers - fp = self.__getattribute__("_CallbackFileWrapper__fp") - return getattr(fp, name) - - def __is_fp_closed(self): - try: - return self.__fp.fp is None - - except AttributeError: - pass - - try: - return self.__fp.closed - - except AttributeError: - pass - - # We just don't cache it then. - # TODO: Add some logging here... - return False - - def _close(self): - if self.__callback: - self.__callback(self.__buf.getvalue()) - - # We assign this to None here, because otherwise we can get into - # really tricky problems where the CPython interpreter dead locks - # because the callback is holding a reference to something which - # has a __del__ method. Setting this to None breaks the cycle - # and allows the garbage collector to do it's thing normally. - self.__callback = None - - def read(self, amt=None): - data = self.__fp.read(amt) - self.__buf.write(data) - if self.__is_fp_closed(): - self._close() - - return data - - def _safe_read(self, amt): - data = self.__fp._safe_read(amt) - if amt == 2 and data == b"\r\n": - # urllib executes this read to toss the CRLF at the end - # of the chunk. - return data - - self.__buf.write(data) - if self.__is_fp_closed(): - self._close() - - return data diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/heuristics.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/heuristics.py deleted file mode 100644 index 6c0e979..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/heuristics.py +++ /dev/null @@ -1,135 +0,0 @@ -import calendar -import time - -from email.utils import formatdate, parsedate, parsedate_tz - -from datetime import datetime, timedelta - -TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT" - - -def expire_after(delta, date=None): - date = date or datetime.utcnow() - return date + delta - - -def datetime_to_header(dt): - return formatdate(calendar.timegm(dt.timetuple())) - - -class BaseHeuristic(object): - - def warning(self, response): - """ - Return a valid 1xx warning header value describing the cache - adjustments. - - The response is provided too allow warnings like 113 - http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need - to explicitly say response is over 24 hours old. - """ - return '110 - "Response is Stale"' - - def update_headers(self, response): - """Update the response headers with any new headers. - - NOTE: This SHOULD always include some Warning header to - signify that the response was cached by the client, not - by way of the provided headers. - """ - return {} - - def apply(self, response): - updated_headers = self.update_headers(response) - - if updated_headers: - response.headers.update(updated_headers) - warning_header_value = self.warning(response) - if warning_header_value is not None: - response.headers.update({"Warning": warning_header_value}) - - return response - - -class OneDayCache(BaseHeuristic): - """ - Cache the response by providing an expires 1 day in the - future. - """ - - def update_headers(self, response): - headers = {} - - if "expires" not in response.headers: - date = parsedate(response.headers["date"]) - expires = expire_after(timedelta(days=1), date=datetime(*date[:6])) - headers["expires"] = datetime_to_header(expires) - headers["cache-control"] = "public" - return headers - - -class ExpiresAfter(BaseHeuristic): - """ - Cache **all** requests for a defined time period. - """ - - def __init__(self, **kw): - self.delta = timedelta(**kw) - - def update_headers(self, response): - expires = expire_after(self.delta) - return {"expires": datetime_to_header(expires), "cache-control": "public"} - - def warning(self, response): - tmpl = "110 - Automatically cached for %s. Response might be stale" - return tmpl % self.delta - - -class LastModified(BaseHeuristic): - """ - If there is no Expires header already, fall back on Last-Modified - using the heuristic from - http://tools.ietf.org/html/rfc7234#section-4.2.2 - to calculate a reasonable value. - - Firefox also does something like this per - https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ - http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397 - Unlike mozilla we limit this to 24-hr. - """ - cacheable_by_default_statuses = { - 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501 - } - - def update_headers(self, resp): - headers = resp.headers - - if "expires" in headers: - return {} - - if "cache-control" in headers and headers["cache-control"] != "public": - return {} - - if resp.status not in self.cacheable_by_default_statuses: - return {} - - if "date" not in headers or "last-modified" not in headers: - return {} - - date = calendar.timegm(parsedate_tz(headers["date"])) - last_modified = parsedate(headers["last-modified"]) - if date is None or last_modified is None: - return {} - - now = time.time() - current_age = max(0, now - date) - delta = date - calendar.timegm(last_modified) - freshness_lifetime = max(0, min(delta / 10, 24 * 3600)) - if freshness_lifetime <= current_age: - return {} - - expires = date + freshness_lifetime - return {"expires": time.strftime(TIME_FMT, time.gmtime(expires))} - - def warning(self, resp): - return None diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/serialize.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/serialize.py deleted file mode 100644 index ec43ff2..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/serialize.py +++ /dev/null @@ -1,186 +0,0 @@ -import base64 -import io -import json -import zlib - -from pip._vendor import msgpack -from pip._vendor.requests.structures import CaseInsensitiveDict - -from .compat import HTTPResponse, pickle, text_type - - -def _b64_decode_bytes(b): - return base64.b64decode(b.encode("ascii")) - - -def _b64_decode_str(s): - return _b64_decode_bytes(s).decode("utf8") - - -class Serializer(object): - - def dumps(self, request, response, body=None): - response_headers = CaseInsensitiveDict(response.headers) - - if body is None: - body = response.read(decode_content=False) - - # NOTE: 99% sure this is dead code. I'm only leaving it - # here b/c I don't have a test yet to prove - # it. Basically, before using - # `cachecontrol.filewrapper.CallbackFileWrapper`, - # this made an effort to reset the file handle. The - # `CallbackFileWrapper` short circuits this code by - # setting the body as the content is consumed, the - # result being a `body` argument is *always* passed - # into cache_response, and in turn, - # `Serializer.dump`. - response._fp = io.BytesIO(body) - - # NOTE: This is all a bit weird, but it's really important that on - # Python 2.x these objects are unicode and not str, even when - # they contain only ascii. The problem here is that msgpack - # understands the difference between unicode and bytes and we - # have it set to differentiate between them, however Python 2 - # doesn't know the difference. Forcing these to unicode will be - # enough to have msgpack know the difference. - data = { - u"response": { - u"body": body, - u"headers": dict( - (text_type(k), text_type(v)) for k, v in response.headers.items() - ), - u"status": response.status, - u"version": response.version, - u"reason": text_type(response.reason), - u"strict": response.strict, - u"decode_content": response.decode_content, - } - } - - # Construct our vary headers - data[u"vary"] = {} - if u"vary" in response_headers: - varied_headers = response_headers[u"vary"].split(",") - for header in varied_headers: - header = text_type(header).strip() - header_value = request.headers.get(header, None) - if header_value is not None: - header_value = text_type(header_value) - data[u"vary"][header] = header_value - - return b",".join([b"cc=4", msgpack.dumps(data, use_bin_type=True)]) - - def loads(self, request, data): - # Short circuit if we've been given an empty set of data - if not data: - return - - # 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 - ver = ver.split(b"=", 1)[-1].decode("ascii") - - # Dispatch to the actual load method for the given version - try: - return getattr(self, "_loads_v{}".format(ver))(request, data) - - 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 - return - - def prepare_response(self, request, cached): - """Verify our vary headers match and construct a real urllib3 - HTTPResponse object. - """ - # Special case the '*' Vary value as it means we cannot actually - # determine if the cached response is suitable for this request. - if "*" in cached.get("vary", {}): - return - - # Ensure that the Vary headers for the cached response match our - # request - for header, value in cached.get("vary", {}).items(): - if request.headers.get(header, None) != value: - return - - body_raw = cached["response"].pop("body") - - headers = CaseInsensitiveDict(data=cached["response"]["headers"]) - if headers.get("transfer-encoding", "") == "chunked": - headers.pop("transfer-encoding") - - cached["response"]["headers"] = headers - - try: - body = io.BytesIO(body_raw) - except TypeError: - # This can happen if cachecontrol serialized to v1 format (pickle) - # using Python 2. A Python 2 str(byte string) will be unpickled as - # a Python 3 str (unicode string), which will cause the above to - # fail with: - # - # TypeError: 'str' does not support the buffer interface - body = io.BytesIO(body_raw.encode("utf8")) - - return HTTPResponse(body=body, preload_content=False, **cached["response"]) - - def _loads_v0(self, request, data): - # 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 - - def _loads_v1(self, request, data): - try: - cached = pickle.loads(data) - except ValueError: - return - - return self.prepare_response(request, cached) - - def _loads_v2(self, request, data): - try: - cached = json.loads(zlib.decompress(data).decode("utf8")) - except (ValueError, zlib.error): - return - - # We need to decode the items that we've base64 encoded - cached["response"]["body"] = _b64_decode_bytes(cached["response"]["body"]) - cached["response"]["headers"] = dict( - (_b64_decode_str(k), _b64_decode_str(v)) - for k, v in cached["response"]["headers"].items() - ) - cached["response"]["reason"] = _b64_decode_str(cached["response"]["reason"]) - cached["vary"] = dict( - (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v) - for k, v in cached["vary"].items() - ) - - return self.prepare_response(request, cached) - - def _loads_v3(self, request, data): - # 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 - - def _loads_v4(self, request, data): - try: - cached = msgpack.loads(data, encoding="utf-8") - except ValueError: - return - - return self.prepare_response(request, cached) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/wrapper.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/wrapper.py deleted file mode 100644 index 265bfc8..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/wrapper.py +++ /dev/null @@ -1,29 +0,0 @@ -from .adapter import CacheControlAdapter -from .cache import DictCache - - -def CacheControl( - sess, - cache=None, - cache_etags=True, - serializer=None, - heuristic=None, - controller_class=None, - adapter_class=None, - cacheable_methods=None, -): - - cache = cache or DictCache() - adapter_class = adapter_class or CacheControlAdapter - adapter = adapter_class( - cache, - cache_etags=cache_etags, - serializer=serializer, - heuristic=heuristic, - controller_class=controller_class, - cacheable_methods=cacheable_methods, - ) - sess.mount("http://", adapter) - sess.mount("https://", adapter) - - return sess diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__init__.py deleted file mode 100644 index ef71f3a..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .core import where - -__version__ = "2018.11.29" diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__main__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__main__.py deleted file mode 100644 index ae2aff5..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__main__.py +++ /dev/null @@ -1,2 +0,0 @@ -from pip._vendor.certifi import where -print(where()) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 8daa91aed8767c760596861fe19eb0dd6c6122c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275 zcmYjMu};G<5Vg}*LM`3+i45^IZHHDuh>4K_#L@vP#Mi_ku`S1>3V+0(@C{j+_yrbv zX5vZrPWPVl?(S*1oHN4bZ~DBY{uPJ+NNBjF>aK_sQ@mj<KXA@ea!AzVk)_jbPFBjt z*{Md4@ALI4--$dI>-~K?8K<T7=wr;dkg`YLX=|kXV17p0AN`!5wk?9MF`%&??i%gf z0~}-XSyhnNqv@g1FW`nyTeA^6=ybr$73FJDVFymTEZ>Wj*ko=XTVPd15oo7T6k4JW c`lvxlZFG=QxM94wZmoK2@Fu>{#Un41GbNfym;e9( diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__pycache__/core.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__pycache__/core.cpython-38.pyc deleted file mode 100644 index f45d7597983e7b17f76497d31e827b7bd6d995b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 540 zcmYjOy-wsX5VpP9B}D8CT$KuGkv0a=fP@gzNmo*EN3#W1h$kCEVq3Q1v<PUp2RX`n zlY54=RJ;NWj9LChn(>TB^XdC$j>qGSp#6WIoaB^{hgf_yhQ$H8-@qWrj7Tb3OJ`IL zWb%j17!2g_oVj&KfZdThN{M7Y$z*hOoK@h0s#ReZ+3kmA*{??VyfgBmh1@~7aN6gg zfm~@H%C;?oGCFTfwM<N%S7k&hEObToh&0Gy72~@hZIYmWNB7?_1ae0IvM{)(H_JS^ zM%wq07CXGkKH(<Ao*CaKwhT?bB9+r+2Yo6;ty&PGPtJ_e6WY`IA8{!nKY8Am4!CO| zfHsc*XqB}`ypE5X&T*Vyg1+RfI^}i|8l$(19qv_tsV%GXat@wbWv5%a#b&WRwF_() zFrUXyE^t&L=-b|SWgOu0`r+>e9E_v9sFTn&=Hk^N)2>un2o$m+gfx{9E?(@T9R;C~ ep>;}!R|#Lj>MO?H@)Y|K+DDPeC>^Aul)eDUtdV*E diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/cacert.pem b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/cacert.pem deleted file mode 100644 index db68797..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/cacert.pem +++ /dev/null @@ -1,4512 +0,0 @@ - -# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Label: "GlobalSign Root CA" -# Serial: 4835703278459707669005204 -# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a -# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c -# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Label: "GlobalSign Root CA - R2" -# Serial: 4835703278459682885658125 -# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 -# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe -# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 3 Public Primary Certification Authority - G3" -# Serial: 206684696279472310254277870180966723415 -# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 -# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 -# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Premium 2048 Secure Server CA" -# Serial: 946069240 -# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 -# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 -# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Label: "AddTrust External Root" -# Serial: 1 -# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f -# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 -# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. -# Label: "GeoTrust Global CA" -# Serial: 144470 -# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 -# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 -# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Label: "GeoTrust Universal CA" -# Serial: 1 -# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 -# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 -# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Universal CA 2" -# Serial: 1 -# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 -# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 -# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -# Issuer: CN=AAA Certificate Services O=Comodo CA Limited -# Subject: CN=AAA Certificate Services O=Comodo CA Limited -# Label: "Comodo AAA Services root" -# Serial: 1 -# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 -# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 -# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Label: "QuoVadis Root CA" -# Serial: 985026699 -# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 -# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 -# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -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=Sonera Class2 CA O=Sonera -# Subject: CN=Sonera Class2 CA O=Sonera -# Label: "Sonera Class 2 Root CA" -# Serial: 29 -# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb -# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 -# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------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" -# Serial: 107108908803651509692980124233745014957 -# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 -# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 -# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - -# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Label: "Starfield Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 -# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a -# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -# Issuer: O=Government Root Certification Authority -# Subject: O=Government Root Certification Authority -# Label: "Taiwan GRCA" -# Serial: 42023070807708724159991140556527066870 -# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e -# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 -# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ -MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow -PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR -IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q -gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy -yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts -F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 -jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx -ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC -VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK -YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH -EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud -DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE -MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK -UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf -qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK -ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE -JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 -hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 -EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm -nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX -udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz -ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe -LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl -pYYsfPQS ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Issuer: CN=Class 2 Primary CA O=Certplus -# Subject: CN=Class 2 Primary CA O=Certplus -# Label: "Certplus Class 2 Primary CA" -# Serial: 177770208045934040241468760488327595043 -# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b -# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb -# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Label: "DST Root CA X3" -# Serial: 91299735575339953335919266965803778155 -# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 -# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 -# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Label: "SwissSign Gold CA - G2" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Label: "SwissSign Silver CA - G2" -# Serial: 5700383053117599563 -# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 -# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb -# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Label: "GeoTrust Primary Certification Authority" -# Serial: 32798226551256963324313806436981982369 -# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf -# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 -# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA" -# Serial: 69529181992039203566298953787712940909 -# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 -# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 -# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" -# Serial: 33037644167568058970164719475676101450 -# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c -# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 -# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Label: "Network Solutions Certificate Authority" -# Serial: 116697915152937497490437556386812487904 -# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e -# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce -# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GA CA" -# Serial: 86718877871133159090080555911823548314 -# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 -# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 -# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB -ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly -aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl -ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w -NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G -A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD -VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX -SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR -VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 -w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF -mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg -4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 -4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw -EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx -SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 -ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 -vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi -Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ -/L7fCg0= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Label: "Deutsche Telekom Root CA 2" -# Serial: 38 -# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 -# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf -# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc -# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc -# Label: "Cybertrust Global Root" -# Serial: 4835703278459682877484360 -# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 -# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 -# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Label: "ePKI Root Certification Authority" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G3" -# Serial: 28809105769928564313984085209975885599 -# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 -# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd -# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB -mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT -MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ -BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 -BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz -+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm -hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn -5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W -JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL -DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC -huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB -AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB -zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN -kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH -SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G -spki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G2" -# Serial: 71758320672825410020661621085256472406 -# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f -# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 -# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp -IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi -BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw -MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig -YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v -dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ -BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 -papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K -DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 -KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox -XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G3" -# Serial: 127614157056681299805556476275995414779 -# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 -# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 -# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB -rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV -BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa -Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl -LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u -MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm -gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 -YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf -b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 -9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S -zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk -OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA -2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW -oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c -KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM -m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu -MdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G2" -# Serial: 80682863203381065782177908751794619243 -# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a -# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 -# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL -MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj -KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 -MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw -NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV -BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL -So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal -tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG -CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT -qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz -rD6ogRLQy7rQkgu2npaqBA+K ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Universal Root Certification Authority" -# Serial: 85209574734084581917763752644031726877 -# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 -# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 -# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB -vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W -ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 -IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y -IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh -bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF -9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH -H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H -LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN -/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT -rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw -WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs -exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 -sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ -seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz -4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ -BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR -lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 -7M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" -# Serial: 63143484348153506665311985501458640051 -# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 -# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a -# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp -U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg -SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln -biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm -GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve -fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ -aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj -aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW -kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC -4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga -FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G2" -# Serial: 10000012 -# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a -# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 -# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Label: "Hongkong Post Root CA 1" -# Serial: 1000 -# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca -# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 -# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Label: "SecureSign RootCA11" -# Serial: 1 -# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 -# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 -# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -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" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Label: "Chambers of Commerce Root - 2008" -# Serial: 11806822484801597146 -# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 -# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c -# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz -IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz -MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj -dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw -EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp -MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 -28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq -VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q -DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR -5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL -ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a -Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl -UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s -+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 -Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx -hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV -HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 -+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN -YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t -L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy -ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt -IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV -HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w -DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW -PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF -5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 -glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH -FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 -pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD -xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG -tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq -jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De -fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ -d0jQ ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Label: "Global Chambersign Root - 2008" -# Serial: 14541511773111788494 -# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 -# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c -# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx -MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy -cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG -A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl -BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed -KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 -G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 -zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 -ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG -HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 -Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V -yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e -beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r -6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog -zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW -BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr -ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp -ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk -cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt -YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC -CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow -KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI -hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ -UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz -X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x -fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz -a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd -Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd -SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O -AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso -M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge -v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2011" -# Serial: 0 -# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 -# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d -# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: O=Trustis Limited OU=Trustis FPS Root CA -# Subject: O=Trustis Limited OU=Trustis FPS Root CA -# Label: "Trustis FPS Root CA" -# Serial: 36053640375399034304724988975563710553 -# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d -# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 -# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL -ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx -MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc -MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ -AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH -iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj -vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA -0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB -OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ -BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E -FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 -GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW -zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 -1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE -f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F -jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN -ZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Label: "EE Certification Centre Root CA" -# Serial: 112324828676200291871926431888494945866 -# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f -# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 -# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 -czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG -CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy -MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl -ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS -b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy -euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO -bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw -WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d -MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE -1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ -zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB -BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF -BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV -v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG -E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW -iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v -GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Label: "TeliaSonera Root CA v1" -# Serial: 199041966741090107964904287217786801558 -# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c -# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 -# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Label: "E-Tugra Certification Authority" -# Serial: 7667447206703254355 -# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 -# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 -# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC -aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV -BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 -Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz -MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ -BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp -em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY -B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH -D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF -Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo -q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D -k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH -fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut -dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM -ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 -zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX -U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 -Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 -XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF -Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR -HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY -GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c -77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 -+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK -vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 -FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl -yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P -AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD -y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d -NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot 2011 O=Atos -# Subject: CN=Atos TrustedRoot 2011 O=Atos -# Label: "Atos TrustedRoot 2011" -# Serial: 6643877497813316402 -# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 -# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 -# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 1 G3" -# Serial: 687049649626669250736271037606554624078720034195 -# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab -# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 -# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2 G3" -# Serial: 390156079458959257446133169266079962026824725800 -# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 -# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 -# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3 G3" -# Serial: 268090761170461462463995952157327242137089239581 -# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 -# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d -# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 14367148294922964480859022125800977897474 -# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e -# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb -# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ -FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F -uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX -kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs -ewv4n4Q= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Label: "GlobalSign ECC Root CA - R5" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G3" -# Serial: 10003001 -# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 -# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc -# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX -DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP -cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW -IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX -xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy -KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR -9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az -5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 -6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 -Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP -bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt -BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt -XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd -INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp -LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 -Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp -gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh -/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw -0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A -fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq -4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR -1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ -QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM -94B7IWcnMFk= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Label: "Staat der Nederlanden EV Root CA" -# Serial: 10000013 -# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba -# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb -# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y -MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg -TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS -b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS -M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC -UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d -Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p -rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l -pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb -j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC -KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS -/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X -cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH -1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP -px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 -MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u -2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS -v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC -wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy -CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e -vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 -Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa -Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL -eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 -FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc -7uzXLg== ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Label: "IdenTrust Commercial Root CA 1" -# Serial: 13298821034946342390520003877796839426 -# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 -# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 -# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Label: "IdenTrust Public Sector Root CA 1" -# Serial: 13298821034946342390521976156843933698 -# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba -# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd -# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G2" -# Serial: 1246989352 -# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 -# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 -# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - EC1" -# Serial: 51543124481930649114116133369 -# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc -# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 -# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority -# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority -# Label: "CFCA EV ROOT" -# Serial: 407555286 -# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 -# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 -# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Root CA" -# Serial: 1 -# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f -# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 -# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 ------BEGIN CERTIFICATE----- -MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb -BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz -MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx -FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g -Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 -fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl -LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV -WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF -TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb -5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc -CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri -wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ -wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG -m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 -F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng -WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 -2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF -AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ -0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw -F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS -g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj -qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN -h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ -ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V -btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj -Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ -8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW -gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GB CA" -# Serial: 157768595616588414422159278966750757568 -# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d -# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed -# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Label: "SZAFIR ROOT CA2" -# Serial: 357043034767186914217277344587386743377558296292 -# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 -# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de -# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA 2" -# Serial: 44979900017204383099463764357512596969 -# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 -# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 -# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce -# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 -# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef -# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 -# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X1 O=Internet Security Research Group -# Subject: CN=ISRG Root X1 O=Internet Security Research Group -# Label: "ISRG Root X1" -# Serial: 172886928669790476064670243504169061120 -# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e -# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 -# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- - -# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Label: "AC RAIZ FNMT-RCM" -# Serial: 485876308206448804701554682760554759 -# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d -# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 -# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx -CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ -WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ -BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG -Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ -yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf -BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz -WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF -tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z -374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC -IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL -mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 -wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS -MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 -ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet -UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H -YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 -LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 -RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM -LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf -77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N -JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm -fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp -6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp -1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B -9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok -RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv -uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 1 O=Amazon -# Subject: CN=Amazon Root CA 1 O=Amazon -# Label: "Amazon Root CA 1" -# Serial: 143266978916655856878034712317230054538369994 -# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 -# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 -# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj -ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM -9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw -IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 -VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L -93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm -jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA -A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI -U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs -N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv -o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU -5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy -rqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 2 O=Amazon -# Subject: CN=Amazon Root CA 2 O=Amazon -# Label: "Amazon Root CA 2" -# Serial: 143266982885963551818349160658925006970653239 -# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 -# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a -# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK -gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ -W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg -1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K -8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r -2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me -z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR -8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj -mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz -7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 -+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI -0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm -UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 -LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS -k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl -7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm -btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl -urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ -fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 -n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE -76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H -9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT -4PsJYGw= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 3 O=Amazon -# Subject: CN=Amazon Root CA 3 O=Amazon -# Label: "Amazon Root CA 3" -# Serial: 143266986699090766294700635381230934788665930 -# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 -# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e -# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl -ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr -ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr -BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM -YyRIHN8wfdVoOw== ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 4 O=Amazon -# Subject: CN=Amazon Root CA 4 O=Amazon -# Label: "Amazon Root CA 4" -# Serial: 143266989758080763974105200630763877849284878 -# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd -# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be -# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi -9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk -M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB -MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw -CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW -1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- - -# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Label: "LuxTrust Global Root 2" -# Serial: 59914338225734147123941058376788110305822489521 -# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c -# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f -# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -# Serial: 1 -# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 -# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca -# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx -GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp -bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w -KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 -BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy -dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG -EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll -IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU -QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT -TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg -LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 -a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr -LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr -N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X -YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ -iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f -AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH -V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf -IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 -lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c -8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf -lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- - -# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Label: "GDCA TrustAUTH R5 ROOT" -# Serial: 9009899650740120186 -# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 -# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 -# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 ------BEGIN CERTIFICATE----- -MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE -BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ -IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 -MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w -HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj -Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj -TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u -KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj -qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm -MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 -ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP -zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk -L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC -jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA -HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC -AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg -p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm -DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 -COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry -L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf -JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg -IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io -2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV -09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ -XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq -T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe -MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-1" -# Serial: 15752444095811006489 -# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 -# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a -# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y -IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB -pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h -IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG -A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU -cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid -RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V -seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme -9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV -EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW -hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ -DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD -ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I -/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf -ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ -yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts -L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN -zl/HHk484IkzlQsPpTLWPFp5LBk= ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-2" -# Serial: 2711694510199101698 -# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 -# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 -# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 ------BEGIN CERTIFICATE----- -MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig -Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk -MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg -Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD -VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy -dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ -QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq -1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp -2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK -DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape -az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF -3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 -oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM -g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 -mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh -8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd -BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U -nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw -DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX -dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ -MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL -/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX -CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa -ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW -2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 -N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 -Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB -As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp -5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu -1uwJ ------END CERTIFICATE----- - -# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor ECA-1" -# Serial: 9548242946988625984 -# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c -# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd -# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y -IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig -RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb -3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA -BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 -3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou -owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ -wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF -ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf -BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv -civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 -AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F -hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 -soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI -WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi -tJ/X5g== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Label: "SSL.com Root Certification Authority RSA" -# Serial: 8875640296558310041 -# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 -# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb -# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 ------BEGIN CERTIFICATE----- -MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE -BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK -DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz -OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv -bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R -xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX -qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC -C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 -6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh -/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF -YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E -JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc -US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 -ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm -+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi -M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G -A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV -cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc -Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs -PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ -q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 -cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr -a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I -H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y -K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu -nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf -oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY -Ic2wBlX7Jz9TkHCpBB5XJ7k= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com Root Certification Authority ECC" -# Serial: 8495723813297216424 -# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e -# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a -# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 ------BEGIN CERTIFICATE----- -MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz -WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 -b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS -b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI -7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg -CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud -EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD -VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T -kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ -gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority RSA R2" -# Serial: 6248227494352943350 -# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 -# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a -# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c ------BEGIN CERTIFICATE----- -MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV -BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE -CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy -MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G -A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD -DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq -M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf -OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa -4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 -HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR -aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA -b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ -Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV -PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO -pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu -UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY -MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV -HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 -9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW -s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 -Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg -cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM -79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz -/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt -ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm -Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK -QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ -w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi -S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 -mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority ECC" -# Serial: 3182246526754555285 -# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 -# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d -# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 ------BEGIN CERTIFICATE----- -MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx -NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv -bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA -VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku -WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX -5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ -ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg -h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Label: "GlobalSign Root CA - R6" -# Serial: 1417766617973444989252670301619537 -# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae -# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 -# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg -MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx -MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET -MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI -xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k -ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD -aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw -LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw -1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX -k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 -SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h -bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n -WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY -rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce -MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu -bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN -nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt -Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 -55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj -vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf -cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz -oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp -nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs -pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v -JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R -8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 -5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GC CA" -# Serial: 44084345621038548146064804565436152554 -# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 -# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 -# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d ------BEGIN CERTIFICATE----- -MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw -CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 -bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg -Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ -BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu -ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS -b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni -eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W -p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T -rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV -57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg -Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R1 O=Google Trust Services LLC -# Subject: CN=GTS Root R1 O=Google Trust Services LLC -# Label: "GTS Root R1" -# Serial: 146587175971765017618439757810265552097 -# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 -# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 -# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM -f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX -mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 -zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P -fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc -vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 -Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp -zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO -Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW -k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ -DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF -lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW -Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 -d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z -XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR -gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 -d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv -J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg -DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM -+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy -F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 -SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws -E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R2 O=Google Trust Services LLC -# Subject: CN=GTS Root R2 O=Google Trust Services LLC -# Label: "GTS Root R2" -# Serial: 146587176055767053814479386953112547951 -# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b -# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d -# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv -CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg -GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu -XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd -re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu -PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 -mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K -8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj -x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR -nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 -kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok -twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp -8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT -vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT -z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA -pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb -pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB -R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R -RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk -0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC -5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF -izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn -yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R3 O=Google Trust Services LLC -# Subject: CN=GTS Root R3 O=Google Trust Services LLC -# Label: "GTS Root R3" -# Serial: 146587176140553309517047991083707763997 -# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 -# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 -# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 ------BEGIN CERTIFICATE----- -MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout -736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A -DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk -fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA -njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R4 O=Google Trust Services LLC -# Subject: CN=GTS Root R4 O=Google Trust Services LLC -# Label: "GTS Root R4" -# Serial: 146587176229350439916519468929765261721 -# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 -# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb -# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd ------BEGIN CERTIFICATE----- -MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu -hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l -xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 -CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx -sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== ------END CERTIFICATE----- - -# Issuer: CN=UCA Global G2 Root O=UniTrust -# Subject: CN=UCA Global G2 Root O=UniTrust -# Label: "UCA Global G2 Root" -# Serial: 124779693093741543919145257850076631279 -# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 -# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a -# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH -bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x -CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds -b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr -b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 -kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm -VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R -VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc -C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj -tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY -D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv -j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl -NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 -iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP -O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV -ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj -L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 -1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl -1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU -b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV -PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj -y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb -EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg -DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI -+Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy -YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX -UB+K+wb1whnw0A== ------END CERTIFICATE----- - -# Issuer: CN=UCA Extended Validation Root O=UniTrust -# Subject: CN=UCA Extended Validation Root O=UniTrust -# Label: "UCA Extended Validation Root" -# Serial: 106100277556486529736699587978573607008 -# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 -# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a -# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF -eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx -MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV -BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog -D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS -sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop -O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk -sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi -c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj -VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz -KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ -TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G -sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs -1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD -fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN -l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR -ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ -VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 -c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp -4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s -t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj -2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO -vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C -xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx -cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM -fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax ------END CERTIFICATE----- - -# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Label: "Certigna Root CA" -# Serial: 269714418870597844693661054334862075617 -# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 -# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 -# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 ------BEGIN CERTIFICATE----- -MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw -WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw -MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x -MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD -VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX -BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO -ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M -CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu -I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm -TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh -C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf -ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz -IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT -Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k -JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 -hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB -GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of -1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov -L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo -dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr -aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq -hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L -6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG -HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 -0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB -lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi -o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 -gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v -faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 -Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh -jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw -3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= ------END CERTIFICATE----- diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/core.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/core.py deleted file mode 100644 index 2d02ea4..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/core.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -certifi.py -~~~~~~~~~~ - -This module returns the installation location of cacert.pem. -""" -import os - - -def where(): - f = os.path.dirname(__file__) - - return os.path.join(f, 'cacert.pem') - - -if __name__ == '__main__': - print(where()) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__init__.py deleted file mode 100644 index 0f9f820..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__init__.py +++ /dev/null @@ -1,39 +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 .compat import PY2, PY3 -from .universaldetector import UniversalDetector -from .version import __version__, VERSION - - -def detect(byte_str): - """ - Detect the encoding of the given byte string. - - :param byte_str: The byte sequence to examine. - :type byte_str: ``bytes`` or ``bytearray`` - """ - if not isinstance(byte_str, bytearray): - if not isinstance(byte_str, bytes): - raise TypeError('Expected object of type bytes or bytearray, got: ' - '{0}'.format(type(byte_str))) - else: - byte_str = bytearray(byte_str) - detector = UniversalDetector() - detector.feed(byte_str) - return detector.close() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 288470a9373b1283e77cfc95e0067b2a5b22bcc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 868 zcmYjQPjAyO6t|N!$pRA{9N_39m1t5ZhcO|91VeBcXn&B%fz(ahG?2u>_QpE83+01s z;>0)MGx*AhufSzIrz`A9et!RcFF)Ha2kYwr0{MB-dw<(S=$CP>iUrP7SaK6ohB92D z3dgvzVhbDJD(%XNoz}L?PUXgK<;5QOPS*K`Vn1{DP|y2~0p7E;{pQ^RqlP`KHxBCJ zhzUu{=S;CwaRCL_lElOcUMGq6-fr*iy?VWq8uUsGqYkWRu;fcn3eAzi3rh}K%L41J zvNL?<sLmWM@Ht-KuekOVHr^>x?gE|SIX?5|=p17NmVb_brFHT>ARtRRL`@lCb;`4% z&IzBieh!RlGM*_$q!N$_gBG&YP(iCUkw9Y0v?2S@U|GsO9YQBY6esMMRz=OiB}~nl zWzByS8I24`jz)xwONR<UXQNSzIeEB!+`x6QjPUUXFj{V_KGJ{;zJ=T)Iagcc%iy%P zrh`HjwNw;{=(T?(y3>A5ukAyNZ6UbO?u3hqD(x6{!htK+&V;c{chZte*0W;YU<_q= z-^;iAfy51{{PQ`Q@`^=b3h|nY=tWsH&2BU?o9O2ha&U!5QCW<mW~QdR9)_EdEEMZE zH2p|(CZnck`u87&gK*eyW{?h9o||9<vr%WzG@VibAC8iws0)=OVKdY2lF1!27B@j5 zFTeqIv3ud$KI{P&8xY-rn{ZQJHB<>RO2P&eZyc^>adn>MxxLF_6lUTC{2-`p(jN7S Z>Ow;Mk1L)Xmh8zb@T95j;_J9;{{<bw@#p{m diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/big5freq.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/big5freq.cpython-38.pyc deleted file mode 100644 index d60f7b5373f7f6172ac458d6c6e0d58c275f28c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27197 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 DdLpuF diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/big5prober.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/big5prober.cpython-38.pyc deleted file mode 100644 index 88a3158ba0b933f7a25387b4657032a83758f28e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1152 zcma)5&2H2%5VrHT>1wx>Rs{~6;ItCEDJqpfLI}Er3W+U<6_*^ava!1x;bepDt(2;_ zt<={j$G!>A5Q!5fUV#hDB&`~RkZ|PjcqSgteDnE3x7#K#zW(Zc{N@qz9XHM4z~(tj zy$6C5P9;fcNGa-;v{E~?E8Uh(>V|HmJJL&AVT+P|!d>p267C7Qv_qe_#-!)}pb)A@ z%Uh#`G|6sZ#Bdg=u`ut{d?FNh)`xSRWYe*Uj2K1nEXf2|@9ZYioxMaGl}r{UnP)Gu zNESNL;Op+b-rr&45gWbTd-*1Y3;r1P<xW2WMUaqk5?W{EkaEhcQ$MtY!)@-Ik|hmY z(5tLL_s)nzLd?2Vw(<Hp#TYBN8mMD@ocaL>LkvA3OY7YFLMSn|ah9-WuJM)x*47C* z_tC=%#H9zlmD1IVTqp(jlhS7_$r8hu!hp&}+e%#F!E~yyALS-*pui%8;aI5BRYD7M zK}$yqc?jzYW3i01X6%CeEP~lQ6@i)wBeJ;)UdbfS-v@`dsQxqp-;v0U0+~#LyfCwQ zwmo<p=){PA9>t%csn9{5<o$<F23v#eeqMlkAf{6^1`LjJ2pU5txiG;5u*$1;4)Q|z zko0|+8WloUX`A}=c;gz-!Bx?JA&ck^@hBF~DIjJYln$O$YhY0w6qQzqo3JfAm<1rg zGAODC7Hxqb*75Dejm>}l@7C53iKxZDFZN}WO&5Svzj0}^%qxG-$3A0vjFoN1(m7v9 z)H{rQUPQ9?RJfHs;0Ww6h1!6qY7<1+y=-hOqy(m1*T0ItAP5zi?t!B5efzZIS+s3i zw6Y`TZlse-2<kp5#Hd`anWpjOrS;3Jcv!Agoo&#rW}*jCG|&=hT7_=pa@`RBX<gv6 NyO<D?phK(A{tdef7pwpP diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/chardistribution.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/chardistribution.cpython-38.pyc deleted file mode 100644 index d06cdf11d180395c3dc94bf8352d8b1299e020e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6238 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-38.pyc deleted file mode 100644 index 1523a35c11a340245969772645eecffbef964f2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2269 zcmbtV&u<$=6rP#=;k9F@A*5|+kw{SyT|{Eq9%!XPftFSv;i4qHSb~w`nQZJhwllMi z6tg*?TIvaj1Ajnr?4^GP692*85T~BFbAj*8IwUE%vB^BYH#0l)-uu4y_GztFVR(N1 zJO2K+S;qb#<MiXh_zc5-2%(tbJ+{M}oRcnkV#jNGoIPgBQ~rc0UwhBIrmuoE7Kg7m zUWs{L{niXNI{joVZKWD^?ZH;dtm%}dwP|D1nTKwq$F4$X*5rycg_?cNHn|eYo0OZL z({alrYWg}*p(;(-Gu{lLN2=`flB%eg32R2Gs%rQxKW9E`R^Zo#e17V{V>1{H3ojaN z;Vvx%>E3kM8&Fb~@{BzbU6FCcf1>b3#-x`pNMDf*6vN?O0|CzTTKz<Bc6zBcujs@$ z%mX_bYGWw4Jd(20@1#=ZGqTlAJ9}F8M>~0G=n`V{dAXr&DwC16Ru+@7$bGAOn<l^k zFL+*-vfXQ8S-xO@{aD``?C84L(y8tbO#M->GaRngH|fVLCoQb)>Hc25*V(8K_tULG z|MtqAy6vQTdDv=iw-RmZ!_IK|=G~Q#R&Fm3_p!X9lY}Pg60a&8+6HJ!r|#G4G@;xT zzO4-RO$4{DVOUZapXVX|##jHF=#}Hx+r*CJhZ0Vyp`_cdA&wJ%D2^DCjpR!&V_p9t z`|kPy&$zjg@#z{MkwJ#nyPonsW&%5RuQ*6T2Z`S>Ax>O3j*cZ$f>GcQ7>!6wnI@<T z@~}X|%)p3+sk*r$NK>O-7f8&Jcmv{n3`-W{vk14seIDU=j*l153EW+FCTensB7cBk zmmm-!vx^x!<P>#bQ4FMY#TtNb#GdmmpG|Zs+k^gQN9lfB=T*W7(a1jFe!-pZg}Wy{ zU&0kP=`L6DB6QyReEiNi-kv`0|2b_IaOKo(a}jzTQGJX+J98Q4>s~Hm?k>jbUY<v$ z<AcsrFA<4`OX~y*r4Pi}I}n+$bGu<Cy4)_(?;*%@#1Fj8vo~OSsn_+lh4~_*>ISL0 zp#Ts7fL2Oa2|-06K}XOnQsNHLEyBJ?dE4BCv<q*RPu|3-I0c=-Z#;4gbYzSxj&Nok z-sS$L*2)kO^61f%r;Ug5tMvlpz*5W1!^V?!`OTM(sCg*eWb7C8j5hXDjVWW^!~y0i z35WOz>~CT2a}0YOf;pNB&{RydilZ*cS<FPd%Ey<_Ap|*jh6vP&sFqxse}RHP8P#UW zy8@|NP#lRP%Y*f<0)LfvAY5ho*c$+nRhRmEySFm08`^cumJTE3!zv#M&S?Iya>Nd3 zKdl6`f-#f%M?NY<Wd1fYw=y5lqCZF<Z=g%qpOuHZabp}dl9!KvA1}Q8^M3Nf0;!Yx z37mD$xb~i1>JQSTqVC5RVdDR!td>539aoFA5<=z*iML5mlQ@N9*c&8ZbRH<ZF-i>8 znq#{mKF2{(kOWV&?7BN$;xKFaPJInDDwL-f_5%p!Ao3kx{!}Lj=Kx~FFJTm&2eo|d z9O%xriWp5~hQ2}6Dew)dNVzjmqaNv1DR)P$Ua{hux@&ZKgeHj3SGr%sMIjlYRZ-8i z>Bp$8dp#*n(a-fv*Dk3ZmoQwrjQDI=t$=?e8qtF5#*H}01C8&Xb*0d(O*_!E{nD4g Y?K^e+zZB1-dqoJJ5;B%9tMaP%4;9Di)c^nh diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/charsetprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/charsetprober.cpython-38.pyc deleted file mode 100644 index b72bf09f12c9398cdbf879aa665d9edaed80fee3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3501 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 A#Q*>R diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-38.pyc deleted file mode 100644 index 683f545d861a97f663a322457ffba26a2e7ac0bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2928 zcmb7GO>^5s7+y*KP#niCZJ`Z?ndQRNLt~feq0nKVr5{{qV3NQ=2Q(Y)+Eyw{?rQBe zo%F!8zkzdm>_6c*=*p>oflGPbl@-T{VTSeWTKo09&pz+_uJp^sMvI~R`M&#Gqr=!= z)Hzvd=-ffguc47lItdGybfuR#V>fUe_5+hOS%1Z3U3o9PpeCJN)@{7QYPS8(LECkT z_9GFE;#BP#VN^s@CyR&99n}0j8pQ%fvcQ#2;E|bE43O49P?rtaM86?@xrYCyY{_-} z`)W<L<;E-a(g|9!1M}yK3->Y^r$cLSZe09<v$QzMU7iyWJ}y~tlku6-@!*gPzJG{` zTs@hpG*Wz!X^c&THgPmfgytBvz&-vj(-uqtq}*jjic5t98tl?4Qt?dX*LiIC(>O`^ zKq<-1NSOKRj4N1$&B$P(#agB%W+G0+exk1PELG($>=xX_W7Xq(Ft@xR8i{nMa#+ky z!0n41hO?B0`9!N(oK5rjPLUF&IW~w^tS!1$T%g`uU;#RX{bj56NVG5;VA?3Hazl~| zES;KctCHk)%L480-QC$MA#URgF)(w>p+v<-JZRF)jBs$$KT$)GEPKX6kuQ(SwYUdS z1fPi{mK<JEe3F4r*E$i>Xb7z|ABmjrD+M{EN=-b7mF$(w9zCdN&3UCVju0nA54w|1 z%O_tT!0uAuoTg_1aL#<9BAARwAHpMAxiS<Zn3XDzhbf$8!_K-!n6pq&m{zA5&w!zE z%sh_~Cda|apN?V#WdsjIS!x8FW=LqFcp9z>b@Dit*hmGrL<vNObz(doD;ZP1z)(!F z3fJaOVHh+|!_lEChtFkwu(R{iPNi(=@DsxRm!|Mhvhe+BQ+zp1t;CD;T%2arQO;te zh_O>=D@9vC-mh}oilm-J$rM3G%ASR*cJYDE#^i+@!J=USd1!~=IAl!Pvs)t<H(yog z*+adDn%_Wk<Q%aOH!oVpwytD&_Dt<{-8A0Nc=L$8_TMlEH#Dw4cU#+wcdclIV<bXS zbi!z=bw~ja!i!a(!Y@ozTCA7zHoS{wk`0HrJd3rVGC$&3>B0}gRE$*^77d!kNF8~u zOxG=Hxk?6sn~&czeGYX0{=GlS#;UJJ&@0V!|6vkOCOiEB{pqbCVEQwa&iYBb-=7?s zQI_89ebq;3sjZ2K9t&Jy{YgC8`ts}Ejo!_z$swkDYB;39eu%9SphO*k)-SJPOMHHv z_a=u#H%?;{hPOz>HX7zM=D)V{{OZ}aL$BHqk#tp|XYz;j1;H40KzhRiyX>vA-SsrN zs;JvrP5XF$>u9`3ODU`#`aE?v(0qrQTUR^JudJY86<vx2dix&7!U&xsc7RCOL`-b5 z7cP2^aSy!5uD&7B3u|`X!@P^i!aA+6W3^3o38R<U3(xlJn5T7!sUucn2Q}Hag`-*o zdV@E&gY_s8c^(>i1=)ZKI#s}wgF(AoF~H55>0sS@VZNS@*=^`L{;VukCw-B+4QiS+ zU$asbP876kXj-_SWn<NXl>$;!Srv;`s-Bt9PJNHT{1O`Gb(}VQd*1Ch?)#d1-sw2c zKV2d3V(%Frlb@}Ri5uy&%k%|2b{$JplbzFCE+RW@+Tb-3k}yc5pRum;@aHQitk`mf z%W=HXhne*id~LJ3s8J3gz^tmPI9;&@>=#O@QaDeF-4n#V_%~uJ_Wd7reuB@BDbiPO zl3XkJ>8qId^_YsgG7&43?e4l>$J(M5(k(Vk==N!c;ghLI=66vu3}qIDq5gmjQi|!1 zsJTqd$7l+FqO*z8=Fplx;lksX(v)MLq2`pQzEk_q_kGXrpn9%jXS;R1MqqW7PRDtf d@r`W%0AG4`eidxte^ZkF_7lP;Bfi`A{sHO24vhc+ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/compat.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/compat.cpython-38.pyc deleted file mode 100644 index d5a66ecb4767c4f3aeff95b13e8b72822da8afc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373 zcmYk0y-ve06onl-p=qHDLOcT*5(8a8LWrp&Li`M5AWGxgBs8@x+pWkW@g_V&R;IoJ z3tYp(wfr63bL1mGO{Wur^YNX$$dHgvzx*GH%MD)ZA&3Y%k`o}WfuJj5P6W%T2y+G@ zL`$0QL6nc=5jqqT1~G)cZkUfm@IaDihb`nbp*x0Z0>tAy84t|%b~xCAv8|FtE0=0u zchBb@GYp*>MjP2yN<bbjN(+Uz#tz<G;d%{2wCEk!cVhN^t;g4fH);*sG~hrg!{=SA z^*vvDF=<_5wgtK6UAy4Aca4&>?1J0YL8{AYRn}m+ZgqNgnVn{{RQDKXP}kn%1wIv6 nS~aB+;CQ9hx^$WDhxlr(#HNGmWBi0YM8s?ogm~g$kN)WoCMslU diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/cp949prober.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/cp949prober.cpython-38.pyc deleted file mode 100644 index 5f0332dfd97ccbe3846aa734d0c6aef7e6b57170..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1159 zcma)5OK%e~5VrS~ZAl*#ia_E7rwEb-wFfF8UTNV_QmRJ1>;Y@Dc9RwR!geYp>MfP} zH_Ea9gx|1NPW%NfFypl9RtO2N)}DtwGydlD;nLC~f${x!>+|adAwN*54+oSt@T+Z@ zIN>xU84W2#*-EX<4s9dbsgt>(Yh)+&vPRgT<OAU@_f84-ggdiCpEvrX<^QA*szs{@ zJBQufgY86VnGD7{De|{@lulHlz`52fc#;qMI?|#S#iJw_V7=EHr#g8z(V{zwWMAlg zSqy{(&vJKvYjcbBd#v|qd*@>eDQ*n=Qd65C2oh3GLhFniQBJva>W8*)xXqnYGNYjj zvZ)(n?~FJk#JU^REt6xOGR8|>4U{nf{^}`AnrM1LX4bj&jZmU(?aV-DuJ&dG*2W1r z_tC=%1g3kfh00aqQb_5+;mT($$rH_(#DLO8+d^#cU@DUq>g&9Q8;cOQsgRW`g%bLL zR*n+s5v&W0#c8AzV;AJtG#C|`2;@j;kry&}pC)B_5FFtm+rtQa$09!t(qs^n6Fn;O zjn0ceC0ex0DE<-+g$l}~Y(L-XJnL+<%L%wUVmL%&z~Cr{pfPlY3mwEIG^8~B>68=c zL)DMrS11s=Oc!mRPVd$r?Oa{^FKiLtE}lg;atfGPdzEXB%2hDQCQe2&(``_zCKdu< zupI971S|@HBi8hOJ!gH>|K;^|3n`-f---P+%7<eBE2t&CanY*{EgyT0^)Xg0GL{v5 zoTA)h?CUs6=N<!H<pY$!5IvE1Ago-6sam>hZY<Ii*m4cPGHyW>451!@pzxXdwCP&_ zyhV*2dADlXRpZi}UTbr@DSUp}{P`I&Rx8=y60&(~CAOsUz^Z_nNL3TMR?Brq{Fn0! OzIuoSArG3=eD)s>nilc^ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/enums.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/enums.cpython-38.pyc deleted file mode 100644 index 27c9c7a11e2b2fa22d2c49a776cc127e0db8035d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2666 zcmbtW+iu%N5G8e?D8|mk1qu``+I?t&3aF*Fd1>9Cur9R2Sf&h-4jMj`qPc5{2}LTq zlmiRsQ}Q$YgMLE4fv<hiFZ7nqtfbh993w$jn9<Je>}@V*c)Yo3DA0a?S^N1HO;P?p z;c_d1unQzcz^LLW`wCTQ;e|pAOnqMT3LqD03FMNLiy)V&2C^pQ637**gRD!r404qk zARAKFK)yjYK;DpYg>E`Z?dFUd%{V6MDal5Rn8|c3pciB$;EYTKqag8gIvl0bOsa&V zfK!%{Nf15>hOBNFJHa#?rF@5Uf`qi<AdxEMOBy8gla;tT90yTc57TkY2;qgVH5H^? zAn^$>rg$p6zd%*5NDE$x7QHepc^WOleYM=MlF2l4vLItK#~{$$Q6vb1n-k6^oC%g> z_y$I3bb87-h(w^eAOV>s(HY|+hzY!bg;~l;2)90ABueUXw>exvnd6P-1z>iqlIy;o z1Y_p=x#9cclul#pZ}|SxX%H`GD!xzC5LJ$j`=;M?+Lo19O{cx;-naJe`>jW=`K!V= zU}MSt%o?L~%o=<Iw@Fgo*o&jdq~AEjKfXPLQyXV2IcvnxNn>&jW=`(bziWsnW7|sy zh{hzEY=858{p<SO?a4Vz*V%B0gAE^+QrL9qvIg2n)F<a0U#9~JWV%`^mei6eN7r0~ zHrPegd%)iA8m~e%Pp1{H%1W%<QapnhOlv8u0{t6Q2iH~eo82H8P9bRaqBvuG_V``h z2SFs)kyE))kY`M~EtpK=bCRVbkUI?q$1C@Cmfjr<7GC8=xIV`mn@ffdpWjCI88ExH z!OQT^Au$zRL52$6R{OqXn~v!_*5Ogt+Oy1#_rYq+?KeA?YxV4A*V7*~kD93IX$QT& z*|hVD-Lw7ngM+-->~_7%a#3D{p$qpfdYgFOO<;F`#1=4cNeNxD`su2iUvtj;<juwr zPfwy`xX7IScQyU1%$dM)ww5g%<Kx1(kS$jlvf43Sv+Y{;ey;EJj_r<bxw&TdT>sF# z(i|Vcwgl+)2*uI=XN1Eb97PFR7{PvTBS>qI@nVxVk>ee0QFh#B-_6Trzu)V7n&mog zGr~vk+}fHEaCFTG7~Z?6`W3M2(v;~`qm>uRbJeRZ({jsUPp2#iSvPvZ;%JnnboSHr zriou^V&w=3B1{lMPLtC#j?-rlXA*${j?bcWDoC0@r9iNL!$@<yc!+VlYS>3=0}0Gk zsseZvW;;8aWmBGr9RPer0Lm~N;q*&)2?6DYDUSf^qeNZ+A+OGF!8S6?YHD5#V{s|u zF!}PWA<KNw^e;B}0guPvR*JJP)(uo&Ut!mbD`Q``&HbipJv2T2*zQ^fX7`b&E&uhS zo&y;2(9CayaUjH)0mM`ODI9z0j<Q@xl=v7Xz6BBp7c1ZflqeKbj&mW<YYi>A3nV@V zc3oU7;2SKh=XcsGZ?+fqJfHn`eK=ec+6x1cSD+0Qlf?oegUek80|&w*X07v#;YosJ z2u+L+1_UbmMJ%BcvlKosFm9R&R6h)>m<joXl8|=KcKf|9f$AToiHIoFdJ4f9vkW3} zS<PR<yXXHR`v=+I$o>Lm*Q!@~s|w&`?g8p|JfjPLehc9Iz|)*Zhpk@MD|f7Y%LP1N zoPDK}2yEX366iN@lD2|zjx%;mm&GO5(v!#V1tQC?gm;ec#xcF6FQxWX2ju#_#Yf1G R=v{eAsdBq|`xX%J{{Y;ZeCq%J diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/escprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/escprober.cpython-38.pyc deleted file mode 100644 index 64d3876a27bd7dd71c8af2f2f15b3bfc0b327d18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2651 zcma)8&2Jk;6rb5$uh*YRO<Gb!%TnNAMC{UD3PR8-aay;H6U8Y)E5YFGjO|U=YiD*{ zYRfq#QZH~voDzvkF8vGm1Na;EhB)=ay%%_I*3L%*5@XGqw{PBjy!U?Zjh_?>Spx0% zzsuhRbA<efA7`5ZA9taL-vHr+Q=jyxLn-o_ul00CSG?{Uy_A#cnU2{@J82~|e5;pn zGQF&m?d6<YFYn|jxleeCn+JrOg6`{1fv20KY`vneeVN9E<!(zhMYJLN+d_h%wA|-j z&}l}kNUXKot`~^19v2_Cg3hqj5v!gb2^r^6f2J1ar;2J(*@$xw9M)W8YwIhu$8o9N zT)%bm)~)5nMcKoRi?T<XCo&iAc&?#yu!Ua(5yYXKI2xyp&gWi`Hsv}u4l<6Rcr@B_ zQo`hEZXJ+)>ZF0s@T}r3p5yrg;$(P%7h%l4AO>-A;F|e(z81RY+%o<xYeU=WdZB%8 z!XAbqv|IKKx6g$gx?Rx|H|*A6Ap77tyWN*I7m;uyaFs0r&;lm>MD6xNS4govvPCQO z{E;n%+wTP4xV7yITZC?FAZ%D3cD;6FhhldK%keBJK-KpIxBGz|_0?7$7eVB;M|RW| zA*`MqR8g}HS5r<)2=eGg9eQ{OBq9-=kbP}On@~=F0;F}wgfM+Vc8n;sW8Nil1$g~1 z9a&LkpB{n6$#?eT8+CJ_`~AsW{@h#v<|Zd|#bl1-Npp(MD|$)M(u5qobwm);5D={a zu*~@YK-O01D=);Ua5xZB=HULZ#h4d(5o2*CaWD&eG7mEn?F2wSs5ffO8f(_qHXhek z>$R2Ggb;~<OLT%vBe77`dU$W+9_q>rewvTgH*5DA5)(F_Ye5vB3D}#t{b3Nrmsk>7 z!I=v=6pAP=or>_fm@l!(LQJJNB_T9XS&NNO_-%E+V;W}|bNyBrGImT}Kd*NCJyDfi zfK1Sr)m7gc3^uE69OP1`1#{0t@T}^4+ttA+>h^=%l{?kYi^S5P<vxYe!s@^qEPeV} z<!0sf(qIJB718OSu*zU5hfVRWaPcZY3{VO=Um1*K5iI-|diX97LQB-7c{&e2q}a{r zZ+!L5+^EdF?_x!nHAERYSE1}7Ff)`LY8Y3<!3z0yagR=Dczt()!^n&YO=fo&q7-WE z11_1V5Rq2Yn&M%roRJ0CRK;H|A_t`u0+z%m)_oDk1r%RKas^0PlUI>PJ^2n2G*w<h zf*X7eJuCqsv`Dkmpc+`51=~$JzH-5470Yu5qw(06p@$|AFaW@NOdH2k-2w)60d?%j z*>Qe~9Tq@%Yq(e?t2VxN;n1_1|L1IJ!**q=%$GNSPfR{N+nRy2e&*bZ0iJ37_nGK7 zv{z<1ZNf7J9TQh?bY9;7W4!S4udh0wp_+UjhJU?Hu_Gc#t)Pw7%oS^(ryNNj1co+# z?}9(h>z^xfDOikMMdMdsCKTZI^PYyc1n$Q@eWJ_aMBhR9!FZ@mv?ID_OpHk1F`jC& z3y{<q0MH;iDX!fi8es^^6xW|p`AcN(qyd~3NHQ7(9($9(PPje`>x-a~QyThV{s_xl z0ZuEzIQQn7T>~ZHFQc(45ks$_!#k8<^*ZoQHW1IFq>xAiSDdPCZmw@87)L{6v$4L# z)@t%?HJg+iv%b{?S!}JYKWVJ6`j)ep_zYj6WH;7Jp7<nDK7_?dwxkqTV{3a9LCK3` zOkH&yCqFB(Sk&GGl+hM~H(`?y;YO$h8I*-gLTakKvY?h^mE58wZG8DcP;rMcZIts^ z)-flbtY;bP_4&|8KF`?hu;ou@(v0!G%a|%)Dvx6esv0~E(MW!P)+m!cLaqWNE==pK zD|{c8ohG9y391_4n}SPKHL$2*7U%OhutCRenX2YA%Eh=a&BvsQN=#d)G=1UGIWy1d zcy3Ar!(ON!B#H4-QG`Dyp$l)-$pfUG9rfHKmF@I;XOi}d#1~(pD8y$g4^?V`E*k#; DdRcYk diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/escsm.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/escsm.cpython-38.pyc deleted file mode 100644 index 60b778b29ed4e41063db402e1d37ac096e24acad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7492 zcmeHLNpIUm6eekk+T|@tb0~W1Av{QQ<Vyk+MI2YH;x&-e%N!ywn$gl~AxJua^IP%< z@=y8`3SN8SFG!Ib+V{AOD4MpxRImV7B4&B(ym|BH6Tx50<$?geKmJkQR8&Fu3yJ8j z3B(I%)}I@KKm{s}g^5T+QJ@l$nE2ZUG?`)_Z8CBbS_XJYE!6dVP>-UhCsW1iGc*%$ zeVI(*@g(ye^`kNHd4G>6G)uBf0&fb-(j3jx!Uu)qXp!X6%8MU8ahurOTLpMGjY<28 z^SHeqeaxe`<0uby?d?CxyJmjH_7=U3{tHr|B~oO0T4n`Sq?I5mCAvw<V10X5Fk5^_ zx6I?2xQ^!j{PPdJCg#hpj&SGU$UTI%!5FR>mEUHAx}lC&8~rA!&@Hmb%5<Am*e2bf zyIw7A(FbH3w3D+IT{AilV~USlCwbqvqs9CLdkpQ+-$E_-pO7861G{V+Dr$%A(uees z7xx4DO<PbOyCU3iRdh<HdT%(IvbL?;?1=ze6D2M*!2|?YU58<;HiDII|GqEo%HjFC z8JM|JNP6|R?t+WBPQ+a&!u4*RSDjvADo~iJax)UWFEmN@mzUN0{?odXJw!mYn5sC% z-dMM+uC2cvGpFPeeZ6PTOs8le;s&BhZ>XEyF`EXoJk=-6$&K~t;6fh+xQv0^9LAkU zmxIgMm2ZaQ&z)rL9>BR*f9p;#*Ev{44%B?Ai|Xb9Vcr*Cwa=^dy?VWRc;>&|E(b;D zCGeFOI}M7uNnn}8`^s2SndLZea{zVcyqK#kRK|bNR7ZEOmFJbSo~;5#{^#he7Si7? z7rz)rp!DdqlRMH49ba;n392#hNKd8#Rr6W^<+zqUQ%kZ~BWB7!j5U<5p%mXTR#XQO zY&>o`%JIx(`t(eF=w#URVq%&2ZHp*P(mgzBJDGOppw)3QjaKU%lwWn)-O~oifVABq z+o;q$Xmw8-XWh=h%aevvM9FFQ^!%sB2`R(-EWXYjo}n*Nnv-DscuvK9?93%sTphh$ za0O(<6$%%_30<LHJgVc?f-4{+u27il3iSe49|iL}JV@+5+uCq8VVXH)Hk-~&?dS2x zFj`t42eUeWPbAtqHhrg!M{hOb(jLyH`?Y79HL_XN(0jkbhZ9RPMn?7N^V(i*ziM29 zxW)zpWNKY7rQj65yijIq%<5T_nsMpmewfVY#hCs0EyQ4L!P%80`FmNA1qoX4h<xUA z7HH5DQP*!0jsfk>IUVuwS<cInB=YBrlEpRA1Ai9Q0Pc-6uE{Nf82!~b_llfLeEq-W p;&Nm1V-EM^jX?|{?`q7knBp;il1u+3#%K&Y+wnEN$hpNe{smcgk$wOG diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-38.pyc deleted file mode 100644 index 347d5c9d9b1a6ab3fdd0b168e516b274d5d4b53c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2469 zcma)8OK%%D5GJ_~ujI9?IB{YJMd1L=K|n2~NKvFfP$adT7h>74<U<9t>{_JcwO1>J zO9io@oa`dk{simLL$3W5{S7>}r`&q(C7t2gv7916SLSerj~VjgJiI$MS0wQL@xJoY zZzV$hLSg!IL3jWy`x%HJf+nO#TeQbojH1jEr{}g@%R7nJ^IN{<-DIX0v;xa}NugJ4 z6)o>4v%RntQu3IH84;Wi5lHvgY0Zg3gH(#|D43}*6K<>iUYvFtI?~dFn^Ai|PNkJ9 z)Lh>jCOZE9NXxbTNHwI!)l$LC!dhRPZ#&xrqstq+YtOdV<4mh~Z>Zyb`Y?@>qb$x~ z@|vAo>!(`2(o^FlJI))Md~<7k<9QnncIk7@q-+})Nm^8p7JEZFR8YZAf|g@>N4UVd z(i5KWPslNC`M}$o13x1QqIg1DftVE`^o2LXC9NVLF=uA2{rqNagysB09*twmz6PR+ zreku<PT7P|q8;rXgUmhc9~0<jbYT0!n4A`Ig&+;`mewn?#><8SsZ;@!n1J&*jWy@W z15pJyR%lx|dDc@t%8OzOLmnZBBiKKKbLDmp;fG=4DVa(AmKrycNeB7@=j|lQGS1(U ze@3<aeoxlazSJ`9tJ<R^9t?JB9qiO<H-fpBGJRP~;=S77NbmR4yVZNOEY@;$5Va4Z zuFPtKc(D4_x79n<yQ_mEn6Aoh7YAz`whB<%2LBLJ*W|E$0BX@os)HjH!hvr?%dGR$ z5-rjIexuwMa?GpeczhcC&p^dx@W<r9$)5p1R;a$>s#)kP$f}IoJd!I&t|D1PavcfI zehDqZs3UN!(UmDDs9HGxa~gDqwewAag72{U$cKHa&$e^j)|9pK!ITLR8F(F@0?>DG zI|D-4XldHw^rHV|*aXj_L6pL~f7*1AL}_;j?}xs7ZuS!L=L_2QOn5H%&@0i=>|MWs zTU+GmG5prakAJ>qfIT~P#&pb<$%MXk#t;Yx-XT+UnDI|%1O&xF0Ie`)6UbP)crXj$ z0lDbK-!DSDdJa~1V7&Cv_&kh<R)2XyUb|x^7>xWrhDcwA5IeXcocq`>oL)s~>`ov% z0(Wg%1{?VbIH7Qs2+|wm7t}Dl{u8sXn+o^L8nf0G;iT6O*{@XHv6^p8NY0-wP0;%C zp^NhQePCn}yu+)HZr#pS;4hDdmHk++KoIxUN~BlzAgRLKJ49TeYrT69U*#qQGrXEK zP9jq^2jixgLcZh~CTNAJ$aot&J6k)(Px{@iRK^o>Z`f5gP|-3Hd`#olx0-x&!}$45 z<3DXSP!1k#?bg@%)28tn&4)WpbF~Z3*&Zq-Q|Q52!LTWENFTXqqsX`&DTRW<1?KHh zOksVaxv|!KT7PWjyM4_ew+y@cTtqrDC9AWac48sZwloWkCtEwswcRFfKH1p-;rV*S zQwyjqKp^0Z%Fq~s<tz=_Y82pUIO1?Qrc?zs-h-As077V)m2F;eA*ZwVE(@q{Wu%yI zO0-ND*b>D#q`p&PB^uHY*RoN0IuP-imjVzG$7ZA9b70_g$teZzL@#HSW7<Z;F}uh_ zHubE+@*Fd#7rm-D`HkU{wghtMJ0?8K^j7-#qNv~pXc-m-Vy`p0IepyAI76X<;)02W zb9h4D>x*H6e8~BWVU*-EHYwW_Xaev|s7v~2%6kx8g@(=CSruu^B!Oym@d!4X+C+*4 z?F(obX4HU&Goj09(ZLqnvYEJEDH%_u!(L|nGWX#5-riZp%R@t99ySa4>s$Bg<^PD- z5(yO#tIJeH%!{OdFleXxRbCZ+P?<sb#B!RKfQ$29WaHp|j>&geQ8KJfWpsr6=llx* CJ64AP diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-38.pyc deleted file mode 100644 index 8c031f77750727ef5f6d273fcec9728f4fbaf050..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12081 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/euckrprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/euckrprober.cpython-38.pyc deleted file mode 100644 index b4196e5c24215a87dc31e46eae2b4acbb64980f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1160 zcma)5OK%e~5VrS~ZAeS03Id4}oFb7ds2o5-2uKTul7bp>*#p*Q?Ix@43)@>MQE#c# zzfq3;C;R|Td*#Gm-~uyFt8Rsm@M_2Nu;=m3_|xiYo51?^yZiaON5~Hpn#%#<75r)& z2q&DTB%>jv$XltE*`aNCJ9RQQbPeyMUe*d*l)NL{<=zS5o}ddm^m%JUy8cfJuDZ0o zGptgbyqRe+m_~9W^ha5Yg#^pSpx{Y98R<xiVH8i3T!8l8&Zoid{&u3YOvaT?iu`pR zr8AW%Fs>OR8x7g;!}iYm7(!fI_JyRL0wYLBISH*(azHud)`=h5!r?Y|PRN3WF7PIA z;Js7gkP!23)i+FxWtK4(ak-Gk0Qjp%Ks3?xm@KR_>nou|+uB)x%v|j)2<)w6a^|Cj z6L3uTx+}G-s!~V^Eg-eeSdu52F^LYPi@KHAK*Cfeu_g6w-oSxH2*g~-+Lb~HeNJmf ziSz*W6~^K;Qi`#2@@pPUi%bM^DzwN88N5xCvfK|2aFe}B1hylQ9|dVL4$7IH7Wr2H zS)dXvdSw(JMiZfeGAVmcp7$U3w|eCa%zZJLpfX@^m4nk5n#qL@L=_*((zLW+&ZG}n zKZIW)L+Bc9Q=iT^8<6%d%l->n#CL#qv2;!WGiz_|!PVaGzFY^L>>x3mA-6!RJD3Te z!Ez|93mRnsA=dnEGidYBe+90+-9m~e|94<Njq*taX!ROFuT^?^pzC9^F+axYHe*@A zs}%VTV_&K$U0MuwwGUXri0GNz0Jm}zNWFT|-B_e4jLQ`OYj^}vFcb9v7=`cLryb9t zZQG(okArtJ8(%=M?3F~2>W$^NDSUz1@&%e<tk+F@8?(0@M-RLxm`$8j<GPW{RY&|6 Q%K~5C$AoYYI@EmjAF19MZvX%Q diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-38.pyc deleted file mode 100644 index c66fe759bb2db01108a0a6399f822ba2cb060ea3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27201 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 bTdGH|4g<P(ER!odRlo34jTS3rtQh|TjLz5M diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/euctwprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/euctwprober.cpython-38.pyc deleted file mode 100644 index ddab0862b67641dbb740f3de625ce30374e849d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1160 zcma)5&2AGh5VrR(+mM!0egqO1I1!0tLFE7vLO@!$kb-EdN_)WCtleaVceB_|t3<t} zQeUGS`zGAE?UfU+zy)TUMooo~@M_278GB~@&F9_a<vM}!?RWFj_kfTexL6z>EMCH| zH$ZU0sU$g#DMj6pPVUC8)m`c3e(YP_lR;jKYm~et+~>hD;enu2Hx7Ain>53p6hbv= zb*np)CVM?LqBBU;wlE*muqPCF);dF;75#0K7|~7AK~@N`-r3yk?Cfo1+Ni8IGTE?r zRU~q(GY!ra>tx$q)_uRR`7VVNmxg=3(oaAUB&M9i&I#G4oO0(lj9uYzmwU%#N@E{% zTQ}&z3Gqmbb=RsZHpi^W6fZF!sAB^B^+OPb7<xpe&Z+a2P-0x;O<~P^6HE!rwIgyG zqK6X*Ot+d#m9IyoPzqW=s*tg)$P8l&11cYFOR0r~>0Dt;s+)WP2bLfZ6QL?!2`$VS ztvoH{KFmvur83c)u`}{(5)FpAh}1wBQ4Ce|MrLLCG1|vTwfYJ84n%Pf$*dQZV>1{Q z>+PqJ&Wvc4N%}eI3muhN*?Rn}{iwa(D#ze%i+&%C5rd-~f~L?+E=(jwsW~idOWWmG zg;4c<_%$kouFyIS>Ey-&r0w~&|H2mW?ciCwI;Vh{vo#6eXlrLrt%6N8P*}~1Yp|>u zSP7uP3b@z<uxJMaaVEDHlP+%huf%b%lVpcU@$bZ;Op5*p&_XKAlU};%d_yzDW@CMf zRdvSlAs<Q98;pG!C35Dm*i|852^2A7wFY6;br99^d3RGGCD7#pfEC<=C|E|_14ZLI z4{0NCXx(+FwIlJa=Dl+WX1!7fQnfato5mNI&t9M<W3_7AyTH8}9RrA>ft$!x8+xIZ Ui;jfPXBT{N7YjlnG^qWYKMN@tTmS$7 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-38.pyc deleted file mode 100644 index 204d68cd32a2ce9cc6d1c69edfa30e57dc19c475..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19125 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 UvvY-l;V%6DPjM2&OAzmW01=Og+W-In diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-38.pyc deleted file mode 100644 index 052f210d8aecc242c1baaf6078973135a496a78f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1168 zcma)5&2AGh5VrR(+bAuis7N3#a3T`P(v|~A2tiZmg%m`@We-@JwVSN)ZWi0Al+s%& z^)<?|Z^AS9%86It0yDdfnhGJ|)sDwA_RRR3&mUJ;n*_%9-|bH}Amj%wmWKz6m+<R7 z5S(x-Nls%*QFo-1yRlp8uJm$0_AA|!LEeZPl<X7k^Wc>5K+w4xhrBT$?eHgsP;F{& z_ovciyE7wt<3tUFd9Nlzp}@1zoA9g{4NPK0KS{?~A;5Zfe|LLlYkM!#MrFgP$tK0C zB9SwlY4F~ty=>5D{daq>-=>h{+Hfyd`Uxn4#FUfRIU|RZQ|_FGu`4|8a_^MPY3zeu zRStS^Mm!Q@<qg}alhlQ#c#p+E9W&ssAAvB$&=WFu&Yf?B65|?g4r}I{U`}9eoRISn zJ)A&fdeC06zMhssDd+;RA!AvQ8O9U_R6g2P(h3!(bA?^8n|uigmLL?zLRnu4EzAYA zo)+>D<`u?LnP|<}1^M+g8c%W&sj)Dkn5gKD%*ygZbcmDcj1ur2iQ*`d*)S?+W;`i& zx=$mW8PO?|^m8&2Ix4fWv-Pa|xVzISXW;IN(FlzZgQFaRrqE9=Of(u|!^*0y-EyWv zDEk5Y8Wlp<Xp@HYcyk%l?&9Kqp^FIj@GxGUQ$Wo*ut9xRt%FUqP*hqaZo<;Guol3B z6>znOV9^c;;vC<(mUVg8|7C9Ukd|8fJ9Q|NVl)NBkPeHq*Dt%+(GIcWSR!M#$yh$& zQ;B+uu`km^)}9JK8v>rd6Ejn{Ag<a3VOK9(oC+y{Ggla_;T8m<qSbv+G`{zcwgQJX zU58e7WZ#W^cnLz?FNHYSjhb^BUt(Ur#EOx2z3TB20c%bM5Jdw)k+4<hrCP3<5<agl P_~ITGgk)&Z>T~`8<*pcH diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-38.pyc deleted file mode 100644 index 55426318304ff295a68ddc05b296f96f2199b754..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3041 zcmZuzNpBlB6ec-~N8^#=HD2p1UDZZX(lm*K1Z`bgafHTlU^y)?Ks%7dkt|ytDID3U z6$K~|1L<$b$p(7KB`A96FX*AaVQxiFZqWtka>&Jfk0U9Poe}u)J#PBQw~+UuQIo*; z(^34(*i}M)L8bdsLHQVpe*u6KPAg=K+LWTqDr`%!6-pKfSGc-Ixa!i!imh@jN8<V+ zg(-0wMCaG@BInlcit3sxpus|^?3Hr$eBCX;pq@`@Y5qP4F0m;mHsjP*ID?fHTjQ#& zbItDKx^3`2JHidy<Pp1{o3_RK?I^eG7?0Ygc+4JnLW-21;sbkzJ;(?7&>pde_%I)V zdYF&$(@>A_F+L9UD4*byP@i_k_!OVsBaf*)4)SY!M#>W)pW$bvJo$vE#GZm(o(rto z?wW8Pgu6TZ6-XcchVVPW9|(UU{Dts0!aoTABK(J-0hAt&JYW2|vG-BK%;c66v$I#O zCuSSggR;k~5B$WX_pe+j;Ayr$l<}Of_#Xn)Nu4&yW46x@2->De97UokQIn`k?2~9T z$$lgpn<LL?Hf{!*zg=^MK#K>4<CMK}-Eo2mr&#v#6{i43bSl+Sxd4h^s0ue2@9x?u z``eu!&8Z1@C$O9~w+JIc?Nn!aO?pBQb6S&Hx+YxTtv{oI>bsR9)Dg!iRPw&>IM2w7 zhpF}ImYWjmZr$~&B6X`$uGLmjMXW@kl!v|@*V{=|%4@0GZhgJ#T~5xX{Bqq*)bfSR ze984wwQ?<S>3Z^F@^YfK3*AY#RKmuT15-IHio4`)J+&@v8uCikcEu1J%2Pb-0RTc{ zRPXvVM!Q`g**>}x7Gp4V9v7Jg;9xH&M9LY+Od?nfyh_O)!VvO;o{g(w7$h-*Fp6** zVG?1c17}d00QeS)ZvYVFr|PsZ)Wc1laG@PyI1c3wG2C5K5^EwQ2)!H;*cfMG3@R~> zvLdFSvZF0;2tD7nLSu&7F>b*i7}nXUa<>A$fN8*g4ompxYsj=Q)5G$_-~uvie<<rv zI!B3&H^AjLum;{63KX@dZR&0IS`fLF$<EzzKApSO7MIdXZ83W<8yMk$yXl}mlvZ<d z3z=t3?lqu=<2y3Se(3(+1C`d1$EZrwqhs#S9(Q6782EAzc&I1$P*h*?R|7M<yt35V zKwHKgv}N2vq&4PlTD${G9%pO;6R+xptbgdR?l(i$6FnyA9^1nl{RPb?nSTcYoHZn$ z4YtX|5Y{<p*;ktMfIgy4x<J18<`HW`0*8JN?E;b_p28RnH2r{zl_o5>(Z|^}a73r? zKK4O+l6@dUU!>I+@h-GhU_C25mFvq@yGP?1;Ki!+W&QqHU}wtU66b)okk?Z`q&>Wb z1nw))v&*Z_QaTtdmMhTatd~pc&f0F>b*f%vHw?XZajuL+8JH<lF*<|DLV7hlznaM| zwjv}j<W#>d0;RAmj@v^mx-S0_X8LadkSUAl%wz^Nn5kH7fLh9cVp8*nQT>Q1F$z6u zW3b0cxI#~w!ChdH*7*tqI0G3O;{>e%8r#&wG}H>%N$UM%lZqs?sA#zjZC^jYx({oZ z1-1jt*i_L@a+cI#77-j;a25rd5+Pce92IBT68ydV;*pm*EErqLWSua==5NofI18EF z>Rfg{9Sq-DUd+sci{DOvvXcJX$<BcxhCa*W?)A3GL=?nIkWdO$uUO`;S8!!w3Wjj) zrR9b6ozAlDWM#-(%->$K4Vi{OI&KdOlRu^&5AKp9VD4jrC8|YDNKqEm6|lgO%37Lg zK!R=bMosq$J$6A~!y@g1;ln9-BFhGPXwQ(#E3$fERPtVF8*Z;jnD5Ix$c|;0_J|Yz z*vadd4!}B)A?s{Ifk-@$wtA^yYmNZI!!6ABdYJDo!bBMw;u1=jsl;W3S5Or=cm`R@ zCnb2Sb;Q_-D@cZ0d>Wq^c+l{~Fde)awks%Gj&mR05n+#b9slY*gf|fI4JzJ5NFZR? zh$O<>0Jhaie=>24YuJ7R;X1-B0^Z{CniS_zl94Rq_bRA?0XGvofa<&ACidd9N^U8L zww@scw^DJOF1NvZT*$i@P5Lzy{{sMnsr1B8Q#BRanPnQLp~5d_++ft4grYDipIzCw r7DQV<6kd}8O&Dmdx4q?ucEEq?q9ES@NFgw8hKKkevXVEeMXkdB3goiy diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/jisfreq.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/jisfreq.cpython-38.pyc deleted file mode 100644 index 64c6ce8efd307db05ccfbbf6561d5ff49fa2829c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22153 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 W*JViWu2l<%H{rKxQL$sij`=?+*551u diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/jpcntx.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/jpcntx.cpython-38.pyc deleted file mode 100644 index 8a9aab3aabc091b23c71d7af3b6a331d7e22c79f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37626 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 PA^246{pQJYCm;PEiG(bV diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-38.pyc deleted file mode 100644 index 7c5ea9fadf67a21d36fe54ccc2feef0ecea2bf99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23650 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 P<DYE{7VWU-%-!~1@_@nC diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-38.pyc deleted file mode 100644 index 87ed46545c0a7daeec28e8c01dcd259abb786ae0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29114 zcmeI4XLOy_m4@Xe8yB!Kp(H>^LNg!>V`M}^z%+xgjfv?ZK?vQ8Ev&|oY%pnLQb-~6 z-fI#Pddtj@S<^BznckbHPo`;FrWdAU?(<sVHG9tY<-4-Ltc+ptu>0A2>)fO3#af&{ zZ{F;d#$Vt3&Z0~AU(wR?EtKv5n%Pj6H~ty9p@CXUS4(Y5*Oc1SuBo+YUDImQyQbG> zbj_%>cD2@9>aDezwOO^@YO`x|?r-gyS)Vd)nLBQoRi8R;nKy3Ptv+qsvirDYc74XU zWsh;ooci=}%lvW6+}eV3TNdqkc*~TQma*?N`brI<GRFSr^}$nLuQpSv!ntGrP5Eh) zhOz&m)bwWXy$>I|u~BdACU7&j1>6d51Gj@az@6YOa5p#$+yhpDd%=C+e((Tz5Ih7P z29JP8!DHZY@I(XU8yY)<xTnA=;AwC&cm}Kn&w}OPIq*DK1I`35fYZUL;6-pYSP5PN zFN3w<74UWNgW!i6DC}?SM+o^*@MGY|!B2p1fS&|E1%4WQ6Z{PLS@3h<=fN+4Uj)Ad zei{4<_*L+0;Mc)#fZqha1%4a+4%iBQ7yKUheeeh155XUSKL)3PKLOtYe+vE#{5kjw z@Rwi={1y0X@HgOZ!QX*zgTDv=0R9pD6ZmKFFW_Inzkz=T{{dbF|JlH{3p@?=9YE6C zkoE`jz*KM;SP0$@rh|RJ954&a1v9`Dum_kAb^|j(E7%?E3wZIy7Jxm$USL0PAUFW* z4VHoTfkVJi;JsiGI2v?-#o#z_1ULa443>aH!8^gb!F#}wpbZ=Z4hP4APVg@9esCgK z3XTWu;3RMiSkZtU!3ytC3}L(5*@DU@xAX3>%Fnm(BQyaA_h7Og!NeU(T$RM7NnEbP z9ZKAn#Dz=TwZ!dA+@{1`OWd`@ZA#px#AQufsl<IwT%^Q}O<cXiHA`IO#Jx}4_QZut zT)pqH2<}ii2yj6Xw<&R(5_c_eMH6=|@tH|nsl+`^+{wg+OI+Z@txMe4#BEC4;>0~o zT&cueOWef7%}#s*5;r?>F^l`-b|yX=iH}R-6Og#Ti3^;#v1vIt8Jq%61*d`20arPl z0nP*~!C7DxSPj;Iv%y+$4)_3A2hIiOf%Cxy;6iW_xEOSSOTdS~rJx&J2718dpcm9Y z9b5s{gAJe$TnRRUelP$A!4Mb*SAh?L1V+Fp*aS8M-C}(-?nb=_JOdsC_ksJt)8KjV zFn9z!3LXQGgD1e3z?Z?3;H%(k;3@C`cnI7JUIs6Km%uCFIq)oa5!?m70<HmDz>VNz z;KSe};EUiEa2@yr_yO=q@G0<V@ELGD_#F5=_yV{Ad=z{fTnp|1w}RWjo#1A06Sxgr z4L;kzu1B!32;HV~=&qGx20Lv9Gr=sd8<-8|fVp5E*d6Qv=7R-bPp}Z|1>Oes2K#`0 z!G7TF;2mIpZ~!<El=t^eLJk7&0`CUz0SALaz@gwUa5z{5jsQo3qd*&24BElbU<o(| zECt7c4zLUy2RcDvf5+o}FL)m~0lXia2u=da!O7qha4I+roDNoiGr*Z(B{&PL0;|Cq za5h*A&H*0)>%h6-Ja9g^09*(z0vCfWa0&PjxD<4Q%Rmpf9Q1-3sDmrOdawcXfxE#y z;2H2BxDV`lw5mK>+kT0BkcDjo{a^qLf*~*rt^x^+fKjjsYzF$oPiaWI9>MQ!Ln|pn z;pf+mU60^|AHlc!qwxRjk-m~QVu#-sy;7g0)HPrWxDk8|d>DKLd=cCNt^=O{Z`wD( zU5{X;FM)a({niyqyB@&_KZ3bOMjxS_@O4msNV<y;;+^0XpbxQLYJHOL!KOcS-HW7; zv%bjbGkrg{kAeq)KJoglSK*7M{y6s#Y1e^=!6hJk`P4)42#(7@4=DT^st4s!Lc$l) z!nf{|1V08o1s(^V22X&`fG>gTLGFv!mvQL*(^s&spneWK2|f?L3cdio25taP0lkS& zBk9G|cjcQ<p9TIlcQfj9Ko98iNVkF)z-{0~a65Pj+yPz&n}I&qyB@(^k06)fU~mXH z6dVQ)2aCWF;7D*3XakEuJ2)CF0mp!);8@TBmVx6yCn)^=q4z~ki?00l{T~l=kN!@0 z@6Y3haz3~KTnH`#7lTRs<G<cNJ$-uh^x)~&gdTnUI?)5AH%yP#ophjQPVb+dw5ze{ zWxWzfza=*!^@9O02!_BgxC$gN0!G0m5Ff$$jsHZ_u#f+`yJqqv{lXA(MRN}QB2}=Z zT<#le`}%7;P#ZZYM96iTvsLIhr1^{rxejp^Nv={ZH5FW5s(G)wm!w`iNAMP^A;WDH zW&}qlpeyPs<&tvCL*6*A=5Y6x!hlVwZnvp42dj;$OAPy~n&u{VL~_qNB89cPp$QhP zus^RU?9Ye48B)~&)uf>`jo<=7wIifyEZZc7U@xb_4pg8*T!oOP&Q(1(o|D3CA;de7 zBNr^2x^l424K{l%RhU;H%BUJ#9@l)Su#(AEy$wk!@1bq;55S8pAJyLGhjwnbaLt!0 zUsxE>vw2>JSPDhuuvgvZ3aGr{Da$2QE)RL*ykXQrHS8c4=M4p~b3JN#h~p|u-c)df zdQF9dIVz}XS8<jK(;Om6P=C5+uHu`m5UEw?Xezk8sQW9Av$t^aa)+n%B2-jrKnPZx zY=$zVx{8}Dmy}x`^2T{9tjQss*OIzdh-^8@%LyB@BPUfI+C{5oOk$ju)4b#*hON1j zLoBI#tCp0eO$t?~Y$~|CsCp?63EnVy7{-ezmo$P)`HWne&M0>@HAhpyZf$a;!eP9P z5TbKs^AFy^L2{D{4x_q&y^`#3fkLUN;KC{sbZB1XS_%u3BkaXCNgh9J$fYD1p<Zw_ zHO$W6pQlvgRxQclHF<vu327eR1td9GrM!EuQz1>Q#6^AXn<j-3!Xmt;Ldo-b2ku^8 zAruHUpDTw8yw#;JR#0=}+m_pb=GFDdAuJ~s;sRAy*VJXLTC{3hSXfZKtKi6~I#Q0X zSgYQjBv0;5s)`*|=a`&0_gA%EZV|S5@?ew0kXJ)Xa+>!doA=^eOD^EJ+#KcJTt-!! zdZ`+$ICt+21xf8XE;pqzd~Q(XP?{%qQQKUgDQSlbG<8}C)~I1QYA7r*gjiLaG6Xq% zhT~i`ctfsL$CXRr$nxOH_IiI|Vcv^(Ajxa;N*o-#A;Y6u(nMivQmc;IRB+XzRpT^A zZgsMGe5=mz4(!#rQYCq|upxWx2*FK_P&Ih6<20(rw`!Z#<gLk}QDqB~_hPAVFD{^v z!npFGomL)K!P|T(Z$r7BC@f5B@H#}T+3QZ7=AVZTve%Lua+Pwa`Jv0}HRV;iIjAeQ zX4RwGrUE`!4llxS4v{2>C95IsEv#xAp4Xd{BQ)+{4=pJK2Q^grzEVAE`02}`bxJZ6 zXH}AIp^8)^EZdF>X}Ps4O&#RCvW3b!92W}caNjyhA+Ed^r8&eq%~c6DFVPO$JbsYE z)|?Rzx5JV<wM~*8p_iaKSf>fOyC$209ak=ehH`3XGK9#hGlHXBZ9YTw3VX4`=LVZp zU%1@<)Kze}UT%~2hTY4d44s?nMImxj*oH$wDR*FpB&$BiwjkwH+gu<wk>bME6z84` zCFL3+&Z;_)DipTnZ3HP~xL%0!k<PF!1UtkI+3X0a;&Quk0ZBSiaV}uVJCNl59Fmh% zxzOPb6p~X59j@%wa>2Gqs({dj%6os76z6SNa%(=VLX!>-QfNqC)w9FB`0(73%5_Mg z>JUj*Lu<JLAtYQWm-50Sd9lF})KFet6}9A^og2~$Go0($a+Mut$r-i<scMMhbhwuz z$*SXgkZg8HQWe`2tSXY6Q7DDDsw;6?kfa)+H3tWW)xu6gi1+8!d2)FJT)=JQ=Cv)C zVOx--DpyhkG!<N-UQ;1DJghD><R7CPf>)>0oZ(;<buS^q4oUV(@)@p|J0qmIRJp@N zoe>%eYN!`fjjH}EIYg!8HNv@7XLDEHZWzX=*<s1&hW=bR7i_OOEf4V-L9*(@HHXwt z*}KX~&IoDlR8q(dURQBLK?>#Nogmy$C?H2TH>cX>4Bvw=n;LgqI5Mb?3suVF>~)%K zu2&vXo>u5}d52hX2Ni4z))EEZ7w1YUbf`dX*|vpJIW_dGT-zjBRe_u>=Lm5@bw;kM zLYsS0r(T_<TyE}g#d%jbsj!qCZb&vCWXY9flj^h(XEjJp3%Q|}kQRc2>aD4~&v4P4 zLsjf>u*=(4E`<!K<+jNQQCH!h@=k*{<XY8Uv{>1^rktb@=lTrWEUADq>~NZ-T!?MC zkX)&%ws3e(&6UzH3by3dB>8r#fXA2Qw8HYi;R13Pp$(UJNb{0U^H`yZ97ga;b#5-s zomz5QF4t8gDa~=AgAnXEOD-UrRksm}DkOMa&koxxxs+{^j0y!5>^3AB^6KhI3P<`N zSFtS|Zbws6u8P|TUaOXJr{%mkTP|0&5G>VO^Ji5yS5cgUT}p8-nv)#tdKIKl%Bt%% zZ&OAttwKY&bG<rO_Dbvxl7ek><<Lfm3zdCjkQ^5r6;yW+g59JY4z^^kq>z@2^CB!c zO;T{UioLe^T-%zGbXv#=MT6>KJ0w|ENTJOICMe~4Zobq6tAr_=KX+$ksBvE|OQ9h< zyde*5Nohe1r7EZ@;3`4&84hvLoXuY62HONxofekk4TYkiHK{HTf~7jcQgBGk9a)|c zye^t^$m@`xmS;FPCn-1VPc}Q0rVu+U*_+!z?nv80m2!uI6;haHuS*3fm+Q(QxPt0j zZ>W3`&T#pvHfIDWSD-LN!G#%x4%N$fbGC4JP@Q2Zgm{Sx@pj#Y94=tVrEIh00zq<G zxg+OQ`P>=7<}(T%4k?#ZKzj+xDNlRTyy`DEWuYzS$hBJ@7ra3Y^?c2OW9O@CJV0G} zB1?AUGCWMkD0ev6k~4f{u)Rgp+#+lX-Iot&Zzzx(wJ_L@kmjP6LP)t<Sh+lHN4$kc z7CLlVxwk??uP?B^|K;m{_?+e6K550Zt*h3q>}*@tHFMpjk&(Wh!9}fG7xZrEN!_DE z-9xEXPu&AO!&?^&r+RO_Rv+xGH}uiecg@zlN4E_3_4f344-bv>jrMJ>cc-4wzM-uP zH`eRJ-Sxrs{e2@Fy8G*+qxH0PE+t3mquql&1NE)5`g;b~Z|YfJzjp4`eS@{3t4G?F z9MiGn+Sx15UE9{#*>QYZN7tM+J-w%HNqznOeZ5_+D^FR|xop|Ce|L18y=Y$7KJ>k= z`~S4swO^wo)iSPq`x_k&c4RyU4EVH+dtc7)$R*0NY*{8}{`f*yH)dTkRIB%IoxN(P zuQP3v_quRfm){+6n|0x8HTZht{OvZeEo{!p%Lf|k*iPx_kn&_p`Ud|mL-6W#?Hh&$ z>g{PmeY8F}l-gJH_YDuPYrlejrMC5rA4L1+`rzjF{=UoGhqsJw7#du<xU;?Sv#hrb z_w;UT{CGy%hx>-xmK?wM=*3IhhPO1_i|gyxV{Gqkq}Ccm*?+A*+Rjh3cl^gSz_g2p ww``qtLPOltUqA7{Mn5C`kBg@-eC_Z3rhmL;#?&dV{rzg|?APQeQzxwbFBe&{5C8xG diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-38.pyc deleted file mode 100644 index d851745ac620ef88bde9e72c369aa070c8d0ea12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23608 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 Jwb!k`{2xR*BOL$$ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-38.pyc deleted file mode 100644 index 9fba77c27c22be900ebc4a6ab2090e423316fa2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22235 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 EZ{J0neE<Le diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-38.pyc deleted file mode 100644 index 7235f32e1fe672d8c4bf0a00433fdf123c090c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22214 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 Z)88ApbU_W9FWLOQ&X$cE{`=3Ve*;<m&uRbw diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-38.pyc deleted file mode 100644 index 23a299ebd6e1ab2b363d9f298ee96c3bb2c622b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22237 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/latin1prober.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/latin1prober.cpython-38.pyc deleted file mode 100644 index f954c68e5f0e16218c3b76ea7f1d9d5b586278c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3421 zcmeHJPj4GV6rY*><Mn3krXjQqEl`96HBw@#f@r0RrgHxPN|REj99E@M$1`@EZr0B1 zxG1i3A(487kI)`_;X`oZGwcb(0p$a5>7~3ko7CPAs`iA0n9)AJdGF24o8SAB+%A=T z0^^tGmAlWT3Hcotxj_k;2SIX|5h9475m~1prO300ty`f5ycOEQ4jn;4S2$roxS<EK zq9}yE@WKgE3<KeZCF%a_vmjr8j(hFN*PrA29Y7$+q2R;HmyY>RdvKz40Qvwd4(eWa zU6iBg!+E1s#^q)1m>xC0oEVz{cr?C7J}+~}^r#7bq%9Jb#YA}IIuU^=?GRCtblVCi zMY&EYM|L6ENQI`Q+G<19rM{`UD^h_VK&}(F>$;)kt_@bZ@R41}NwRApagex33P?O4 zm3f8IS0=boy_}fyUT$KvhuPuVlp&)7{?QI!k{KKBFuTzyBW`3jx@dIoNcM8O7w0v> zi`+n{aU=^sBnc^0JbOf1R8YZoywDPsuy;skOGh}u-67jFbb&7j&+r9N6h7!ZF(Cr@ zEj}VP34MrtDGe4Hx)YzxV%|hw_XqNLGk(bjKs3>GNVeHy_Jm+38WL_9Y7fa{CzHXM zbg|;5PSWp5r2^QNdYpISj^;d_<WVEhya{>6o4_V%iMN#8;LUD7)>5U8l8Mw$X=*1j zYQb-jXNH_VCC?sKSG()7s#c|zaaUEZMV(&nR<(scYPQ_~-2)jvs79TYYHw4ocH?t% z=c`Fa%h_I|dB4$?NwwGM&7Qq5_wn4h+1@6o=VZH$!YYTY0uDvzgw)l@;L<a-FxT5u zWq3*hp}-_3v`k%?gEz<Fo7;crp*YrX^JyR&k%QQ^sb<p#MQuNJhUAIq?|>j%G}Qwz zT1(4cs3Wi^4X)j~`ZcdzUgnFpZ>UKSDJ(;E6v-5lV=u_@eMK9X1XG!SuK^uQ<-9dm z|IJklyKxokT~OoB!2hzoG<*L1rx#|=X7?O&V;UfI5I!D5BqG?IpofGFW^&h#TfNfl z>E7E8yVHvrak~$Z?Ty`+56Zqp(|Cg(!N5|)&%E>=Fp$DzNT1LxI;2;~w_j~BNOm?u zwk*wtWX;kxgvvTjKw=MVLGLp)ubnj)LRp|>BLo|7Xgi=6>@%pDi(rifvQY+25m2<U zpqlnl@zay7P6Qdxzw78#F5`C8Nmh9zHOP{5FHXD$fG&4yrcx#|5Y6I7SI8*Ki(+lz za=mVn0t+>D7nhd#jjO546YSb1Q=l4=uQ=)rH1Sq8wFI?FX*2XO99fNpHrC>SJWB1B zltRP4<OC2xed@vVDSPfR<ZL=cJvKO+i!tuW#TI?T&)|Ir7(fNu$r=M3Co#)3ptWXi z8~g!XqRt4m#o|*a71j*e!#_KKt}{(eK%`EREjDC=f#prK1m2xCGQhg9*nT+u)Aip5 zJD0Eo%*g)6V0Q0`KACUd`Qhh3&)oUr5+L(FC=`0A-UE_aNq^m7SFtkC9NpE8DD|7& zxYZFdZpwo|mD`Z|BlY)i%pPO`wHd<ZvSR?74Y1jkM+YZ!kmYw*Ca`T{Awk>pIbZLJ zeuR9$`9{AHWg63zObbXo=v2^g^`?3YA8`r^Hf{A05NNYmh?_EsI3M#I{`n-z^b2g& z_uxygw|F#gJ%>@>!p|$4M!r}%nwIveH|vY01*MLR`|C*t-VAIGt=m_wDa@A8x?Haz zsROBfgJcPp$kmtBX)samAbA%FdNAgi>1XI#>Rrs9|M}anN=`u?2Q*+dvmyC%(_$ny TX>LW>|LgxYKEJvj+NHk$np{`R diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-38.pyc deleted file mode 100644 index b36d963d48b37c7803743188324866a67027f8f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2284 zcma)7UvC>l5Z~SVle1&HY0^KbfMP%e84<gvLTaUgfFx}rQ3u%$50+qc@viMl&v)+L zx+0d#0}1LA-y!C$?|cHD_ze5XQ@;YL6lT^*NN6Il=N-@N?9R^4&Tn?BSj-b>e;!tT z*eVk87Ye7F3&NMsv)e!f5i}+P+NKnF7PEoVb_Q<SrQ{(Ij&S#ha3$Sy+Me*5q~gD# zu&hE&akU?+rqti6bX%$lGX><Lq}SA;mZtDH?DV5VTB!p|&NTD^TlO6gN!nD9HWRe% zh)XX>m)d=EZP)Ui@b`nZCw(y|f_<__+jGF@MBeg&m=}e8($0yZD8YaJ1#wAx9z0zz z*B*~z9eus4<r!bc<$M|1`AVy*cbIi=Mv!-odiDu0nrJ#9du)eIsGz^v&`k(;1Oe&_ zCRmRF=LrICICTitd>ke{-i=}{)ho1G@r{>_hEgdHBolBRC6VUbToqBKRkS_QQJU~D z3FF<dR3_I+1;mzT1C!@*m}%aD@I%zyOvYX1gOQii<T&quGUNOu`TM6@KOM-L>Psz? zRMj5D(Qw$Pb@5NF^g_@*lgYDM9BtQzySkqycdB=5S)}F4Fzh@DdorsHqv6V@_o}z6 zcUFeGpsvbZ4+m=;mI^S6UI?jcgKgw8sfRWls>5BC1D`&Eo&`V%U8FvI<9E*wd-XT~ z9Zav|hWtt7?}Kn0`2#j36r#Q3sGCSnWLH%|c4xAH+c|X;tghz3M#Wd?(Jb(ulHjzO z#{q<mDgb#&6#$2*5|RZZmys+2S%IG6970QQoV@Mhw=X!9HU7ql@Kmd42i?%*XGs1g z>{*8kT&kyfV=#>6Kqgv>b){0JmSEb<jT2u?;V9fZfqVQ6joFN4;}0%y<@Egj=aIUC z`(8zIo(BP@^a!%#-l^R$y4~ZsXK;m?j~8NN!5}L3cIh5`YvlXip96+=*nu;l6Ly14 z>2qh|Xm`hZ!c-kJ{=u986z&Aja}zd&f~E62^MJboB~Sl&TClT=FuM!mrT>gyg7Jd2 zzc3}w-3ee8Mt%c4!(K3cSvdFcfAL@mrHMNQ2f^lS1UwSXGC_Ks{DLcv^;Eb=>zQ4D z1@^uQmS5YI*QNxygX>eYz5K*guaA8L`3h7EuReb7R#t}J3`pgEq{~nxQdJIhc^gU@ z=xiD*Oruwa&?+~Kr{FTAablU+TsHYc{-}9|rC4FHHQsuovDq+woc4N9Pdp*FM?G~N zRB9Os!p!*f%@%*WZv5Fw<8QQ@C<hNVx9V$rqh-8i>#Ih~EcGN*ppjCLrnVB{#s~`w zBI9<Y6j0#oOORVzZ>_JkHtG+}rCzEz6r)kE&qb(1Q?ho_q#FsDbfj5qKH6-wR<~Nb z^{BB9!Z&Lb&w|keczEzj85%+QAC*J9Lx9Q6(FF^T6O^bA!K2TiXLo@Rx&U9E2GoTo zf*ranu;`sp952yDwoKWf@03^pW)=<^3)uLr3m}Dud;>}dLz~c8P2f_=0i6Q8Eto27 zR%1Q})p?jwsAxl<ftikPU9j`ns8wjaQott!YXLkVdCmu^7{$mJIDa|{<0H)+=OXQJ zZfmoxXC{C=gJ($Zp2`IboAt#Mj~<kcjAK~#Z+LBKv{eyN{66}O<q=}*mi$7%Xx_md wykpC39iF@5nFm5)oQx-v(IB(AXS38!KDEoqO`72T>_}hS#H}!+3v|Kx2j>4OumAu6 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-38.pyc deleted file mode 100644 index 268d141e59d27f92aada9802fe7a702249ed0375..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1149 zcmZ8g&2G~`5Z<+&Kig?(_z@@WL267}kXi{L)IuwYsH&zF(jHhP_Qr9$PRy=TR1_hk zR_cj&fMef;XRx?&;tdcNnAwE%XRU8C-|RX&GvD~2UUvzs?|+-`epCqgiR9{XfIJ82 z&tM`FQAtwDC`I3rR%$cb__lP?5-S<sk>#|)D#kC#YFcA8<CmqIddxF^Mfz!-)s0`3 zbLl*rH-1gtN*CAyC0itNBkznvo}i~TYeasVH0!@8q|u~BW24_uZIN%O;V9cx!>&*e zbr1G8S1(z6`&E0!yq5<X+q*OBZ>=w{EG^GCZol5Uq#L_ykJo0@T~FdCGlpmP-%e-< z`CMDrFkJcp7(p0~2(u#Rob+g9MfO>Z+2_O|%z<)B#r&J~jrNryc0$X%Ju&E40X9It z0F#rPj>)NYXpLz^zkm$6eM)i%Py&<z6+jhG1GuLou8s-!#^kI2jbMY}R%-`Z<;l(< z=DkGb(7Ae1(xXf$<-r|AmGfkf<eV$KS7AY_gr<xJhJ+|gO4ZQd^c0oMD4>gy5?bU< zt8lcCJ>|pZ1ubfvhq9wJ=NIJ9r=UMfMWFg37lWY+Hf54!dqEF>)MDI$y<;&r4rI~| zvXi_&9IUif1D)hzG3$g!oml7~OR~kKwbrB7%3^i`+bt2t7z{YP8o{52FddP|gR~p! z7)NB1U@JRObCA<RfW8NY(1zvEYtQep`|<t_Ra*Z$(xf{e8Z>ACd2(L3oTtNRB+>Ud ze?RKT$&R_Es80(Ig_O|FJ8<E|G|;<?20PvaXrnbXe5ZN4XkZD@%PZL{Ji^>j-dmlN zWAtIJK1}p9fLbw6jKafd#YQ;h$6Xxu=^>QS96D0d2x`i_FoThwMo?hpc46wL0TkQ3 hlz*5;P<fN?mAXuYSXWVfI%&)^{0ubK>(d*L{SUm~8@d1h diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/mbcssm.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/mbcssm.cpython-38.pyc deleted file mode 100644 index 8b06c51bec3c94d7c9bb8c350be72c9ecbde838a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16772 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-38.pyc deleted file mode 100644 index f78889468368a9e23886935663627e68b80b1202..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3037 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-38.pyc deleted file mode 100644 index b4249096669fedf1fffabb7ef9493a9a87edde29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1647 zcmaJ>OK;mo5Z)yz>P6~h*>U;+dKFqraSXXGP!xp?#0}a6MdhHt9!gN;nqs_^m?h;_ zh0==x<WKZq1HI&*^f&O@Q*S-@lFsbPu9X5M!H@IW$IN`Y&s?`g;Q9S+?}x%A<PTKt zJ{Bln!k7ID5R#Azl2Aq|%7!o!lbK33g_V?8DY2QIlvz2cuu4*8)uhI1%5RB!;xH$1 znXB}YXe3S6Oj@j^bX&BO4(lknEVhy^>ngb-wv!#UqvWc%m+Z1#N=`{w3+t~)Sm$(Q zviqSkB0cv{3R~>aqH{9w<%s8}ayC!Dm9sIIV7)hrr;*^ti=40hYnNSgzmKQ;4~P3F z3mFR$2Tx`p7e(#sS$rh5y!DNr$J60vK<kMgY+CA%$H~#*p&p}@;ZP|(qiCrqK0TG3 zU+93gUiRQ$6NGj3O2=~%`7-vWI&^!z!%Z_})jWGVI(+!xY~sgyAxK}x4!`1K$$z}D zI$FIgM@O%7HkTK1Hc?RllyBoP*IM=g2%In)5@x(6=QO0D@v6ei*Tf>sg4&x!b98(% zx>NB0n{o3XiGW-LC(M2W$VpC@WMy0#*MySX%&ip#EGe`VmK9bMRu$G1))hJmU4;#W z%@vKDCGlE$dqrO2Y@LuUfgUdnB^ydMm-K3DX)MiagOVkA-n!~8De94V4WwR@t8Ls- zNHD3VkIs5KMJb!7T*?k?yQp|xJdJbDlbDLcykrT%Mkpgx5UL1xuw)&<LBImY20|O4 zD5r{<nQWn{3BcMJ&%Ff6=dGQE&40@IG%QMzgR^H9R>s9Sb0?~~>oB%0W>FmY!rL@= zFXL?fuJsKqs-71JKg&Gt4f*?*!DN>3ft+wyXeI}bM4YDI4bJf=_aYyBmwb9T5b=1B zF7nB2deA=_WO2^-Qa`xxBc2V?INjU-tpA{Yu$L~t-RDt+#(@VzLzpyx6B+V+kd1>Z z!egoP>!%CZh0H&JFFOPvv|-rvKW_;vf7u<ITGSxMTMJ?k9a@9GZT`Ib4*B{wZR(Y< zWm8DP^NN~>#hnY39nX6KrO_U>hr(S~CE!9pgWreUXt<9O9s$LHk3q-`fC^Rm)82bU z2lIpe+(}Jh2x~&Z+NBd#v|(-GPorRc*{FX1Ka*Gk2Sj*t=;&K!u?~91H<yL>-m;Ck z=*{77&<-RYYobl_L|Ya09Bo<e5-G`AYOuZ^bR_at<$R|&s!Uj%qVhRJL3O|Q5VQ=B Ri$fjyk=ddx=#+ZRe*pA_w2=S+ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/sjisprober.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/sjisprober.cpython-38.pyc deleted file mode 100644 index 172af6bf1669ee95c89ca1ed909de043eaf3cfcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2505 zcmZ`5O-~y~bY}L$YqK^4%2!oYL~0IJi=8Sxq*7Eh1rmsYiLi6%O6_#<3}(%G?aZ#D zfSeOlx#lOpF@K_mp86Z++7o{vm-M|^yO=~-Gc#}I&Ajgqo|nrd0^dI$s=xnLA>?1& zOn)|Peuk0$0h1tt#-v9BN)cu;>sf(iU@NwJPT&~Wj@@1%C>Yp@y<RaW8rY3Xy_sO9 z=LbF|kBKM<@0<uv(laY4i(->hOIH-wRH<It9mZMo%Sk3TjzZOx*)!EYkP0yK8+{Qa zon{thayM)rMTvydmFAP3=4O;;DmoZuQ9pT@gz-rlrGQ&N+(tji<g0AzxQxfVxyyI= zHn*Nunf8&#gtYd@#0{f1NOj}0#=G<x0Fne$kbu1*hg49(&b`1guqAAOZRrR{xaZ`I z1}?xxZGa1+C`#uf@WhPpVJ*HPHVH~#hO#c9aJkNHG|A*c7<uDJe}E|?86A-`cEK(Q zC7G4kXRzl^=AIE)3z=uu;)q<7@P;5w@{TsDGulaq1F2LIh-i=VD2X!86%tl1o)z21 z&^+xa3<A9<rp(JjwC^drcMvz%&dvM(v38V9W%iD0JC*SvtVPb-ahRr@za#HY>PP*a ztg9oL$)vC9kK$-B*smYrqSiYh;9kn)Wj&4#>VuQ)sGr=c-LI!nCf5gH`#9{#v_6Oi z>)-!ayIZ@rJ~#n%O?EnXSm*Fm0MRx?j*wYB?MCUqgimd7qI{6|4vf^qJ+06Z_274E zq9nI?ZDNhjoBk`HaMSc7(zS9YpotYyui9z`7Gq*HhtMoew{Tj(X%VL-oDlmRj1)~x zK&sQZ>j<bBTYe%8#=-`^@n8b>q)R7^nc<{;Gy%AQCt%T>uVH!3cNw1EMH&ny!cLc` zxK2O*JaZIS0OKlaXzxil2orF8u9;EvCPVGTVbU3b12K3fT&Hb6!MBY>C>4AdWCa*T z-3BObY){YNw@H3`|C)jN?7|w+5nCmf^tCmDMCdxlOg#gPdr=UO6kQKSal|fdNR(1{ z2GRrS&|CV#d*Pe=Ww_r3Oyv{IEMR=YWA2i?wnt1bIQe@7$-auFza^{(xXxcJn4LYc zS0L5?M67+uDB`}zarquN=C?s&VJ*Y06#|fxL!Z1ex6BQ=dyNGuRJdaan2}%+<X<{w zZ>icg9F{LZLxe9@E>VirV;lDqE#YJld{=0k-oBHr!C#&zYe!MG2Fcx5Yhku_0A(0( zSLg|aQFn#Dxx!L$^#Q)>myqt@R;jI6CaMhQx|Be*<tbKah4HDKt^NJIeeK5mPDd*3 z2zfB<D2zX~iW9n5yN$gT-`&z~{!+U;ttRfhM|;m3n|!CGoo4IdeoHTOAgbF#rDOst zL^&|lB@P89-{$deA4(|{v^8LFMA5~~t=85?Yp3xznC<j44%KJaIpQMBLR~R5`^jM> zWYU&;zPY`(-`aTI;;rrdE!aHWtU78Qsd;D;kWpzGL6(gRB`O<uC=EwD+>CtnEj+vr zBi)9H&^h>F>9L{cvkx}IB9xb+l36QsiQ@S@TY=Rzuz{=!t5Bc%_=cU%P9-dAdm~ZN zLpV&@d<_7&n_N%`VN3^RAeNc5Ib)OBVdqt<2G?`bS-tR8)iR0)psVSl9M;3YAGZXv z`&eHj@GFcIy9oiEO7wJfO4^&&hK2-92<sH*;7H!<i(!ng&-sgC80Q#My-l&y9z-hi zuk2(hhS0<c`Rekx+q7jILsz?Yg{ixy<YMFd21bgt*Q0*Hw;3&2IK11YW;d#pV77NK zu7i1IC=7i)pS#?|R4@N0#B|PJ4lhqPO4B<7w>xMj*{i%+x<E38u4=lhBa>k-HPLVK dBySei@)`)`)!u{LCO={CNwJMV5R89w)_-KwR^tEw diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/universaldetector.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/universaldetector.cpython-38.pyc deleted file mode 100644 index 49011f7834839523ce28831606d2d8109e4cd3e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5849 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 A%m4rY diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/utf8prober.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/utf8prober.cpython-38.pyc deleted file mode 100644 index 2756b78c80521c66275e81dd1ef7638235eb66f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2010 zcma)7OHU(55bmCr$7T!!R(VKK4jXABM~j`+DhfzZ$Og<q0()hf%ScJfOt+2A%-Hmd zS1~dtkoLBx`~W!aWq(Ib`2l@OloO}qoJ&&GgTd@3Qby`>Rlln0>#ENO#bSZL_w(PS zAASMtcQj@{3yg1JBs(BD;WQ)>^(jT&2#v_}&B*dCZJVJTIliNHE6hc%?^3c&xXqml z!W}`+O+U|bO;U2NDO^{gs<?5~mQ9g9mxDtgONR1L>&4w>+D?V?_S?ZxFBaN@?MoX2 zK3%+7!b=WXTdS<O&-Uw^)x7|2zW13oR?-4R5TA158=U&)OVXj-;O2$vTUxic4Z1BH z?(p0NIj4RObeHF~?(zbkyC9H)$BXb=cu6ec&p|r#s(>M6Npv%Jzpe+E<Mcxv1HqAe z4k9Hfose_m(zqg&q-JWJgUxJCKspn0nZtQb;CfmsxynvPLm_1jjw+Y2UffF=lQx*r z!MS{(p<zj+iYy*QEIMQXfSV{=ibSNZsj?CgcHlS9SP-_8gt6D;uW{vQ5Q&OB5~+v> zva%KShQmgsgFkYm+lI9lB7RW`dxw?bI6WG~Ps^*7q?d}7VLLc(cSTYe_J%7@*2-U$ zpRNqYuv`}1E>2b$9OZB+2Es*J8Ks@op?>P}a4ho>_ahjI3xd#jTA&U+UA}{|Jk9gJ zp?nA@??X8ueKP}<BcPUs(5PLbkCH9Xmqt-~sA2WXITS?{3n<=0v4jG*Jcf}V#94%= zi!<?QWZwx6-+BX2Ve@bbFKE<GZODCPHM?88(q3*|DNjF^NLdV!Kf%)m2x6RmFyn7_ z&;N3(ZnF6|k8aqGyCZnOFK4{XqCZ^^bR-xJe3%mso#0QPOz0;0zH?>(?&OkAj4OI( zPR!Kko5zNHoLYSw3!0LX@Wj&dIhfysdH1dPJj`4AmckXlc5I_%k^USvz9I%;b8w#Y zJvdo}ov)xp=C7bx`U}UFd^NofcL3mK?HYrYnr0UDE2}~*eoR?{#3C^RWmg-GdP8DM zDyLR&vHhxYvJJ}FZ8gz$x9SJAO}5)ocC+=Y(NfD@c%xt>rHJ7d>N*s$E+FVo%~|=) zYOA`@+O2J?dA)ZKcY0jJfly1$oqD6SanNF|okkUmz0Hy(=h44=I8FulmWl>Y3pc&2 zV|}Yotd0<T4bCK=fFRVR9yE>%tuvMLbkXpjom}H|VWxQS+`XbfgfMyilx0vjJ%g6% z1G66!`DlW=wwK8oIiuX1&<}x+CQ#A3sjOP}&Gv7n58nK-evJ)s!+d|Pmy8UNV!c*n z8#~V$?0KX99n4~?zB7u$-m%D9;kE(fLs;8`k?21pYC$@Sn8HUhDcr}i<RKGczc8i> zj70-J3Q_kMI~ldZY(<vfQq48Gos|m&1WcNa<pW%JAH`=VFaY4rj2i<HhQP0P*lT9c zq<|FsDU1Xyms*DBc(y?cCJuL5lS{2sP{o^W%?M8-+R7F{&516#tOl2|r`DwtWq)>> l)O{y943Z?$<eu@>T`aetDfjCv>2E&9fRNifK+U6`^$(*Z#O441 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/version.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__pycache__/version.cpython-38.pyc deleted file mode 100644 index b845908c2c4640a98cc099b0bd219bb280bc021e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457 zcmYjOv2NQi5S3!N4iseVd}BSBOyLe`5EMp`2FT(7PLshy1ll}HL?x0SDW&q)BxC0M zM7}|5|Da=+_Ut%74&XaHzQf`1@#gR_ji_G!4e$O?|Ggpat4Cx)$A2V{(L9pzJjVE8 zPwqX&^PcQoN5f?Ooc<`3hswyhM8IFl2M<P<Ed&EzRkl>C790kruu(dPP#`quyfPYe zT`kaoS;4XpPGU$`&Qx%(LZLKx47Fvp1)(Kuh20eRdSS)#r^wN>G(8b@D2zLSbD`m^ z6nZ-bpQO-i@kS?kB~;0lrW&T}{+J!HFI~*0!=xKznKa8R>khJPXN*YSlk?CGZokj2 zFR!Lgk^4X~Y~gRi3sWI?1qRf{@rzPfJL9WObE904)}U^9sTSO}<V}y+G50Fq=*>2_ u%8ovNB^%?BZAoUB=bKAT9<-#TySLJ&ZB~>+w}1K?^S5~OEeSy~NaFv2H;@Vd diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5freq.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5freq.py deleted file mode 100644 index 38f3251..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/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 - -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 -) - diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5prober.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5prober.py deleted file mode 100644 index 98f9970..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/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 .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import Big5DistributionAnalysis -from .mbcssm import BIG5_SM_MODEL - - -class Big5Prober(MultiByteCharSetProber): - def __init__(self): - super(Big5Prober, self).__init__() - self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) - self.distribution_analyzer = Big5DistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "Big5" - - @property - def language(self): - return "Chinese" diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/chardistribution.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/chardistribution.py deleted file mode 100644 index c0395f4..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/chardistribution.py +++ /dev/null @@ -1,233 +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 .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, - EUCTW_TYPICAL_DISTRIBUTION_RATIO) -from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, - EUCKR_TYPICAL_DISTRIBUTION_RATIO) -from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, - GB2312_TYPICAL_DISTRIBUTION_RATIO) -from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, - BIG5_TYPICAL_DISTRIBUTION_RATIO) -from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, - JIS_TYPICAL_DISTRIBUTION_RATIO) - - -class CharDistributionAnalysis(object): - ENOUGH_DATA_THRESHOLD = 1024 - SURE_YES = 0.99 - SURE_NO = 0.01 - MINIMUM_DATA_THRESHOLD = 3 - - def __init__(self): - # Mapping table to get frequency order from char order (get from - # GetOrder()) - self._char_to_freq_order = None - self._table_size = None # 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 = None - self._done = None - self._total_chars = None - self._freq_chars = None - self.reset() - - def reset(self): - """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, char_len): - """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): - """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): - # 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, byte_str): - # 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): - super(EUCTWDistributionAnalysis, self).__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): - # 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 - else: - return -1 - - -class EUCKRDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(EUCKRDistributionAnalysis, self).__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): - # 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 - else: - return -1 - - -class GB2312DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(GB2312DistributionAnalysis, self).__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): - # 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 - else: - return -1 - - -class Big5DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(Big5DistributionAnalysis, self).__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): - # 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 - else: - return 157 * (first_char - 0xA4) + second_char - 0x40 - else: - return -1 - - -class SJISDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(SJISDistributionAnalysis, self).__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): - # 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 (first_char >= 0x81) and (first_char <= 0x9F): - order = 188 * (first_char - 0x81) - elif (first_char >= 0xE0) and (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): - super(EUCJPDistributionAnalysis, self).__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): - # 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 - else: - return -1 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetgroupprober.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetgroupprober.py deleted file mode 100644 index 8b3738e..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/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 .enums import ProbingState -from .charsetprober import CharSetProber - - -class CharSetGroupProber(CharSetProber): - def __init__(self, lang_filter=None): - super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) - self._active_num = 0 - self.probers = [] - self._best_guess_prober = None - - def reset(self): - super(CharSetGroupProber, self).reset() - self._active_num = 0 - for prober in self.probers: - if prober: - prober.reset() - prober.active = True - self._active_num += 1 - self._best_guess_prober = None - - @property - def charset_name(self): - 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): - 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): - for prober in self.probers: - if not prober: - continue - if not prober.active: - continue - state = prober.feed(byte_str) - if not state: - continue - if state == ProbingState.FOUND_IT: - self._best_guess_prober = prober - return self.state - elif 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): - state = self.state - if state == ProbingState.FOUND_IT: - return 0.99 - elif state == ProbingState.NOT_ME: - return 0.01 - best_conf = 0.0 - self._best_guess_prober = None - for prober in self.probers: - if not prober: - continue - 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/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetprober.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetprober.py deleted file mode 100644 index eac4e59..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetprober.py +++ /dev/null @@ -1,145 +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 .enums import ProbingState - - -class CharSetProber(object): - - SHORTCUT_THRESHOLD = 0.95 - - def __init__(self, lang_filter=None): - self._state = None - self.lang_filter = lang_filter - self.logger = logging.getLogger(__name__) - - def reset(self): - self._state = ProbingState.DETECTING - - @property - def charset_name(self): - return None - - def feed(self, buf): - pass - - @property - def state(self): - return self._state - - def get_confidence(self): - return 0.0 - - @staticmethod - def filter_high_byte_only(buf): - buf = re.sub(b'([\x00-\x7F])+', b' ', buf) - return buf - - @staticmethod - def filter_international_words(buf): - """ - 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 = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', - 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 filter_with_english_letters(buf): - """ - Returns a copy of ``buf`` that retains only the sequences of English - alphabet and high byte characters that are not between <> characters. - Also retains English alphabet and high byte characters immediately - before occurrences of >. - - 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 - - for curr in range(len(buf)): - # Slice here to get bytes instead of an int with Python 3 - buf_char = buf[curr:curr + 1] - # Check if we're coming out of or entering an HTML tag - if buf_char == b'>': - in_tag = False - elif buf_char == b'<': - in_tag = True - - # If current character is not extended-ASCII and not alphabetic... - if buf_char < b'\x80' and not buf_char.isalpha(): - # ...and we're not in a tag - 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' ') - prev = curr + 1 - - # 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/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/chardetect.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/chardetect.py deleted file mode 100644 index c61136b..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/chardetect.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env python -""" -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. - -""" - -from __future__ import absolute_import, print_function, unicode_literals - -import argparse -import sys - -from pip._vendor.chardet import __version__ -from pip._vendor.chardet.compat import PY2 -from pip._vendor.chardet.universaldetector import UniversalDetector - - -def description_of(lines, name='stdin'): - """ - 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 - """ - u = UniversalDetector() - 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 PY2: - name = name.decode(sys.getfilesystemencoding(), 'ignore') - if result['encoding']: - return '{0}: {1} with confidence {2}'.format(name, result['encoding'], - result['confidence']) - else: - return '{0}: no result'.format(name) - - -def main(argv=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 if PY2 else sys.stdin.buffer]) - parser.add_argument('--version', action='version', - version='%(prog)s {0}'.format(__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)) - - -if __name__ == '__main__': - main() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/codingstatemachine.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/codingstatemachine.py deleted file mode 100644 index 68fba44..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/codingstatemachine.py +++ /dev/null @@ -1,88 +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 .enums import MachineState - - -class CodingStateMachine(object): - """ - 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): - self._model = sm - self._curr_byte_pos = 0 - self._curr_char_len = 0 - self._curr_state = None - self.logger = logging.getLogger(__name__) - self.reset() - - def reset(self): - self._curr_state = MachineState.START - - def next_state(self, c): - # 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): - return self._curr_char_len - - def get_coding_state_machine(self): - return self._model['name'] - - @property - def language(self): - return self._model['language'] diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/compat.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/compat.py deleted file mode 100644 index ddd7468..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/compat.py +++ /dev/null @@ -1,34 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# Contributor(s): -# Dan Blanchard -# Ian Cordasco -# -# 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 sys - - -if sys.version_info < (3, 0): - PY2 = True - PY3 = False - base_str = (str, unicode) - text_type = unicode -else: - PY2 = False - PY3 = True - base_str = (bytes, str) - text_type = str diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cp949prober.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cp949prober.py deleted file mode 100644 index efd793a..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/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): - super(CP949Prober, self).__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): - return "CP949" - - @property - def language(self): - return "Korean" diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/enums.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/enums.py deleted file mode 100644 index 0451207..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/enums.py +++ /dev/null @@ -1,76 +0,0 @@ -""" -All of the Enums that are used throughout the chardet package. - -:author: Dan Blanchard (dan.blanchard@gmail.com) -""" - - -class InputState(object): - """ - This enum represents the different states a universal detector can be in. - """ - PURE_ASCII = 0 - ESC_ASCII = 1 - HIGH_BYTE = 2 - - -class LanguageFilter(object): - """ - This enum represents the different language filters we can apply to a - ``UniversalDetector``. - """ - 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(object): - """ - This enum represents the different states a prober can be in. - """ - DETECTING = 0 - FOUND_IT = 1 - NOT_ME = 2 - - -class MachineState(object): - """ - This enum represents the different states a state machine can be in. - """ - START = 0 - ERROR = 1 - ITS_ME = 2 - - -class SequenceLikelihood(object): - """ - 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): - """:returns: The number of likelihood categories in the enum.""" - return 4 - - -class CharacterCategory(object): - """ - 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/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escprober.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escprober.py deleted file mode 100644 index c70493f..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escprober.py +++ /dev/null @@ -1,101 +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 .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .enums import LanguageFilter, ProbingState, MachineState -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=None): - super(EscCharSetProber, self).__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 = None - self._detected_charset = None - self._detected_language = None - self._state = None - self.reset() - - def reset(self): - super(EscCharSetProber, self).reset() - for coding_sm in self.coding_sm: - if not coding_sm: - continue - 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): - return self._detected_charset - - @property - def language(self): - return self._detected_language - - def get_confidence(self): - if self._detected_charset: - return 0.99 - else: - return 0.00 - - def feed(self, byte_str): - for c in byte_str: - for coding_sm in self.coding_sm: - if not coding_sm or 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/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escsm.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escsm.py deleted file mode 100644 index 0069523..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escsm.py +++ /dev/null @@ -1,246 +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 .enums import MachineState - -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 -) - -HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) - -HZ_SM_MODEL = {'class_table': HZ_CLS, - 'class_factor': 6, - 'state_table': HZ_ST, - 'char_len_table': HZ_CHAR_LEN_TABLE, - 'name': "HZ-GB-2312", - 'language': 'Chinese'} - -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 -) - -ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, - 'class_factor': 9, - 'state_table': ISO2022CN_ST, - 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, - 'name': "ISO-2022-CN", - 'language': 'Chinese'} - -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 -) - -ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, - 'class_factor': 10, - 'state_table': ISO2022JP_ST, - 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, - 'name': "ISO-2022-JP", - 'language': 'Japanese'} - -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 -) - -ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) - -ISO2022KR_SM_MODEL = {'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/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/eucjpprober.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/eucjpprober.py deleted file mode 100644 index 20ce8f7..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/eucjpprober.py +++ /dev/null @@ -1,92 +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 .enums import ProbingState, MachineState -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCJPDistributionAnalysis -from .jpcntx import EUCJPContextAnalysis -from .mbcssm import EUCJP_SM_MODEL - - -class EUCJPProber(MultiByteCharSetProber): - def __init__(self): - super(EUCJPProber, self).__init__() - self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) - self.distribution_analyzer = EUCJPDistributionAnalysis() - self.context_analyzer = EUCJPContextAnalysis() - self.reset() - - def reset(self): - super(EUCJPProber, self).reset() - self.context_analyzer.reset() - - @property - def charset_name(self): - return "EUC-JP" - - @property - def language(self): - return "Japanese" - - def feed(self, byte_str): - for i in range(len(byte_str)): - # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte - coding_state = self.coding_sm.next_state(byte_str[i]) - 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 - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte_str[0] - 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): - context_conf = self.context_analyzer.get_confidence() - distrib_conf = self.distribution_analyzer.get_confidence() - return max(context_conf, distrib_conf) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrfreq.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrfreq.py deleted file mode 100644 index b68078c..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrfreq.py +++ /dev/null @@ -1,195 +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 , -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 -) - diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrprober.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrprober.py deleted file mode 100644 index 345a060..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/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 .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import EUCKR_SM_MODEL - - -class EUCKRProber(MultiByteCharSetProber): - def __init__(self): - super(EUCKRProber, self).__init__() - self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) - self.distribution_analyzer = EUCKRDistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "EUC-KR" - - @property - def language(self): - return "Korean" diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwfreq.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwfreq.py deleted file mode 100644 index ed7a995..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwfreq.py +++ /dev/null @@ -1,387 +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 - -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 -) - diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwprober.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwprober.py deleted file mode 100644 index 35669cc..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwprober.py +++ /dev/null @@ -1,46 +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 .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCTWDistributionAnalysis -from .mbcssm import EUCTW_SM_MODEL - -class EUCTWProber(MultiByteCharSetProber): - def __init__(self): - super(EUCTWProber, self).__init__() - self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) - self.distribution_analyzer = EUCTWDistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "EUC-TW" - - @property - def language(self): - return "Taiwan" diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312freq.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312freq.py deleted file mode 100644 index 697837b..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312freq.py +++ /dev/null @@ -1,283 +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 - -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 -) - diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312prober.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312prober.py deleted file mode 100644 index 8446d2d..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312prober.py +++ /dev/null @@ -1,46 +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 .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import GB2312DistributionAnalysis -from .mbcssm import GB2312_SM_MODEL - -class GB2312Prober(MultiByteCharSetProber): - def __init__(self): - super(GB2312Prober, self).__init__() - self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) - self.distribution_analyzer = GB2312DistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "GB2312" - - @property - def language(self): - return "Chinese" diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/hebrewprober.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/hebrewprober.py deleted file mode 100644 index b0e1bf4..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/hebrewprober.py +++ /dev/null @@ -1,292 +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 .charsetprober import CharSetProber -from .enums import ProbingState - -# 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): - # 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): - super(HebrewProber, self).__init__() - self._final_char_logical_score = None - self._final_char_visual_score = None - self._prev = None - self._before_prev = None - self._logical_prober = None - self._visual_prober = None - self.reset() - - def reset(self): - 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._before_prev = ' ' - # These probers are owned by the group prober. - - def set_model_probers(self, logicalProber, visualProber): - self._logical_prober = logicalProber - self._visual_prober = visualProber - - def is_final(self, c): - return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, - self.FINAL_PE, self.FINAL_TSADI] - - def is_non_final(self, c): - # 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): - # 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 == ' ': - # We stand on a space - a word just ended - if self._before_prev != ' ': - # 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 == ' ') and - (self.is_final(self._prev)) and (cur != ' ')): - # 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): - # 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): - return 'Hebrew' - - @property - def state(self): - # 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/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jisfreq.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jisfreq.py deleted file mode 100644 index 83fc082..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/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 - -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 -) - - diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jpcntx.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jpcntx.py deleted file mode 100644 index 20044e4..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jpcntx.py +++ /dev/null @@ -1,233 +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 ######################### - - -# This is hiragana 2-char sequence table, the number in each cell represents its frequency category -jp2CharContext = ( -(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), -) - -class JapaneseContextAnalysis(object): - NUM_OF_CATEGORY = 6 - DONT_KNOW = -1 - ENOUGH_REL_THRESHOLD = 100 - MAX_REL_THRESHOLD = 1000 - MINIMUM_DATA_THRESHOLD = 4 - - def __init__(self): - self._total_rel = None - self._rel_sample = None - self._need_to_skip_char_num = None - self._last_char_order = None - self._done = None - self.reset() - - def reset(self): - 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, num_bytes): - 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[jp2CharContext[self._last_char_order][order]] += 1 - self._last_char_order = order - - def got_enough_data(self): - return self._total_rel > self.ENOUGH_REL_THRESHOLD - - def get_confidence(self): - # 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 - else: - return self.DONT_KNOW - - def get_order(self, byte_str): - return -1, 1 - -class SJISContextAnalysis(JapaneseContextAnalysis): - def __init__(self): - super(SJISContextAnalysis, self).__init__() - self._charset_name = "SHIFT_JIS" - - @property - def charset_name(self): - return self._charset_name - - def get_order(self, byte_str): - 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): - 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/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langbulgarianmodel.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langbulgarianmodel.py deleted file mode 100644 index 2aa4fb2..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langbulgarianmodel.py +++ /dev/null @@ -1,228 +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 ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -# this table is modified base on win1251BulgarianCharToOrderMap, so -# only number <64 is sure valid - -Latin5_BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 -210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 - 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 - 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 -) - -win1251BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 -221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 - 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 - 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 96.9392% -# first 1024 sequences:3.0618% -# rest sequences: 0.2992% -# negative sequences: 0.0020% -BulgarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, -3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, -0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, -0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, -0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, -0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, -0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,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, -1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, -0,0,0,0,0,0,0,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, -2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,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, -3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,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,1, -3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,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,1, -3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,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, -2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,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,1, -3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,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, -3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,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, -3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, -2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, -3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, -1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, -3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, -1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, -2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, -2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, -3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, -1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, -2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, -2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, -1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, -2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, -2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, -2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, -1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, -2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, -1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, -3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, -1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, -3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, -1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, -2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, -1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, -2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,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,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, -1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, -2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, -1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, -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,1,0,1,0, -1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, -2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, -1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, -0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, -1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, -1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, -1,0,0,1,3,1,1,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, -0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, -1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -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,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,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, -1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,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,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,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,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,1, -) - -Latin5BulgarianModel = { - 'char_to_order_map': Latin5_BulgarianCharToOrderMap, - 'precedence_matrix': BulgarianLangModel, - 'typical_positive_ratio': 0.969392, - 'keep_english_letter': False, - 'charset_name': "ISO-8859-5", - 'language': 'Bulgairan', -} - -Win1251BulgarianModel = { - 'char_to_order_map': win1251BulgarianCharToOrderMap, - 'precedence_matrix': BulgarianLangModel, - 'typical_positive_ratio': 0.969392, - 'keep_english_letter': False, - 'charset_name': "windows-1251", - 'language': 'Bulgarian', -} diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langcyrillicmodel.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langcyrillicmodel.py deleted file mode 100644 index e5f9a1f..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langcyrillicmodel.py +++ /dev/null @@ -1,333 +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 ######################### - -# KOI8-R language model -# Character Mapping Table: -KOI8R_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 -223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 -238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 - 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 - 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 - 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 - 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 -) - -win1251_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -) - -latin5_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -macCyrillic_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, -) - -IBM855_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, -206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, - 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, -220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, -230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, - 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, - 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, -250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, -) - -IBM866_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 97.6601% -# first 1024 sequences: 2.3389% -# rest sequences: 0.1237% -# negative sequences: 0.0009% -RussianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, -0,0,0,0,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, -3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, -0,0,0,0,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, -3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,1,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, -3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, -0,0,0,0,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, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, -0,0,0,0,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, -3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,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, -3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, -0,0,0,0,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, -3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, -0,0,0,0,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, -2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,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, -3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,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, -3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, -0,0,0,0,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, -3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,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, -3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,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, -3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,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,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,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, -3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, -0,0,0,0,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, -3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,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, -2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, -0,0,0,0,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, -3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,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, -3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,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, -2,1,3,3,3,2,0,0,0,2,1,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, -1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, -1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, -2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, -1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, -3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, -1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, -2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, -1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, -1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, -1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, -1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, -3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, -1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, -2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, -1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, -2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, -0,0,0,0,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, -2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, -1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, -1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, -1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, -3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, -3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, -1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, -1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, -0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, -1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, -1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, -0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, -1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, -2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, -1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, -1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, -2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, -1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, -1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, -1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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, -1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, -0,1,1,0,0,1,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, -1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, -0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, -0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, -2,2,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,1, -1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,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,1, -1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,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,1, -1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, -0,1,1,1,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, -0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -) - -Koi8rModel = { - 'char_to_order_map': KOI8R_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "KOI8-R", - 'language': 'Russian', -} - -Win1251CyrillicModel = { - 'char_to_order_map': win1251_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "windows-1251", - 'language': 'Russian', -} - -Latin5CyrillicModel = { - 'char_to_order_map': latin5_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "ISO-8859-5", - 'language': 'Russian', -} - -MacCyrillicModel = { - 'char_to_order_map': macCyrillic_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "MacCyrillic", - 'language': 'Russian', -} - -Ibm866Model = { - 'char_to_order_map': IBM866_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "IBM866", - 'language': 'Russian', -} - -Ibm855Model = { - 'char_to_order_map': IBM855_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "IBM855", - 'language': 'Russian', -} diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langgreekmodel.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langgreekmodel.py deleted file mode 100644 index 5332221..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langgreekmodel.py +++ /dev/null @@ -1,225 +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 ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin7_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -win1253_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.2851% -# first 1024 sequences:1.7001% -# rest sequences: 0.0359% -# negative sequences: 0.0148% -GreekLangModel = ( -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,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, -3,0,0,0,2,0,0,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,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,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,2,0,0,0,0,0,0,0,0, -0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, -2,0,0,0,2,0,0,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,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, -0,0,0,0,2,0,0,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,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, -2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, -2,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,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,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,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,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,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,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,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, -0,0,1,0,0,0,0,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,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,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, -0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, -2,0,0,0,0,0,0,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,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,2,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,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,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, -3,0,0,0,0,0,0,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,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,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,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, -2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, -2,0,0,0,0,0,0,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,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,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,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,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,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,1,0,0,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,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,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,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,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,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,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,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, -0,0,0,0,0,0,0,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,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,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,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,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,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,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,0, -0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,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,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, -0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, -0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,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,0, -0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, -0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, -0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, -0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, -0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, -0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,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,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,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, -0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, -0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, -0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,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,0,0,0,0, -0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, -0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, -0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,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,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, -0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, -0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,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,0,0,0,0,0, -0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, -0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, -0,0,0,0,0,0,0,2,1,0,0,0,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,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,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,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,0,0,1,0,0,1,0,2,0,0,0, -0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,1,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,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, -0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,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,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,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, -) - -Latin7GreekModel = { - 'char_to_order_map': Latin7_char_to_order_map, - 'precedence_matrix': GreekLangModel, - 'typical_positive_ratio': 0.982851, - 'keep_english_letter': False, - 'charset_name': "ISO-8859-7", - 'language': 'Greek', -} - -Win1253GreekModel = { - 'char_to_order_map': win1253_char_to_order_map, - 'precedence_matrix': GreekLangModel, - 'typical_positive_ratio': 0.982851, - 'keep_english_letter': False, - 'charset_name': "windows-1253", - 'language': 'Greek', -} diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhebrewmodel.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhebrewmodel.py deleted file mode 100644 index 58f4c87..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhebrewmodel.py +++ /dev/null @@ -1,200 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Simon Montagu -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Shoshannah Forbes - 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 ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Windows-1255 language model -# Character Mapping Table: -WIN1255_CHAR_TO_ORDER_MAP = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 - 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 -253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 - 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 -124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, -215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, - 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, -106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, - 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, -238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, - 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, - 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.4004% -# first 1024 sequences: 1.5981% -# rest sequences: 0.087% -# negative sequences: 0.0015% -HEBREW_LANG_MODEL = ( -0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, -3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, -1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, -1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, -1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, -1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, -0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, -0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, -0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, -0,2,0,1,2,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,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, -0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, -0,2,0,1,2,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,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, -0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, -0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, -0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, -0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, -0,2,1,1,1,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,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, -1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, -0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,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, -3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,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, -3,0,0,0,1,1,0,1,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,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, -0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,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, -2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, -0,0,0,1,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, -2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,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, -3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,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,1,0,0,0,0,0,0,0,0,0, -0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, -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,0,0, -3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,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, -1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, -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,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, -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, -2,1,2,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,2,2,2, -0,2,0,1,2,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,1,0, -3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,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, -2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, -0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,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, -2,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, -1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, -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,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, -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,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, -1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, -0,2,0,1,2,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, -2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,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, -1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,1,0,1,0,0,1,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, -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,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, -1,0,0,1,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,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, -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,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,0,1,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,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, -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,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, -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,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, -2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,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, -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,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, -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,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,0,0,2,0,0,0,0,0, -0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,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, -1,0,0,1,0,0,1,0,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,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, -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,0,0,0, -1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, -0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,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, -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,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, -) - -Win1255HebrewModel = { - 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, - 'precedence_matrix': HEBREW_LANG_MODEL, - 'typical_positive_ratio': 0.984004, - 'keep_english_letter': False, - 'charset_name': "windows-1255", - 'language': 'Hebrew', -} diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhungarianmodel.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhungarianmodel.py deleted file mode 100644 index bb7c095..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhungarianmodel.py +++ /dev/null @@ -1,225 +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 ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin2_HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, -175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, - 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, - 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, -245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -win1250HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, -177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, - 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, - 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, -245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 94.7368% -# first 1024 sequences:5.2623% -# rest sequences: 0.8894% -# negative sequences: 0.0009% -HungarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, -3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,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,2,0, -3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,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,1,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, -0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, -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,1,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,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,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,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, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,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, -3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,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,1,0, -3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,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, -3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,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, -3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, -1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, -1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,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, -1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,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, -3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,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,0, -3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, -3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, -2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, -2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, -2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, -2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, -1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, -1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, -3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, -1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, -1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, -2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, -2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, -2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, -3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,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, -2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, -1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, -1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, -1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, -2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, -1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, -2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, -2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, -1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, -1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, -0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, -2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, -2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, -1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, -1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, -2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, -2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, -2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,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, -1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, -1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, -0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,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,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -) - -Latin2HungarianModel = { - 'char_to_order_map': Latin2_HungarianCharToOrderMap, - 'precedence_matrix': HungarianLangModel, - 'typical_positive_ratio': 0.947368, - 'keep_english_letter': True, - 'charset_name': "ISO-8859-2", - 'language': 'Hungarian', -} - -Win1250HungarianModel = { - 'char_to_order_map': win1250HungarianCharToOrderMap, - 'precedence_matrix': HungarianLangModel, - 'typical_positive_ratio': 0.947368, - 'keep_english_letter': True, - 'charset_name': "windows-1250", - 'language': 'Hungarian', -} diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langthaimodel.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langthaimodel.py deleted file mode 100644 index 15f94c2..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langthaimodel.py +++ /dev/null @@ -1,199 +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 ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# The following result for thai was collected from a limited sample (1M). - -# Character Mapping Table: -TIS620CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 -188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 -253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 - 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 -209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, -223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, -236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, - 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, - 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, - 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, - 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, - 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 92.6386% -# first 1024 sequences:7.3177% -# rest sequences: 1.0230% -# negative sequences: 0.0436% -ThaiLangModel = ( -0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, -0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, -3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, -0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, -3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, -3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, -3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, -3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, -2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, -3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, -1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, -3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, -1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, -0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, -0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, -2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, -0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, -3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, -2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, -3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, -2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, -3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, -3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, -3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, -3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, -1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, -0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, -0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, -3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, -3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, -1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, -3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, -3,1,0,2,3,0,0,0,3,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,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,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,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, -0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, -0,0,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, -3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, -1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, -1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, -3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, -0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, -3,0,0,1,1,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, -3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, -0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, -0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, -0,1,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, -3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, -0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, -0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, -0,0,0,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,3,3,3,3,1,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, -1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, -0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, -0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, -0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, -3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, -2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, -0,0,0,2,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,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, -3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,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, -2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0, -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,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,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, -1,0,0,1,0,1,1,0,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,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, -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,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,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, -2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, -1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -1,0,0,3,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,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, -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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,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,0, -2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,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, -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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,1,0,0,2,1,0,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,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, -2,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -TIS620ThaiModel = { - 'char_to_order_map': TIS620CharToOrderMap, - 'precedence_matrix': ThaiLangModel, - 'typical_positive_ratio': 0.926386, - 'keep_english_letter': False, - 'charset_name': "TIS-620", - 'language': 'Thai', -} diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langturkishmodel.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langturkishmodel.py deleted file mode 100644 index a427a45..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langturkishmodel.py +++ /dev/null @@ -1,193 +0,0 @@ -# -*- coding: utf-8 -*- -######################## 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 -# Özgür Baskın - Turkish Language Model -# -# 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 ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin5_TurkishCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, - 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, -255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, - 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, -180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, -164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, -150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, - 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, -124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, - 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, - 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, - 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, -) - -TurkishLangModel = ( -3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, -3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, -3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, -3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, -3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, -3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, -3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, -2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, -3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, -2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, -1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, -2,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, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, -3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, -3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, -2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, -3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, -2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, -3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, -3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, -3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, -0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, -3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, -0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, -3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, -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,1,0,2,0,0,1, -3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, -2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, -2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, -3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, -0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, -1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, -3,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, -3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, -1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, -3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, -2,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, -3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, -0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, -3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, -0,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,1,0,0,0, -3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, -1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, -1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, -2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, -2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,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, -3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, -2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, -3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,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,1,0,0,0,0,0,0, -3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, -0,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,1,0,0,0,0,0, -3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, -1,0,0,1,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,1, -1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, -0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, -3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,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,0,0,0,0,0,0, -3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, -0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, -3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, -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,1,1,0,1,0,0,0, -3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, -1,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,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, -2,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, -3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, -0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, -3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, -0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, -0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, -3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, -0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, -0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, -3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, -0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, -3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, -0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, -0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, -3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, -0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, -0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, -3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, -0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, -0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, -3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, -0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, -3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, -0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, -0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, -0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, -0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, -1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, -0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, -0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, -3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, -0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, -2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, -2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, -0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,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,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,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,1,0,0,0,0,0,2,0,0,0,0,0,1, -0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,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,1,0,0,0, -2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,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, -2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,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,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -Latin5TurkishModel = { - 'char_to_order_map': Latin5_TurkishCharToOrderMap, - 'precedence_matrix': TurkishLangModel, - 'typical_positive_ratio': 0.970290, - 'keep_english_letter': True, - 'charset_name': "ISO-8859-9", - 'language': 'Turkish', -} diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/latin1prober.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/latin1prober.py deleted file mode 100644 index 7d1e8c2..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/latin1prober.py +++ /dev/null @@ -1,145 +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 .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 - -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 -) - - -class Latin1Prober(CharSetProber): - def __init__(self): - super(Latin1Prober, self).__init__() - self._last_char_class = None - self._freq_counter = None - self.reset() - - def reset(self): - self._last_char_class = OTH - self._freq_counter = [0] * FREQ_CAT_NUM - CharSetProber.reset(self) - - @property - def charset_name(self): - return "ISO-8859-1" - - @property - def language(self): - return "" - - def feed(self, byte_str): - byte_str = self.filter_with_english_letters(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): - if self.state == ProbingState.NOT_ME: - return 0.01 - - total = sum(self._freq_counter) - if total < 0.01: - confidence = 0.0 - else: - confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) - / total) - if confidence < 0.0: - confidence = 0.0 - # lower the confidence of latin1 so that other more accurate - # detector can take priority. - confidence = confidence * 0.73 - return confidence diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcharsetprober.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcharsetprober.py deleted file mode 100644 index 6256ecf..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcharsetprober.py +++ /dev/null @@ -1,91 +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 .charsetprober import CharSetProber -from .enums import ProbingState, MachineState - - -class MultiByteCharSetProber(CharSetProber): - """ - MultiByteCharSetProber - """ - - def __init__(self, lang_filter=None): - super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) - self.distribution_analyzer = None - self.coding_sm = None - self._last_char = [0, 0] - - def reset(self): - super(MultiByteCharSetProber, self).reset() - if self.coding_sm: - self.coding_sm.reset() - if self.distribution_analyzer: - self.distribution_analyzer.reset() - self._last_char = [0, 0] - - @property - def charset_name(self): - raise NotImplementedError - - @property - def language(self): - raise NotImplementedError - - def feed(self, byte_str): - for i in range(len(byte_str)): - coding_state = self.coding_sm.next_state(byte_str[i]) - 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 - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte_str[0] - 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): - return self.distribution_analyzer.get_confidence() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcsgroupprober.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcsgroupprober.py deleted file mode 100644 index 530abe7..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcsgroupprober.py +++ /dev/null @@ -1,54 +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 .charsetgroupprober import CharSetGroupProber -from .utf8prober import UTF8Prober -from .sjisprober import SJISProber -from .eucjpprober import EUCJPProber -from .gb2312prober import GB2312Prober -from .euckrprober import EUCKRProber -from .cp949prober import CP949Prober -from .big5prober import Big5Prober -from .euctwprober import EUCTWProber - - -class MBCSGroupProber(CharSetGroupProber): - def __init__(self, lang_filter=None): - super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) - self.probers = [ - UTF8Prober(), - SJISProber(), - EUCJPProber(), - GB2312Prober(), - EUCKRProber(), - CP949Prober(), - Big5Prober(), - EUCTWProber() - ] - self.reset() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcssm.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcssm.py deleted file mode 100644 index 8360d0f..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcssm.py +++ /dev/null @@ -1,572 +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 .enums import MachineState - -# BIG5 - -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 -) - -BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) - -BIG5_SM_MODEL = {'class_table': BIG5_CLS, - 'class_factor': 5, - 'state_table': BIG5_ST, - 'char_len_table': BIG5_CHAR_LEN_TABLE, - 'name': 'Big5'} - -# CP949 - -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 -) - -CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) - -CP949_SM_MODEL = {'class_table': CP949_CLS, - 'class_factor': 10, - 'state_table': CP949_ST, - 'char_len_table': CP949_CHAR_LEN_TABLE, - 'name': 'CP949'} - -# EUC-JP - -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 -) - -EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) - -EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, - 'class_factor': 6, - 'state_table': EUCJP_ST, - 'char_len_table': EUCJP_CHAR_LEN_TABLE, - 'name': 'EUC-JP'} - -# EUC-KR - -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 -) - -EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) - -EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, - 'class_factor': 4, - 'state_table': EUCKR_ST, - 'char_len_table': EUCKR_CHAR_LEN_TABLE, - 'name': 'EUC-KR'} - -# EUC-TW - -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 -) - -EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) - -EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, - 'class_factor': 7, - 'state_table': EUCTW_ST, - 'char_len_table': EUCTW_CHAR_LEN_TABLE, - 'name': 'x-euc-tw'} - -# GB2312 - -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 -) - -# 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 = {'class_table': GB2312_CLS, - 'class_factor': 7, - 'state_table': GB2312_ST, - 'char_len_table': GB2312_CHAR_LEN_TABLE, - 'name': 'GB2312'} - -# Shift_JIS - -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 -) - -SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) - -SJIS_SM_MODEL = {'class_table': SJIS_CLS, - 'class_factor': 6, - 'state_table': SJIS_ST, - 'char_len_table': SJIS_CHAR_LEN_TABLE, - 'name': 'Shift_JIS'} - -# UCS2-BE - -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 -) - -UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) - -UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, - 'class_factor': 6, - 'state_table': UCS2BE_ST, - 'char_len_table': UCS2BE_CHAR_LEN_TABLE, - 'name': 'UTF-16BE'} - -# UCS2-LE - -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 -) - -UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) - -UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, - 'class_factor': 6, - 'state_table': UCS2LE_ST, - 'char_len_table': UCS2LE_CHAR_LEN_TABLE, - 'name': 'UTF-16LE'} - -# UTF-8 - -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 -) - -UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) - -UTF8_SM_MODEL = {'class_table': UTF8_CLS, - 'class_factor': 16, - 'state_table': UTF8_ST, - 'char_len_table': UTF8_CHAR_LEN_TABLE, - 'name': 'UTF-8'} diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcharsetprober.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcharsetprober.py deleted file mode 100644 index 0adb51d..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcharsetprober.py +++ /dev/null @@ -1,132 +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 .charsetprober import CharSetProber -from .enums import CharacterCategory, ProbingState, SequenceLikelihood - - -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, reversed=False, name_prober=None): - super(SingleByteCharSetProber, self).__init__() - self._model = model - # TRUE if we need to reverse every pair in the model lookup - self._reversed = reversed - # Optional auxiliary prober for name decision - self._name_prober = name_prober - self._last_order = None - self._seq_counters = None - self._total_seqs = None - self._total_char = None - self._freq_char = None - self.reset() - - def reset(self): - super(SingleByteCharSetProber, self).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 - # characters that fall in our sampling range - self._freq_char = 0 - - @property - def charset_name(self): - if self._name_prober: - return self._name_prober.charset_name - else: - return self._model['charset_name'] - - @property - def language(self): - if self._name_prober: - return self._name_prober.language - else: - return self._model.get('language') - - def feed(self, byte_str): - if not self._model['keep_english_letter']: - byte_str = self.filter_international_words(byte_str) - if not byte_str: - return self.state - char_to_order_map = self._model['char_to_order_map'] - for i, c in enumerate(byte_str): - # XXX: Order is in range 1-64, so one would think we want 0-63 here, - # but that leads to 27 more test failures than before. - order = char_to_order_map[c] - # 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: - i = (self._last_order * self.SAMPLE_SIZE) + order - model = self._model['precedence_matrix'][i] - else: # reverse the order of the letters in the lookup - i = (order * self.SAMPLE_SIZE) + self._last_order - model = self._model['precedence_matrix'][i] - self._seq_counters[model] += 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 threshhold %s', charset_name, - confidence, - self.NEGATIVE_SHORTCUT_THRESHOLD) - self._state = ProbingState.NOT_ME - - return self.state - - def get_confidence(self): - r = 0.01 - if self._total_seqs > 0: - r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / - self._total_seqs / self._model['typical_positive_ratio']) - r = r * self._freq_char / self._total_char - if r >= 1.0: - r = 0.99 - return r diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcsgroupprober.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcsgroupprober.py deleted file mode 100644 index 98e95dc..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcsgroupprober.py +++ /dev/null @@ -1,73 +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 .sbcharsetprober import SingleByteCharSetProber -from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, - Latin5CyrillicModel, MacCyrillicModel, - Ibm866Model, Ibm855Model) -from .langgreekmodel import Latin7GreekModel, Win1253GreekModel -from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel -# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel -from .langthaimodel import TIS620ThaiModel -from .langhebrewmodel import Win1255HebrewModel -from .hebrewprober import HebrewProber -from .langturkishmodel import Latin5TurkishModel - - -class SBCSGroupProber(CharSetGroupProber): - def __init__(self): - super(SBCSGroupProber, self).__init__() - self.probers = [ - SingleByteCharSetProber(Win1251CyrillicModel), - SingleByteCharSetProber(Koi8rModel), - SingleByteCharSetProber(Latin5CyrillicModel), - SingleByteCharSetProber(MacCyrillicModel), - SingleByteCharSetProber(Ibm866Model), - SingleByteCharSetProber(Ibm855Model), - SingleByteCharSetProber(Latin7GreekModel), - SingleByteCharSetProber(Win1253GreekModel), - SingleByteCharSetProber(Latin5BulgarianModel), - SingleByteCharSetProber(Win1251BulgarianModel), - # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) - # after we retrain model. - # SingleByteCharSetProber(Latin2HungarianModel), - # SingleByteCharSetProber(Win1250HungarianModel), - SingleByteCharSetProber(TIS620ThaiModel), - SingleByteCharSetProber(Latin5TurkishModel), - ] - hebrew_prober = HebrewProber() - logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, - False, hebrew_prober) - visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, - hebrew_prober) - hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) - self.probers.extend([hebrew_prober, logical_hebrew_prober, - visual_hebrew_prober]) - - self.reset() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sjisprober.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sjisprober.py deleted file mode 100644 index 9e29623..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sjisprober.py +++ /dev/null @@ -1,92 +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 .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import SJISDistributionAnalysis -from .jpcntx import SJISContextAnalysis -from .mbcssm import SJIS_SM_MODEL -from .enums import ProbingState, MachineState - - -class SJISProber(MultiByteCharSetProber): - def __init__(self): - super(SJISProber, self).__init__() - self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) - self.distribution_analyzer = SJISDistributionAnalysis() - self.context_analyzer = SJISContextAnalysis() - self.reset() - - def reset(self): - super(SJISProber, self).reset() - self.context_analyzer.reset() - - @property - def charset_name(self): - return self.context_analyzer.charset_name - - @property - def language(self): - return "Japanese" - - def feed(self, byte_str): - for i in range(len(byte_str)): - coding_state = self.coding_sm.next_state(byte_str[i]) - 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 - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte_str[0] - 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): - context_conf = self.context_analyzer.get_confidence() - distrib_conf = self.distribution_analyzer.get_confidence() - return max(context_conf, distrib_conf) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/universaldetector.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/universaldetector.py deleted file mode 100644 index 7b4e92d..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/universaldetector.py +++ /dev/null @@ -1,286 +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 .charsetgroupprober import CharSetGroupProber -from .enums import InputState, LanguageFilter, ProbingState -from .escprober import EscCharSetProber -from .latin1prober import Latin1Prober -from .mbcsgroupprober import MBCSGroupProber -from .sbcsgroupprober import SBCSGroupProber - - -class UniversalDetector(object): - """ - 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'} - - def __init__(self, lang_filter=LanguageFilter.ALL): - self._esc_charset_prober = None - self._charset_probers = [] - self.result = None - self.done = None - self._got_data = None - self._input_state = None - self._last_char = None - self.lang_filter = lang_filter - self.logger = logging.getLogger(__name__) - self._has_win_bytes = None - self.reset() - - def reset(self): - """ - 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() - for prober in self._charset_probers: - prober.reset() - - def feed(self, byte_str): - """ - 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 len(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 = {'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 = {'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:] - - # 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()) - 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): - """ - 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 - lower_charset_name = max_prober.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) - 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', - prober.charset_name, - prober.language, - prober.get_confidence()) - return self.result diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/utf8prober.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/utf8prober.py deleted file mode 100644 index 6c3196c..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/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 .charsetprober import CharSetProber -from .enums import ProbingState, MachineState -from .codingstatemachine import CodingStateMachine -from .mbcssm import UTF8_SM_MODEL - - - -class UTF8Prober(CharSetProber): - ONE_CHAR_PROB = 0.5 - - def __init__(self): - super(UTF8Prober, self).__init__() - self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) - self._num_mb_chars = None - self.reset() - - def reset(self): - super(UTF8Prober, self).reset() - self.coding_sm.reset() - self._num_mb_chars = 0 - - @property - def charset_name(self): - return "utf-8" - - @property - def language(self): - return "" - - def feed(self, byte_str): - for c in byte_str: - coding_state = self.coding_sm.next_state(c) - if coding_state == MachineState.ERROR: - self._state = ProbingState.NOT_ME - break - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif 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): - unlike = 0.99 - if self._num_mb_chars < 6: - unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars - return 1.0 - unlike - else: - return unlike diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/version.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/version.py deleted file mode 100644 index bb2a34a..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/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 setup.py and from chardet subpackages. - -:author: Dan Blanchard (dan.blanchard@gmail.com) -""" - -__version__ = "3.0.4" -VERSION = __version__.split('.') diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__init__.py deleted file mode 100644 index 2a3bf47..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -from .initialise import init, deinit, reinit, colorama_text -from .ansi import Fore, Back, Style, Cursor -from .ansitowin32 import AnsiToWin32 - -__version__ = '0.4.1' diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 377dd3f1b809b534698ad4c0af2ac6bf10456d7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 462 zcmYjNyH3L}6wSM7)9n00hQuvp00|*p>c~JrNFK04V^Rx0A}1{kf5e~g4PKd;*jd1r z3W+QE9N&kJb?$ANjvO0r-`V}A<#$N_hi8*hd)iA2l~cLg5iWLxhdtqAUj#UCq3-ce zL^u)yJP<LC#SjmF>pmZe1Sj?$;Bgf$oGkiqtyC76fJxSwsG>X8J5HC1D_x3`badOn z*j#C9g7b3uWWq()b84cCwQiNpT$7y1mffg3CTIIE;iNbyrdL^tM<B^c&RVL$f%X9c zfY5>oO8ZPlkPiT2fT0DPK&MmBAgEzACLv@)b<30_<kitBi~@XZ(Mk!5^on*=Dvjox zHO)181k!n3+TMoB4dUzpHGQ{Ia#kE7t4{OAnkj4AqJ}m3^r)B=v%KkTyP$OqMP&b! hl@<Nl1|kGJ5mGe0iI0V<)|{Szw-#*dxqI%|`vD8`eL4UD diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/ansi.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/ansi.cpython-38.pyc deleted file mode 100644 index 39563090223ac22a6963e4031e7c48bcc049dca2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3247 zcmc&$TXWM!6xK?zEz8%KkQC^&?rn<O#x5|^X`#c!aZE@tPR33qMHE!wU2K74o7D!I zOql6R_#y3M{z-qsPT%^Zzrag-&MFShZQ998rP)t=bXMo=xoX!l8C!$vkH1Tg|4eGy zUr0<|CJ^&5g5LnB=4g~SgzAn?4acA+jlIzvlg4QRo-z6!O;Y;}apLq6P0=*W5=$D* z(CizHW|_5TI7y&$G!JxM(KgUiv;cI0C4rv;`U0H>dRozGpfA!Hpl1}FVW~aM$+9$H zj%5Jz%m$pIvu&+(dFNMqt>*{D%^}_DvtpMG821DViq&R&x!CD>-0KL&i=82bmtt5P zaepBEK^NZihg`h^{-!_h`a#)lGj_As6Jm6;QelJgEC0DaV$}D_L*A_*RYAEf3p(D2 zxhT}$(XTv&@#rl{bO`uteBs=HQG*fW0fZ*VuC_;J!KJerY+i3lvbnEIqt;%QMj&{J zNE2o5YdirTycLz+aFbPdj|nyy^2(jQKN__vPw~O$x*qUevcbzr-+xjWZHwM;aHITf zCGZ8C8+o1QUY7-xkw2Qd_Fehw@{PICHn7XA+r^g^7e1vRRQbW%^eWyU@XMoZnZYf% zV(6mxf;4Vl2ha$Ie9=zWh`b3K(Y9S}7HmDRaYw&?s{}@_v}@8>s5ijKnD9lPDH|iO zK!!{POt^}Z19Gf01M?7doKXDl&i#Sontkvpq{j(;=}w<{+zmRMu|Z)%CC<;G?Vi%c zG1SLRvm;e~f50wID4Iq^FpgYk>pYAAxlDuN)1dgE1fk#zYCztYGFgRK)xf6U$Uf29 zIE)&8{tbYDQ0$RK?a|fOWS9I#DEXZPme6;#U9zXY)`fvHVeaaCWX~Yl3yY2u(=ElM zL47XmKzLjPuYA#yi7peK5L_l8Rya{9Q8J_%u>MnN4j?6E?4{S=I^k{0b^U=aT=z0= z4g;>4X=1~@Q#iDyJYLiUBjF2_=ep8%-Kf4{o_5_ATV6ln@DD)DgtM_~ILhYe=1VYC z8d*fqCtQvGn#V=A0S;ZAq0sA~lNmIt`W=COms1^&K*!5dizZdao1!*NVaKCs2ueZP z%8V@@40(vf-@!<ZFPx(~6`I3tK#p~TYLu`#zXD4o8BCa_N<?2@{R}t<wXu_Vr?I@g zdJcUHQOcss<EqTXm5t`-6UuTE%8+*sb+xnACGM=WHma?~(uBq+FO);e2kdhwT|8T< zxlpa$`*K3#q>aeyV93T7&JRQQJ`k#*L*+yb9h!R-PF*!VqxqKHlH{(^UNR0M`imsn z$31PVuC(Vs+&HS)2}c8~St9%sV4wcb6)##~@eg4gFCu(|fZ^llQI1A(RKl+#s5*HE zs$xC{#-}g>JRexZ)}x!_`womF7v}doj9?YuuyU|wbf^{s>coUIK@4gm?pQS8B&p@t zH0h+M?WAeS$<VZur5PtjvreAo;BTIH3Utc3KnqYy7o>$gxHIG|#0n45uCR!Jc7?d5 z5PcHjhC@u>5N!<|gog+}Av{8OjNl^tjNkz@_ot7!O2!r%5N~O;>WebA)T-B;GX9|6 zXsm2VbD^<bmx=q;rFwI%D$Ux1YE#BG?k=y@Wvo?i*VkmGvAlG5O^I;pKgyIMK@<`Z zPl-e_t9X%Uq|*nVuGf*uDe6GgJ2t9BDw3sC19@r~Z-9N*U<BwSi<rl6<LDcX>;Iqd zF2E5byb9_=OwsTQ1kBU$D+El|u#8YaK$Aj>z!07ybP;+8KEgAE=KxJ!2Rzj~8^BnC z@n5}z>(BNMHi5H~9}+np{i)kx8;(1eusjP8&LF_hnx(|?M2s)AFqfpUxO`v6n=7sR z)rL%}G;^zs#;I1J`IzhKw>pkF$G6x#Q04ehkO|kN!;b56Jm_<*b)G^<BH&?*<MD^% z;X}rUPoA-kP(M%A2UNCjbc&KLO)OC;5QwCVDJx~XrW*EX`;^xA(Qo{=4ibVQfEiQi VXjpLDhHd6k`AmKW?s%Nw{SORqdKmx! diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-38.pyc deleted file mode 100644 index e3b8c0f60461488c04e0eae94493e07710bd778f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7756 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/initialise.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/initialise.cpython-38.pyc deleted file mode 100644 index 7587706853a0ad51990bfe7a32e4a73e78f9a849..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1723 zcma)6&2A$_5bo~z@pv3NKMM;)3s^ZIjYKj)1Omh&5F!T-KCoeTWg)D_-Pn_iXGYcS zgaq$}<iG`<Avx}w@C<Y1w6DM=RJHSCue1_vb#+%)bx--Luj+?(J7zfkzDj=jt-;to zq$~~}m9KCbi$XEQbJm})yw9C3`a%ii<=({a`y4%FfHTC|z!@oDHdUa)bJma5hKf}4 zocCKQRxLbP(fpvTR#f|(o$-E0b<`@JuBtV)j_aD@k63c=1%8?JUT~BNuUlUiCfhHc zWX0}BdqXlU4uQ%yIL(_VECzbmgx4&y{ET0SONQaGN9;N8B_4R_QMXFSMgwD2Ikj~Y zw9$4T^ZYpj1Y<7#Jx#~uM5i#;Ru?6tdwEt>->1LO0^1{rwj*5}rFr&qTAkQ&S?un7 znwre&?Me<0<w%>f%Bt-TKim0WXLq|gLGz9tjp#5P;8lf>4$Hg*Igx2rWHys|X7o;V z0wG4RfzwbP7>~F+*&jNUj&RVP{M`Tk12;3zY+5#BGd>d|?~KEy<q8q_om+9>Ngrh( zL)s%g5qzSUY!vrxWPQ4U_q?;fXI2b6*&tu%^&@&UomcphS0I}<Hs`i=v0~eo95EI$ zCY%$mcl!P@$m-#q%#H32%K||gTGKtw?6@n7lWu9p8oClj5BFiJ_mfWT;c*>5mibhF z3s6GsnG;io^AtgVf6plz;4XQjbm&8sRyWCPk&X&zIaxBgo6_oEGdoaaq3dw2)Dh@W zW-QtX&BU*pa%xM*iMoNYA8D|4fG=iM?bGXb9D#`9@+o(3;Lf~*f{6_t1tAYb%tNnp z72T}9&tnd6p~tJ~+ePa&eLF<ofv}XUCOohnYCgdWl=viYm_Q5nutK6kqD|tK!t<Sr zF;tqO+(o;g1L9OjyxPS5Qan^j^g@Z#Y@wJ_>Mu<2DW>-^7Sj{<F_jkXp1Q)CM<m>T za}Oq>_A$Abzr$l%7eaE;v~OrXz<k)x=}Rssgi7#Oz}tAT6cp<0w#K`t{9lk((RTr) zby8mq5;%}tK`ntqc^wi5Zw4{tw)WmbW#+@yP3_G*#sBo51+(CSUozO51qb38)+JVk zpbm5&{ek!bucNqbN&S`?m(yGgh+#x^B5)GIyX3cg1E|T>jXCk*C2V00jo;xk)IS*a z@h1>FaTN+mxw9w!Uaz;GtiwHYsbeHL<pCR+gQ{*x?6tN$re5p%<(zAdVGd9SBfalR z<}UAb=lZFMEU^E9OC%6_?z0P_I*vLnL|;rwHO=*xlwVgt5%Mw;D;|a}-1MR#eh@XV Iexj)HA2Bm#)&Kwi diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/win32.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/win32.cpython-38.pyc deleted file mode 100644 index f00bdec41b1fc113f67748664ed190189012536b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3999 zcmai1OLH5!5e6_1KJ+jpzhqf!)Argi6Pxm`E0sq%uC?{BU8R*=q8#l`C7Bu#phSAe zp)o_tQqd>*npAGNdXM`za>{R*YfgJka*3;=e2t+f%3dWyq0vA$fX3I22J~WLqR8<5 z?XdEPx$}(uof@NG0gbOv;=gjnB=eZ$9^bD@A+1n&0<|5Aw&huzDNBi#eZV~jy$*U^ z&*f~Bb*eT~IhAjSmqjf(qo1^(<;vVU<`rb#)WvVvpLxgohGBF8qsP3l_P96Rp718x zlinoecUxz?(i0|&a_k+GV`}`s@}`v2nr@x-&Ov&9o2zsF1#lNp<%iZ`QOY)zkss z7HZbWFQd-n1#iyC-PUK2&JCn<1L+m-s*#o;yE>3v9mvYwH6xn<J+De?l4`8ssA~hw zYXi;e-VLLPH9pb3G0?p+(EZ%I37uQm$<2Y}ravRc<phxWiJX*YP!|<za9NU5@3?nK zPRp|f#n0q<c>z6F<V87yp4;-0oJD<IUY2vHE7Gd5%9ZB74i68T{{;Dg{JdJ>>BLHN zO9y&yB?_d{=*aIjJIP*G#dT6S`Vau{9Ai&VVjD!V8vCBFeh-pzUpweB<lnvdov5wm z^^QtZC(`rFVYAy^pKnm5?`{W>y;hyq^I>yqzPp#~M4kK9U(UzPMBVKM^_Ri6is!q{ z?%gkbRlQfef492_aaC<^Q|G*op%RnUqcGAzJD7*D_rI)m_tN}>FlcYd;Nc`J`3DNq z6u$p|6Pk9D+3yZHvz`3WBxi`Bqf)U`XKPQZMp~#Px>rwnTBUB?ukQpp%{^axwz{#j zequ=sVl?enDDguO#XK$<4iEP%DU{v7VKUT4$hv4bsB@@Y>fLrc91xj@3k$LU7Z%gm zg|*e%+RBn&TUcLOTJ;~lSYBRQ_n)mUukD|WjaB7lrwm}~QK!07O<lQLYwoMGBzG5j zI*#=72xvE>PCB;xC`oj4tCy%a&BuDP32=AQvvT+A;7zmLYiAuax=zkN`iLJ#SwM-O zf=J$HE!N7Y0B;%IY7uXvU~7iv49y!_04*B5VoNl}E+C*PVs-!e?VIw>|NN^|#&ij* zru^HKf1{_s>S-cpsngnsx~aXQ8j0sVj*=v5d(L`udneK7AVz@Ou?ic<0jtT)Y0me7 zo$p^kBc26eTyU4Urr1R3NA-vO>!*95I+$h^j>`Lf2hr~PY0>xFk?e)UkNf_sUJwo> zSXM@LbUO=cYwL^JB3tZDuwJqD^`n&)e|>3T!^``PrV3^3Ycg%b_TxCE7)1_eF(H%Z zwt%rbkDvR&&S{dKa3L*3fp1(m2PR<$>@82=!bJ4>0Y4CLMPl{E0k1K0L@KtKCB5uF zQOQEoiK9@}>RPGJ<6fho^s`PQ(qot@wYQ=utXQeL6Le&#Qo9~+HPc+&tJhT=k63Sz zANLWeLAU862$SDod`zLmV7=gixresUx6rOr=jcaUH`bHO5`>@>?^wbUSPW_%@P=4q z*az&dSgR*CFED}th^brv>9gNYV)KkP{#)d^SAx=8wry^fuZUDs@1=a_WAh6SwpB;H z>FS4Mp-GK46Kwy=$gZjn!l)jE@x$s+8JWZiI(z8^p;=4h(+n!Nwz0VOVk4z`X?=ZU zv7x7NYLD^SqBSYMFnD_MP*=g7*edyW=;tyT*d$OPPs87We4Tk2{)V@YHf`&lLDx83 zUn7nj3!4i#Br0h8O{s5C_vb`z5;6828##M=kTjqkQ<f&1N4$IwJ#});(MK+#vVaoP z0Uy{d5Tz8OLu-YxHl6Wn!^qrFZ<1kht5|v-!&4_fx{EW*KeG4YDMQ<|HUUV+>ieiS z>SWW=N7xVXeT@bM(VuXV`n<&@f63!HaLD#Axh_*sksJ~+Lp7dIGb}@1%fw3XfND8! z?Y?DGGPPUoFAz#TH*JA-&a_2>1PUKINulrbEy4j2t|=@3K%`RCS5aw72b#iL6SVpc z5lWHzB9R#)<mL3z2yQ2Dh>Dv5m+u~38Ezn3y*NpyvRX-hC=#*$QD|q5p*=bKD=Z#U zQU<o-9JlQYNLxi-;w1sBe~tdSL7p`5<p#xs!(%iC;b0>i_<QkP7S`5#yDz@ul)T>C zl7n*+r*HQuWUR#PJ4gx6Thy(bxo-??m3$WO6PPu16>d(vg~-jRvq;G}o%5HQVK~To zYrUk~OBQhF2lYhhM_JZ$UI$@MRdN|(ws{h`q3UcWJE;>VfldrM=~$=N_IGtN!Sm?H zkIv~!9l)fR97oYO&WpS#C`o2NlPU?E(@`T#k5PM%LuByb?{V}EX5b8FZejy7$6)64 zUBZme+7HT~7&km+x63;NfbNtj<5x#s7kA2dd_*03NkAAyT4q<ro${?Z0U2**fRrnl zKite8<N{qL@&E)^&*`gY8R`gqI_UZ<8u*CF4G^zDo#wHlDSAH1Sf|hZN2r^7f*~*g z`bV(qWynutT{?x7$;cZq-EtY|N7<F9QzJ)iqnU(i6Au$7A?{<l&Kw^fqxlz_)1*nR zpMkINjml56!+jS`JV(vzU6YFE;sv+3vXZ*EGh`TMF+DkS*^<_gPRE|LyOB;z!=yNK zjTk^R-Nl-Yg{F+{xqkLeG5Lia6>0vZ(j67v|I!;Dy~#5Fk=ML@ptp@lp8NFC>f*|h zm(#fF@h?V}m#&eL{djF{MSlS{^EXAR{y9l5f8v*sllL1^Blz_q>6SjiYE#qyD_(Bp z`NC#xW8K{3nw(;g8$tT`;>thBo@x&%^~7&LY-A-dIBz9B&28`{F(X`2n$8RR(6#ac nHFy8x+8JjLIdRNk9A^38<_0<^+u1B`-X728?c#L4m@obp;qZeg diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/winterm.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__pycache__/winterm.cpython-38.pyc deleted file mode 100644 index 1b8d2c8c28e3430417c777ba096d00409bfa8175..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4683 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 Wkk04H|4F_eH>kUL(JU28*8c!{8MjLS diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansi.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansi.py deleted file mode 100644 index 7877658..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/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 = '\007' - - -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/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansitowin32.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansitowin32.py deleted file mode 100644 index 359c92b..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansitowin32.py +++ /dev/null @@ -1,257 +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 -from .winterm import 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 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 - except AttributeError: - 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\\]((?:.|;)*?)(\x07)\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() - - # should we strip ANSI sequences from our output? - if strip is None: - strip = conversion_supported or (not self.stream.closed and not self.stream.isatty()) - self.strip = strip - - # should we should convert ANSI sequences into win32 calls? - if convert is None: - convert = conversion_supported and not self.stream.closed and self.stream.isatty() - 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 in '\x07': # \x07 = BEL - 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/initialise.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/initialise.py deleted file mode 100644 index 430d066..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/initialise.py +++ /dev/null @@ -1,80 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import atexit -import contextlib -import sys - -from .ansitowin32 import AnsiToWin32 - - -orig_stdout = None -orig_stderr = None - -wrapped_stdout = None -wrapped_stderr = None - -atexit_done = False - - -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 - - -@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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/win32.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/win32.py deleted file mode 100644 index c2d8360..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/win32.py +++ /dev/null @@ -1,152 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. - -# from winbase.h -STDOUT = -11 -STDERR = -12 - -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 - - 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) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/winterm.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/winterm.py deleted file mode 100644 index 0fdb4ec..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/winterm.py +++ /dev/null @@ -1,169 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -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) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__init__.py deleted file mode 100644 index a786b4d..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -import logging - -__version__ = '0.2.8' - -class DistlibException(Exception): - pass - -try: - from logging import NullHandler -except ImportError: # pragma: no cover - class NullHandler(logging.Handler): - def handle(self, record): pass - def emit(self, record): pass - def createLock(self): self.lock = None - -logger = logging.getLogger(__name__) -logger.addHandler(NullHandler()) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 701fac4910983060adcaa9fb52c4dea8eec2da54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1077 zcmah|J8#rL5T5n>d`UP0Li_-P<l^i=njj$*3Bp5)u1JIc7p#nT<1_KuX6*zL(Ir15 zDf3VG4ck&t)6u|;oyRF4vDS`fJdbbo+wtqgMIUf|`yIUBFaW-jF~2-C)^Rr_3IT!@ z5Q8vc_5y?{tYZ+CG>**JJRG6dE?{QG7K1lX-nT&7yT00DKo7<{!o_%3!bb-)tanfv zZ$ZL|E4@<|59Hv)m(~%SGKM(Y5O_Zj6DEiDO878bOUamD42^Z%%>oJuF%u9QU812! z&+?`%@(&wdQdzfoRZap^dz_caOmeP$&S#a_D@b49{L@}i^qw<N4p!^Lug}r6n#o8_ zWh=`{MbC@8uD7BcdZ}@SrJ{XV?nj6d)d%ggDp$j`sL5M7u9I{($z&7Nc|CscC|n6w z$MpfaLz!jtG2)miu&C%8jX2NCyyZNs4-{Sm4C!Q~c&xJnriYWgqIj8<qLAt@HYjwR za_*tHVnZ0m5S#r~#g?#zgSIVPqF2%7rj&TGNGDpK;%+Py0=D6dO*%f#3~e>C*wK!X zX{E#!Q_96q?M%DYmQnwS8xEJ}`VD*M|IyR{Q~T01nb$!qIm_Ey<X9qz(L4mXQfmKV zkxobIjziT1d<EVes)IpJt)fbI1Ez@X>sWrOWYWq_jJQqi4)M-B;#I&TaFj_w#G0~6 zERwiE;wFj9x#~5dth)emHstgeJ>9opsNJH<vb@ankmIPR24@(Db#OV*-B5JFdiZKq zSE}7ms#4lL9}qprWV?wqr0N>e4i%J2`-u?eG5_jGdyo5H;|X=xjHofgGDfDsMr?`Q HwSD#nn5E=G diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__pycache__/compat.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__pycache__/compat.cpython-38.pyc deleted file mode 100644 index d78094883bbb771bf5c12e9808f127a14a9224d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32226 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 Y^oDOq-PXMwN*9KQA1xM#Hx8HnH!i*P5C8xG diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__pycache__/resources.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__pycache__/resources.cpython-38.pyc deleted file mode 100644 index 03609c56badf056ac358471b8d45140de326714b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11027 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 M6olu7r)J&%2a@ZOPyhe` diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__pycache__/scripts.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__pycache__/scripts.cpython-38.pyc deleted file mode 100644 index 74cca959c433ef33250a4d8c0bcfccf7002f4126..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11199 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 J%xCPW{{t3|Xq^B6 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__pycache__/util.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__pycache__/util.cpython-38.pyc deleted file mode 100644 index 50b5b8bbea9acd29d4b7148dfb3eb438ef7cad9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48115 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 E4dc=^=l}o! diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/__init__.py deleted file mode 100644 index f7dbf4c..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""Modules copied from Python 3 standard libraries, for internal use only. - -Individual classes and functions are found in d2._backport.misc. Intended -usage is to always import things missing from 3.1 from that module: the -built-in/stdlib objects will be used if found. -""" diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/misc.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/misc.py deleted file mode 100644 index cfb318d..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/misc.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""Backports for individual classes and functions.""" - -import os -import sys - -__all__ = ['cache_from_source', 'callable', 'fsencode'] - - -try: - from imp import cache_from_source -except ImportError: - def cache_from_source(py_file, debug=__debug__): - ext = debug and 'c' or 'o' - return py_file + ext - - -try: - callable = callable -except NameError: - from collections import Callable - - def callable(obj): - return isinstance(obj, Callable) - - -try: - fsencode = os.fsencode -except AttributeError: - def fsencode(filename): - if isinstance(filename, bytes): - return filename - elif isinstance(filename, str): - return filename.encode(sys.getfilesystemencoding()) - else: - raise TypeError("expect bytes or str, not %s" % - type(filename).__name__) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/shutil.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/shutil.py deleted file mode 100644 index 159e49e..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/shutil.py +++ /dev/null @@ -1,761 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""Utility functions for copying and archiving files and directory trees. - -XXX The functions here don't copy the resource fork or other metadata on Mac. - -""" - -import os -import sys -import stat -from os.path import abspath -import fnmatch -import collections -import errno -from . import tarfile - -try: - import bz2 - _BZ2_SUPPORTED = True -except ImportError: - _BZ2_SUPPORTED = False - -try: - from pwd import getpwnam -except ImportError: - getpwnam = None - -try: - from grp import getgrnam -except ImportError: - getgrnam = None - -__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", - "copytree", "move", "rmtree", "Error", "SpecialFileError", - "ExecError", "make_archive", "get_archive_formats", - "register_archive_format", "unregister_archive_format", - "get_unpack_formats", "register_unpack_format", - "unregister_unpack_format", "unpack_archive", "ignore_patterns"] - -class Error(EnvironmentError): - pass - -class SpecialFileError(EnvironmentError): - """Raised when trying to do a kind of operation (e.g. copying) which is - not supported on a special file (e.g. a named pipe)""" - -class ExecError(EnvironmentError): - """Raised when a command could not be executed""" - -class ReadError(EnvironmentError): - """Raised when an archive cannot be read""" - -class RegistryError(Exception): - """Raised when a registry operation with the archiving - and unpacking registries fails""" - - -try: - WindowsError -except NameError: - WindowsError = None - -def copyfileobj(fsrc, fdst, length=16*1024): - """copy data from file-like object fsrc to file-like object fdst""" - while 1: - buf = fsrc.read(length) - if not buf: - break - fdst.write(buf) - -def _samefile(src, dst): - # Macintosh, Unix. - if hasattr(os.path, 'samefile'): - try: - return os.path.samefile(src, dst) - except OSError: - return False - - # All other platforms: check for same pathname. - return (os.path.normcase(os.path.abspath(src)) == - os.path.normcase(os.path.abspath(dst))) - -def copyfile(src, dst): - """Copy data from src to dst""" - if _samefile(src, dst): - raise Error("`%s` and `%s` are the same file" % (src, dst)) - - for fn in [src, dst]: - try: - st = os.stat(fn) - except OSError: - # File most likely does not exist - pass - else: - # XXX What about other special files? (sockets, devices...) - if stat.S_ISFIFO(st.st_mode): - raise SpecialFileError("`%s` is a named pipe" % fn) - - with open(src, 'rb') as fsrc: - with open(dst, 'wb') as fdst: - copyfileobj(fsrc, fdst) - -def copymode(src, dst): - """Copy mode bits from src to dst""" - if hasattr(os, 'chmod'): - st = os.stat(src) - mode = stat.S_IMODE(st.st_mode) - os.chmod(dst, mode) - -def copystat(src, dst): - """Copy all stat info (mode bits, atime, mtime, flags) from src to dst""" - st = os.stat(src) - mode = stat.S_IMODE(st.st_mode) - if hasattr(os, 'utime'): - os.utime(dst, (st.st_atime, st.st_mtime)) - if hasattr(os, 'chmod'): - os.chmod(dst, mode) - if hasattr(os, 'chflags') and hasattr(st, 'st_flags'): - try: - os.chflags(dst, st.st_flags) - except OSError as why: - if (not hasattr(errno, 'EOPNOTSUPP') or - why.errno != errno.EOPNOTSUPP): - raise - -def copy(src, dst): - """Copy data and mode bits ("cp src dst"). - - The destination may be a directory. - - """ - if os.path.isdir(dst): - dst = os.path.join(dst, os.path.basename(src)) - copyfile(src, dst) - copymode(src, dst) - -def copy2(src, dst): - """Copy data and all stat info ("cp -p src dst"). - - The destination may be a directory. - - """ - if os.path.isdir(dst): - dst = os.path.join(dst, os.path.basename(src)) - copyfile(src, dst) - copystat(src, dst) - -def ignore_patterns(*patterns): - """Function that can be used as copytree() ignore parameter. - - Patterns is a sequence of glob-style patterns - that are used to exclude files""" - def _ignore_patterns(path, names): - ignored_names = [] - for pattern in patterns: - ignored_names.extend(fnmatch.filter(names, pattern)) - return set(ignored_names) - return _ignore_patterns - -def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, - ignore_dangling_symlinks=False): - """Recursively copy a directory tree. - - The destination directory must not already exist. - If exception(s) occur, an Error is raised with a list of reasons. - - If the optional symlinks flag is true, symbolic links in the - source tree result in symbolic links in the destination tree; if - it is false, the contents of the files pointed to by symbolic - links are copied. If the file pointed by the symlink doesn't - exist, an exception will be added in the list of errors raised in - an Error exception at the end of the copy process. - - You can set the optional ignore_dangling_symlinks flag to true if you - want to silence this exception. Notice that this has no effect on - platforms that don't support os.symlink. - - The optional ignore argument is a callable. If given, it - is called with the `src` parameter, which is the directory - being visited by copytree(), and `names` which is the list of - `src` contents, as returned by os.listdir(): - - callable(src, names) -> ignored_names - - Since copytree() is called recursively, the callable will be - called once for each directory that is copied. It returns a - list of names relative to the `src` directory that should - not be copied. - - The optional copy_function argument is a callable that will be used - to copy each file. It will be called with the source path and the - destination path as arguments. By default, copy2() is used, but any - function that supports the same signature (like copy()) can be used. - - """ - names = os.listdir(src) - if ignore is not None: - ignored_names = ignore(src, names) - else: - ignored_names = set() - - os.makedirs(dst) - errors = [] - for name in names: - if name in ignored_names: - continue - srcname = os.path.join(src, name) - dstname = os.path.join(dst, name) - try: - if os.path.islink(srcname): - linkto = os.readlink(srcname) - if symlinks: - os.symlink(linkto, dstname) - else: - # ignore dangling symlink if the flag is on - if not os.path.exists(linkto) and ignore_dangling_symlinks: - continue - # otherwise let the copy occurs. copy2 will raise an error - copy_function(srcname, dstname) - elif os.path.isdir(srcname): - copytree(srcname, dstname, symlinks, ignore, copy_function) - else: - # Will raise a SpecialFileError for unsupported file types - copy_function(srcname, dstname) - # catch the Error from the recursive copytree so that we can - # continue with other files - except Error as err: - errors.extend(err.args[0]) - except EnvironmentError as why: - errors.append((srcname, dstname, str(why))) - try: - copystat(src, dst) - except OSError as why: - if WindowsError is not None and isinstance(why, WindowsError): - # Copying file access times may fail on Windows - pass - else: - errors.extend((src, dst, str(why))) - if errors: - raise Error(errors) - -def rmtree(path, ignore_errors=False, onerror=None): - """Recursively delete a directory tree. - - If ignore_errors is set, errors are ignored; otherwise, if onerror - is set, it is called to handle the error with arguments (func, - path, exc_info) where func is os.listdir, os.remove, or os.rmdir; - path is the argument to that function that caused it to fail; and - exc_info is a tuple returned by sys.exc_info(). If ignore_errors - is false and onerror is None, an exception is raised. - - """ - if ignore_errors: - def onerror(*args): - pass - elif onerror is None: - def onerror(*args): - raise - try: - if os.path.islink(path): - # symlinks to directories are forbidden, see bug #1669 - raise OSError("Cannot call rmtree on a symbolic link") - except OSError: - onerror(os.path.islink, path, sys.exc_info()) - # can't continue even if onerror hook returns - return - names = [] - try: - names = os.listdir(path) - except os.error: - onerror(os.listdir, path, sys.exc_info()) - for name in names: - fullname = os.path.join(path, name) - try: - mode = os.lstat(fullname).st_mode - except os.error: - mode = 0 - if stat.S_ISDIR(mode): - rmtree(fullname, ignore_errors, onerror) - else: - try: - os.remove(fullname) - except os.error: - onerror(os.remove, fullname, sys.exc_info()) - try: - os.rmdir(path) - except os.error: - onerror(os.rmdir, path, sys.exc_info()) - - -def _basename(path): - # A basename() variant which first strips the trailing slash, if present. - # Thus we always get the last component of the path, even for directories. - return os.path.basename(path.rstrip(os.path.sep)) - -def move(src, dst): - """Recursively move a file or directory to another location. This is - similar to the Unix "mv" command. - - If the destination is a directory or a symlink to a directory, the source - is moved inside the directory. The destination path must not already - exist. - - If the destination already exists but is not a directory, it may be - overwritten depending on os.rename() semantics. - - If the destination is on our current filesystem, then rename() is used. - Otherwise, src is copied to the destination and then removed. - A lot more could be done here... A look at a mv.c shows a lot of - the issues this implementation glosses over. - - """ - real_dst = dst - if os.path.isdir(dst): - if _samefile(src, dst): - # We might be on a case insensitive filesystem, - # perform the rename anyway. - os.rename(src, dst) - return - - real_dst = os.path.join(dst, _basename(src)) - if os.path.exists(real_dst): - raise Error("Destination path '%s' already exists" % real_dst) - try: - os.rename(src, real_dst) - except OSError: - if os.path.isdir(src): - if _destinsrc(src, dst): - raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) - copytree(src, real_dst, symlinks=True) - rmtree(src) - else: - copy2(src, real_dst) - os.unlink(src) - -def _destinsrc(src, dst): - src = abspath(src) - dst = abspath(dst) - if not src.endswith(os.path.sep): - src += os.path.sep - if not dst.endswith(os.path.sep): - dst += os.path.sep - return dst.startswith(src) - -def _get_gid(name): - """Returns a gid, given a group name.""" - if getgrnam is None or name is None: - return None - try: - result = getgrnam(name) - except KeyError: - result = None - if result is not None: - return result[2] - return None - -def _get_uid(name): - """Returns an uid, given a user name.""" - if getpwnam is None or name is None: - return None - try: - result = getpwnam(name) - except KeyError: - result = None - if result is not None: - return result[2] - return None - -def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, - owner=None, group=None, logger=None): - """Create a (possibly compressed) tar file from all the files under - 'base_dir'. - - 'compress' must be "gzip" (the default), "bzip2", or None. - - 'owner' and 'group' can be used to define an owner and a group for the - archive that is being built. If not provided, the current owner and group - will be used. - - The output tar file will be named 'base_name' + ".tar", possibly plus - the appropriate compression extension (".gz", or ".bz2"). - - Returns the output filename. - """ - tar_compression = {'gzip': 'gz', None: ''} - compress_ext = {'gzip': '.gz'} - - if _BZ2_SUPPORTED: - tar_compression['bzip2'] = 'bz2' - compress_ext['bzip2'] = '.bz2' - - # flags for compression program, each element of list will be an argument - if compress is not None and compress not in compress_ext: - raise ValueError("bad value for 'compress', or compression format not " - "supported : {0}".format(compress)) - - archive_name = base_name + '.tar' + compress_ext.get(compress, '') - archive_dir = os.path.dirname(archive_name) - - if not os.path.exists(archive_dir): - if logger is not None: - logger.info("creating %s", archive_dir) - if not dry_run: - os.makedirs(archive_dir) - - # creating the tarball - if logger is not None: - logger.info('Creating tar archive') - - uid = _get_uid(owner) - gid = _get_gid(group) - - def _set_uid_gid(tarinfo): - if gid is not None: - tarinfo.gid = gid - tarinfo.gname = group - if uid is not None: - tarinfo.uid = uid - tarinfo.uname = owner - return tarinfo - - if not dry_run: - tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress]) - try: - tar.add(base_dir, filter=_set_uid_gid) - finally: - tar.close() - - return archive_name - -def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False): - # XXX see if we want to keep an external call here - if verbose: - zipoptions = "-r" - else: - zipoptions = "-rq" - from distutils.errors import DistutilsExecError - from distutils.spawn import spawn - try: - spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run) - except DistutilsExecError: - # XXX really should distinguish between "couldn't find - # external 'zip' command" and "zip failed". - raise ExecError("unable to create zip file '%s': " - "could neither import the 'zipfile' module nor " - "find a standalone zip utility") % zip_filename - -def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): - """Create a zip file from all the files under 'base_dir'. - - The output zip file will be named 'base_name' + ".zip". Uses either the - "zipfile" Python module (if available) or the InfoZIP "zip" utility - (if installed and found on the default search path). If neither tool is - available, raises ExecError. Returns the name of the output zip - file. - """ - zip_filename = base_name + ".zip" - archive_dir = os.path.dirname(base_name) - - if not os.path.exists(archive_dir): - if logger is not None: - logger.info("creating %s", archive_dir) - if not dry_run: - os.makedirs(archive_dir) - - # If zipfile module is not available, try spawning an external 'zip' - # command. - try: - import zipfile - except ImportError: - zipfile = None - - if zipfile is None: - _call_external_zip(base_dir, zip_filename, verbose, dry_run) - else: - if logger is not None: - logger.info("creating '%s' and adding '%s' to it", - zip_filename, base_dir) - - if not dry_run: - zip = zipfile.ZipFile(zip_filename, "w", - compression=zipfile.ZIP_DEFLATED) - - for dirpath, dirnames, filenames in os.walk(base_dir): - for name in filenames: - path = os.path.normpath(os.path.join(dirpath, name)) - if os.path.isfile(path): - zip.write(path, path) - if logger is not None: - logger.info("adding '%s'", path) - zip.close() - - return zip_filename - -_ARCHIVE_FORMATS = { - 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), - 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), - 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), - 'zip': (_make_zipfile, [], "ZIP file"), - } - -if _BZ2_SUPPORTED: - _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], - "bzip2'ed tar-file") - -def get_archive_formats(): - """Returns a list of supported formats for archiving and unarchiving. - - Each element of the returned sequence is a tuple (name, description) - """ - formats = [(name, registry[2]) for name, registry in - _ARCHIVE_FORMATS.items()] - formats.sort() - return formats - -def register_archive_format(name, function, extra_args=None, description=''): - """Registers an archive format. - - name is the name of the format. function is the callable that will be - used to create archives. If provided, extra_args is a sequence of - (name, value) tuples that will be passed as arguments to the callable. - description can be provided to describe the format, and will be returned - by the get_archive_formats() function. - """ - if extra_args is None: - extra_args = [] - if not isinstance(function, collections.Callable): - raise TypeError('The %s object is not callable' % function) - if not isinstance(extra_args, (tuple, list)): - raise TypeError('extra_args needs to be a sequence') - for element in extra_args: - if not isinstance(element, (tuple, list)) or len(element) !=2: - raise TypeError('extra_args elements are : (arg_name, value)') - - _ARCHIVE_FORMATS[name] = (function, extra_args, description) - -def unregister_archive_format(name): - del _ARCHIVE_FORMATS[name] - -def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, - dry_run=0, owner=None, group=None, logger=None): - """Create an archive file (eg. zip or tar). - - 'base_name' is the name of the file to create, minus any format-specific - extension; 'format' is the archive format: one of "zip", "tar", "bztar" - or "gztar". - - 'root_dir' is a directory that will be the root directory of the - archive; ie. we typically chdir into 'root_dir' before creating the - archive. 'base_dir' is the directory where we start archiving from; - ie. 'base_dir' will be the common prefix of all files and - directories in the archive. 'root_dir' and 'base_dir' both default - to the current directory. Returns the name of the archive file. - - 'owner' and 'group' are used when creating a tar archive. By default, - uses the current owner and group. - """ - save_cwd = os.getcwd() - if root_dir is not None: - if logger is not None: - logger.debug("changing into '%s'", root_dir) - base_name = os.path.abspath(base_name) - if not dry_run: - os.chdir(root_dir) - - if base_dir is None: - base_dir = os.curdir - - kwargs = {'dry_run': dry_run, 'logger': logger} - - try: - format_info = _ARCHIVE_FORMATS[format] - except KeyError: - raise ValueError("unknown archive format '%s'" % format) - - func = format_info[0] - for arg, val in format_info[1]: - kwargs[arg] = val - - if format != 'zip': - kwargs['owner'] = owner - kwargs['group'] = group - - try: - filename = func(base_name, base_dir, **kwargs) - finally: - if root_dir is not None: - if logger is not None: - logger.debug("changing back to '%s'", save_cwd) - os.chdir(save_cwd) - - return filename - - -def get_unpack_formats(): - """Returns a list of supported formats for unpacking. - - Each element of the returned sequence is a tuple - (name, extensions, description) - """ - formats = [(name, info[0], info[3]) for name, info in - _UNPACK_FORMATS.items()] - formats.sort() - return formats - -def _check_unpack_options(extensions, function, extra_args): - """Checks what gets registered as an unpacker.""" - # first make sure no other unpacker is registered for this extension - existing_extensions = {} - for name, info in _UNPACK_FORMATS.items(): - for ext in info[0]: - existing_extensions[ext] = name - - for extension in extensions: - if extension in existing_extensions: - msg = '%s is already registered for "%s"' - raise RegistryError(msg % (extension, - existing_extensions[extension])) - - if not isinstance(function, collections.Callable): - raise TypeError('The registered function must be a callable') - - -def register_unpack_format(name, extensions, function, extra_args=None, - description=''): - """Registers an unpack format. - - `name` is the name of the format. `extensions` is a list of extensions - corresponding to the format. - - `function` is the callable that will be - used to unpack archives. The callable will receive archives to unpack. - If it's unable to handle an archive, it needs to raise a ReadError - exception. - - If provided, `extra_args` is a sequence of - (name, value) tuples that will be passed as arguments to the callable. - description can be provided to describe the format, and will be returned - by the get_unpack_formats() function. - """ - if extra_args is None: - extra_args = [] - _check_unpack_options(extensions, function, extra_args) - _UNPACK_FORMATS[name] = extensions, function, extra_args, description - -def unregister_unpack_format(name): - """Removes the pack format from the registry.""" - del _UNPACK_FORMATS[name] - -def _ensure_directory(path): - """Ensure that the parent directory of `path` exists""" - dirname = os.path.dirname(path) - if not os.path.isdir(dirname): - os.makedirs(dirname) - -def _unpack_zipfile(filename, extract_dir): - """Unpack zip `filename` to `extract_dir` - """ - try: - import zipfile - except ImportError: - raise ReadError('zlib not supported, cannot unpack this archive.') - - if not zipfile.is_zipfile(filename): - raise ReadError("%s is not a zip file" % filename) - - zip = zipfile.ZipFile(filename) - try: - for info in zip.infolist(): - name = info.filename - - # don't extract absolute paths or ones with .. in them - if name.startswith('/') or '..' in name: - continue - - target = os.path.join(extract_dir, *name.split('/')) - if not target: - continue - - _ensure_directory(target) - if not name.endswith('/'): - # file - data = zip.read(info.filename) - f = open(target, 'wb') - try: - f.write(data) - finally: - f.close() - del data - finally: - zip.close() - -def _unpack_tarfile(filename, extract_dir): - """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` - """ - try: - tarobj = tarfile.open(filename) - except tarfile.TarError: - raise ReadError( - "%s is not a compressed or uncompressed tar file" % filename) - try: - tarobj.extractall(extract_dir) - finally: - tarobj.close() - -_UNPACK_FORMATS = { - 'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"), - 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), - 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file") - } - -if _BZ2_SUPPORTED: - _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [], - "bzip2'ed tar-file") - -def _find_unpack_format(filename): - for name, info in _UNPACK_FORMATS.items(): - for extension in info[0]: - if filename.endswith(extension): - return name - return None - -def unpack_archive(filename, extract_dir=None, format=None): - """Unpack an archive. - - `filename` is the name of the archive. - - `extract_dir` is the name of the target directory, where the archive - is unpacked. If not provided, the current working directory is used. - - `format` is the archive format: one of "zip", "tar", or "gztar". Or any - other registered format. If not provided, unpack_archive will use the - filename extension and see if an unpacker was registered for that - extension. - - In case none is found, a ValueError is raised. - """ - if extract_dir is None: - extract_dir = os.getcwd() - - if format is not None: - try: - format_info = _UNPACK_FORMATS[format] - except KeyError: - raise ValueError("Unknown unpack format '{0}'".format(format)) - - func = format_info[1] - func(filename, extract_dir, **dict(format_info[2])) - else: - # we need to look at the registered unpackers supported extensions - format = _find_unpack_format(filename) - if format is None: - raise ReadError("Unknown archive format '{0}'".format(filename)) - - func = _UNPACK_FORMATS[format][1] - kwargs = dict(_UNPACK_FORMATS[format][2]) - func(filename, extract_dir, **kwargs) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.cfg b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.cfg deleted file mode 100644 index 1746bd0..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.cfg +++ /dev/null @@ -1,84 +0,0 @@ -[posix_prefix] -# Configuration directories. Some of these come straight out of the -# configure script. They are for implementing the other variables, not to -# be used directly in [resource_locations]. -confdir = /etc -datadir = /usr/share -libdir = /usr/lib -statedir = /var -# User resource directory -local = ~/.local/{distribution.name} - -stdlib = {base}/lib/python{py_version_short} -platstdlib = {platbase}/lib/python{py_version_short} -purelib = {base}/lib/python{py_version_short}/site-packages -platlib = {platbase}/lib/python{py_version_short}/site-packages -include = {base}/include/python{py_version_short}{abiflags} -platinclude = {platbase}/include/python{py_version_short}{abiflags} -data = {base} - -[posix_home] -stdlib = {base}/lib/python -platstdlib = {base}/lib/python -purelib = {base}/lib/python -platlib = {base}/lib/python -include = {base}/include/python -platinclude = {base}/include/python -scripts = {base}/bin -data = {base} - -[nt] -stdlib = {base}/Lib -platstdlib = {base}/Lib -purelib = {base}/Lib/site-packages -platlib = {base}/Lib/site-packages -include = {base}/Include -platinclude = {base}/Include -scripts = {base}/Scripts -data = {base} - -[os2] -stdlib = {base}/Lib -platstdlib = {base}/Lib -purelib = {base}/Lib/site-packages -platlib = {base}/Lib/site-packages -include = {base}/Include -platinclude = {base}/Include -scripts = {base}/Scripts -data = {base} - -[os2_home] -stdlib = {userbase}/lib/python{py_version_short} -platstdlib = {userbase}/lib/python{py_version_short} -purelib = {userbase}/lib/python{py_version_short}/site-packages -platlib = {userbase}/lib/python{py_version_short}/site-packages -include = {userbase}/include/python{py_version_short} -scripts = {userbase}/bin -data = {userbase} - -[nt_user] -stdlib = {userbase}/Python{py_version_nodot} -platstdlib = {userbase}/Python{py_version_nodot} -purelib = {userbase}/Python{py_version_nodot}/site-packages -platlib = {userbase}/Python{py_version_nodot}/site-packages -include = {userbase}/Python{py_version_nodot}/Include -scripts = {userbase}/Scripts -data = {userbase} - -[posix_user] -stdlib = {userbase}/lib/python{py_version_short} -platstdlib = {userbase}/lib/python{py_version_short} -purelib = {userbase}/lib/python{py_version_short}/site-packages -platlib = {userbase}/lib/python{py_version_short}/site-packages -include = {userbase}/include/python{py_version_short} -scripts = {userbase}/bin -data = {userbase} - -[osx_framework_user] -stdlib = {userbase}/lib/python -platstdlib = {userbase}/lib/python -purelib = {userbase}/lib/python/site-packages -platlib = {userbase}/lib/python/site-packages -include = {userbase}/include -scripts = {userbase}/bin -data = {userbase} diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.py deleted file mode 100644 index 1df3aba..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.py +++ /dev/null @@ -1,788 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""Access to Python's configuration information.""" - -import codecs -import os -import re -import sys -from os.path import pardir, realpath -try: - import configparser -except ImportError: - import ConfigParser as configparser - - -__all__ = [ - 'get_config_h_filename', - 'get_config_var', - 'get_config_vars', - 'get_makefile_filename', - 'get_path', - 'get_path_names', - 'get_paths', - 'get_platform', - 'get_python_version', - 'get_scheme_names', - 'parse_config_h', -] - - -def _safe_realpath(path): - try: - return realpath(path) - except OSError: - return path - - -if sys.executable: - _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable)) -else: - # sys.executable can be empty if argv[0] has been changed and Python is - # unable to retrieve the real program name - _PROJECT_BASE = _safe_realpath(os.getcwd()) - -if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower(): - _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir)) -# PC/VS7.1 -if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower(): - _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) -# PC/AMD64 -if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower(): - _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) - - -def is_python_build(): - for fn in ("Setup.dist", "Setup.local"): - if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)): - return True - return False - -_PYTHON_BUILD = is_python_build() - -_cfg_read = False - -def _ensure_cfg_read(): - global _cfg_read - if not _cfg_read: - from ..resources import finder - backport_package = __name__.rsplit('.', 1)[0] - _finder = finder(backport_package) - _cfgfile = _finder.find('sysconfig.cfg') - assert _cfgfile, 'sysconfig.cfg exists' - with _cfgfile.as_stream() as s: - _SCHEMES.readfp(s) - if _PYTHON_BUILD: - for scheme in ('posix_prefix', 'posix_home'): - _SCHEMES.set(scheme, 'include', '{srcdir}/Include') - _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.') - - _cfg_read = True - - -_SCHEMES = configparser.RawConfigParser() -_VAR_REPL = re.compile(r'\{([^{]*?)\}') - -def _expand_globals(config): - _ensure_cfg_read() - if config.has_section('globals'): - globals = config.items('globals') - else: - globals = tuple() - - sections = config.sections() - for section in sections: - if section == 'globals': - continue - for option, value in globals: - if config.has_option(section, option): - continue - config.set(section, option, value) - config.remove_section('globals') - - # now expanding local variables defined in the cfg file - # - for section in config.sections(): - variables = dict(config.items(section)) - - def _replacer(matchobj): - name = matchobj.group(1) - if name in variables: - return variables[name] - return matchobj.group(0) - - for option, value in config.items(section): - config.set(section, option, _VAR_REPL.sub(_replacer, value)) - -#_expand_globals(_SCHEMES) - - # FIXME don't rely on sys.version here, its format is an implementation detail - # of CPython, use sys.version_info or sys.hexversion -_PY_VERSION = sys.version.split()[0] -_PY_VERSION_SHORT = sys.version[:3] -_PY_VERSION_SHORT_NO_DOT = _PY_VERSION[0] + _PY_VERSION[2] -_PREFIX = os.path.normpath(sys.prefix) -_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) -_CONFIG_VARS = None -_USER_BASE = None - - -def _subst_vars(path, local_vars): - """In the string `path`, replace tokens like {some.thing} with the - corresponding value from the map `local_vars`. - - If there is no corresponding value, leave the token unchanged. - """ - def _replacer(matchobj): - name = matchobj.group(1) - if name in local_vars: - return local_vars[name] - elif name in os.environ: - return os.environ[name] - return matchobj.group(0) - return _VAR_REPL.sub(_replacer, path) - - -def _extend_dict(target_dict, other_dict): - target_keys = target_dict.keys() - for key, value in other_dict.items(): - if key in target_keys: - continue - target_dict[key] = value - - -def _expand_vars(scheme, vars): - res = {} - if vars is None: - vars = {} - _extend_dict(vars, get_config_vars()) - - for key, value in _SCHEMES.items(scheme): - if os.name in ('posix', 'nt'): - value = os.path.expanduser(value) - res[key] = os.path.normpath(_subst_vars(value, vars)) - return res - - -def format_value(value, vars): - def _replacer(matchobj): - name = matchobj.group(1) - if name in vars: - return vars[name] - return matchobj.group(0) - return _VAR_REPL.sub(_replacer, value) - - -def _get_default_scheme(): - if os.name == 'posix': - # the default scheme for posix is posix_prefix - return 'posix_prefix' - return os.name - - -def _getuserbase(): - env_base = os.environ.get("PYTHONUSERBASE", None) - - def joinuser(*args): - return os.path.expanduser(os.path.join(*args)) - - # what about 'os2emx', 'riscos' ? - if os.name == "nt": - base = os.environ.get("APPDATA") or "~" - if env_base: - return env_base - else: - return joinuser(base, "Python") - - if sys.platform == "darwin": - framework = get_config_var("PYTHONFRAMEWORK") - if framework: - if env_base: - return env_base - else: - return joinuser("~", "Library", framework, "%d.%d" % - sys.version_info[:2]) - - if env_base: - return env_base - else: - return joinuser("~", ".local") - - -def _parse_makefile(filename, vars=None): - """Parse a Makefile-style file. - - A dictionary containing name/value pairs is returned. If an - optional dictionary is passed in as the second argument, it is - used instead of a new dictionary. - """ - # Regexes needed for parsing Makefile (and similar syntaxes, - # like old-style Setup files). - _variable_rx = re.compile(r"([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") - _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") - _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") - - if vars is None: - vars = {} - done = {} - notdone = {} - - with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f: - lines = f.readlines() - - for line in lines: - if line.startswith('#') or line.strip() == '': - continue - m = _variable_rx.match(line) - if m: - n, v = m.group(1, 2) - v = v.strip() - # `$$' is a literal `$' in make - tmpv = v.replace('$$', '') - - if "$" in tmpv: - notdone[n] = v - else: - try: - v = int(v) - except ValueError: - # insert literal `$' - done[n] = v.replace('$$', '$') - else: - done[n] = v - - # do variable interpolation here - variables = list(notdone.keys()) - - # Variables with a 'PY_' prefix in the makefile. These need to - # be made available without that prefix through sysconfig. - # Special care is needed to ensure that variable expansion works, even - # if the expansion uses the name without a prefix. - renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS') - - while len(variables) > 0: - for name in tuple(variables): - value = notdone[name] - m = _findvar1_rx.search(value) or _findvar2_rx.search(value) - if m is not None: - n = m.group(1) - found = True - if n in done: - item = str(done[n]) - elif n in notdone: - # get it on a subsequent round - found = False - elif n in os.environ: - # do it like make: fall back to environment - item = os.environ[n] - - elif n in renamed_variables: - if (name.startswith('PY_') and - name[3:] in renamed_variables): - item = "" - - elif 'PY_' + n in notdone: - found = False - - else: - item = str(done['PY_' + n]) - - else: - done[n] = item = "" - - if found: - after = value[m.end():] - value = value[:m.start()] + item + after - if "$" in after: - notdone[name] = value - else: - try: - value = int(value) - except ValueError: - done[name] = value.strip() - else: - done[name] = value - variables.remove(name) - - if (name.startswith('PY_') and - name[3:] in renamed_variables): - - name = name[3:] - if name not in done: - done[name] = value - - else: - # bogus variable reference (e.g. "prefix=$/opt/python"); - # just drop it since we can't deal - done[name] = value - variables.remove(name) - - # strip spurious spaces - for k, v in done.items(): - if isinstance(v, str): - done[k] = v.strip() - - # save the results in the global dictionary - vars.update(done) - return vars - - -def get_makefile_filename(): - """Return the path of the Makefile.""" - if _PYTHON_BUILD: - return os.path.join(_PROJECT_BASE, "Makefile") - if hasattr(sys, 'abiflags'): - config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags) - else: - config_dir_name = 'config' - return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') - - -def _init_posix(vars): - """Initialize the module as appropriate for POSIX systems.""" - # load the installed Makefile: - makefile = get_makefile_filename() - try: - _parse_makefile(makefile, vars) - except IOError as e: - msg = "invalid Python installation: unable to open %s" % makefile - if hasattr(e, "strerror"): - msg = msg + " (%s)" % e.strerror - raise IOError(msg) - # load the installed pyconfig.h: - config_h = get_config_h_filename() - try: - with open(config_h) as f: - parse_config_h(f, vars) - except IOError as e: - msg = "invalid Python installation: unable to open %s" % config_h - if hasattr(e, "strerror"): - msg = msg + " (%s)" % e.strerror - raise IOError(msg) - # On AIX, there are wrong paths to the linker scripts in the Makefile - # -- these paths are relative to the Python source, but when installed - # the scripts are in another directory. - if _PYTHON_BUILD: - vars['LDSHARED'] = vars['BLDSHARED'] - - -def _init_non_posix(vars): - """Initialize the module as appropriate for NT""" - # set basic install directories - vars['LIBDEST'] = get_path('stdlib') - vars['BINLIBDEST'] = get_path('platstdlib') - vars['INCLUDEPY'] = get_path('include') - vars['SO'] = '.pyd' - vars['EXE'] = '.exe' - vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT - vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) - -# -# public APIs -# - - -def parse_config_h(fp, vars=None): - """Parse a config.h-style file. - - A dictionary containing name/value pairs is returned. If an - optional dictionary is passed in as the second argument, it is - used instead of a new dictionary. - """ - if vars is None: - vars = {} - define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") - undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") - - while True: - line = fp.readline() - if not line: - break - m = define_rx.match(line) - if m: - n, v = m.group(1, 2) - try: - v = int(v) - except ValueError: - pass - vars[n] = v - else: - m = undef_rx.match(line) - if m: - vars[m.group(1)] = 0 - return vars - - -def get_config_h_filename(): - """Return the path of pyconfig.h.""" - if _PYTHON_BUILD: - if os.name == "nt": - inc_dir = os.path.join(_PROJECT_BASE, "PC") - else: - inc_dir = _PROJECT_BASE - else: - inc_dir = get_path('platinclude') - return os.path.join(inc_dir, 'pyconfig.h') - - -def get_scheme_names(): - """Return a tuple containing the schemes names.""" - return tuple(sorted(_SCHEMES.sections())) - - -def get_path_names(): - """Return a tuple containing the paths names.""" - # xxx see if we want a static list - return _SCHEMES.options('posix_prefix') - - -def get_paths(scheme=_get_default_scheme(), vars=None, expand=True): - """Return a mapping containing an install scheme. - - ``scheme`` is the install scheme name. If not provided, it will - return the default scheme for the current platform. - """ - _ensure_cfg_read() - if expand: - return _expand_vars(scheme, vars) - else: - return dict(_SCHEMES.items(scheme)) - - -def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True): - """Return a path corresponding to the scheme. - - ``scheme`` is the install scheme name. - """ - return get_paths(scheme, vars, expand)[name] - - -def get_config_vars(*args): - """With no arguments, return a dictionary of all configuration - variables relevant for the current platform. - - On Unix, this means every variable defined in Python's installed Makefile; - On Windows and Mac OS it's a much smaller set. - - With arguments, return a list of values that result from looking up - each argument in the configuration variable dictionary. - """ - global _CONFIG_VARS - if _CONFIG_VARS is None: - _CONFIG_VARS = {} - # Normalized versions of prefix and exec_prefix are handy to have; - # in fact, these are the standard versions used most places in the - # distutils2 module. - _CONFIG_VARS['prefix'] = _PREFIX - _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX - _CONFIG_VARS['py_version'] = _PY_VERSION - _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT - _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2] - _CONFIG_VARS['base'] = _PREFIX - _CONFIG_VARS['platbase'] = _EXEC_PREFIX - _CONFIG_VARS['projectbase'] = _PROJECT_BASE - try: - _CONFIG_VARS['abiflags'] = sys.abiflags - except AttributeError: - # sys.abiflags may not be defined on all platforms. - _CONFIG_VARS['abiflags'] = '' - - if os.name in ('nt', 'os2'): - _init_non_posix(_CONFIG_VARS) - if os.name == 'posix': - _init_posix(_CONFIG_VARS) - # Setting 'userbase' is done below the call to the - # init function to enable using 'get_config_var' in - # the init-function. - if sys.version >= '2.6': - _CONFIG_VARS['userbase'] = _getuserbase() - - if 'srcdir' not in _CONFIG_VARS: - _CONFIG_VARS['srcdir'] = _PROJECT_BASE - else: - _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir']) - - # Convert srcdir into an absolute path if it appears necessary. - # Normally it is relative to the build directory. However, during - # testing, for example, we might be running a non-installed python - # from a different directory. - if _PYTHON_BUILD and os.name == "posix": - base = _PROJECT_BASE - try: - cwd = os.getcwd() - except OSError: - cwd = None - if (not os.path.isabs(_CONFIG_VARS['srcdir']) and - base != cwd): - # srcdir is relative and we are not in the same directory - # as the executable. Assume executable is in the build - # directory and make srcdir absolute. - srcdir = os.path.join(base, _CONFIG_VARS['srcdir']) - _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir) - - if sys.platform == 'darwin': - kernel_version = os.uname()[2] # Kernel version (8.4.3) - major_version = int(kernel_version.split('.')[0]) - - if major_version < 8: - # On Mac OS X before 10.4, check if -arch and -isysroot - # are in CFLAGS or LDFLAGS and remove them if they are. - # This is needed when building extensions on a 10.3 system - # using a universal build of python. - for key in ('LDFLAGS', 'BASECFLAGS', - # a number of derived variables. These need to be - # patched up as well. - 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): - flags = _CONFIG_VARS[key] - flags = re.sub(r'-arch\s+\w+\s', ' ', flags) - flags = re.sub('-isysroot [^ \t]*', ' ', flags) - _CONFIG_VARS[key] = flags - else: - # Allow the user to override the architecture flags using - # an environment variable. - # NOTE: This name was introduced by Apple in OSX 10.5 and - # is used by several scripting languages distributed with - # that OS release. - if 'ARCHFLAGS' in os.environ: - arch = os.environ['ARCHFLAGS'] - for key in ('LDFLAGS', 'BASECFLAGS', - # a number of derived variables. These need to be - # patched up as well. - 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): - - flags = _CONFIG_VARS[key] - flags = re.sub(r'-arch\s+\w+\s', ' ', flags) - flags = flags + ' ' + arch - _CONFIG_VARS[key] = flags - - # If we're on OSX 10.5 or later and the user tries to - # compiles an extension using an SDK that is not present - # on the current machine it is better to not use an SDK - # than to fail. - # - # The major usecase for this is users using a Python.org - # binary installer on OSX 10.6: that installer uses - # the 10.4u SDK, but that SDK is not installed by default - # when you install Xcode. - # - CFLAGS = _CONFIG_VARS.get('CFLAGS', '') - m = re.search(r'-isysroot\s+(\S+)', CFLAGS) - if m is not None: - sdk = m.group(1) - if not os.path.exists(sdk): - for key in ('LDFLAGS', 'BASECFLAGS', - # a number of derived variables. These need to be - # patched up as well. - 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): - - flags = _CONFIG_VARS[key] - flags = re.sub(r'-isysroot\s+\S+(\s|$)', ' ', flags) - _CONFIG_VARS[key] = flags - - if args: - vals = [] - for name in args: - vals.append(_CONFIG_VARS.get(name)) - return vals - else: - return _CONFIG_VARS - - -def get_config_var(name): - """Return the value of a single variable using the dictionary returned by - 'get_config_vars()'. - - Equivalent to get_config_vars().get(name) - """ - return get_config_vars().get(name) - - -def get_platform(): - """Return a string that identifies the current platform. - - This is used mainly to distinguish platform-specific build directories and - platform-specific built distributions. Typically includes the OS name - and version and the architecture (as supplied by 'os.uname()'), - although the exact information included depends on the OS; eg. for IRIX - the architecture isn't particularly important (IRIX only runs on SGI - hardware), but for Linux the kernel version isn't particularly - important. - - Examples of returned values: - linux-i586 - linux-alpha (?) - solaris-2.6-sun4u - irix-5.3 - irix64-6.2 - - Windows will return one of: - win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) - win-ia64 (64bit Windows on Itanium) - win32 (all others - specifically, sys.platform is returned) - - For other non-POSIX platforms, currently just returns 'sys.platform'. - """ - if os.name == 'nt': - # sniff sys.version for architecture. - prefix = " bit (" - i = sys.version.find(prefix) - if i == -1: - return sys.platform - j = sys.version.find(")", i) - look = sys.version[i+len(prefix):j].lower() - if look == 'amd64': - return 'win-amd64' - if look == 'itanium': - return 'win-ia64' - return sys.platform - - if os.name != "posix" or not hasattr(os, 'uname'): - # XXX what about the architecture? NT is Intel or Alpha, - # Mac OS is M68k or PPC, etc. - return sys.platform - - # Try to distinguish various flavours of Unix - osname, host, release, version, machine = os.uname() - - # Convert the OS name to lowercase, remove '/' characters - # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") - osname = osname.lower().replace('/', '') - machine = machine.replace(' ', '_') - machine = machine.replace('/', '-') - - if osname[:5] == "linux": - # At least on Linux/Intel, 'machine' is the processor -- - # i386, etc. - # XXX what about Alpha, SPARC, etc? - return "%s-%s" % (osname, machine) - elif osname[:5] == "sunos": - if release[0] >= "5": # SunOS 5 == Solaris 2 - osname = "solaris" - release = "%d.%s" % (int(release[0]) - 3, release[2:]) - # fall through to standard osname-release-machine representation - elif osname[:4] == "irix": # could be "irix64"! - return "%s-%s" % (osname, release) - elif osname[:3] == "aix": - return "%s-%s.%s" % (osname, version, release) - elif osname[:6] == "cygwin": - osname = "cygwin" - rel_re = re.compile(r'[\d.]+') - m = rel_re.match(release) - if m: - release = m.group() - elif osname[:6] == "darwin": - # - # For our purposes, we'll assume that the system version from - # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set - # to. This makes the compatibility story a bit more sane because the - # machine is going to compile and link as if it were - # MACOSX_DEPLOYMENT_TARGET. - cfgvars = get_config_vars() - macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET') - - if True: - # Always calculate the release of the running machine, - # needed to determine if we can build fat binaries or not. - - macrelease = macver - # Get the system version. Reading this plist is a documented - # way to get the system version (see the documentation for - # the Gestalt Manager) - try: - f = open('/System/Library/CoreServices/SystemVersion.plist') - except IOError: - # We're on a plain darwin box, fall back to the default - # behaviour. - pass - else: - try: - m = re.search(r'<key>ProductUserVisibleVersion</key>\s*' - r'<string>(.*?)</string>', f.read()) - finally: - f.close() - if m is not None: - macrelease = '.'.join(m.group(1).split('.')[:2]) - # else: fall back to the default behaviour - - if not macver: - macver = macrelease - - if macver: - release = macver - osname = "macosx" - - if ((macrelease + '.') >= '10.4.' and - '-arch' in get_config_vars().get('CFLAGS', '').strip()): - # The universal build will build fat binaries, but not on - # systems before 10.4 - # - # Try to detect 4-way universal builds, those have machine-type - # 'universal' instead of 'fat'. - - machine = 'fat' - cflags = get_config_vars().get('CFLAGS') - - archs = re.findall(r'-arch\s+(\S+)', cflags) - archs = tuple(sorted(set(archs))) - - if len(archs) == 1: - machine = archs[0] - elif archs == ('i386', 'ppc'): - machine = 'fat' - elif archs == ('i386', 'x86_64'): - machine = 'intel' - elif archs == ('i386', 'ppc', 'x86_64'): - machine = 'fat3' - elif archs == ('ppc64', 'x86_64'): - machine = 'fat64' - elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): - machine = 'universal' - else: - raise ValueError( - "Don't know machine value for archs=%r" % (archs,)) - - elif machine == 'i386': - # On OSX the machine type returned by uname is always the - # 32-bit variant, even if the executable architecture is - # the 64-bit variant - if sys.maxsize >= 2**32: - machine = 'x86_64' - - elif machine in ('PowerPC', 'Power_Macintosh'): - # Pick a sane name for the PPC architecture. - # See 'i386' case - if sys.maxsize >= 2**32: - machine = 'ppc64' - else: - machine = 'ppc' - - return "%s-%s-%s" % (osname, release, machine) - - -def get_python_version(): - return _PY_VERSION_SHORT - - -def _print_dict(title, data): - for index, (key, value) in enumerate(sorted(data.items())): - if index == 0: - print('%s: ' % (title)) - print('\t%s = "%s"' % (key, value)) - - -def _main(): - """Display all information sysconfig detains.""" - print('Platform: "%s"' % get_platform()) - print('Python version: "%s"' % get_python_version()) - print('Current installation scheme: "%s"' % _get_default_scheme()) - print() - _print_dict('Paths', get_paths()) - print() - _print_dict('Variables', get_config_vars()) - - -if __name__ == '__main__': - _main() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/tarfile.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/tarfile.py deleted file mode 100644 index d66d856..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/tarfile.py +++ /dev/null @@ -1,2607 +0,0 @@ -#------------------------------------------------------------------- -# tarfile.py -#------------------------------------------------------------------- -# Copyright (C) 2002 Lars Gustaebel <lars@gustaebel.de> -# All rights reserved. -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation -# files (the "Software"), to deal in the Software without -# restriction, including without limitation the rights to use, -# copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following -# conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. -# -from __future__ import print_function - -"""Read from and write to tar format archives. -""" - -__version__ = "$Revision$" - -version = "0.9.0" -__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" -__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $" -__cvsid__ = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $" -__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." - -#--------- -# Imports -#--------- -import sys -import os -import stat -import errno -import time -import struct -import copy -import re - -try: - import grp, pwd -except ImportError: - grp = pwd = None - -# os.symlink on Windows prior to 6.0 raises NotImplementedError -symlink_exception = (AttributeError, NotImplementedError) -try: - # WindowsError (1314) will be raised if the caller does not hold the - # SeCreateSymbolicLinkPrivilege privilege - symlink_exception += (WindowsError,) -except NameError: - pass - -# from tarfile import * -__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"] - -if sys.version_info[0] < 3: - import __builtin__ as builtins -else: - import builtins - -_open = builtins.open # Since 'open' is TarFile.open - -#--------------------------------------------------------- -# tar constants -#--------------------------------------------------------- -NUL = b"\0" # the null character -BLOCKSIZE = 512 # length of processing blocks -RECORDSIZE = BLOCKSIZE * 20 # length of records -GNU_MAGIC = b"ustar \0" # magic gnu tar string -POSIX_MAGIC = b"ustar\x0000" # magic posix tar string - -LENGTH_NAME = 100 # maximum length of a filename -LENGTH_LINK = 100 # maximum length of a linkname -LENGTH_PREFIX = 155 # maximum length of the prefix field - -REGTYPE = b"0" # regular file -AREGTYPE = b"\0" # regular file -LNKTYPE = b"1" # link (inside tarfile) -SYMTYPE = b"2" # symbolic link -CHRTYPE = b"3" # character special device -BLKTYPE = b"4" # block special device -DIRTYPE = b"5" # directory -FIFOTYPE = b"6" # fifo special device -CONTTYPE = b"7" # contiguous file - -GNUTYPE_LONGNAME = b"L" # GNU tar longname -GNUTYPE_LONGLINK = b"K" # GNU tar longlink -GNUTYPE_SPARSE = b"S" # GNU tar sparse file - -XHDTYPE = b"x" # POSIX.1-2001 extended header -XGLTYPE = b"g" # POSIX.1-2001 global header -SOLARIS_XHDTYPE = b"X" # Solaris extended header - -USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format -GNU_FORMAT = 1 # GNU tar format -PAX_FORMAT = 2 # POSIX.1-2001 (pax) format -DEFAULT_FORMAT = GNU_FORMAT - -#--------------------------------------------------------- -# tarfile constants -#--------------------------------------------------------- -# File types that tarfile supports: -SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE, - SYMTYPE, DIRTYPE, FIFOTYPE, - CONTTYPE, CHRTYPE, BLKTYPE, - GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, - GNUTYPE_SPARSE) - -# File types that will be treated as a regular file. -REGULAR_TYPES = (REGTYPE, AREGTYPE, - CONTTYPE, GNUTYPE_SPARSE) - -# File types that are part of the GNU tar format. -GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, - GNUTYPE_SPARSE) - -# Fields from a pax header that override a TarInfo attribute. -PAX_FIELDS = ("path", "linkpath", "size", "mtime", - "uid", "gid", "uname", "gname") - -# Fields from a pax header that are affected by hdrcharset. -PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname")) - -# Fields in a pax header that are numbers, all other fields -# are treated as strings. -PAX_NUMBER_FIELDS = { - "atime": float, - "ctime": float, - "mtime": float, - "uid": int, - "gid": int, - "size": int -} - -#--------------------------------------------------------- -# Bits used in the mode field, values in octal. -#--------------------------------------------------------- -S_IFLNK = 0o120000 # symbolic link -S_IFREG = 0o100000 # regular file -S_IFBLK = 0o060000 # block device -S_IFDIR = 0o040000 # directory -S_IFCHR = 0o020000 # character device -S_IFIFO = 0o010000 # fifo - -TSUID = 0o4000 # set UID on execution -TSGID = 0o2000 # set GID on execution -TSVTX = 0o1000 # reserved - -TUREAD = 0o400 # read by owner -TUWRITE = 0o200 # write by owner -TUEXEC = 0o100 # execute/search by owner -TGREAD = 0o040 # read by group -TGWRITE = 0o020 # write by group -TGEXEC = 0o010 # execute/search by group -TOREAD = 0o004 # read by other -TOWRITE = 0o002 # write by other -TOEXEC = 0o001 # execute/search by other - -#--------------------------------------------------------- -# initialization -#--------------------------------------------------------- -if os.name in ("nt", "ce"): - ENCODING = "utf-8" -else: - ENCODING = sys.getfilesystemencoding() - -#--------------------------------------------------------- -# Some useful functions -#--------------------------------------------------------- - -def stn(s, length, encoding, errors): - """Convert a string to a null-terminated bytes object. - """ - s = s.encode(encoding, errors) - return s[:length] + (length - len(s)) * NUL - -def nts(s, encoding, errors): - """Convert a null-terminated bytes object to a string. - """ - p = s.find(b"\0") - if p != -1: - s = s[:p] - return s.decode(encoding, errors) - -def nti(s): - """Convert a number field to a python number. - """ - # There are two possible encodings for a number field, see - # itn() below. - if s[0] != chr(0o200): - try: - n = int(nts(s, "ascii", "strict") or "0", 8) - except ValueError: - raise InvalidHeaderError("invalid header") - else: - n = 0 - for i in range(len(s) - 1): - n <<= 8 - n += ord(s[i + 1]) - return n - -def itn(n, digits=8, format=DEFAULT_FORMAT): - """Convert a python number to a number field. - """ - # POSIX 1003.1-1988 requires numbers to be encoded as a string of - # octal digits followed by a null-byte, this allows values up to - # (8**(digits-1))-1. GNU tar allows storing numbers greater than - # that if necessary. A leading 0o200 byte indicates this particular - # encoding, the following digits-1 bytes are a big-endian - # representation. This allows values up to (256**(digits-1))-1. - if 0 <= n < 8 ** (digits - 1): - s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL - else: - if format != GNU_FORMAT or n >= 256 ** (digits - 1): - raise ValueError("overflow in number field") - - if n < 0: - # XXX We mimic GNU tar's behaviour with negative numbers, - # this could raise OverflowError. - n = struct.unpack("L", struct.pack("l", n))[0] - - s = bytearray() - for i in range(digits - 1): - s.insert(0, n & 0o377) - n >>= 8 - s.insert(0, 0o200) - return s - -def calc_chksums(buf): - """Calculate the checksum for a member's header by summing up all - characters except for the chksum field which is treated as if - it was filled with spaces. According to the GNU tar sources, - some tars (Sun and NeXT) calculate chksum with signed char, - which will be different if there are chars in the buffer with - the high bit set. So we calculate two checksums, unsigned and - signed. - """ - unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512])) - signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512])) - return unsigned_chksum, signed_chksum - -def copyfileobj(src, dst, length=None): - """Copy length bytes from fileobj src to fileobj dst. - If length is None, copy the entire content. - """ - if length == 0: - return - if length is None: - while True: - buf = src.read(16*1024) - if not buf: - break - dst.write(buf) - return - - BUFSIZE = 16 * 1024 - blocks, remainder = divmod(length, BUFSIZE) - for b in range(blocks): - buf = src.read(BUFSIZE) - if len(buf) < BUFSIZE: - raise IOError("end of file reached") - dst.write(buf) - - if remainder != 0: - buf = src.read(remainder) - if len(buf) < remainder: - raise IOError("end of file reached") - dst.write(buf) - return - -filemode_table = ( - ((S_IFLNK, "l"), - (S_IFREG, "-"), - (S_IFBLK, "b"), - (S_IFDIR, "d"), - (S_IFCHR, "c"), - (S_IFIFO, "p")), - - ((TUREAD, "r"),), - ((TUWRITE, "w"),), - ((TUEXEC|TSUID, "s"), - (TSUID, "S"), - (TUEXEC, "x")), - - ((TGREAD, "r"),), - ((TGWRITE, "w"),), - ((TGEXEC|TSGID, "s"), - (TSGID, "S"), - (TGEXEC, "x")), - - ((TOREAD, "r"),), - ((TOWRITE, "w"),), - ((TOEXEC|TSVTX, "t"), - (TSVTX, "T"), - (TOEXEC, "x")) -) - -def filemode(mode): - """Convert a file's mode to a string of the form - -rwxrwxrwx. - Used by TarFile.list() - """ - perm = [] - for table in filemode_table: - for bit, char in table: - if mode & bit == bit: - perm.append(char) - break - else: - perm.append("-") - return "".join(perm) - -class TarError(Exception): - """Base exception.""" - pass -class ExtractError(TarError): - """General exception for extract errors.""" - pass -class ReadError(TarError): - """Exception for unreadable tar archives.""" - pass -class CompressionError(TarError): - """Exception for unavailable compression methods.""" - pass -class StreamError(TarError): - """Exception for unsupported operations on stream-like TarFiles.""" - pass -class HeaderError(TarError): - """Base exception for header errors.""" - pass -class EmptyHeaderError(HeaderError): - """Exception for empty headers.""" - pass -class TruncatedHeaderError(HeaderError): - """Exception for truncated headers.""" - pass -class EOFHeaderError(HeaderError): - """Exception for end of file headers.""" - pass -class InvalidHeaderError(HeaderError): - """Exception for invalid headers.""" - pass -class SubsequentHeaderError(HeaderError): - """Exception for missing and invalid extended headers.""" - pass - -#--------------------------- -# internal stream interface -#--------------------------- -class _LowLevelFile(object): - """Low-level file object. Supports reading and writing. - It is used instead of a regular file object for streaming - access. - """ - - def __init__(self, name, mode): - mode = { - "r": os.O_RDONLY, - "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC, - }[mode] - if hasattr(os, "O_BINARY"): - mode |= os.O_BINARY - self.fd = os.open(name, mode, 0o666) - - def close(self): - os.close(self.fd) - - def read(self, size): - return os.read(self.fd, size) - - def write(self, s): - os.write(self.fd, s) - -class _Stream(object): - """Class that serves as an adapter between TarFile and - a stream-like object. The stream-like object only - needs to have a read() or write() method and is accessed - blockwise. Use of gzip or bzip2 compression is possible. - A stream-like object could be for example: sys.stdin, - sys.stdout, a socket, a tape device etc. - - _Stream is intended to be used only internally. - """ - - def __init__(self, name, mode, comptype, fileobj, bufsize): - """Construct a _Stream object. - """ - self._extfileobj = True - if fileobj is None: - fileobj = _LowLevelFile(name, mode) - self._extfileobj = False - - if comptype == '*': - # Enable transparent compression detection for the - # stream interface - fileobj = _StreamProxy(fileobj) - comptype = fileobj.getcomptype() - - self.name = name or "" - self.mode = mode - self.comptype = comptype - self.fileobj = fileobj - self.bufsize = bufsize - self.buf = b"" - self.pos = 0 - self.closed = False - - try: - if comptype == "gz": - try: - import zlib - except ImportError: - raise CompressionError("zlib module is not available") - self.zlib = zlib - self.crc = zlib.crc32(b"") - if mode == "r": - self._init_read_gz() - else: - self._init_write_gz() - - if comptype == "bz2": - try: - import bz2 - except ImportError: - raise CompressionError("bz2 module is not available") - if mode == "r": - self.dbuf = b"" - self.cmp = bz2.BZ2Decompressor() - else: - self.cmp = bz2.BZ2Compressor() - except: - if not self._extfileobj: - self.fileobj.close() - self.closed = True - raise - - def __del__(self): - if hasattr(self, "closed") and not self.closed: - self.close() - - def _init_write_gz(self): - """Initialize for writing with gzip compression. - """ - self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED, - -self.zlib.MAX_WBITS, - self.zlib.DEF_MEM_LEVEL, - 0) - timestamp = struct.pack("<L", int(time.time())) - self.__write(b"\037\213\010\010" + timestamp + b"\002\377") - if self.name.endswith(".gz"): - self.name = self.name[:-3] - # RFC1952 says we must use ISO-8859-1 for the FNAME field. - self.__write(self.name.encode("iso-8859-1", "replace") + NUL) - - def write(self, s): - """Write string s to the stream. - """ - if self.comptype == "gz": - self.crc = self.zlib.crc32(s, self.crc) - self.pos += len(s) - if self.comptype != "tar": - s = self.cmp.compress(s) - self.__write(s) - - def __write(self, s): - """Write string s to the stream if a whole new block - is ready to be written. - """ - self.buf += s - while len(self.buf) > self.bufsize: - self.fileobj.write(self.buf[:self.bufsize]) - self.buf = self.buf[self.bufsize:] - - def close(self): - """Close the _Stream object. No operation should be - done on it afterwards. - """ - if self.closed: - return - - if self.mode == "w" and self.comptype != "tar": - self.buf += self.cmp.flush() - - if self.mode == "w" and self.buf: - self.fileobj.write(self.buf) - self.buf = b"" - if self.comptype == "gz": - # The native zlib crc is an unsigned 32-bit integer, but - # the Python wrapper implicitly casts that to a signed C - # long. So, on a 32-bit box self.crc may "look negative", - # while the same crc on a 64-bit box may "look positive". - # To avoid irksome warnings from the `struct` module, force - # it to look positive on all boxes. - self.fileobj.write(struct.pack("<L", self.crc & 0xffffffff)) - self.fileobj.write(struct.pack("<L", self.pos & 0xffffFFFF)) - - if not self._extfileobj: - self.fileobj.close() - - self.closed = True - - def _init_read_gz(self): - """Initialize for reading a gzip compressed fileobj. - """ - self.cmp = self.zlib.decompressobj(-self.zlib.MAX_WBITS) - self.dbuf = b"" - - # taken from gzip.GzipFile with some alterations - if self.__read(2) != b"\037\213": - raise ReadError("not a gzip file") - if self.__read(1) != b"\010": - raise CompressionError("unsupported compression method") - - flag = ord(self.__read(1)) - self.__read(6) - - if flag & 4: - xlen = ord(self.__read(1)) + 256 * ord(self.__read(1)) - self.read(xlen) - if flag & 8: - while True: - s = self.__read(1) - if not s or s == NUL: - break - if flag & 16: - while True: - s = self.__read(1) - if not s or s == NUL: - break - if flag & 2: - self.__read(2) - - def tell(self): - """Return the stream's file pointer position. - """ - return self.pos - - def seek(self, pos=0): - """Set the stream's file pointer to pos. Negative seeking - is forbidden. - """ - if pos - self.pos >= 0: - blocks, remainder = divmod(pos - self.pos, self.bufsize) - for i in range(blocks): - self.read(self.bufsize) - self.read(remainder) - else: - raise StreamError("seeking backwards is not allowed") - return self.pos - - def read(self, size=None): - """Return the next size number of bytes from the stream. - If size is not defined, return all bytes of the stream - up to EOF. - """ - if size is None: - t = [] - while True: - buf = self._read(self.bufsize) - if not buf: - break - t.append(buf) - buf = "".join(t) - else: - buf = self._read(size) - self.pos += len(buf) - return buf - - def _read(self, size): - """Return size bytes from the stream. - """ - if self.comptype == "tar": - return self.__read(size) - - c = len(self.dbuf) - while c < size: - buf = self.__read(self.bufsize) - if not buf: - break - try: - buf = self.cmp.decompress(buf) - except IOError: - raise ReadError("invalid compressed data") - self.dbuf += buf - c += len(buf) - buf = self.dbuf[:size] - self.dbuf = self.dbuf[size:] - return buf - - def __read(self, size): - """Return size bytes from stream. If internal buffer is empty, - read another block from the stream. - """ - c = len(self.buf) - while c < size: - buf = self.fileobj.read(self.bufsize) - if not buf: - break - self.buf += buf - c += len(buf) - buf = self.buf[:size] - self.buf = self.buf[size:] - return buf -# class _Stream - -class _StreamProxy(object): - """Small proxy class that enables transparent compression - detection for the Stream interface (mode 'r|*'). - """ - - def __init__(self, fileobj): - self.fileobj = fileobj - self.buf = self.fileobj.read(BLOCKSIZE) - - def read(self, size): - self.read = self.fileobj.read - return self.buf - - def getcomptype(self): - if self.buf.startswith(b"\037\213\010"): - return "gz" - if self.buf.startswith(b"BZh91"): - return "bz2" - return "tar" - - def close(self): - self.fileobj.close() -# class StreamProxy - -class _BZ2Proxy(object): - """Small proxy class that enables external file object - support for "r:bz2" and "w:bz2" modes. This is actually - a workaround for a limitation in bz2 module's BZ2File - class which (unlike gzip.GzipFile) has no support for - a file object argument. - """ - - blocksize = 16 * 1024 - - def __init__(self, fileobj, mode): - self.fileobj = fileobj - self.mode = mode - self.name = getattr(self.fileobj, "name", None) - self.init() - - def init(self): - import bz2 - self.pos = 0 - if self.mode == "r": - self.bz2obj = bz2.BZ2Decompressor() - self.fileobj.seek(0) - self.buf = b"" - else: - self.bz2obj = bz2.BZ2Compressor() - - def read(self, size): - x = len(self.buf) - while x < size: - raw = self.fileobj.read(self.blocksize) - if not raw: - break - data = self.bz2obj.decompress(raw) - self.buf += data - x += len(data) - - buf = self.buf[:size] - self.buf = self.buf[size:] - self.pos += len(buf) - return buf - - def seek(self, pos): - if pos < self.pos: - self.init() - self.read(pos - self.pos) - - def tell(self): - return self.pos - - def write(self, data): - self.pos += len(data) - raw = self.bz2obj.compress(data) - self.fileobj.write(raw) - - def close(self): - if self.mode == "w": - raw = self.bz2obj.flush() - self.fileobj.write(raw) -# class _BZ2Proxy - -#------------------------ -# Extraction file object -#------------------------ -class _FileInFile(object): - """A thin wrapper around an existing file object that - provides a part of its data as an individual file - object. - """ - - def __init__(self, fileobj, offset, size, blockinfo=None): - self.fileobj = fileobj - self.offset = offset - self.size = size - self.position = 0 - - if blockinfo is None: - blockinfo = [(0, size)] - - # Construct a map with data and zero blocks. - self.map_index = 0 - self.map = [] - lastpos = 0 - realpos = self.offset - for offset, size in blockinfo: - if offset > lastpos: - self.map.append((False, lastpos, offset, None)) - self.map.append((True, offset, offset + size, realpos)) - realpos += size - lastpos = offset + size - if lastpos < self.size: - self.map.append((False, lastpos, self.size, None)) - - def seekable(self): - if not hasattr(self.fileobj, "seekable"): - # XXX gzip.GzipFile and bz2.BZ2File - return True - return self.fileobj.seekable() - - def tell(self): - """Return the current file position. - """ - return self.position - - def seek(self, position): - """Seek to a position in the file. - """ - self.position = position - - def read(self, size=None): - """Read data from the file. - """ - if size is None: - size = self.size - self.position - else: - size = min(size, self.size - self.position) - - buf = b"" - while size > 0: - while True: - data, start, stop, offset = self.map[self.map_index] - if start <= self.position < stop: - break - else: - self.map_index += 1 - if self.map_index == len(self.map): - self.map_index = 0 - length = min(size, stop - self.position) - if data: - self.fileobj.seek(offset + (self.position - start)) - buf += self.fileobj.read(length) - else: - buf += NUL * length - size -= length - self.position += length - return buf -#class _FileInFile - - -class ExFileObject(object): - """File-like object for reading an archive member. - Is returned by TarFile.extractfile(). - """ - blocksize = 1024 - - def __init__(self, tarfile, tarinfo): - self.fileobj = _FileInFile(tarfile.fileobj, - tarinfo.offset_data, - tarinfo.size, - tarinfo.sparse) - self.name = tarinfo.name - self.mode = "r" - self.closed = False - self.size = tarinfo.size - - self.position = 0 - self.buffer = b"" - - def readable(self): - return True - - def writable(self): - return False - - def seekable(self): - return self.fileobj.seekable() - - def read(self, size=None): - """Read at most size bytes from the file. If size is not - present or None, read all data until EOF is reached. - """ - if self.closed: - raise ValueError("I/O operation on closed file") - - buf = b"" - if self.buffer: - if size is None: - buf = self.buffer - self.buffer = b"" - else: - buf = self.buffer[:size] - self.buffer = self.buffer[size:] - - if size is None: - buf += self.fileobj.read() - else: - buf += self.fileobj.read(size - len(buf)) - - self.position += len(buf) - return buf - - # XXX TextIOWrapper uses the read1() method. - read1 = read - - def readline(self, size=-1): - """Read one entire line from the file. If size is present - and non-negative, return a string with at most that - size, which may be an incomplete line. - """ - if self.closed: - raise ValueError("I/O operation on closed file") - - pos = self.buffer.find(b"\n") + 1 - if pos == 0: - # no newline found. - while True: - buf = self.fileobj.read(self.blocksize) - self.buffer += buf - if not buf or b"\n" in buf: - pos = self.buffer.find(b"\n") + 1 - if pos == 0: - # no newline found. - pos = len(self.buffer) - break - - if size != -1: - pos = min(size, pos) - - buf = self.buffer[:pos] - self.buffer = self.buffer[pos:] - self.position += len(buf) - return buf - - def readlines(self): - """Return a list with all remaining lines. - """ - result = [] - while True: - line = self.readline() - if not line: break - result.append(line) - return result - - def tell(self): - """Return the current file position. - """ - if self.closed: - raise ValueError("I/O operation on closed file") - - return self.position - - def seek(self, pos, whence=os.SEEK_SET): - """Seek to a position in the file. - """ - if self.closed: - raise ValueError("I/O operation on closed file") - - if whence == os.SEEK_SET: - self.position = min(max(pos, 0), self.size) - elif whence == os.SEEK_CUR: - if pos < 0: - self.position = max(self.position + pos, 0) - else: - self.position = min(self.position + pos, self.size) - elif whence == os.SEEK_END: - self.position = max(min(self.size + pos, self.size), 0) - else: - raise ValueError("Invalid argument") - - self.buffer = b"" - self.fileobj.seek(self.position) - - def close(self): - """Close the file object. - """ - self.closed = True - - def __iter__(self): - """Get an iterator over the file's lines. - """ - while True: - line = self.readline() - if not line: - break - yield line -#class ExFileObject - -#------------------ -# Exported Classes -#------------------ -class TarInfo(object): - """Informational class which holds the details about an - archive member given by a tar header block. - TarInfo objects are returned by TarFile.getmember(), - TarFile.getmembers() and TarFile.gettarinfo() and are - usually created internally. - """ - - __slots__ = ("name", "mode", "uid", "gid", "size", "mtime", - "chksum", "type", "linkname", "uname", "gname", - "devmajor", "devminor", - "offset", "offset_data", "pax_headers", "sparse", - "tarfile", "_sparse_structs", "_link_target") - - def __init__(self, name=""): - """Construct a TarInfo object. name is the optional name - of the member. - """ - self.name = name # member name - self.mode = 0o644 # file permissions - self.uid = 0 # user id - self.gid = 0 # group id - self.size = 0 # file size - self.mtime = 0 # modification time - self.chksum = 0 # header checksum - self.type = REGTYPE # member type - self.linkname = "" # link name - self.uname = "" # user name - self.gname = "" # group name - self.devmajor = 0 # device major number - self.devminor = 0 # device minor number - - self.offset = 0 # the tar header starts here - self.offset_data = 0 # the file's data starts here - - self.sparse = None # sparse member information - self.pax_headers = {} # pax header information - - # In pax headers the "name" and "linkname" field are called - # "path" and "linkpath". - def _getpath(self): - return self.name - def _setpath(self, name): - self.name = name - path = property(_getpath, _setpath) - - def _getlinkpath(self): - return self.linkname - def _setlinkpath(self, linkname): - self.linkname = linkname - linkpath = property(_getlinkpath, _setlinkpath) - - def __repr__(self): - return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self)) - - def get_info(self): - """Return the TarInfo's attributes as a dictionary. - """ - info = { - "name": self.name, - "mode": self.mode & 0o7777, - "uid": self.uid, - "gid": self.gid, - "size": self.size, - "mtime": self.mtime, - "chksum": self.chksum, - "type": self.type, - "linkname": self.linkname, - "uname": self.uname, - "gname": self.gname, - "devmajor": self.devmajor, - "devminor": self.devminor - } - - if info["type"] == DIRTYPE and not info["name"].endswith("/"): - info["name"] += "/" - - return info - - def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"): - """Return a tar header as a string of 512 byte blocks. - """ - info = self.get_info() - - if format == USTAR_FORMAT: - return self.create_ustar_header(info, encoding, errors) - elif format == GNU_FORMAT: - return self.create_gnu_header(info, encoding, errors) - elif format == PAX_FORMAT: - return self.create_pax_header(info, encoding) - else: - raise ValueError("invalid format") - - def create_ustar_header(self, info, encoding, errors): - """Return the object as a ustar header block. - """ - info["magic"] = POSIX_MAGIC - - if len(info["linkname"]) > LENGTH_LINK: - raise ValueError("linkname is too long") - - if len(info["name"]) > LENGTH_NAME: - info["prefix"], info["name"] = self._posix_split_name(info["name"]) - - return self._create_header(info, USTAR_FORMAT, encoding, errors) - - def create_gnu_header(self, info, encoding, errors): - """Return the object as a GNU header block sequence. - """ - info["magic"] = GNU_MAGIC - - buf = b"" - if len(info["linkname"]) > LENGTH_LINK: - buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) - - if len(info["name"]) > LENGTH_NAME: - buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors) - - return buf + self._create_header(info, GNU_FORMAT, encoding, errors) - - def create_pax_header(self, info, encoding): - """Return the object as a ustar header block. If it cannot be - represented this way, prepend a pax extended header sequence - with supplement information. - """ - info["magic"] = POSIX_MAGIC - pax_headers = self.pax_headers.copy() - - # Test string fields for values that exceed the field length or cannot - # be represented in ASCII encoding. - for name, hname, length in ( - ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK), - ("uname", "uname", 32), ("gname", "gname", 32)): - - if hname in pax_headers: - # The pax header has priority. - continue - - # Try to encode the string as ASCII. - try: - info[name].encode("ascii", "strict") - except UnicodeEncodeError: - pax_headers[hname] = info[name] - continue - - if len(info[name]) > length: - pax_headers[hname] = info[name] - - # Test number fields for values that exceed the field limit or values - # that like to be stored as float. - for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)): - if name in pax_headers: - # The pax header has priority. Avoid overflow. - info[name] = 0 - continue - - val = info[name] - if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float): - pax_headers[name] = str(val) - info[name] = 0 - - # Create a pax extended header if necessary. - if pax_headers: - buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding) - else: - buf = b"" - - return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace") - - @classmethod - def create_pax_global_header(cls, pax_headers): - """Return the object as a pax global header block sequence. - """ - return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8") - - def _posix_split_name(self, name): - """Split a name longer than 100 chars into a prefix - and a name part. - """ - prefix = name[:LENGTH_PREFIX + 1] - while prefix and prefix[-1] != "/": - prefix = prefix[:-1] - - name = name[len(prefix):] - prefix = prefix[:-1] - - if not prefix or len(name) > LENGTH_NAME: - raise ValueError("name is too long") - return prefix, name - - @staticmethod - def _create_header(info, format, encoding, errors): - """Return a header block. info is a dictionary with file - information, format must be one of the *_FORMAT constants. - """ - parts = [ - stn(info.get("name", ""), 100, encoding, errors), - itn(info.get("mode", 0) & 0o7777, 8, format), - itn(info.get("uid", 0), 8, format), - itn(info.get("gid", 0), 8, format), - itn(info.get("size", 0), 12, format), - itn(info.get("mtime", 0), 12, format), - b" ", # checksum field - info.get("type", REGTYPE), - stn(info.get("linkname", ""), 100, encoding, errors), - info.get("magic", POSIX_MAGIC), - stn(info.get("uname", ""), 32, encoding, errors), - stn(info.get("gname", ""), 32, encoding, errors), - itn(info.get("devmajor", 0), 8, format), - itn(info.get("devminor", 0), 8, format), - stn(info.get("prefix", ""), 155, encoding, errors) - ] - - buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts)) - chksum = calc_chksums(buf[-BLOCKSIZE:])[0] - buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:] - return buf - - @staticmethod - def _create_payload(payload): - """Return the string payload filled with zero bytes - up to the next 512 byte border. - """ - blocks, remainder = divmod(len(payload), BLOCKSIZE) - if remainder > 0: - payload += (BLOCKSIZE - remainder) * NUL - return payload - - @classmethod - def _create_gnu_long_header(cls, name, type, encoding, errors): - """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence - for name. - """ - name = name.encode(encoding, errors) + NUL - - info = {} - info["name"] = "././@LongLink" - info["type"] = type - info["size"] = len(name) - info["magic"] = GNU_MAGIC - - # create extended header + name blocks. - return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \ - cls._create_payload(name) - - @classmethod - def _create_pax_generic_header(cls, pax_headers, type, encoding): - """Return a POSIX.1-2008 extended or global header sequence - that contains a list of keyword, value pairs. The values - must be strings. - """ - # Check if one of the fields contains surrogate characters and thereby - # forces hdrcharset=BINARY, see _proc_pax() for more information. - binary = False - for keyword, value in pax_headers.items(): - try: - value.encode("utf8", "strict") - except UnicodeEncodeError: - binary = True - break - - records = b"" - if binary: - # Put the hdrcharset field at the beginning of the header. - records += b"21 hdrcharset=BINARY\n" - - for keyword, value in pax_headers.items(): - keyword = keyword.encode("utf8") - if binary: - # Try to restore the original byte representation of `value'. - # Needless to say, that the encoding must match the string. - value = value.encode(encoding, "surrogateescape") - else: - value = value.encode("utf8") - - l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n' - n = p = 0 - while True: - n = l + len(str(p)) - if n == p: - break - p = n - records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n" - - # We use a hardcoded "././@PaxHeader" name like star does - # instead of the one that POSIX recommends. - info = {} - info["name"] = "././@PaxHeader" - info["type"] = type - info["size"] = len(records) - info["magic"] = POSIX_MAGIC - - # Create pax header + record blocks. - return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \ - cls._create_payload(records) - - @classmethod - def frombuf(cls, buf, encoding, errors): - """Construct a TarInfo object from a 512 byte bytes object. - """ - if len(buf) == 0: - raise EmptyHeaderError("empty header") - if len(buf) != BLOCKSIZE: - raise TruncatedHeaderError("truncated header") - if buf.count(NUL) == BLOCKSIZE: - raise EOFHeaderError("end of file header") - - chksum = nti(buf[148:156]) - if chksum not in calc_chksums(buf): - raise InvalidHeaderError("bad checksum") - - obj = cls() - obj.name = nts(buf[0:100], encoding, errors) - obj.mode = nti(buf[100:108]) - obj.uid = nti(buf[108:116]) - obj.gid = nti(buf[116:124]) - obj.size = nti(buf[124:136]) - obj.mtime = nti(buf[136:148]) - obj.chksum = chksum - obj.type = buf[156:157] - obj.linkname = nts(buf[157:257], encoding, errors) - obj.uname = nts(buf[265:297], encoding, errors) - obj.gname = nts(buf[297:329], encoding, errors) - obj.devmajor = nti(buf[329:337]) - obj.devminor = nti(buf[337:345]) - prefix = nts(buf[345:500], encoding, errors) - - # Old V7 tar format represents a directory as a regular - # file with a trailing slash. - if obj.type == AREGTYPE and obj.name.endswith("/"): - obj.type = DIRTYPE - - # The old GNU sparse format occupies some of the unused - # space in the buffer for up to 4 sparse structures. - # Save the them for later processing in _proc_sparse(). - if obj.type == GNUTYPE_SPARSE: - pos = 386 - structs = [] - for i in range(4): - try: - offset = nti(buf[pos:pos + 12]) - numbytes = nti(buf[pos + 12:pos + 24]) - except ValueError: - break - structs.append((offset, numbytes)) - pos += 24 - isextended = bool(buf[482]) - origsize = nti(buf[483:495]) - obj._sparse_structs = (structs, isextended, origsize) - - # Remove redundant slashes from directories. - if obj.isdir(): - obj.name = obj.name.rstrip("/") - - # Reconstruct a ustar longname. - if prefix and obj.type not in GNU_TYPES: - obj.name = prefix + "/" + obj.name - return obj - - @classmethod - def fromtarfile(cls, tarfile): - """Return the next TarInfo object from TarFile object - tarfile. - """ - buf = tarfile.fileobj.read(BLOCKSIZE) - obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) - obj.offset = tarfile.fileobj.tell() - BLOCKSIZE - return obj._proc_member(tarfile) - - #-------------------------------------------------------------------------- - # The following are methods that are called depending on the type of a - # member. The entry point is _proc_member() which can be overridden in a - # subclass to add custom _proc_*() methods. A _proc_*() method MUST - # implement the following - # operations: - # 1. Set self.offset_data to the position where the data blocks begin, - # if there is data that follows. - # 2. Set tarfile.offset to the position where the next member's header will - # begin. - # 3. Return self or another valid TarInfo object. - def _proc_member(self, tarfile): - """Choose the right processing method depending on - the type and call it. - """ - if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK): - return self._proc_gnulong(tarfile) - elif self.type == GNUTYPE_SPARSE: - return self._proc_sparse(tarfile) - elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE): - return self._proc_pax(tarfile) - else: - return self._proc_builtin(tarfile) - - def _proc_builtin(self, tarfile): - """Process a builtin type or an unknown type which - will be treated as a regular file. - """ - self.offset_data = tarfile.fileobj.tell() - offset = self.offset_data - if self.isreg() or self.type not in SUPPORTED_TYPES: - # Skip the following data blocks. - offset += self._block(self.size) - tarfile.offset = offset - - # Patch the TarInfo object with saved global - # header information. - self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors) - - return self - - def _proc_gnulong(self, tarfile): - """Process the blocks that hold a GNU longname - or longlink member. - """ - buf = tarfile.fileobj.read(self._block(self.size)) - - # Fetch the next header and process it. - try: - next = self.fromtarfile(tarfile) - except HeaderError: - raise SubsequentHeaderError("missing or bad subsequent header") - - # Patch the TarInfo object from the next header with - # the longname information. - next.offset = self.offset - if self.type == GNUTYPE_LONGNAME: - next.name = nts(buf, tarfile.encoding, tarfile.errors) - elif self.type == GNUTYPE_LONGLINK: - next.linkname = nts(buf, tarfile.encoding, tarfile.errors) - - return next - - def _proc_sparse(self, tarfile): - """Process a GNU sparse header plus extra headers. - """ - # We already collected some sparse structures in frombuf(). - structs, isextended, origsize = self._sparse_structs - del self._sparse_structs - - # Collect sparse structures from extended header blocks. - while isextended: - buf = tarfile.fileobj.read(BLOCKSIZE) - pos = 0 - for i in range(21): - try: - offset = nti(buf[pos:pos + 12]) - numbytes = nti(buf[pos + 12:pos + 24]) - except ValueError: - break - if offset and numbytes: - structs.append((offset, numbytes)) - pos += 24 - isextended = bool(buf[504]) - self.sparse = structs - - self.offset_data = tarfile.fileobj.tell() - tarfile.offset = self.offset_data + self._block(self.size) - self.size = origsize - return self - - def _proc_pax(self, tarfile): - """Process an extended or global header as described in - POSIX.1-2008. - """ - # Read the header information. - buf = tarfile.fileobj.read(self._block(self.size)) - - # A pax header stores supplemental information for either - # the following file (extended) or all following files - # (global). - if self.type == XGLTYPE: - pax_headers = tarfile.pax_headers - else: - pax_headers = tarfile.pax_headers.copy() - - # Check if the pax header contains a hdrcharset field. This tells us - # the encoding of the path, linkpath, uname and gname fields. Normally, - # these fields are UTF-8 encoded but since POSIX.1-2008 tar - # implementations are allowed to store them as raw binary strings if - # the translation to UTF-8 fails. - match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf) - if match is not None: - pax_headers["hdrcharset"] = match.group(1).decode("utf8") - - # For the time being, we don't care about anything other than "BINARY". - # The only other value that is currently allowed by the standard is - # "ISO-IR 10646 2000 UTF-8" in other words UTF-8. - hdrcharset = pax_headers.get("hdrcharset") - if hdrcharset == "BINARY": - encoding = tarfile.encoding - else: - encoding = "utf8" - - # Parse pax header information. A record looks like that: - # "%d %s=%s\n" % (length, keyword, value). length is the size - # of the complete record including the length field itself and - # the newline. keyword and value are both UTF-8 encoded strings. - regex = re.compile(br"(\d+) ([^=]+)=") - pos = 0 - while True: - match = regex.match(buf, pos) - if not match: - break - - length, keyword = match.groups() - length = int(length) - value = buf[match.end(2) + 1:match.start(1) + length - 1] - - # Normally, we could just use "utf8" as the encoding and "strict" - # as the error handler, but we better not take the risk. For - # example, GNU tar <= 1.23 is known to store filenames it cannot - # translate to UTF-8 as raw strings (unfortunately without a - # hdrcharset=BINARY header). - # We first try the strict standard encoding, and if that fails we - # fall back on the user's encoding and error handler. - keyword = self._decode_pax_field(keyword, "utf8", "utf8", - tarfile.errors) - if keyword in PAX_NAME_FIELDS: - value = self._decode_pax_field(value, encoding, tarfile.encoding, - tarfile.errors) - else: - value = self._decode_pax_field(value, "utf8", "utf8", - tarfile.errors) - - pax_headers[keyword] = value - pos += length - - # Fetch the next header. - try: - next = self.fromtarfile(tarfile) - except HeaderError: - raise SubsequentHeaderError("missing or bad subsequent header") - - # Process GNU sparse information. - if "GNU.sparse.map" in pax_headers: - # GNU extended sparse format version 0.1. - self._proc_gnusparse_01(next, pax_headers) - - elif "GNU.sparse.size" in pax_headers: - # GNU extended sparse format version 0.0. - self._proc_gnusparse_00(next, pax_headers, buf) - - elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": - # GNU extended sparse format version 1.0. - self._proc_gnusparse_10(next, pax_headers, tarfile) - - if self.type in (XHDTYPE, SOLARIS_XHDTYPE): - # Patch the TarInfo object with the extended header info. - next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors) - next.offset = self.offset - - if "size" in pax_headers: - # If the extended header replaces the size field, - # we need to recalculate the offset where the next - # header starts. - offset = next.offset_data - if next.isreg() or next.type not in SUPPORTED_TYPES: - offset += next._block(next.size) - tarfile.offset = offset - - return next - - def _proc_gnusparse_00(self, next, pax_headers, buf): - """Process a GNU tar extended sparse header, version 0.0. - """ - offsets = [] - for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf): - offsets.append(int(match.group(1))) - numbytes = [] - for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf): - numbytes.append(int(match.group(1))) - next.sparse = list(zip(offsets, numbytes)) - - def _proc_gnusparse_01(self, next, pax_headers): - """Process a GNU tar extended sparse header, version 0.1. - """ - sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")] - next.sparse = list(zip(sparse[::2], sparse[1::2])) - - def _proc_gnusparse_10(self, next, pax_headers, tarfile): - """Process a GNU tar extended sparse header, version 1.0. - """ - fields = None - sparse = [] - buf = tarfile.fileobj.read(BLOCKSIZE) - fields, buf = buf.split(b"\n", 1) - fields = int(fields) - while len(sparse) < fields * 2: - if b"\n" not in buf: - buf += tarfile.fileobj.read(BLOCKSIZE) - number, buf = buf.split(b"\n", 1) - sparse.append(int(number)) - next.offset_data = tarfile.fileobj.tell() - next.sparse = list(zip(sparse[::2], sparse[1::2])) - - def _apply_pax_info(self, pax_headers, encoding, errors): - """Replace fields with supplemental information from a previous - pax extended or global header. - """ - for keyword, value in pax_headers.items(): - if keyword == "GNU.sparse.name": - setattr(self, "path", value) - elif keyword == "GNU.sparse.size": - setattr(self, "size", int(value)) - elif keyword == "GNU.sparse.realsize": - setattr(self, "size", int(value)) - elif keyword in PAX_FIELDS: - if keyword in PAX_NUMBER_FIELDS: - try: - value = PAX_NUMBER_FIELDS[keyword](value) - except ValueError: - value = 0 - if keyword == "path": - value = value.rstrip("/") - setattr(self, keyword, value) - - self.pax_headers = pax_headers.copy() - - def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors): - """Decode a single field from a pax record. - """ - try: - return value.decode(encoding, "strict") - except UnicodeDecodeError: - return value.decode(fallback_encoding, fallback_errors) - - def _block(self, count): - """Round up a byte count by BLOCKSIZE and return it, - e.g. _block(834) => 1024. - """ - blocks, remainder = divmod(count, BLOCKSIZE) - if remainder: - blocks += 1 - return blocks * BLOCKSIZE - - def isreg(self): - return self.type in REGULAR_TYPES - def isfile(self): - return self.isreg() - def isdir(self): - return self.type == DIRTYPE - def issym(self): - return self.type == SYMTYPE - def islnk(self): - return self.type == LNKTYPE - def ischr(self): - return self.type == CHRTYPE - def isblk(self): - return self.type == BLKTYPE - def isfifo(self): - return self.type == FIFOTYPE - def issparse(self): - return self.sparse is not None - def isdev(self): - return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) -# class TarInfo - -class TarFile(object): - """The TarFile Class provides an interface to tar archives. - """ - - debug = 0 # May be set from 0 (no msgs) to 3 (all msgs) - - dereference = False # If true, add content of linked file to the - # tar file, else the link. - - ignore_zeros = False # If true, skips empty or invalid blocks and - # continues processing. - - errorlevel = 1 # If 0, fatal errors only appear in debug - # messages (if debug >= 0). If > 0, errors - # are passed to the caller as exceptions. - - format = DEFAULT_FORMAT # The format to use when creating an archive. - - encoding = ENCODING # Encoding for 8-bit character strings. - - errors = None # Error handler for unicode conversion. - - tarinfo = TarInfo # The default TarInfo class to use. - - fileobject = ExFileObject # The default ExFileObject class to use. - - def __init__(self, name=None, mode="r", fileobj=None, format=None, - tarinfo=None, dereference=None, ignore_zeros=None, encoding=None, - errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None): - """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to - read from an existing archive, 'a' to append data to an existing - file or 'w' to create a new file overwriting an existing one. `mode' - defaults to 'r'. - If `fileobj' is given, it is used for reading or writing data. If it - can be determined, `mode' is overridden by `fileobj's mode. - `fileobj' is not closed, when TarFile is closed. - """ - if len(mode) > 1 or mode not in "raw": - raise ValueError("mode must be 'r', 'a' or 'w'") - self.mode = mode - self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode] - - if not fileobj: - if self.mode == "a" and not os.path.exists(name): - # Create nonexistent files in append mode. - self.mode = "w" - self._mode = "wb" - fileobj = bltn_open(name, self._mode) - self._extfileobj = False - else: - if name is None and hasattr(fileobj, "name"): - name = fileobj.name - if hasattr(fileobj, "mode"): - self._mode = fileobj.mode - self._extfileobj = True - self.name = os.path.abspath(name) if name else None - self.fileobj = fileobj - - # Init attributes. - if format is not None: - self.format = format - if tarinfo is not None: - self.tarinfo = tarinfo - if dereference is not None: - self.dereference = dereference - if ignore_zeros is not None: - self.ignore_zeros = ignore_zeros - if encoding is not None: - self.encoding = encoding - self.errors = errors - - if pax_headers is not None and self.format == PAX_FORMAT: - self.pax_headers = pax_headers - else: - self.pax_headers = {} - - if debug is not None: - self.debug = debug - if errorlevel is not None: - self.errorlevel = errorlevel - - # Init datastructures. - self.closed = False - self.members = [] # list of members as TarInfo objects - self._loaded = False # flag if all members have been read - self.offset = self.fileobj.tell() - # current position in the archive file - self.inodes = {} # dictionary caching the inodes of - # archive members already added - - try: - if self.mode == "r": - self.firstmember = None - self.firstmember = self.next() - - if self.mode == "a": - # Move to the end of the archive, - # before the first empty block. - while True: - self.fileobj.seek(self.offset) - try: - tarinfo = self.tarinfo.fromtarfile(self) - self.members.append(tarinfo) - except EOFHeaderError: - self.fileobj.seek(self.offset) - break - except HeaderError as e: - raise ReadError(str(e)) - - if self.mode in "aw": - self._loaded = True - - if self.pax_headers: - buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) - self.fileobj.write(buf) - self.offset += len(buf) - except: - if not self._extfileobj: - self.fileobj.close() - self.closed = True - raise - - #-------------------------------------------------------------------------- - # Below are the classmethods which act as alternate constructors to the - # TarFile class. The open() method is the only one that is needed for - # public use; it is the "super"-constructor and is able to select an - # adequate "sub"-constructor for a particular compression using the mapping - # from OPEN_METH. - # - # This concept allows one to subclass TarFile without losing the comfort of - # the super-constructor. A sub-constructor is registered and made available - # by adding it to the mapping in OPEN_METH. - - @classmethod - def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs): - """Open a tar archive for reading, writing or appending. Return - an appropriate TarFile class. - - mode: - 'r' or 'r:*' open for reading with transparent compression - 'r:' open for reading exclusively uncompressed - 'r:gz' open for reading with gzip compression - 'r:bz2' open for reading with bzip2 compression - 'a' or 'a:' open for appending, creating the file if necessary - 'w' or 'w:' open for writing without compression - 'w:gz' open for writing with gzip compression - 'w:bz2' open for writing with bzip2 compression - - 'r|*' open a stream of tar blocks with transparent compression - 'r|' open an uncompressed stream of tar blocks for reading - 'r|gz' open a gzip compressed stream of tar blocks - 'r|bz2' open a bzip2 compressed stream of tar blocks - 'w|' open an uncompressed stream for writing - 'w|gz' open a gzip compressed stream for writing - 'w|bz2' open a bzip2 compressed stream for writing - """ - - if not name and not fileobj: - raise ValueError("nothing to open") - - if mode in ("r", "r:*"): - # Find out which *open() is appropriate for opening the file. - for comptype in cls.OPEN_METH: - func = getattr(cls, cls.OPEN_METH[comptype]) - if fileobj is not None: - saved_pos = fileobj.tell() - try: - return func(name, "r", fileobj, **kwargs) - except (ReadError, CompressionError) as e: - if fileobj is not None: - fileobj.seek(saved_pos) - continue - raise ReadError("file could not be opened successfully") - - elif ":" in mode: - filemode, comptype = mode.split(":", 1) - filemode = filemode or "r" - comptype = comptype or "tar" - - # Select the *open() function according to - # given compression. - if comptype in cls.OPEN_METH: - func = getattr(cls, cls.OPEN_METH[comptype]) - else: - raise CompressionError("unknown compression type %r" % comptype) - return func(name, filemode, fileobj, **kwargs) - - elif "|" in mode: - filemode, comptype = mode.split("|", 1) - filemode = filemode or "r" - comptype = comptype or "tar" - - if filemode not in "rw": - raise ValueError("mode must be 'r' or 'w'") - - stream = _Stream(name, filemode, comptype, fileobj, bufsize) - try: - t = cls(name, filemode, stream, **kwargs) - except: - stream.close() - raise - t._extfileobj = False - return t - - elif mode in "aw": - return cls.taropen(name, mode, fileobj, **kwargs) - - raise ValueError("undiscernible mode") - - @classmethod - def taropen(cls, name, mode="r", fileobj=None, **kwargs): - """Open uncompressed tar archive name for reading or writing. - """ - if len(mode) > 1 or mode not in "raw": - raise ValueError("mode must be 'r', 'a' or 'w'") - return cls(name, mode, fileobj, **kwargs) - - @classmethod - def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): - """Open gzip compressed tar archive name for reading or writing. - Appending is not allowed. - """ - if len(mode) > 1 or mode not in "rw": - raise ValueError("mode must be 'r' or 'w'") - - try: - import gzip - gzip.GzipFile - except (ImportError, AttributeError): - raise CompressionError("gzip module is not available") - - extfileobj = fileobj is not None - try: - fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) - t = cls.taropen(name, mode, fileobj, **kwargs) - except IOError: - if not extfileobj and fileobj is not None: - fileobj.close() - if fileobj is None: - raise - raise ReadError("not a gzip file") - except: - if not extfileobj and fileobj is not None: - fileobj.close() - raise - t._extfileobj = extfileobj - return t - - @classmethod - def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): - """Open bzip2 compressed tar archive name for reading or writing. - Appending is not allowed. - """ - if len(mode) > 1 or mode not in "rw": - raise ValueError("mode must be 'r' or 'w'.") - - try: - import bz2 - except ImportError: - raise CompressionError("bz2 module is not available") - - if fileobj is not None: - fileobj = _BZ2Proxy(fileobj, mode) - else: - fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel) - - try: - t = cls.taropen(name, mode, fileobj, **kwargs) - except (IOError, EOFError): - fileobj.close() - raise ReadError("not a bzip2 file") - t._extfileobj = False - return t - - # All *open() methods are registered here. - OPEN_METH = { - "tar": "taropen", # uncompressed tar - "gz": "gzopen", # gzip compressed tar - "bz2": "bz2open" # bzip2 compressed tar - } - - #-------------------------------------------------------------------------- - # The public methods which TarFile provides: - - def close(self): - """Close the TarFile. In write-mode, two finishing zero blocks are - appended to the archive. - """ - if self.closed: - return - - if self.mode in "aw": - self.fileobj.write(NUL * (BLOCKSIZE * 2)) - self.offset += (BLOCKSIZE * 2) - # fill up the end with zero-blocks - # (like option -b20 for tar does) - blocks, remainder = divmod(self.offset, RECORDSIZE) - if remainder > 0: - self.fileobj.write(NUL * (RECORDSIZE - remainder)) - - if not self._extfileobj: - self.fileobj.close() - self.closed = True - - def getmember(self, name): - """Return a TarInfo object for member `name'. If `name' can not be - found in the archive, KeyError is raised. If a member occurs more - than once in the archive, its last occurrence is assumed to be the - most up-to-date version. - """ - tarinfo = self._getmember(name) - if tarinfo is None: - raise KeyError("filename %r not found" % name) - return tarinfo - - def getmembers(self): - """Return the members of the archive as a list of TarInfo objects. The - list has the same order as the members in the archive. - """ - self._check() - if not self._loaded: # if we want to obtain a list of - self._load() # all members, we first have to - # scan the whole archive. - return self.members - - def getnames(self): - """Return the members of the archive as a list of their names. It has - the same order as the list returned by getmembers(). - """ - return [tarinfo.name for tarinfo in self.getmembers()] - - def gettarinfo(self, name=None, arcname=None, fileobj=None): - """Create a TarInfo object for either the file `name' or the file - object `fileobj' (using os.fstat on its file descriptor). You can - modify some of the TarInfo's attributes before you add it using - addfile(). If given, `arcname' specifies an alternative name for the - file in the archive. - """ - self._check("aw") - - # When fileobj is given, replace name by - # fileobj's real name. - if fileobj is not None: - name = fileobj.name - - # Building the name of the member in the archive. - # Backward slashes are converted to forward slashes, - # Absolute paths are turned to relative paths. - if arcname is None: - arcname = name - drv, arcname = os.path.splitdrive(arcname) - arcname = arcname.replace(os.sep, "/") - arcname = arcname.lstrip("/") - - # Now, fill the TarInfo object with - # information specific for the file. - tarinfo = self.tarinfo() - tarinfo.tarfile = self - - # Use os.stat or os.lstat, depending on platform - # and if symlinks shall be resolved. - if fileobj is None: - if hasattr(os, "lstat") and not self.dereference: - statres = os.lstat(name) - else: - statres = os.stat(name) - else: - statres = os.fstat(fileobj.fileno()) - linkname = "" - - stmd = statres.st_mode - if stat.S_ISREG(stmd): - inode = (statres.st_ino, statres.st_dev) - if not self.dereference and statres.st_nlink > 1 and \ - inode in self.inodes and arcname != self.inodes[inode]: - # Is it a hardlink to an already - # archived file? - type = LNKTYPE - linkname = self.inodes[inode] - else: - # The inode is added only if its valid. - # For win32 it is always 0. - type = REGTYPE - if inode[0]: - self.inodes[inode] = arcname - elif stat.S_ISDIR(stmd): - type = DIRTYPE - elif stat.S_ISFIFO(stmd): - type = FIFOTYPE - elif stat.S_ISLNK(stmd): - type = SYMTYPE - linkname = os.readlink(name) - elif stat.S_ISCHR(stmd): - type = CHRTYPE - elif stat.S_ISBLK(stmd): - type = BLKTYPE - else: - return None - - # Fill the TarInfo object with all - # information we can get. - tarinfo.name = arcname - tarinfo.mode = stmd - tarinfo.uid = statres.st_uid - tarinfo.gid = statres.st_gid - if type == REGTYPE: - tarinfo.size = statres.st_size - else: - tarinfo.size = 0 - tarinfo.mtime = statres.st_mtime - tarinfo.type = type - tarinfo.linkname = linkname - if pwd: - try: - tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0] - except KeyError: - pass - if grp: - try: - tarinfo.gname = grp.getgrgid(tarinfo.gid)[0] - except KeyError: - pass - - if type in (CHRTYPE, BLKTYPE): - if hasattr(os, "major") and hasattr(os, "minor"): - tarinfo.devmajor = os.major(statres.st_rdev) - tarinfo.devminor = os.minor(statres.st_rdev) - return tarinfo - - def list(self, verbose=True): - """Print a table of contents to sys.stdout. If `verbose' is False, only - the names of the members are printed. If it is True, an `ls -l'-like - output is produced. - """ - self._check() - - for tarinfo in self: - if verbose: - print(filemode(tarinfo.mode), end=' ') - print("%s/%s" % (tarinfo.uname or tarinfo.uid, - tarinfo.gname or tarinfo.gid), end=' ') - if tarinfo.ischr() or tarinfo.isblk(): - print("%10s" % ("%d,%d" \ - % (tarinfo.devmajor, tarinfo.devminor)), end=' ') - else: - print("%10d" % tarinfo.size, end=' ') - print("%d-%02d-%02d %02d:%02d:%02d" \ - % time.localtime(tarinfo.mtime)[:6], end=' ') - - print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') - - if verbose: - if tarinfo.issym(): - print("->", tarinfo.linkname, end=' ') - if tarinfo.islnk(): - print("link to", tarinfo.linkname, end=' ') - print() - - def add(self, name, arcname=None, recursive=True, exclude=None, filter=None): - """Add the file `name' to the archive. `name' may be any type of file - (directory, fifo, symbolic link, etc.). If given, `arcname' - specifies an alternative name for the file in the archive. - Directories are added recursively by default. This can be avoided by - setting `recursive' to False. `exclude' is a function that should - return True for each filename to be excluded. `filter' is a function - that expects a TarInfo object argument and returns the changed - TarInfo object, if it returns None the TarInfo object will be - excluded from the archive. - """ - self._check("aw") - - if arcname is None: - arcname = name - - # Exclude pathnames. - if exclude is not None: - import warnings - warnings.warn("use the filter argument instead", - DeprecationWarning, 2) - if exclude(name): - self._dbg(2, "tarfile: Excluded %r" % name) - return - - # Skip if somebody tries to archive the archive... - if self.name is not None and os.path.abspath(name) == self.name: - self._dbg(2, "tarfile: Skipped %r" % name) - return - - self._dbg(1, name) - - # Create a TarInfo object from the file. - tarinfo = self.gettarinfo(name, arcname) - - if tarinfo is None: - self._dbg(1, "tarfile: Unsupported type %r" % name) - return - - # Change or exclude the TarInfo object. - if filter is not None: - tarinfo = filter(tarinfo) - if tarinfo is None: - self._dbg(2, "tarfile: Excluded %r" % name) - return - - # Append the tar header and data to the archive. - if tarinfo.isreg(): - f = bltn_open(name, "rb") - self.addfile(tarinfo, f) - f.close() - - elif tarinfo.isdir(): - self.addfile(tarinfo) - if recursive: - for f in os.listdir(name): - self.add(os.path.join(name, f), os.path.join(arcname, f), - recursive, exclude, filter=filter) - - else: - self.addfile(tarinfo) - - def addfile(self, tarinfo, fileobj=None): - """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is - given, tarinfo.size bytes are read from it and added to the archive. - You can create TarInfo objects using gettarinfo(). - On Windows platforms, `fileobj' should always be opened with mode - 'rb' to avoid irritation about the file size. - """ - self._check("aw") - - tarinfo = copy.copy(tarinfo) - - buf = tarinfo.tobuf(self.format, self.encoding, self.errors) - self.fileobj.write(buf) - self.offset += len(buf) - - # If there's data to follow, append it. - if fileobj is not None: - copyfileobj(fileobj, self.fileobj, tarinfo.size) - blocks, remainder = divmod(tarinfo.size, BLOCKSIZE) - if remainder > 0: - self.fileobj.write(NUL * (BLOCKSIZE - remainder)) - blocks += 1 - self.offset += blocks * BLOCKSIZE - - self.members.append(tarinfo) - - def extractall(self, path=".", members=None): - """Extract all members from the archive to the current working - directory and set owner, modification time and permissions on - directories afterwards. `path' specifies a different directory - to extract to. `members' is optional and must be a subset of the - list returned by getmembers(). - """ - directories = [] - - if members is None: - members = self - - for tarinfo in members: - if tarinfo.isdir(): - # Extract directories with a safe mode. - directories.append(tarinfo) - tarinfo = copy.copy(tarinfo) - tarinfo.mode = 0o700 - # Do not set_attrs directories, as we will do that further down - self.extract(tarinfo, path, set_attrs=not tarinfo.isdir()) - - # Reverse sort directories. - directories.sort(key=lambda a: a.name) - directories.reverse() - - # Set correct owner, mtime and filemode on directories. - for tarinfo in directories: - dirpath = os.path.join(path, tarinfo.name) - try: - self.chown(tarinfo, dirpath) - self.utime(tarinfo, dirpath) - self.chmod(tarinfo, dirpath) - except ExtractError as e: - if self.errorlevel > 1: - raise - else: - self._dbg(1, "tarfile: %s" % e) - - def extract(self, member, path="", set_attrs=True): - """Extract a member from the archive to the current working directory, - using its full name. Its file information is extracted as accurately - as possible. `member' may be a filename or a TarInfo object. You can - specify a different directory using `path'. File attributes (owner, - mtime, mode) are set unless `set_attrs' is False. - """ - self._check("r") - - if isinstance(member, str): - tarinfo = self.getmember(member) - else: - tarinfo = member - - # Prepare the link target for makelink(). - if tarinfo.islnk(): - tarinfo._link_target = os.path.join(path, tarinfo.linkname) - - try: - self._extract_member(tarinfo, os.path.join(path, tarinfo.name), - set_attrs=set_attrs) - except EnvironmentError as e: - if self.errorlevel > 0: - raise - else: - if e.filename is None: - self._dbg(1, "tarfile: %s" % e.strerror) - else: - self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) - except ExtractError as e: - if self.errorlevel > 1: - raise - else: - self._dbg(1, "tarfile: %s" % e) - - def extractfile(self, member): - """Extract a member from the archive as a file object. `member' may be - a filename or a TarInfo object. If `member' is a regular file, a - file-like object is returned. If `member' is a link, a file-like - object is constructed from the link's target. If `member' is none of - the above, None is returned. - The file-like object is read-only and provides the following - methods: read(), readline(), readlines(), seek() and tell() - """ - self._check("r") - - if isinstance(member, str): - tarinfo = self.getmember(member) - else: - tarinfo = member - - if tarinfo.isreg(): - return self.fileobject(self, tarinfo) - - elif tarinfo.type not in SUPPORTED_TYPES: - # If a member's type is unknown, it is treated as a - # regular file. - return self.fileobject(self, tarinfo) - - elif tarinfo.islnk() or tarinfo.issym(): - if isinstance(self.fileobj, _Stream): - # A small but ugly workaround for the case that someone tries - # to extract a (sym)link as a file-object from a non-seekable - # stream of tar blocks. - raise StreamError("cannot extract (sym)link as file object") - else: - # A (sym)link's file object is its target's file object. - return self.extractfile(self._find_link_target(tarinfo)) - else: - # If there's no data associated with the member (directory, chrdev, - # blkdev, etc.), return None instead of a file object. - return None - - def _extract_member(self, tarinfo, targetpath, set_attrs=True): - """Extract the TarInfo object tarinfo to a physical - file called targetpath. - """ - # Fetch the TarInfo object for the given name - # and build the destination pathname, replacing - # forward slashes to platform specific separators. - targetpath = targetpath.rstrip("/") - targetpath = targetpath.replace("/", os.sep) - - # Create all upper directories. - upperdirs = os.path.dirname(targetpath) - if upperdirs and not os.path.exists(upperdirs): - # Create directories that are not part of the archive with - # default permissions. - os.makedirs(upperdirs) - - if tarinfo.islnk() or tarinfo.issym(): - self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname)) - else: - self._dbg(1, tarinfo.name) - - if tarinfo.isreg(): - self.makefile(tarinfo, targetpath) - elif tarinfo.isdir(): - self.makedir(tarinfo, targetpath) - elif tarinfo.isfifo(): - self.makefifo(tarinfo, targetpath) - elif tarinfo.ischr() or tarinfo.isblk(): - self.makedev(tarinfo, targetpath) - elif tarinfo.islnk() or tarinfo.issym(): - self.makelink(tarinfo, targetpath) - elif tarinfo.type not in SUPPORTED_TYPES: - self.makeunknown(tarinfo, targetpath) - else: - self.makefile(tarinfo, targetpath) - - if set_attrs: - self.chown(tarinfo, targetpath) - if not tarinfo.issym(): - self.chmod(tarinfo, targetpath) - self.utime(tarinfo, targetpath) - - #-------------------------------------------------------------------------- - # Below are the different file methods. They are called via - # _extract_member() when extract() is called. They can be replaced in a - # subclass to implement other functionality. - - def makedir(self, tarinfo, targetpath): - """Make a directory called targetpath. - """ - try: - # Use a safe mode for the directory, the real mode is set - # later in _extract_member(). - os.mkdir(targetpath, 0o700) - except EnvironmentError as e: - if e.errno != errno.EEXIST: - raise - - def makefile(self, tarinfo, targetpath): - """Make a file called targetpath. - """ - source = self.fileobj - source.seek(tarinfo.offset_data) - target = bltn_open(targetpath, "wb") - if tarinfo.sparse is not None: - for offset, size in tarinfo.sparse: - target.seek(offset) - copyfileobj(source, target, size) - else: - copyfileobj(source, target, tarinfo.size) - target.seek(tarinfo.size) - target.truncate() - target.close() - - def makeunknown(self, tarinfo, targetpath): - """Make a file from a TarInfo object with an unknown type - at targetpath. - """ - self.makefile(tarinfo, targetpath) - self._dbg(1, "tarfile: Unknown file type %r, " \ - "extracted as regular file." % tarinfo.type) - - def makefifo(self, tarinfo, targetpath): - """Make a fifo called targetpath. - """ - if hasattr(os, "mkfifo"): - os.mkfifo(targetpath) - else: - raise ExtractError("fifo not supported by system") - - def makedev(self, tarinfo, targetpath): - """Make a character or block device called targetpath. - """ - if not hasattr(os, "mknod") or not hasattr(os, "makedev"): - raise ExtractError("special devices not supported by system") - - mode = tarinfo.mode - if tarinfo.isblk(): - mode |= stat.S_IFBLK - else: - mode |= stat.S_IFCHR - - os.mknod(targetpath, mode, - os.makedev(tarinfo.devmajor, tarinfo.devminor)) - - def makelink(self, tarinfo, targetpath): - """Make a (symbolic) link called targetpath. If it cannot be created - (platform limitation), we try to make a copy of the referenced file - instead of a link. - """ - try: - # For systems that support symbolic and hard links. - if tarinfo.issym(): - os.symlink(tarinfo.linkname, targetpath) - else: - # See extract(). - if os.path.exists(tarinfo._link_target): - os.link(tarinfo._link_target, targetpath) - else: - self._extract_member(self._find_link_target(tarinfo), - targetpath) - except symlink_exception: - if tarinfo.issym(): - linkpath = os.path.join(os.path.dirname(tarinfo.name), - tarinfo.linkname) - else: - linkpath = tarinfo.linkname - else: - try: - self._extract_member(self._find_link_target(tarinfo), - targetpath) - except KeyError: - raise ExtractError("unable to resolve link inside archive") - - def chown(self, tarinfo, targetpath): - """Set owner of targetpath according to tarinfo. - """ - if pwd and hasattr(os, "geteuid") and os.geteuid() == 0: - # We have to be root to do so. - try: - g = grp.getgrnam(tarinfo.gname)[2] - except KeyError: - g = tarinfo.gid - try: - u = pwd.getpwnam(tarinfo.uname)[2] - except KeyError: - u = tarinfo.uid - try: - if tarinfo.issym() and hasattr(os, "lchown"): - os.lchown(targetpath, u, g) - else: - if sys.platform != "os2emx": - os.chown(targetpath, u, g) - except EnvironmentError as e: - raise ExtractError("could not change owner") - - def chmod(self, tarinfo, targetpath): - """Set file permissions of targetpath according to tarinfo. - """ - if hasattr(os, 'chmod'): - try: - os.chmod(targetpath, tarinfo.mode) - except EnvironmentError as e: - raise ExtractError("could not change mode") - - def utime(self, tarinfo, targetpath): - """Set modification time of targetpath according to tarinfo. - """ - if not hasattr(os, 'utime'): - return - try: - os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime)) - except EnvironmentError as e: - raise ExtractError("could not change modification time") - - #-------------------------------------------------------------------------- - def next(self): - """Return the next member of the archive as a TarInfo object, when - TarFile is opened for reading. Return None if there is no more - available. - """ - self._check("ra") - if self.firstmember is not None: - m = self.firstmember - self.firstmember = None - return m - - # Read the next block. - self.fileobj.seek(self.offset) - tarinfo = None - while True: - try: - tarinfo = self.tarinfo.fromtarfile(self) - except EOFHeaderError as e: - if self.ignore_zeros: - self._dbg(2, "0x%X: %s" % (self.offset, e)) - self.offset += BLOCKSIZE - continue - except InvalidHeaderError as e: - if self.ignore_zeros: - self._dbg(2, "0x%X: %s" % (self.offset, e)) - self.offset += BLOCKSIZE - continue - elif self.offset == 0: - raise ReadError(str(e)) - except EmptyHeaderError: - if self.offset == 0: - raise ReadError("empty file") - except TruncatedHeaderError as e: - if self.offset == 0: - raise ReadError(str(e)) - except SubsequentHeaderError as e: - raise ReadError(str(e)) - break - - if tarinfo is not None: - self.members.append(tarinfo) - else: - self._loaded = True - - return tarinfo - - #-------------------------------------------------------------------------- - # Little helper methods: - - def _getmember(self, name, tarinfo=None, normalize=False): - """Find an archive member by name from bottom to top. - If tarinfo is given, it is used as the starting point. - """ - # Ensure that all members have been loaded. - members = self.getmembers() - - # Limit the member search list up to tarinfo. - if tarinfo is not None: - members = members[:members.index(tarinfo)] - - if normalize: - name = os.path.normpath(name) - - for member in reversed(members): - if normalize: - member_name = os.path.normpath(member.name) - else: - member_name = member.name - - if name == member_name: - return member - - def _load(self): - """Read through the entire archive file and look for readable - members. - """ - while True: - tarinfo = self.next() - if tarinfo is None: - break - self._loaded = True - - def _check(self, mode=None): - """Check if TarFile is still open, and if the operation's mode - corresponds to TarFile's mode. - """ - if self.closed: - raise IOError("%s is closed" % self.__class__.__name__) - if mode is not None and self.mode not in mode: - raise IOError("bad operation for mode %r" % self.mode) - - def _find_link_target(self, tarinfo): - """Find the target member of a symlink or hardlink member in the - archive. - """ - if tarinfo.issym(): - # Always search the entire archive. - linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname - limit = None - else: - # Search the archive before the link, because a hard link is - # just a reference to an already archived file. - linkname = tarinfo.linkname - limit = tarinfo - - member = self._getmember(linkname, tarinfo=limit, normalize=True) - if member is None: - raise KeyError("linkname %r not found" % linkname) - return member - - def __iter__(self): - """Provide an iterator object. - """ - if self._loaded: - return iter(self.members) - else: - return TarIter(self) - - def _dbg(self, level, msg): - """Write debugging output to sys.stderr. - """ - if level <= self.debug: - print(msg, file=sys.stderr) - - def __enter__(self): - self._check() - return self - - def __exit__(self, type, value, traceback): - if type is None: - self.close() - else: - # An exception occurred. We must not call close() because - # it would try to write end-of-archive blocks and padding. - if not self._extfileobj: - self.fileobj.close() - self.closed = True -# class TarFile - -class TarIter(object): - """Iterator Class. - - for tarinfo in TarFile(...): - suite... - """ - - def __init__(self, tarfile): - """Construct a TarIter object. - """ - self.tarfile = tarfile - self.index = 0 - def __iter__(self): - """Return iterator object. - """ - return self - - def __next__(self): - """Return the next item using TarFile's next() method. - When all members have been read, set TarFile as _loaded. - """ - # Fix for SF #1100429: Under rare circumstances it can - # happen that getmembers() is called during iteration, - # which will cause TarIter to stop prematurely. - if not self.tarfile._loaded: - tarinfo = self.tarfile.next() - if not tarinfo: - self.tarfile._loaded = True - raise StopIteration - else: - try: - tarinfo = self.tarfile.members[self.index] - except IndexError: - raise StopIteration - self.index += 1 - return tarinfo - - next = __next__ # for Python 2.x - -#-------------------- -# exported functions -#-------------------- -def is_tarfile(name): - """Return True if name points to a tar archive that we - are able to handle, else return False. - """ - try: - t = open(name) - t.close() - return True - except TarError: - return False - -bltn_open = open -open = TarFile.open diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/compat.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/compat.py deleted file mode 100644 index ff328c8..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/compat.py +++ /dev/null @@ -1,1120 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from __future__ import absolute_import - -import os -import re -import sys - -try: - import ssl -except ImportError: # pragma: no cover - ssl = None - -if sys.version_info[0] < 3: # pragma: no cover - from StringIO import StringIO - string_types = basestring, - text_type = unicode - from types import FileType as file_type - import __builtin__ as builtins - import ConfigParser as configparser - from ._backport import shutil - from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit - from urllib import (urlretrieve, quote as _quote, unquote, url2pathname, - pathname2url, ContentTooShortError, splittype) - - def quote(s): - if isinstance(s, unicode): - s = s.encode('utf-8') - return _quote(s) - - import urllib2 - from urllib2 import (Request, urlopen, URLError, HTTPError, - HTTPBasicAuthHandler, HTTPPasswordMgr, - HTTPHandler, HTTPRedirectHandler, - build_opener) - if ssl: - from urllib2 import HTTPSHandler - import httplib - import xmlrpclib - import Queue as queue - from HTMLParser import HTMLParser - import htmlentitydefs - raw_input = raw_input - from itertools import ifilter as filter - from itertools import ifilterfalse as filterfalse - - _userprog = None - def splituser(host): - """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" - global _userprog - if _userprog is None: - import re - _userprog = re.compile('^(.*)@(.*)$') - - match = _userprog.match(host) - if match: return match.group(1, 2) - return None, host - -else: # pragma: no cover - from io import StringIO - string_types = str, - text_type = str - from io import TextIOWrapper as file_type - import builtins - import configparser - import shutil - from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote, - unquote, urlsplit, urlunsplit, splittype) - from urllib.request import (urlopen, urlretrieve, Request, url2pathname, - pathname2url, - HTTPBasicAuthHandler, HTTPPasswordMgr, - HTTPHandler, HTTPRedirectHandler, - build_opener) - if ssl: - from urllib.request import HTTPSHandler - from urllib.error import HTTPError, URLError, ContentTooShortError - import http.client as httplib - import urllib.request as urllib2 - import xmlrpc.client as xmlrpclib - import queue - from html.parser import HTMLParser - import html.entities as htmlentitydefs - raw_input = input - from itertools import filterfalse - filter = filter - -try: - from ssl import match_hostname, CertificateError -except ImportError: # pragma: no cover - class CertificateError(ValueError): - pass - - - def _dnsname_match(dn, hostname, max_wildcards=1): - """Matching according to RFC 6125, section 6.4.3 - - http://tools.ietf.org/html/rfc6125#section-6.4.3 - """ - pats = [] - if not dn: - return False - - parts = dn.split('.') - leftmost, remainder = parts[0], parts[1:] - - wildcards = leftmost.count('*') - if wildcards > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survey of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn)) - - # speed up common case w/o wildcards - if not wildcards: - return dn.lower() == hostname.lower() - - # RFC 6125, section 6.4.3, subitem 1. - # The client SHOULD NOT attempt to match a presented identifier in which - # the wildcard character comprises a label other than the left-most label. - if leftmost == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - elif leftmost.startswith('xn--') or hostname.startswith('xn--'): - # RFC 6125, section 6.4.3, subitem 3. - # The client SHOULD NOT attempt to match a presented identifier - # where the wildcard character is embedded within an A-label or - # U-label of an internationalized domain name. - pats.append(re.escape(leftmost)) - else: - # Otherwise, '*' matches any dotless string, e.g. www* - pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) - - # add the remaining fragments, ignore any wildcards - for frag in remainder: - pats.append(re.escape(frag)) - - pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - return pat.match(hostname) - - - def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 - rules are followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError("empty or no certificate, match_hostname needs a " - "SSL socket or SSL context with either " - "CERT_OPTIONAL or CERT_REQUIRED") - dnsnames = [] - san = cert.get('subjectAltName', ()) - for key, value in san: - if key == 'DNS': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get('subject', ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == 'commonName': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise CertificateError("hostname %r " - "doesn't match either of %s" - % (hostname, ', '.join(map(repr, dnsnames)))) - elif len(dnsnames) == 1: - raise CertificateError("hostname %r " - "doesn't match %r" - % (hostname, dnsnames[0])) - else: - raise CertificateError("no appropriate commonName or " - "subjectAltName fields were found") - - -try: - from types import SimpleNamespace as Container -except ImportError: # pragma: no cover - class Container(object): - """ - A generic container for when multiple values need to be returned - """ - def __init__(self, **kwargs): - self.__dict__.update(kwargs) - - -try: - from shutil import which -except ImportError: # pragma: no cover - # Implementation from Python 3.3 - def which(cmd, mode=os.F_OK | os.X_OK, path=None): - """Given a command, mode, and a PATH string, return the path which - conforms to the given mode on the PATH, or None if there is no such - file. - - `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result - of os.environ.get("PATH"), or can be overridden with a custom search - path. - - """ - # Check that a given file can be accessed with the correct mode. - # Additionally check that `file` is not a directory, as on Windows - # directories pass the os.access check. - def _access_check(fn, mode): - return (os.path.exists(fn) and os.access(fn, mode) - and not os.path.isdir(fn)) - - # If we're given a path with a directory part, look it up directly rather - # than referring to PATH directories. This includes checking relative to the - # current directory, e.g. ./script - if os.path.dirname(cmd): - if _access_check(cmd, mode): - return cmd - return None - - if path is None: - path = os.environ.get("PATH", os.defpath) - if not path: - return None - path = path.split(os.pathsep) - - if sys.platform == "win32": - # The current directory takes precedence on Windows. - if not os.curdir in path: - path.insert(0, os.curdir) - - # PATHEXT is necessary to check on Windows. - pathext = os.environ.get("PATHEXT", "").split(os.pathsep) - # See if the given file matches any of the expected path extensions. - # This will allow us to short circuit when given "python.exe". - # If it does match, only test that one, otherwise we have to try - # others. - if any(cmd.lower().endswith(ext.lower()) for ext in pathext): - files = [cmd] - else: - files = [cmd + ext for ext in pathext] - else: - # On other platforms you don't have things like PATHEXT to tell you - # what file suffixes are executable, so just pass on cmd as-is. - files = [cmd] - - seen = set() - for dir in path: - normdir = os.path.normcase(dir) - if not normdir in seen: - seen.add(normdir) - for thefile in files: - name = os.path.join(dir, thefile) - if _access_check(name, mode): - return name - return None - - -# ZipFile is a context manager in 2.7, but not in 2.6 - -from zipfile import ZipFile as BaseZipFile - -if hasattr(BaseZipFile, '__enter__'): # pragma: no cover - ZipFile = BaseZipFile -else: # pragma: no cover - from zipfile import ZipExtFile as BaseZipExtFile - - class ZipExtFile(BaseZipExtFile): - def __init__(self, base): - self.__dict__.update(base.__dict__) - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.close() - # return None, so if an exception occurred, it will propagate - - class ZipFile(BaseZipFile): - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.close() - # return None, so if an exception occurred, it will propagate - - def open(self, *args, **kwargs): - base = BaseZipFile.open(self, *args, **kwargs) - return ZipExtFile(base) - -try: - from platform import python_implementation -except ImportError: # pragma: no cover - def python_implementation(): - """Return a string identifying the Python implementation.""" - if 'PyPy' in sys.version: - return 'PyPy' - if os.name == 'java': - return 'Jython' - if sys.version.startswith('IronPython'): - return 'IronPython' - return 'CPython' - -try: - import sysconfig -except ImportError: # pragma: no cover - from ._backport import sysconfig - -try: - callable = callable -except NameError: # pragma: no cover - from collections import Callable - - def callable(obj): - return isinstance(obj, Callable) - - -try: - fsencode = os.fsencode - fsdecode = os.fsdecode -except AttributeError: # pragma: no cover - # Issue #99: on some systems (e.g. containerised), - # sys.getfilesystemencoding() returns None, and we need a real value, - # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and - # sys.getfilesystemencoding(): the return value is "the user’s preference - # according to the result of nl_langinfo(CODESET), or None if the - # nl_langinfo(CODESET) failed." - _fsencoding = sys.getfilesystemencoding() or 'utf-8' - if _fsencoding == 'mbcs': - _fserrors = 'strict' - else: - _fserrors = 'surrogateescape' - - def fsencode(filename): - if isinstance(filename, bytes): - return filename - elif isinstance(filename, text_type): - return filename.encode(_fsencoding, _fserrors) - else: - raise TypeError("expect bytes or str, not %s" % - type(filename).__name__) - - def fsdecode(filename): - if isinstance(filename, text_type): - return filename - elif isinstance(filename, bytes): - return filename.decode(_fsencoding, _fserrors) - else: - raise TypeError("expect bytes or str, not %s" % - type(filename).__name__) - -try: - from tokenize import detect_encoding -except ImportError: # pragma: no cover - from codecs import BOM_UTF8, lookup - import re - - cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)") - - def _get_normal_name(orig_enc): - """Imitates get_normal_name in tokenizer.c.""" - # Only care about the first 12 characters. - enc = orig_enc[:12].lower().replace("_", "-") - if enc == "utf-8" or enc.startswith("utf-8-"): - return "utf-8" - if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ - enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): - return "iso-8859-1" - return orig_enc - - def detect_encoding(readline): - """ - The detect_encoding() function is used to detect the encoding that should - be used to decode a Python source file. It requires one argument, readline, - in the same way as the tokenize() generator. - - It will call readline a maximum of twice, and return the encoding used - (as a string) and a list of any lines (left as bytes) it has read in. - - It detects the encoding from the presence of a utf-8 bom or an encoding - cookie as specified in pep-0263. If both a bom and a cookie are present, - but disagree, a SyntaxError will be raised. If the encoding cookie is an - invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, - 'utf-8-sig' is returned. - - If no encoding is specified, then the default of 'utf-8' will be returned. - """ - try: - filename = readline.__self__.name - except AttributeError: - filename = None - bom_found = False - encoding = None - default = 'utf-8' - def read_or_stop(): - try: - return readline() - except StopIteration: - return b'' - - def find_cookie(line): - try: - # Decode as UTF-8. Either the line is an encoding declaration, - # in which case it should be pure ASCII, or it must be UTF-8 - # per default encoding. - line_string = line.decode('utf-8') - except UnicodeDecodeError: - msg = "invalid or missing encoding declaration" - if filename is not None: - msg = '{} for {!r}'.format(msg, filename) - raise SyntaxError(msg) - - matches = cookie_re.findall(line_string) - if not matches: - return None - encoding = _get_normal_name(matches[0]) - try: - codec = lookup(encoding) - except LookupError: - # This behaviour mimics the Python interpreter - if filename is None: - msg = "unknown encoding: " + encoding - else: - msg = "unknown encoding for {!r}: {}".format(filename, - encoding) - raise SyntaxError(msg) - - if bom_found: - if codec.name != 'utf-8': - # This behaviour mimics the Python interpreter - if filename is None: - msg = 'encoding problem: utf-8' - else: - msg = 'encoding problem for {!r}: utf-8'.format(filename) - raise SyntaxError(msg) - encoding += '-sig' - return encoding - - first = read_or_stop() - if first.startswith(BOM_UTF8): - bom_found = True - first = first[3:] - default = 'utf-8-sig' - if not first: - return default, [] - - encoding = find_cookie(first) - if encoding: - return encoding, [first] - - second = read_or_stop() - if not second: - return default, [first] - - encoding = find_cookie(second) - if encoding: - return encoding, [first, second] - - return default, [first, second] - -# For converting & <-> & etc. -try: - from html import escape -except ImportError: - from cgi import escape -if sys.version_info[:2] < (3, 4): - unescape = HTMLParser().unescape -else: - from html import unescape - -try: - from collections import ChainMap -except ImportError: # pragma: no cover - from collections import MutableMapping - - try: - from reprlib import recursive_repr as _recursive_repr - except ImportError: - def _recursive_repr(fillvalue='...'): - ''' - Decorator to make a repr function return fillvalue for a recursive - call - ''' - - def decorating_function(user_function): - repr_running = set() - - def wrapper(self): - key = id(self), get_ident() - if key in repr_running: - return fillvalue - repr_running.add(key) - try: - result = user_function(self) - finally: - repr_running.discard(key) - return result - - # Can't use functools.wraps() here because of bootstrap issues - wrapper.__module__ = getattr(user_function, '__module__') - wrapper.__doc__ = getattr(user_function, '__doc__') - wrapper.__name__ = getattr(user_function, '__name__') - wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) - return wrapper - - return decorating_function - - class ChainMap(MutableMapping): - ''' A ChainMap groups multiple dicts (or other mappings) together - to create a single, updateable view. - - The underlying mappings are stored in a list. That list is public and can - accessed or updated using the *maps* attribute. There is no other state. - - Lookups search the underlying mappings successively until a key is found. - In contrast, writes, updates, and deletions only operate on the first - mapping. - - ''' - - def __init__(self, *maps): - '''Initialize a ChainMap by setting *maps* to the given mappings. - If no mappings are provided, a single empty dictionary is used. - - ''' - self.maps = list(maps) or [{}] # always at least one map - - def __missing__(self, key): - raise KeyError(key) - - def __getitem__(self, key): - for mapping in self.maps: - try: - return mapping[key] # can't use 'key in mapping' with defaultdict - except KeyError: - pass - return self.__missing__(key) # support subclasses that define __missing__ - - def get(self, key, default=None): - return self[key] if key in self else default - - def __len__(self): - return len(set().union(*self.maps)) # reuses stored hash values if possible - - def __iter__(self): - return iter(set().union(*self.maps)) - - def __contains__(self, key): - return any(key in m for m in self.maps) - - def __bool__(self): - return any(self.maps) - - @_recursive_repr() - def __repr__(self): - return '{0.__class__.__name__}({1})'.format( - self, ', '.join(map(repr, self.maps))) - - @classmethod - def fromkeys(cls, iterable, *args): - 'Create a ChainMap with a single dict created from the iterable.' - return cls(dict.fromkeys(iterable, *args)) - - def copy(self): - 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' - return self.__class__(self.maps[0].copy(), *self.maps[1:]) - - __copy__ = copy - - def new_child(self): # like Django's Context.push() - 'New ChainMap with a new dict followed by all previous maps.' - return self.__class__({}, *self.maps) - - @property - def parents(self): # like Django's Context.pop() - 'New ChainMap from maps[1:].' - return self.__class__(*self.maps[1:]) - - def __setitem__(self, key, value): - self.maps[0][key] = value - - def __delitem__(self, key): - try: - del self.maps[0][key] - except KeyError: - raise KeyError('Key not found in the first mapping: {!r}'.format(key)) - - def popitem(self): - 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' - try: - return self.maps[0].popitem() - except KeyError: - raise KeyError('No keys found in the first mapping.') - - def pop(self, key, *args): - 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' - try: - return self.maps[0].pop(key, *args) - except KeyError: - raise KeyError('Key not found in the first mapping: {!r}'.format(key)) - - def clear(self): - 'Clear maps[0], leaving maps[1:] intact.' - self.maps[0].clear() - -try: - from importlib.util import cache_from_source # Python >= 3.4 -except ImportError: # pragma: no cover - try: - from imp import cache_from_source - except ImportError: # pragma: no cover - def cache_from_source(path, debug_override=None): - assert path.endswith('.py') - if debug_override is None: - debug_override = __debug__ - if debug_override: - suffix = 'c' - else: - suffix = 'o' - return path + suffix - -try: - from collections import OrderedDict -except ImportError: # pragma: no cover -## {{{ http://code.activestate.com/recipes/576693/ (r9) -# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. -# Passes Python2.7's test suite and incorporates all the latest updates. - try: - from thread import get_ident as _get_ident - except ImportError: - from dummy_thread import get_ident as _get_ident - - try: - from _abcoll import KeysView, ValuesView, ItemsView - except ImportError: - pass - - - class OrderedDict(dict): - 'Dictionary that remembers insertion order' - # An inherited dict maps keys to values. - # The inherited dict provides __getitem__, __len__, __contains__, and get. - # The remaining methods are order-aware. - # Big-O running times for all methods are the same as for regular dictionaries. - - # The internal self.__map dictionary maps keys to links in a doubly linked list. - # The circular doubly linked list starts and ends with a sentinel element. - # The sentinel element never gets deleted (this simplifies the algorithm). - # Each link is stored as a list of length three: [PREV, NEXT, KEY]. - - def __init__(self, *args, **kwds): - '''Initialize an ordered dictionary. Signature is the same as for - regular dictionaries, but keyword arguments are not recommended - because their insertion order is arbitrary. - - ''' - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) - try: - self.__root - except AttributeError: - self.__root = root = [] # sentinel node - root[:] = [root, root, None] - self.__map = {} - self.__update(*args, **kwds) - - def __setitem__(self, key, value, dict_setitem=dict.__setitem__): - 'od.__setitem__(i, y) <==> od[i]=y' - # Setting a new item creates a new link which goes at the end of the linked - # list, and the inherited dictionary is updated with the new key/value pair. - if key not in self: - root = self.__root - last = root[0] - last[1] = root[0] = self.__map[key] = [last, root, key] - dict_setitem(self, key, value) - - def __delitem__(self, key, dict_delitem=dict.__delitem__): - 'od.__delitem__(y) <==> del od[y]' - # Deleting an existing item uses self.__map to find the link which is - # then removed by updating the links in the predecessor and successor nodes. - dict_delitem(self, key) - link_prev, link_next, key = self.__map.pop(key) - link_prev[1] = link_next - link_next[0] = link_prev - - def __iter__(self): - 'od.__iter__() <==> iter(od)' - root = self.__root - curr = root[1] - while curr is not root: - yield curr[2] - curr = curr[1] - - def __reversed__(self): - 'od.__reversed__() <==> reversed(od)' - root = self.__root - curr = root[0] - while curr is not root: - yield curr[2] - curr = curr[0] - - def clear(self): - 'od.clear() -> None. Remove all items from od.' - try: - for node in self.__map.itervalues(): - del node[:] - root = self.__root - root[:] = [root, root, None] - self.__map.clear() - except AttributeError: - pass - dict.clear(self) - - def popitem(self, last=True): - '''od.popitem() -> (k, v), return and remove a (key, value) pair. - Pairs are returned in LIFO order if last is true or FIFO order if false. - - ''' - if not self: - raise KeyError('dictionary is empty') - root = self.__root - if last: - link = root[0] - link_prev = link[0] - link_prev[1] = root - root[0] = link_prev - else: - link = root[1] - link_next = link[1] - root[1] = link_next - link_next[0] = root - key = link[2] - del self.__map[key] - value = dict.pop(self, key) - return key, value - - # -- the following methods do not depend on the internal structure -- - - def keys(self): - 'od.keys() -> list of keys in od' - return list(self) - - def values(self): - 'od.values() -> list of values in od' - return [self[key] for key in self] - - def items(self): - 'od.items() -> list of (key, value) pairs in od' - return [(key, self[key]) for key in self] - - def iterkeys(self): - 'od.iterkeys() -> an iterator over the keys in od' - return iter(self) - - def itervalues(self): - 'od.itervalues -> an iterator over the values in od' - for k in self: - yield self[k] - - def iteritems(self): - 'od.iteritems -> an iterator over the (key, value) items in od' - for k in self: - yield (k, self[k]) - - def update(*args, **kwds): - '''od.update(E, **F) -> None. Update od from dict/iterable E and F. - - If E is a dict instance, does: for k in E: od[k] = E[k] - If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] - Or if E is an iterable of items, does: for k, v in E: od[k] = v - In either case, this is followed by: for k, v in F.items(): od[k] = v - - ''' - if len(args) > 2: - raise TypeError('update() takes at most 2 positional ' - 'arguments (%d given)' % (len(args),)) - elif not args: - raise TypeError('update() takes at least 1 argument (0 given)') - self = args[0] - # Make progressively weaker assumptions about "other" - other = () - if len(args) == 2: - other = args[1] - if isinstance(other, dict): - for key in other: - self[key] = other[key] - elif hasattr(other, 'keys'): - for key in other.keys(): - self[key] = other[key] - else: - for key, value in other: - self[key] = value - for key, value in kwds.items(): - self[key] = value - - __update = update # let subclasses override update without breaking __init__ - - __marker = object() - - def pop(self, key, default=__marker): - '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. - If key is not found, d is returned if given, otherwise KeyError is raised. - - ''' - if key in self: - result = self[key] - del self[key] - return result - if default is self.__marker: - raise KeyError(key) - return default - - def setdefault(self, key, default=None): - 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' - if key in self: - return self[key] - self[key] = default - return default - - def __repr__(self, _repr_running=None): - 'od.__repr__() <==> repr(od)' - if not _repr_running: _repr_running = {} - call_key = id(self), _get_ident() - if call_key in _repr_running: - return '...' - _repr_running[call_key] = 1 - try: - if not self: - return '%s()' % (self.__class__.__name__,) - return '%s(%r)' % (self.__class__.__name__, self.items()) - finally: - del _repr_running[call_key] - - def __reduce__(self): - 'Return state information for pickling' - items = [[k, self[k]] for k in self] - inst_dict = vars(self).copy() - for k in vars(OrderedDict()): - inst_dict.pop(k, None) - if inst_dict: - return (self.__class__, (items,), inst_dict) - return self.__class__, (items,) - - def copy(self): - 'od.copy() -> a shallow copy of od' - return self.__class__(self) - - @classmethod - def fromkeys(cls, iterable, value=None): - '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S - and values equal to v (which defaults to None). - - ''' - d = cls() - for key in iterable: - d[key] = value - return d - - def __eq__(self, other): - '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive - while comparison to a regular mapping is order-insensitive. - - ''' - if isinstance(other, OrderedDict): - return len(self)==len(other) and self.items() == other.items() - return dict.__eq__(self, other) - - def __ne__(self, other): - return not self == other - - # -- the following methods are only used in Python 2.7 -- - - def viewkeys(self): - "od.viewkeys() -> a set-like object providing a view on od's keys" - return KeysView(self) - - def viewvalues(self): - "od.viewvalues() -> an object providing a view on od's values" - return ValuesView(self) - - def viewitems(self): - "od.viewitems() -> a set-like object providing a view on od's items" - return ItemsView(self) - -try: - from logging.config import BaseConfigurator, valid_ident -except ImportError: # pragma: no cover - IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) - - - def valid_ident(s): - m = IDENTIFIER.match(s) - if not m: - raise ValueError('Not a valid Python identifier: %r' % s) - return True - - - # The ConvertingXXX classes are wrappers around standard Python containers, - # and they serve to convert any suitable values in the container. The - # conversion converts base dicts, lists and tuples to their wrapped - # equivalents, whereas strings which match a conversion format are converted - # appropriately. - # - # Each wrapper should have a configurator attribute holding the actual - # configurator to use for conversion. - - class ConvertingDict(dict): - """A converting dictionary wrapper.""" - - def __getitem__(self, key): - value = dict.__getitem__(self, key) - result = self.configurator.convert(value) - #If the converted value is different, save for next time - if value is not result: - self[key] = result - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - def get(self, key, default=None): - value = dict.get(self, key, default) - result = self.configurator.convert(value) - #If the converted value is different, save for next time - if value is not result: - self[key] = result - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - def pop(self, key, default=None): - value = dict.pop(self, key, default) - result = self.configurator.convert(value) - if value is not result: - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - class ConvertingList(list): - """A converting list wrapper.""" - def __getitem__(self, key): - value = list.__getitem__(self, key) - result = self.configurator.convert(value) - #If the converted value is different, save for next time - if value is not result: - self[key] = result - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - def pop(self, idx=-1): - value = list.pop(self, idx) - result = self.configurator.convert(value) - if value is not result: - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - return result - - class ConvertingTuple(tuple): - """A converting tuple wrapper.""" - def __getitem__(self, key): - value = tuple.__getitem__(self, key) - result = self.configurator.convert(value) - if value is not result: - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - class BaseConfigurator(object): - """ - The configurator base class which defines some useful defaults. - """ - - CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$') - - WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') - DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') - INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') - DIGIT_PATTERN = re.compile(r'^\d+$') - - value_converters = { - 'ext' : 'ext_convert', - 'cfg' : 'cfg_convert', - } - - # We might want to use a different one, e.g. importlib - importer = staticmethod(__import__) - - def __init__(self, config): - self.config = ConvertingDict(config) - self.config.configurator = self - - def resolve(self, s): - """ - Resolve strings to objects using standard import and attribute - syntax. - """ - name = s.split('.') - used = name.pop(0) - try: - found = self.importer(used) - for frag in name: - used += '.' + frag - try: - found = getattr(found, frag) - except AttributeError: - self.importer(used) - found = getattr(found, frag) - return found - except ImportError: - e, tb = sys.exc_info()[1:] - v = ValueError('Cannot resolve %r: %s' % (s, e)) - v.__cause__, v.__traceback__ = e, tb - raise v - - def ext_convert(self, value): - """Default converter for the ext:// protocol.""" - return self.resolve(value) - - def cfg_convert(self, value): - """Default converter for the cfg:// protocol.""" - rest = value - m = self.WORD_PATTERN.match(rest) - if m is None: - raise ValueError("Unable to convert %r" % value) - else: - rest = rest[m.end():] - d = self.config[m.groups()[0]] - #print d, rest - while rest: - m = self.DOT_PATTERN.match(rest) - if m: - d = d[m.groups()[0]] - else: - m = self.INDEX_PATTERN.match(rest) - if m: - idx = m.groups()[0] - if not self.DIGIT_PATTERN.match(idx): - d = d[idx] - else: - try: - n = int(idx) # try as number first (most likely) - d = d[n] - except TypeError: - d = d[idx] - if m: - rest = rest[m.end():] - else: - raise ValueError('Unable to convert ' - '%r at %r' % (value, rest)) - #rest should be empty - return d - - def convert(self, value): - """ - Convert values to an appropriate type. dicts, lists and tuples are - replaced by their converting alternatives. Strings are checked to - see if they have a conversion format and are converted if they do. - """ - if not isinstance(value, ConvertingDict) and isinstance(value, dict): - value = ConvertingDict(value) - value.configurator = self - elif not isinstance(value, ConvertingList) and isinstance(value, list): - value = ConvertingList(value) - value.configurator = self - elif not isinstance(value, ConvertingTuple) and\ - isinstance(value, tuple): - value = ConvertingTuple(value) - value.configurator = self - elif isinstance(value, string_types): - m = self.CONVERT_PATTERN.match(value) - if m: - d = m.groupdict() - prefix = d['prefix'] - converter = self.value_converters.get(prefix, None) - if converter: - suffix = d['suffix'] - converter = getattr(self, converter) - value = converter(suffix) - return value - - def configure_custom(self, config): - """Configure an object with a user-supplied factory.""" - c = config.pop('()') - if not callable(c): - c = self.resolve(c) - props = config.pop('.', None) - # Check for valid identifiers - kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) - result = c(**kwargs) - if props: - for name, value in props.items(): - setattr(result, name, value) - return result - - def as_tuple(self, value): - """Utility function which converts lists to tuples.""" - if isinstance(value, list): - value = tuple(value) - return value diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/database.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/database.py deleted file mode 100644 index b13cdac..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/database.py +++ /dev/null @@ -1,1339 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2017 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""PEP 376 implementation.""" - -from __future__ import unicode_literals - -import base64 -import codecs -import contextlib -import hashlib -import logging -import os -import posixpath -import sys -import zipimport - -from . import DistlibException, resources -from .compat import StringIO -from .version import get_scheme, UnsupportedVersionError -from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, - LEGACY_METADATA_FILENAME) -from .util import (parse_requirement, cached_property, parse_name_and_version, - read_exports, write_exports, CSVReader, CSVWriter) - - -__all__ = ['Distribution', 'BaseInstalledDistribution', - 'InstalledDistribution', 'EggInfoDistribution', - 'DistributionPath'] - - -logger = logging.getLogger(__name__) - -EXPORTS_FILENAME = 'pydist-exports.json' -COMMANDS_FILENAME = 'pydist-commands.json' - -DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', - 'RESOURCES', EXPORTS_FILENAME, 'SHARED') - -DISTINFO_EXT = '.dist-info' - - -class _Cache(object): - """ - A simple cache mapping names and .dist-info paths to distributions - """ - def __init__(self): - """ - Initialise an instance. There is normally one for each DistributionPath. - """ - self.name = {} - self.path = {} - self.generated = False - - def clear(self): - """ - Clear the cache, setting it to its initial state. - """ - self.name.clear() - self.path.clear() - self.generated = False - - def add(self, dist): - """ - Add a distribution to the cache. - :param dist: The distribution to add. - """ - if dist.path not in self.path: - self.path[dist.path] = dist - self.name.setdefault(dist.key, []).append(dist) - - -class DistributionPath(object): - """ - Represents a set of distributions installed on a path (typically sys.path). - """ - def __init__(self, path=None, include_egg=False): - """ - Create an instance from a path, optionally including legacy (distutils/ - setuptools/distribute) distributions. - :param path: The path to use, as a list of directories. If not specified, - sys.path is used. - :param include_egg: If True, this instance will look for and return legacy - distributions as well as those based on PEP 376. - """ - if path is None: - path = sys.path - self.path = path - self._include_dist = True - self._include_egg = include_egg - - self._cache = _Cache() - self._cache_egg = _Cache() - self._cache_enabled = True - self._scheme = get_scheme('default') - - def _get_cache_enabled(self): - return self._cache_enabled - - def _set_cache_enabled(self, value): - self._cache_enabled = value - - cache_enabled = property(_get_cache_enabled, _set_cache_enabled) - - def clear_cache(self): - """ - Clears the internal cache. - """ - self._cache.clear() - self._cache_egg.clear() - - - def _yield_distributions(self): - """ - Yield .dist-info and/or .egg(-info) distributions. - """ - # We need to check if we've seen some resources already, because on - # some Linux systems (e.g. some Debian/Ubuntu variants) there are - # symlinks which alias other files in the environment. - seen = set() - for path in self.path: - finder = resources.finder_for_path(path) - if finder is None: - continue - r = finder.find('') - if not r or not r.is_container: - continue - rset = sorted(r.resources) - for entry in rset: - r = finder.find(entry) - if not r or r.path in seen: - continue - if self._include_dist and entry.endswith(DISTINFO_EXT): - possible_filenames = [METADATA_FILENAME, - WHEEL_METADATA_FILENAME, - LEGACY_METADATA_FILENAME] - for metadata_filename in possible_filenames: - metadata_path = posixpath.join(entry, metadata_filename) - pydist = finder.find(metadata_path) - if pydist: - break - else: - continue - - with contextlib.closing(pydist.as_stream()) as stream: - metadata = Metadata(fileobj=stream, scheme='legacy') - logger.debug('Found %s', r.path) - seen.add(r.path) - yield new_dist_class(r.path, metadata=metadata, - env=self) - elif self._include_egg and entry.endswith(('.egg-info', - '.egg')): - logger.debug('Found %s', r.path) - seen.add(r.path) - yield old_dist_class(r.path, self) - - def _generate_cache(self): - """ - Scan the path for distributions and populate the cache with - those that are found. - """ - gen_dist = not self._cache.generated - gen_egg = self._include_egg and not self._cache_egg.generated - if gen_dist or gen_egg: - for dist in self._yield_distributions(): - if isinstance(dist, InstalledDistribution): - self._cache.add(dist) - else: - self._cache_egg.add(dist) - - if gen_dist: - self._cache.generated = True - if gen_egg: - self._cache_egg.generated = True - - @classmethod - def distinfo_dirname(cls, name, version): - """ - The *name* and *version* parameters are converted into their - filename-escaped form, i.e. any ``'-'`` characters are replaced - with ``'_'`` other than the one in ``'dist-info'`` and the one - separating the name from the version number. - - :parameter name: is converted to a standard distribution name by replacing - any runs of non- alphanumeric characters with a single - ``'-'``. - :type name: string - :parameter version: is converted to a standard version string. Spaces - become dots, and all other non-alphanumeric characters - (except dots) become dashes, with runs of multiple - dashes condensed to a single dash. - :type version: string - :returns: directory name - :rtype: string""" - name = name.replace('-', '_') - return '-'.join([name, version]) + DISTINFO_EXT - - def get_distributions(self): - """ - Provides an iterator that looks for distributions and returns - :class:`InstalledDistribution` or - :class:`EggInfoDistribution` instances for each one of them. - - :rtype: iterator of :class:`InstalledDistribution` and - :class:`EggInfoDistribution` instances - """ - if not self._cache_enabled: - for dist in self._yield_distributions(): - yield dist - else: - self._generate_cache() - - for dist in self._cache.path.values(): - yield dist - - if self._include_egg: - for dist in self._cache_egg.path.values(): - yield dist - - def get_distribution(self, name): - """ - Looks for a named distribution on the path. - - This function only returns the first result found, as no more than one - value is expected. If nothing is found, ``None`` is returned. - - :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` - or ``None`` - """ - result = None - name = name.lower() - if not self._cache_enabled: - for dist in self._yield_distributions(): - if dist.key == name: - result = dist - break - else: - self._generate_cache() - - if name in self._cache.name: - result = self._cache.name[name][0] - elif self._include_egg and name in self._cache_egg.name: - result = self._cache_egg.name[name][0] - return result - - def provides_distribution(self, name, version=None): - """ - Iterates over all distributions to find which distributions provide *name*. - If a *version* is provided, it will be used to filter the results. - - This function only returns the first result found, since no more than - one values are expected. If the directory is not found, returns ``None``. - - :parameter version: a version specifier that indicates the version - required, conforming to the format in ``PEP-345`` - - :type name: string - :type version: string - """ - matcher = None - if version is not None: - try: - matcher = self._scheme.matcher('%s (%s)' % (name, version)) - except ValueError: - raise DistlibException('invalid name or version: %r, %r' % - (name, version)) - - for dist in self.get_distributions(): - # We hit a problem on Travis where enum34 was installed and doesn't - # have a provides attribute ... - if not hasattr(dist, 'provides'): - logger.debug('No "provides": %s', dist) - else: - provided = dist.provides - - for p in provided: - p_name, p_ver = parse_name_and_version(p) - if matcher is None: - if p_name == name: - yield dist - break - else: - if p_name == name and matcher.match(p_ver): - yield dist - break - - def get_file_path(self, name, relative_path): - """ - Return the path to a resource file. - """ - dist = self.get_distribution(name) - if dist is None: - raise LookupError('no distribution named %r found' % name) - return dist.get_resource_path(relative_path) - - def get_exported_entries(self, category, name=None): - """ - Return all of the exported entries in a particular category. - - :param category: The category to search for entries. - :param name: If specified, only entries with that name are returned. - """ - for dist in self.get_distributions(): - r = dist.exports - if category in r: - d = r[category] - if name is not None: - if name in d: - yield d[name] - else: - for v in d.values(): - yield v - - -class Distribution(object): - """ - A base class for distributions, whether installed or from indexes. - Either way, it must have some metadata, so that's all that's needed - for construction. - """ - - build_time_dependency = False - """ - Set to True if it's known to be only a build-time dependency (i.e. - not needed after installation). - """ - - requested = False - """A boolean that indicates whether the ``REQUESTED`` metadata file is - present (in other words, whether the package was installed by user - request or it was installed as a dependency).""" - - def __init__(self, metadata): - """ - Initialise an instance. - :param metadata: The instance of :class:`Metadata` describing this - distribution. - """ - self.metadata = metadata - self.name = metadata.name - self.key = self.name.lower() # for case-insensitive comparisons - self.version = metadata.version - self.locator = None - self.digest = None - self.extras = None # additional features requested - self.context = None # environment marker overrides - self.download_urls = set() - self.digests = {} - - @property - def source_url(self): - """ - The source archive download URL for this distribution. - """ - return self.metadata.source_url - - download_url = source_url # Backward compatibility - - @property - def name_and_version(self): - """ - A utility property which displays the name and version in parentheses. - """ - return '%s (%s)' % (self.name, self.version) - - @property - def provides(self): - """ - A set of distribution names and versions provided by this distribution. - :return: A set of "name (version)" strings. - """ - plist = self.metadata.provides - s = '%s (%s)' % (self.name, self.version) - if s not in plist: - plist.append(s) - return plist - - def _get_requirements(self, req_attr): - md = self.metadata - logger.debug('Getting requirements from metadata %r', md.todict()) - reqts = getattr(md, req_attr) - return set(md.get_requirements(reqts, extras=self.extras, - env=self.context)) - - @property - def run_requires(self): - return self._get_requirements('run_requires') - - @property - def meta_requires(self): - return self._get_requirements('meta_requires') - - @property - def build_requires(self): - return self._get_requirements('build_requires') - - @property - def test_requires(self): - return self._get_requirements('test_requires') - - @property - def dev_requires(self): - return self._get_requirements('dev_requires') - - def matches_requirement(self, req): - """ - Say if this instance matches (fulfills) a requirement. - :param req: The requirement to match. - :rtype req: str - :return: True if it matches, else False. - """ - # Requirement may contain extras - parse to lose those - # from what's passed to the matcher - r = parse_requirement(req) - scheme = get_scheme(self.metadata.scheme) - try: - matcher = scheme.matcher(r.requirement) - except UnsupportedVersionError: - # XXX compat-mode if cannot read the version - logger.warning('could not read version %r - using name only', - req) - name = req.split()[0] - matcher = scheme.matcher(name) - - name = matcher.key # case-insensitive - - result = False - for p in self.provides: - p_name, p_ver = parse_name_and_version(p) - if p_name != name: - continue - try: - result = matcher.match(p_ver) - break - except UnsupportedVersionError: - pass - return result - - def __repr__(self): - """ - Return a textual representation of this instance, - """ - if self.source_url: - suffix = ' [%s]' % self.source_url - else: - suffix = '' - return '<Distribution %s (%s)%s>' % (self.name, self.version, suffix) - - def __eq__(self, other): - """ - See if this distribution is the same as another. - :param other: The distribution to compare with. To be equal to one - another. distributions must have the same type, name, - version and source_url. - :return: True if it is the same, else False. - """ - if type(other) is not type(self): - result = False - else: - result = (self.name == other.name and - self.version == other.version and - self.source_url == other.source_url) - return result - - def __hash__(self): - """ - Compute hash in a way which matches the equality test. - """ - return hash(self.name) + hash(self.version) + hash(self.source_url) - - -class BaseInstalledDistribution(Distribution): - """ - This is the base class for installed distributions (whether PEP 376 or - legacy). - """ - - hasher = None - - def __init__(self, metadata, path, env=None): - """ - Initialise an instance. - :param metadata: An instance of :class:`Metadata` which describes the - distribution. This will normally have been initialised - from a metadata file in the ``path``. - :param path: The path of the ``.dist-info`` or ``.egg-info`` - directory for the distribution. - :param env: This is normally the :class:`DistributionPath` - instance where this distribution was found. - """ - super(BaseInstalledDistribution, self).__init__(metadata) - self.path = path - self.dist_path = env - - def get_hash(self, data, hasher=None): - """ - Get the hash of some data, using a particular hash algorithm, if - specified. - - :param data: The data to be hashed. - :type data: bytes - :param hasher: The name of a hash implementation, supported by hashlib, - or ``None``. Examples of valid values are ``'sha1'``, - ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and - ``'sha512'``. If no hasher is specified, the ``hasher`` - attribute of the :class:`InstalledDistribution` instance - is used. If the hasher is determined to be ``None``, MD5 - is used as the hashing algorithm. - :returns: The hash of the data. If a hasher was explicitly specified, - the returned hash will be prefixed with the specified hasher - followed by '='. - :rtype: str - """ - if hasher is None: - hasher = self.hasher - if hasher is None: - hasher = hashlib.md5 - prefix = '' - else: - hasher = getattr(hashlib, hasher) - prefix = '%s=' % self.hasher - digest = hasher(data).digest() - digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') - return '%s%s' % (prefix, digest) - - -class InstalledDistribution(BaseInstalledDistribution): - """ - Created with the *path* of the ``.dist-info`` directory provided to the - constructor. It reads the metadata contained in ``pydist.json`` when it is - instantiated., or uses a passed in Metadata instance (useful for when - dry-run mode is being used). - """ - - hasher = 'sha256' - - def __init__(self, path, metadata=None, env=None): - self.modules = [] - self.finder = finder = resources.finder_for_path(path) - if finder is None: - raise ValueError('finder unavailable for %s' % path) - if env and env._cache_enabled and path in env._cache.path: - metadata = env._cache.path[path].metadata - elif metadata is None: - r = finder.find(METADATA_FILENAME) - # Temporary - for Wheel 0.23 support - if r is None: - r = finder.find(WHEEL_METADATA_FILENAME) - # Temporary - for legacy support - if r is None: - r = finder.find('METADATA') - if r is None: - raise ValueError('no %s found in %s' % (METADATA_FILENAME, - path)) - with contextlib.closing(r.as_stream()) as stream: - metadata = Metadata(fileobj=stream, scheme='legacy') - - super(InstalledDistribution, self).__init__(metadata, path, env) - - if env and env._cache_enabled: - env._cache.add(self) - - r = finder.find('REQUESTED') - self.requested = r is not None - p = os.path.join(path, 'top_level.txt') - if os.path.exists(p): - with open(p, 'rb') as f: - data = f.read() - self.modules = data.splitlines() - - def __repr__(self): - return '<InstalledDistribution %r %s at %r>' % ( - self.name, self.version, self.path) - - def __str__(self): - return "%s %s" % (self.name, self.version) - - def _get_records(self): - """ - Get the list of installed files for the distribution - :return: A list of tuples of path, hash and size. Note that hash and - size might be ``None`` for some entries. The path is exactly - as stored in the file (which is as in PEP 376). - """ - results = [] - r = self.get_distinfo_resource('RECORD') - with contextlib.closing(r.as_stream()) as stream: - with CSVReader(stream=stream) as record_reader: - # Base location is parent dir of .dist-info dir - #base_location = os.path.dirname(self.path) - #base_location = os.path.abspath(base_location) - for row in record_reader: - missing = [None for i in range(len(row), 3)] - path, checksum, size = row + missing - #if not os.path.isabs(path): - # path = path.replace('/', os.sep) - # path = os.path.join(base_location, path) - results.append((path, checksum, size)) - return results - - @cached_property - def exports(self): - """ - Return the information exported by this distribution. - :return: A dictionary of exports, mapping an export category to a dict - of :class:`ExportEntry` instances describing the individual - export entries, and keyed by name. - """ - result = {} - r = self.get_distinfo_resource(EXPORTS_FILENAME) - if r: - result = self.read_exports() - return result - - def read_exports(self): - """ - Read exports data from a file in .ini format. - - :return: A dictionary of exports, mapping an export category to a list - of :class:`ExportEntry` instances describing the individual - export entries. - """ - result = {} - r = self.get_distinfo_resource(EXPORTS_FILENAME) - if r: - with contextlib.closing(r.as_stream()) as stream: - result = read_exports(stream) - return result - - def write_exports(self, exports): - """ - Write a dictionary of exports to a file in .ini format. - :param exports: A dictionary of exports, mapping an export category to - a list of :class:`ExportEntry` instances describing the - individual export entries. - """ - rf = self.get_distinfo_file(EXPORTS_FILENAME) - with open(rf, 'w') as f: - write_exports(exports, f) - - def get_resource_path(self, relative_path): - """ - NOTE: This API may change in the future. - - Return the absolute path to a resource file with the given relative - path. - - :param relative_path: The path, relative to .dist-info, of the resource - of interest. - :return: The absolute path where the resource is to be found. - """ - r = self.get_distinfo_resource('RESOURCES') - with contextlib.closing(r.as_stream()) as stream: - with CSVReader(stream=stream) as resources_reader: - for relative, destination in resources_reader: - if relative == relative_path: - return destination - raise KeyError('no resource file with relative path %r ' - 'is installed' % relative_path) - - def list_installed_files(self): - """ - Iterates over the ``RECORD`` entries and returns a tuple - ``(path, hash, size)`` for each line. - - :returns: iterator of (path, hash, size) - """ - for result in self._get_records(): - yield result - - def write_installed_files(self, paths, prefix, dry_run=False): - """ - Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any - existing ``RECORD`` file is silently overwritten. - - prefix is used to determine when to write absolute paths. - """ - prefix = os.path.join(prefix, '') - base = os.path.dirname(self.path) - base_under_prefix = base.startswith(prefix) - base = os.path.join(base, '') - record_path = self.get_distinfo_file('RECORD') - logger.info('creating %s', record_path) - if dry_run: - return None - with CSVWriter(record_path) as writer: - for path in paths: - if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): - # do not put size and hash, as in PEP-376 - hash_value = size = '' - else: - size = '%d' % os.path.getsize(path) - with open(path, 'rb') as fp: - hash_value = self.get_hash(fp.read()) - if path.startswith(base) or (base_under_prefix and - path.startswith(prefix)): - path = os.path.relpath(path, base) - writer.writerow((path, hash_value, size)) - - # add the RECORD file itself - if record_path.startswith(base): - record_path = os.path.relpath(record_path, base) - writer.writerow((record_path, '', '')) - return record_path - - def check_installed_files(self): - """ - Checks that the hashes and sizes of the files in ``RECORD`` are - matched by the files themselves. Returns a (possibly empty) list of - mismatches. Each entry in the mismatch list will be a tuple consisting - of the path, 'exists', 'size' or 'hash' according to what didn't match - (existence is checked first, then size, then hash), the expected - value and the actual value. - """ - mismatches = [] - base = os.path.dirname(self.path) - record_path = self.get_distinfo_file('RECORD') - for path, hash_value, size in self.list_installed_files(): - if not os.path.isabs(path): - path = os.path.join(base, path) - if path == record_path: - continue - if not os.path.exists(path): - mismatches.append((path, 'exists', True, False)) - elif os.path.isfile(path): - actual_size = str(os.path.getsize(path)) - if size and actual_size != size: - mismatches.append((path, 'size', size, actual_size)) - elif hash_value: - if '=' in hash_value: - hasher = hash_value.split('=', 1)[0] - else: - hasher = None - - with open(path, 'rb') as f: - actual_hash = self.get_hash(f.read(), hasher) - if actual_hash != hash_value: - mismatches.append((path, 'hash', hash_value, actual_hash)) - return mismatches - - @cached_property - def shared_locations(self): - """ - A dictionary of shared locations whose keys are in the set 'prefix', - 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. - The corresponding value is the absolute path of that category for - this distribution, and takes into account any paths selected by the - user at installation time (e.g. via command-line arguments). In the - case of the 'namespace' key, this would be a list of absolute paths - for the roots of namespace packages in this distribution. - - The first time this property is accessed, the relevant information is - read from the SHARED file in the .dist-info directory. - """ - result = {} - shared_path = os.path.join(self.path, 'SHARED') - if os.path.isfile(shared_path): - with codecs.open(shared_path, 'r', encoding='utf-8') as f: - lines = f.read().splitlines() - for line in lines: - key, value = line.split('=', 1) - if key == 'namespace': - result.setdefault(key, []).append(value) - else: - result[key] = value - return result - - def write_shared_locations(self, paths, dry_run=False): - """ - Write shared location information to the SHARED file in .dist-info. - :param paths: A dictionary as described in the documentation for - :meth:`shared_locations`. - :param dry_run: If True, the action is logged but no file is actually - written. - :return: The path of the file written to. - """ - shared_path = os.path.join(self.path, 'SHARED') - logger.info('creating %s', shared_path) - if dry_run: - return None - lines = [] - for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): - path = paths[key] - if os.path.isdir(paths[key]): - lines.append('%s=%s' % (key, path)) - for ns in paths.get('namespace', ()): - lines.append('namespace=%s' % ns) - - with codecs.open(shared_path, 'w', encoding='utf-8') as f: - f.write('\n'.join(lines)) - return shared_path - - def get_distinfo_resource(self, path): - if path not in DIST_FILES: - raise DistlibException('invalid path for a dist-info file: ' - '%r at %r' % (path, self.path)) - finder = resources.finder_for_path(self.path) - if finder is None: - raise DistlibException('Unable to get a finder for %s' % self.path) - return finder.find(path) - - def get_distinfo_file(self, path): - """ - Returns a path located under the ``.dist-info`` directory. Returns a - string representing the path. - - :parameter path: a ``'/'``-separated path relative to the - ``.dist-info`` directory or an absolute path; - If *path* is an absolute path and doesn't start - with the ``.dist-info`` directory path, - a :class:`DistlibException` is raised - :type path: str - :rtype: str - """ - # Check if it is an absolute path # XXX use relpath, add tests - if path.find(os.sep) >= 0: - # it's an absolute path? - distinfo_dirname, path = path.split(os.sep)[-2:] - if distinfo_dirname != self.path.split(os.sep)[-1]: - raise DistlibException( - 'dist-info file %r does not belong to the %r %s ' - 'distribution' % (path, self.name, self.version)) - - # The file must be relative - if path not in DIST_FILES: - raise DistlibException('invalid path for a dist-info file: ' - '%r at %r' % (path, self.path)) - - return os.path.join(self.path, path) - - def list_distinfo_files(self): - """ - Iterates over the ``RECORD`` entries and returns paths for each line if - the path is pointing to a file located in the ``.dist-info`` directory - or one of its subdirectories. - - :returns: iterator of paths - """ - base = os.path.dirname(self.path) - for path, checksum, size in self._get_records(): - # XXX add separator or use real relpath algo - if not os.path.isabs(path): - path = os.path.join(base, path) - if path.startswith(self.path): - yield path - - def __eq__(self, other): - return (isinstance(other, InstalledDistribution) and - self.path == other.path) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - __hash__ = object.__hash__ - - -class EggInfoDistribution(BaseInstalledDistribution): - """Created with the *path* of the ``.egg-info`` directory or file provided - to the constructor. It reads the metadata contained in the file itself, or - if the given path happens to be a directory, the metadata is read from the - file ``PKG-INFO`` under that directory.""" - - requested = True # as we have no way of knowing, assume it was - shared_locations = {} - - def __init__(self, path, env=None): - def set_name_and_version(s, n, v): - s.name = n - s.key = n.lower() # for case-insensitive comparisons - s.version = v - - self.path = path - self.dist_path = env - if env and env._cache_enabled and path in env._cache_egg.path: - metadata = env._cache_egg.path[path].metadata - set_name_and_version(self, metadata.name, metadata.version) - else: - metadata = self._get_metadata(path) - - # Need to be set before caching - set_name_and_version(self, metadata.name, metadata.version) - - if env and env._cache_enabled: - env._cache_egg.add(self) - super(EggInfoDistribution, self).__init__(metadata, path, env) - - def _get_metadata(self, path): - requires = None - - def parse_requires_data(data): - """Create a list of dependencies from a requires.txt file. - - *data*: the contents of a setuptools-produced requires.txt file. - """ - reqs = [] - lines = data.splitlines() - for line in lines: - line = line.strip() - if line.startswith('['): - logger.warning('Unexpected line: quitting requirement scan: %r', - line) - break - r = parse_requirement(line) - if not r: - logger.warning('Not recognised as a requirement: %r', line) - continue - if r.extras: - logger.warning('extra requirements in requires.txt are ' - 'not supported') - if not r.constraints: - reqs.append(r.name) - else: - cons = ', '.join('%s%s' % c for c in r.constraints) - reqs.append('%s (%s)' % (r.name, cons)) - return reqs - - def parse_requires_path(req_path): - """Create a list of dependencies from a requires.txt file. - - *req_path*: the path to a setuptools-produced requires.txt file. - """ - - reqs = [] - try: - with codecs.open(req_path, 'r', 'utf-8') as fp: - reqs = parse_requires_data(fp.read()) - except IOError: - pass - return reqs - - tl_path = tl_data = None - if path.endswith('.egg'): - if os.path.isdir(path): - p = os.path.join(path, 'EGG-INFO') - meta_path = os.path.join(p, 'PKG-INFO') - metadata = Metadata(path=meta_path, scheme='legacy') - req_path = os.path.join(p, 'requires.txt') - tl_path = os.path.join(p, 'top_level.txt') - requires = parse_requires_path(req_path) - else: - # FIXME handle the case where zipfile is not available - zipf = zipimport.zipimporter(path) - fileobj = StringIO( - zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) - metadata = Metadata(fileobj=fileobj, scheme='legacy') - try: - data = zipf.get_data('EGG-INFO/requires.txt') - tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode('utf-8') - requires = parse_requires_data(data.decode('utf-8')) - except IOError: - requires = None - elif path.endswith('.egg-info'): - if os.path.isdir(path): - req_path = os.path.join(path, 'requires.txt') - requires = parse_requires_path(req_path) - path = os.path.join(path, 'PKG-INFO') - tl_path = os.path.join(path, 'top_level.txt') - metadata = Metadata(path=path, scheme='legacy') - else: - raise DistlibException('path must end with .egg-info or .egg, ' - 'got %r' % path) - - if requires: - metadata.add_requirements(requires) - # look for top-level modules in top_level.txt, if present - if tl_data is None: - if tl_path is not None and os.path.exists(tl_path): - with open(tl_path, 'rb') as f: - tl_data = f.read().decode('utf-8') - if not tl_data: - tl_data = [] - else: - tl_data = tl_data.splitlines() - self.modules = tl_data - return metadata - - def __repr__(self): - return '<EggInfoDistribution %r %s at %r>' % ( - self.name, self.version, self.path) - - def __str__(self): - return "%s %s" % (self.name, self.version) - - def check_installed_files(self): - """ - Checks that the hashes and sizes of the files in ``RECORD`` are - matched by the files themselves. Returns a (possibly empty) list of - mismatches. Each entry in the mismatch list will be a tuple consisting - of the path, 'exists', 'size' or 'hash' according to what didn't match - (existence is checked first, then size, then hash), the expected - value and the actual value. - """ - mismatches = [] - record_path = os.path.join(self.path, 'installed-files.txt') - if os.path.exists(record_path): - for path, _, _ in self.list_installed_files(): - if path == record_path: - continue - if not os.path.exists(path): - mismatches.append((path, 'exists', True, False)) - return mismatches - - def list_installed_files(self): - """ - Iterates over the ``installed-files.txt`` entries and returns a tuple - ``(path, hash, size)`` for each line. - - :returns: a list of (path, hash, size) - """ - - def _md5(path): - f = open(path, 'rb') - try: - content = f.read() - finally: - f.close() - return hashlib.md5(content).hexdigest() - - def _size(path): - return os.stat(path).st_size - - record_path = os.path.join(self.path, 'installed-files.txt') - result = [] - if os.path.exists(record_path): - with codecs.open(record_path, 'r', encoding='utf-8') as f: - for line in f: - line = line.strip() - p = os.path.normpath(os.path.join(self.path, line)) - # "./" is present as a marker between installed files - # and installation metadata files - if not os.path.exists(p): - logger.warning('Non-existent file: %s', p) - if p.endswith(('.pyc', '.pyo')): - continue - #otherwise fall through and fail - if not os.path.isdir(p): - result.append((p, _md5(p), _size(p))) - result.append((record_path, None, None)) - return result - - def list_distinfo_files(self, absolute=False): - """ - Iterates over the ``installed-files.txt`` entries and returns paths for - each line if the path is pointing to a file located in the - ``.egg-info`` directory or one of its subdirectories. - - :parameter absolute: If *absolute* is ``True``, each returned path is - transformed into a local absolute path. Otherwise the - raw value from ``installed-files.txt`` is returned. - :type absolute: boolean - :returns: iterator of paths - """ - record_path = os.path.join(self.path, 'installed-files.txt') - if os.path.exists(record_path): - skip = True - with codecs.open(record_path, 'r', encoding='utf-8') as f: - for line in f: - line = line.strip() - if line == './': - skip = False - continue - if not skip: - p = os.path.normpath(os.path.join(self.path, line)) - if p.startswith(self.path): - if absolute: - yield p - else: - yield line - - def __eq__(self, other): - return (isinstance(other, EggInfoDistribution) and - self.path == other.path) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - __hash__ = object.__hash__ - -new_dist_class = InstalledDistribution -old_dist_class = EggInfoDistribution - - -class DependencyGraph(object): - """ - Represents a dependency graph between distributions. - - The dependency relationships are stored in an ``adjacency_list`` that maps - distributions to a list of ``(other, label)`` tuples where ``other`` - is a distribution and the edge is labeled with ``label`` (i.e. the version - specifier, if such was provided). Also, for more efficient traversal, for - every distribution ``x``, a list of predecessors is kept in - ``reverse_list[x]``. An edge from distribution ``a`` to - distribution ``b`` means that ``a`` depends on ``b``. If any missing - dependencies are found, they are stored in ``missing``, which is a - dictionary that maps distributions to a list of requirements that were not - provided by any other distributions. - """ - - def __init__(self): - self.adjacency_list = {} - self.reverse_list = {} - self.missing = {} - - def add_distribution(self, distribution): - """Add the *distribution* to the graph. - - :type distribution: :class:`distutils2.database.InstalledDistribution` - or :class:`distutils2.database.EggInfoDistribution` - """ - self.adjacency_list[distribution] = [] - self.reverse_list[distribution] = [] - #self.missing[distribution] = [] - - def add_edge(self, x, y, label=None): - """Add an edge from distribution *x* to distribution *y* with the given - *label*. - - :type x: :class:`distutils2.database.InstalledDistribution` or - :class:`distutils2.database.EggInfoDistribution` - :type y: :class:`distutils2.database.InstalledDistribution` or - :class:`distutils2.database.EggInfoDistribution` - :type label: ``str`` or ``None`` - """ - self.adjacency_list[x].append((y, label)) - # multiple edges are allowed, so be careful - if x not in self.reverse_list[y]: - self.reverse_list[y].append(x) - - def add_missing(self, distribution, requirement): - """ - Add a missing *requirement* for the given *distribution*. - - :type distribution: :class:`distutils2.database.InstalledDistribution` - or :class:`distutils2.database.EggInfoDistribution` - :type requirement: ``str`` - """ - logger.debug('%s missing %r', distribution, requirement) - self.missing.setdefault(distribution, []).append(requirement) - - def _repr_dist(self, dist): - return '%s %s' % (dist.name, dist.version) - - def repr_node(self, dist, level=1): - """Prints only a subgraph""" - output = [self._repr_dist(dist)] - for other, label in self.adjacency_list[dist]: - dist = self._repr_dist(other) - if label is not None: - dist = '%s [%s]' % (dist, label) - output.append(' ' * level + str(dist)) - suboutput = self.repr_node(other, level + 1) - subs = suboutput.split('\n') - output.extend(subs[1:]) - return '\n'.join(output) - - def to_dot(self, f, skip_disconnected=True): - """Writes a DOT output for the graph to the provided file *f*. - - If *skip_disconnected* is set to ``True``, then all distributions - that are not dependent on any other distribution are skipped. - - :type f: has to support ``file``-like operations - :type skip_disconnected: ``bool`` - """ - disconnected = [] - - f.write("digraph dependencies {\n") - for dist, adjs in self.adjacency_list.items(): - if len(adjs) == 0 and not skip_disconnected: - disconnected.append(dist) - for other, label in adjs: - if not label is None: - f.write('"%s" -> "%s" [label="%s"]\n' % - (dist.name, other.name, label)) - else: - f.write('"%s" -> "%s"\n' % (dist.name, other.name)) - if not skip_disconnected and len(disconnected) > 0: - f.write('subgraph disconnected {\n') - f.write('label = "Disconnected"\n') - f.write('bgcolor = red\n') - - for dist in disconnected: - f.write('"%s"' % dist.name) - f.write('\n') - f.write('}\n') - f.write('}\n') - - def topological_sort(self): - """ - Perform a topological sort of the graph. - :return: A tuple, the first element of which is a topologically sorted - list of distributions, and the second element of which is a - list of distributions that cannot be sorted because they have - circular dependencies and so form a cycle. - """ - result = [] - # Make a shallow copy of the adjacency list - alist = {} - for k, v in self.adjacency_list.items(): - alist[k] = v[:] - while True: - # See what we can remove in this run - to_remove = [] - for k, v in list(alist.items())[:]: - if not v: - to_remove.append(k) - del alist[k] - if not to_remove: - # What's left in alist (if anything) is a cycle. - break - # Remove from the adjacency list of others - for k, v in alist.items(): - alist[k] = [(d, r) for d, r in v if d not in to_remove] - logger.debug('Moving to result: %s', - ['%s (%s)' % (d.name, d.version) for d in to_remove]) - result.extend(to_remove) - return result, list(alist.keys()) - - def __repr__(self): - """Representation of the graph""" - output = [] - for dist, adjs in self.adjacency_list.items(): - output.append(self.repr_node(dist)) - return '\n'.join(output) - - -def make_graph(dists, scheme='default'): - """Makes a dependency graph from the given distributions. - - :parameter dists: a list of distributions - :type dists: list of :class:`distutils2.database.InstalledDistribution` and - :class:`distutils2.database.EggInfoDistribution` instances - :rtype: a :class:`DependencyGraph` instance - """ - scheme = get_scheme(scheme) - graph = DependencyGraph() - provided = {} # maps names to lists of (version, dist) tuples - - # first, build the graph and find out what's provided - for dist in dists: - graph.add_distribution(dist) - - for p in dist.provides: - name, version = parse_name_and_version(p) - logger.debug('Add to provided: %s, %s, %s', name, version, dist) - provided.setdefault(name, []).append((version, dist)) - - # now make the edges - for dist in dists: - requires = (dist.run_requires | dist.meta_requires | - dist.build_requires | dist.dev_requires) - for req in requires: - try: - matcher = scheme.matcher(req) - except UnsupportedVersionError: - # XXX compat-mode if cannot read the version - logger.warning('could not read version %r - using name only', - req) - name = req.split()[0] - matcher = scheme.matcher(name) - - name = matcher.key # case-insensitive - - matched = False - if name in provided: - for version, provider in provided[name]: - try: - match = matcher.match(version) - except UnsupportedVersionError: - match = False - - if match: - graph.add_edge(dist, provider, req) - matched = True - break - if not matched: - graph.add_missing(dist, req) - return graph - - -def get_dependent_dists(dists, dist): - """Recursively generate a list of distributions from *dists* that are - dependent on *dist*. - - :param dists: a list of distributions - :param dist: a distribution, member of *dists* for which we are interested - """ - if dist not in dists: - raise DistlibException('given distribution %r is not a member ' - 'of the list' % dist.name) - graph = make_graph(dists) - - dep = [dist] # dependent distributions - todo = graph.reverse_list[dist] # list of nodes we should inspect - - while todo: - d = todo.pop() - dep.append(d) - for succ in graph.reverse_list[d]: - if succ not in dep: - todo.append(succ) - - dep.pop(0) # remove dist from dep, was there to prevent infinite loops - return dep - - -def get_required_dists(dists, dist): - """Recursively generate a list of distributions from *dists* that are - required by *dist*. - - :param dists: a list of distributions - :param dist: a distribution, member of *dists* for which we are interested - """ - if dist not in dists: - raise DistlibException('given distribution %r is not a member ' - 'of the list' % dist.name) - graph = make_graph(dists) - - req = [] # required distributions - todo = graph.adjacency_list[dist] # list of nodes we should inspect - - while todo: - d = todo.pop()[0] - req.append(d) - for pred in graph.adjacency_list[d]: - if pred not in req: - todo.append(pred) - - return req - - -def make_dist(name, version, **kwargs): - """ - A convenience method for making a dist given just a name and version. - """ - summary = kwargs.pop('summary', 'Placeholder for summary') - md = Metadata(**kwargs) - md.name = name - md.version = version - md.summary = summary or 'Placeholder for summary' - return Distribution(md) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/index.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/index.py deleted file mode 100644 index 2406be2..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/index.py +++ /dev/null @@ -1,516 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -import hashlib -import logging -import os -import shutil -import subprocess -import tempfile -try: - from threading import Thread -except ImportError: - from dummy_threading import Thread - -from . import DistlibException -from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, - urlparse, build_opener, string_types) -from .util import cached_property, zip_dir, ServerProxy - -logger = logging.getLogger(__name__) - -DEFAULT_INDEX = 'https://pypi.python.org/pypi' -DEFAULT_REALM = 'pypi' - -class PackageIndex(object): - """ - This class represents a package index compatible with PyPI, the Python - Package Index. - """ - - boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' - - def __init__(self, url=None): - """ - Initialise an instance. - - :param url: The URL of the index. If not specified, the URL for PyPI is - used. - """ - self.url = url or DEFAULT_INDEX - self.read_configuration() - scheme, netloc, path, params, query, frag = urlparse(self.url) - if params or query or frag or scheme not in ('http', 'https'): - raise DistlibException('invalid repository: %s' % self.url) - self.password_handler = None - self.ssl_verifier = None - self.gpg = None - self.gpg_home = None - with open(os.devnull, 'w') as sink: - # Use gpg by default rather than gpg2, as gpg2 insists on - # prompting for passwords - for s in ('gpg', 'gpg2'): - try: - rc = subprocess.check_call([s, '--version'], stdout=sink, - stderr=sink) - if rc == 0: - self.gpg = s - break - except OSError: - pass - - def _get_pypirc_command(self): - """ - Get the distutils command for interacting with PyPI configurations. - :return: the command. - """ - from distutils.core import Distribution - from distutils.config import PyPIRCCommand - d = Distribution() - return PyPIRCCommand(d) - - def read_configuration(self): - """ - Read the PyPI access configuration as supported by distutils, getting - PyPI to do the actual work. This populates ``username``, ``password``, - ``realm`` and ``url`` attributes from the configuration. - """ - # get distutils to do the work - c = self._get_pypirc_command() - c.repository = self.url - cfg = c._read_pypirc() - self.username = cfg.get('username') - self.password = cfg.get('password') - self.realm = cfg.get('realm', 'pypi') - self.url = cfg.get('repository', self.url) - - def save_configuration(self): - """ - Save the PyPI access configuration. You must have set ``username`` and - ``password`` attributes before calling this method. - - Again, distutils is used to do the actual work. - """ - self.check_credentials() - # get distutils to do the work - c = self._get_pypirc_command() - c._store_pypirc(self.username, self.password) - - def check_credentials(self): - """ - Check that ``username`` and ``password`` have been set, and raise an - exception if not. - """ - if self.username is None or self.password is None: - raise DistlibException('username and password must be set') - pm = HTTPPasswordMgr() - _, netloc, _, _, _, _ = urlparse(self.url) - pm.add_password(self.realm, netloc, self.username, self.password) - self.password_handler = HTTPBasicAuthHandler(pm) - - def register(self, metadata): - """ - Register a distribution on PyPI, using the provided metadata. - - :param metadata: A :class:`Metadata` instance defining at least a name - and version number for the distribution to be - registered. - :return: The HTTP response received from PyPI upon submission of the - request. - """ - self.check_credentials() - metadata.validate() - d = metadata.todict() - d[':action'] = 'verify' - request = self.encode_request(d.items(), []) - response = self.send_request(request) - d[':action'] = 'submit' - request = self.encode_request(d.items(), []) - return self.send_request(request) - - def _reader(self, name, stream, outbuf): - """ - Thread runner for reading lines of from a subprocess into a buffer. - - :param name: The logical name of the stream (used for logging only). - :param stream: The stream to read from. This will typically a pipe - connected to the output stream of a subprocess. - :param outbuf: The list to append the read lines to. - """ - while True: - s = stream.readline() - if not s: - break - s = s.decode('utf-8').rstrip() - outbuf.append(s) - logger.debug('%s: %s' % (name, s)) - stream.close() - - def get_sign_command(self, filename, signer, sign_password, - keystore=None): - """ - Return a suitable command for signing a file. - - :param filename: The pathname to the file to be signed. - :param signer: The identifier of the signer of the file. - :param sign_password: The passphrase for the signer's - private key used for signing. - :param keystore: The path to a directory which contains the keys - used in verification. If not specified, the - instance's ``gpg_home`` attribute is used instead. - :return: The signing command as a list suitable to be - passed to :class:`subprocess.Popen`. - """ - cmd = [self.gpg, '--status-fd', '2', '--no-tty'] - if keystore is None: - keystore = self.gpg_home - if keystore: - cmd.extend(['--homedir', keystore]) - if sign_password is not None: - cmd.extend(['--batch', '--passphrase-fd', '0']) - td = tempfile.mkdtemp() - sf = os.path.join(td, os.path.basename(filename) + '.asc') - cmd.extend(['--detach-sign', '--armor', '--local-user', - signer, '--output', sf, filename]) - logger.debug('invoking: %s', ' '.join(cmd)) - return cmd, sf - - def run_command(self, cmd, input_data=None): - """ - Run a command in a child process , passing it any input data specified. - - :param cmd: The command to run. - :param input_data: If specified, this must be a byte string containing - data to be sent to the child process. - :return: A tuple consisting of the subprocess' exit code, a list of - lines read from the subprocess' ``stdout``, and a list of - lines read from the subprocess' ``stderr``. - """ - kwargs = { - 'stdout': subprocess.PIPE, - 'stderr': subprocess.PIPE, - } - if input_data is not None: - kwargs['stdin'] = subprocess.PIPE - stdout = [] - stderr = [] - p = subprocess.Popen(cmd, **kwargs) - # We don't use communicate() here because we may need to - # get clever with interacting with the command - t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) - t1.start() - t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) - t2.start() - if input_data is not None: - p.stdin.write(input_data) - p.stdin.close() - - p.wait() - t1.join() - t2.join() - return p.returncode, stdout, stderr - - def sign_file(self, filename, signer, sign_password, keystore=None): - """ - Sign a file. - - :param filename: The pathname to the file to be signed. - :param signer: The identifier of the signer of the file. - :param sign_password: The passphrase for the signer's - private key used for signing. - :param keystore: The path to a directory which contains the keys - used in signing. If not specified, the instance's - ``gpg_home`` attribute is used instead. - :return: The absolute pathname of the file where the signature is - stored. - """ - cmd, sig_file = self.get_sign_command(filename, signer, sign_password, - keystore) - rc, stdout, stderr = self.run_command(cmd, - sign_password.encode('utf-8')) - if rc != 0: - raise DistlibException('sign command failed with error ' - 'code %s' % rc) - return sig_file - - def upload_file(self, metadata, filename, signer=None, sign_password=None, - filetype='sdist', pyversion='source', keystore=None): - """ - Upload a release file to the index. - - :param metadata: A :class:`Metadata` instance defining at least a name - and version number for the file to be uploaded. - :param filename: The pathname of the file to be uploaded. - :param signer: The identifier of the signer of the file. - :param sign_password: The passphrase for the signer's - private key used for signing. - :param filetype: The type of the file being uploaded. This is the - distutils command which produced that file, e.g. - ``sdist`` or ``bdist_wheel``. - :param pyversion: The version of Python which the release relates - to. For code compatible with any Python, this would - be ``source``, otherwise it would be e.g. ``3.2``. - :param keystore: The path to a directory which contains the keys - used in signing. If not specified, the instance's - ``gpg_home`` attribute is used instead. - :return: The HTTP response received from PyPI upon submission of the - request. - """ - self.check_credentials() - if not os.path.exists(filename): - raise DistlibException('not found: %s' % filename) - metadata.validate() - d = metadata.todict() - sig_file = None - if signer: - if not self.gpg: - logger.warning('no signing program available - not signed') - else: - sig_file = self.sign_file(filename, signer, sign_password, - keystore) - with open(filename, 'rb') as f: - file_data = f.read() - md5_digest = hashlib.md5(file_data).hexdigest() - sha256_digest = hashlib.sha256(file_data).hexdigest() - d.update({ - ':action': 'file_upload', - 'protocol_version': '1', - 'filetype': filetype, - 'pyversion': pyversion, - 'md5_digest': md5_digest, - 'sha256_digest': sha256_digest, - }) - files = [('content', os.path.basename(filename), file_data)] - if sig_file: - with open(sig_file, 'rb') as f: - sig_data = f.read() - files.append(('gpg_signature', os.path.basename(sig_file), - sig_data)) - shutil.rmtree(os.path.dirname(sig_file)) - request = self.encode_request(d.items(), files) - return self.send_request(request) - - def upload_documentation(self, metadata, doc_dir): - """ - Upload documentation to the index. - - :param metadata: A :class:`Metadata` instance defining at least a name - and version number for the documentation to be - uploaded. - :param doc_dir: The pathname of the directory which contains the - documentation. This should be the directory that - contains the ``index.html`` for the documentation. - :return: The HTTP response received from PyPI upon submission of the - request. - """ - self.check_credentials() - if not os.path.isdir(doc_dir): - raise DistlibException('not a directory: %r' % doc_dir) - fn = os.path.join(doc_dir, 'index.html') - if not os.path.exists(fn): - raise DistlibException('not found: %r' % fn) - metadata.validate() - name, version = metadata.name, metadata.version - zip_data = zip_dir(doc_dir).getvalue() - fields = [(':action', 'doc_upload'), - ('name', name), ('version', version)] - files = [('content', name, zip_data)] - request = self.encode_request(fields, files) - return self.send_request(request) - - def get_verify_command(self, signature_filename, data_filename, - keystore=None): - """ - Return a suitable command for verifying a file. - - :param signature_filename: The pathname to the file containing the - signature. - :param data_filename: The pathname to the file containing the - signed data. - :param keystore: The path to a directory which contains the keys - used in verification. If not specified, the - instance's ``gpg_home`` attribute is used instead. - :return: The verifying command as a list suitable to be - passed to :class:`subprocess.Popen`. - """ - cmd = [self.gpg, '--status-fd', '2', '--no-tty'] - if keystore is None: - keystore = self.gpg_home - if keystore: - cmd.extend(['--homedir', keystore]) - cmd.extend(['--verify', signature_filename, data_filename]) - logger.debug('invoking: %s', ' '.join(cmd)) - return cmd - - def verify_signature(self, signature_filename, data_filename, - keystore=None): - """ - Verify a signature for a file. - - :param signature_filename: The pathname to the file containing the - signature. - :param data_filename: The pathname to the file containing the - signed data. - :param keystore: The path to a directory which contains the keys - used in verification. If not specified, the - instance's ``gpg_home`` attribute is used instead. - :return: True if the signature was verified, else False. - """ - if not self.gpg: - raise DistlibException('verification unavailable because gpg ' - 'unavailable') - cmd = self.get_verify_command(signature_filename, data_filename, - keystore) - rc, stdout, stderr = self.run_command(cmd) - if rc not in (0, 1): - raise DistlibException('verify command failed with error ' - 'code %s' % rc) - return rc == 0 - - def download_file(self, url, destfile, digest=None, reporthook=None): - """ - This is a convenience method for downloading a file from an URL. - Normally, this will be a file from the index, though currently - no check is made for this (i.e. a file can be downloaded from - anywhere). - - The method is just like the :func:`urlretrieve` function in the - standard library, except that it allows digest computation to be - done during download and checking that the downloaded data - matched any expected value. - - :param url: The URL of the file to be downloaded (assumed to be - available via an HTTP GET request). - :param destfile: The pathname where the downloaded file is to be - saved. - :param digest: If specified, this must be a (hasher, value) - tuple, where hasher is the algorithm used (e.g. - ``'md5'``) and ``value`` is the expected value. - :param reporthook: The same as for :func:`urlretrieve` in the - standard library. - """ - if digest is None: - digester = None - logger.debug('No digest specified') - else: - if isinstance(digest, (list, tuple)): - hasher, digest = digest - else: - hasher = 'md5' - digester = getattr(hashlib, hasher)() - logger.debug('Digest specified: %s' % digest) - # The following code is equivalent to urlretrieve. - # We need to do it this way so that we can compute the - # digest of the file as we go. - with open(destfile, 'wb') as dfp: - # addinfourl is not a context manager on 2.x - # so we have to use try/finally - sfp = self.send_request(Request(url)) - try: - headers = sfp.info() - blocksize = 8192 - size = -1 - read = 0 - blocknum = 0 - if "content-length" in headers: - size = int(headers["Content-Length"]) - if reporthook: - reporthook(blocknum, blocksize, size) - while True: - block = sfp.read(blocksize) - if not block: - break - read += len(block) - dfp.write(block) - if digester: - digester.update(block) - blocknum += 1 - if reporthook: - reporthook(blocknum, blocksize, size) - finally: - sfp.close() - - # check that we got the whole file, if we can - if size >= 0 and read < size: - raise DistlibException( - 'retrieval incomplete: got only %d out of %d bytes' - % (read, size)) - # if we have a digest, it must match. - if digester: - actual = digester.hexdigest() - if digest != actual: - raise DistlibException('%s digest mismatch for %s: expected ' - '%s, got %s' % (hasher, destfile, - digest, actual)) - logger.debug('Digest verified: %s', digest) - - def send_request(self, req): - """ - Send a standard library :class:`Request` to PyPI and return its - response. - - :param req: The request to send. - :return: The HTTP response from PyPI (a standard library HTTPResponse). - """ - handlers = [] - if self.password_handler: - handlers.append(self.password_handler) - if self.ssl_verifier: - handlers.append(self.ssl_verifier) - opener = build_opener(*handlers) - return opener.open(req) - - def encode_request(self, fields, files): - """ - Encode fields and files for posting to an HTTP server. - - :param fields: The fields to send as a list of (fieldname, value) - tuples. - :param files: The files to send as a list of (fieldname, filename, - file_bytes) tuple. - """ - # Adapted from packaging, which in turn was adapted from - # http://code.activestate.com/recipes/146306 - - parts = [] - boundary = self.boundary - for k, values in fields: - if not isinstance(values, (list, tuple)): - values = [values] - - for v in values: - parts.extend(( - b'--' + boundary, - ('Content-Disposition: form-data; name="%s"' % - k).encode('utf-8'), - b'', - v.encode('utf-8'))) - for key, filename, value in files: - parts.extend(( - b'--' + boundary, - ('Content-Disposition: form-data; name="%s"; filename="%s"' % - (key, filename)).encode('utf-8'), - b'', - value)) - - parts.extend((b'--' + boundary + b'--', b'')) - - body = b'\r\n'.join(parts) - ct = b'multipart/form-data; boundary=' + boundary - headers = { - 'Content-type': ct, - 'Content-length': str(len(body)) - } - return Request(self.url, body, headers) - - def search(self, terms, operator=None): - if isinstance(terms, string_types): - terms = {'name': terms} - rpc_proxy = ServerProxy(self.url, timeout=3.0) - try: - return rpc_proxy.search(terms, operator or 'and') - finally: - rpc_proxy('close')() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/locators.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/locators.py deleted file mode 100644 index 5c655c3..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/locators.py +++ /dev/null @@ -1,1295 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2015 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# - -import gzip -from io import BytesIO -import json -import logging -import os -import posixpath -import re -try: - import threading -except ImportError: # pragma: no cover - import dummy_threading as threading -import zlib - -from . import DistlibException -from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, - queue, quote, unescape, string_types, build_opener, - HTTPRedirectHandler as BaseRedirectHandler, text_type, - Request, HTTPError, URLError) -from .database import Distribution, DistributionPath, make_dist -from .metadata import Metadata, MetadataInvalidError -from .util import (cached_property, parse_credentials, ensure_slash, - split_filename, get_project_data, parse_requirement, - parse_name_and_version, ServerProxy, normalize_name) -from .version import get_scheme, UnsupportedVersionError -from .wheel import Wheel, is_compatible - -logger = logging.getLogger(__name__) - -HASHER_HASH = re.compile(r'^(\w+)=([a-f0-9]+)') -CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I) -HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml') -DEFAULT_INDEX = 'https://pypi.python.org/pypi' - -def get_all_distribution_names(url=None): - """ - Return all distribution names known by an index. - :param url: The URL of the index. - :return: A list of all known distribution names. - """ - if url is None: - url = DEFAULT_INDEX - client = ServerProxy(url, timeout=3.0) - try: - return client.list_packages() - finally: - client('close')() - -class RedirectHandler(BaseRedirectHandler): - """ - A class to work around a bug in some Python 3.2.x releases. - """ - # There's a bug in the base version for some 3.2.x - # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header - # returns e.g. /abc, it bails because it says the scheme '' - # is bogus, when actually it should use the request's - # URL for the scheme. See Python issue #13696. - def http_error_302(self, req, fp, code, msg, headers): - # Some servers (incorrectly) return multiple Location headers - # (so probably same goes for URI). Use first header. - newurl = None - for key in ('location', 'uri'): - if key in headers: - newurl = headers[key] - break - if newurl is None: # pragma: no cover - return - urlparts = urlparse(newurl) - if urlparts.scheme == '': - newurl = urljoin(req.get_full_url(), newurl) - if hasattr(headers, 'replace_header'): - headers.replace_header(key, newurl) - else: - headers[key] = newurl - return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, - headers) - - http_error_301 = http_error_303 = http_error_307 = http_error_302 - -class Locator(object): - """ - A base class for locators - things that locate distributions. - """ - source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz') - binary_extensions = ('.egg', '.exe', '.whl') - excluded_extensions = ('.pdf',) - - # A list of tags indicating which wheels you want to match. The default - # value of None matches against the tags compatible with the running - # Python. If you want to match other values, set wheel_tags on a locator - # instance to a list of tuples (pyver, abi, arch) which you want to match. - wheel_tags = None - - downloadable_extensions = source_extensions + ('.whl',) - - def __init__(self, scheme='default'): - """ - Initialise an instance. - :param scheme: Because locators look for most recent versions, they - need to know the version scheme to use. This specifies - the current PEP-recommended scheme - use ``'legacy'`` - if you need to support existing distributions on PyPI. - """ - self._cache = {} - self.scheme = scheme - # Because of bugs in some of the handlers on some of the platforms, - # we use our own opener rather than just using urlopen. - self.opener = build_opener(RedirectHandler()) - # If get_project() is called from locate(), the matcher instance - # is set from the requirement passed to locate(). See issue #18 for - # why this can be useful to know. - self.matcher = None - self.errors = queue.Queue() - - def get_errors(self): - """ - Return any errors which have occurred. - """ - result = [] - while not self.errors.empty(): # pragma: no cover - try: - e = self.errors.get(False) - result.append(e) - except self.errors.Empty: - continue - self.errors.task_done() - return result - - def clear_errors(self): - """ - Clear any errors which may have been logged. - """ - # Just get the errors and throw them away - self.get_errors() - - def clear_cache(self): - self._cache.clear() - - def _get_scheme(self): - return self._scheme - - def _set_scheme(self, value): - self._scheme = value - - scheme = property(_get_scheme, _set_scheme) - - def _get_project(self, name): - """ - For a given project, get a dictionary mapping available versions to Distribution - instances. - - This should be implemented in subclasses. - - If called from a locate() request, self.matcher will be set to a - matcher for the requirement to satisfy, otherwise it will be None. - """ - raise NotImplementedError('Please implement in the subclass') - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - raise NotImplementedError('Please implement in the subclass') - - def get_project(self, name): - """ - For a given project, get a dictionary mapping available versions to Distribution - instances. - - This calls _get_project to do all the work, and just implements a caching layer on top. - """ - if self._cache is None: # pragma: no cover - result = self._get_project(name) - elif name in self._cache: - result = self._cache[name] - else: - self.clear_errors() - result = self._get_project(name) - self._cache[name] = result - return result - - def score_url(self, url): - """ - Give an url a score which can be used to choose preferred URLs - for a given project release. - """ - t = urlparse(url) - basename = posixpath.basename(t.path) - compatible = True - is_wheel = basename.endswith('.whl') - is_downloadable = basename.endswith(self.downloadable_extensions) - if is_wheel: - compatible = is_compatible(Wheel(basename), self.wheel_tags) - return (t.scheme == 'https', 'pypi.python.org' in t.netloc, - is_downloadable, is_wheel, compatible, basename) - - def prefer_url(self, url1, url2): - """ - Choose one of two URLs where both are candidates for distribution - archives for the same version of a distribution (for example, - .tar.gz vs. zip). - - The current implementation favours https:// URLs over http://, archives - from PyPI over those from other locations, wheel compatibility (if a - wheel) and then the archive name. - """ - result = url2 - if url1: - s1 = self.score_url(url1) - s2 = self.score_url(url2) - if s1 > s2: - result = url1 - if result != url2: - logger.debug('Not replacing %r with %r', url1, url2) - else: - logger.debug('Replacing %r with %r', url1, url2) - return result - - def split_filename(self, filename, project_name): - """ - Attempt to split a filename in project name, version and Python version. - """ - return split_filename(filename, project_name) - - def convert_url_to_download_info(self, url, project_name): - """ - See if a URL is a candidate for a download URL for a project (the URL - has typically been scraped from an HTML page). - - If it is, a dictionary is returned with keys "name", "version", - "filename" and "url"; otherwise, None is returned. - """ - def same_project(name1, name2): - return normalize_name(name1) == normalize_name(name2) - - result = None - scheme, netloc, path, params, query, frag = urlparse(url) - if frag.lower().startswith('egg='): # pragma: no cover - logger.debug('%s: version hint in fragment: %r', - project_name, frag) - m = HASHER_HASH.match(frag) - if m: - algo, digest = m.groups() - else: - algo, digest = None, None - origpath = path - if path and path[-1] == '/': # pragma: no cover - path = path[:-1] - if path.endswith('.whl'): - try: - wheel = Wheel(path) - if not is_compatible(wheel, self.wheel_tags): - logger.debug('Wheel not compatible: %s', path) - else: - if project_name is None: - include = True - else: - include = same_project(wheel.name, project_name) - if include: - result = { - 'name': wheel.name, - 'version': wheel.version, - 'filename': wheel.filename, - 'url': urlunparse((scheme, netloc, origpath, - params, query, '')), - 'python-version': ', '.join( - ['.'.join(list(v[2:])) for v in wheel.pyver]), - } - except Exception as e: # pragma: no cover - logger.warning('invalid path for wheel: %s', path) - elif not path.endswith(self.downloadable_extensions): # pragma: no cover - logger.debug('Not downloadable: %s', path) - else: # downloadable extension - path = filename = posixpath.basename(path) - for ext in self.downloadable_extensions: - if path.endswith(ext): - path = path[:-len(ext)] - t = self.split_filename(path, project_name) - if not t: # pragma: no cover - logger.debug('No match for project/version: %s', path) - else: - name, version, pyver = t - if not project_name or same_project(project_name, name): - result = { - 'name': name, - 'version': version, - 'filename': filename, - 'url': urlunparse((scheme, netloc, origpath, - params, query, '')), - #'packagetype': 'sdist', - } - if pyver: # pragma: no cover - result['python-version'] = pyver - break - if result and algo: - result['%s_digest' % algo] = digest - return result - - def _get_digest(self, info): - """ - Get a digest from a dictionary by looking at keys of the form - 'algo_digest'. - - Returns a 2-tuple (algo, digest) if found, else None. Currently - looks only for SHA256, then MD5. - """ - result = None - for algo in ('sha256', 'md5'): - key = '%s_digest' % algo - if key in info: - result = (algo, info[key]) - break - return result - - def _update_version_data(self, result, info): - """ - Update a result dictionary (the final result from _get_project) with a - dictionary for a specific version, which typically holds information - gleaned from a filename or URL for an archive for the distribution. - """ - name = info.pop('name') - version = info.pop('version') - if version in result: - dist = result[version] - md = dist.metadata - else: - dist = make_dist(name, version, scheme=self.scheme) - md = dist.metadata - dist.digest = digest = self._get_digest(info) - url = info['url'] - result['digests'][url] = digest - if md.source_url != info['url']: - md.source_url = self.prefer_url(md.source_url, url) - result['urls'].setdefault(version, set()).add(url) - dist.locator = self - result[version] = dist - - def locate(self, requirement, prereleases=False): - """ - Find the most recent distribution which matches the given - requirement. - - :param requirement: A requirement of the form 'foo (1.0)' or perhaps - 'foo (>= 1.0, < 2.0, != 1.3)' - :param prereleases: If ``True``, allow pre-release versions - to be located. Otherwise, pre-release versions - are not returned. - :return: A :class:`Distribution` instance, or ``None`` if no such - distribution could be located. - """ - result = None - r = parse_requirement(requirement) - if r is None: # pragma: no cover - raise DistlibException('Not a valid requirement: %r' % requirement) - scheme = get_scheme(self.scheme) - self.matcher = matcher = scheme.matcher(r.requirement) - logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) - versions = self.get_project(r.name) - if len(versions) > 2: # urls and digests keys are present - # sometimes, versions are invalid - slist = [] - vcls = matcher.version_class - for k in versions: - if k in ('urls', 'digests'): - continue - try: - if not matcher.match(k): - logger.debug('%s did not match %r', matcher, k) - else: - if prereleases or not vcls(k).is_prerelease: - slist.append(k) - else: - logger.debug('skipping pre-release ' - 'version %s of %s', k, matcher.name) - except Exception: # pragma: no cover - logger.warning('error matching %s with %r', matcher, k) - pass # slist.append(k) - if len(slist) > 1: - slist = sorted(slist, key=scheme.key) - if slist: - logger.debug('sorted list: %s', slist) - version = slist[-1] - result = versions[version] - if result: - if r.extras: - result.extras = r.extras - result.download_urls = versions.get('urls', {}).get(version, set()) - d = {} - sd = versions.get('digests', {}) - for url in result.download_urls: - if url in sd: # pragma: no cover - d[url] = sd[url] - result.digests = d - self.matcher = None - return result - - -class PyPIRPCLocator(Locator): - """ - This locator uses XML-RPC to locate distributions. It therefore - cannot be used with simple mirrors (that only mirror file content). - """ - def __init__(self, url, **kwargs): - """ - Initialise an instance. - - :param url: The URL to use for XML-RPC. - :param kwargs: Passed to the superclass constructor. - """ - super(PyPIRPCLocator, self).__init__(**kwargs) - self.base_url = url - self.client = ServerProxy(url, timeout=3.0) - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - return set(self.client.list_packages()) - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - versions = self.client.package_releases(name, True) - for v in versions: - urls = self.client.release_urls(name, v) - data = self.client.release_data(name, v) - metadata = Metadata(scheme=self.scheme) - metadata.name = data['name'] - metadata.version = data['version'] - metadata.license = data.get('license') - metadata.keywords = data.get('keywords', []) - metadata.summary = data.get('summary') - dist = Distribution(metadata) - if urls: - info = urls[0] - metadata.source_url = info['url'] - dist.digest = self._get_digest(info) - dist.locator = self - result[v] = dist - for info in urls: - url = info['url'] - digest = self._get_digest(info) - result['urls'].setdefault(v, set()).add(url) - result['digests'][url] = digest - return result - -class PyPIJSONLocator(Locator): - """ - This locator uses PyPI's JSON interface. It's very limited in functionality - and probably not worth using. - """ - def __init__(self, url, **kwargs): - super(PyPIJSONLocator, self).__init__(**kwargs) - self.base_url = ensure_slash(url) - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - raise NotImplementedError('Not available from this locator') - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - url = urljoin(self.base_url, '%s/json' % quote(name)) - try: - resp = self.opener.open(url) - data = resp.read().decode() # for now - d = json.loads(data) - md = Metadata(scheme=self.scheme) - data = d['info'] - md.name = data['name'] - md.version = data['version'] - md.license = data.get('license') - md.keywords = data.get('keywords', []) - md.summary = data.get('summary') - dist = Distribution(md) - dist.locator = self - urls = d['urls'] - result[md.version] = dist - for info in d['urls']: - url = info['url'] - dist.download_urls.add(url) - dist.digests[url] = self._get_digest(info) - result['urls'].setdefault(md.version, set()).add(url) - result['digests'][url] = self._get_digest(info) - # Now get other releases - for version, infos in d['releases'].items(): - if version == md.version: - continue # already done - omd = Metadata(scheme=self.scheme) - omd.name = md.name - omd.version = version - odist = Distribution(omd) - odist.locator = self - result[version] = odist - for info in infos: - url = info['url'] - odist.download_urls.add(url) - odist.digests[url] = self._get_digest(info) - result['urls'].setdefault(version, set()).add(url) - result['digests'][url] = self._get_digest(info) -# for info in urls: -# md.source_url = info['url'] -# dist.digest = self._get_digest(info) -# dist.locator = self -# for info in urls: -# url = info['url'] -# result['urls'].setdefault(md.version, set()).add(url) -# result['digests'][url] = self._get_digest(info) - except Exception as e: - self.errors.put(text_type(e)) - logger.exception('JSON fetch failed: %s', e) - return result - - -class Page(object): - """ - This class represents a scraped HTML page. - """ - # The following slightly hairy-looking regex just looks for the contents of - # an anchor link, which has an attribute "href" either immediately preceded - # or immediately followed by a "rel" attribute. The attribute values can be - # declared with double quotes, single quotes or no quotes - which leads to - # the length of the expression. - _href = re.compile(""" -(rel\\s*=\\s*(?:"(?P<rel1>[^"]*)"|'(?P<rel2>[^']*)'|(?P<rel3>[^>\\s\n]*))\\s+)? -href\\s*=\\s*(?:"(?P<url1>[^"]*)"|'(?P<url2>[^']*)'|(?P<url3>[^>\\s\n]*)) -(\\s+rel\\s*=\\s*(?:"(?P<rel4>[^"]*)"|'(?P<rel5>[^']*)'|(?P<rel6>[^>\\s\n]*)))? -""", re.I | re.S | re.X) - _base = re.compile(r"""<base\s+href\s*=\s*['"]?([^'">]+)""", re.I | re.S) - - def __init__(self, data, url): - """ - Initialise an instance with the Unicode page contents and the URL they - came from. - """ - self.data = data - self.base_url = self.url = url - m = self._base.search(self.data) - if m: - self.base_url = m.group(1) - - _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) - - @cached_property - def links(self): - """ - Return the URLs of all the links on a page together with information - about their "rel" attribute, for determining which ones to treat as - downloads and which ones to queue for further scraping. - """ - def clean(url): - "Tidy up an URL." - scheme, netloc, path, params, query, frag = urlparse(url) - return urlunparse((scheme, netloc, quote(path), - params, query, frag)) - - result = set() - for match in self._href.finditer(self.data): - d = match.groupdict('') - rel = (d['rel1'] or d['rel2'] or d['rel3'] or - d['rel4'] or d['rel5'] or d['rel6']) - url = d['url1'] or d['url2'] or d['url3'] - url = urljoin(self.base_url, url) - url = unescape(url) - url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) - result.add((url, rel)) - # We sort the result, hoping to bring the most recent versions - # to the front - result = sorted(result, key=lambda t: t[0], reverse=True) - return result - - -class SimpleScrapingLocator(Locator): - """ - A locator which scrapes HTML pages to locate downloads for a distribution. - This runs multiple threads to do the I/O; performance is at least as good - as pip's PackageFinder, which works in an analogous fashion. - """ - - # These are used to deal with various Content-Encoding schemes. - decoders = { - 'deflate': zlib.decompress, - 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(), - 'none': lambda b: b, - } - - def __init__(self, url, timeout=None, num_workers=10, **kwargs): - """ - Initialise an instance. - :param url: The root URL to use for scraping. - :param timeout: The timeout, in seconds, to be applied to requests. - This defaults to ``None`` (no timeout specified). - :param num_workers: The number of worker threads you want to do I/O, - This defaults to 10. - :param kwargs: Passed to the superclass. - """ - super(SimpleScrapingLocator, self).__init__(**kwargs) - self.base_url = ensure_slash(url) - self.timeout = timeout - self._page_cache = {} - self._seen = set() - self._to_fetch = queue.Queue() - self._bad_hosts = set() - self.skip_externals = False - self.num_workers = num_workers - self._lock = threading.RLock() - # See issue #45: we need to be resilient when the locator is used - # in a thread, e.g. with concurrent.futures. We can't use self._lock - # as it is for coordinating our internal threads - the ones created - # in _prepare_threads. - self._gplock = threading.RLock() - self.platform_check = False # See issue #112 - - def _prepare_threads(self): - """ - Threads are created only when get_project is called, and terminate - before it returns. They are there primarily to parallelise I/O (i.e. - fetching web pages). - """ - self._threads = [] - for i in range(self.num_workers): - t = threading.Thread(target=self._fetch) - t.setDaemon(True) - t.start() - self._threads.append(t) - - def _wait_threads(self): - """ - Tell all the threads to terminate (by sending a sentinel value) and - wait for them to do so. - """ - # Note that you need two loops, since you can't say which - # thread will get each sentinel - for t in self._threads: - self._to_fetch.put(None) # sentinel - for t in self._threads: - t.join() - self._threads = [] - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - with self._gplock: - self.result = result - self.project_name = name - url = urljoin(self.base_url, '%s/' % quote(name)) - self._seen.clear() - self._page_cache.clear() - self._prepare_threads() - try: - logger.debug('Queueing %s', url) - self._to_fetch.put(url) - self._to_fetch.join() - finally: - self._wait_threads() - del self.result - return result - - platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|' - r'win(32|_amd64)|macosx_?\d+)\b', re.I) - - def _is_platform_dependent(self, url): - """ - Does an URL refer to a platform-specific download? - """ - return self.platform_dependent.search(url) - - def _process_download(self, url): - """ - See if an URL is a suitable download for a project. - - If it is, register information in the result dictionary (for - _get_project) about the specific version it's for. - - Note that the return value isn't actually used other than as a boolean - value. - """ - if self.platform_check and self._is_platform_dependent(url): - info = None - else: - info = self.convert_url_to_download_info(url, self.project_name) - logger.debug('process_download: %s -> %s', url, info) - if info: - with self._lock: # needed because self.result is shared - self._update_version_data(self.result, info) - return info - - def _should_queue(self, link, referrer, rel): - """ - Determine whether a link URL from a referring page and with a - particular "rel" attribute should be queued for scraping. - """ - scheme, netloc, path, _, _, _ = urlparse(link) - if path.endswith(self.source_extensions + self.binary_extensions + - self.excluded_extensions): - result = False - elif self.skip_externals and not link.startswith(self.base_url): - result = False - elif not referrer.startswith(self.base_url): - result = False - elif rel not in ('homepage', 'download'): - result = False - elif scheme not in ('http', 'https', 'ftp'): - result = False - elif self._is_platform_dependent(link): - result = False - else: - host = netloc.split(':', 1)[0] - if host.lower() == 'localhost': - result = False - else: - result = True - logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, - referrer, result) - return result - - def _fetch(self): - """ - Get a URL to fetch from the work queue, get the HTML page, examine its - links for download candidates and candidates for further scraping. - - This is a handy method to run in a thread. - """ - while True: - url = self._to_fetch.get() - try: - if url: - page = self.get_page(url) - if page is None: # e.g. after an error - continue - for link, rel in page.links: - if link not in self._seen: - try: - self._seen.add(link) - if (not self._process_download(link) and - self._should_queue(link, url, rel)): - logger.debug('Queueing %s from %s', link, url) - self._to_fetch.put(link) - except MetadataInvalidError: # e.g. invalid versions - pass - except Exception as e: # pragma: no cover - self.errors.put(text_type(e)) - finally: - # always do this, to avoid hangs :-) - self._to_fetch.task_done() - if not url: - #logger.debug('Sentinel seen, quitting.') - break - - def get_page(self, url): - """ - Get the HTML for an URL, possibly from an in-memory cache. - - XXX TODO Note: this cache is never actually cleared. It's assumed that - the data won't get stale over the lifetime of a locator instance (not - necessarily true for the default_locator). - """ - # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api - scheme, netloc, path, _, _, _ = urlparse(url) - if scheme == 'file' and os.path.isdir(url2pathname(path)): - url = urljoin(ensure_slash(url), 'index.html') - - if url in self._page_cache: - result = self._page_cache[url] - logger.debug('Returning %s from cache: %s', url, result) - else: - host = netloc.split(':', 1)[0] - result = None - if host in self._bad_hosts: - logger.debug('Skipping %s due to bad host %s', url, host) - else: - req = Request(url, headers={'Accept-encoding': 'identity'}) - try: - logger.debug('Fetching %s', url) - resp = self.opener.open(req, timeout=self.timeout) - logger.debug('Fetched %s', url) - headers = resp.info() - content_type = headers.get('Content-Type', '') - if HTML_CONTENT_TYPE.match(content_type): - final_url = resp.geturl() - data = resp.read() - encoding = headers.get('Content-Encoding') - if encoding: - decoder = self.decoders[encoding] # fail if not found - data = decoder(data) - encoding = 'utf-8' - m = CHARSET.search(content_type) - if m: - encoding = m.group(1) - try: - data = data.decode(encoding) - except UnicodeError: # pragma: no cover - data = data.decode('latin-1') # fallback - result = Page(data, final_url) - self._page_cache[final_url] = result - except HTTPError as e: - if e.code != 404: - logger.exception('Fetch failed: %s: %s', url, e) - except URLError as e: # pragma: no cover - logger.exception('Fetch failed: %s: %s', url, e) - with self._lock: - self._bad_hosts.add(host) - except Exception as e: # pragma: no cover - logger.exception('Fetch failed: %s: %s', url, e) - finally: - self._page_cache[url] = result # even if None (failure) - return result - - _distname_re = re.compile('<a href=[^>]*>([^<]+)<') - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - result = set() - page = self.get_page(self.base_url) - if not page: - raise DistlibException('Unable to get %s' % self.base_url) - for match in self._distname_re.finditer(page.data): - result.add(match.group(1)) - return result - -class DirectoryLocator(Locator): - """ - This class locates distributions in a directory tree. - """ - - def __init__(self, path, **kwargs): - """ - Initialise an instance. - :param path: The root of the directory tree to search. - :param kwargs: Passed to the superclass constructor, - except for: - * recursive - if True (the default), subdirectories are - recursed into. If False, only the top-level directory - is searched, - """ - self.recursive = kwargs.pop('recursive', True) - super(DirectoryLocator, self).__init__(**kwargs) - path = os.path.abspath(path) - if not os.path.isdir(path): # pragma: no cover - raise DistlibException('Not a directory: %r' % path) - self.base_dir = path - - def should_include(self, filename, parent): - """ - Should a filename be considered as a candidate for a distribution - archive? As well as the filename, the directory which contains it - is provided, though not used by the current implementation. - """ - return filename.endswith(self.downloadable_extensions) - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - for root, dirs, files in os.walk(self.base_dir): - for fn in files: - if self.should_include(fn, root): - fn = os.path.join(root, fn) - url = urlunparse(('file', '', - pathname2url(os.path.abspath(fn)), - '', '', '')) - info = self.convert_url_to_download_info(url, name) - if info: - self._update_version_data(result, info) - if not self.recursive: - break - return result - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - result = set() - for root, dirs, files in os.walk(self.base_dir): - for fn in files: - if self.should_include(fn, root): - fn = os.path.join(root, fn) - url = urlunparse(('file', '', - pathname2url(os.path.abspath(fn)), - '', '', '')) - info = self.convert_url_to_download_info(url, None) - if info: - result.add(info['name']) - if not self.recursive: - break - return result - -class JSONLocator(Locator): - """ - This locator uses special extended metadata (not available on PyPI) and is - the basis of performant dependency resolution in distlib. Other locators - require archive downloads before dependencies can be determined! As you - might imagine, that can be slow. - """ - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - raise NotImplementedError('Not available from this locator') - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - data = get_project_data(name) - if data: - for info in data.get('files', []): - if info['ptype'] != 'sdist' or info['pyversion'] != 'source': - continue - # We don't store summary in project metadata as it makes - # the data bigger for no benefit during dependency - # resolution - dist = make_dist(data['name'], info['version'], - summary=data.get('summary', - 'Placeholder for summary'), - scheme=self.scheme) - md = dist.metadata - md.source_url = info['url'] - # TODO SHA256 digest - if 'digest' in info and info['digest']: - dist.digest = ('md5', info['digest']) - md.dependencies = info.get('requirements', {}) - dist.exports = info.get('exports', {}) - result[dist.version] = dist - result['urls'].setdefault(dist.version, set()).add(info['url']) - return result - -class DistPathLocator(Locator): - """ - This locator finds installed distributions in a path. It can be useful for - adding to an :class:`AggregatingLocator`. - """ - def __init__(self, distpath, **kwargs): - """ - Initialise an instance. - - :param distpath: A :class:`DistributionPath` instance to search. - """ - super(DistPathLocator, self).__init__(**kwargs) - assert isinstance(distpath, DistributionPath) - self.distpath = distpath - - def _get_project(self, name): - dist = self.distpath.get_distribution(name) - if dist is None: - result = {'urls': {}, 'digests': {}} - else: - result = { - dist.version: dist, - 'urls': {dist.version: set([dist.source_url])}, - 'digests': {dist.version: set([None])} - } - return result - - -class AggregatingLocator(Locator): - """ - This class allows you to chain and/or merge a list of locators. - """ - def __init__(self, *locators, **kwargs): - """ - Initialise an instance. - - :param locators: The list of locators to search. - :param kwargs: Passed to the superclass constructor, - except for: - * merge - if False (the default), the first successful - search from any of the locators is returned. If True, - the results from all locators are merged (this can be - slow). - """ - self.merge = kwargs.pop('merge', False) - self.locators = locators - super(AggregatingLocator, self).__init__(**kwargs) - - def clear_cache(self): - super(AggregatingLocator, self).clear_cache() - for locator in self.locators: - locator.clear_cache() - - def _set_scheme(self, value): - self._scheme = value - for locator in self.locators: - locator.scheme = value - - scheme = property(Locator.scheme.fget, _set_scheme) - - def _get_project(self, name): - result = {} - for locator in self.locators: - d = locator.get_project(name) - if d: - if self.merge: - files = result.get('urls', {}) - digests = result.get('digests', {}) - # next line could overwrite result['urls'], result['digests'] - result.update(d) - df = result.get('urls') - if files and df: - for k, v in files.items(): - if k in df: - df[k] |= v - else: - df[k] = v - dd = result.get('digests') - if digests and dd: - dd.update(digests) - else: - # See issue #18. If any dists are found and we're looking - # for specific constraints, we only return something if - # a match is found. For example, if a DirectoryLocator - # returns just foo (1.0) while we're looking for - # foo (>= 2.0), we'll pretend there was nothing there so - # that subsequent locators can be queried. Otherwise we - # would just return foo (1.0) which would then lead to a - # failure to find foo (>= 2.0), because other locators - # weren't searched. Note that this only matters when - # merge=False. - if self.matcher is None: - found = True - else: - found = False - for k in d: - if self.matcher.match(k): - found = True - break - if found: - result = d - break - return result - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - result = set() - for locator in self.locators: - try: - result |= locator.get_distribution_names() - except NotImplementedError: - pass - return result - - -# We use a legacy scheme simply because most of the dists on PyPI use legacy -# versions which don't conform to PEP 426 / PEP 440. -default_locator = AggregatingLocator( - JSONLocator(), - SimpleScrapingLocator('https://pypi.python.org/simple/', - timeout=3.0), - scheme='legacy') - -locate = default_locator.locate - -NAME_VERSION_RE = re.compile(r'(?P<name>[\w-]+)\s*' - r'\(\s*(==\s*)?(?P<ver>[^)]+)\)$') - -class DependencyFinder(object): - """ - Locate dependencies for distributions. - """ - - def __init__(self, locator=None): - """ - Initialise an instance, using the specified locator - to locate distributions. - """ - self.locator = locator or default_locator - self.scheme = get_scheme(self.locator.scheme) - - def add_distribution(self, dist): - """ - Add a distribution to the finder. This will update internal information - about who provides what. - :param dist: The distribution to add. - """ - logger.debug('adding distribution %s', dist) - name = dist.key - self.dists_by_name[name] = dist - self.dists[(name, dist.version)] = dist - for p in dist.provides: - name, version = parse_name_and_version(p) - logger.debug('Add to provided: %s, %s, %s', name, version, dist) - self.provided.setdefault(name, set()).add((version, dist)) - - def remove_distribution(self, dist): - """ - Remove a distribution from the finder. This will update internal - information about who provides what. - :param dist: The distribution to remove. - """ - logger.debug('removing distribution %s', dist) - name = dist.key - del self.dists_by_name[name] - del self.dists[(name, dist.version)] - for p in dist.provides: - name, version = parse_name_and_version(p) - logger.debug('Remove from provided: %s, %s, %s', name, version, dist) - s = self.provided[name] - s.remove((version, dist)) - if not s: - del self.provided[name] - - def get_matcher(self, reqt): - """ - Get a version matcher for a requirement. - :param reqt: The requirement - :type reqt: str - :return: A version matcher (an instance of - :class:`distlib.version.Matcher`). - """ - try: - matcher = self.scheme.matcher(reqt) - except UnsupportedVersionError: # pragma: no cover - # XXX compat-mode if cannot read the version - name = reqt.split()[0] - matcher = self.scheme.matcher(name) - return matcher - - def find_providers(self, reqt): - """ - Find the distributions which can fulfill a requirement. - - :param reqt: The requirement. - :type reqt: str - :return: A set of distribution which can fulfill the requirement. - """ - matcher = self.get_matcher(reqt) - name = matcher.key # case-insensitive - result = set() - provided = self.provided - if name in provided: - for version, provider in provided[name]: - try: - match = matcher.match(version) - except UnsupportedVersionError: - match = False - - if match: - result.add(provider) - break - return result - - def try_to_replace(self, provider, other, problems): - """ - Attempt to replace one provider with another. This is typically used - when resolving dependencies from multiple sources, e.g. A requires - (B >= 1.0) while C requires (B >= 1.1). - - For successful replacement, ``provider`` must meet all the requirements - which ``other`` fulfills. - - :param provider: The provider we are trying to replace with. - :param other: The provider we're trying to replace. - :param problems: If False is returned, this will contain what - problems prevented replacement. This is currently - a tuple of the literal string 'cantreplace', - ``provider``, ``other`` and the set of requirements - that ``provider`` couldn't fulfill. - :return: True if we can replace ``other`` with ``provider``, else - False. - """ - rlist = self.reqts[other] - unmatched = set() - for s in rlist: - matcher = self.get_matcher(s) - if not matcher.match(provider.version): - unmatched.add(s) - if unmatched: - # can't replace other with provider - problems.add(('cantreplace', provider, other, - frozenset(unmatched))) - result = False - else: - # can replace other with provider - self.remove_distribution(other) - del self.reqts[other] - for s in rlist: - self.reqts.setdefault(provider, set()).add(s) - self.add_distribution(provider) - result = True - return result - - def find(self, requirement, meta_extras=None, prereleases=False): - """ - Find a distribution and all distributions it depends on. - - :param requirement: The requirement specifying the distribution to - find, or a Distribution instance. - :param meta_extras: A list of meta extras such as :test:, :build: and - so on. - :param prereleases: If ``True``, allow pre-release versions to be - returned - otherwise, don't return prereleases - unless they're all that's available. - - Return a set of :class:`Distribution` instances and a set of - problems. - - The distributions returned should be such that they have the - :attr:`required` attribute set to ``True`` if they were - from the ``requirement`` passed to ``find()``, and they have the - :attr:`build_time_dependency` attribute set to ``True`` unless they - are post-installation dependencies of the ``requirement``. - - The problems should be a tuple consisting of the string - ``'unsatisfied'`` and the requirement which couldn't be satisfied - by any distribution known to the locator. - """ - - self.provided = {} - self.dists = {} - self.dists_by_name = {} - self.reqts = {} - - meta_extras = set(meta_extras or []) - if ':*:' in meta_extras: - meta_extras.remove(':*:') - # :meta: and :run: are implicitly included - meta_extras |= set([':test:', ':build:', ':dev:']) - - if isinstance(requirement, Distribution): - dist = odist = requirement - logger.debug('passed %s as requirement', odist) - else: - dist = odist = self.locator.locate(requirement, - prereleases=prereleases) - if dist is None: - raise DistlibException('Unable to locate %r' % requirement) - logger.debug('located %s', odist) - dist.requested = True - problems = set() - todo = set([dist]) - install_dists = set([odist]) - while todo: - dist = todo.pop() - name = dist.key # case-insensitive - if name not in self.dists_by_name: - self.add_distribution(dist) - else: - #import pdb; pdb.set_trace() - other = self.dists_by_name[name] - if other != dist: - self.try_to_replace(dist, other, problems) - - ireqts = dist.run_requires | dist.meta_requires - sreqts = dist.build_requires - ereqts = set() - if meta_extras and dist in install_dists: - for key in ('test', 'build', 'dev'): - e = ':%s:' % key - if e in meta_extras: - ereqts |= getattr(dist, '%s_requires' % key) - all_reqts = ireqts | sreqts | ereqts - for r in all_reqts: - providers = self.find_providers(r) - if not providers: - logger.debug('No providers found for %r', r) - provider = self.locator.locate(r, prereleases=prereleases) - # If no provider is found and we didn't consider - # prereleases, consider them now. - if provider is None and not prereleases: - provider = self.locator.locate(r, prereleases=True) - if provider is None: - logger.debug('Cannot satisfy %r', r) - problems.add(('unsatisfied', r)) - else: - n, v = provider.key, provider.version - if (n, v) not in self.dists: - todo.add(provider) - providers.add(provider) - if r in ireqts and dist in install_dists: - install_dists.add(provider) - logger.debug('Adding %s to install_dists', - provider.name_and_version) - for p in providers: - name = p.key - if name not in self.dists_by_name: - self.reqts.setdefault(p, set()).add(r) - else: - other = self.dists_by_name[name] - if other != p: - # see if other can be replaced by p - self.try_to_replace(p, other, problems) - - dists = set(self.dists.values()) - for dist in dists: - dist.build_time_dependency = dist not in install_dists - if dist.build_time_dependency: - logger.debug('%s is a build-time dependency only.', - dist.name_and_version) - logger.debug('find done for %s', odist) - return dists, problems diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/manifest.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/manifest.py deleted file mode 100644 index ca0fe44..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/manifest.py +++ /dev/null @@ -1,393 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2013 Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -""" -Class representing the list of files in a distribution. - -Equivalent to distutils.filelist, but fixes some problems. -""" -import fnmatch -import logging -import os -import re -import sys - -from . import DistlibException -from .compat import fsdecode -from .util import convert_path - - -__all__ = ['Manifest'] - -logger = logging.getLogger(__name__) - -# a \ followed by some spaces + EOL -_COLLAPSE_PATTERN = re.compile('\\\\w*\n', re.M) -_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S) - -# -# Due to the different results returned by fnmatch.translate, we need -# to do slightly different processing for Python 2.7 and 3.2 ... this needed -# to be brought in for Python 3.6 onwards. -# -_PYTHON_VERSION = sys.version_info[:2] - -class Manifest(object): - """A list of files built by on exploring the filesystem and filtered by - applying various patterns to what we find there. - """ - - def __init__(self, base=None): - """ - Initialise an instance. - - :param base: The base directory to explore under. - """ - self.base = os.path.abspath(os.path.normpath(base or os.getcwd())) - self.prefix = self.base + os.sep - self.allfiles = None - self.files = set() - - # - # Public API - # - - def findall(self): - """Find all files under the base and set ``allfiles`` to the absolute - pathnames of files found. - """ - from stat import S_ISREG, S_ISDIR, S_ISLNK - - self.allfiles = allfiles = [] - root = self.base - stack = [root] - pop = stack.pop - push = stack.append - - while stack: - root = pop() - names = os.listdir(root) - - for name in names: - fullname = os.path.join(root, name) - - # Avoid excess stat calls -- just one will do, thank you! - stat = os.stat(fullname) - mode = stat.st_mode - if S_ISREG(mode): - allfiles.append(fsdecode(fullname)) - elif S_ISDIR(mode) and not S_ISLNK(mode): - push(fullname) - - def add(self, item): - """ - Add a file to the manifest. - - :param item: The pathname to add. This can be relative to the base. - """ - if not item.startswith(self.prefix): - item = os.path.join(self.base, item) - self.files.add(os.path.normpath(item)) - - def add_many(self, items): - """ - Add a list of files to the manifest. - - :param items: The pathnames to add. These can be relative to the base. - """ - for item in items: - self.add(item) - - def sorted(self, wantdirs=False): - """ - Return sorted files in directory order - """ - - def add_dir(dirs, d): - dirs.add(d) - logger.debug('add_dir added %s', d) - if d != self.base: - parent, _ = os.path.split(d) - assert parent not in ('', '/') - add_dir(dirs, parent) - - result = set(self.files) # make a copy! - if wantdirs: - dirs = set() - for f in result: - add_dir(dirs, os.path.dirname(f)) - result |= dirs - return [os.path.join(*path_tuple) for path_tuple in - sorted(os.path.split(path) for path in result)] - - def clear(self): - """Clear all collected files.""" - self.files = set() - self.allfiles = [] - - def process_directive(self, directive): - """ - Process a directive which either adds some files from ``allfiles`` to - ``files``, or removes some files from ``files``. - - :param directive: The directive to process. This should be in a format - compatible with distutils ``MANIFEST.in`` files: - - http://docs.python.org/distutils/sourcedist.html#commands - """ - # Parse the line: split it up, make sure the right number of words - # is there, and return the relevant words. 'action' is always - # defined: it's the first word of the line. Which of the other - # three are defined depends on the action; it'll be either - # patterns, (dir and patterns), or (dirpattern). - action, patterns, thedir, dirpattern = self._parse_directive(directive) - - # OK, now we know that the action is valid and we have the - # right number of words on the line for that action -- so we - # can proceed with minimal error-checking. - if action == 'include': - for pattern in patterns: - if not self._include_pattern(pattern, anchor=True): - logger.warning('no files found matching %r', pattern) - - elif action == 'exclude': - for pattern in patterns: - found = self._exclude_pattern(pattern, anchor=True) - #if not found: - # logger.warning('no previously-included files ' - # 'found matching %r', pattern) - - elif action == 'global-include': - for pattern in patterns: - if not self._include_pattern(pattern, anchor=False): - logger.warning('no files found matching %r ' - 'anywhere in distribution', pattern) - - elif action == 'global-exclude': - for pattern in patterns: - found = self._exclude_pattern(pattern, anchor=False) - #if not found: - # logger.warning('no previously-included files ' - # 'matching %r found anywhere in ' - # 'distribution', pattern) - - elif action == 'recursive-include': - for pattern in patterns: - if not self._include_pattern(pattern, prefix=thedir): - logger.warning('no files found matching %r ' - 'under directory %r', pattern, thedir) - - elif action == 'recursive-exclude': - for pattern in patterns: - found = self._exclude_pattern(pattern, prefix=thedir) - #if not found: - # logger.warning('no previously-included files ' - # 'matching %r found under directory %r', - # pattern, thedir) - - elif action == 'graft': - if not self._include_pattern(None, prefix=dirpattern): - logger.warning('no directories found matching %r', - dirpattern) - - elif action == 'prune': - if not self._exclude_pattern(None, prefix=dirpattern): - logger.warning('no previously-included directories found ' - 'matching %r', dirpattern) - else: # pragma: no cover - # This should never happen, as it should be caught in - # _parse_template_line - raise DistlibException( - 'invalid action %r' % action) - - # - # Private API - # - - def _parse_directive(self, directive): - """ - Validate a directive. - :param directive: The directive to validate. - :return: A tuple of action, patterns, thedir, dir_patterns - """ - words = directive.split() - if len(words) == 1 and words[0] not in ('include', 'exclude', - 'global-include', - 'global-exclude', - 'recursive-include', - 'recursive-exclude', - 'graft', 'prune'): - # no action given, let's use the default 'include' - words.insert(0, 'include') - - action = words[0] - patterns = thedir = dir_pattern = None - - if action in ('include', 'exclude', - 'global-include', 'global-exclude'): - if len(words) < 2: - raise DistlibException( - '%r expects <pattern1> <pattern2> ...' % action) - - patterns = [convert_path(word) for word in words[1:]] - - elif action in ('recursive-include', 'recursive-exclude'): - if len(words) < 3: - raise DistlibException( - '%r expects <dir> <pattern1> <pattern2> ...' % action) - - thedir = convert_path(words[1]) - patterns = [convert_path(word) for word in words[2:]] - - elif action in ('graft', 'prune'): - if len(words) != 2: - raise DistlibException( - '%r expects a single <dir_pattern>' % action) - - dir_pattern = convert_path(words[1]) - - else: - raise DistlibException('unknown action %r' % action) - - return action, patterns, thedir, dir_pattern - - def _include_pattern(self, pattern, anchor=True, prefix=None, - is_regex=False): - """Select strings (presumably filenames) from 'self.files' that - match 'pattern', a Unix-style wildcard (glob) pattern. - - Patterns are not quite the same as implemented by the 'fnmatch' - module: '*' and '?' match non-special characters, where "special" - is platform-dependent: slash on Unix; colon, slash, and backslash on - DOS/Windows; and colon on Mac OS. - - If 'anchor' is true (the default), then the pattern match is more - stringent: "*.py" will match "foo.py" but not "foo/bar.py". If - 'anchor' is false, both of these will match. - - If 'prefix' is supplied, then only filenames starting with 'prefix' - (itself a pattern) and ending with 'pattern', with anything in between - them, will match. 'anchor' is ignored in this case. - - If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and - 'pattern' is assumed to be either a string containing a regex or a - regex object -- no translation is done, the regex is just compiled - and used as-is. - - Selected strings will be added to self.files. - - Return True if files are found. - """ - # XXX docstring lying about what the special chars are? - found = False - pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) - - # delayed loading of allfiles list - if self.allfiles is None: - self.findall() - - for name in self.allfiles: - if pattern_re.search(name): - self.files.add(name) - found = True - return found - - def _exclude_pattern(self, pattern, anchor=True, prefix=None, - is_regex=False): - """Remove strings (presumably filenames) from 'files' that match - 'pattern'. - - Other parameters are the same as for 'include_pattern()', above. - The list 'self.files' is modified in place. Return True if files are - found. - - This API is public to allow e.g. exclusion of SCM subdirs, e.g. when - packaging source distributions - """ - found = False - pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) - for f in list(self.files): - if pattern_re.search(f): - self.files.remove(f) - found = True - return found - - def _translate_pattern(self, pattern, anchor=True, prefix=None, - is_regex=False): - """Translate a shell-like wildcard pattern to a compiled regular - expression. - - Return the compiled regex. If 'is_regex' true, - then 'pattern' is directly compiled to a regex (if it's a string) - or just returned as-is (assumes it's a regex object). - """ - if is_regex: - if isinstance(pattern, str): - return re.compile(pattern) - else: - return pattern - - if _PYTHON_VERSION > (3, 2): - # ditch start and end characters - start, _, end = self._glob_to_re('_').partition('_') - - if pattern: - pattern_re = self._glob_to_re(pattern) - if _PYTHON_VERSION > (3, 2): - assert pattern_re.startswith(start) and pattern_re.endswith(end) - else: - pattern_re = '' - - base = re.escape(os.path.join(self.base, '')) - if prefix is not None: - # ditch end of pattern character - if _PYTHON_VERSION <= (3, 2): - empty_pattern = self._glob_to_re('') - prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] - else: - prefix_re = self._glob_to_re(prefix) - assert prefix_re.startswith(start) and prefix_re.endswith(end) - prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] - sep = os.sep - if os.sep == '\\': - sep = r'\\' - if _PYTHON_VERSION <= (3, 2): - pattern_re = '^' + base + sep.join((prefix_re, - '.*' + pattern_re)) - else: - pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] - pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, - pattern_re, end) - else: # no prefix -- respect anchor flag - if anchor: - if _PYTHON_VERSION <= (3, 2): - pattern_re = '^' + base + pattern_re - else: - pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) - - return re.compile(pattern_re) - - def _glob_to_re(self, pattern): - """Translate a shell-like glob pattern to a regular expression. - - Return a string containing the regex. Differs from - 'fnmatch.translate()' in that '*' does not match "special characters" - (which are platform-specific). - """ - pattern_re = fnmatch.translate(pattern) - - # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which - # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, - # and by extension they shouldn't match such "special characters" under - # any OS. So change all non-escaped dots in the RE to match any - # character except the special characters (currently: just os.sep). - sep = os.sep - if os.sep == '\\': - # we're using a regex to manipulate a regex, so we need - # to escape the backslash twice - sep = r'\\\\' - escaped = r'\1[^%s]' % sep - pattern_re = re.sub(r'((?<!\\)(\\\\)*)\.', escaped, pattern_re) - return pattern_re diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/markers.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/markers.py deleted file mode 100644 index ee1f3e2..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/markers.py +++ /dev/null @@ -1,131 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -""" -Parser for the environment markers micro-language defined in PEP 508. -""" - -# Note: In PEP 345, the micro-language was Python compatible, so the ast -# module could be used to parse it. However, PEP 508 introduced operators such -# as ~= and === which aren't in Python, necessitating a different approach. - -import os -import sys -import platform -import re - -from .compat import python_implementation, urlparse, string_types -from .util import in_venv, parse_marker - -__all__ = ['interpret'] - -def _is_literal(o): - if not isinstance(o, string_types) or not o: - return False - return o[0] in '\'"' - -class Evaluator(object): - """ - This class is used to evaluate marker expessions. - """ - - operations = { - '==': lambda x, y: x == y, - '===': lambda x, y: x == y, - '~=': lambda x, y: x == y or x > y, - '!=': lambda x, y: x != y, - '<': lambda x, y: x < y, - '<=': lambda x, y: x == y or x < y, - '>': lambda x, y: x > y, - '>=': lambda x, y: x == y or x > y, - 'and': lambda x, y: x and y, - 'or': lambda x, y: x or y, - 'in': lambda x, y: x in y, - 'not in': lambda x, y: x not in y, - } - - def evaluate(self, expr, context): - """ - Evaluate a marker expression returned by the :func:`parse_requirement` - function in the specified context. - """ - if isinstance(expr, string_types): - if expr[0] in '\'"': - result = expr[1:-1] - else: - if expr not in context: - raise SyntaxError('unknown variable: %s' % expr) - result = context[expr] - else: - assert isinstance(expr, dict) - op = expr['op'] - if op not in self.operations: - raise NotImplementedError('op not implemented: %s' % op) - elhs = expr['lhs'] - erhs = expr['rhs'] - if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): - raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs)) - - lhs = self.evaluate(elhs, context) - rhs = self.evaluate(erhs, context) - result = self.operations[op](lhs, rhs) - return result - -def default_context(): - def format_full_version(info): - version = '%s.%s.%s' % (info.major, info.minor, info.micro) - kind = info.releaselevel - if kind != 'final': - version += kind[0] + str(info.serial) - return version - - if hasattr(sys, 'implementation'): - implementation_version = format_full_version(sys.implementation.version) - implementation_name = sys.implementation.name - else: - implementation_version = '0' - implementation_name = '' - - result = { - 'implementation_name': implementation_name, - 'implementation_version': implementation_version, - 'os_name': os.name, - 'platform_machine': platform.machine(), - 'platform_python_implementation': platform.python_implementation(), - 'platform_release': platform.release(), - 'platform_system': platform.system(), - 'platform_version': platform.version(), - 'platform_in_venv': str(in_venv()), - 'python_full_version': platform.python_version(), - 'python_version': platform.python_version()[:3], - 'sys_platform': sys.platform, - } - return result - -DEFAULT_CONTEXT = default_context() -del default_context - -evaluator = Evaluator() - -def interpret(marker, execution_context=None): - """ - Interpret a marker and return a result depending on environment. - - :param marker: The marker to interpret. - :type marker: str - :param execution_context: The context used for name lookup. - :type execution_context: mapping - """ - try: - expr, rest = parse_marker(marker) - except Exception as e: - raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e)) - if rest and rest[0] != '#': - raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest)) - context = dict(DEFAULT_CONTEXT) - if execution_context: - context.update(execution_context) - return evaluator.evaluate(expr, context) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/metadata.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/metadata.py deleted file mode 100644 index 77eed7f..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/metadata.py +++ /dev/null @@ -1,1094 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""Implementation of the Metadata for Python packages PEPs. - -Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental). -""" -from __future__ import unicode_literals - -import codecs -from email import message_from_file -import json -import logging -import re - - -from . import DistlibException, __version__ -from .compat import StringIO, string_types, text_type -from .markers import interpret -from .util import extract_by_key, get_extras -from .version import get_scheme, PEP440_VERSION_RE - -logger = logging.getLogger(__name__) - - -class MetadataMissingError(DistlibException): - """A required metadata is missing""" - - -class MetadataConflictError(DistlibException): - """Attempt to read or write metadata fields that are conflictual.""" - - -class MetadataUnrecognizedVersionError(DistlibException): - """Unknown metadata version number.""" - - -class MetadataInvalidError(DistlibException): - """A metadata value is invalid""" - -# public API of this module -__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] - -# Encoding used for the PKG-INFO files -PKG_INFO_ENCODING = 'utf-8' - -# preferred version. Hopefully will be changed -# to 1.2 once PEP 345 is supported everywhere -PKG_INFO_PREFERRED_VERSION = '1.1' - -_LINE_PREFIX_1_2 = re.compile('\n \\|') -_LINE_PREFIX_PRE_1_2 = re.compile('\n ') -_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'License') - -_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'License', 'Classifier', 'Download-URL', 'Obsoletes', - 'Provides', 'Requires') - -_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', - 'Download-URL') - -_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'Maintainer', 'Maintainer-email', 'License', - 'Classifier', 'Download-URL', 'Obsoletes-Dist', - 'Project-URL', 'Provides-Dist', 'Requires-Dist', - 'Requires-Python', 'Requires-External') - -_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', - 'Obsoletes-Dist', 'Requires-External', 'Maintainer', - 'Maintainer-email', 'Project-URL') - -_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'Maintainer', 'Maintainer-email', 'License', - 'Classifier', 'Download-URL', 'Obsoletes-Dist', - 'Project-URL', 'Provides-Dist', 'Requires-Dist', - 'Requires-Python', 'Requires-External', 'Private-Version', - 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', - 'Provides-Extra') - -_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', - 'Setup-Requires-Dist', 'Extension') - -# See issue #106: Sometimes 'Requires' occurs wrongly in the metadata. Include -# it in the tuple literal below to allow it (for now) -_566_FIELDS = _426_FIELDS + ('Description-Content-Type', 'Requires') - -_566_MARKERS = ('Description-Content-Type',) - -_ALL_FIELDS = set() -_ALL_FIELDS.update(_241_FIELDS) -_ALL_FIELDS.update(_314_FIELDS) -_ALL_FIELDS.update(_345_FIELDS) -_ALL_FIELDS.update(_426_FIELDS) -_ALL_FIELDS.update(_566_FIELDS) - -EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') - - -def _version2fieldlist(version): - if version == '1.0': - return _241_FIELDS - elif version == '1.1': - return _314_FIELDS - elif version == '1.2': - return _345_FIELDS - elif version in ('1.3', '2.1'): - return _345_FIELDS + _566_FIELDS - elif version == '2.0': - return _426_FIELDS - raise MetadataUnrecognizedVersionError(version) - - -def _best_version(fields): - """Detect the best version depending on the fields used.""" - def _has_marker(keys, markers): - for marker in markers: - if marker in keys: - return True - return False - - keys = [] - for key, value in fields.items(): - if value in ([], 'UNKNOWN', None): - continue - keys.append(key) - - possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.0', '2.1'] - - # first let's try to see if a field is not part of one of the version - for key in keys: - if key not in _241_FIELDS and '1.0' in possible_versions: - possible_versions.remove('1.0') - logger.debug('Removed 1.0 due to %s', key) - if key not in _314_FIELDS and '1.1' in possible_versions: - possible_versions.remove('1.1') - logger.debug('Removed 1.1 due to %s', key) - if key not in _345_FIELDS and '1.2' in possible_versions: - possible_versions.remove('1.2') - logger.debug('Removed 1.2 due to %s', key) - if key not in _566_FIELDS and '1.3' in possible_versions: - possible_versions.remove('1.3') - logger.debug('Removed 1.3 due to %s', key) - if key not in _566_FIELDS and '2.1' in possible_versions: - if key != 'Description': # In 2.1, description allowed after headers - possible_versions.remove('2.1') - logger.debug('Removed 2.1 due to %s', key) - if key not in _426_FIELDS and '2.0' in possible_versions: - possible_versions.remove('2.0') - logger.debug('Removed 2.0 due to %s', key) - - # possible_version contains qualified versions - if len(possible_versions) == 1: - return possible_versions[0] # found ! - elif len(possible_versions) == 0: - logger.debug('Out of options - unknown metadata set: %s', fields) - raise MetadataConflictError('Unknown metadata set') - - # let's see if one unique marker is found - is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) - is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) - is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS) - is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) - if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_0) > 1: - raise MetadataConflictError('You used incompatible 1.1/1.2/2.0/2.1 fields') - - # we have the choice, 1.0, or 1.2, or 2.0 - # - 1.0 has a broken Summary field but works with all tools - # - 1.1 is to avoid - # - 1.2 fixes Summary but has little adoption - # - 2.0 adds more features and is very new - if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_0: - # we couldn't find any specific marker - if PKG_INFO_PREFERRED_VERSION in possible_versions: - return PKG_INFO_PREFERRED_VERSION - if is_1_1: - return '1.1' - if is_1_2: - return '1.2' - if is_2_1: - return '2.1' - - return '2.0' - -_ATTR2FIELD = { - 'metadata_version': 'Metadata-Version', - 'name': 'Name', - 'version': 'Version', - 'platform': 'Platform', - 'supported_platform': 'Supported-Platform', - 'summary': 'Summary', - 'description': 'Description', - 'keywords': 'Keywords', - 'home_page': 'Home-page', - 'author': 'Author', - 'author_email': 'Author-email', - 'maintainer': 'Maintainer', - 'maintainer_email': 'Maintainer-email', - 'license': 'License', - 'classifier': 'Classifier', - 'download_url': 'Download-URL', - 'obsoletes_dist': 'Obsoletes-Dist', - 'provides_dist': 'Provides-Dist', - 'requires_dist': 'Requires-Dist', - 'setup_requires_dist': 'Setup-Requires-Dist', - 'requires_python': 'Requires-Python', - 'requires_external': 'Requires-External', - 'requires': 'Requires', - 'provides': 'Provides', - 'obsoletes': 'Obsoletes', - 'project_url': 'Project-URL', - 'private_version': 'Private-Version', - 'obsoleted_by': 'Obsoleted-By', - 'extension': 'Extension', - 'provides_extra': 'Provides-Extra', -} - -_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') -_VERSIONS_FIELDS = ('Requires-Python',) -_VERSION_FIELDS = ('Version',) -_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', - 'Requires', 'Provides', 'Obsoletes-Dist', - 'Provides-Dist', 'Requires-Dist', 'Requires-External', - 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', - 'Provides-Extra', 'Extension') -_LISTTUPLEFIELDS = ('Project-URL',) - -_ELEMENTSFIELD = ('Keywords',) - -_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') - -_MISSING = object() - -_FILESAFE = re.compile('[^A-Za-z0-9.]+') - - -def _get_name_and_version(name, version, for_filename=False): - """Return the distribution name with version. - - If for_filename is true, return a filename-escaped form.""" - if for_filename: - # For both name and version any runs of non-alphanumeric or '.' - # characters are replaced with a single '-'. Additionally any - # spaces in the version string become '.' - name = _FILESAFE.sub('-', name) - version = _FILESAFE.sub('-', version.replace(' ', '.')) - return '%s-%s' % (name, version) - - -class LegacyMetadata(object): - """The legacy metadata of a release. - - Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can - instantiate the class with one of these arguments (or none): - - *path*, the path to a metadata file - - *fileobj* give a file-like object with metadata as content - - *mapping* is a dict-like object - - *scheme* is a version scheme name - """ - # TODO document the mapping API and UNKNOWN default key - - def __init__(self, path=None, fileobj=None, mapping=None, - scheme='default'): - if [path, fileobj, mapping].count(None) < 2: - raise TypeError('path, fileobj and mapping are exclusive') - self._fields = {} - self.requires_files = [] - self._dependencies = None - self.scheme = scheme - if path is not None: - self.read(path) - elif fileobj is not None: - self.read_file(fileobj) - elif mapping is not None: - self.update(mapping) - self.set_metadata_version() - - def set_metadata_version(self): - self._fields['Metadata-Version'] = _best_version(self._fields) - - def _write_field(self, fileobj, name, value): - fileobj.write('%s: %s\n' % (name, value)) - - def __getitem__(self, name): - return self.get(name) - - def __setitem__(self, name, value): - return self.set(name, value) - - def __delitem__(self, name): - field_name = self._convert_name(name) - try: - del self._fields[field_name] - except KeyError: - raise KeyError(name) - - def __contains__(self, name): - return (name in self._fields or - self._convert_name(name) in self._fields) - - def _convert_name(self, name): - if name in _ALL_FIELDS: - return name - name = name.replace('-', '_').lower() - return _ATTR2FIELD.get(name, name) - - def _default_value(self, name): - if name in _LISTFIELDS or name in _ELEMENTSFIELD: - return [] - return 'UNKNOWN' - - def _remove_line_prefix(self, value): - if self.metadata_version in ('1.0', '1.1'): - return _LINE_PREFIX_PRE_1_2.sub('\n', value) - else: - return _LINE_PREFIX_1_2.sub('\n', value) - - def __getattr__(self, name): - if name in _ATTR2FIELD: - return self[name] - raise AttributeError(name) - - # - # Public API - # - -# dependencies = property(_get_dependencies, _set_dependencies) - - def get_fullname(self, filesafe=False): - """Return the distribution name with version. - - If filesafe is true, return a filename-escaped form.""" - return _get_name_and_version(self['Name'], self['Version'], filesafe) - - def is_field(self, name): - """return True if name is a valid metadata key""" - name = self._convert_name(name) - return name in _ALL_FIELDS - - def is_multi_field(self, name): - name = self._convert_name(name) - return name in _LISTFIELDS - - def read(self, filepath): - """Read the metadata values from a file path.""" - fp = codecs.open(filepath, 'r', encoding='utf-8') - try: - self.read_file(fp) - finally: - fp.close() - - def read_file(self, fileob): - """Read the metadata values from a file object.""" - msg = message_from_file(fileob) - self._fields['Metadata-Version'] = msg['metadata-version'] - - # When reading, get all the fields we can - for field in _ALL_FIELDS: - if field not in msg: - continue - if field in _LISTFIELDS: - # we can have multiple lines - values = msg.get_all(field) - if field in _LISTTUPLEFIELDS and values is not None: - values = [tuple(value.split(',')) for value in values] - self.set(field, values) - else: - # single line - value = msg[field] - if value is not None and value != 'UNKNOWN': - self.set(field, value) - # logger.debug('Attempting to set metadata for %s', self) - # self.set_metadata_version() - - def write(self, filepath, skip_unknown=False): - """Write the metadata fields to filepath.""" - fp = codecs.open(filepath, 'w', encoding='utf-8') - try: - self.write_file(fp, skip_unknown) - finally: - fp.close() - - def write_file(self, fileobject, skip_unknown=False): - """Write the PKG-INFO format data to a file object.""" - self.set_metadata_version() - - for field in _version2fieldlist(self['Metadata-Version']): - values = self.get(field) - if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): - continue - if field in _ELEMENTSFIELD: - self._write_field(fileobject, field, ','.join(values)) - continue - if field not in _LISTFIELDS: - if field == 'Description': - if self.metadata_version in ('1.0', '1.1'): - values = values.replace('\n', '\n ') - else: - values = values.replace('\n', '\n |') - values = [values] - - if field in _LISTTUPLEFIELDS: - values = [','.join(value) for value in values] - - for value in values: - self._write_field(fileobject, field, value) - - def update(self, other=None, **kwargs): - """Set metadata values from the given iterable `other` and kwargs. - - Behavior is like `dict.update`: If `other` has a ``keys`` method, - they are looped over and ``self[key]`` is assigned ``other[key]``. - Else, ``other`` is an iterable of ``(key, value)`` iterables. - - Keys that don't match a metadata field or that have an empty value are - dropped. - """ - def _set(key, value): - if key in _ATTR2FIELD and value: - self.set(self._convert_name(key), value) - - if not other: - # other is None or empty container - pass - elif hasattr(other, 'keys'): - for k in other.keys(): - _set(k, other[k]) - else: - for k, v in other: - _set(k, v) - - if kwargs: - for k, v in kwargs.items(): - _set(k, v) - - def set(self, name, value): - """Control then set a metadata field.""" - name = self._convert_name(name) - - if ((name in _ELEMENTSFIELD or name == 'Platform') and - not isinstance(value, (list, tuple))): - if isinstance(value, string_types): - value = [v.strip() for v in value.split(',')] - else: - value = [] - elif (name in _LISTFIELDS and - not isinstance(value, (list, tuple))): - if isinstance(value, string_types): - value = [value] - else: - value = [] - - if logger.isEnabledFor(logging.WARNING): - project_name = self['Name'] - - scheme = get_scheme(self.scheme) - if name in _PREDICATE_FIELDS and value is not None: - for v in value: - # check that the values are valid - if not scheme.is_valid_matcher(v.split(';')[0]): - logger.warning( - "'%s': '%s' is not valid (field '%s')", - project_name, v, name) - # FIXME this rejects UNKNOWN, is that right? - elif name in _VERSIONS_FIELDS and value is not None: - if not scheme.is_valid_constraint_list(value): - logger.warning("'%s': '%s' is not a valid version (field '%s')", - project_name, value, name) - elif name in _VERSION_FIELDS and value is not None: - if not scheme.is_valid_version(value): - logger.warning("'%s': '%s' is not a valid version (field '%s')", - project_name, value, name) - - if name in _UNICODEFIELDS: - if name == 'Description': - value = self._remove_line_prefix(value) - - self._fields[name] = value - - def get(self, name, default=_MISSING): - """Get a metadata field.""" - name = self._convert_name(name) - if name not in self._fields: - if default is _MISSING: - default = self._default_value(name) - return default - if name in _UNICODEFIELDS: - value = self._fields[name] - return value - elif name in _LISTFIELDS: - value = self._fields[name] - if value is None: - return [] - res = [] - for val in value: - if name not in _LISTTUPLEFIELDS: - res.append(val) - else: - # That's for Project-URL - res.append((val[0], val[1])) - return res - - elif name in _ELEMENTSFIELD: - value = self._fields[name] - if isinstance(value, string_types): - return value.split(',') - return self._fields[name] - - def check(self, strict=False): - """Check if the metadata is compliant. If strict is True then raise if - no Name or Version are provided""" - self.set_metadata_version() - - # XXX should check the versions (if the file was loaded) - missing, warnings = [], [] - - for attr in ('Name', 'Version'): # required by PEP 345 - if attr not in self: - missing.append(attr) - - if strict and missing != []: - msg = 'missing required metadata: %s' % ', '.join(missing) - raise MetadataMissingError(msg) - - for attr in ('Home-page', 'Author'): - if attr not in self: - missing.append(attr) - - # checking metadata 1.2 (XXX needs to check 1.1, 1.0) - if self['Metadata-Version'] != '1.2': - return missing, warnings - - scheme = get_scheme(self.scheme) - - def are_valid_constraints(value): - for v in value: - if not scheme.is_valid_matcher(v.split(';')[0]): - return False - return True - - for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), - (_VERSIONS_FIELDS, - scheme.is_valid_constraint_list), - (_VERSION_FIELDS, - scheme.is_valid_version)): - for field in fields: - value = self.get(field, None) - if value is not None and not controller(value): - warnings.append("Wrong value for '%s': %s" % (field, value)) - - return missing, warnings - - def todict(self, skip_missing=False): - """Return fields as a dict. - - Field names will be converted to use the underscore-lowercase style - instead of hyphen-mixed case (i.e. home_page instead of Home-page). - """ - self.set_metadata_version() - - mapping_1_0 = ( - ('metadata_version', 'Metadata-Version'), - ('name', 'Name'), - ('version', 'Version'), - ('summary', 'Summary'), - ('home_page', 'Home-page'), - ('author', 'Author'), - ('author_email', 'Author-email'), - ('license', 'License'), - ('description', 'Description'), - ('keywords', 'Keywords'), - ('platform', 'Platform'), - ('classifiers', 'Classifier'), - ('download_url', 'Download-URL'), - ) - - data = {} - for key, field_name in mapping_1_0: - if not skip_missing or field_name in self._fields: - data[key] = self[field_name] - - if self['Metadata-Version'] == '1.2': - mapping_1_2 = ( - ('requires_dist', 'Requires-Dist'), - ('requires_python', 'Requires-Python'), - ('requires_external', 'Requires-External'), - ('provides_dist', 'Provides-Dist'), - ('obsoletes_dist', 'Obsoletes-Dist'), - ('project_url', 'Project-URL'), - ('maintainer', 'Maintainer'), - ('maintainer_email', 'Maintainer-email'), - ) - for key, field_name in mapping_1_2: - if not skip_missing or field_name in self._fields: - if key != 'project_url': - data[key] = self[field_name] - else: - data[key] = [','.join(u) for u in self[field_name]] - - elif self['Metadata-Version'] == '1.1': - mapping_1_1 = ( - ('provides', 'Provides'), - ('requires', 'Requires'), - ('obsoletes', 'Obsoletes'), - ) - for key, field_name in mapping_1_1: - if not skip_missing or field_name in self._fields: - data[key] = self[field_name] - - return data - - def add_requirements(self, requirements): - if self['Metadata-Version'] == '1.1': - # we can't have 1.1 metadata *and* Setuptools requires - for field in ('Obsoletes', 'Requires', 'Provides'): - if field in self: - del self[field] - self['Requires-Dist'] += requirements - - # Mapping API - # TODO could add iter* variants - - def keys(self): - return list(_version2fieldlist(self['Metadata-Version'])) - - def __iter__(self): - for key in self.keys(): - yield key - - def values(self): - return [self[key] for key in self.keys()] - - def items(self): - return [(key, self[key]) for key in self.keys()] - - def __repr__(self): - return '<%s %s %s>' % (self.__class__.__name__, self.name, - self.version) - - -METADATA_FILENAME = 'pydist.json' -WHEEL_METADATA_FILENAME = 'metadata.json' -LEGACY_METADATA_FILENAME = 'METADATA' - - -class Metadata(object): - """ - The metadata of a release. This implementation uses 2.0 (JSON) - metadata where possible. If not possible, it wraps a LegacyMetadata - instance which handles the key-value metadata format. - """ - - METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$') - - NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) - - VERSION_MATCHER = PEP440_VERSION_RE - - SUMMARY_MATCHER = re.compile('.{1,2047}') - - METADATA_VERSION = '2.0' - - GENERATOR = 'distlib (%s)' % __version__ - - MANDATORY_KEYS = { - 'name': (), - 'version': (), - 'summary': ('legacy',), - } - - INDEX_KEYS = ('name version license summary description author ' - 'author_email keywords platform home_page classifiers ' - 'download_url') - - DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' - 'dev_requires provides meta_requires obsoleted_by ' - 'supports_environments') - - SYNTAX_VALIDATORS = { - 'metadata_version': (METADATA_VERSION_MATCHER, ()), - 'name': (NAME_MATCHER, ('legacy',)), - 'version': (VERSION_MATCHER, ('legacy',)), - 'summary': (SUMMARY_MATCHER, ('legacy',)), - } - - __slots__ = ('_legacy', '_data', 'scheme') - - def __init__(self, path=None, fileobj=None, mapping=None, - scheme='default'): - if [path, fileobj, mapping].count(None) < 2: - raise TypeError('path, fileobj and mapping are exclusive') - self._legacy = None - self._data = None - self.scheme = scheme - #import pdb; pdb.set_trace() - if mapping is not None: - try: - self._validate_mapping(mapping, scheme) - self._data = mapping - except MetadataUnrecognizedVersionError: - self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) - self.validate() - else: - data = None - if path: - with open(path, 'rb') as f: - data = f.read() - elif fileobj: - data = fileobj.read() - if data is None: - # Initialised with no args - to be added - self._data = { - 'metadata_version': self.METADATA_VERSION, - 'generator': self.GENERATOR, - } - else: - if not isinstance(data, text_type): - data = data.decode('utf-8') - try: - self._data = json.loads(data) - self._validate_mapping(self._data, scheme) - except ValueError: - # Note: MetadataUnrecognizedVersionError does not - # inherit from ValueError (it's a DistlibException, - # which should not inherit from ValueError). - # The ValueError comes from the json.load - if that - # succeeds and we get a validation error, we want - # that to propagate - self._legacy = LegacyMetadata(fileobj=StringIO(data), - scheme=scheme) - self.validate() - - common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) - - none_list = (None, list) - none_dict = (None, dict) - - mapped_keys = { - 'run_requires': ('Requires-Dist', list), - 'build_requires': ('Setup-Requires-Dist', list), - 'dev_requires': none_list, - 'test_requires': none_list, - 'meta_requires': none_list, - 'extras': ('Provides-Extra', list), - 'modules': none_list, - 'namespaces': none_list, - 'exports': none_dict, - 'commands': none_dict, - 'classifiers': ('Classifier', list), - 'source_url': ('Download-URL', None), - 'metadata_version': ('Metadata-Version', None), - } - - del none_list, none_dict - - def __getattribute__(self, key): - common = object.__getattribute__(self, 'common_keys') - mapped = object.__getattribute__(self, 'mapped_keys') - if key in mapped: - lk, maker = mapped[key] - if self._legacy: - if lk is None: - result = None if maker is None else maker() - else: - result = self._legacy.get(lk) - else: - value = None if maker is None else maker() - if key not in ('commands', 'exports', 'modules', 'namespaces', - 'classifiers'): - result = self._data.get(key, value) - else: - # special cases for PEP 459 - sentinel = object() - result = sentinel - d = self._data.get('extensions') - if d: - if key == 'commands': - result = d.get('python.commands', value) - elif key == 'classifiers': - d = d.get('python.details') - if d: - result = d.get(key, value) - else: - d = d.get('python.exports') - if not d: - d = self._data.get('python.exports') - if d: - result = d.get(key, value) - if result is sentinel: - result = value - elif key not in common: - result = object.__getattribute__(self, key) - elif self._legacy: - result = self._legacy.get(key) - else: - result = self._data.get(key) - return result - - def _validate_value(self, key, value, scheme=None): - if key in self.SYNTAX_VALIDATORS: - pattern, exclusions = self.SYNTAX_VALIDATORS[key] - if (scheme or self.scheme) not in exclusions: - m = pattern.match(value) - if not m: - raise MetadataInvalidError("'%s' is an invalid value for " - "the '%s' property" % (value, - key)) - - def __setattr__(self, key, value): - self._validate_value(key, value) - common = object.__getattribute__(self, 'common_keys') - mapped = object.__getattribute__(self, 'mapped_keys') - if key in mapped: - lk, _ = mapped[key] - if self._legacy: - if lk is None: - raise NotImplementedError - self._legacy[lk] = value - elif key not in ('commands', 'exports', 'modules', 'namespaces', - 'classifiers'): - self._data[key] = value - else: - # special cases for PEP 459 - d = self._data.setdefault('extensions', {}) - if key == 'commands': - d['python.commands'] = value - elif key == 'classifiers': - d = d.setdefault('python.details', {}) - d[key] = value - else: - d = d.setdefault('python.exports', {}) - d[key] = value - elif key not in common: - object.__setattr__(self, key, value) - else: - if key == 'keywords': - if isinstance(value, string_types): - value = value.strip() - if value: - value = value.split() - else: - value = [] - if self._legacy: - self._legacy[key] = value - else: - self._data[key] = value - - @property - def name_and_version(self): - return _get_name_and_version(self.name, self.version, True) - - @property - def provides(self): - if self._legacy: - result = self._legacy['Provides-Dist'] - else: - result = self._data.setdefault('provides', []) - s = '%s (%s)' % (self.name, self.version) - if s not in result: - result.append(s) - return result - - @provides.setter - def provides(self, value): - if self._legacy: - self._legacy['Provides-Dist'] = value - else: - self._data['provides'] = value - - def get_requirements(self, reqts, extras=None, env=None): - """ - Base method to get dependencies, given a set of extras - to satisfy and an optional environment context. - :param reqts: A list of sometimes-wanted dependencies, - perhaps dependent on extras and environment. - :param extras: A list of optional components being requested. - :param env: An optional environment for marker evaluation. - """ - if self._legacy: - result = reqts - else: - result = [] - extras = get_extras(extras or [], self.extras) - for d in reqts: - if 'extra' not in d and 'environment' not in d: - # unconditional - include = True - else: - if 'extra' not in d: - # Not extra-dependent - only environment-dependent - include = True - else: - include = d.get('extra') in extras - if include: - # Not excluded because of extras, check environment - marker = d.get('environment') - if marker: - include = interpret(marker, env) - if include: - result.extend(d['requires']) - for key in ('build', 'dev', 'test'): - e = ':%s:' % key - if e in extras: - extras.remove(e) - # A recursive call, but it should terminate since 'test' - # has been removed from the extras - reqts = self._data.get('%s_requires' % key, []) - result.extend(self.get_requirements(reqts, extras=extras, - env=env)) - return result - - @property - def dictionary(self): - if self._legacy: - return self._from_legacy() - return self._data - - @property - def dependencies(self): - if self._legacy: - raise NotImplementedError - else: - return extract_by_key(self._data, self.DEPENDENCY_KEYS) - - @dependencies.setter - def dependencies(self, value): - if self._legacy: - raise NotImplementedError - else: - self._data.update(value) - - def _validate_mapping(self, mapping, scheme): - if mapping.get('metadata_version') != self.METADATA_VERSION: - raise MetadataUnrecognizedVersionError() - missing = [] - for key, exclusions in self.MANDATORY_KEYS.items(): - if key not in mapping: - if scheme not in exclusions: - missing.append(key) - if missing: - msg = 'Missing metadata items: %s' % ', '.join(missing) - raise MetadataMissingError(msg) - for k, v in mapping.items(): - self._validate_value(k, v, scheme) - - def validate(self): - if self._legacy: - missing, warnings = self._legacy.check(True) - if missing or warnings: - logger.warning('Metadata: missing: %s, warnings: %s', - missing, warnings) - else: - self._validate_mapping(self._data, self.scheme) - - def todict(self): - if self._legacy: - return self._legacy.todict(True) - else: - result = extract_by_key(self._data, self.INDEX_KEYS) - return result - - def _from_legacy(self): - assert self._legacy and not self._data - result = { - 'metadata_version': self.METADATA_VERSION, - 'generator': self.GENERATOR, - } - lmd = self._legacy.todict(True) # skip missing ones - for k in ('name', 'version', 'license', 'summary', 'description', - 'classifier'): - if k in lmd: - if k == 'classifier': - nk = 'classifiers' - else: - nk = k - result[nk] = lmd[k] - kw = lmd.get('Keywords', []) - if kw == ['']: - kw = [] - result['keywords'] = kw - keys = (('requires_dist', 'run_requires'), - ('setup_requires_dist', 'build_requires')) - for ok, nk in keys: - if ok in lmd and lmd[ok]: - result[nk] = [{'requires': lmd[ok]}] - result['provides'] = self.provides - author = {} - maintainer = {} - return result - - LEGACY_MAPPING = { - 'name': 'Name', - 'version': 'Version', - 'license': 'License', - 'summary': 'Summary', - 'description': 'Description', - 'classifiers': 'Classifier', - } - - def _to_legacy(self): - def process_entries(entries): - reqts = set() - for e in entries: - extra = e.get('extra') - env = e.get('environment') - rlist = e['requires'] - for r in rlist: - if not env and not extra: - reqts.add(r) - else: - marker = '' - if extra: - marker = 'extra == "%s"' % extra - if env: - if marker: - marker = '(%s) and %s' % (env, marker) - else: - marker = env - reqts.add(';'.join((r, marker))) - return reqts - - assert self._data and not self._legacy - result = LegacyMetadata() - nmd = self._data - for nk, ok in self.LEGACY_MAPPING.items(): - if nk in nmd: - result[ok] = nmd[nk] - r1 = process_entries(self.run_requires + self.meta_requires) - r2 = process_entries(self.build_requires + self.dev_requires) - if self.extras: - result['Provides-Extra'] = sorted(self.extras) - result['Requires-Dist'] = sorted(r1) - result['Setup-Requires-Dist'] = sorted(r2) - # TODO: other fields such as contacts - return result - - def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): - if [path, fileobj].count(None) != 1: - raise ValueError('Exactly one of path and fileobj is needed') - self.validate() - if legacy: - if self._legacy: - legacy_md = self._legacy - else: - legacy_md = self._to_legacy() - if path: - legacy_md.write(path, skip_unknown=skip_unknown) - else: - legacy_md.write_file(fileobj, skip_unknown=skip_unknown) - else: - if self._legacy: - d = self._from_legacy() - else: - d = self._data - if fileobj: - json.dump(d, fileobj, ensure_ascii=True, indent=2, - sort_keys=True) - else: - with codecs.open(path, 'w', 'utf-8') as f: - json.dump(d, f, ensure_ascii=True, indent=2, - sort_keys=True) - - def add_requirements(self, requirements): - if self._legacy: - self._legacy.add_requirements(requirements) - else: - run_requires = self._data.setdefault('run_requires', []) - always = None - for entry in run_requires: - if 'environment' not in entry and 'extra' not in entry: - always = entry - break - if always is None: - always = { 'requires': requirements } - run_requires.insert(0, always) - else: - rset = set(always['requires']) | set(requirements) - always['requires'] = sorted(rset) - - def __repr__(self): - name = self.name or '(no name)' - version = self.version or 'no version' - return '<%s %s %s (%s)>' % (self.__class__.__name__, - self.metadata_version, name, version) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/resources.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/resources.py deleted file mode 100644 index 1884016..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/resources.py +++ /dev/null @@ -1,355 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from __future__ import unicode_literals - -import bisect -import io -import logging -import os -import pkgutil -import shutil -import sys -import types -import zipimport - -from . import DistlibException -from .util import cached_property, get_cache_base, path_to_cache_dir, Cache - -logger = logging.getLogger(__name__) - - -cache = None # created when needed - - -class ResourceCache(Cache): - def __init__(self, base=None): - if base is None: - # Use native string to avoid issues on 2.x: see Python #20140. - base = os.path.join(get_cache_base(), str('resource-cache')) - super(ResourceCache, self).__init__(base) - - def is_stale(self, resource, path): - """ - Is the cache stale for the given resource? - - :param resource: The :class:`Resource` being cached. - :param path: The path of the resource in the cache. - :return: True if the cache is stale. - """ - # Cache invalidation is a hard problem :-) - return True - - def get(self, resource): - """ - Get a resource into the cache, - - :param resource: A :class:`Resource` instance. - :return: The pathname of the resource in the cache. - """ - prefix, path = resource.finder.get_cache_info(resource) - if prefix is None: - result = path - else: - result = os.path.join(self.base, self.prefix_to_dir(prefix), path) - dirname = os.path.dirname(result) - if not os.path.isdir(dirname): - os.makedirs(dirname) - if not os.path.exists(result): - stale = True - else: - stale = self.is_stale(resource, path) - if stale: - # write the bytes of the resource to the cache location - with open(result, 'wb') as f: - f.write(resource.bytes) - return result - - -class ResourceBase(object): - def __init__(self, finder, name): - self.finder = finder - self.name = name - - -class Resource(ResourceBase): - """ - A class representing an in-package resource, such as a data file. This is - not normally instantiated by user code, but rather by a - :class:`ResourceFinder` which manages the resource. - """ - is_container = False # Backwards compatibility - - def as_stream(self): - """ - Get the resource as a stream. - - This is not a property to make it obvious that it returns a new stream - each time. - """ - return self.finder.get_stream(self) - - @cached_property - def file_path(self): - global cache - if cache is None: - cache = ResourceCache() - return cache.get(self) - - @cached_property - def bytes(self): - return self.finder.get_bytes(self) - - @cached_property - def size(self): - return self.finder.get_size(self) - - -class ResourceContainer(ResourceBase): - is_container = True # Backwards compatibility - - @cached_property - def resources(self): - return self.finder.get_resources(self) - - -class ResourceFinder(object): - """ - Resource finder for file system resources. - """ - - if sys.platform.startswith('java'): - skipped_extensions = ('.pyc', '.pyo', '.class') - else: - skipped_extensions = ('.pyc', '.pyo') - - def __init__(self, module): - self.module = module - self.loader = getattr(module, '__loader__', None) - self.base = os.path.dirname(getattr(module, '__file__', '')) - - def _adjust_path(self, path): - return os.path.realpath(path) - - def _make_path(self, resource_name): - # Issue #50: need to preserve type of path on Python 2.x - # like os.path._get_sep - if isinstance(resource_name, bytes): # should only happen on 2.x - sep = b'/' - else: - sep = '/' - parts = resource_name.split(sep) - parts.insert(0, self.base) - result = os.path.join(*parts) - return self._adjust_path(result) - - def _find(self, path): - return os.path.exists(path) - - def get_cache_info(self, resource): - return None, resource.path - - def find(self, resource_name): - path = self._make_path(resource_name) - if not self._find(path): - result = None - else: - if self._is_directory(path): - result = ResourceContainer(self, resource_name) - else: - result = Resource(self, resource_name) - result.path = path - return result - - def get_stream(self, resource): - return open(resource.path, 'rb') - - def get_bytes(self, resource): - with open(resource.path, 'rb') as f: - return f.read() - - def get_size(self, resource): - return os.path.getsize(resource.path) - - def get_resources(self, resource): - def allowed(f): - return (f != '__pycache__' and not - f.endswith(self.skipped_extensions)) - return set([f for f in os.listdir(resource.path) if allowed(f)]) - - def is_container(self, resource): - return self._is_directory(resource.path) - - _is_directory = staticmethod(os.path.isdir) - - def iterator(self, resource_name): - resource = self.find(resource_name) - if resource is not None: - todo = [resource] - while todo: - resource = todo.pop(0) - yield resource - if resource.is_container: - rname = resource.name - for name in resource.resources: - if not rname: - new_name = name - else: - new_name = '/'.join([rname, name]) - child = self.find(new_name) - if child.is_container: - todo.append(child) - else: - yield child - - -class ZipResourceFinder(ResourceFinder): - """ - Resource finder for resources in .zip files. - """ - def __init__(self, module): - super(ZipResourceFinder, self).__init__(module) - archive = self.loader.archive - self.prefix_len = 1 + len(archive) - # PyPy doesn't have a _files attr on zipimporter, and you can't set one - if hasattr(self.loader, '_files'): - self._files = self.loader._files - else: - self._files = zipimport._zip_directory_cache[archive] - self.index = sorted(self._files) - - def _adjust_path(self, path): - return path - - def _find(self, path): - path = path[self.prefix_len:] - if path in self._files: - result = True - else: - if path and path[-1] != os.sep: - path = path + os.sep - i = bisect.bisect(self.index, path) - try: - result = self.index[i].startswith(path) - except IndexError: - result = False - if not result: - logger.debug('_find failed: %r %r', path, self.loader.prefix) - else: - logger.debug('_find worked: %r %r', path, self.loader.prefix) - return result - - def get_cache_info(self, resource): - prefix = self.loader.archive - path = resource.path[1 + len(prefix):] - return prefix, path - - def get_bytes(self, resource): - return self.loader.get_data(resource.path) - - def get_stream(self, resource): - return io.BytesIO(self.get_bytes(resource)) - - def get_size(self, resource): - path = resource.path[self.prefix_len:] - return self._files[path][3] - - def get_resources(self, resource): - path = resource.path[self.prefix_len:] - if path and path[-1] != os.sep: - path += os.sep - plen = len(path) - result = set() - i = bisect.bisect(self.index, path) - while i < len(self.index): - if not self.index[i].startswith(path): - break - s = self.index[i][plen:] - result.add(s.split(os.sep, 1)[0]) # only immediate children - i += 1 - return result - - def _is_directory(self, path): - path = path[self.prefix_len:] - if path and path[-1] != os.sep: - path += os.sep - i = bisect.bisect(self.index, path) - try: - result = self.index[i].startswith(path) - except IndexError: - result = False - return result - -_finder_registry = { - type(None): ResourceFinder, - zipimport.zipimporter: ZipResourceFinder -} - -try: - # In Python 3.6, _frozen_importlib -> _frozen_importlib_external - try: - import _frozen_importlib_external as _fi - except ImportError: - import _frozen_importlib as _fi - _finder_registry[_fi.SourceFileLoader] = ResourceFinder - _finder_registry[_fi.FileFinder] = ResourceFinder - del _fi -except (ImportError, AttributeError): - pass - - -def register_finder(loader, finder_maker): - _finder_registry[type(loader)] = finder_maker - -_finder_cache = {} - - -def finder(package): - """ - Return a resource finder for a package. - :param package: The name of the package. - :return: A :class:`ResourceFinder` instance for the package. - """ - if package in _finder_cache: - result = _finder_cache[package] - else: - if package not in sys.modules: - __import__(package) - module = sys.modules[package] - path = getattr(module, '__path__', None) - if path is None: - raise DistlibException('You cannot get a finder for a module, ' - 'only for a package') - loader = getattr(module, '__loader__', None) - finder_maker = _finder_registry.get(type(loader)) - if finder_maker is None: - raise DistlibException('Unable to locate finder for %r' % package) - result = finder_maker(module) - _finder_cache[package] = result - return result - - -_dummy_module = types.ModuleType(str('__dummy__')) - - -def finder_for_path(path): - """ - Return a resource finder for a path, which should represent a container. - - :param path: The path. - :return: A :class:`ResourceFinder` instance for the path. - """ - result = None - # calls any path hooks, gets importer into cache - pkgutil.get_importer(path) - loader = sys.path_importer_cache.get(path) - finder = _finder_registry.get(type(loader)) - if finder: - module = _dummy_module - module.__file__ = os.path.join(path, '') - module.__loader__ = loader - result = finder(module) - return result diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/scripts.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/scripts.py deleted file mode 100644 index 8e22cb9..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/scripts.py +++ /dev/null @@ -1,417 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2015 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from io import BytesIO -import logging -import os -import re -import struct -import sys - -from .compat import sysconfig, detect_encoding, ZipFile -from .resources import finder -from .util import (FileOperator, get_export_entry, convert_path, - get_executable, in_venv) - -logger = logging.getLogger(__name__) - -_DEFAULT_MANIFEST = ''' -<?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> - <assemblyIdentity version="1.0.0.0" - processorArchitecture="X86" - name="%s" - type="win32"/> - - <!-- Identify the application security requirements. --> - <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> - <security> - <requestedPrivileges> - <requestedExecutionLevel level="asInvoker" uiAccess="false"/> - </requestedPrivileges> - </security> - </trustInfo> -</assembly>'''.strip() - -# check if Python is called on the first line with this expression -FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') -SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*- -if __name__ == '__main__': - import sys, re - - def _resolve(module, func): - __import__(module) - mod = sys.modules[module] - parts = func.split('.') - result = getattr(mod, parts.pop(0)) - for p in parts: - result = getattr(result, p) - return result - - try: - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - - func = _resolve('%(module)s', '%(func)s') - rc = func() # None interpreted as 0 - except Exception as e: # only supporting Python >= 2.6 - sys.stderr.write('%%s\n' %% e) - rc = 1 - sys.exit(rc) -''' - - -def _enquote_executable(executable): - if ' ' in executable: - # make sure we quote only the executable in case of env - # for example /usr/bin/env "/dir with spaces/bin/jython" - # instead of "/usr/bin/env /dir with spaces/bin/jython" - # otherwise whole - if executable.startswith('/usr/bin/env '): - env, _executable = executable.split(' ', 1) - if ' ' in _executable and not _executable.startswith('"'): - executable = '%s "%s"' % (env, _executable) - else: - if not executable.startswith('"'): - executable = '"%s"' % executable - return executable - - -class ScriptMaker(object): - """ - A class to copy or create scripts from source scripts or callable - specifications. - """ - script_template = SCRIPT_TEMPLATE - - executable = None # for shebangs - - def __init__(self, source_dir, target_dir, add_launchers=True, - dry_run=False, fileop=None): - self.source_dir = source_dir - self.target_dir = target_dir - self.add_launchers = add_launchers - self.force = False - self.clobber = False - # It only makes sense to set mode bits on POSIX. - self.set_mode = (os.name == 'posix') or (os.name == 'java' and - os._name == 'posix') - self.variants = set(('', 'X.Y')) - self._fileop = fileop or FileOperator(dry_run) - - self._is_nt = os.name == 'nt' or ( - os.name == 'java' and os._name == 'nt') - - def _get_alternate_executable(self, executable, options): - if options.get('gui', False) and self._is_nt: # pragma: no cover - dn, fn = os.path.split(executable) - fn = fn.replace('python', 'pythonw') - executable = os.path.join(dn, fn) - return executable - - if sys.platform.startswith('java'): # pragma: no cover - def _is_shell(self, executable): - """ - Determine if the specified executable is a script - (contains a #! line) - """ - try: - with open(executable) as fp: - return fp.read(2) == '#!' - except (OSError, IOError): - logger.warning('Failed to open %s', executable) - return False - - def _fix_jython_executable(self, executable): - if self._is_shell(executable): - # Workaround for Jython is not needed on Linux systems. - import java - - if java.lang.System.getProperty('os.name') == 'Linux': - return executable - elif executable.lower().endswith('jython.exe'): - # Use wrapper exe for Jython on Windows - return executable - return '/usr/bin/env %s' % executable - - def _build_shebang(self, executable, post_interp): - """ - Build a shebang line. In the simple case (on Windows, or a shebang line - which is not too long or contains spaces) use a simple formulation for - the shebang. Otherwise, use /bin/sh as the executable, with a contrived - shebang which allows the script to run either under Python or sh, using - suitable quoting. Thanks to Harald Nordgren for his input. - - See also: http://www.in-ulm.de/~mascheck/various/shebang/#length - https://hg.mozilla.org/mozilla-central/file/tip/mach - """ - if os.name != 'posix': - simple_shebang = True - else: - # Add 3 for '#!' prefix and newline suffix. - shebang_length = len(executable) + len(post_interp) + 3 - if sys.platform == 'darwin': - max_shebang_length = 512 - else: - max_shebang_length = 127 - simple_shebang = ((b' ' not in executable) and - (shebang_length <= max_shebang_length)) - - if simple_shebang: - result = b'#!' + executable + post_interp + b'\n' - else: - result = b'#!/bin/sh\n' - result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' - result += b"' '''" - return result - - def _get_shebang(self, encoding, post_interp=b'', options=None): - enquote = True - if self.executable: - executable = self.executable - enquote = False # assume this will be taken care of - elif not sysconfig.is_python_build(): - executable = get_executable() - elif in_venv(): # pragma: no cover - executable = os.path.join(sysconfig.get_path('scripts'), - 'python%s' % sysconfig.get_config_var('EXE')) - else: # pragma: no cover - executable = os.path.join( - sysconfig.get_config_var('BINDIR'), - 'python%s%s' % (sysconfig.get_config_var('VERSION'), - sysconfig.get_config_var('EXE'))) - if options: - executable = self._get_alternate_executable(executable, options) - - if sys.platform.startswith('java'): # pragma: no cover - executable = self._fix_jython_executable(executable) - # Normalise case for Windows - executable = os.path.normcase(executable) - # If the user didn't specify an executable, it may be necessary to - # cater for executable paths with spaces (not uncommon on Windows) - if enquote: - executable = _enquote_executable(executable) - # Issue #51: don't use fsencode, since we later try to - # check that the shebang is decodable using utf-8. - executable = executable.encode('utf-8') - # in case of IronPython, play safe and enable frames support - if (sys.platform == 'cli' and '-X:Frames' not in post_interp - and '-X:FullFrames' not in post_interp): # pragma: no cover - post_interp += b' -X:Frames' - shebang = self._build_shebang(executable, post_interp) - # Python parser starts to read a script using UTF-8 until - # it gets a #coding:xxx cookie. The shebang has to be the - # first line of a file, the #coding:xxx cookie cannot be - # written before. So the shebang has to be decodable from - # UTF-8. - try: - shebang.decode('utf-8') - except UnicodeDecodeError: # pragma: no cover - raise ValueError( - 'The shebang (%r) is not decodable from utf-8' % shebang) - # If the script is encoded to a custom encoding (use a - # #coding:xxx cookie), the shebang has to be decodable from - # the script encoding too. - if encoding != 'utf-8': - try: - shebang.decode(encoding) - except UnicodeDecodeError: # pragma: no cover - raise ValueError( - 'The shebang (%r) is not decodable ' - 'from the script encoding (%r)' % (shebang, encoding)) - return shebang - - def _get_script_text(self, entry): - return self.script_template % dict(module=entry.prefix, - func=entry.suffix) - - manifest = _DEFAULT_MANIFEST - - def get_manifest(self, exename): - base = os.path.basename(exename) - return self.manifest % base - - def _write_script(self, names, shebang, script_bytes, filenames, ext): - use_launcher = self.add_launchers and self._is_nt - linesep = os.linesep.encode('utf-8') - if not shebang.endswith(linesep): - shebang += linesep - if not use_launcher: - script_bytes = shebang + script_bytes - else: # pragma: no cover - if ext == 'py': - launcher = self._get_launcher('t') - else: - launcher = self._get_launcher('w') - stream = BytesIO() - with ZipFile(stream, 'w') as zf: - zf.writestr('__main__.py', script_bytes) - zip_data = stream.getvalue() - script_bytes = launcher + shebang + zip_data - for name in names: - outname = os.path.join(self.target_dir, name) - if use_launcher: # pragma: no cover - n, e = os.path.splitext(outname) - if e.startswith('.py'): - outname = n - outname = '%s.exe' % outname - try: - self._fileop.write_binary_file(outname, script_bytes) - except Exception: - # Failed writing an executable - it might be in use. - logger.warning('Failed to write executable - trying to ' - 'use .deleteme logic') - dfname = '%s.deleteme' % outname - if os.path.exists(dfname): - os.remove(dfname) # Not allowed to fail here - os.rename(outname, dfname) # nor here - self._fileop.write_binary_file(outname, script_bytes) - logger.debug('Able to replace executable using ' - '.deleteme logic') - try: - os.remove(dfname) - except Exception: - pass # still in use - ignore error - else: - if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover - outname = '%s.%s' % (outname, ext) - if os.path.exists(outname) and not self.clobber: - logger.warning('Skipping existing file %s', outname) - continue - self._fileop.write_binary_file(outname, script_bytes) - if self.set_mode: - self._fileop.set_executable_mode([outname]) - filenames.append(outname) - - def _make_script(self, entry, filenames, options=None): - post_interp = b'' - if options: - args = options.get('interpreter_args', []) - if args: - args = ' %s' % ' '.join(args) - post_interp = args.encode('utf-8') - shebang = self._get_shebang('utf-8', post_interp, options=options) - script = self._get_script_text(entry).encode('utf-8') - name = entry.name - scriptnames = set() - if '' in self.variants: - scriptnames.add(name) - if 'X' in self.variants: - scriptnames.add('%s%s' % (name, sys.version[0])) - if 'X.Y' in self.variants: - scriptnames.add('%s-%s' % (name, sys.version[:3])) - if options and options.get('gui', False): - ext = 'pyw' - else: - ext = 'py' - self._write_script(scriptnames, shebang, script, filenames, ext) - - def _copy_script(self, script, filenames): - adjust = False - script = os.path.join(self.source_dir, convert_path(script)) - outname = os.path.join(self.target_dir, os.path.basename(script)) - if not self.force and not self._fileop.newer(script, outname): - logger.debug('not copying %s (up-to-date)', script) - return - - # Always open the file, but ignore failures in dry-run mode -- - # that way, we'll get accurate feedback if we can read the - # script. - try: - f = open(script, 'rb') - except IOError: # pragma: no cover - if not self.dry_run: - raise - f = None - else: - first_line = f.readline() - if not first_line: # pragma: no cover - logger.warning('%s: %s is an empty file (skipping)', - self.get_command_name(), script) - return - - match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) - if match: - adjust = True - post_interp = match.group(1) or b'' - - if not adjust: - if f: - f.close() - self._fileop.copy_file(script, outname) - if self.set_mode: - self._fileop.set_executable_mode([outname]) - filenames.append(outname) - else: - logger.info('copying and adjusting %s -> %s', script, - self.target_dir) - if not self._fileop.dry_run: - encoding, lines = detect_encoding(f.readline) - f.seek(0) - shebang = self._get_shebang(encoding, post_interp) - if b'pythonw' in first_line: # pragma: no cover - ext = 'pyw' - else: - ext = 'py' - n = os.path.basename(outname) - self._write_script([n], shebang, f.read(), filenames, ext) - if f: - f.close() - - @property - def dry_run(self): - return self._fileop.dry_run - - @dry_run.setter - def dry_run(self, value): - self._fileop.dry_run = value - - if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover - # Executable launcher support. - # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ - - def _get_launcher(self, kind): - if struct.calcsize('P') == 8: # 64-bit - bits = '64' - else: - bits = '32' - name = '%s%s.exe' % (kind, bits) - # Issue 31: don't hardcode an absolute package name, but - # determine it relative to the current package - distlib_package = __name__.rsplit('.', 1)[0] - result = finder(distlib_package).find(name).bytes - return result - - # Public API follows - - def make(self, specification, options=None): - """ - Make a script. - - :param specification: The specification, which is either a valid export - entry specification (to make a script from a - callable) or a filename (to make a script by - copying from a source location). - :param options: A dictionary of options controlling script generation. - :return: A list of all absolute pathnames written to. - """ - filenames = [] - entry = get_export_entry(specification) - if entry is None: - self._copy_script(specification, filenames) - else: - self._make_script(entry, filenames, options=options) - return filenames - - def make_multiple(self, specifications, options=None): - """ - Take a list of specifications and make scripts from them, - :param specifications: A list of specifications. - :return: A list of all absolute pathnames written to, - """ - filenames = [] - for specification in specifications: - filenames.extend(self.make(specification, options)) - return filenames diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t32.exe b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t32.exe deleted file mode 100644 index a09d926872d84ae22a617dfe9ebb560d420b37de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92672 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t64.exe b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t64.exe deleted file mode 100644 index 9da9b40de922fb203df6b9a1d0ad4139af536850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102400 zcmeEvi+>c=+5c`fOO{-i<+2dK$O?<1QH+h3#3i}|yE0og5*0L6Kr|S!pwciSs33`x z)NGF1(!RE}t*y4z)>^H#RSBrDA&?6f33v;j62;3|2Q{E3;X1$Xb7nV*Xy4EK2mJVG zX69U<^PJ~AxAUB{r8lm%IczptI{r6Jo2?N~`WFy?|Mx%L$R0Lf!!X;6LwBClXpihX zYtG_3mV1{~-F<u2Eq8h=Zn^8OyH)S4w|T3yyS#VY<qgih&U@$Gi*B2mlauL7HvQbK zYfmH`r=Cy!e_v_k^Bmtt{y6vfHu0SE{2#<~;qzU1cHMvH^M~+EILzn&Ez--9<rgKN z72<jA9TkhI&C^Fv7P8qE{d9=!UrXM+F_qVCn`p~Q%e2|vN6J5~)KwSZ=@#z+J3Z(< z&1Q4bAN)%_MIw-w@o*aO7^q2AO4db5tC7@$>Lyd@)%HZ5-8PM0*4k}Pmf=}#w{-!O z{(s$e+fo4F{>o-Mqd)Qg@Y0R8El|I=@Kp7-l`3);yoWyo5RILPV9-CW&9-oA)uLO} zTWq#RFGU90v=!n15Apw?e*uuoRI8Y+79X|(06YrMad-~;7qHplQ<qr<#TYSGTQ&+z z{Z6^S)T-rG7041e0d8#9;^Xq~D|g${yHPMeL=0SsF+BX8a?_Ff|Nngt2I|_iJ0tAf zaP&HNX>>+zX>^uXsX3&85)|hA+a$Y9Dcqt&YkdVsiLh-O2*2UjjND*sx~aq>z5*p0 z^m+MHvu!s1k%Tg_Akt#WLM7&jpFm>87@KW9&4=k(d%$Mf(Y#}a5}oIBDN)tuzCqCs zd71N^LiEFqDeQ3J{s?Q2#HOE+Hg<$rJAZ08b=#)Y#nn9KG=D(lUYGs$uoT=IHk-ov zC>$(4VRR@=^%W_sSz+_gzrMwLbF=8jP5tC5(N#Y0TzQT>SH51pL1Bl`Zy>@Fk(kpD zAOY(~)6sOSv>;UYQ6zd>0UwoRv&n2nT^xB{6p<cj;vJ_<Q(-8BF{Tyn;ZKeyER`1U zpO3R%A{E_oY~u+Ot21RuIT0$1vv>Gv6pM&zt9*8uy(2fK10P|wlb<tMJQdc#xoEqS z208(7bWtCpD8pz#+ZARw|D@tLo_G+5d<6?Ooo(l@<ygI<OOXEYI>6RF&}&Ar*C1;S zvv+_szTQLSU#CXzLvI)z#<u7<5;02FDgCO6e{m8cMDGfFLvExM%$Hi-Q@#9CfPmi( z=9Is>o5r2L`cTc6G?sy0e*sL;SW{zshlUwI$5wA=eyg`?^mcV@UcOoCf3Iqsw9Yvm z*_Cp!L(MGBKY+yLM+`?PJ1B7cCAeQCHqRFbvn^qEQ&E^L$Lsw{m>raFmKVtL<$3c{ zv^Dp7BCLW!VB~P@hN(3B3;C~yVx+MPvSwhSf#nP2^+d~<B89zO*iL1pDAA=puj%P~ z*Ji7WOSQE?z$PMHV>Jln!DCc^j&CuMeK|iM=A1qmK3ONf8l+mcU%OU(8$PS~2>WjH zzZK1E;|hs(eG4%Om!WCCho+}4uC*9W(Wz*M+X!mVbXo5KWqe$jv=y{naPtBh>S^mJ zps;-kJ8F8aLHmk6$<~UMND^Qp4M70X7Gc{J_6}CW6n&A;izQiyvaA!mW}BWn@UHg_ zk%I5jVk)=RQW^RS&|1<DO#!bM!E&~R?Y6ph)m6C1^z`h9#z4)Z)Rbmg*H~|>e7SR# z*iv6L7zuHBFp>omfOKLcp=AKEa8F^o>G=$GBe77IynZb;z&aIRqih4li;wMst(cyd zPzaMXyk?cJjEZR)f|nR+n6a2A<0$ZU`Ek>%Deblu3~nyfjOi&v3n+S`4+CxEIVfDX zhh}gYIM`yo`f6~e9@8{|tYwSQf$6zXRG1rAQ2ckaDr24lR^^Ukrn&wb6gEAVScTfC zkY*LyXBGMf75Z8fa$AMKo7#ApRp>3N&`(iFiRJtai5m!gt)XXac$%Ki_gPe49sw>D z!pO1^5ogdBP%vdhK=dMCfenAASfu+-VLL$gQX{5kHfjUhwdf?mTG8v7=qCv30g=w} zl>@E8XkMmbN6{b^1?4U@J<;TAxxNh}8=v|jS}!v_ldLuuS%B|6YMQ8p^ya-_=KVCd zlqMdG_6Fjy#MBk`86deHwXg<F&t%XRSgZV+3xLvGV^V|Cx>>GDkWzl7esrQbS!QqX z+eXlQYhzJ&9Mz4@a+w}ZcocQC9ZKDPH7o3RPhqDLyQr<0$Bu$>Bk2*u<s|fAF`MB? zuZu@m3-Rtz09=VZkSnc|sLSEhSszxcASd+bu<A@k9n|0-_o2AnnwBh{O~u=3fyXtj zumhFB;&aro(z+~4f5A%6RP^RFWK7aNO=dhQGE`S(Fgl4c6}F4d0|8oH9q9$Y0zQTH z5%c{C`mEHin5dmwsrx5dg-)Unz$cKdrR-EodP^FCH&D<Az|ja5JQoE40S!~&bhrh^ zSgLGDfLL1B#!tA#!pbJNq;-x;4D4fC_GL<RKJW-WtFWb@K-Nmal(_57kgZt3<&fNq zG1<!?R9AW}kxC04`WF_uHa@w~YkkX*VtSr@2Rw8l=BBc^NOi_$pE5F}b-NTjo-VE1 zO$)<BF;K=vK^TByXe4$){x{&c6C<(3X~qclHi27efjca$Z%vb>bs-x8{81!!$@zY} z?KP4?h3#SXc93l~J@=x^%Hom{$YC8?777i;tD=9Fro<lhEd)!f3`Kp{w>Y0a&u%N@ zZ}+BVq`;byq%8apY(a_XmaINOEXm)wd`xw5jw)3bXR4Ws*`)Z}s=hEBU}-d45Wq1{ zI!zcR^GVbW)}JGITK@3}Yi4h+Pn@*bf@~Lr3?vN}t?7CHZ9%L;%Q)5p3|0tAxE+-- zTZ>keDKRiU5Y-}InM$<F-saPxWnuMz+%W&3LycGJS5C6X<rB0))P6P^Fos#E8)22l zOcOb05aK>TjkBy8A0=yi4ZfDD(KReZ8v`|n8-OHsMWTy*0Y2nJ3TN*U)TBRf8udTX z3Q<u&;G+llI7ICu=Mm%-#>0BM3AHZFPR7d8DvvymRjl;xj>Ke272hZEt(ff*N0XHj z79|F!pg=e_&y|50;S({L=%h6TM4v4EY76@2lhIuSh%SnND-}dyIRqzW0g4R<L9EIW z_WTJUUw82U_ygFPkaK(_6chUB|5sTlO(1Omz4>!~k!!bU!<D8ccV%yrX=-U-H7iZ+ z?u0xV95E>a2eHBe1t{}|SeK>Yh6+EI*;b{lUHVlVQ!$2rF#-JFhPpO>KVA#ti5k3% zGJ8ZB^<8{mrq8p!Ugzm&01og&&`=p^3_1K6(MB%n8JkdYsy31TroUMr$YPEWDC%c; zVQQ`|j2jc6R)?^lE!}W8>VgdsPFtMx+DbeC5<`W80*%9B0KiA!I^ynO2EMvYVS6zS z&BOE2*DExFXf9uOCIoFW^q<CRBtY3DHU1Nleo+T;{dDx5!H-fYtjR6jo0@kRLo5B8 z)!~ZX1Ol}afqsbuEnQ(v&4qF39^hn`iGCxjNntrpoNu?0_QBr}40#Oy2U-I{OwV7D z0-kamzR{c2dJ1O9%z!XY0{jiYn-nPHiy>N74_{180K6=|fIy4*0#O&46W?wFBW{s% zQE-p8hR?qMRiZQ83R@eep+-k4tiDma&2lMz&oyV+ZR%)N-G-z(=SUd(nu`bWsU%p2 zGwlp8rQ#Vbb-co6xLLg@mU9TH+E5+_%S77%VTQX$w2-Ea(nXoHmKnKra8Y;KSJE2$ zU>LubKV!NA;ICl@xkVP1%(j%0a=VQH#q5pacjomI;4x5EBXpNFiGPUfJ?aOfD`CEO z^JAF92#CTPDy|r%U8&^vO6$(JqEbIDS7qYwjVsbC^=2<|7`;y<^@*goml%&??o<Pn zklp@Df2Z1FTr8~{Ml8k4zXBG)*u;mlu9F`mtR}@9)ykw=PO7y7f<Ri=oZl2If+nP9 zlloGi|B3K+QmDuzv63XqRzc^{w*=&QWD`JlEd;^tiLkxJ&IWLOZ3S?k-j^Id2Ay1h z$HphekGjxj>oERE{=ON~y6lnAQN*Z@icvLrA%#X%>c>RdF_E^}8`d|ch0QjCxt(C% zrf!keZI;%x=eL1ysYxhvd@e19l)emUnzDmwIq65cR;;qr|GIWX3LOQxzi=)H1vBO4 zMj;dykf)8;T!c51-dYJ?Eazbqg3d?FVs8hfbQ5Pdzu1`%XN)?G7WPrp#;9|QfAIS- z&Q{@i;dl4HDy+pA!QVhBeq(<knMY(%gAo(~Xfmr|HafRTc3ZQ>3z)O0%x-&ytVQ&g z(P#rtHk|%uDblP|v~3`{9(8(9gxf9yU{Pn{N*YgG^To<Q-`k^keY25y@KTYvBbk}e zI1Uw!dxV~U1A0@UqwI>l8Mb|sOEI^rL$QP&M`7a=GT~yL*(ei=DUL8}i^M#k61xpd zN@?nI>K{x9v-Hi%lJ@cl8)Xmc$4qFD`ms~0vlQ!iNNXDA!wj2oYCUYWYp<a_vFwR% z_?4I2Y}F-CPJxP{I{9uI0?Rp@pu`j=Zh<<N<cTzWv7BdzA;-VB>IxvKU<AE)uJ{2- zoyLDWBmSMI<nLB`KU12HfeCC=ni5yWBE#Lh+mB_iVM(r(>^e3}crk8L%*n%{=l1up zPd_?p^+>(R%{QK2<A?n<4!myZ<}pv60B2j(B>?A7!wH<W73WGDeu94Tw+(`+H*p$3 ziJLKQ;JN?+Jc{P1+Z<^_Rj!1-6VoX(h7Qfi_gj6@dde;uu3~PQumrTP!@ZrtU~OvN z5tvJU7h*(Y7D67*$NyT95?vjDuSLN`UO}K0ZdIZo=z=|^#H)@ZrORl(6S65KU4Df3 z#NC(+{+BBNg1@C|2o$A4V_%qsY)l!2bvH+bk^xb_fh?*ZNqW)&ynF;IL@K&KcvtfK zsLAt)GIRM|cxSc*_%8U6Lolx#{Jn7n7+Ks~NpeK!^@Um&WHU5V5Y~>c|Lf%=sb_v6 zH3e>MOUwru)x{sUo$Sl$T}tm^Mej?iDxU=g>Q-uwlDA>SMM@0L5`WW*Or^1#j6|sF zir&@D(`h*QU8L_7K$BF@ZOz!R0}Egze;Xu5q8SL5T5a#aUkirnHbCg7P*8L8=f<QK zbK*j@N0>;W00>E9VG-#&@PYB{62SyUfLFlpL2Th?(=h%{Bb(obc9KX@Vzawzim5Nn z$ydXkAkC>1Q?!#GC$*Si1{r3MVFnpyFm{`pTrluT2;UxgUjopI$s=Kjj}HC{S|NXj z*HXdwr_iygSHYtFK1L4C4Mu~7op=@_f`3x@CG|r^a6L{5M`v`0^$HH&7a(M8DI%T( zd)W)WPrr{3S_(P%*kL6aA^Ue*DLYz9O4t!4I>)z+=yhBv$i-7y*Q1@o7ejqX3W0Cn zh_Tq-N?MF5?-Ds(6!xmG8gorEGz{~sx0&JIuOt4pd(Kt#Q>N;M{Z+V!d|p19Pxd+$ z{L7$%eJg$yhPPFE{y^`{+-#7X!VGmtkj?fPL*Oxjl@kQG3t{C-wdKf8mXbFB4Qtc| zk%|?rP+gB&Ce@S4ANGF{l%{_ZVy{R1?b1V^0kQ~#VhqCyW9BdZ5Y3&t!X>ko2>AD6 zC7&yHWRvp)e-=g@-AaC2;!mO)@<XgC?B`XBLqLlc!|;E04-DMRA$COWJ#2vCZVj?; z!oA(W{3Avtz4|{3Ni&b2d7|jM$-EtlE<?%gV2?o;GZZ2?%bBM4nd%a7<$RvF2LqxC za{}aaGF8ZJfJK_#IdZ)~2!wywY=P!4FhXm1F-;}Pe4aQUL?{rR(~t1~fQ<Q{A%$A8 zn}gMO35w{mbG=Ibd%!=OpuJxwrdVli<FhbpO^n0Wj((kK8Eo2>xsm8XuW(=#gxO)i zhmJ+q2Sh9jiCAtTVMw#1O;kvZWJcI#ID#*uzRwnYgN$taKO?bnFQmow0nCcEf;J=U z^-}2l3?9)P{Av(?Qr*6RTtTcA9<4Yv9w12zmI$*i!WKcD5z4plzrmJ)Dpm^l#x^VP z)$jn}&?0|p9Ay}T;)+BA7>DA$j#dN7Fmk!|p!t-|k<0G`fJti4z$?f&aR7i*nUu{D zi7kTD^elqEXJ&3ds{1Jl(2QM*38fi3PwzXWPF5=5-hvoA>V%7Q*ClqF{^0~=$)57C zV^kZ&;hm!)p@-vT5ne!;DD(^p^-M2XqfMq(#!)LCC<;*alhT?bb=Z*|?~#kD)sg&l zxP+3h-h@~EbrTErJc48%AYq-Qj2K1I!L^GQf&!uZuy=rcDGXzWN**B=)&g8jfgfW5 zOpYCuz@<yr6wr5x^Y5$lw`pXYgc?b3;A^=Xl4;RcJ2Km)b?J(6ws00jz|kPc=J*PN ztjYA~t>k+EfjFgg$dJ}GN$a*xB5jXM8=-rK3ip??4j4?JBW(;n34cs-Kn-{Wllujs z7Ru&Fq~=``W-fYOV7vvjyE0TfR?Q8OT@>`kp~ykSgySr&GK97c!PXlG{yAVc?F1T) z{L|~%zptJq>Y;_P+Af29RAZ?ftmJSsGb{zk^qB&>`>#G9;p7trU@kvzU`Xr0!-$@4 z1QL1XRrt8yMRIp_x?bUe*#_$zo>x2Hbsf!9U3}#pc3p1oW*3TUnfc3ItR*o4@5~QU zS%ZBc_GSJOch6>rI*r6Gpy^lX;zTGtL6@r<1Oz+D$gD2P)Y8nY3UoQYqv|l|WIWrN zfI4ie-LvvAuLWop;uAMw>GW*2OSR7<lOWVG3O`T$86WxgyGz-jQuejuepk5ZlvCC} zo-m80cb6{tyj<=HI?>yz)F{&UP>jOgqD>Me+%Cn@mI9(x0MS%+xOYab%?oxg14PQ+ zCf~$c*vbS)tbZH)M`+9bz7@lJX5_lmEGi5&f%T~lcE1lg+iL81{Sdv2p3~Jdvo*gr z7Q6&YX~08APCM`mVijI%BP1yg!3{v<Vvh~V)F1}n;rGHRl%&BSc*TSn<M_pJnqawX z=NW*^at4sQ+wuh@wSOVsX`cj*lamAd#mnSene_>c?P(nf$r=5PQ@cObyS^;^Jc=@U zpB<*{GvIyfBt#E7nhN73$ZpCF)$YGHQ`Qfj2u5$pHO9$3&31JZ{<_p*vb5n~W>rS( z3?CU5ROzJ|RH;=+m*_PBzRwIuzuFoLfsYDP1#TbWq5(pPuve^o34l9*5Seunz(>D@ zl?ph%l33}^v9NLhtj|pSxLtMX$J4a;xErqhwb)Z5-Dwy9f)Le7Z)=fGO47XV>3fik zr<Xi~8O1R23d#IuhoxE_L`M>(P$|wEhD254OXeae>MQ`y<mb#GYPokPzaFH9HILoP zyk7FM0<c*Mbb+hL>z#*8AyBeNgckA~`u4ZpGge_)mHM=MOEk&S`1s9&`qUxNYF)-I zg*o7&T$z><KLvvgz5ca-x@;7B6gd;tX8?G9@r7Wsh5Ir5x*p4`HInB7e<`K?Nw}Yk zdz9#zqzyTg=mgeWTKAFV&3c=};X6QM1WG@+=xp){&jyT<*h2dT%s6S={PHg#>7ql( zY8=I1Lvu;v_1}19AQ(v2Fng1##xD|B8ZEktM9;Ax{3YlNPAQL&#IV7!7HJcTS7MhJ z6#w7F?tnh))pvou1iu@_FBc#PS>K8#vRaL+dgNSPy`0ZGk0xR}>*N2VNd&nLk<oV> z-*3&M6U`WK6wR7K6P3xmpOXx)m}1i_a&6X16K32Xx*fEJQF#!-j^h7D=ShOS60cAr z&ITL-b%=gTuFdG?w;oQe=u5!wtQGw!k_-?p5$fReA$Cj~OK&9Kx$~1<rU_5oexpdK zaC$lbVk~D5(iBHiO%a9AXb0D4VR9;qm0Yc}aKGM2-qB(A3@v`N4=>WMnz7^pd?e6> zDVwO5EFEdLrNMqacM|*-@VD6bCU44v;mpJ5Vt5>^qH?n6sfj26j&0+Q^cUTSs{E;& zFlqc|w1jn$xgHg5JP$=okGTmbk2<R_#JXV^3En?~4bC6>QL-#KBlzJ7_@iE*Orrfp z{yvg~aOd*?49GA8GuDp82y@;CcW)%>ydMvRdFJ84a<0W+zB@rUB}YD1FI8Ab4KK$Z zV+`xlSHaz=xsW^;DLeQQ{9S8JumZ#vV1h|E<1;ZDd{0T-gGE4g45l0VDfIvgNPiFD zo1U9D;e$EbfEjZ7mXp2%1!N)V%;kK2BaM`N!RWKhrpgL-1dC7~4FsV}A`1~2aC6ez z6bO}iG)nI<kg$~(VQ7)mr-fJ$x1%j%qQYu@0)VJ<4)qyJe(G_sGUo?WojETT&^Z4= zraQ{7rT(JMXOY?Jd=QC4({1rq=PJB`;ZcPj*{yD2j5+5f-<O%5A8#ZF(IJ$xX5ceS z9PJPP5b3}Gi_^?rf)Bl<1%;p`SmidOoatHgn$5O>y29c&JwvEY%@%?kGEl^|+~f*J zm*j?{%e@riGT1&0l(KtWrR*Xmr-#|SMWy+@rR;+U_AOcB=}M{Yb2JjJ_=ysZ&T2zw zOb6U!{>vo2hS;|Q_@CFB&1UpP{N2)nPopTCaf06U$MCM-pKg<Ce@SnCyE>M5EL@dg z_Ey-@YIcz9k0S2@wPv-gV)>n2+7v}E*$k()O+6DMUXM4fVsxOxVPbn&VLMIFpOMUF zrOS<kPSMsb{(y^KF}3Wv^hgB^bedsGm=bop6CtL!Q%tn!@c~bK4T{60(wp5hl67b& zQ4Gca4fJ1lFJ-c~@N?`>l;*cS?N$ASdy2>01IN*97n3ozcvS|o<8e>63G<`L?H{u| z*Z3Hwh$GG-t!`+nL)g;RY{L;`3BsGg-uGX&e6C_*cjREY;yA!&z*6q6Dz>n;{Gw3Z z=c+U4&sQ&^7yptI>J;5?!`?4wab@f(`wMm%!%>33Y^kGFHak+FSG^=~kc<Yo35Z=1 zKsd<YP!M9D7Vjoq1#%xApuuxrz%KdmnQ#~u_Jmm?6nnthpV<eG0gUModppG5hh}`a zmfF<yt37ZIS-98xZcz*LzAAN+-nT*>!!H=p&xAK%?*!PK0oJ(5?!Z#Yk=ZFZtJ`pG z8j5MtU&pR(bDGRLtSwimwi&4~xoW=#{^8!%k6yRtUiHUv{w}F@H<I*3mO9gHSFg|$ zx#~H3B2yi!A5GUD4xvun-%udLI`m!c#8Xs#!<QKeqP{>+E6g>bFnw1b(I8578mo|; zrro1|dP@J~guW|H+VDk&u?!7qx1td_%QPzV#2j_Do*1T1Lzm}K-(&QnL!`QKppo8I zTO4ceQuH#+D29hX%MY<OX+zI2BcHzV#Mc+YjJ#yYY?PD?N!svf_Hw7p-Zs*a0FxuN z-7M9mquCHSI<RPMMml8y=fE`9z*Dbc3#<_s1mk#v-?WexgH-nmut*deGPp3dz)PgM z6;@7v1D>U#0Za!P*v^lAO0GFEo0$M(gmE=I#y=88up~s0cLs{MQDnH0k0Mu#BBbO{ zD=&&7QeCFi*)SAye+!ggaiLUqh-`bTceqn_KuyI;r2vg;Of<jwW@{XKQN(o0*;vp) z-{Pp28x5TijB2plHFUHU4>$gY-A>L1Y-%hct!yPpjecj;Ao@=39~2bskIl04zfC4( z%p_-@zvPcauwG+_2>yy*u-&`h##Z!c-8QvSfmP8H$knyEy@6a?HRd)Fn|V_2bFXm6 zX1n=Hp8&O%7z4!KB~+1(Is#3%3Suw9@+Kh#e)X@Y4RYaiAnP4u8BXl18LQ0J#Jw2g z`f}9g51mPkv>}WQFno3niGgf5G}~2#iZm5$cmno<>1lxI!5p0l_j)T8VcAD{+DD?V zb@&eJzT-B-hX(#`<@Qls)AJSB7{Gaiim)?|lNv>;ab68xFe)-Sp<lW2XA-?Y(VBIJ zX-SY(P$6jlY(W1@%H?RzC2s6*khW-<IdjRA5_{I?CSPpLp>EI>0I5HQ2Sqj2b*0me zEleP`S3hb(&zTHu4;zllAi*L&74~A|BZP=y&<=@hEmLA4Hv;W2%@pPXHiw9sd&Nke zB1@R0J6IYyHuyeF0cpmUB?ExK9Rt+rLQ)kV*r5VYgd{#7+e=}*0wDN_Ak2S<n#LIl zt8)>&(K@T;)E5b@WFENVG7yZaL_^isKYE!2FzYitt$3pj6w~t}UNJjvc$~BK<0cfO z?K~iiju;JIDcr$7=)z>h9`g})5TOS-v>dGYAUrPQ7ly85vCj=-Ag$$?V&{)x9YL<W z1PM-QL?KXwu%~b(IvdQt2W(B)CkYV9ud%Hmv%O(bX^%iZLir%up7Lq$By^n>A(bWq zU$57M?Ebd7Eaq9k;sX+~IQaqqB78N_i5L02kPH1L!U|*oEb=iUjNrLGV({><1Y-f0 zKU2*&<6%dK-giOOk(m6s-Zy;3kVaTOw&t3qASyPF#=CwLM(kDbX5~?t1)I{7df)G1 zYmz-P6bjiU#IX@0iMt5_@Vr1Tynj&sUsCy_M1FGLZ7;uJP?<ITWw57l1v0P;c01At z7wM5$nHv-42S{=hGRX2x^@lg?7!==7bEp&ZSy~t`#nu}|E<}K#Dg4HNqN$oKlt-)w z{}2)pM4Hf7f#uvF%DKa>O<w2!j5S=zGHVA4*8&w*Wf~tSdjq+<MfjQsQ#3vQdXd_5 zHi0h^)aRO>Un6DOkmchr<^Mpc2rib_0|v4GzYMuT6A)NQ%6s9F2$NBMj5tgloWIH4 z7=P<>iC2T>EaMTbzWIvu{86g~1n)?}KIqlD*|j1U{rS-!HYh<;rstvm2s~;R=q3B1 z-`Z5@D7*OIF}aw)?Zj^W-Rgj?V>6zik0I6v5#6_JIVjKH@|!5JA7OPSHbNK1O57f# zy#sDcrg*6RN^G@Tj?Ef^ZRX}+bbfXuIzPSgtA8l5lHc{BbpFYP^a=G2Qm)L`wXc*| z4B-VfvDwp*UR-ad;3RV!G6W0|Aw`2cB9>i`MP<csAz1V2l@?>GCPu-W&wqo5U~J2P zYuNcLoK7qWOllNR@d|15<kO#qCz&Gf%GcZBbTga$%~jtt1QA??z(p@@W?gTbE4_S! zJt(~#5BfK+7%k^_$SnTDSR|bSFzx^L@?$=9fe?X)jM}*N2D>U7E3imR^)gUY0lO+4 zOPgp=iPbHGVkI<UqD@-37tI%ZHef?Bc6~O|iojZzfvXl!fhpvy#b!ryVLOt%JQK#2 zhyxj1ylxqW@$DM2@XIADy#-ZViOpRWLH{VJ<i8z>{ed7+Vpr!y@>}E{hg}_7J=EP0 z%sgle!)Kc6t{&=@8-lKb^)-YnBcnw;ZL~WIJqH`uTAOht(dN~8z{BHmEa27q#;$Oo znb>r%kqu|r*cHRj3W)c#HlTh3(Qi~?11~1#2fX*T{TA<~2?X!W1@HADIvPCqAa<=V zI4jhi|2-36Lr^87O&)**Q%5R#V;sb5qdoOUA%$(m()Gl|_)Rc|*DCCBN~1;!6o1|< z@Dz1Ak@@&;GfNu{_T?gSfhmdXHpsrxcfm24b0RUH=tH6|bB+>Un9pt#Wzm$?!%<l8 zXiIa&W_fuz_(4)0_xmOUuM5!DI?1#>Tt(yhWFaK=<EOOAt<GOVtO3Q)AnGCStS!as z1USjq5F?}?KdFsqbuR5Mc|A$SH}&HuG{o40j#`~%$vhTFH(u%Amjt}}6K!bxB-8|K zO5P-JnVZ~a1Ro1vpfyJTHmw#SK6ZqM!DZnM>jQ7dA>W)G!E%Ywpch0o=0ScSl8_l; zwpD(Wz%DM5YR|@t?AQ@@9D)oe(2qK+5;Z1237x*yfvg&nA_t{fEPNOVyG+mDp10QD zCrF@m>19Z~FPXSiBwl?6DILUF_;1ewc|VXIU64(2gkI^V4~r5(-`Pd;d}pf{6qVc6 zDbmYD(#wk7e{_W>e;3-kEDr!xXQqc8Z-(=CXx{*^w4z+?4JCHfnd?uXfohj4?ARjm z*wyJZi6^0~lZle9j@J{2k%S464wu`w#&oa{V`Sq9dSo}IL*F)>jl=O3y(&8xt#lcV z=mHl)bKT%{>tRaSz~;nmRB_&>Ay8lI8o{z@N8zp02Nw4dPUqZ-KY6eAfbg3>On(gx z+h)gt=eZFGA{XVV7Zv@;uAVQwJY0HNw);C)j0H>hL7v>;kR5NzE<2@`I(GOw?g8$b z(u%Md5{8?j)bVaO|B&_y@K*CB4UHg$!S`i4Y@#o7)GTwCHtrQ`Xs=j9d&L^sD>Sr7 z{@Xw|7Pos=Y}I*RZ=hje3rVVsB8H_YEu8<R)=i{Qh0Q-OP^_II(x4uHhgQyGzG@UF zauZQ^$yoo?KFsO9Sj3*{J5An!E)ev?-5@rF{gGB3MASxn1zDGWM!Hn1ffm+#L593< z1eNW?@d#q#w<29(zqZzCo7^ahXyuq6KWs1BuyDa#2{KL=Sf(iaGb$X3O_mPh;E6dD z!H`TOh5b8d{dWR{r~skcboBg`)=!#L2UcV2ab{tj?3Qz7Bk>p@;hS9YjLk@oIu9b) zmd$WQo$rg6?5J}uy}X01pgFIYCh2neG3RP*7jBc*1!uV{<!G(4I1CrrX5&MgYe0U@ zF{1g^BT=LwIQER`^|kh8mx%%&kV#Zy60cZ2TB+F8P&<}nCY7j$nPj#aIQQUO`ZW#7 zMMKJ2h<9s9_tC^e^Ja@o2Vj=RfQ<98^Prs#JY;lJ!FLh-0wwEel;vX)C1E*c4QC;c z_a()1T1x2mZtn{HSTA{M93aw0ttb1C4<%K_`Ew*8k>o7thTSGY{%T;I2o=d8xM_{| z+n>4L{wx^$8I#N9Mj}U8x8!wDip#pyEQPsg{}IhWIb7K%Vloh%)t?miQcMpv18d6B zShrcd5D&Qf+ojsype+hF=?>Z<KKda`$2ZW?4_fLw1zYMn1)TLg7`jisN<s(YQb0#V z;Ey5jz*jBsl4%xv2uQWy3)<@mK<tGIehs~AAjYm{ipYT@Kd#;jPs8tzqoBV@y;EU& z3az*3MK*1o!kC5Fc6GE~jF4Zx{4H8sj9TCa=TQgD8c%<TYX+5=Yn7lzdGVn13&gvg z8u?7>Y&x1MBEV`A#9aAMtGt4wP1Q78`MdZxZ;IZ_s2Dy!u|BC8zR!B6$$>m>B!L7` zJWgLvXduY<-hd>=r~rSC3dim*-)ND6b2Sw&p4qLAP?#ikC1|uxUPtBhH9$A^D`wN4 zG<L#7&JvN+>LuNCBWOOUWu`&|6SI&H1HiIVC<q9IBvbuq5jH&H-=kirM6tlO@u?tm z1mUTO(A&nJ!-uS2PO;T7=Zm1th`$5u<Z>(nXa!=2N*9KU)h>UJMvHB{q%QMsFe5d$ zUzZuiUlaL{#(@DNe?6(^ykQh6G%-eL@M@5r%df{;Lo-%^J4PZSrH{11@k9EE)$5KO zP&&=Y2Hb8K8`&@{=N>db27iv}$%j3y=PW`3nTt~rzX6k_a!{L6Td>$MgC67D+k|GL zHBSHr{T8>aRmP?tJcu>KC+V%FM#W=BOHD65P~mAqR3N5nX-&<55_*|VDc}HB;y=-$ zHHargcJ!4vvat`QA^Ov~h1Pmh7fDQvpT7W|f2~!c3U#eX#8?M>r^1#pJ!O9dpU!DO z3*;2|0T2LuVf|=0=V{;2Mj~Z0c)69R7P6e1sWaALdWMOz+p*L}LwD=OOq!k%l&0fc zPt<`xaPJ<WEJ1%cf?kr^U(#wy&ht;K38D^NF~!X<0^Rmci{L?seHHqtrQ{NpS-6Pk z&B^1tX?ABR*4MwSuX5|_N$YE|_4RA(OT-{KdA;?u(#pF}e6ebQP-^xLE8z)Bh&eOj zcnID18l-O$a%~sS15z<djAqI5)c~S1NM4RXoi`FlO)1SocrGfgg~aC2fvq`tf4Hcg znng9AY|bb}3;9cWj)2z3p_LejUh(&-!}Kc=Hcln724?j!v_%r>RocLV@JT7vNxahf z;7cV^CDn!CgfEEcx&J9he&-+10fpx%VtOrinT#FA<Q!kba_&b7F~{ej0$MneqO7*_ zY!Y3bsYpxCaU*(x{lm9I6%jH_gvE$;;TAzSbFJgJWg-p-VK-9kGXkrnUHl;d`1~&Y z{!upV9BJKL*hZTWn>m(Z%{P0iSA#b}c9nJ~HGKqI8_T41rEXyeBmR2%WMM7xVebn6 z?+~0EavLR70;`9ZtMqcZ%Q&CS8U?G-D~oYbxEbum5bWb1Ove3KOwfE#QBB9+?{-R< zrC9SaaVFEkEv@sMTQCmO<9`yU0Di_o;9iLou}^hoG7-mk;hakGmsDN84md=P=jJ~P z9<m-fvn}yDW@^U{>wPo)J1PFkZ^Mj}?+j;9hl!=JonLNH(susS`PAWdeoyjA_AkCg zkBRqS*X~e&qzk^oq_ATJkkbgZW*lWWQ1$s>?l4fCbXURE(8?IBPY4PTfRJYHPSu3F zZjc*fFhA5wHqw3`+Y7E8%lQx9`2$x9T5{3g|4a#&EC9eU&s4%!EXVu{DE0v$2VLEW z?>9>DeT>Ey%X<TP@Q%ERhXIE7-2vz&H&AzUygKJ<YJ0fVnMA<=?J^D|nVw6LPGcH? zSd3NZ4?&QFb-q!YA*W*%tc&dnvZG>7_*BfvTD^ph2_vqEw9r=PUG#y;3)WArz$-R8 z>fR*cW;riHEx>t|KhZ}wQCa~oF4Y2h%Ke$htrxj{f(|3BhoG23VG_d7)W3vU1C3Vk zpQ>8MZ$X@%Qk<cs8J|$X&5-1#M-lZqd5|)r8Ri>kd75Z>s+EIppZGo#-x2>;nls|( z>Z=j<6%8Bv58_$S-zVIyv?h$-VM<;BZ32^z;lbBo(IctRO8Pq`J&B~Xp}LP$$-<5s z@)w`l*{#m`a0S>gPAj7qTtx=oY6gG66Z^rB6Io&kmZf$*0)uuvXtMSsD#5CDkarx@ zW>1vki^4g`p_G^<vUViBL_xMWQA{cQYwK@mAUXK10RZZYGZfSaA8FNtsS$miwCynK zfPZ(GI2Pd6`$ktC#!)2YQS5eNe>LtRza}9GT;f~%i`X3~Ll2O+KmHI8atqY@0@UYG z{sbtuu*YJdQtcPOLF{S={|qFq_km={K%<1cNC1K7=p|>O31rMeMvZv_5KFbhPH~ET zav!kv>L>@9Va_&qGZeN{W^eK)5Fte)N_C@95Dtf_R8U+vP#L}CT+kr)qfF2Be?%(0 zbDyH0^UwnMLntzJC$B~WSo)p;4>*yXmrvtBA{F@0RCGpI>6>=XOiK7O63|2znvmB6 zAb=MMy$ansoWE7s-KXUDAsCZij8*!5?S6zkH8|FtaUflU@a*I@(3=65j2Ql8%H389 z1fC~?a&n{FOB+Nx`PDaqF+$c1a@bqo#;DoT$FOp6qE+rTN=hErzU2>u#y;YF*q4Iv zo6X?q!{&NJmR#?uEG|@so14Wsk><3TV_yTmRUeaEDiElD(N~Bm=F)Y93b89gn>1_} zow_IVnVxCDxWXP5q(G+ri>;Q!j)=wDELnohlI6J8;9&n*JJK-)MtKVm02)!pSfA@G zeB|jRCk}u@U@)El4){{6IqOi+t+XJ?Tm+5goQ2HfSskGo<+zbxdd{QaVyqB_5JGs# zutYTlB3lwE$@_%Q8i)G(&-$*lCYgq{8jWly$9L?<ZJ3WUG5^?8hhBh|H5YkpmSBKz z>c5EnZ^db&Af=troS)H`zhij_;jBXy{fE6~W$Sd)mKlszIq-I&Ewg3%Mf5c@SYI^* zi%Fvj`sQ*RI_b5VfxcC>mE{DHfn8(OcdJx;F|7^SQ5CF|oNAE@?<+P)PaGvqFLiue zoGV3g{oAG3Lt+Fa=b*BHo@nV-0u*Ri%sgMZ&|9pYpatJ_ycPAlM=AcM<+2hhvjDEX z^}_0J0bP(e2;hwG0^80!zoAz2R+s;cRrSUYmiG|85g<^v|AAFueVWfy7t`aEdW+l> zvf0%e>EY6bg;}=G^khCJR!~T(_)<YUHL8k@Q-y6sgepbFDu_^39OvWUY`RauNgBB! zgi(~b>q9t0fBx^Owp4ou*qj;4He18y*08?C<v+fvHpD&&GdMp=Bmv(vze$HNr}<B* znbi@$t2$8!bjer=W=qiTs_E@)gm=Rn->x@(1C}lY5qLBCcZ7N_mQ5*PQ4xC1^`ckR z5AVMcJ>QS>Fj@vR889;SK8NO{cliDyes^*cxDM?Qn43YsX3(E)<cQ)*Yr3BRhf+~4 zn_HBc<ABsAJ**&&<peTFmVSt;IOP|6OoSp~O?eR)0tfj0ViQta5CW#%AJaJa3_BK@ zmz6jnmkOci9G3MR(4JoB^V-m(W$8>o<f4zFa2`W1tc31*2*&=vLGD5S0ht-HH1m+` zKcqnm>)&fZOfIk>wwHxLW1U4z`SDKgpDrswKx%?IhhP$ib9VA`Kkf(Nykchsy1i#2 z2}uvY2*w__0LYs~Or9MF5GQ2+2@RG1S0Mf?4rt{<of9yKgTXub!&ux&99&2-m4M<s z_@M#C>!#=Dza=RCn1o_0(q;A)p!iz$e@%{o{}qa)Z9HgCj2H|}1qJ0mXnaPFO`N_E z+q#H_-@)JbE-+>Nz@&W(n4*4QzLEXkXs-}3m<<sto!s#Ule1XufR0B7FRqP=&9?KK z)1l7AZgxP%d;NKH$JlMFZ&ND10xvoj<Yom?lqoE`TLgZ(`RuphrH0TLVzxpp^XbP& zt-1(>Pr!vurL16u>mMa-=6q@;9_AC9MSR0M_(pugS2nZR__<|lb%7f(?C|u5rs^VO z(9)ktrX=r9l5=U&_WB&t(zGjk<y=}9>ZPnW|6Xj>KX3uB$0nu1u5(ksbQ{0#W`wJ^ zY7(1~TN}Su(z{OL&L<;7pOx#yxeD0HZi<&+Erh5dB?{YWKod^c8ze&z@B>dAoH2=u z!5aAOScX{hP73$-QVe?lKp-Z6J0FVf(eH=ox3_bAe87n_fOBzSjF2q?`-mRHVHGoW zwVl5U93ZY(M%1e{3%fiN&QgsoBNYdM+{c}Wj@PGk+0?~9WTU!zrXv((0eaolBEnvs zYbc*(cZn$~l=YK#Z3Mp*z{>tsb&}ZvH2RG3h(psxqX>5G_*g4bmVy*PGX*{(zi4CB zhiJAB&6>@LW%z4N60Vhi@AITx3ZAm&3Iu_hb0`{rA<#q7I=DEaSrkrWqFO)AWB!uk zCW40x`N@M|K0Sr|!|a5<#%0&eRw`O7p4g(qva4b0SCLaCmffaAq1w;?l@JDJWB(V2 z0rlg)RqaB0TN5T`4?qNHjsSpC(M)=)?%M(mY3v^?*Hbb4n|#13%&0Q}2Scb(K8{&o zC+B{bohA~D@Av4D#N^#^V#5?m)9fby-<zoP<%g6v3#wDQnuU-@ZHVbvLghu7T^i<! z=xBf+04$1st-vKd&S$8yqaBN+4eqt`AHf%9+w$33I1)@jsn{znGD4{2<A(q%4$`~} zF@*h7u6~`;dp2|vyF9Kq5QuWYHE1}juQ~}@OvlmYd)H4vHGZ6oA&aR?yz2cy(E#P^ zGpRr&{;UP<T2-|Rl9I{zAHq0XHz0&1o8X?mbf9jJkrR&2J83h9@G@kfc8-e9P0s>U zGW7486mk}baS9(B1_#^qi4O=9`@vfdkk9rTNIcS_V#;t{@)bdyePCcg0#|*%{0^?f z9cM|03Y|LYLPR6Ul~`$K5JxBJY~oRzzwO|)PSk~O(8KR~FSS*{kHbwuYxo|7=c`US zTma@<szg{QupZRACgT49*9Sl{NHd$zWJha=PY1Sen70f6cSJ*-viTNi&^>A)PWGH- zmUgamDJ;}cpKBo8X>JFCl9oVb5}!;*u==p#`JL12=bddze`t=)I7N|BWtQMx-Y>XQ z_j>&oxe4K(2-A75eK^d4BYILT5eFT#@(`CA3)iz$w--qW%lw#Nr6TR(1!0$Qyo9m$ zSIQS-=n({+LbbYO9+p6^P$VN({4DqYg$m)S3^IRtJthXn*0iPk2ZXSqiBcUYl-!4} zXs+=9ACDI_l#7PYLXdfrjbS$eF$v#pjP#n8-~<y$Ii-!GQ>0oh-?v}1s}=GNyal6P z<6OkLPie^zrSkX&q*~`3jV%70_yD8DU077F4V3cjaHr(ypaNnAI7Dj!AV3k(PW*Ae z09HXUPL`b<qVXddwjF13`s5y4dW7v(N6IYVDy=9>@9m5@cH_uiWYX?%MKd_BTO5B< zT#93st4DT7YBsi29XQskJQ{JdMGCj!4iHORytV;M5HL(Zurc63#%>-3X<5umSS<Z8 z6ym;yc48^RX#Zd+&1oKvsSW3^?laBQ*%AfsDHnY>zYXCsw#w<zbR6@Kr{N|MP%*+_ z5@<kk<JO<yyqfAx1g?zDV1=!x$<u;x1=QzGc8ncHQ0oJbe;u^mFGG1cF}qlV$-^!c zK0-Q2>}Br+SsUp>3|3JR@3h006xYH>0V5Ct7y&cIjz~$eo#~w2=Bh8g0>Z_=LGf4m zAp`}E@=;)*s}$EEVtYR~lHXA(O@HII2s>l48?co6-&j7nQm*;X)?FI=J+=T$xy3=L zS~spZ@X;+DE<oT$^Zl_tixC99%!}ip7Q<oKEZfI_3~Qgw%2g`5dzu~uN4<3~(bZ6N zAyfjGZ)8*TGzHWgewD}*sQa+c>}f(^d-Q%+Pm^1!jiLgPfd0WLCF+RI%7uP`JRJPe z+tQ$6{2j4WHtj;*{2I|&9C0F@>M;J2^|cURS{Bsp=xu_-f?;gu=i(iTgwXP9V`v@% z30e$}0wS8rj!xJNpV@{BQtCc`U@UHZLiImhk5YZc4SKs55G1YyRnd{`N&2Z%2&-qW zBYq$LgY%DLY#$`;rFPg$*_(|Ftko_1F;3a#RmT+WVXwoJl*XGXFe<PrsrE}+A5e}E z*;G((H%61^9KsSuKv9%!< ${*zMOR+N-pMlm7<5cpDZ16cH6?W=rezTqd)`&?Dm zNiXjSueT@v;ehyVBnPU_RC@R7A7rRQBKb{9)Qtm%IR6{gyRHm3C5C9l)<*_D9P04O z%F4BCX=4pHWY9epU(>PW%=+OJbA;X7o@Qx6z($4eUl{ihoME#qFQD?#Yanf}aid-U z&rbZ`h5C4K{NIiL`?OBukz~A|)I3~~no$FPtSWfvq%TnkPfj1*^ruhj=&sK8*%EUw z8Q;-;{?D?ilh6-YmCH9n$xfbk68bg>6uU`a_epW}{%H~^Typ|FUwO~a))0ac%r!>F zj99u4aw;X(NQ!~4_lvE05L;mqTkvF)*rLC*VxyrB1A7EQg8dzBk_0=8GO29(Ao2Ea zGLyuc1n~xDG_Ug1|3SW4I!}LmVA2-CeWag%N5Wyx=X448K9V5eJ|ns$3HQ2qfrQ(N z7m{#g{HNGbPD;34x2GiB%E1zDS-*t478oaaw2YUbmXL4{qai*WU(wt|HN9U-Thy@} z9c>K=IkYz*<ObTKD^|d|m)?A8u$226+r(&FyO@85H<EJaLCT$rf)`S;JpKlf`^8*~ z_z+_5I;v=ixiVT~<+R2Y63-p*o%QRGNq%>f)Bz8#9%v;8uL&Gtvf=#d)4Ehk%;xEU zR7cL~r_-Rwws~=CH9^?c+w6F?*jNUCcp>d*DNKeAk7$ftd=fZjkj+GJ`VDSaJAE10 zLYwJI`SS$}fxT|SIr;~+o2kMP_@s!0rqRd8;^P!H#qrUJ4?LCFB@g!Ct)f$DI_~6~ zks4&3kj4{Am+UW(IL>(A$UxN7uy<g9G|X`M9-Q`|=9D(votsm$MjVvY#-lfv>H$=^ zL&64QR@^Qj1)HJ-r)17{NiT~q(WqpMBHK*waw7nF=*(RGb{8E8wp2}FN?7VTWaS*6 zo8o=vimL?%U#45GR5am8ZEL6tGi^rae?${FmjB=lc)ZPM5g&>dORyxiVvnlO1d-N1 zi8sIVL2Q{z`lDj!3gW9T63e;$H@L>6$#m+U;OO<kN4*PRLoewmZwOxGdK&)lr6^l- zoYwO_WB4v?Aftn)@vt~U;$~zA*{5`}<O;k#jo710sddQU-NA;X7Zt%Dj@byMeJ*#L zl%<V3gY|bVM7Y{0@XRdM+}rWAU42?Vcq+n<7z>l%kM1^Pf2S->?}Tt_#F@>Ab-~hj zexc|XyBjth6t9>nTcXPevMN;y_t2gMKR}9LENAVnsb1$SRx5@C5nm8Uec-YTxsmLT zo?roZYb_jSwuVT-Q2BCfi2e*8G@PH}Dc286)sb-tgzVTCj$LmL#TNDk>w^VDL$#l) zx26i9fnqeEUV~`O()!F)GU_PiW>o2;D#da&?Bc1ZOw_rY>g1u$*nv7$g`=oSbuLd$ zOC(nMF2ZYJnp`Ayqo4;pL{eO;tp|>kin;GX|E^z!cNFq>NDuu4uW<L*{R#`-@gX|x zquHfFS4*{*AQRA}Nwv659p|Fd9J%_6OmZ0(xY7-0^`ZjT@o)vM|9!udeGzuFfGu-z z=nm(hu^mGD?&S2GHcqM~PAFf#Ma>aG(r|Vrb|3{Dn=57;cDa_13CBVR{L0jZ(4CUT z1K8wB`~^iYG652e3=AKvCHo@l-~t*+j`44p2xz03IG0!_-YSb%zpLJYaXt5lX$~Hg zqK>OxU7o2<2-Z(ZwcHRYuMb`{)bNM>?`v6<tvOp9nMOVc#_CDj?(xix2(m;bTD<|S zsuHbuX9TZk3xVGe|D9ZVFdNIjz$zKQW5B{!nlY4cA%-7h2SfRvRIgr$$h+OZEO~8f zDQ*LC$UTl~&4uO?FJSOu*UXUgW9e(g0J^FXC}3`uUUp0`deyc}#^Lmjq?fa%OB)eY zhcDn@B%g|N!L7FQP+Q+_CN#8a#&LU}OR2!oz)oZSVAvGZkFM%L*ZQ%vRl^$`DV$Jh z@S<Y<m_z$c>gCi@ey1@K`03r3#8AZ^9{mxhD)do=-B~8*zrUL!OuUq}kXci>N8GhZ z7eHc<;$EHjK^K{XriYH(gGH}@9TEiKZUf=?o7wy>I3f=J(lmdVL?kX0Xbm|&imob9 z5`RURx;-0cajH4Eo_h5EN{|Z$LEbh%km9ydy$>`w6^WIye~XI12M2s3X+(Jm(v3lv z5MS|AM4011m}!;8Zfz*C(-Y63TcXYP@JwMVNt>M(Z35%)b8JmZ5@%+uAjx5-=g|l0 zO{)7f3V=W*p-6*<To~wSvm!=USv<EBxAftf*oF|el(i0sR2xEj2YnW&>ekOGxZH>k z6}$WEYtG8(NaHe0mD0MIWC0kUgTH?RXp0bt-Wz@aU4VKTZDgm??x8gFOGp7-FO(i6 zMcSB{>WTP6KV4_T$ioG&778uW#sm@>l={C>U18V)+n&Sp9zO*)-n)n#`;qC1)sVo& z^|XA=j+7+gkBC=rYFk3aeuLh3r<TqR7%zc7ev7Qc`ACG3IF2vD7i3Iupz7}JmIk74 zDevE$UT{<L{wt^jaI2A^9DL-|D>I0<&y<Rzx=FHeG+Ha%kHb2jqphTD+z40-_mgbI zzM9QnQuzhR#$OQP*ryTJOBa$vVkNgDS=K*-F7Qz~?k4HQf{b`w`UiIP4%RH!^pR+k zejNwJkK)gxb#ziMIw9@JxB+U$(I3OfC93uWz3}l3$Key~3?pX@YU2Q(hhN_h7GEOT zz<NRc?MsN411Xe`hA$i__A2g=PAU%l8ri`0S=PBHOA9-Ol1V-OA*+(%VDcHz;IL(R znoW*v931rO#?A!XJK~0(>#as!Ld}#LK*l?unnoti2nB~Da4{65(%byme2f?;!|0l( zwMWQ~=ux*S{^QHDxkmLT5=J(Pb6Vd~c#?j|RX(@4N68D%H!lKiK_Bm3FP4^we&vV$ ziFPfsR=_us@3T^bX}d!BHcaQWdxS|VOyLT6eD`#bfb7GL-wB(RFSIkh0NXv`X!;54 zplJw-nc>A9pr9s4Bdzi13?B?$V=T4<PtbKJ@C3BZaM44F&O)iInpwGN!;?p%23_c} z$_o4v+fO^-PWgej_NaGyuBgiPsW^nRjsFEZ;W#sC;-(F~!Uw}w9G9eXlY?R|;b9NJ zKLRg?exDmLqOxf-CYwKWtwca>T0O)_n)Gs$;gUACbNx$NQKptY)M2EVV0YG;v(tUg zsXZSV=STxI0}J7y46;dK#@P`#FV*a@zEX5$A8uR$pz8KKaIxG_iUon)k+;m(`K_1{ zh-UptQyZcC&(nrmIWJrZNe>5V&zjwIs@y@`<utb#K>C)wkUG~P;(KDx`U=2<5YN#8 z<YTkpcX2!@o};b}9GiCN_9|H8%SbC;3_G$K5hJDSFyzl71k2-5E-r@%;w^&z=i&c3 z{H4Fcb9@4O{~?6SMMF<etm*mOKtggktQ2|sgGKWnrO>v}+T{5YtgFNZ*cG%Hg1dqO zP$%Vw;cKXS3Y0+}lgD9r!oP818_HmJV+s^-byB1vj)J);7{+M`y$gPiqt4PL@$ynf zZ96Gm2HjwWBHu9hka_~RmFrxpeJ0f&EAIB%Oc#2I-DSGe>yaj*u1&|yT<7zP2f%K^ z)(B3meFtnA_pCVpHik?0Of07L*&1p9FFX<i-U9STk#RF?bnd@Gwa`kMNmFO@8|7DQ zKs%x>2zQHduT1^lkwcr%UDL`}j0j5`w}9(C?24!1%CQe51NXOYBRzq(6h^fn>ygYZ zWHlX2M-L0xHacW~4FEA=9Nz~Oot_hu&kvI6JCe_a<WohDC|5U$dPawO-y-Sf%Q5*< z?Ogy4*W60AMflYFW=OSfVIK6pkad_x@0%&r=83H9R8{XQmulY@UpM0TNZ&0|ZI1Y= zkZPYrwM0Jj-Y|nA+JY$SI2nStWgYtW+0rI-yy4@l<s*KJL*#Q%$(Fx)cVD8%0hI;= zo0B+%H{1yH6tr8Sf>;5XdkblD@74kg4@*?q@Of64ohkcqk(2P^!v>_DP{NH8QZ0fY zU>xmFb)ZPWyaiTsi4W1?X)O)ZRL{Y+WLNh=Nsdz(j8e*)dC47Ot}%$QXpaJyY`Aj1 z;i^7-DfCqzLgD%GL=j*_+Db~3tFaLEodL?g26CM#Mb89&ksSo)ZHajT*|$j#J5WjQ zyZwPZdfy$Eim&(GC5bcYdf(mFSp>arnOdRuEthIDu>AEt&GLcheJiE9W;E1z4#8Ar zw!s}s*OkH-3ucRp5VtG4j~ZSef)FrwyTGTBX|@G%t7!&&Xef0ge>+yZlDHr3Y$8W2 zAy;Yyx!6FZi)3+K4J@#G=cQkR6Od&Ea_pKT^+De?#%x(cyHQ>slx0BoXIIc9@UO2; zA`GN}6)g8`_2TB>=w(J)^s*EN6Lgh6AxIWGRBVnf(rBv&1=MjZgXklB`Os2}e2l4L zYN-|6pS3lhW|T^suIe+!V5;zNi?ku76?jh%v8&+QN0}U~%6nb7u$6}6qE<6St5uE= zi`SX=W^5Akn1!p*dSySt3}zpPTVN60uN(UV<tgwVv`^Xw+(ZzZu&b_p4X)P3582Rm zQ#_0%*?Sm~P_gN_HKX`}G)D^=CEJZR(Fo?ej#|KGYcL;YS(|}JB~)ifwb*cn@``hn z{sO6196N$3g3K02K>|Kpo933QPu#A}ASw~y6(>QXrfMis)b_yHHLddryoy~s{e7^< zXy{+GzTmp)WW9!qs!};DJ?z+3fpZGvNgGcn6^OPBHJTphN>m4L$F=>$><h3702fya zUZ>zShyzl1^`b<hiF2(dYd*!a;1-v{IIa~B;&3F(DMYiT=d~5o&fIFOQ4}P=$HAdV z`B@_W4}<fo{TFC1F&97xt?G5>L+1jrz(ol^!Qwf-c~aet7@C;Bi)gl7%QJ}NE-<o? zW>?+xkuN3=2#FZOk(#E8B3^@ILnsmy*Gr<=Wx@PKXf*#*6v@^`i2DsOMuZc-;N><M zfV0pOB9)eT8M0CvVHZMIL?xG+i@)jLu3Esi1^_i;U<5MesJ9~?p#mYLL2>o>ui`W@ zvC^ll(@5qny7QZ#T9jN3+J$WH({KP_vkZMha^UnWBJFU_S=0j-y!?e;Ax446XN@T` z>kVR{0lK^>39SVvvwlj3>sDz(V_nb6vj|{y{6NdrXh#sp7NXINAQlOMO#Hq-iLOXW zVMIY8%CHO<T2cz~^QBr8Xz-E<tDAWgR!`AfA-_x4CPUM)`M_eNI8gB4y2n9`IOpfZ zy2hb;QZNRri22Q+kFZ*Vzl+s#@pmb?K~AjD9w(B>G9Hzyi<WAc5RLSmZPbG^xQz$# z*DJ2vkQ*$vH0@H&BUi7qUyJ}UY=%)`DNzodIIYmi_(6ZhH<H*cnYKu(y^IQgxn4+5 zu+($t2_8Cuo-45|=?QTr;Yku`AyKs~y}Uz+BmUZKs75_lW7w|2ExRIoQf}D6U;Bne z3`Hr}FcGdKp)(12Ps{w<MSqE+$vH^;4>T~0{X7i{gW#96xJf>&r3?lL@SVUmj~UC} zL?Sx2O6d@3cZ&kY2&!P>)>Jd&Ws6OMe#&7PN5hn%@5GL#A%V!s5osY>38EEzCeF1g zdQ}-vOj0kx-+Xl<{$7CH(CQNfQXO5Dh!$LlQ!o~(sl+$di#<UX!4TFn5+7PgX$iXc zg+N+Kf9BDja{3bqA=oK78v34-_!kQDH(%>l3va<|ph$Z(@khiw48%vIf(NX-N4E2S z!qG@uR=9-mH=^=Tup_9B#<gHzh$^F73lXjN<#LdDAC*I7U{w|5A%Z@M*@Dy`M?C}E zhTAE04f-SkOjGx=CT~%%UgUC}wBlU~tUw_s(sXEu;1d4f)HTc$+XAaM$UaP3y}8_r z=5;U5puXB~^!^+$*0rx(?k`z^&XzC1@9RX^m*J+9Fm*3kg(P^r6?na2u6_YSH&+<C zA()~UW3*(%e$f-ePNA@2v5b+iACm$bb~OKGe=q!RctyvS5&LJ<gt<7L|H4Y;cMKHl zc?AV6_jfs2E!LHqH!q-AS`nAhzej`NmC^PLY*Q=xAdXu^;|Y%OkcB#qj})zv(aoPg ztBqJQYZC1u8^0_NwhZ+Zoy1lV$FQ6K<`3i`MyQO8%|^5^Q^`M$W5W}0<mFqxs6fB& zbK1`lkmm&9IP}v4*z~T%fyNebZEZZi$(R|$1<|Z^gB>ahJQGuB9A5rc#AHFIIfvf~ z&@AgCP_)#iNVRhSC&dT^lD0=;1`^<%64|i*Ao&7Gwk9k#+JeE>I3x-1RdzGQ7~p=7 zcEk(>i*v?fyc!*&0zMr5J@K^&1Q7T@mE<oi^y4FvzXvX!bo{)+>BGhkO?>-T80b3O z<S#BHhrKm5Y^!0ko(O^*5RWdc!+s@21?<tjR<NCl*mSdvcHjlwia35+PX%-ZOaM$N zkA8O}d6Gm!C?b-lV0A6>dErjn35CY`9kX$Fqf`Y>`>QLlaU-s*<fE}qNwFRQQa5gi zFx-i@lS+d%0s9bMrsv>YLch73CO-h@#HI!Gz4A;<BzC~*_=@&3>nMss_$|Y5aA%;v zJ&>tp(>+V5$q)Pvw7%7No5u0qVq`FukD5rbek3#a7WQj-!kh#l0>veCt1M|5dkIak zc{5VK2X!zu(=L9#0ihl|NV|Oq?TI??YbElIs|fMW`x#n=9z99Djv9Cr4bXL5v1N93 zs#5WVz=eXCu?(sl&7fLhgOI&NLe=xWh;O=vBBBxPro_&eL2YR-qTx%>Fg0n%=pxa{ zXX6u>dA2(5fE&~fxGl^C2s1#>pc`;0#$_PxpMI^#%d6K>&<V?lw_qVY|69@Gi+E4; z0N~{Oy9ULf65BF8`!GSchlRqK;%cO_cmf<tL_Wp2T5sy*i~Lq3DHWVX`6ujgS--oX z!Uuul-tW*T^T*Oi5M7O^-8E>kKOz{Q7ZK<I%<SoBF2OFr#=78S5)suug8O0lK5XGZ zQLyPIZqW_YHa6m2%k&@B@_GUbaWsIxfZ`(55b7;|lIr@K)icq~qx4RE|M8__$z$JQ zHQvA>({NA4F1}+fu*(k6wj<mFw8;p@??8X>FK?s$#_27=u`cXDso9v42Y^iyDRfSN zc$Eb{ts&v^OkO(fMMxW6(2>ihQh9LvA$TU;oHYO)9RD_d9))HtpHCrsIBO)Fo0A)m zq<;#IZ<ZsH{cCXiBEj)5L*LUelC_lD6D$J9&q7iw<`7{Y!}wocPPGpg2{JaKEH>fC z^XHI30Mzvt;3Ft0wSf%u)2-n6oeJR?qhL|^cGQV@aglE<?B@6VMmWcMkCQ_f{y1{W z(XaEMDlYjZey1>dO_8|FF<)Pqo32e}0dI*HS0SmMlC$VBtYjiRGD>WL-y%Sg`zPU; z6B@Hzo>m(;g9%QH-|>TwHJSB2GRKR6KAa}HaSQ3Bh@0#LfnvuD%L2bd^aM}~cV2NZ z&UM5djMEqHYNW#whf?3T**qQj_yGxuu99l6Ma>A4T`<|C+7LbvdE(S^BGIr5*V3F2 zAwWp7YvMe|*`l9+JWVY}|3eS`-gK8#*MqkW@IIh-{Rw*Ln-RzqN$XQ;j>Yl4>eHIy zpWz39*(?9TmnOC9^wjZxf?QZN#cPq7O0J<~ltwa~-}rS(t8^_=jQeVe5mnirR!3=- zHN^-L>Q8%+(ypy3hGx;9_ESo`qNezlgVGu(?Yx@em(m8xp&gqsx~BL=q(Np95K?e+ zR6xuAhhP?#Jg%dRijlyB21Mb4B%~-&ftSRapvlzgIBl7K&wLi>CC_!DUCqgRpdEqx zUHB^IAFk^C+IV8rFCueVKbwB$OdvNl&tY$H;KHO&2Q%r%ccqy0)+Q7J--@HP4_?7W zqTi+>RAM_{irUqKSTtr6Gq#g2qN)~)UM^hcf<<TM35GE%#iAXZXh>U!Mju9_)ZRku zM=JW{Rrth|pMx`xEr>~=RxJbs2C-;Mf(ZdSz@qtwpn2lXBLFfVZZ+q`yDec8dI&tO z@P>W&HwP(h8pvG;pDT_F$og$W#UEnj%B^(x62sr4W<;XcWZU8@{Jh#fQ5y~=_w&HZ z6QxJuFsvCjie)o|a=6W|!BL-~n61*wg_QF;zvCtvIF$U;3LrO7+oO(0$oO-C>Qi2I z2>uS${zQ!oZJ7yoIJq_odw?dX_8_3B_QRi3?H{Tk5V6@fEYjgy5+O^tnRc3wz?01( z$@7Yk>SnXqRPCRqqK%2#rM26%JZxFu$FgQ%w|XL)0o%@^Ly+)^J`!i$yA#H61Z$!H zAuSp6Fa`n{+Ll4&q0Yt~_^xSQb>_68>I@*{GHGKQe;7N<RAD?uIIIBxH;chj#Uvh# zEMx&8&6Fl^fDPgw(R5h-VB=WylNg0G5q*W=avw^<k@CHvr~Mbx3ppXq#0gzXFZnk) zPC@#|p%5YldIz)%>%1bdws%^b8=-{3fimZIqPM)KP+EzW4B12@!0&<)IXYl4h?|au zivU)RIEgOQEdJU_v|2$zmRz6oZ-U}KynLQg0Y4soZOdGK4gAH2760xk=n>oad)UoN ziu|HTEWLZ6T_MhszJ%M+D*dc#0HDmmo}G*-kK?CR{dhMV{elI;oh%5t>iNIwW&zXl zlS-kQS=~ytf5&(+$xwyh!y~m`C`CQ}Z-+>!DZ++0JqwiG_;E>$IEcGHaRL@e__-q} zJviToW}%s2BCnwZ?hqsECZ-^Z7DRQb2Gc<3rc3*E(=V}>pnqo3A*eNLY4hM~p}%ZG zI{iu*GN8@8fG=y2gR}GpVZlGL7=xx?UK6~IrrC=#0{iPw7w5C_`2O?R-_|9PVXCpb z|5){&{Xf>TevttBlJQsc2VPTPQ#SqJ&j&8}Z9cxSwUMp#f=@f&L^kfEC(Fz9Ot_84 z1zpDUWaAZ)R^h_^re`s{QK|Psc&E}usf0I>K(<;@1WF=VGWds-Nu5e#VY0i3|3E|v zVxICApto@E8+e;XU<uN(v_5_E>JCgenIYmI?3DG^CG0NMK_`wYlxc|iER5F_i+k6z zH(2+sUz3Z~kNDw8g*;8zT6-dnCRj~@QSkJZ55Wa{wp?7U3;pk!Y}~j~l?egw*o+%h zsw5eA1L{pvLjLVlA5ssvB`4K8=oGpPeq|9Ztq*@f6W`8%jDdk@CYI(SG`fRQ>XAZp zB(Z?6iBIV5(7WtH9Zcym<OiUA8-yHFv{=d=Am2bI6KW1sW59)`{8F`yUuR<bT0=Y+ zDZ$w7_UP))K>g}+{4!W~sCK97imvXH*SU?1VDz@WU<3F=X(#_-IT5E+cWwrp`8Kpw z*R8pGTWo<0u#w_Wr|Jl0p2UyDi=(onB**1R?YPhnyjZ;nVO}!+FXE3rOI!MSmdWqJ zTWTBm*gv350wa(4i0i;LSB=MD*IbZw8)E}KEiToCE^X-Ya~X@?7BJu|?`EY7agA?W zeog4<3AcKIjz5#=&sh2+=|=-vZOGq^6BLhZhEJC5#!Y|hEh7Vd3nLA`S<|u}ZQ7!9 zw@hjR$Pi=dRWg3|rMQH4!_@OiZ15PWXO`H~@i@Q4=EP%4iERiT!(j5~C488g5c}8| zDZh$58=S$fq9~YBh<&iW8gJ3k9dcc_I=aExupYr?9TP)~pRSI{HBzt*Sr}PB9W8B0 zjDzFq3%9;49iSkcMkQ_dBzyS~IV)KXq7UW98=0u%Rx|K^1`6_Jv(SfwTuW#1i-AoG z$C-F*wb3kd^BJJnmLOXZF4jPhg>ayxw5(O=3@ij=e3h>Nw1X=+N;&S0CYA<nR(lKP zBO2-w0oip7EdhK?Eo+(7<Zseuh)woDZMRyCHd2jZ5IqyVw?P_^>A7%FqZ-1D=(mEi zcG3cE8WbZAd!vPXUZ+gYRq&a>rn?_w;Fr=siW0vEeuZ)M<As80&a#@>B6iUJOEcyI zY6e!?56}ii-(`Bz$s4m@`#V2?9pYA74hCmDCi}N)L*(jR0b?i~mrcj3OJQ@nSQcMA z6Wt1cZ|v_W85)Jn+E8X6K}|o96Rcl_BeoS_+1~?9QMKIA>Qm}N9a0^s;-OmjR-Xc? z$+h388p{gdaPc;iGXoPDYNJ^l%NGE^nj$K#mI9EOhY=}50rD&huHZK<7%HQy-{d=C z^+Sq`snl1$IZksU7_bfH{~vqr0v}~@HU3X-B!q-bfJhLOMM0w6!bOcnBuh59!9>DM zP*D<cfz&`^vJ0qO0tuF|rbTO8ZK<VRX=_`oH?UTNAQwdmY86pyRJ2cwmsk~|BK!ZI znP)d41hwz`>-+wGpMMvgoHO^CGiPpRX3m_+h8GcecM!V_)z(NN7mJ5XP@M&N*Y|O0 z(OXppbor+*-k){gOrC`8@o7tVk5(%EY1ln;yv#JcXS1XNoPjA^H-`+sAWV@;FSjC< z?=<(?tl2Gnw~9`7n`2@*^*OsGQo0+{lG%Wxy}3}H?)EQls9V0<vF6ue!LBJ~Z8&oq zF{%u+bt`DKw<3L;W6h2D(dX$Z1xbHzae}MnXyoD%{Ec#~k?kkPlex1wk19LP++Wl? z%9DV*vUUfKG0R1jvC@==7LSghR_R&y28na8SU?>|t>`}2Bt}IarBK$Qmo?oSwW9kR zPT{s5JW{Y~`R-5t@|5z$qoMei6kF?3<iynO@y8gTe5X<eKludyU3`D2-}8Un{4%*1 zFZuBe)M?AZ=C?K5DI}4CkV`Mgf>~Q^TwBIddhb$7?zpKJy^oaM@xx;}x3CX|dV91k zl%w`DW2tL>uUHC0UED0%Lm-Ca+Vxi{n!iVO;SR!b!y;;T*03Gc_Q9HGSmesYE21eY z{lk?9ThI%;yus%A!XEB*#T+^k9(PqAT4_!!@Q#>iyJ^+#n4%aSGvQeOaR(awaXbAq z?!>f}+pL6!rsx=VVp>Mp@<yLick-up-EeYZVw`sOvrD=k$C{s#ZC7n8IRr5+dJId5 z4t-Im8=_M>GEh1<wjX5!2o8IdchZqaYkHg;NNQq!F7mPakW>}+&*n&%h-7HiB8!m{ zO{^|TjyXm}_Hx5Ol}IIY$)43mHNHd<07o_aaW8o4B4as!F@pW5_Vt!NC1@?YM;2Wo z&zAXFhMp(MTy7aMT=rM=)6~h<^m{`rV!cHO|Mq4P*4H>>b&Kdgym?>a)sdy>h;tp; zwvq~#fmSg$!R0A^P0B6uPPhMA{dV)Kdd6iPJVIm#a2QA6RE9Eq5AqbU*QOtVL;O^` zi*&fBLl5R*-$D1keuvdef#oE0C7eb!ntvcu5vEfj9?j76Z0@(Y{M+>VhP-Q#!}Nl& z1m<S+V5ipYXUJez`Z+5=UI`?3-Vl8Fl9>sa$EUfdl^%}fR=K2Qq|3hdadA8rJIuUg z$}M$U15lp4XUZbrYCfNbSql^4sLBnbHCEm-jqzWdKQ_SnG>el!Gs*XgbKL%yvi;j! zfoC()<OSnEgFL{{DhIi#<zY_;cBgNzpB=U=+<(CBFJ9_DLfi7OT^;83=SLp-RW-#h zr(FBXJ8B|Lu6c*G@iIoprvpjrXEOnn8Nc3!I833lLywH|FzGd{i|QvfWgkJAD-V-S zxwJlKMCf7Cb3FFLq=<zY^oyjGdmxZ`ku*b=eGi0QBz6B#h_2<LvF$ICil4P6cX}}^ z54~{!H^pQx=`)UiihwDHY`OhDHAprh_~UfRgBys`cj<QEz5?nMwu;X)@W~{I@il8r zo0lV{6(X&Q!#4d>$B$7AN<+(9AY1XF@Wf?{*N;Mr<|gRX@kLe^QSu@yJa}G0HZS4w zxJlQqu`U+P4^nnn;|ah0jF@&s*e|lWZ<6wh*v;EBSpMw^%z$5)HR+;`xe0Bzpx1~T z>4yR@@@G}Z=`X#QU}J`L5~~ndZ%J7+o3_Nu3`mNnivuYGNmmk{t)}`*+h1mVcQqO5 z_*CnQSjbLuZj3zDnzu^w33K{kPCv{k&$P}p`&ps;$01z;6{3D(zqHRhPF%91XvNeJ zTkYU2n(H<UZUAa$H~mHi8BD`b1Y)46@&u3w19QxNdkV&l7)9;CE4Vwgekb%QFR<Tx z&9^s@^lJ#*`AtCiO)|=Fqz&_4aC;le2)-HIv5ob-BiP22-?v~aQ{LuW*=PI;aR(xZ zFn>klk*h2GFGvgN52<M&G!$tgWizFXG}�vlnW`{LoXpTySn$@;x8yoz96jn?+Kk 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�?dYNUd4WaURX_A__M4W}D0!0n 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/util.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/util.py deleted file mode 100644 index 9d4bfd3..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/util.py +++ /dev/null @@ -1,1756 +0,0 @@ -# -# Copyright (C) 2012-2017 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -import codecs -from collections import deque -import contextlib -import csv -from glob import iglob as std_iglob -import io -import json -import logging -import os -import py_compile -import re -import socket -try: - import ssl -except ImportError: # pragma: no cover - ssl = None -import subprocess -import sys -import tarfile -import tempfile -import textwrap - -try: - import threading -except ImportError: # pragma: no cover - import dummy_threading as threading -import time - -from . import DistlibException -from .compat import (string_types, text_type, shutil, raw_input, StringIO, - cache_from_source, urlopen, urljoin, httplib, xmlrpclib, - splittype, HTTPHandler, BaseConfigurator, valid_ident, - Container, configparser, URLError, ZipFile, fsdecode, - unquote, urlparse) - -logger = logging.getLogger(__name__) - -# -# Requirement parsing code as per PEP 508 -# - -IDENTIFIER = re.compile(r'^([\w\.-]+)\s*') -VERSION_IDENTIFIER = re.compile(r'^([\w\.*+-]+)\s*') -COMPARE_OP = re.compile(r'^(<=?|>=?|={2,3}|[~!]=)\s*') -MARKER_OP = re.compile(r'^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*') -OR = re.compile(r'^or\b\s*') -AND = re.compile(r'^and\b\s*') -NON_SPACE = re.compile(r'(\S+)\s*') -STRING_CHUNK = re.compile(r'([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)') - - -def parse_marker(marker_string): - """ - Parse a marker string and return a dictionary containing a marker expression. - - The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in - the expression grammar, or strings. A string contained in quotes is to be - interpreted as a literal string, and a string not contained in quotes is a - variable (such as os_name). - """ - def marker_var(remaining): - # either identifier, or literal string - m = IDENTIFIER.match(remaining) - if m: - result = m.groups()[0] - remaining = remaining[m.end():] - elif not remaining: - raise SyntaxError('unexpected end of input') - else: - q = remaining[0] - if q not in '\'"': - raise SyntaxError('invalid expression: %s' % remaining) - oq = '\'"'.replace(q, '') - remaining = remaining[1:] - parts = [q] - while remaining: - # either a string chunk, or oq, or q to terminate - if remaining[0] == q: - break - elif remaining[0] == oq: - parts.append(oq) - remaining = remaining[1:] - else: - m = STRING_CHUNK.match(remaining) - if not m: - raise SyntaxError('error in string literal: %s' % remaining) - parts.append(m.groups()[0]) - remaining = remaining[m.end():] - else: - s = ''.join(parts) - raise SyntaxError('unterminated string: %s' % s) - parts.append(q) - result = ''.join(parts) - remaining = remaining[1:].lstrip() # skip past closing quote - return result, remaining - - def marker_expr(remaining): - if remaining and remaining[0] == '(': - result, remaining = marker(remaining[1:].lstrip()) - if remaining[0] != ')': - raise SyntaxError('unterminated parenthesis: %s' % remaining) - remaining = remaining[1:].lstrip() - else: - lhs, remaining = marker_var(remaining) - while remaining: - m = MARKER_OP.match(remaining) - if not m: - break - op = m.groups()[0] - remaining = remaining[m.end():] - rhs, remaining = marker_var(remaining) - lhs = {'op': op, 'lhs': lhs, 'rhs': rhs} - result = lhs - return result, remaining - - def marker_and(remaining): - lhs, remaining = marker_expr(remaining) - while remaining: - m = AND.match(remaining) - if not m: - break - remaining = remaining[m.end():] - rhs, remaining = marker_expr(remaining) - lhs = {'op': 'and', 'lhs': lhs, 'rhs': rhs} - return lhs, remaining - - def marker(remaining): - lhs, remaining = marker_and(remaining) - while remaining: - m = OR.match(remaining) - if not m: - break - remaining = remaining[m.end():] - rhs, remaining = marker_and(remaining) - lhs = {'op': 'or', 'lhs': lhs, 'rhs': rhs} - return lhs, remaining - - return marker(marker_string) - - -def parse_requirement(req): - """ - Parse a requirement passed in as a string. Return a Container - whose attributes contain the various parts of the requirement. - """ - remaining = req.strip() - if not remaining or remaining.startswith('#'): - return None - m = IDENTIFIER.match(remaining) - if not m: - raise SyntaxError('name expected: %s' % remaining) - distname = m.groups()[0] - remaining = remaining[m.end():] - extras = mark_expr = versions = uri = None - if remaining and remaining[0] == '[': - i = remaining.find(']', 1) - if i < 0: - raise SyntaxError('unterminated extra: %s' % remaining) - s = remaining[1:i] - remaining = remaining[i + 1:].lstrip() - extras = [] - while s: - m = IDENTIFIER.match(s) - if not m: - raise SyntaxError('malformed extra: %s' % s) - extras.append(m.groups()[0]) - s = s[m.end():] - if not s: - break - if s[0] != ',': - raise SyntaxError('comma expected in extras: %s' % s) - s = s[1:].lstrip() - if not extras: - extras = None - if remaining: - if remaining[0] == '@': - # it's a URI - remaining = remaining[1:].lstrip() - m = NON_SPACE.match(remaining) - if not m: - raise SyntaxError('invalid URI: %s' % remaining) - uri = m.groups()[0] - t = urlparse(uri) - # there are issues with Python and URL parsing, so this test - # is a bit crude. See bpo-20271, bpo-23505. Python doesn't - # always parse invalid URLs correctly - it should raise - # exceptions for malformed URLs - if not (t.scheme and t.netloc): - raise SyntaxError('Invalid URL: %s' % uri) - remaining = remaining[m.end():].lstrip() - else: - - def get_versions(ver_remaining): - """ - Return a list of operator, version tuples if any are - specified, else None. - """ - m = COMPARE_OP.match(ver_remaining) - versions = None - if m: - versions = [] - while True: - op = m.groups()[0] - ver_remaining = ver_remaining[m.end():] - m = VERSION_IDENTIFIER.match(ver_remaining) - if not m: - raise SyntaxError('invalid version: %s' % ver_remaining) - v = m.groups()[0] - versions.append((op, v)) - ver_remaining = ver_remaining[m.end():] - if not ver_remaining or ver_remaining[0] != ',': - break - ver_remaining = ver_remaining[1:].lstrip() - m = COMPARE_OP.match(ver_remaining) - if not m: - raise SyntaxError('invalid constraint: %s' % ver_remaining) - if not versions: - versions = None - return versions, ver_remaining - - if remaining[0] != '(': - versions, remaining = get_versions(remaining) - else: - i = remaining.find(')', 1) - if i < 0: - raise SyntaxError('unterminated parenthesis: %s' % remaining) - s = remaining[1:i] - remaining = remaining[i + 1:].lstrip() - # As a special diversion from PEP 508, allow a version number - # a.b.c in parentheses as a synonym for ~= a.b.c (because this - # is allowed in earlier PEPs) - if COMPARE_OP.match(s): - versions, _ = get_versions(s) - else: - m = VERSION_IDENTIFIER.match(s) - if not m: - raise SyntaxError('invalid constraint: %s' % s) - v = m.groups()[0] - s = s[m.end():].lstrip() - if s: - raise SyntaxError('invalid constraint: %s' % s) - versions = [('~=', v)] - - if remaining: - if remaining[0] != ';': - raise SyntaxError('invalid requirement: %s' % remaining) - remaining = remaining[1:].lstrip() - - mark_expr, remaining = parse_marker(remaining) - - if remaining and remaining[0] != '#': - raise SyntaxError('unexpected trailing data: %s' % remaining) - - if not versions: - rs = distname - else: - rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions])) - return Container(name=distname, extras=extras, constraints=versions, - marker=mark_expr, url=uri, requirement=rs) - - -def get_resources_dests(resources_root, rules): - """Find destinations for resources files""" - - def get_rel_path(root, path): - # normalizes and returns a lstripped-/-separated path - root = root.replace(os.path.sep, '/') - path = path.replace(os.path.sep, '/') - assert path.startswith(root) - return path[len(root):].lstrip('/') - - destinations = {} - for base, suffix, dest in rules: - prefix = os.path.join(resources_root, base) - for abs_base in iglob(prefix): - abs_glob = os.path.join(abs_base, suffix) - for abs_path in iglob(abs_glob): - resource_file = get_rel_path(resources_root, abs_path) - if dest is None: # remove the entry if it was here - destinations.pop(resource_file, None) - else: - rel_path = get_rel_path(abs_base, abs_path) - rel_dest = dest.replace(os.path.sep, '/').rstrip('/') - destinations[resource_file] = rel_dest + '/' + rel_path - return destinations - - -def in_venv(): - if hasattr(sys, 'real_prefix'): - # virtualenv venvs - result = True - else: - # PEP 405 venvs - result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) - return result - - -def get_executable(): -# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as -# changes to the stub launcher mean that sys.executable always points -# to the stub on OS X -# if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' -# in os.environ): -# result = os.environ['__PYVENV_LAUNCHER__'] -# else: -# result = sys.executable -# return result - result = os.path.normcase(sys.executable) - if not isinstance(result, text_type): - result = fsdecode(result) - return result - - -def proceed(prompt, allowed_chars, error_prompt=None, default=None): - p = prompt - while True: - s = raw_input(p) - p = prompt - if not s and default: - s = default - if s: - c = s[0].lower() - if c in allowed_chars: - break - if error_prompt: - p = '%c: %s\n%s' % (c, error_prompt, prompt) - return c - - -def extract_by_key(d, keys): - if isinstance(keys, string_types): - keys = keys.split() - result = {} - for key in keys: - if key in d: - result[key] = d[key] - return result - -def read_exports(stream): - if sys.version_info[0] >= 3: - # needs to be a text stream - stream = codecs.getreader('utf-8')(stream) - # Try to load as JSON, falling back on legacy format - data = stream.read() - stream = StringIO(data) - try: - jdata = json.load(stream) - result = jdata['extensions']['python.exports']['exports'] - for group, entries in result.items(): - for k, v in entries.items(): - s = '%s = %s' % (k, v) - entry = get_export_entry(s) - assert entry is not None - entries[k] = entry - return result - except Exception: - stream.seek(0, 0) - - def read_stream(cp, stream): - if hasattr(cp, 'read_file'): - cp.read_file(stream) - else: - cp.readfp(stream) - - cp = configparser.ConfigParser() - try: - read_stream(cp, stream) - except configparser.MissingSectionHeaderError: - stream.close() - data = textwrap.dedent(data) - stream = StringIO(data) - read_stream(cp, stream) - - result = {} - for key in cp.sections(): - result[key] = entries = {} - for name, value in cp.items(key): - s = '%s = %s' % (name, value) - entry = get_export_entry(s) - assert entry is not None - #entry.dist = self - entries[name] = entry - return result - - -def write_exports(exports, stream): - if sys.version_info[0] >= 3: - # needs to be a text stream - stream = codecs.getwriter('utf-8')(stream) - cp = configparser.ConfigParser() - for k, v in exports.items(): - # TODO check k, v for valid values - cp.add_section(k) - for entry in v.values(): - if entry.suffix is None: - s = entry.prefix - else: - s = '%s:%s' % (entry.prefix, entry.suffix) - if entry.flags: - s = '%s [%s]' % (s, ', '.join(entry.flags)) - cp.set(k, entry.name, s) - cp.write(stream) - - -@contextlib.contextmanager -def tempdir(): - td = tempfile.mkdtemp() - try: - yield td - finally: - shutil.rmtree(td) - -@contextlib.contextmanager -def chdir(d): - cwd = os.getcwd() - try: - os.chdir(d) - yield - finally: - os.chdir(cwd) - - -@contextlib.contextmanager -def socket_timeout(seconds=15): - cto = socket.getdefaulttimeout() - try: - socket.setdefaulttimeout(seconds) - yield - finally: - socket.setdefaulttimeout(cto) - - -class cached_property(object): - def __init__(self, func): - self.func = func - #for attr in ('__name__', '__module__', '__doc__'): - # setattr(self, attr, getattr(func, attr, None)) - - def __get__(self, obj, cls=None): - if obj is None: - return self - value = self.func(obj) - object.__setattr__(obj, self.func.__name__, value) - #obj.__dict__[self.func.__name__] = value = self.func(obj) - return value - -def convert_path(pathname): - """Return 'pathname' as a name that will work on the native filesystem. - - The path is split on '/' and put back together again using the current - directory separator. Needed because filenames in the setup script are - always supplied in Unix style, and have to be converted to the local - convention before we can actually use them in the filesystem. Raises - ValueError on non-Unix-ish systems if 'pathname' either starts or - ends with a slash. - """ - if os.sep == '/': - return pathname - if not pathname: - return pathname - if pathname[0] == '/': - raise ValueError("path '%s' cannot be absolute" % pathname) - if pathname[-1] == '/': - raise ValueError("path '%s' cannot end with '/'" % pathname) - - paths = pathname.split('/') - while os.curdir in paths: - paths.remove(os.curdir) - if not paths: - return os.curdir - return os.path.join(*paths) - - -class FileOperator(object): - def __init__(self, dry_run=False): - self.dry_run = dry_run - self.ensured = set() - self._init_record() - - def _init_record(self): - self.record = False - self.files_written = set() - self.dirs_created = set() - - def record_as_written(self, path): - if self.record: - self.files_written.add(path) - - def newer(self, source, target): - """Tell if the target is newer than the source. - - Returns true if 'source' exists and is more recently modified than - 'target', or if 'source' exists and 'target' doesn't. - - Returns false if both exist and 'target' is the same age or younger - than 'source'. Raise PackagingFileError if 'source' does not exist. - - Note that this test is not very accurate: files created in the same - second will have the same "age". - """ - if not os.path.exists(source): - raise DistlibException("file '%r' does not exist" % - os.path.abspath(source)) - if not os.path.exists(target): - return True - - return os.stat(source).st_mtime > os.stat(target).st_mtime - - def copy_file(self, infile, outfile, check=True): - """Copy a file respecting dry-run and force flags. - """ - self.ensure_dir(os.path.dirname(outfile)) - logger.info('Copying %s to %s', infile, outfile) - if not self.dry_run: - msg = None - if check: - if os.path.islink(outfile): - msg = '%s is a symlink' % outfile - elif os.path.exists(outfile) and not os.path.isfile(outfile): - msg = '%s is a non-regular file' % outfile - if msg: - raise ValueError(msg + ' which would be overwritten') - shutil.copyfile(infile, outfile) - self.record_as_written(outfile) - - def copy_stream(self, instream, outfile, encoding=None): - assert not os.path.isdir(outfile) - self.ensure_dir(os.path.dirname(outfile)) - logger.info('Copying stream %s to %s', instream, outfile) - if not self.dry_run: - if encoding is None: - outstream = open(outfile, 'wb') - else: - outstream = codecs.open(outfile, 'w', encoding=encoding) - try: - shutil.copyfileobj(instream, outstream) - finally: - outstream.close() - self.record_as_written(outfile) - - def write_binary_file(self, path, data): - self.ensure_dir(os.path.dirname(path)) - if not self.dry_run: - if os.path.exists(path): - os.remove(path) - with open(path, 'wb') as f: - f.write(data) - self.record_as_written(path) - - def write_text_file(self, path, data, encoding): - self.write_binary_file(path, data.encode(encoding)) - - def set_mode(self, bits, mask, files): - if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): - # Set the executable bits (owner, group, and world) on - # all the files specified. - for f in files: - if self.dry_run: - logger.info("changing mode of %s", f) - else: - mode = (os.stat(f).st_mode | bits) & mask - logger.info("changing mode of %s to %o", f, mode) - os.chmod(f, mode) - - set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) - - def ensure_dir(self, path): - path = os.path.abspath(path) - if path not in self.ensured and not os.path.exists(path): - self.ensured.add(path) - d, f = os.path.split(path) - self.ensure_dir(d) - logger.info('Creating %s' % path) - if not self.dry_run: - os.mkdir(path) - if self.record: - self.dirs_created.add(path) - - def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False): - dpath = cache_from_source(path, not optimize) - logger.info('Byte-compiling %s to %s', path, dpath) - if not self.dry_run: - if force or self.newer(path, dpath): - if not prefix: - diagpath = None - else: - assert path.startswith(prefix) - diagpath = path[len(prefix):] - compile_kwargs = {} - if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'): - compile_kwargs['invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH - py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # raise error - self.record_as_written(dpath) - return dpath - - def ensure_removed(self, path): - if os.path.exists(path): - if os.path.isdir(path) and not os.path.islink(path): - logger.debug('Removing directory tree at %s', path) - if not self.dry_run: - shutil.rmtree(path) - if self.record: - if path in self.dirs_created: - self.dirs_created.remove(path) - else: - if os.path.islink(path): - s = 'link' - else: - s = 'file' - logger.debug('Removing %s %s', s, path) - if not self.dry_run: - os.remove(path) - if self.record: - if path in self.files_written: - self.files_written.remove(path) - - def is_writable(self, path): - result = False - while not result: - if os.path.exists(path): - result = os.access(path, os.W_OK) - break - parent = os.path.dirname(path) - if parent == path: - break - path = parent - return result - - def commit(self): - """ - Commit recorded changes, turn off recording, return - changes. - """ - assert self.record - result = self.files_written, self.dirs_created - self._init_record() - return result - - def rollback(self): - if not self.dry_run: - for f in list(self.files_written): - if os.path.exists(f): - os.remove(f) - # dirs should all be empty now, except perhaps for - # __pycache__ subdirs - # reverse so that subdirs appear before their parents - dirs = sorted(self.dirs_created, reverse=True) - for d in dirs: - flist = os.listdir(d) - if flist: - assert flist == ['__pycache__'] - sd = os.path.join(d, flist[0]) - os.rmdir(sd) - os.rmdir(d) # should fail if non-empty - self._init_record() - -def resolve(module_name, dotted_path): - if module_name in sys.modules: - mod = sys.modules[module_name] - else: - mod = __import__(module_name) - if dotted_path is None: - result = mod - else: - parts = dotted_path.split('.') - result = getattr(mod, parts.pop(0)) - for p in parts: - result = getattr(result, p) - return result - - -class ExportEntry(object): - def __init__(self, name, prefix, suffix, flags): - self.name = name - self.prefix = prefix - self.suffix = suffix - self.flags = flags - - @cached_property - def value(self): - return resolve(self.prefix, self.suffix) - - def __repr__(self): # pragma: no cover - return '<ExportEntry %s = %s:%s %s>' % (self.name, self.prefix, - self.suffix, self.flags) - - def __eq__(self, other): - if not isinstance(other, ExportEntry): - result = False - else: - result = (self.name == other.name and - self.prefix == other.prefix and - self.suffix == other.suffix and - self.flags == other.flags) - return result - - __hash__ = object.__hash__ - - -ENTRY_RE = re.compile(r'''(?P<name>(\w|[-.+])+) - \s*=\s*(?P<callable>(\w+)([:\.]\w+)*) - \s*(\[\s*(?P<flags>\w+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? - ''', re.VERBOSE) - -def get_export_entry(specification): - m = ENTRY_RE.search(specification) - if not m: - result = None - if '[' in specification or ']' in specification: - raise DistlibException("Invalid specification " - "'%s'" % specification) - else: - d = m.groupdict() - name = d['name'] - path = d['callable'] - colons = path.count(':') - if colons == 0: - prefix, suffix = path, None - else: - if colons != 1: - raise DistlibException("Invalid specification " - "'%s'" % specification) - prefix, suffix = path.split(':') - flags = d['flags'] - if flags is None: - if '[' in specification or ']' in specification: - raise DistlibException("Invalid specification " - "'%s'" % specification) - flags = [] - else: - flags = [f.strip() for f in flags.split(',')] - result = ExportEntry(name, prefix, suffix, flags) - return result - - -def get_cache_base(suffix=None): - """ - Return the default base location for distlib caches. If the directory does - not exist, it is created. Use the suffix provided for the base directory, - and default to '.distlib' if it isn't provided. - - On Windows, if LOCALAPPDATA is defined in the environment, then it is - assumed to be a directory, and will be the parent directory of the result. - On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home - directory - using os.expanduser('~') - will be the parent directory of - the result. - - The result is just the directory '.distlib' in the parent directory as - determined above, or with the name specified with ``suffix``. - """ - if suffix is None: - suffix = '.distlib' - if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: - result = os.path.expandvars('$localappdata') - else: - # Assume posix, or old Windows - result = os.path.expanduser('~') - # we use 'isdir' instead of 'exists', because we want to - # fail if there's a file with that name - if os.path.isdir(result): - usable = os.access(result, os.W_OK) - if not usable: - logger.warning('Directory exists but is not writable: %s', result) - else: - try: - os.makedirs(result) - usable = True - except OSError: - logger.warning('Unable to create %s', result, exc_info=True) - usable = False - if not usable: - result = tempfile.mkdtemp() - logger.warning('Default location unusable, using %s', result) - return os.path.join(result, suffix) - - -def path_to_cache_dir(path): - """ - Convert an absolute path to a directory name for use in a cache. - - The algorithm used is: - - #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. - #. Any occurrence of ``os.sep`` is replaced with ``'--'``. - #. ``'.cache'`` is appended. - """ - d, p = os.path.splitdrive(os.path.abspath(path)) - if d: - d = d.replace(':', '---') - p = p.replace(os.sep, '--') - return d + p + '.cache' - - -def ensure_slash(s): - if not s.endswith('/'): - return s + '/' - return s - - -def parse_credentials(netloc): - username = password = None - if '@' in netloc: - prefix, netloc = netloc.split('@', 1) - if ':' not in prefix: - username = prefix - else: - username, password = prefix.split(':', 1) - return username, password, netloc - - -def get_process_umask(): - result = os.umask(0o22) - os.umask(result) - return result - -def is_string_sequence(seq): - result = True - i = None - for i, s in enumerate(seq): - if not isinstance(s, string_types): - result = False - break - assert i is not None - return result - -PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' - '([a-z0-9_.+-]+)', re.I) -PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') - - -def split_filename(filename, project_name=None): - """ - Extract name, version, python version from a filename (no extension) - - Return name, version, pyver or None - """ - result = None - pyver = None - filename = unquote(filename).replace(' ', '-') - m = PYTHON_VERSION.search(filename) - if m: - pyver = m.group(1) - filename = filename[:m.start()] - if project_name and len(filename) > len(project_name) + 1: - m = re.match(re.escape(project_name) + r'\b', filename) - if m: - n = m.end() - result = filename[:n], filename[n + 1:], pyver - if result is None: - m = PROJECT_NAME_AND_VERSION.match(filename) - if m: - result = m.group(1), m.group(3), pyver - return result - -# Allow spaces in name because of legacy dists like "Twisted Core" -NAME_VERSION_RE = re.compile(r'(?P<name>[\w .-]+)\s*' - r'\(\s*(?P<ver>[^\s)]+)\)$') - -def parse_name_and_version(p): - """ - A utility method used to get name and version from a string. - - From e.g. a Provides-Dist value. - - :param p: A value in a form 'foo (1.0)' - :return: The name and version as a tuple. - """ - m = NAME_VERSION_RE.match(p) - if not m: - raise DistlibException('Ill-formed name/version string: \'%s\'' % p) - d = m.groupdict() - return d['name'].strip().lower(), d['ver'] - -def get_extras(requested, available): - result = set() - requested = set(requested or []) - available = set(available or []) - if '*' in requested: - requested.remove('*') - result |= available - for r in requested: - if r == '-': - result.add(r) - elif r.startswith('-'): - unwanted = r[1:] - if unwanted not in available: - logger.warning('undeclared extra: %s' % unwanted) - if unwanted in result: - result.remove(unwanted) - else: - if r not in available: - logger.warning('undeclared extra: %s' % r) - result.add(r) - return result -# -# Extended metadata functionality -# - -def _get_external_data(url): - result = {} - try: - # urlopen might fail if it runs into redirections, - # because of Python issue #13696. Fixed in locators - # using a custom redirect handler. - resp = urlopen(url) - headers = resp.info() - ct = headers.get('Content-Type') - if not ct.startswith('application/json'): - logger.debug('Unexpected response for JSON request: %s', ct) - else: - reader = codecs.getreader('utf-8')(resp) - #data = reader.read().decode('utf-8') - #result = json.loads(data) - result = json.load(reader) - except Exception as e: - logger.exception('Failed to get external data for %s: %s', url, e) - return result - -_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' - -def get_project_data(name): - url = '%s/%s/project.json' % (name[0].upper(), name) - url = urljoin(_external_data_base_url, url) - result = _get_external_data(url) - return result - -def get_package_data(name, version): - url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) - url = urljoin(_external_data_base_url, url) - return _get_external_data(url) - - -class Cache(object): - """ - A class implementing a cache for resources that need to live in the file system - e.g. shared libraries. This class was moved from resources to here because it - could be used by other modules, e.g. the wheel module. - """ - - def __init__(self, base): - """ - Initialise an instance. - - :param base: The base directory where the cache should be located. - """ - # we use 'isdir' instead of 'exists', because we want to - # fail if there's a file with that name - if not os.path.isdir(base): # pragma: no cover - os.makedirs(base) - if (os.stat(base).st_mode & 0o77) != 0: - logger.warning('Directory \'%s\' is not private', base) - self.base = os.path.abspath(os.path.normpath(base)) - - def prefix_to_dir(self, prefix): - """ - Converts a resource prefix to a directory name in the cache. - """ - return path_to_cache_dir(prefix) - - def clear(self): - """ - Clear the cache. - """ - not_removed = [] - for fn in os.listdir(self.base): - fn = os.path.join(self.base, fn) - try: - if os.path.islink(fn) or os.path.isfile(fn): - os.remove(fn) - elif os.path.isdir(fn): - shutil.rmtree(fn) - except Exception: - not_removed.append(fn) - return not_removed - - -class EventMixin(object): - """ - A very simple publish/subscribe system. - """ - def __init__(self): - self._subscribers = {} - - def add(self, event, subscriber, append=True): - """ - Add a subscriber for an event. - - :param event: The name of an event. - :param subscriber: The subscriber to be added (and called when the - event is published). - :param append: Whether to append or prepend the subscriber to an - existing subscriber list for the event. - """ - subs = self._subscribers - if event not in subs: - subs[event] = deque([subscriber]) - else: - sq = subs[event] - if append: - sq.append(subscriber) - else: - sq.appendleft(subscriber) - - def remove(self, event, subscriber): - """ - Remove a subscriber for an event. - - :param event: The name of an event. - :param subscriber: The subscriber to be removed. - """ - subs = self._subscribers - if event not in subs: - raise ValueError('No subscribers: %r' % event) - subs[event].remove(subscriber) - - def get_subscribers(self, event): - """ - Return an iterator for the subscribers for an event. - :param event: The event to return subscribers for. - """ - return iter(self._subscribers.get(event, ())) - - def publish(self, event, *args, **kwargs): - """ - Publish a event and return a list of values returned by its - subscribers. - - :param event: The event to publish. - :param args: The positional arguments to pass to the event's - subscribers. - :param kwargs: The keyword arguments to pass to the event's - subscribers. - """ - result = [] - for subscriber in self.get_subscribers(event): - try: - value = subscriber(event, *args, **kwargs) - except Exception: - logger.exception('Exception during event publication') - value = None - result.append(value) - logger.debug('publish %s: args = %s, kwargs = %s, result = %s', - event, args, kwargs, result) - return result - -# -# Simple sequencing -# -class Sequencer(object): - def __init__(self): - self._preds = {} - self._succs = {} - self._nodes = set() # nodes with no preds/succs - - def add_node(self, node): - self._nodes.add(node) - - def remove_node(self, node, edges=False): - if node in self._nodes: - self._nodes.remove(node) - if edges: - for p in set(self._preds.get(node, ())): - self.remove(p, node) - for s in set(self._succs.get(node, ())): - self.remove(node, s) - # Remove empties - for k, v in list(self._preds.items()): - if not v: - del self._preds[k] - for k, v in list(self._succs.items()): - if not v: - del self._succs[k] - - def add(self, pred, succ): - assert pred != succ - self._preds.setdefault(succ, set()).add(pred) - self._succs.setdefault(pred, set()).add(succ) - - def remove(self, pred, succ): - assert pred != succ - try: - preds = self._preds[succ] - succs = self._succs[pred] - except KeyError: # pragma: no cover - raise ValueError('%r not a successor of anything' % succ) - try: - preds.remove(pred) - succs.remove(succ) - except KeyError: # pragma: no cover - raise ValueError('%r not a successor of %r' % (succ, pred)) - - def is_step(self, step): - return (step in self._preds or step in self._succs or - step in self._nodes) - - def get_steps(self, final): - if not self.is_step(final): - raise ValueError('Unknown: %r' % final) - result = [] - todo = [] - seen = set() - todo.append(final) - while todo: - step = todo.pop(0) - if step in seen: - # if a step was already seen, - # move it to the end (so it will appear earlier - # when reversed on return) ... but not for the - # final step, as that would be confusing for - # users - if step != final: - result.remove(step) - result.append(step) - else: - seen.add(step) - result.append(step) - preds = self._preds.get(step, ()) - todo.extend(preds) - return reversed(result) - - @property - def strong_connections(self): - #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm - index_counter = [0] - stack = [] - lowlinks = {} - index = {} - result = [] - - graph = self._succs - - def strongconnect(node): - # set the depth index for this node to the smallest unused index - index[node] = index_counter[0] - lowlinks[node] = index_counter[0] - index_counter[0] += 1 - stack.append(node) - - # Consider successors - try: - successors = graph[node] - except Exception: - successors = [] - for successor in successors: - if successor not in lowlinks: - # Successor has not yet been visited - strongconnect(successor) - lowlinks[node] = min(lowlinks[node],lowlinks[successor]) - elif successor in stack: - # the successor is in the stack and hence in the current - # strongly connected component (SCC) - lowlinks[node] = min(lowlinks[node],index[successor]) - - # If `node` is a root node, pop the stack and generate an SCC - if lowlinks[node] == index[node]: - connected_component = [] - - while True: - successor = stack.pop() - connected_component.append(successor) - if successor == node: break - component = tuple(connected_component) - # storing the result - result.append(component) - - for node in graph: - if node not in lowlinks: - strongconnect(node) - - return result - - @property - def dot(self): - result = ['digraph G {'] - for succ in self._preds: - preds = self._preds[succ] - for pred in preds: - result.append(' %s -> %s;' % (pred, succ)) - for node in self._nodes: - result.append(' %s;' % node) - result.append('}') - return '\n'.join(result) - -# -# Unarchiving functionality for zip, tar, tgz, tbz, whl -# - -ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', - '.tgz', '.tbz', '.whl') - -def unarchive(archive_filename, dest_dir, format=None, check=True): - - def check_path(path): - if not isinstance(path, text_type): - path = path.decode('utf-8') - p = os.path.abspath(os.path.join(dest_dir, path)) - if not p.startswith(dest_dir) or p[plen] != os.sep: - raise ValueError('path outside destination: %r' % p) - - dest_dir = os.path.abspath(dest_dir) - plen = len(dest_dir) - archive = None - if format is None: - if archive_filename.endswith(('.zip', '.whl')): - format = 'zip' - elif archive_filename.endswith(('.tar.gz', '.tgz')): - format = 'tgz' - mode = 'r:gz' - elif archive_filename.endswith(('.tar.bz2', '.tbz')): - format = 'tbz' - mode = 'r:bz2' - elif archive_filename.endswith('.tar'): - format = 'tar' - mode = 'r' - else: # pragma: no cover - raise ValueError('Unknown format for %r' % archive_filename) - try: - if format == 'zip': - archive = ZipFile(archive_filename, 'r') - if check: - names = archive.namelist() - for name in names: - check_path(name) - else: - archive = tarfile.open(archive_filename, mode) - if check: - names = archive.getnames() - for name in names: - check_path(name) - if format != 'zip' and sys.version_info[0] < 3: - # See Python issue 17153. If the dest path contains Unicode, - # tarfile extraction fails on Python 2.x if a member path name - # contains non-ASCII characters - it leads to an implicit - # bytes -> unicode conversion using ASCII to decode. - for tarinfo in archive.getmembers(): - if not isinstance(tarinfo.name, text_type): - tarinfo.name = tarinfo.name.decode('utf-8') - archive.extractall(dest_dir) - - finally: - if archive: - archive.close() - - -def zip_dir(directory): - """zip a directory tree into a BytesIO object""" - result = io.BytesIO() - dlen = len(directory) - with ZipFile(result, "w") as zf: - for root, dirs, files in os.walk(directory): - for name in files: - full = os.path.join(root, name) - rel = root[dlen:] - dest = os.path.join(rel, name) - zf.write(full, dest) - return result - -# -# Simple progress bar -# - -UNITS = ('', 'K', 'M', 'G','T','P') - - -class Progress(object): - unknown = 'UNKNOWN' - - def __init__(self, minval=0, maxval=100): - assert maxval is None or maxval >= minval - self.min = self.cur = minval - self.max = maxval - self.started = None - self.elapsed = 0 - self.done = False - - def update(self, curval): - assert self.min <= curval - assert self.max is None or curval <= self.max - self.cur = curval - now = time.time() - if self.started is None: - self.started = now - else: - self.elapsed = now - self.started - - def increment(self, incr): - assert incr >= 0 - self.update(self.cur + incr) - - def start(self): - self.update(self.min) - return self - - def stop(self): - if self.max is not None: - self.update(self.max) - self.done = True - - @property - def maximum(self): - return self.unknown if self.max is None else self.max - - @property - def percentage(self): - if self.done: - result = '100 %' - elif self.max is None: - result = ' ?? %' - else: - v = 100.0 * (self.cur - self.min) / (self.max - self.min) - result = '%3d %%' % v - return result - - def format_duration(self, duration): - if (duration <= 0) and self.max is None or self.cur == self.min: - result = '??:??:??' - #elif duration < 1: - # result = '--:--:--' - else: - result = time.strftime('%H:%M:%S', time.gmtime(duration)) - return result - - @property - def ETA(self): - if self.done: - prefix = 'Done' - t = self.elapsed - #import pdb; pdb.set_trace() - else: - prefix = 'ETA ' - if self.max is None: - t = -1 - elif self.elapsed == 0 or (self.cur == self.min): - t = 0 - else: - #import pdb; pdb.set_trace() - t = float(self.max - self.min) - t /= self.cur - self.min - t = (t - 1) * self.elapsed - return '%s: %s' % (prefix, self.format_duration(t)) - - @property - def speed(self): - if self.elapsed == 0: - result = 0.0 - else: - result = (self.cur - self.min) / self.elapsed - for unit in UNITS: - if result < 1000: - break - result /= 1000.0 - return '%d %sB/s' % (result, unit) - -# -# Glob functionality -# - -RICH_GLOB = re.compile(r'\{([^}]*)\}') -_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') -_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') - - -def iglob(path_glob): - """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" - if _CHECK_RECURSIVE_GLOB.search(path_glob): - msg = """invalid glob %r: recursive glob "**" must be used alone""" - raise ValueError(msg % path_glob) - if _CHECK_MISMATCH_SET.search(path_glob): - msg = """invalid glob %r: mismatching set marker '{' or '}'""" - raise ValueError(msg % path_glob) - return _iglob(path_glob) - - -def _iglob(path_glob): - rich_path_glob = RICH_GLOB.split(path_glob, 1) - if len(rich_path_glob) > 1: - assert len(rich_path_glob) == 3, rich_path_glob - prefix, set, suffix = rich_path_glob - for item in set.split(','): - for path in _iglob(''.join((prefix, item, suffix))): - yield path - else: - if '**' not in path_glob: - for item in std_iglob(path_glob): - yield item - else: - prefix, radical = path_glob.split('**', 1) - if prefix == '': - prefix = '.' - if radical == '': - radical = '*' - else: - # we support both - radical = radical.lstrip('/') - radical = radical.lstrip('\\') - for path, dir, files in os.walk(prefix): - path = os.path.normpath(path) - for fn in _iglob(os.path.join(path, radical)): - yield fn - -if ssl: - from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, - CertificateError) - - -# -# HTTPSConnection which verifies certificates/matches domains -# - - class HTTPSConnection(httplib.HTTPSConnection): - ca_certs = None # set this to the path to the certs file (.pem) - check_domain = True # only used if ca_certs is not None - - # noinspection PyPropertyAccess - def connect(self): - sock = socket.create_connection((self.host, self.port), self.timeout) - if getattr(self, '_tunnel_host', False): - self.sock = sock - self._tunnel() - - if not hasattr(ssl, 'SSLContext'): - # For 2.x - if self.ca_certs: - cert_reqs = ssl.CERT_REQUIRED - else: - cert_reqs = ssl.CERT_NONE - self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, - cert_reqs=cert_reqs, - ssl_version=ssl.PROTOCOL_SSLv23, - ca_certs=self.ca_certs) - else: # pragma: no cover - context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) - context.options |= ssl.OP_NO_SSLv2 - if self.cert_file: - context.load_cert_chain(self.cert_file, self.key_file) - kwargs = {} - if self.ca_certs: - context.verify_mode = ssl.CERT_REQUIRED - context.load_verify_locations(cafile=self.ca_certs) - if getattr(ssl, 'HAS_SNI', False): - kwargs['server_hostname'] = self.host - self.sock = context.wrap_socket(sock, **kwargs) - if self.ca_certs and self.check_domain: - try: - match_hostname(self.sock.getpeercert(), self.host) - logger.debug('Host verified: %s', self.host) - except CertificateError: # pragma: no cover - self.sock.shutdown(socket.SHUT_RDWR) - self.sock.close() - raise - - class HTTPSHandler(BaseHTTPSHandler): - def __init__(self, ca_certs, check_domain=True): - BaseHTTPSHandler.__init__(self) - self.ca_certs = ca_certs - self.check_domain = check_domain - - def _conn_maker(self, *args, **kwargs): - """ - This is called to create a connection instance. Normally you'd - pass a connection class to do_open, but it doesn't actually check for - a class, and just expects a callable. As long as we behave just as a - constructor would have, we should be OK. If it ever changes so that - we *must* pass a class, we'll create an UnsafeHTTPSConnection class - which just sets check_domain to False in the class definition, and - choose which one to pass to do_open. - """ - result = HTTPSConnection(*args, **kwargs) - if self.ca_certs: - result.ca_certs = self.ca_certs - result.check_domain = self.check_domain - return result - - def https_open(self, req): - try: - return self.do_open(self._conn_maker, req) - except URLError as e: - if 'certificate verify failed' in str(e.reason): - raise CertificateError('Unable to verify server certificate ' - 'for %s' % req.host) - else: - raise - - # - # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- - # Middle proxy using HTTP listens on port 443, or an index mistakenly serves - # HTML containing a http://xyz link when it should be https://xyz), - # you can use the following handler class, which does not allow HTTP traffic. - # - # It works by inheriting from HTTPHandler - so build_opener won't add a - # handler for HTTP itself. - # - class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): - def http_open(self, req): - raise URLError('Unexpected HTTP request on what should be a secure ' - 'connection: %s' % req) - -# -# XML-RPC with timeouts -# - -_ver_info = sys.version_info[:2] - -if _ver_info == (2, 6): - class HTTP(httplib.HTTP): - def __init__(self, host='', port=None, **kwargs): - if port == 0: # 0 means use port 0, not the default port - port = None - self._setup(self._connection_class(host, port, **kwargs)) - - - if ssl: - class HTTPS(httplib.HTTPS): - def __init__(self, host='', port=None, **kwargs): - if port == 0: # 0 means use port 0, not the default port - port = None - self._setup(self._connection_class(host, port, **kwargs)) - - -class Transport(xmlrpclib.Transport): - def __init__(self, timeout, use_datetime=0): - self.timeout = timeout - xmlrpclib.Transport.__init__(self, use_datetime) - - def make_connection(self, host): - h, eh, x509 = self.get_host_info(host) - if _ver_info == (2, 6): - result = HTTP(h, timeout=self.timeout) - else: - if not self._connection or host != self._connection[0]: - self._extra_headers = eh - self._connection = host, httplib.HTTPConnection(h) - result = self._connection[1] - return result - -if ssl: - class SafeTransport(xmlrpclib.SafeTransport): - def __init__(self, timeout, use_datetime=0): - self.timeout = timeout - xmlrpclib.SafeTransport.__init__(self, use_datetime) - - def make_connection(self, host): - h, eh, kwargs = self.get_host_info(host) - if not kwargs: - kwargs = {} - kwargs['timeout'] = self.timeout - if _ver_info == (2, 6): - result = HTTPS(host, None, **kwargs) - else: - if not self._connection or host != self._connection[0]: - self._extra_headers = eh - self._connection = host, httplib.HTTPSConnection(h, None, - **kwargs) - result = self._connection[1] - return result - - -class ServerProxy(xmlrpclib.ServerProxy): - def __init__(self, uri, **kwargs): - self.timeout = timeout = kwargs.pop('timeout', None) - # The above classes only come into play if a timeout - # is specified - if timeout is not None: - scheme, _ = splittype(uri) - use_datetime = kwargs.get('use_datetime', 0) - if scheme == 'https': - tcls = SafeTransport - else: - tcls = Transport - kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) - self.transport = t - xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) - -# -# CSV functionality. This is provided because on 2.x, the csv module can't -# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. -# - -def _csv_open(fn, mode, **kwargs): - if sys.version_info[0] < 3: - mode += 'b' - else: - kwargs['newline'] = '' - # Python 3 determines encoding from locale. Force 'utf-8' - # file encoding to match other forced utf-8 encoding - kwargs['encoding'] = 'utf-8' - return open(fn, mode, **kwargs) - - -class CSVBase(object): - defaults = { - 'delimiter': str(','), # The strs are used because we need native - 'quotechar': str('"'), # str in the csv API (2.x won't take - 'lineterminator': str('\n') # Unicode) - } - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.stream.close() - - -class CSVReader(CSVBase): - def __init__(self, **kwargs): - if 'stream' in kwargs: - stream = kwargs['stream'] - if sys.version_info[0] >= 3: - # needs to be a text stream - stream = codecs.getreader('utf-8')(stream) - self.stream = stream - else: - self.stream = _csv_open(kwargs['path'], 'r') - self.reader = csv.reader(self.stream, **self.defaults) - - def __iter__(self): - return self - - def next(self): - result = next(self.reader) - if sys.version_info[0] < 3: - for i, item in enumerate(result): - if not isinstance(item, text_type): - result[i] = item.decode('utf-8') - return result - - __next__ = next - -class CSVWriter(CSVBase): - def __init__(self, fn, **kwargs): - self.stream = _csv_open(fn, 'w') - self.writer = csv.writer(self.stream, **self.defaults) - - def writerow(self, row): - if sys.version_info[0] < 3: - r = [] - for item in row: - if isinstance(item, text_type): - item = item.encode('utf-8') - r.append(item) - row = r - self.writer.writerow(row) - -# -# Configurator functionality -# - -class Configurator(BaseConfigurator): - - value_converters = dict(BaseConfigurator.value_converters) - value_converters['inc'] = 'inc_convert' - - def __init__(self, config, base=None): - super(Configurator, self).__init__(config) - self.base = base or os.getcwd() - - def configure_custom(self, config): - def convert(o): - if isinstance(o, (list, tuple)): - result = type(o)([convert(i) for i in o]) - elif isinstance(o, dict): - if '()' in o: - result = self.configure_custom(o) - else: - result = {} - for k in o: - result[k] = convert(o[k]) - else: - result = self.convert(o) - return result - - c = config.pop('()') - if not callable(c): - c = self.resolve(c) - props = config.pop('.', None) - # Check for valid identifiers - args = config.pop('[]', ()) - if args: - args = tuple([convert(o) for o in args]) - items = [(k, convert(config[k])) for k in config if valid_ident(k)] - kwargs = dict(items) - result = c(*args, **kwargs) - if props: - for n, v in props.items(): - setattr(result, n, convert(v)) - return result - - def __getitem__(self, key): - result = self.config[key] - if isinstance(result, dict) and '()' in result: - self.config[key] = result = self.configure_custom(result) - return result - - def inc_convert(self, value): - """Default converter for the inc:// protocol.""" - if not os.path.isabs(value): - value = os.path.join(self.base, value) - with codecs.open(value, 'r', encoding='utf-8') as f: - result = json.load(f) - return result - - -class SubprocessMixin(object): - """ - Mixin for running subprocesses and capturing their output - """ - def __init__(self, verbose=False, progress=None): - self.verbose = verbose - self.progress = progress - - def reader(self, stream, context): - """ - Read lines from a subprocess' output stream and either pass to a progress - callable (if specified) or write progress information to sys.stderr. - """ - progress = self.progress - verbose = self.verbose - while True: - s = stream.readline() - if not s: - break - if progress is not None: - progress(s, context) - else: - if not verbose: - sys.stderr.write('.') - else: - sys.stderr.write(s.decode('utf-8')) - sys.stderr.flush() - stream.close() - - def run_command(self, cmd, **kwargs): - p = subprocess.Popen(cmd, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, **kwargs) - t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) - t1.start() - t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) - t2.start() - p.wait() - t1.join() - t2.join() - if self.progress is not None: - self.progress('done.', 'main') - elif self.verbose: - sys.stderr.write('done.\n') - return p - - -def normalize_name(name): - """Normalize a python package name a la PEP 503""" - # https://www.python.org/dev/peps/pep-0503/#normalized-names - return re.sub('[-_.]+', '-', name).lower() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/version.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/version.py deleted file mode 100644 index 3eebe18..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/version.py +++ /dev/null @@ -1,736 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2017 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -""" -Implementation of a flexible versioning scheme providing support for PEP-440, -setuptools-compatible and semantic versioning. -""" - -import logging -import re - -from .compat import string_types -from .util import parse_requirement - -__all__ = ['NormalizedVersion', 'NormalizedMatcher', - 'LegacyVersion', 'LegacyMatcher', - 'SemanticVersion', 'SemanticMatcher', - 'UnsupportedVersionError', 'get_scheme'] - -logger = logging.getLogger(__name__) - - -class UnsupportedVersionError(ValueError): - """This is an unsupported version.""" - pass - - -class Version(object): - def __init__(self, s): - self._string = s = s.strip() - self._parts = parts = self.parse(s) - assert isinstance(parts, tuple) - assert len(parts) > 0 - - def parse(self, s): - raise NotImplementedError('please implement in a subclass') - - def _check_compatible(self, other): - if type(self) != type(other): - raise TypeError('cannot compare %r and %r' % (self, other)) - - def __eq__(self, other): - self._check_compatible(other) - return self._parts == other._parts - - def __ne__(self, other): - return not self.__eq__(other) - - def __lt__(self, other): - self._check_compatible(other) - return self._parts < other._parts - - def __gt__(self, other): - return not (self.__lt__(other) or self.__eq__(other)) - - def __le__(self, other): - return self.__lt__(other) or self.__eq__(other) - - def __ge__(self, other): - return self.__gt__(other) or self.__eq__(other) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - def __hash__(self): - return hash(self._parts) - - def __repr__(self): - return "%s('%s')" % (self.__class__.__name__, self._string) - - def __str__(self): - return self._string - - @property - def is_prerelease(self): - raise NotImplementedError('Please implement in subclasses.') - - -class Matcher(object): - version_class = None - - # value is either a callable or the name of a method - _operators = { - '<': lambda v, c, p: v < c, - '>': lambda v, c, p: v > c, - '<=': lambda v, c, p: v == c or v < c, - '>=': lambda v, c, p: v == c or v > c, - '==': lambda v, c, p: v == c, - '===': lambda v, c, p: v == c, - # by default, compatible => >=. - '~=': lambda v, c, p: v == c or v > c, - '!=': lambda v, c, p: v != c, - } - - # this is a method only to support alternative implementations - # via overriding - def parse_requirement(self, s): - return parse_requirement(s) - - def __init__(self, s): - if self.version_class is None: - raise ValueError('Please specify a version class') - self._string = s = s.strip() - r = self.parse_requirement(s) - if not r: - raise ValueError('Not valid: %r' % s) - self.name = r.name - self.key = self.name.lower() # for case-insensitive comparisons - clist = [] - if r.constraints: - # import pdb; pdb.set_trace() - for op, s in r.constraints: - if s.endswith('.*'): - if op not in ('==', '!='): - raise ValueError('\'.*\' not allowed for ' - '%r constraints' % op) - # Could be a partial version (e.g. for '2.*') which - # won't parse as a version, so keep it as a string - vn, prefix = s[:-2], True - # Just to check that vn is a valid version - self.version_class(vn) - else: - # Should parse as a version, so we can create an - # instance for the comparison - vn, prefix = self.version_class(s), False - clist.append((op, vn, prefix)) - self._parts = tuple(clist) - - def match(self, version): - """ - Check if the provided version matches the constraints. - - :param version: The version to match against this instance. - :type version: String or :class:`Version` instance. - """ - if isinstance(version, string_types): - version = self.version_class(version) - for operator, constraint, prefix in self._parts: - f = self._operators.get(operator) - if isinstance(f, string_types): - f = getattr(self, f) - if not f: - msg = ('%r not implemented ' - 'for %s' % (operator, self.__class__.__name__)) - raise NotImplementedError(msg) - if not f(version, constraint, prefix): - return False - return True - - @property - def exact_version(self): - result = None - if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='): - result = self._parts[0][1] - return result - - def _check_compatible(self, other): - if type(self) != type(other) or self.name != other.name: - raise TypeError('cannot compare %s and %s' % (self, other)) - - def __eq__(self, other): - self._check_compatible(other) - return self.key == other.key and self._parts == other._parts - - def __ne__(self, other): - return not self.__eq__(other) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - def __hash__(self): - return hash(self.key) + hash(self._parts) - - def __repr__(self): - return "%s(%r)" % (self.__class__.__name__, self._string) - - def __str__(self): - return self._string - - -PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?' - r'(\.(post)(\d+))?(\.(dev)(\d+))?' - r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$') - - -def _pep_440_key(s): - s = s.strip() - m = PEP440_VERSION_RE.match(s) - if not m: - raise UnsupportedVersionError('Not a valid version: %s' % s) - groups = m.groups() - nums = tuple(int(v) for v in groups[1].split('.')) - while len(nums) > 1 and nums[-1] == 0: - nums = nums[:-1] - - if not groups[0]: - epoch = 0 - else: - epoch = int(groups[0]) - pre = groups[4:6] - post = groups[7:9] - dev = groups[10:12] - local = groups[13] - if pre == (None, None): - pre = () - else: - pre = pre[0], int(pre[1]) - if post == (None, None): - post = () - else: - post = post[0], int(post[1]) - if dev == (None, None): - dev = () - else: - dev = dev[0], int(dev[1]) - if local is None: - local = () - else: - parts = [] - for part in local.split('.'): - # to ensure that numeric compares as > lexicographic, avoid - # comparing them directly, but encode a tuple which ensures - # correct sorting - if part.isdigit(): - part = (1, int(part)) - else: - part = (0, part) - parts.append(part) - local = tuple(parts) - if not pre: - # either before pre-release, or final release and after - if not post and dev: - # before pre-release - pre = ('a', -1) # to sort before a0 - else: - pre = ('z',) # to sort after all pre-releases - # now look at the state of post and dev. - if not post: - post = ('_',) # sort before 'a' - if not dev: - dev = ('final',) - - #print('%s -> %s' % (s, m.groups())) - return epoch, nums, pre, post, dev, local - - -_normalized_key = _pep_440_key - - -class NormalizedVersion(Version): - """A rational version. - - Good: - 1.2 # equivalent to "1.2.0" - 1.2.0 - 1.2a1 - 1.2.3a2 - 1.2.3b1 - 1.2.3c1 - 1.2.3.4 - TODO: fill this out - - Bad: - 1 # minimum two numbers - 1.2a # release level must have a release serial - 1.2.3b - """ - def parse(self, s): - result = _normalized_key(s) - # _normalized_key loses trailing zeroes in the release - # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0 - # However, PEP 440 prefix matching needs it: for example, - # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0). - m = PEP440_VERSION_RE.match(s) # must succeed - groups = m.groups() - self._release_clause = tuple(int(v) for v in groups[1].split('.')) - return result - - PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) - - @property - def is_prerelease(self): - return any(t[0] in self.PREREL_TAGS for t in self._parts if t) - - -def _match_prefix(x, y): - x = str(x) - y = str(y) - if x == y: - return True - if not x.startswith(y): - return False - n = len(y) - return x[n] == '.' - - -class NormalizedMatcher(Matcher): - version_class = NormalizedVersion - - # value is either a callable or the name of a method - _operators = { - '~=': '_match_compatible', - '<': '_match_lt', - '>': '_match_gt', - '<=': '_match_le', - '>=': '_match_ge', - '==': '_match_eq', - '===': '_match_arbitrary', - '!=': '_match_ne', - } - - def _adjust_local(self, version, constraint, prefix): - if prefix: - strip_local = '+' not in constraint and version._parts[-1] - else: - # both constraint and version are - # NormalizedVersion instances. - # If constraint does not have a local component, - # ensure the version doesn't, either. - strip_local = not constraint._parts[-1] and version._parts[-1] - if strip_local: - s = version._string.split('+', 1)[0] - version = self.version_class(s) - return version, constraint - - def _match_lt(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if version >= constraint: - return False - release_clause = constraint._release_clause - pfx = '.'.join([str(i) for i in release_clause]) - return not _match_prefix(version, pfx) - - def _match_gt(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if version <= constraint: - return False - release_clause = constraint._release_clause - pfx = '.'.join([str(i) for i in release_clause]) - return not _match_prefix(version, pfx) - - def _match_le(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - return version <= constraint - - def _match_ge(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - return version >= constraint - - def _match_eq(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if not prefix: - result = (version == constraint) - else: - result = _match_prefix(version, constraint) - return result - - def _match_arbitrary(self, version, constraint, prefix): - return str(version) == str(constraint) - - def _match_ne(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if not prefix: - result = (version != constraint) - else: - result = not _match_prefix(version, constraint) - return result - - def _match_compatible(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if version == constraint: - return True - if version < constraint: - return False -# if not prefix: -# return True - release_clause = constraint._release_clause - if len(release_clause) > 1: - release_clause = release_clause[:-1] - pfx = '.'.join([str(i) for i in release_clause]) - return _match_prefix(version, pfx) - -_REPLACEMENTS = ( - (re.compile('[.+-]$'), ''), # remove trailing puncts - (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start - (re.compile('^[.-]'), ''), # remove leading puncts - (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses - (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) - (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) - (re.compile('[.]{2,}'), '.'), # multiple runs of '.' - (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha - (re.compile(r'\b(pre-alpha|prealpha)\b'), - 'pre.alpha'), # standardise - (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses -) - -_SUFFIX_REPLACEMENTS = ( - (re.compile('^[:~._+-]+'), ''), # remove leading puncts - (re.compile('[,*")([\\]]'), ''), # remove unwanted chars - (re.compile('[~:+_ -]'), '.'), # replace illegal chars - (re.compile('[.]{2,}'), '.'), # multiple runs of '.' - (re.compile(r'\.$'), ''), # trailing '.' -) - -_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') - - -def _suggest_semantic_version(s): - """ - Try to suggest a semantic form for a version for which - _suggest_normalized_version couldn't come up with anything. - """ - result = s.strip().lower() - for pat, repl in _REPLACEMENTS: - result = pat.sub(repl, result) - if not result: - result = '0.0.0' - - # Now look for numeric prefix, and separate it out from - # the rest. - #import pdb; pdb.set_trace() - m = _NUMERIC_PREFIX.match(result) - if not m: - prefix = '0.0.0' - suffix = result - else: - prefix = m.groups()[0].split('.') - prefix = [int(i) for i in prefix] - while len(prefix) < 3: - prefix.append(0) - if len(prefix) == 3: - suffix = result[m.end():] - else: - suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] - prefix = prefix[:3] - prefix = '.'.join([str(i) for i in prefix]) - suffix = suffix.strip() - if suffix: - #import pdb; pdb.set_trace() - # massage the suffix. - for pat, repl in _SUFFIX_REPLACEMENTS: - suffix = pat.sub(repl, suffix) - - if not suffix: - result = prefix - else: - sep = '-' if 'dev' in suffix else '+' - result = prefix + sep + suffix - if not is_semver(result): - result = None - return result - - -def _suggest_normalized_version(s): - """Suggest a normalized version close to the given version string. - - If you have a version string that isn't rational (i.e. NormalizedVersion - doesn't like it) then you might be able to get an equivalent (or close) - rational version from this function. - - This does a number of simple normalizations to the given string, based - on observation of versions currently in use on PyPI. Given a dump of - those version during PyCon 2009, 4287 of them: - - 2312 (53.93%) match NormalizedVersion without change - with the automatic suggestion - - 3474 (81.04%) match when using this suggestion method - - @param s {str} An irrational version string. - @returns A rational version string, or None, if couldn't determine one. - """ - try: - _normalized_key(s) - return s # already rational - except UnsupportedVersionError: - pass - - rs = s.lower() - - # part of this could use maketrans - for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), - ('beta', 'b'), ('rc', 'c'), ('-final', ''), - ('-pre', 'c'), - ('-release', ''), ('.release', ''), ('-stable', ''), - ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), - ('final', '')): - rs = rs.replace(orig, repl) - - # if something ends with dev or pre, we add a 0 - rs = re.sub(r"pre$", r"pre0", rs) - rs = re.sub(r"dev$", r"dev0", rs) - - # if we have something like "b-2" or "a.2" at the end of the - # version, that is probably beta, alpha, etc - # let's remove the dash or dot - rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) - - # 1.0-dev-r371 -> 1.0.dev371 - # 0.1-dev-r79 -> 0.1.dev79 - rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) - - # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 - rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) - - # Clean: v0.3, v1.0 - if rs.startswith('v'): - rs = rs[1:] - - # Clean leading '0's on numbers. - #TODO: unintended side-effect on, e.g., "2003.05.09" - # PyPI stats: 77 (~2%) better - rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) - - # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers - # zero. - # PyPI stats: 245 (7.56%) better - rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) - - # the 'dev-rNNN' tag is a dev tag - rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) - - # clean the - when used as a pre delimiter - rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) - - # a terminal "dev" or "devel" can be changed into ".dev0" - rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) - - # a terminal "dev" can be changed into ".dev0" - rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) - - # a terminal "final" or "stable" can be removed - rs = re.sub(r"(final|stable)$", "", rs) - - # The 'r' and the '-' tags are post release tags - # 0.4a1.r10 -> 0.4a1.post10 - # 0.9.33-17222 -> 0.9.33.post17222 - # 0.9.33-r17222 -> 0.9.33.post17222 - rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) - - # Clean 'r' instead of 'dev' usage: - # 0.9.33+r17222 -> 0.9.33.dev17222 - # 1.0dev123 -> 1.0.dev123 - # 1.0.git123 -> 1.0.dev123 - # 1.0.bzr123 -> 1.0.dev123 - # 0.1a0dev.123 -> 0.1a0.dev123 - # PyPI stats: ~150 (~4%) better - rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) - - # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: - # 0.2.pre1 -> 0.2c1 - # 0.2-c1 -> 0.2c1 - # 1.0preview123 -> 1.0c123 - # PyPI stats: ~21 (0.62%) better - rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) - - # Tcl/Tk uses "px" for their post release markers - rs = re.sub(r"p(\d+)$", r".post\1", rs) - - try: - _normalized_key(rs) - except UnsupportedVersionError: - rs = None - return rs - -# -# Legacy version processing (distribute-compatible) -# - -_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) -_VERSION_REPLACE = { - 'pre': 'c', - 'preview': 'c', - '-': 'final-', - 'rc': 'c', - 'dev': '@', - '': None, - '.': None, -} - - -def _legacy_key(s): - def get_parts(s): - result = [] - for p in _VERSION_PART.split(s.lower()): - p = _VERSION_REPLACE.get(p, p) - if p: - if '0' <= p[:1] <= '9': - p = p.zfill(8) - else: - p = '*' + p - result.append(p) - result.append('*final') - return result - - result = [] - for p in get_parts(s): - if p.startswith('*'): - if p < '*final': - while result and result[-1] == '*final-': - result.pop() - while result and result[-1] == '00000000': - result.pop() - result.append(p) - return tuple(result) - - -class LegacyVersion(Version): - def parse(self, s): - return _legacy_key(s) - - @property - def is_prerelease(self): - result = False - for x in self._parts: - if (isinstance(x, string_types) and x.startswith('*') and - x < '*final'): - result = True - break - return result - - -class LegacyMatcher(Matcher): - version_class = LegacyVersion - - _operators = dict(Matcher._operators) - _operators['~='] = '_match_compatible' - - numeric_re = re.compile(r'^(\d+(\.\d+)*)') - - def _match_compatible(self, version, constraint, prefix): - if version < constraint: - return False - m = self.numeric_re.match(str(constraint)) - if not m: - logger.warning('Cannot compute compatible match for version %s ' - ' and constraint %s', version, constraint) - return True - s = m.groups()[0] - if '.' in s: - s = s.rsplit('.', 1)[0] - return _match_prefix(version, s) - -# -# Semantic versioning -# - -_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' - r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' - r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) - - -def is_semver(s): - return _SEMVER_RE.match(s) - - -def _semantic_key(s): - def make_tuple(s, absent): - if s is None: - result = (absent,) - else: - parts = s[1:].split('.') - # We can't compare ints and strings on Python 3, so fudge it - # by zero-filling numeric values so simulate a numeric comparison - result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) - return result - - m = is_semver(s) - if not m: - raise UnsupportedVersionError(s) - groups = m.groups() - major, minor, patch = [int(i) for i in groups[:3]] - # choose the '|' and '*' so that versions sort correctly - pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') - return (major, minor, patch), pre, build - - -class SemanticVersion(Version): - def parse(self, s): - return _semantic_key(s) - - @property - def is_prerelease(self): - return self._parts[1][0] != '|' - - -class SemanticMatcher(Matcher): - version_class = SemanticVersion - - -class VersionScheme(object): - def __init__(self, key, matcher, suggester=None): - self.key = key - self.matcher = matcher - self.suggester = suggester - - def is_valid_version(self, s): - try: - self.matcher.version_class(s) - result = True - except UnsupportedVersionError: - result = False - return result - - def is_valid_matcher(self, s): - try: - self.matcher(s) - result = True - except UnsupportedVersionError: - result = False - return result - - def is_valid_constraint_list(self, s): - """ - Used for processing some metadata fields - """ - return self.is_valid_matcher('dummy_name (%s)' % s) - - def suggest(self, s): - if self.suggester is None: - result = None - else: - result = self.suggester(s) - return result - -_SCHEMES = { - 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, - _suggest_normalized_version), - 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), - 'semantic': VersionScheme(_semantic_key, SemanticMatcher, - _suggest_semantic_version), -} - -_SCHEMES['default'] = _SCHEMES['normalized'] - - -def get_scheme(name): - if name not in _SCHEMES: - raise ValueError('unknown scheme name: %r' % name) - return _SCHEMES[name] diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w32.exe b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w32.exe deleted file mode 100644 index 732215a9d34ccb7b417d637a7646d9b843ecafa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89088 zcmeFae|S?>wm*FGqitH!CO`{C3REl(SahnPNDYM`O{q#T7)Xdvz$<hz5gjb&0FD$| zPs=nt#$jgk-tk`NUb*PJIy$3wMg@OiORy=5PEkZ0P^;6cyPm2=Y8#~Xyq~pC(iU~@ z_dd`2ywCg3TS)e=wSTX@_S$Q$y;FJf9>F9Cf*Bu86NCeB>CeT#|L3nblC!40kR?2m z{>H@z3`^g*ct!B1Tk<#8{Ol(+x7?n8>n(TO@iQ_1pEl;#NO$D_^p5<p8@>6r|7^p? zD>5@P3KB)%InlPUc<U{5lb_$uJ2!U@!dIxT&CTYnHuoCtzCL#`-1%8w%`JjkymkHD zpYr&>Cg9H}+(GW%^wV2|ROUbGfyXTfOART)i?<!WISJD#7!6|#8G`TvV*Xu^z32+K zc6>T0?9%;4K}Zn{6fx`yPa}*$9C+R!7zI~72c&$InY+UdMGBkF3c`HyxD3K09`bzW z?_q;rO&5ec#{?noJ4vI19bbHBt~vx^h2FH$V8i|^#EsiUg#JboP3@w-(&Uf&%NK<8 zSJZ5{MZ852W)~s>WeT(LIf&1wKNqULLI)GN_(-E-D)X~ZK=1;t<%*guHMhdg`-(mb zHzDv1KBN9zR9?--O+N$ReOXAr81V9z!X5SJ5`=3<1^<8V|AP@&sr2}Qvp;hQT24iW zOHg|EiZd1ojV;oo#(r^ba2`^8T22{~_UQ@YMZp7O1R*2@?SerFE~TuJB_wDaYC0h8 zfONF1t%{=H`W`bdYp+>YBsg9Ty9ec3iy+O3xa}TIvPK#Q&udyx1MvwG0(#iaGC|N| zJ#3?<Y4YLRkU`54s9BYRjyISA>){9$tW;Y34lPnX=&>D4X~|k7c$TwEfOzs@Yh#Nz z`FV;`(w!E`sKg@`2E}bDY>ku^4XS@tV(WO*<eu67;0Clk;vRHp!Qf<+5w0B!*Y>g? zYH=KK#%%Yu1~&m>IlB^#2^syGG|2AB1(}4aOcaC%!)}%`I7AIC2(Ro3yW`GSttng^ z_xb=ECor!L{-PNO>_ulJ3%fm=O0X!s%)$GZ?~I94l-^KEAX0n$?4wGpr7&i4#~)OB zQD%2NrWUKtZuYT1Vnu}AeF`cSgx>Rkk@}Lg{WltgT76VeA2aic`cTnpXrt2WXmJkM z9%u<Rp-*9{$HQ)>Xm?McyDyZ28Ux7mpxy?mnmvzMMr-85vkRrJLaDRx>|I7je+cM+ zj{RJ(3Vrgke;W@#D!y%U%fQLtlPKTAzWtVuOQdXpwsy6eRjt^cZ%0D4bF7$F;f!th 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ð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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w64.exe b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w64.exe deleted file mode 100644 index c41bd0a011fd760ce20ba795d9e535e0d2c39876..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99328 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 B=L-M; diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/wheel.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/wheel.py deleted file mode 100644 index b04bfae..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/wheel.py +++ /dev/null @@ -1,988 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from __future__ import unicode_literals - -import base64 -import codecs -import datetime -import distutils.util -from email import message_from_file -import hashlib -import imp -import json -import logging -import os -import posixpath -import re -import shutil -import sys -import tempfile -import zipfile - -from . import __version__, DistlibException -from .compat import sysconfig, ZipFile, fsdecode, text_type, filter -from .database import InstalledDistribution -from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME -from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, - cached_property, get_cache_base, read_exports, tempdir) -from .version import NormalizedVersion, UnsupportedVersionError - -logger = logging.getLogger(__name__) - -cache = None # created when needed - -if hasattr(sys, 'pypy_version_info'): # pragma: no cover - IMP_PREFIX = 'pp' -elif sys.platform.startswith('java'): # pragma: no cover - IMP_PREFIX = 'jy' -elif sys.platform == 'cli': # pragma: no cover - IMP_PREFIX = 'ip' -else: - IMP_PREFIX = 'cp' - -VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') -if not VER_SUFFIX: # pragma: no cover - VER_SUFFIX = '%s%s' % sys.version_info[:2] -PYVER = 'py' + VER_SUFFIX -IMPVER = IMP_PREFIX + VER_SUFFIX - -ARCH = distutils.util.get_platform().replace('-', '_').replace('.', '_') - -ABI = sysconfig.get_config_var('SOABI') -if ABI and ABI.startswith('cpython-'): - ABI = ABI.replace('cpython-', 'cp') -else: - def _derive_abi(): - parts = ['cp', VER_SUFFIX] - if sysconfig.get_config_var('Py_DEBUG'): - parts.append('d') - if sysconfig.get_config_var('WITH_PYMALLOC'): - parts.append('m') - if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4: - parts.append('u') - return ''.join(parts) - ABI = _derive_abi() - del _derive_abi - -FILENAME_RE = re.compile(r''' -(?P<nm>[^-]+) --(?P<vn>\d+[^-]*) -(-(?P<bn>\d+[^-]*))? --(?P<py>\w+\d+(\.\w+\d+)*) --(?P<bi>\w+) --(?P<ar>\w+(\.\w+)*) -\.whl$ -''', re.IGNORECASE | re.VERBOSE) - -NAME_VERSION_RE = re.compile(r''' -(?P<nm>[^-]+) --(?P<vn>\d+[^-]*) -(-(?P<bn>\d+[^-]*))?$ -''', re.IGNORECASE | re.VERBOSE) - -SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') -SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') -SHEBANG_PYTHON = b'#!python' -SHEBANG_PYTHONW = b'#!pythonw' - -if os.sep == '/': - to_posix = lambda o: o -else: - to_posix = lambda o: o.replace(os.sep, '/') - - -class Mounter(object): - def __init__(self): - self.impure_wheels = {} - self.libs = {} - - def add(self, pathname, extensions): - self.impure_wheels[pathname] = extensions - self.libs.update(extensions) - - def remove(self, pathname): - extensions = self.impure_wheels.pop(pathname) - for k, v in extensions: - if k in self.libs: - del self.libs[k] - - def find_module(self, fullname, path=None): - if fullname in self.libs: - result = self - else: - result = None - return result - - def load_module(self, fullname): - if fullname in sys.modules: - result = sys.modules[fullname] - else: - if fullname not in self.libs: - raise ImportError('unable to find extension for %s' % fullname) - result = imp.load_dynamic(fullname, self.libs[fullname]) - result.__loader__ = self - parts = fullname.rsplit('.', 1) - if len(parts) > 1: - result.__package__ = parts[0] - return result - -_hook = Mounter() - - -class Wheel(object): - """ - Class to build and install from Wheel files (PEP 427). - """ - - wheel_version = (1, 1) - hash_kind = 'sha256' - - def __init__(self, filename=None, sign=False, verify=False): - """ - Initialise an instance using a (valid) filename. - """ - self.sign = sign - self.should_verify = verify - self.buildver = '' - self.pyver = [PYVER] - self.abi = ['none'] - self.arch = ['any'] - self.dirname = os.getcwd() - if filename is None: - self.name = 'dummy' - self.version = '0.1' - self._filename = self.filename - else: - m = NAME_VERSION_RE.match(filename) - if m: - info = m.groupdict('') - self.name = info['nm'] - # Reinstate the local version separator - self.version = info['vn'].replace('_', '-') - self.buildver = info['bn'] - self._filename = self.filename - else: - dirname, filename = os.path.split(filename) - m = FILENAME_RE.match(filename) - if not m: - raise DistlibException('Invalid name or ' - 'filename: %r' % filename) - if dirname: - self.dirname = os.path.abspath(dirname) - self._filename = filename - info = m.groupdict('') - self.name = info['nm'] - self.version = info['vn'] - self.buildver = info['bn'] - self.pyver = info['py'].split('.') - self.abi = info['bi'].split('.') - self.arch = info['ar'].split('.') - - @property - def filename(self): - """ - Build and return a filename from the various components. - """ - if self.buildver: - buildver = '-' + self.buildver - else: - buildver = '' - pyver = '.'.join(self.pyver) - abi = '.'.join(self.abi) - arch = '.'.join(self.arch) - # replace - with _ as a local version separator - version = self.version.replace('-', '_') - return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, - pyver, abi, arch) - - @property - def exists(self): - path = os.path.join(self.dirname, self.filename) - return os.path.isfile(path) - - @property - def tags(self): - for pyver in self.pyver: - for abi in self.abi: - for arch in self.arch: - yield pyver, abi, arch - - @cached_property - def metadata(self): - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - wrapper = codecs.getreader('utf-8') - with ZipFile(pathname, 'r') as zf: - wheel_metadata = self.get_wheel_metadata(zf) - wv = wheel_metadata['Wheel-Version'].split('.', 1) - file_version = tuple([int(i) for i in wv]) - if file_version < (1, 1): - fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, 'METADATA'] - else: - fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] - result = None - for fn in fns: - try: - metadata_filename = posixpath.join(info_dir, fn) - with zf.open(metadata_filename) as bf: - wf = wrapper(bf) - result = Metadata(fileobj=wf) - if result: - break - except KeyError: - pass - if not result: - raise ValueError('Invalid wheel, because metadata is ' - 'missing: looked in %s' % ', '.join(fns)) - return result - - def get_wheel_metadata(self, zf): - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - metadata_filename = posixpath.join(info_dir, 'WHEEL') - with zf.open(metadata_filename) as bf: - wf = codecs.getreader('utf-8')(bf) - message = message_from_file(wf) - return dict(message) - - @cached_property - def info(self): - pathname = os.path.join(self.dirname, self.filename) - with ZipFile(pathname, 'r') as zf: - result = self.get_wheel_metadata(zf) - return result - - def process_shebang(self, data): - m = SHEBANG_RE.match(data) - if m: - end = m.end() - shebang, data_after_shebang = data[:end], data[end:] - # Preserve any arguments after the interpreter - if b'pythonw' in shebang.lower(): - shebang_python = SHEBANG_PYTHONW - else: - shebang_python = SHEBANG_PYTHON - m = SHEBANG_DETAIL_RE.match(shebang) - if m: - args = b' ' + m.groups()[-1] - else: - args = b'' - shebang = shebang_python + args - data = shebang + data_after_shebang - else: - cr = data.find(b'\r') - lf = data.find(b'\n') - if cr < 0 or cr > lf: - term = b'\n' - else: - if data[cr:cr + 2] == b'\r\n': - term = b'\r\n' - else: - term = b'\r' - data = SHEBANG_PYTHON + term + data - return data - - def get_hash(self, data, hash_kind=None): - if hash_kind is None: - hash_kind = self.hash_kind - try: - hasher = getattr(hashlib, hash_kind) - except AttributeError: - raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) - result = hasher(data).digest() - result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') - return hash_kind, result - - def write_record(self, records, record_path, base): - records = list(records) # make a copy for sorting - p = to_posix(os.path.relpath(record_path, base)) - records.append((p, '', '')) - records.sort() - with CSVWriter(record_path) as writer: - for row in records: - writer.writerow(row) - - def write_records(self, info, libdir, archive_paths): - records = [] - distinfo, info_dir = info - hasher = getattr(hashlib, self.hash_kind) - for ap, p in archive_paths: - with open(p, 'rb') as f: - data = f.read() - digest = '%s=%s' % self.get_hash(data) - size = os.path.getsize(p) - records.append((ap, digest, size)) - - p = os.path.join(distinfo, 'RECORD') - self.write_record(records, p, libdir) - ap = to_posix(os.path.join(info_dir, 'RECORD')) - archive_paths.append((ap, p)) - - def build_zip(self, pathname, archive_paths): - with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: - for ap, p in archive_paths: - logger.debug('Wrote %s to %s in wheel', p, ap) - zf.write(p, ap) - - def build(self, paths, tags=None, wheel_version=None): - """ - Build a wheel from files in specified paths, and use any specified tags - when determining the name of the wheel. - """ - if tags is None: - tags = {} - - libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] - if libkey == 'platlib': - is_pure = 'false' - default_pyver = [IMPVER] - default_abi = [ABI] - default_arch = [ARCH] - else: - is_pure = 'true' - default_pyver = [PYVER] - default_abi = ['none'] - default_arch = ['any'] - - self.pyver = tags.get('pyver', default_pyver) - self.abi = tags.get('abi', default_abi) - self.arch = tags.get('arch', default_arch) - - libdir = paths[libkey] - - name_ver = '%s-%s' % (self.name, self.version) - data_dir = '%s.data' % name_ver - info_dir = '%s.dist-info' % name_ver - - archive_paths = [] - - # First, stuff which is not in site-packages - for key in ('data', 'headers', 'scripts'): - if key not in paths: - continue - path = paths[key] - if os.path.isdir(path): - for root, dirs, files in os.walk(path): - for fn in files: - p = fsdecode(os.path.join(root, fn)) - rp = os.path.relpath(p, path) - ap = to_posix(os.path.join(data_dir, key, rp)) - archive_paths.append((ap, p)) - if key == 'scripts' and not p.endswith('.exe'): - with open(p, 'rb') as f: - data = f.read() - data = self.process_shebang(data) - with open(p, 'wb') as f: - f.write(data) - - # Now, stuff which is in site-packages, other than the - # distinfo stuff. - path = libdir - distinfo = None - for root, dirs, files in os.walk(path): - if root == path: - # At the top level only, save distinfo for later - # and skip it for now - for i, dn in enumerate(dirs): - dn = fsdecode(dn) - if dn.endswith('.dist-info'): - distinfo = os.path.join(root, dn) - del dirs[i] - break - assert distinfo, '.dist-info directory expected, not found' - - for fn in files: - # comment out next suite to leave .pyc files in - if fsdecode(fn).endswith(('.pyc', '.pyo')): - continue - p = os.path.join(root, fn) - rp = to_posix(os.path.relpath(p, path)) - archive_paths.append((rp, p)) - - # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. - files = os.listdir(distinfo) - for fn in files: - if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): - p = fsdecode(os.path.join(distinfo, fn)) - ap = to_posix(os.path.join(info_dir, fn)) - archive_paths.append((ap, p)) - - wheel_metadata = [ - 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), - 'Generator: distlib %s' % __version__, - 'Root-Is-Purelib: %s' % is_pure, - ] - for pyver, abi, arch in self.tags: - wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) - p = os.path.join(distinfo, 'WHEEL') - with open(p, 'w') as f: - f.write('\n'.join(wheel_metadata)) - ap = to_posix(os.path.join(info_dir, 'WHEEL')) - archive_paths.append((ap, p)) - - # Now, at last, RECORD. - # Paths in here are archive paths - nothing else makes sense. - self.write_records((distinfo, info_dir), libdir, archive_paths) - # Now, ready to build the zip file - pathname = os.path.join(self.dirname, self.filename) - self.build_zip(pathname, archive_paths) - return pathname - - def install(self, paths, maker, **kwargs): - """ - Install a wheel to the specified paths. If kwarg ``warner`` is - specified, it should be a callable, which will be called with two - tuples indicating the wheel version of this software and the wheel - version in the file, if there is a discrepancy in the versions. - This can be used to issue any warnings to raise any exceptions. - If kwarg ``lib_only`` is True, only the purelib/platlib files are - installed, and the headers, scripts, data and dist-info metadata are - not written. If kwarg ``bytecode_hashed_invalidation`` is True, written - bytecode will try to use file-hash based invalidation (PEP-552) on - supported interpreter versions (CPython 2.7+). - - The return value is a :class:`InstalledDistribution` instance unless - ``options.lib_only`` is True, in which case the return value is ``None``. - """ - - dry_run = maker.dry_run - warner = kwargs.get('warner') - lib_only = kwargs.get('lib_only', False) - bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', False) - - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - data_dir = '%s.data' % name_ver - info_dir = '%s.dist-info' % name_ver - - metadata_name = posixpath.join(info_dir, METADATA_FILENAME) - wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') - record_name = posixpath.join(info_dir, 'RECORD') - - wrapper = codecs.getreader('utf-8') - - with ZipFile(pathname, 'r') as zf: - with zf.open(wheel_metadata_name) as bwf: - wf = wrapper(bwf) - message = message_from_file(wf) - wv = message['Wheel-Version'].split('.', 1) - file_version = tuple([int(i) for i in wv]) - if (file_version != self.wheel_version) and warner: - warner(self.wheel_version, file_version) - - if message['Root-Is-Purelib'] == 'true': - libdir = paths['purelib'] - else: - libdir = paths['platlib'] - - records = {} - with zf.open(record_name) as bf: - with CSVReader(stream=bf) as reader: - for row in reader: - p = row[0] - records[p] = row - - data_pfx = posixpath.join(data_dir, '') - info_pfx = posixpath.join(info_dir, '') - script_pfx = posixpath.join(data_dir, 'scripts', '') - - # make a new instance rather than a copy of maker's, - # as we mutate it - fileop = FileOperator(dry_run=dry_run) - fileop.record = True # so we can rollback if needed - - bc = not sys.dont_write_bytecode # Double negatives. Lovely! - - outfiles = [] # for RECORD writing - - # for script copying/shebang processing - workdir = tempfile.mkdtemp() - # set target dir later - # we default add_launchers to False, as the - # Python Launcher should be used instead - maker.source_dir = workdir - maker.target_dir = None - try: - for zinfo in zf.infolist(): - arcname = zinfo.filename - if isinstance(arcname, text_type): - u_arcname = arcname - else: - u_arcname = arcname.decode('utf-8') - # The signature file won't be in RECORD, - # and we don't currently don't do anything with it - if u_arcname.endswith('/RECORD.jws'): - continue - row = records[u_arcname] - if row[2] and str(zinfo.file_size) != row[2]: - raise DistlibException('size mismatch for ' - '%s' % u_arcname) - if row[1]: - kind, value = row[1].split('=', 1) - with zf.open(arcname) as bf: - data = bf.read() - _, digest = self.get_hash(data, kind) - if digest != value: - raise DistlibException('digest mismatch for ' - '%s' % arcname) - - if lib_only and u_arcname.startswith((info_pfx, data_pfx)): - logger.debug('lib_only: skipping %s', u_arcname) - continue - is_script = (u_arcname.startswith(script_pfx) - and not u_arcname.endswith('.exe')) - - if u_arcname.startswith(data_pfx): - _, where, rp = u_arcname.split('/', 2) - outfile = os.path.join(paths[where], convert_path(rp)) - else: - # meant for site-packages. - if u_arcname in (wheel_metadata_name, record_name): - continue - outfile = os.path.join(libdir, convert_path(u_arcname)) - if not is_script: - with zf.open(arcname) as bf: - fileop.copy_stream(bf, outfile) - outfiles.append(outfile) - # Double check the digest of the written file - if not dry_run and row[1]: - with open(outfile, 'rb') as bf: - data = bf.read() - _, newdigest = self.get_hash(data, kind) - if newdigest != digest: - raise DistlibException('digest mismatch ' - 'on write for ' - '%s' % outfile) - if bc and outfile.endswith('.py'): - try: - pyc = fileop.byte_compile(outfile, - hashed_invalidation=bc_hashed_invalidation) - outfiles.append(pyc) - except Exception: - # Don't give up if byte-compilation fails, - # but log it and perhaps warn the user - logger.warning('Byte-compilation failed', - exc_info=True) - else: - fn = os.path.basename(convert_path(arcname)) - workname = os.path.join(workdir, fn) - with zf.open(arcname) as bf: - fileop.copy_stream(bf, workname) - - dn, fn = os.path.split(outfile) - maker.target_dir = dn - filenames = maker.make(fn) - fileop.set_executable_mode(filenames) - outfiles.extend(filenames) - - if lib_only: - logger.debug('lib_only: returning None') - dist = None - else: - # Generate scripts - - # Try to get pydist.json so we can see if there are - # any commands to generate. If this fails (e.g. because - # of a legacy wheel), log a warning but don't give up. - commands = None - file_version = self.info['Wheel-Version'] - if file_version == '1.0': - # Use legacy info - ep = posixpath.join(info_dir, 'entry_points.txt') - try: - with zf.open(ep) as bwf: - epdata = read_exports(bwf) - commands = {} - for key in ('console', 'gui'): - k = '%s_scripts' % key - if k in epdata: - commands['wrap_%s' % key] = d = {} - for v in epdata[k].values(): - s = '%s:%s' % (v.prefix, v.suffix) - if v.flags: - s += ' %s' % v.flags - d[v.name] = s - except Exception: - logger.warning('Unable to read legacy script ' - 'metadata, so cannot generate ' - 'scripts') - else: - try: - with zf.open(metadata_name) as bwf: - wf = wrapper(bwf) - commands = json.load(wf).get('extensions') - if commands: - commands = commands.get('python.commands') - except Exception: - logger.warning('Unable to read JSON metadata, so ' - 'cannot generate scripts') - if commands: - console_scripts = commands.get('wrap_console', {}) - gui_scripts = commands.get('wrap_gui', {}) - if console_scripts or gui_scripts: - script_dir = paths.get('scripts', '') - if not os.path.isdir(script_dir): - raise ValueError('Valid script path not ' - 'specified') - maker.target_dir = script_dir - for k, v in console_scripts.items(): - script = '%s = %s' % (k, v) - filenames = maker.make(script) - fileop.set_executable_mode(filenames) - - if gui_scripts: - options = {'gui': True } - for k, v in gui_scripts.items(): - script = '%s = %s' % (k, v) - filenames = maker.make(script, options) - fileop.set_executable_mode(filenames) - - p = os.path.join(libdir, info_dir) - dist = InstalledDistribution(p) - - # Write SHARED - paths = dict(paths) # don't change passed in dict - del paths['purelib'] - del paths['platlib'] - paths['lib'] = libdir - p = dist.write_shared_locations(paths, dry_run) - if p: - outfiles.append(p) - - # Write RECORD - dist.write_installed_files(outfiles, paths['prefix'], - dry_run) - return dist - except Exception: # pragma: no cover - logger.exception('installation failed.') - fileop.rollback() - raise - finally: - shutil.rmtree(workdir) - - def _get_dylib_cache(self): - global cache - if cache is None: - # Use native string to avoid issues on 2.x: see Python #20140. - base = os.path.join(get_cache_base(), str('dylib-cache'), - sys.version[:3]) - cache = Cache(base) - return cache - - def _get_extensions(self): - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - arcname = posixpath.join(info_dir, 'EXTENSIONS') - wrapper = codecs.getreader('utf-8') - result = [] - with ZipFile(pathname, 'r') as zf: - try: - with zf.open(arcname) as bf: - wf = wrapper(bf) - extensions = json.load(wf) - cache = self._get_dylib_cache() - prefix = cache.prefix_to_dir(pathname) - cache_base = os.path.join(cache.base, prefix) - if not os.path.isdir(cache_base): - os.makedirs(cache_base) - for name, relpath in extensions.items(): - dest = os.path.join(cache_base, convert_path(relpath)) - if not os.path.exists(dest): - extract = True - else: - file_time = os.stat(dest).st_mtime - file_time = datetime.datetime.fromtimestamp(file_time) - info = zf.getinfo(relpath) - wheel_time = datetime.datetime(*info.date_time) - extract = wheel_time > file_time - if extract: - zf.extract(relpath, cache_base) - result.append((name, dest)) - except KeyError: - pass - return result - - def is_compatible(self): - """ - Determine if a wheel is compatible with the running system. - """ - return is_compatible(self) - - def is_mountable(self): - """ - Determine if a wheel is asserted as mountable by its metadata. - """ - return True # for now - metadata details TBD - - def mount(self, append=False): - pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) - if not self.is_compatible(): - msg = 'Wheel %s not compatible with this Python.' % pathname - raise DistlibException(msg) - if not self.is_mountable(): - msg = 'Wheel %s is marked as not mountable.' % pathname - raise DistlibException(msg) - if pathname in sys.path: - logger.debug('%s already in path', pathname) - else: - if append: - sys.path.append(pathname) - else: - sys.path.insert(0, pathname) - extensions = self._get_extensions() - if extensions: - if _hook not in sys.meta_path: - sys.meta_path.append(_hook) - _hook.add(pathname, extensions) - - def unmount(self): - pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) - if pathname not in sys.path: - logger.debug('%s not in path', pathname) - else: - sys.path.remove(pathname) - if pathname in _hook.impure_wheels: - _hook.remove(pathname) - if not _hook.impure_wheels: - if _hook in sys.meta_path: - sys.meta_path.remove(_hook) - - def verify(self): - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - data_dir = '%s.data' % name_ver - info_dir = '%s.dist-info' % name_ver - - metadata_name = posixpath.join(info_dir, METADATA_FILENAME) - wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') - record_name = posixpath.join(info_dir, 'RECORD') - - wrapper = codecs.getreader('utf-8') - - with ZipFile(pathname, 'r') as zf: - with zf.open(wheel_metadata_name) as bwf: - wf = wrapper(bwf) - message = message_from_file(wf) - wv = message['Wheel-Version'].split('.', 1) - file_version = tuple([int(i) for i in wv]) - # TODO version verification - - records = {} - with zf.open(record_name) as bf: - with CSVReader(stream=bf) as reader: - for row in reader: - p = row[0] - records[p] = row - - for zinfo in zf.infolist(): - arcname = zinfo.filename - if isinstance(arcname, text_type): - u_arcname = arcname - else: - u_arcname = arcname.decode('utf-8') - if '..' in u_arcname: - raise DistlibException('invalid entry in ' - 'wheel: %r' % u_arcname) - - # The signature file won't be in RECORD, - # and we don't currently don't do anything with it - if u_arcname.endswith('/RECORD.jws'): - continue - row = records[u_arcname] - if row[2] and str(zinfo.file_size) != row[2]: - raise DistlibException('size mismatch for ' - '%s' % u_arcname) - if row[1]: - kind, value = row[1].split('=', 1) - with zf.open(arcname) as bf: - data = bf.read() - _, digest = self.get_hash(data, kind) - if digest != value: - raise DistlibException('digest mismatch for ' - '%s' % arcname) - - def update(self, modifier, dest_dir=None, **kwargs): - """ - Update the contents of a wheel in a generic way. The modifier should - be a callable which expects a dictionary argument: its keys are - archive-entry paths, and its values are absolute filesystem paths - where the contents the corresponding archive entries can be found. The - modifier is free to change the contents of the files pointed to, add - new entries and remove entries, before returning. This method will - extract the entire contents of the wheel to a temporary location, call - the modifier, and then use the passed (and possibly updated) - dictionary to write a new wheel. If ``dest_dir`` is specified, the new - wheel is written there -- otherwise, the original wheel is overwritten. - - The modifier should return True if it updated the wheel, else False. - This method returns the same value the modifier returns. - """ - - def get_version(path_map, info_dir): - version = path = None - key = '%s/%s' % (info_dir, METADATA_FILENAME) - if key not in path_map: - key = '%s/PKG-INFO' % info_dir - if key in path_map: - path = path_map[key] - version = Metadata(path=path).version - return version, path - - def update_version(version, path): - updated = None - try: - v = NormalizedVersion(version) - i = version.find('-') - if i < 0: - updated = '%s+1' % version - else: - parts = [int(s) for s in version[i + 1:].split('.')] - parts[-1] += 1 - updated = '%s+%s' % (version[:i], - '.'.join(str(i) for i in parts)) - except UnsupportedVersionError: - logger.debug('Cannot update non-compliant (PEP-440) ' - 'version %r', version) - if updated: - md = Metadata(path=path) - md.version = updated - legacy = not path.endswith(METADATA_FILENAME) - md.write(path=path, legacy=legacy) - logger.debug('Version updated from %r to %r', version, - updated) - - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - record_name = posixpath.join(info_dir, 'RECORD') - with tempdir() as workdir: - with ZipFile(pathname, 'r') as zf: - path_map = {} - for zinfo in zf.infolist(): - arcname = zinfo.filename - if isinstance(arcname, text_type): - u_arcname = arcname - else: - u_arcname = arcname.decode('utf-8') - if u_arcname == record_name: - continue - if '..' in u_arcname: - raise DistlibException('invalid entry in ' - 'wheel: %r' % u_arcname) - zf.extract(zinfo, workdir) - path = os.path.join(workdir, convert_path(u_arcname)) - path_map[u_arcname] = path - - # Remember the version. - original_version, _ = get_version(path_map, info_dir) - # Files extracted. Call the modifier. - modified = modifier(path_map, **kwargs) - if modified: - # Something changed - need to build a new wheel. - current_version, path = get_version(path_map, info_dir) - if current_version and (current_version == original_version): - # Add or update local version to signify changes. - update_version(current_version, path) - # Decide where the new wheel goes. - if dest_dir is None: - fd, newpath = tempfile.mkstemp(suffix='.whl', - prefix='wheel-update-', - dir=workdir) - os.close(fd) - else: - if not os.path.isdir(dest_dir): - raise DistlibException('Not a directory: %r' % dest_dir) - newpath = os.path.join(dest_dir, self.filename) - archive_paths = list(path_map.items()) - distinfo = os.path.join(workdir, info_dir) - info = distinfo, info_dir - self.write_records(info, workdir, archive_paths) - self.build_zip(newpath, archive_paths) - if dest_dir is None: - shutil.copyfile(newpath, pathname) - return modified - -def compatible_tags(): - """ - Return (pyver, abi, arch) tuples compatible with this Python. - """ - versions = [VER_SUFFIX] - major = VER_SUFFIX[0] - for minor in range(sys.version_info[1] - 1, - 1, -1): - versions.append(''.join([major, str(minor)])) - - abis = [] - for suffix, _, _ in imp.get_suffixes(): - if suffix.startswith('.abi'): - abis.append(suffix.split('.', 2)[1]) - abis.sort() - if ABI != 'none': - abis.insert(0, ABI) - abis.append('none') - result = [] - - arches = [ARCH] - if sys.platform == 'darwin': - m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) - if m: - name, major, minor, arch = m.groups() - minor = int(minor) - matches = [arch] - if arch in ('i386', 'ppc'): - matches.append('fat') - if arch in ('i386', 'ppc', 'x86_64'): - matches.append('fat3') - if arch in ('ppc64', 'x86_64'): - matches.append('fat64') - if arch in ('i386', 'x86_64'): - matches.append('intel') - if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): - matches.append('universal') - while minor >= 0: - for match in matches: - s = '%s_%s_%s_%s' % (name, major, minor, match) - if s != ARCH: # already there - arches.append(s) - minor -= 1 - - # Most specific - our Python version, ABI and arch - for abi in abis: - for arch in arches: - result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) - - # where no ABI / arch dependency, but IMP_PREFIX dependency - for i, version in enumerate(versions): - result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) - if i == 0: - result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) - - # no IMP_PREFIX, ABI or arch dependency - for i, version in enumerate(versions): - result.append((''.join(('py', version)), 'none', 'any')) - if i == 0: - result.append((''.join(('py', version[0])), 'none', 'any')) - return set(result) - - -COMPATIBLE_TAGS = compatible_tags() - -del compatible_tags - - -def is_compatible(wheel, tags=None): - if not isinstance(wheel, Wheel): - wheel = Wheel(wheel) # assume it's a filename - result = False - if tags is None: - tags = COMPATIBLE_TAGS - for ver, abi, arch in tags: - if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: - result = True - break - return result diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distro.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distro.py deleted file mode 100644 index aa4defc..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distro.py +++ /dev/null @@ -1,1197 +0,0 @@ -# Copyright 2015,2016,2017 Nir Cohen -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -The ``distro`` package (``distro`` stands for Linux Distribution) provides -information about the Linux distribution it runs on, such as a reliable -machine-readable distro ID, or version information. - -It is a renewed alternative implementation for Python's original -:py:func:`platform.linux_distribution` function, but it provides much more -functionality. An alternative implementation became necessary because Python -3.5 deprecated this function, and Python 3.7 is expected to remove it -altogether. Its predecessor function :py:func:`platform.dist` was already -deprecated since Python 2.6 and is also expected to be removed in Python 3.7. -Still, there are many cases in which access to OS distribution information -is needed. See `Python issue 1322 <https://bugs.python.org/issue1322>`_ for -more information. -""" - -import os -import re -import sys -import json -import shlex -import logging -import argparse -import subprocess - - -_UNIXCONFDIR = os.environ.get('UNIXCONFDIR', '/etc') -_OS_RELEASE_BASENAME = 'os-release' - -#: Translation table for normalizing the "ID" attribute defined in os-release -#: files, for use by the :func:`distro.id` method. -#: -#: * Key: Value as defined in the os-release file, translated to lower case, -#: with blanks translated to underscores. -#: -#: * Value: Normalized value. -NORMALIZED_OS_ID = {} - -#: Translation table for normalizing the "Distributor ID" attribute returned by -#: the lsb_release command, for use by the :func:`distro.id` method. -#: -#: * Key: Value as returned by the lsb_release command, translated to lower -#: case, with blanks translated to underscores. -#: -#: * Value: Normalized value. -NORMALIZED_LSB_ID = { - 'enterpriseenterprise': 'oracle', # Oracle Enterprise Linux - 'redhatenterpriseworkstation': 'rhel', # RHEL 6, 7 Workstation - 'redhatenterpriseserver': 'rhel', # RHEL 6, 7 Server -} - -#: Translation table for normalizing the distro ID derived from the file name -#: of distro release files, for use by the :func:`distro.id` method. -#: -#: * Key: Value as derived from the file name of a distro release file, -#: translated to lower case, with blanks translated to underscores. -#: -#: * Value: Normalized value. -NORMALIZED_DISTRO_ID = { - 'redhat': 'rhel', # RHEL 6.x, 7.x -} - -# Pattern for content of distro release file (reversed) -_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( - r'(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)') - -# Pattern for base file name of distro release file -_DISTRO_RELEASE_BASENAME_PATTERN = re.compile( - r'(\w+)[-_](release|version)$') - -# Base file names to be ignored when searching for distro release file -_DISTRO_RELEASE_IGNORE_BASENAMES = ( - 'debian_version', - 'lsb-release', - 'oem-release', - _OS_RELEASE_BASENAME, - 'system-release' -) - - -def linux_distribution(full_distribution_name=True): - """ - Return information about the current OS distribution as a tuple - ``(id_name, version, codename)`` with items as follows: - - * ``id_name``: If *full_distribution_name* is false, the result of - :func:`distro.id`. Otherwise, the result of :func:`distro.name`. - - * ``version``: The result of :func:`distro.version`. - - * ``codename``: The result of :func:`distro.codename`. - - The interface of this function is compatible with the original - :py:func:`platform.linux_distribution` function, supporting a subset of - its parameters. - - The data it returns may not exactly be the same, because it uses more data - sources than the original function, and that may lead to different data if - the OS distribution is not consistent across multiple data sources it - provides (there are indeed such distributions ...). - - Another reason for differences is the fact that the :func:`distro.id` - method normalizes the distro ID string to a reliable machine-readable value - for a number of popular OS distributions. - """ - return _distro.linux_distribution(full_distribution_name) - - -def id(): - """ - Return the distro ID of the current distribution, as a - machine-readable string. - - For a number of OS distributions, the returned distro ID value is - *reliable*, in the sense that it is documented and that it does not change - across releases of the distribution. - - This package maintains the following reliable distro ID values: - - ============== ========================================= - Distro ID Distribution - ============== ========================================= - "ubuntu" Ubuntu - "debian" Debian - "rhel" RedHat Enterprise Linux - "centos" CentOS - "fedora" Fedora - "sles" SUSE Linux Enterprise Server - "opensuse" openSUSE - "amazon" Amazon Linux - "arch" Arch Linux - "cloudlinux" CloudLinux OS - "exherbo" Exherbo Linux - "gentoo" GenToo Linux - "ibm_powerkvm" IBM PowerKVM - "kvmibm" KVM for IBM z Systems - "linuxmint" Linux Mint - "mageia" Mageia - "mandriva" Mandriva Linux - "parallels" Parallels - "pidora" Pidora - "raspbian" Raspbian - "oracle" Oracle Linux (and Oracle Enterprise Linux) - "scientific" Scientific Linux - "slackware" Slackware - "xenserver" XenServer - "openbsd" OpenBSD - "netbsd" NetBSD - "freebsd" FreeBSD - ============== ========================================= - - If you have a need to get distros for reliable IDs added into this set, - or if you find that the :func:`distro.id` function returns a different - distro ID for one of the listed distros, please create an issue in the - `distro issue tracker`_. - - **Lookup hierarchy and transformations:** - - First, the ID is obtained from the following sources, in the specified - order. The first available and non-empty value is used: - - * the value of the "ID" attribute of the os-release file, - - * the value of the "Distributor ID" attribute returned by the lsb_release - command, - - * the first part of the file name of the distro release file, - - The so determined ID value then passes the following transformations, - before it is returned by this method: - - * it is translated to lower case, - - * blanks (which should not be there anyway) are translated to underscores, - - * a normalization of the ID is performed, based upon - `normalization tables`_. The purpose of this normalization is to ensure - that the ID is as reliable as possible, even across incompatible changes - in the OS distributions. A common reason for an incompatible change is - the addition of an os-release file, or the addition of the lsb_release - command, with ID values that differ from what was previously determined - from the distro release file name. - """ - return _distro.id() - - -def name(pretty=False): - """ - Return the name of the current OS distribution, as a human-readable - string. - - If *pretty* is false, the name is returned without version or codename. - (e.g. "CentOS Linux") - - If *pretty* is true, the version and codename are appended. - (e.g. "CentOS Linux 7.1.1503 (Core)") - - **Lookup hierarchy:** - - The name is obtained from the following sources, in the specified order. - The first available and non-empty value is used: - - * If *pretty* is false: - - - the value of the "NAME" attribute of the os-release file, - - - the value of the "Distributor ID" attribute returned by the lsb_release - command, - - - the value of the "<name>" field of the distro release file. - - * If *pretty* is true: - - - the value of the "PRETTY_NAME" attribute of the os-release file, - - - the value of the "Description" attribute returned by the lsb_release - command, - - - the value of the "<name>" field of the distro release file, appended - with the value of the pretty version ("<version_id>" and "<codename>" - fields) of the distro release file, if available. - """ - return _distro.name(pretty) - - -def version(pretty=False, best=False): - """ - Return the version of the current OS distribution, as a human-readable - string. - - If *pretty* is false, the version is returned without codename (e.g. - "7.0"). - - If *pretty* is true, the codename in parenthesis is appended, if the - codename is non-empty (e.g. "7.0 (Maipo)"). - - Some distributions provide version numbers with different precisions in - the different sources of distribution information. Examining the different - sources in a fixed priority order does not always yield the most precise - version (e.g. for Debian 8.2, or CentOS 7.1). - - The *best* parameter can be used to control the approach for the returned - version: - - If *best* is false, the first non-empty version number in priority order of - the examined sources is returned. - - If *best* is true, the most precise version number out of all examined - sources is returned. - - **Lookup hierarchy:** - - In all cases, the version number is obtained from the following sources. - If *best* is false, this order represents the priority order: - - * the value of the "VERSION_ID" attribute of the os-release file, - * the value of the "Release" attribute returned by the lsb_release - command, - * the version number parsed from the "<version_id>" field of the first line - of the distro release file, - * the version number parsed from the "PRETTY_NAME" attribute of the - os-release file, if it follows the format of the distro release files. - * the version number parsed from the "Description" attribute returned by - the lsb_release command, if it follows the format of the distro release - files. - """ - return _distro.version(pretty, best) - - -def version_parts(best=False): - """ - Return the version of the current OS distribution as a tuple - ``(major, minor, build_number)`` with items as follows: - - * ``major``: The result of :func:`distro.major_version`. - - * ``minor``: The result of :func:`distro.minor_version`. - - * ``build_number``: The result of :func:`distro.build_number`. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.version_parts(best) - - -def major_version(best=False): - """ - Return the major version of the current OS distribution, as a string, - if provided. - Otherwise, the empty string is returned. The major version is the first - part of the dot-separated version string. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.major_version(best) - - -def minor_version(best=False): - """ - Return the minor version of the current OS distribution, as a string, - if provided. - Otherwise, the empty string is returned. The minor version is the second - part of the dot-separated version string. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.minor_version(best) - - -def build_number(best=False): - """ - Return the build number of the current OS distribution, as a string, - if provided. - Otherwise, the empty string is returned. The build number is the third part - of the dot-separated version string. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.build_number(best) - - -def like(): - """ - Return a space-separated list of distro IDs of distributions that are - closely related to the current OS distribution in regards to packaging - and programming interfaces, for example distributions the current - distribution is a derivative from. - - **Lookup hierarchy:** - - This information item is only provided by the os-release file. - For details, see the description of the "ID_LIKE" attribute in the - `os-release man page - <http://www.freedesktop.org/software/systemd/man/os-release.html>`_. - """ - return _distro.like() - - -def codename(): - """ - Return the codename for the release of the current OS distribution, - as a string. - - If the distribution does not have a codename, an empty string is returned. - - Note that the returned codename is not always really a codename. For - example, openSUSE returns "x86_64". This function does not handle such - cases in any special way and just returns the string it finds, if any. - - **Lookup hierarchy:** - - * the codename within the "VERSION" attribute of the os-release file, if - provided, - - * the value of the "Codename" attribute returned by the lsb_release - command, - - * the value of the "<codename>" field of the distro release file. - """ - return _distro.codename() - - -def info(pretty=False, best=False): - """ - Return certain machine-readable information items about the current OS - distribution in a dictionary, as shown in the following example: - - .. sourcecode:: python - - { - 'id': 'rhel', - 'version': '7.0', - 'version_parts': { - 'major': '7', - 'minor': '0', - 'build_number': '' - }, - 'like': 'fedora', - 'codename': 'Maipo' - } - - The dictionary structure and keys are always the same, regardless of which - information items are available in the underlying data sources. The values - for the various keys are as follows: - - * ``id``: The result of :func:`distro.id`. - - * ``version``: The result of :func:`distro.version`. - - * ``version_parts -> major``: The result of :func:`distro.major_version`. - - * ``version_parts -> minor``: The result of :func:`distro.minor_version`. - - * ``version_parts -> build_number``: The result of - :func:`distro.build_number`. - - * ``like``: The result of :func:`distro.like`. - - * ``codename``: The result of :func:`distro.codename`. - - For a description of the *pretty* and *best* parameters, see the - :func:`distro.version` method. - """ - return _distro.info(pretty, best) - - -def os_release_info(): - """ - Return a dictionary containing key-value pairs for the information items - from the os-release file data source of the current OS distribution. - - See `os-release file`_ for details about these information items. - """ - return _distro.os_release_info() - - -def lsb_release_info(): - """ - Return a dictionary containing key-value pairs for the information items - from the lsb_release command data source of the current OS distribution. - - See `lsb_release command output`_ for details about these information - items. - """ - return _distro.lsb_release_info() - - -def distro_release_info(): - """ - Return a dictionary containing key-value pairs for the information items - from the distro release file data source of the current OS distribution. - - See `distro release file`_ for details about these information items. - """ - return _distro.distro_release_info() - - -def uname_info(): - """ - Return a dictionary containing key-value pairs for the information items - from the distro release file data source of the current OS distribution. - """ - return _distro.uname_info() - - -def os_release_attr(attribute): - """ - Return a single named information item from the os-release file data source - of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - - See `os-release file`_ for details about these information items. - """ - return _distro.os_release_attr(attribute) - - -def lsb_release_attr(attribute): - """ - Return a single named information item from the lsb_release command output - data source of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - - See `lsb_release command output`_ for details about these information - items. - """ - return _distro.lsb_release_attr(attribute) - - -def distro_release_attr(attribute): - """ - Return a single named information item from the distro release file - data source of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - - See `distro release file`_ for details about these information items. - """ - return _distro.distro_release_attr(attribute) - - -def uname_attr(attribute): - """ - Return a single named information item from the distro release file - data source of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - """ - return _distro.uname_attr(attribute) - - -class cached_property(object): - """A version of @property which caches the value. On access, it calls the - underlying function and sets the value in `__dict__` so future accesses - will not re-call the property. - """ - def __init__(self, f): - self._fname = f.__name__ - self._f = f - - def __get__(self, obj, owner): - assert obj is not None, 'call {} on an instance'.format(self._fname) - ret = obj.__dict__[self._fname] = self._f(obj) - return ret - - -class LinuxDistribution(object): - """ - Provides information about a OS distribution. - - This package creates a private module-global instance of this class with - default initialization arguments, that is used by the - `consolidated accessor functions`_ and `single source accessor functions`_. - By using default initialization arguments, that module-global instance - returns data about the current OS distribution (i.e. the distro this - package runs on). - - Normally, it is not necessary to create additional instances of this class. - However, in situations where control is needed over the exact data sources - that are used, instances of this class can be created with a specific - distro release file, or a specific os-release file, or without invoking the - lsb_release command. - """ - - def __init__(self, - include_lsb=True, - os_release_file='', - distro_release_file='', - include_uname=True): - """ - The initialization method of this class gathers information from the - available data sources, and stores that in private instance attributes. - Subsequent access to the information items uses these private instance - attributes, so that the data sources are read only once. - - Parameters: - - * ``include_lsb`` (bool): Controls whether the - `lsb_release command output`_ is included as a data source. - - If the lsb_release command is not available in the program execution - path, the data source for the lsb_release command will be empty. - - * ``os_release_file`` (string): The path name of the - `os-release file`_ that is to be used as a data source. - - An empty string (the default) will cause the default path name to - be used (see `os-release file`_ for details). - - If the specified or defaulted os-release file does not exist, the - data source for the os-release file will be empty. - - * ``distro_release_file`` (string): The path name of the - `distro release file`_ that is to be used as a data source. - - An empty string (the default) will cause a default search algorithm - to be used (see `distro release file`_ for details). - - If the specified distro release file does not exist, or if no default - distro release file can be found, the data source for the distro - release file will be empty. - - * ``include_name`` (bool): Controls whether uname command output is - included as a data source. If the uname command is not available in - the program execution path the data source for the uname command will - be empty. - - Public instance attributes: - - * ``os_release_file`` (string): The path name of the - `os-release file`_ that is actually used as a data source. The - empty string if no distro release file is used as a data source. - - * ``distro_release_file`` (string): The path name of the - `distro release file`_ that is actually used as a data source. The - empty string if no distro release file is used as a data source. - - * ``include_lsb`` (bool): The result of the ``include_lsb`` parameter. - This controls whether the lsb information will be loaded. - - * ``include_uname`` (bool): The result of the ``include_uname`` - parameter. This controls whether the uname information will - be loaded. - - Raises: - - * :py:exc:`IOError`: Some I/O issue with an os-release file or distro - release file. - - * :py:exc:`subprocess.CalledProcessError`: The lsb_release command had - some issue (other than not being available in the program execution - path). - - * :py:exc:`UnicodeError`: A data source has unexpected characters or - uses an unexpected encoding. - """ - self.os_release_file = os_release_file or \ - os.path.join(_UNIXCONFDIR, _OS_RELEASE_BASENAME) - self.distro_release_file = distro_release_file or '' # updated later - self.include_lsb = include_lsb - self.include_uname = include_uname - - def __repr__(self): - """Return repr of all info - """ - return \ - "LinuxDistribution(" \ - "os_release_file={self.os_release_file!r}, " \ - "distro_release_file={self.distro_release_file!r}, " \ - "include_lsb={self.include_lsb!r}, " \ - "include_uname={self.include_uname!r}, " \ - "_os_release_info={self._os_release_info!r}, " \ - "_lsb_release_info={self._lsb_release_info!r}, " \ - "_distro_release_info={self._distro_release_info!r}, " \ - "_uname_info={self._uname_info!r})".format( - self=self) - - def linux_distribution(self, full_distribution_name=True): - """ - Return information about the OS distribution that is compatible - with Python's :func:`platform.linux_distribution`, supporting a subset - of its parameters. - - For details, see :func:`distro.linux_distribution`. - """ - return ( - self.name() if full_distribution_name else self.id(), - self.version(), - self.codename() - ) - - def id(self): - """Return the distro ID of the OS distribution, as a string. - - For details, see :func:`distro.id`. - """ - def normalize(distro_id, table): - distro_id = distro_id.lower().replace(' ', '_') - return table.get(distro_id, distro_id) - - distro_id = self.os_release_attr('id') - if distro_id: - return normalize(distro_id, NORMALIZED_OS_ID) - - distro_id = self.lsb_release_attr('distributor_id') - if distro_id: - return normalize(distro_id, NORMALIZED_LSB_ID) - - distro_id = self.distro_release_attr('id') - if distro_id: - return normalize(distro_id, NORMALIZED_DISTRO_ID) - - distro_id = self.uname_attr('id') - if distro_id: - return normalize(distro_id, NORMALIZED_DISTRO_ID) - - return '' - - def name(self, pretty=False): - """ - Return the name of the OS distribution, as a string. - - For details, see :func:`distro.name`. - """ - name = self.os_release_attr('name') \ - or self.lsb_release_attr('distributor_id') \ - or self.distro_release_attr('name') \ - or self.uname_attr('name') - if pretty: - name = self.os_release_attr('pretty_name') \ - or self.lsb_release_attr('description') - if not name: - name = self.distro_release_attr('name') \ - or self.uname_attr('name') - version = self.version(pretty=True) - if version: - name = name + ' ' + version - return name or '' - - def version(self, pretty=False, best=False): - """ - Return the version of the OS distribution, as a string. - - For details, see :func:`distro.version`. - """ - versions = [ - self.os_release_attr('version_id'), - self.lsb_release_attr('release'), - self.distro_release_attr('version_id'), - self._parse_distro_release_content( - self.os_release_attr('pretty_name')).get('version_id', ''), - self._parse_distro_release_content( - self.lsb_release_attr('description')).get('version_id', ''), - self.uname_attr('release') - ] - version = '' - if best: - # This algorithm uses the last version in priority order that has - # the best precision. If the versions are not in conflict, that - # does not matter; otherwise, using the last one instead of the - # first one might be considered a surprise. - for v in versions: - if v.count(".") > version.count(".") or version == '': - version = v - else: - for v in versions: - if v != '': - version = v - break - if pretty and version and self.codename(): - version = u'{0} ({1})'.format(version, self.codename()) - return version - - def version_parts(self, best=False): - """ - Return the version of the OS distribution, as a tuple of version - numbers. - - For details, see :func:`distro.version_parts`. - """ - version_str = self.version(best=best) - if version_str: - version_regex = re.compile(r'(\d+)\.?(\d+)?\.?(\d+)?') - matches = version_regex.match(version_str) - if matches: - major, minor, build_number = matches.groups() - return major, minor or '', build_number or '' - return '', '', '' - - def major_version(self, best=False): - """ - Return the major version number of the current distribution. - - For details, see :func:`distro.major_version`. - """ - return self.version_parts(best)[0] - - def minor_version(self, best=False): - """ - Return the minor version number of the current distribution. - - For details, see :func:`distro.minor_version`. - """ - return self.version_parts(best)[1] - - def build_number(self, best=False): - """ - Return the build number of the current distribution. - - For details, see :func:`distro.build_number`. - """ - return self.version_parts(best)[2] - - def like(self): - """ - Return the IDs of distributions that are like the OS distribution. - - For details, see :func:`distro.like`. - """ - return self.os_release_attr('id_like') or '' - - def codename(self): - """ - Return the codename of the OS distribution. - - For details, see :func:`distro.codename`. - """ - return self.os_release_attr('codename') \ - or self.lsb_release_attr('codename') \ - or self.distro_release_attr('codename') \ - or '' - - def info(self, pretty=False, best=False): - """ - Return certain machine-readable information about the OS - distribution. - - For details, see :func:`distro.info`. - """ - return dict( - id=self.id(), - version=self.version(pretty, best), - version_parts=dict( - major=self.major_version(best), - minor=self.minor_version(best), - build_number=self.build_number(best) - ), - like=self.like(), - codename=self.codename(), - ) - - def os_release_info(self): - """ - Return a dictionary containing key-value pairs for the information - items from the os-release file data source of the OS distribution. - - For details, see :func:`distro.os_release_info`. - """ - return self._os_release_info - - def lsb_release_info(self): - """ - Return a dictionary containing key-value pairs for the information - items from the lsb_release command data source of the OS - distribution. - - For details, see :func:`distro.lsb_release_info`. - """ - return self._lsb_release_info - - def distro_release_info(self): - """ - Return a dictionary containing key-value pairs for the information - items from the distro release file data source of the OS - distribution. - - For details, see :func:`distro.distro_release_info`. - """ - return self._distro_release_info - - def uname_info(self): - """ - Return a dictionary containing key-value pairs for the information - items from the uname command data source of the OS distribution. - - For details, see :func:`distro.uname_info`. - """ - - def os_release_attr(self, attribute): - """ - Return a single named information item from the os-release file data - source of the OS distribution. - - For details, see :func:`distro.os_release_attr`. - """ - return self._os_release_info.get(attribute, '') - - def lsb_release_attr(self, attribute): - """ - Return a single named information item from the lsb_release command - output data source of the OS distribution. - - For details, see :func:`distro.lsb_release_attr`. - """ - return self._lsb_release_info.get(attribute, '') - - def distro_release_attr(self, attribute): - """ - Return a single named information item from the distro release file - data source of the OS distribution. - - For details, see :func:`distro.distro_release_attr`. - """ - return self._distro_release_info.get(attribute, '') - - def uname_attr(self, attribute): - """ - Return a single named information item from the uname command - output data source of the OS distribution. - - For details, see :func:`distro.uname_release_attr`. - """ - return self._uname_info.get(attribute, '') - - @cached_property - def _os_release_info(self): - """ - Get the information items from the specified os-release file. - - Returns: - A dictionary containing all information items. - """ - if os.path.isfile(self.os_release_file): - with open(self.os_release_file) as release_file: - return self._parse_os_release_content(release_file) - return {} - - @staticmethod - def _parse_os_release_content(lines): - """ - Parse the lines of an os-release file. - - Parameters: - - * lines: Iterable through the lines in the os-release file. - Each line must be a unicode string or a UTF-8 encoded byte - string. - - Returns: - A dictionary containing all information items. - """ - props = {} - lexer = shlex.shlex(lines, posix=True) - lexer.whitespace_split = True - - # The shlex module defines its `wordchars` variable using literals, - # making it dependent on the encoding of the Python source file. - # In Python 2.6 and 2.7, the shlex source file is encoded in - # 'iso-8859-1', and the `wordchars` variable is defined as a byte - # string. This causes a UnicodeDecodeError to be raised when the - # parsed content is a unicode object. The following fix resolves that - # (... but it should be fixed in shlex...): - if sys.version_info[0] == 2 and isinstance(lexer.wordchars, bytes): - lexer.wordchars = lexer.wordchars.decode('iso-8859-1') - - tokens = list(lexer) - for token in tokens: - # At this point, all shell-like parsing has been done (i.e. - # comments processed, quotes and backslash escape sequences - # processed, multi-line values assembled, trailing newlines - # stripped, etc.), so the tokens are now either: - # * variable assignments: var=value - # * commands or their arguments (not allowed in os-release) - if '=' in token: - k, v = token.split('=', 1) - if isinstance(v, bytes): - v = v.decode('utf-8') - props[k.lower()] = v - if k == 'VERSION': - # this handles cases in which the codename is in - # the `(CODENAME)` (rhel, centos, fedora) format - # or in the `, CODENAME` format (Ubuntu). - codename = re.search(r'(\(\D+\))|,(\s+)?\D+', v) - if codename: - codename = codename.group() - codename = codename.strip('()') - codename = codename.strip(',') - codename = codename.strip() - # codename appears within paranthese. - props['codename'] = codename - else: - props['codename'] = '' - else: - # Ignore any tokens that are not variable assignments - pass - return props - - @cached_property - def _lsb_release_info(self): - """ - Get the information items from the lsb_release command output. - - Returns: - A dictionary containing all information items. - """ - if not self.include_lsb: - return {} - with open(os.devnull, 'w') as devnull: - try: - cmd = ('lsb_release', '-a') - stdout = subprocess.check_output(cmd, stderr=devnull) - except OSError: # Command not found - return {} - content = stdout.decode(sys.getfilesystemencoding()).splitlines() - return self._parse_lsb_release_content(content) - - @staticmethod - def _parse_lsb_release_content(lines): - """ - Parse the output of the lsb_release command. - - Parameters: - - * lines: Iterable through the lines of the lsb_release output. - Each line must be a unicode string or a UTF-8 encoded byte - string. - - Returns: - A dictionary containing all information items. - """ - props = {} - for line in lines: - kv = line.strip('\n').split(':', 1) - if len(kv) != 2: - # Ignore lines without colon. - continue - k, v = kv - props.update({k.replace(' ', '_').lower(): v.strip()}) - return props - - @cached_property - def _uname_info(self): - with open(os.devnull, 'w') as devnull: - try: - cmd = ('uname', '-rs') - stdout = subprocess.check_output(cmd, stderr=devnull) - except OSError: - return {} - content = stdout.decode(sys.getfilesystemencoding()).splitlines() - return self._parse_uname_content(content) - - @staticmethod - def _parse_uname_content(lines): - props = {} - match = re.search(r'^([^\s]+)\s+([\d\.]+)', lines[0].strip()) - if match: - name, version = match.groups() - - # This is to prevent the Linux kernel version from - # appearing as the 'best' version on otherwise - # identifiable distributions. - if name == 'Linux': - return {} - props['id'] = name.lower() - props['name'] = name - props['release'] = version - return props - - @cached_property - def _distro_release_info(self): - """ - Get the information items from the specified distro release file. - - Returns: - A dictionary containing all information items. - """ - if self.distro_release_file: - # If it was specified, we use it and parse what we can, even if - # its file name or content does not match the expected pattern. - distro_info = self._parse_distro_release_file( - self.distro_release_file) - basename = os.path.basename(self.distro_release_file) - # The file name pattern for user-specified distro release files - # is somewhat more tolerant (compared to when searching for the - # file), because we want to use what was specified as best as - # possible. - match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) - if match: - distro_info['id'] = match.group(1) - return distro_info - else: - try: - basenames = os.listdir(_UNIXCONFDIR) - # We sort for repeatability in cases where there are multiple - # distro specific files; e.g. CentOS, Oracle, Enterprise all - # containing `redhat-release` on top of their own. - basenames.sort() - except OSError: - # This may occur when /etc is not readable but we can't be - # sure about the *-release files. Check common entries of - # /etc for information. If they turn out to not be there the - # error is handled in `_parse_distro_release_file()`. - basenames = ['SuSE-release', - 'arch-release', - 'base-release', - 'centos-release', - 'fedora-release', - 'gentoo-release', - 'mageia-release', - 'mandrake-release', - 'mandriva-release', - 'mandrivalinux-release', - 'manjaro-release', - 'oracle-release', - 'redhat-release', - 'sl-release', - 'slackware-version'] - for basename in basenames: - if basename in _DISTRO_RELEASE_IGNORE_BASENAMES: - continue - match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) - if match: - filepath = os.path.join(_UNIXCONFDIR, basename) - distro_info = self._parse_distro_release_file(filepath) - if 'name' in distro_info: - # The name is always present if the pattern matches - self.distro_release_file = filepath - distro_info['id'] = match.group(1) - return distro_info - return {} - - def _parse_distro_release_file(self, filepath): - """ - Parse a distro release file. - - Parameters: - - * filepath: Path name of the distro release file. - - Returns: - A dictionary containing all information items. - """ - try: - with open(filepath) as fp: - # Only parse the first line. For instance, on SLES there - # are multiple lines. We don't want them... - return self._parse_distro_release_content(fp.readline()) - except (OSError, IOError): - # Ignore not being able to read a specific, seemingly version - # related file. - # See https://github.com/nir0s/distro/issues/162 - return {} - - @staticmethod - def _parse_distro_release_content(line): - """ - Parse a line from a distro release file. - - Parameters: - * line: Line from the distro release file. Must be a unicode string - or a UTF-8 encoded byte string. - - Returns: - A dictionary containing all information items. - """ - if isinstance(line, bytes): - line = line.decode('utf-8') - matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match( - line.strip()[::-1]) - distro_info = {} - if matches: - # regexp ensures non-None - distro_info['name'] = matches.group(3)[::-1] - if matches.group(2): - distro_info['version_id'] = matches.group(2)[::-1] - if matches.group(1): - distro_info['codename'] = matches.group(1)[::-1] - elif line: - distro_info['name'] = line.strip() - return distro_info - - -_distro = LinuxDistribution() - - -def main(): - logger = logging.getLogger(__name__) - logger.setLevel(logging.DEBUG) - logger.addHandler(logging.StreamHandler(sys.stdout)) - - parser = argparse.ArgumentParser(description="OS distro info tool") - parser.add_argument( - '--json', - '-j', - help="Output in machine readable format", - action="store_true") - args = parser.parse_args() - - if args.json: - logger.info(json.dumps(info(), indent=4, sort_keys=True)) - else: - logger.info('Name: %s', name(pretty=True)) - distribution_version = version(pretty=True) - logger.info('Version: %s', distribution_version) - distribution_codename = codename() - logger.info('Codename: %s', distribution_codename) - - -if __name__ == '__main__': - main() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__init__.py deleted file mode 100644 index 0491234..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -""" -HTML parsing library based on the `WHATWG HTML specification -<https://whatwg.org/html>`_. The parser is designed to be compatible with -existing HTML found in the wild and implements well-defined error recovery that -is largely compatible with modern desktop web browsers. - -Example usage:: - - from pip._vendor import html5lib - with open("my_document.html", "rb") as f: - tree = html5lib.parse(f) - -For convenience, this module re-exports the following names: - -* :func:`~.html5parser.parse` -* :func:`~.html5parser.parseFragment` -* :class:`~.html5parser.HTMLParser` -* :func:`~.treebuilders.getTreeBuilder` -* :func:`~.treewalkers.getTreeWalker` -* :func:`~.serializer.serialize` -""" - -from __future__ import absolute_import, division, unicode_literals - -from .html5parser import HTMLParser, parse, parseFragment -from .treebuilders import getTreeBuilder -from .treewalkers import getTreeWalker -from .serializer import serialize - -__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder", - "getTreeWalker", "serialize"] - -# this has to be at the top level, see how setup.py parses this -#: Distribution version number. -__version__ = "1.0.1" diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index fc82c5eea916ba8bd30688c39ef533cdf3da1c0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1335 zcmaJ>&2HO95T^cRO0pfm=y~B&R77NrAV4alK~kV@4sB7iE)4L{)rz|$7v3LYcWGHU z^a1)N1^OU;23~v0EA*1iE?w7lfl|<LXE>bin?L@vSi})re|%j2{Od4^{`AWIYYfU8 z_}dBujk1XLXkYYXKkLguHju+?*o)|Z4#h~0v$33H6FJSM!8Q^HGS1>~9*dcrXY+8L zh=n}N4&gkd2Q;QLI;V?roE_1_?3f<?7%h*<@BJu>-(7tB4XTN;T$M=hts!QQw!|`u zv_h_8Xmk1Q?ZxHSD0teM<-FiIaa^nTRpnf5*J-+|h})HkHf35lDPC`If-c})AD9`$ zEuzfwQbAOw(UzfH%Nk;A1w%XTs+iqy>pX>kQs_oe#5?>Q7Zee%%UUqWl(T5Zgji8l za37HwqYW}F*VhclJKz!nq9CSZV*eNlNllqip3s%kHH6xtt<gK+X_Gkq>V|k2)L2ro z^*W9bT!qmR)x1vdHB%J8fQmK_`CMN>(SnoD1L>Nnr>Am{sm>eEHSs>D&(Nvao-Prw zs8|PYAJ!Sh&=+@6l2EOu#WIf10VCH6&^S{$dj?5CM!>uQYKE=YjmNj4KZO=T?|khP zk<0?+Ptm$)RKDK)63}0CUFgDZ{`cv*A*E*>ymCRTeH_I1=ljsr2a$X#+Xg!2t5`C3 z0s5Dn{vW>`5m)!zE`$2O3wptc;P079?v9)I1FT219JEJdYqe+`!(AKNDdpGP!a%mi zjp8}<7Ypu~A;Ny>b?<~Z?|8SPP>*&IZvSMw?6rpvd4pwfYw0M0;oy#r@mp&qUQE3> z@WSu8nSppeI!iuF&c0hdX(!mv0>*8OanZQOFpLdsUStMdzy~49W?_&5AM+@1Hosrm z0F%wU>9&divyK1d74SVO5du(W7-kl>TPuuzi_8;`>BV0+X{9AgO~o8j+N9@#*Yyu+ z;csSD!YHLMe%C3CcUtdVrPcG~Won_WtD59jupKsql~|p94w*h*)q8lHu(I^V^mb3e s$G|U0iZNH*VVu<acKWIt<k!A8_5{T6lau~QZ|;BnX|EskKMqHK16gFE1ONa4 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-38.pyc deleted file mode 100644 index 4d1993d91c397a290d7158af2ff5904ee4cde595..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13807 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-38.pyc deleted file mode 100644 index 302b8c7778b97f95f8595de273e8c4e3eab4c5b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21959 zcmcJ13y>VgdEU(I?DO^>I2?cj36e_?Ag~nf0D=@nQV;|IAWYKK5h0EuxFoe&Y|kC` zZg2OlXAY0mLXrvErAo;T<tVaBQKEz5N)?=xm2y&+N=bB%Vk>rDcG-@sjH_bVt~@9w zr3Y1s3Kiq>eSgpF>kdrpa&~Kad%Ao2^*{Q5&AvE1oU`!x&5h!R4}RRT{**VppZjrh z0+)ZUV_C{lcHLUCOZJjea+VUMgv~Oi?k*)u$)!{&CHIMXdMQ)NEM-esxp(WiQV#9h z`cP>IzsY)jX}C0ux|B-SN0vrQqf29@v88RLZA;^&aVgKBe0yoT<g@jOr5&Xm(pRp& zb7@y;mu<Di(9;m^CQFmH^^(<?bS-c9Vov`P+v3;TRhoR+YB=XD?=F>B!*5vL*lFv! zecdkIjgk>5*%p=TLCL6;j7KH+cx*MMw#_@&?UPpNUNv62&)cz3c+=L;diSaAyDc@b z=-}=_@4mJB)x-^3rFic@6zqN7_J-CTKr2^m|7mBp<?T~DuG_ot#4hWGUE1HsnR@2E z2h~osOHHcX>MnJ++N17K_p19;LEW$Rst43QwO>7`4yc2ws2)=9Qis%(npTI^5%sV- zsvc2~s&~&9u%-j-Q9Xtp57w+w@h2?x9`*PemU`TK=z5~`F7<?Z@(rtW2<7ip$54Ju z%BOJuK6M=T$Gs`Eo5ub7)d}36@DAht2<|_iPU8Ngw0{`)r_^cOpO*Wh>M3;w{XU}H zb5`*u-Xi7{6X9s(g5RvK241<gwA|D|m{GM$HNVzugk!6XTD7UXa=jLKx>EOxPM8h6 zD?vH9y6lBR7ix`)zA87U8M+t*%jIgl<~4#awW{m&+J%{-9p*247rX}gsWs;Pw``8; zhKZ-1KNF7n%ay8k>S9G#su;iz^A*2Zt3BrhayKG(FD@^8x?1r)bhWMgg121JzW3CX zs<#|qjwno(SA!bnW`~(`fyN-uJdb?(<ki6QpLxE@0pkzI!b;*gh0EWGWZr69uZ>)@ z+x8lW<A(idX9b&c(+-m|HZm!hx_8qFo#`W?i;Y;iY3aN0?5+0Ui_InPu)gR8UZbfG zpQ+cDmtQzM#~(d4UqRg^uW{)x_TljI)!<^Y@yPV!hkbN0g>^4h<~{%La&39);U}h# zOg}QUd==Hx-uyfZ50~+%LZ=slrTV+sL%G&iUJd*}dzGc><*Q-tSiR;4)#lRj@m*Yw zizH<^mfnNRUuM;MJ08?Kn6N`xqe<@OExVn>)fwpj(-^yZ$9S92J1*(5)z2gUianJX z8kxH9<5S=G;`hGt=G6DT^5yTXfBk#w>)-$4`qy!-fB(z){W5;n@w>jh{)4}<{&igI zKR`XM^&g-f*ZL1ok8AyhsK>SbL)7D1{~_vet^W}9xYplBJ+Ae)QIBi=ZPephe;f6< z)_;V0T<fpBwSmtq`?c2S-d9&oKYrxM6n@T}IkUHRd&9PB8%%C*ILslry^&xJ$?Xl7 zIV86?lFT8wy^&%L$?c6ab4YG)WSB#8dn3ynlG__O=8)Xp7-9~|?TtKhNN#ToGl%5% z#t3srZf}e-hvfFg7;|G*Yy6e$)No<y@RL&~UVUZiBOjgm*lSg6b>D}Sa{`zDG!oA$ z*~%(8$}T08qY_{$F4$)hzeyew_)V#d%HlVza%u>_8N=2~Supca+~?F7n9#Ox<mBqy zoTohn(gk9-zG?13#f7=1E*Nz83&F)oP*BZ6qZt$~RxWvk3-TD7HRn+4)pVhGxsl5i z@R_|B*B5Gj0bH%_ErBO_s!;I@l>*6zPgO6jHWvLtv%%+4<*zOYOOe5(qlIRz!6B9^ zjjNmr@_ylRtzIu&@CtstdAZ=%8da}Q3pmj82OAGPbhIc>R=HpChk0JYb;vo|cH1fo z?<w2LR?fVGdq-K=k;II?4=uE?$wZhk8xW?<dc(|e6a0gG&k0@MtIz4ZY|T!)q#9<* zU>3EYTt0zvKZV4yQ~0)a_3!p{+^&z56KGCmBGWyFjIzNXtpzYhq?qt-i|6EN>$S0K zPTLNgHcs95Sl8^8NiGa6P|N$a4OWT;aV?sXOEIAzV16HxFj4m!DA+G~EGtY3KnB<1 z2421X6dL&=``E5MX^-IB+CH!rw(Hw=uA#GzS=?}TYt{{G(e}pz`*qCk8c_IJ0xPf< z679rpNE~fv(b8wyPH)-c7S;(w$C?sYW1?*U<`Q7~06H!v!;!Lqkf-F_2}eHQ`<^DG zp3=Ih^+7c2F23l>x^)qyVX8Sd=X*hD*EX%)_q@gD(8eD@V%cL@y=#x-o7=p8w(VO# zQLcaefT2HzJ;2Iu05(`P*1y{d63Aigiw;)KGQiK2DcKWK-hFD#HO~vex;^j})Ga1u zo#9X!1RasJKwS199F^iTy18WFS9A;tBrov1-n0Yk<Hha{q_FY{d*_DZ<eW_yz_xvu zOvEEL3not>69AW$^M>HDksXEP`W}k6?HottLn0&Ouh{_*=z1g}$UKX-0qdPk%QAZ) z1b8gB9v;BgeuSAmR&Q1zVI4;%KGs3w2{0wu&YQNun0`vvhtT_nISglQ*{yrtagaXr z;Kp>&gJe!5FhB;n0}a-I=r?Se<*u@m7KCV!K*Bm^1xb>;lsm_)wiA;<%5bAc(V4-4 zR0YCYLv_I)5xjl`O+r^yg318I^~0#C;EKpSZ|8yTAosflSJuU@zGY?bEIFRQ{CAKc zmCu86xjbU~HCJ-L@oUMp8*mv|45<EB+MtHTMD*+W$AbiT1ZvwZ+NQu0>~;#vPELY@ z=z80^mTtT4WIMgf5(aKH_I6va&fJ;0wk!O@Z6`oIDLf_5k&nt2JMA>N47gEpWl!7D z-;{RN8aDa{XcgL2VlCB9kZOy)6!$h3Xcg1l4K_Sx3Z?ozOt_t)%Y&?#F&M<HFO6t# zsUnA)VONg6R2sS<XX-Nz<y|S|&CT<|n&LZ8od(3vkfb`>d;#<}2)?7}{UR>^K_r$< zewD*_C%~9<$iK#%JiwVjNybSzyl>sR6==I0Vx~C66RiPxx?B!(<?>Qft=5^(m&+@w zm3mZ@E|*oaS}to2t>4Au2opg^5{hhw<_vpgEd(V3?)|8E0+&CABxAd&Ofr+sWbsX8 z(wen>e1f#Y>nCyfKaT|b!3u03lj9$hd}6^}NM3jJH18HtrcO@-$WG(IAl(K%q4rtU zu4NQ}8)UCLsLRRIk_RfhZX~O=O@;+DPUuTPP5~Kq;{J6z7;0N{VCX*w)Clt3yfEkV z%o($Ma>BmZlV4C15-!I*5H2^~)r2&dywQfBOl8Zl0*9LnDB8bV3oe3nQy~cLD?R(! z(G@<8Dv>?N{c=|8fv0Cb_}nwpVT`D^6~}8ma;nmxjED2EP-zt6Q6Y2%7Ymg_q>mOv z6*?rX_Uqzsn1jCB@Pi73F`ed=@=wpso_)ddmzxb7!{iBJMn|_{x}wwtD3qZyw;ZM~ zR{Tm3XtPh;k}x|9?N*NMa3?4IqS1nT<{s`~`AJcKdy1jgru^oru6ki=@p47a`=xBn zj~)-R@oF}ma-#!VbDdjvFA^(}ck;KLME=hmmq*_?jy)IT<Ju^9^z&#@WwYK-0yigc z`O8T9C3Q&Y3FSiiPAbUh_=T*lGWboatjggxqlQ!-zgab`M(~@1kppIxH*A=K#?^L| z<kf`Qf!|>mKVS$!%?OPlC>d3wU{3ewXEE%pKRBzKmukwRyd4A0h_XiVjy3*5&=l#L z8!+2k^cuC6r>A2v9zu1s4#B(-R2I=ywW7Vg$GiAZX{Z8N8pfnXppjp$SE{%XX&gd2 zL@=)!6v(-zd~anHu;AqI7!KWLVL6^|6{e7-hE&vR4X+TuG_i<&qB+$p2y%Vr4GD=` zehQagLJ~j%_D2*>j<VCZH-OxD-Bt<6Q2W3HaQ2`ygIrQXes`YjQbAfJ(JD1ZMF6#H zSxQ*Q=a3(|0SlQT=THCfItck0i1xJ#qy#L0n#%z4L^Gu#G*ENU;O3#iD={X%RxC^% zFU&Oc68dXFL5g5B2l1?6TFVBqGpb{&J~XSVh1e$1Gn8oz5H+Y9c_3F$1NL*Zx;NFl zuz<ZkR1gVAipa4Erb?t$^>jq#ttom~rQU@vj6Qe-R-wYuDzrBY5kD&08W@7ARVz4^ zI@9IO#LJv66rPzY_{(0kHdpi1A@fXJ+tKK-I(4Yif%fJrTGc(EACyIEfG3~-ASYeN zIJ%%bpr)=+!Y>^3SF2!8&^3WM1<bS3>BTd;XVIWE_i<*Grv^<1q7#XBbSt?U%uPKW zroq1goXf?$<{=bL`m4*d$@%4av*DHfRp=7)TxPff7><gL?M&E}Z$#|v)!3qDN?$y6 z?$L0I!lR{3!@K+((A*D4>dofj>he>Ooi5C?kIr4L2{F#F?J!5FEy^dsQ@tP(;Wagt z!IOYz@h{@?$B|g0sYFI30UW8$2$)#wKH}(R2D`Op%2SN=b_$n2jYOyn$0#TTay?Q= zdPqTYNFi|{O;T$ury}J#j5O=Ceh80;Sy4I90rkTn$r^bFMn5WTutzRy@6ycblG&r7 z=<Zar?uX+Y`Mm=J{TTWj+<;e6_UpJJ6^?2+zKN8RO0@ReVezu7eOxAi9(c*hX^De~ z08Jd?!x-h;Mh3DbloJT<5XNshtxMp)YE@XA5M05~V4;VwduZ+*h&Ouh|B-m*5Cu9s zjT!1~NNySh-=M}`mJTQ|<e0yU%jX$wrE_-5$vCb1@31jlH0;|Q9{D`EWp`$g0e_{= z?yO;tfCcuAgvkHU;&)O0hicO)ha@iC`Gjz1*!{1i8hKa>lFHo$dne?6$m?_1)nalc zv~$LoAtoBJXe13HC9BQV2F?nM9VYc0*pa?~JS6k|_|e2wX;?}%1eZ$r*pS29(hyF$ zfVs0xzcdn80ncz24eS_XvAF&_=v9POT6abu9#F1^U|_d|^KV5}@uPjR;3nk4p~Ef2 z5%j8ajYx%U+yy;Pw!vvV`GOa$>V{u9SjUtP6>w%2$s@^ft6)*EwH4xl$P!s@4wh+S z26A+b8$$g!wg9>8DomiOf%S@N^JiQs*`@^@;*LBc9&^*;Iy{2}O5EV$7L$4s3w3T- z{$!94YY1&tJfo>4#*2objx<$tTFn9#9@q=9%9z0#g6b}i=L3X`RoDb^W?ZV&>Xi$1 zZyHZ>$2zA1&jC0<3YRZ>4aq>#fj(Qk=&9*WBePdY*(OaTKg?3+Jw>yn9>Tp~RIE{R zGeegX8{EJp)O;V8;Xuheki>N;O~Qn7_Z<k0{mk^y7<ZqS(Aam80a93t89l=N<i5dl z09~0VLk=wbml90U@MTF;XpvsaP`1JTS_@fyo@v_w)xrFU)>+6#j{gw_cmz2b8I-%| z>R*PE<ESL<b5wxnyYoM%((Qx`rnqS9&!`O2Uv9Xz)!1oTvM=P|zod>WqviG2G0S{p z)Ns~@DfHfe!UcXX48b?bbIxXL<Q$a;?1yLcYgn<+{uy&>lLNdp%*6V(1v~m5T2{*$ z&gnT6-Li*giz9GWDQ~W_TE`&`i1CmyXircIrw|q)Kr}FZg%zT$R+)pO2`gz+D@_Af zm^L!47uyb{o5xX8N|JkA8U%YCRU5ecBS<U&J>^UQ?D#tQ1i?=<aKSC|b^&*JqC^6B z{B`cgK{^=NhaBV}9R|#K2hfBAT95#0x^W|8F^Fp|sZeHHE8}t`J2SVo)f$%|eyS<D z8kb?I2#P5%(Mn_9GkY)|H7G}#1T2VQnmo2ruj`LsG%<C=gupEc?egGud<ez+AwU>5 z0`o)bp?AQ2@ke&0r@qDVwBaR`@T<sBp${U{85a5_;3zcXl@ZvG6KjbZ#9FcY+<?U? zNWzYT(*@@Xu-@2zv_@%quoNdxD#$FRU}*x4tmSARfF9spb5=%RO-h1)t>HHX%wKCK zK_S>?m4<D~!F|sYE6_y@wZ(m)gsz6n%$c{y8FheURyUE>HvS0ra<Jv~B@~1i?lZl= zTJttJubZpOVG_Ew4n#&Rjn@2gv0Qq#Qqv^}t&y0@+u7!+7_8x4jb@{KVQCrO34wUI z1986#M}c{Ka0)P8f3b!!mnuQ^Vkz5sMy%(h3|Unf-3<c#CCs--fK%+S5=L!yfbAJ) zrvvK~aw%BUM_@}Hfl~b!K!>Aeszmts!|kH<BKUxy3Pd|lI^%H(&XYj2!$lY5fM|y+ zCfb3foYy9<xxfz>FoW&U-$z^H%0A_+MJl>6_kd5r0_c|%@MUL&Juv+sf5UdscRbE9 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-38.pyc deleted file mode 100644 index 1b8d76eff514ba97a651b1e7fe418d112eb98553..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39677 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/_utils.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/_utils.cpython-38.pyc deleted file mode 100644 index 15a24f7daf19119d9d6f09f8768e92a1ca09c473..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3365 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 Ta3k|7THjlEy<V+P)xY&WPQ)(V diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/constants.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/constants.cpython-38.pyc deleted file mode 100644 index 30305e47b9c46c554f69d74ac943a4c6f017904f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66372 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/html5parser.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/html5parser.cpython-38.pyc deleted file mode 100644 index b4f71df14925cf74aec0c8807a77e497b207ddb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95194 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/serializer.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__pycache__/serializer.cpython-38.pyc deleted file mode 100644 index cac77c07d3e4ba5c81b4570a7219c8ff829567d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10843 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_ihatexml.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_ihatexml.py deleted file mode 100644 index 4c77717..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_ihatexml.py +++ /dev/null @@ -1,288 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import re -import warnings - -from .constants import DataLossWarning - -baseChar = """ -[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | -[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | -[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | -[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | -[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | -[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | -[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | -[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | -[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | -[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | -[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | -[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | -[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | -[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | -[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | -[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | -[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | -[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | -[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | -[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | -[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | -[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | -[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | -[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | -[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | -[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | -[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | -[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | -[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | -[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | -#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | -#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | -#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | -[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | -[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | -#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | -[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | -[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | -[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | -[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | -[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | -#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | -[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | -[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | -[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | -[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]""" - -ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]""" - -combiningCharacter = """ -[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | -[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | -[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | -[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | -#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | -[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | -[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | -#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | -[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | -[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | -#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | -[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | -[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | -[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | -[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | -[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | -#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | -[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | -#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | -[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | -[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | -#x3099 | #x309A""" - -digit = """ -[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | -[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | -[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | -[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]""" - -extender = """ -#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | -#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]""" - -letter = " | ".join([baseChar, ideographic]) - -# Without the -name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter, - extender]) -nameFirst = " | ".join([letter, "_"]) - -reChar = re.compile(r"#x([\d|A-F]{4,4})") -reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]") - - -def charStringToList(chars): - charRanges = [item.strip() for item in chars.split(" | ")] - rv = [] - for item in charRanges: - foundMatch = False - for regexp in (reChar, reCharRange): - match = regexp.match(item) - if match is not None: - rv.append([hexToInt(item) for item in match.groups()]) - if len(rv[-1]) == 1: - rv[-1] = rv[-1] * 2 - foundMatch = True - break - if not foundMatch: - assert len(item) == 1 - - rv.append([ord(item)] * 2) - rv = normaliseCharList(rv) - return rv - - -def normaliseCharList(charList): - charList = sorted(charList) - for item in charList: - assert item[1] >= item[0] - rv = [] - i = 0 - while i < len(charList): - j = 1 - rv.append(charList[i]) - while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1: - rv[-1][1] = charList[i + j][1] - j += 1 - i += j - return rv - -# We don't really support characters above the BMP :( -max_unicode = int("FFFF", 16) - - -def missingRanges(charList): - rv = [] - if charList[0] != 0: - rv.append([0, charList[0][0] - 1]) - for i, item in enumerate(charList[:-1]): - rv.append([item[1] + 1, charList[i + 1][0] - 1]) - if charList[-1][1] != max_unicode: - rv.append([charList[-1][1] + 1, max_unicode]) - return rv - - -def listToRegexpStr(charList): - rv = [] - for item in charList: - if item[0] == item[1]: - rv.append(escapeRegexp(chr(item[0]))) - else: - rv.append(escapeRegexp(chr(item[0])) + "-" + - escapeRegexp(chr(item[1]))) - return "[%s]" % "".join(rv) - - -def hexToInt(hex_str): - return int(hex_str, 16) - - -def escapeRegexp(string): - specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}", - "[", "]", "|", "(", ")", "-") - for char in specialCharacters: - string = string.replace(char, "\\" + char) - - return string - -# output from the above -nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa - -nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa - -# Simpler things -nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\\-'()+,./:=?;!*#@$_%]") - - -class InfosetFilter(object): - replacementRegexp = re.compile(r"U[\dA-F]{5,5}") - - def __init__(self, - dropXmlnsLocalName=False, - dropXmlnsAttrNs=False, - preventDoubleDashComments=False, - preventDashAtCommentEnd=False, - replaceFormFeedCharacters=True, - preventSingleQuotePubid=False): - - self.dropXmlnsLocalName = dropXmlnsLocalName - self.dropXmlnsAttrNs = dropXmlnsAttrNs - - self.preventDoubleDashComments = preventDoubleDashComments - self.preventDashAtCommentEnd = preventDashAtCommentEnd - - self.replaceFormFeedCharacters = replaceFormFeedCharacters - - self.preventSingleQuotePubid = preventSingleQuotePubid - - self.replaceCache = {} - - def coerceAttribute(self, name, namespace=None): - if self.dropXmlnsLocalName and name.startswith("xmlns:"): - warnings.warn("Attributes cannot begin with xmlns", DataLossWarning) - return None - elif (self.dropXmlnsAttrNs and - namespace == "http://www.w3.org/2000/xmlns/"): - warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning) - return None - else: - return self.toXmlName(name) - - def coerceElement(self, name): - return self.toXmlName(name) - - def coerceComment(self, data): - if self.preventDoubleDashComments: - while "--" in data: - warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning) - data = data.replace("--", "- -") - if data.endswith("-"): - warnings.warn("Comments cannot end in a dash", DataLossWarning) - data += " " - return data - - def coerceCharacters(self, data): - if self.replaceFormFeedCharacters: - for _ in range(data.count("\x0C")): - warnings.warn("Text cannot contain U+000C", DataLossWarning) - data = data.replace("\x0C", " ") - # Other non-xml characters - return data - - def coercePubid(self, data): - dataOutput = data - for char in nonPubidCharRegexp.findall(data): - warnings.warn("Coercing non-XML pubid", DataLossWarning) - replacement = self.getReplacementCharacter(char) - dataOutput = dataOutput.replace(char, replacement) - if self.preventSingleQuotePubid and dataOutput.find("'") >= 0: - warnings.warn("Pubid cannot contain single quote", DataLossWarning) - dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'")) - return dataOutput - - def toXmlName(self, name): - nameFirst = name[0] - nameRest = name[1:] - m = nonXmlNameFirstBMPRegexp.match(nameFirst) - if m: - warnings.warn("Coercing non-XML name", DataLossWarning) - nameFirstOutput = self.getReplacementCharacter(nameFirst) - else: - nameFirstOutput = nameFirst - - nameRestOutput = nameRest - replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest)) - for char in replaceChars: - warnings.warn("Coercing non-XML name", DataLossWarning) - replacement = self.getReplacementCharacter(char) - nameRestOutput = nameRestOutput.replace(char, replacement) - return nameFirstOutput + nameRestOutput - - def getReplacementCharacter(self, char): - if char in self.replaceCache: - replacement = self.replaceCache[char] - else: - replacement = self.escapeChar(char) - return replacement - - def fromXmlName(self, name): - for item in set(self.replacementRegexp.findall(name)): - name = name.replace(item, self.unescapeChar(item)) - return name - - def escapeChar(self, char): - replacement = "U%05X" % ord(char) - self.replaceCache[char] = replacement - return replacement - - def unescapeChar(self, charcode): - return chr(int(charcode[1:], 16)) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_inputstream.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_inputstream.py deleted file mode 100644 index a65e55f..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_inputstream.py +++ /dev/null @@ -1,923 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from pip._vendor.six import text_type, binary_type -from pip._vendor.six.moves import http_client, urllib - -import codecs -import re - -from pip._vendor import webencodings - -from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase -from .constants import _ReparseException -from . import _utils - -from io import StringIO - -try: - from io import BytesIO -except ImportError: - BytesIO = StringIO - -# Non-unicode versions of constants for use in the pre-parser -spaceCharactersBytes = frozenset([item.encode("ascii") for item in spaceCharacters]) -asciiLettersBytes = frozenset([item.encode("ascii") for item in asciiLetters]) -asciiUppercaseBytes = frozenset([item.encode("ascii") for item in asciiUppercase]) -spacesAngleBrackets = spaceCharactersBytes | frozenset([b">", b"<"]) - - -invalid_unicode_no_surrogate = "[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]" # noqa - -if _utils.supports_lone_surrogates: - # Use one extra step of indirection and create surrogates with - # eval. Not using this indirection would introduce an illegal - # unicode literal on platforms not supporting such lone - # surrogates. - assert invalid_unicode_no_surrogate[-1] == "]" and invalid_unicode_no_surrogate.count("]") == 1 - invalid_unicode_re = re.compile(invalid_unicode_no_surrogate[:-1] + - eval('"\\uD800-\\uDFFF"') + # pylint:disable=eval-used - "]") -else: - invalid_unicode_re = re.compile(invalid_unicode_no_surrogate) - -non_bmp_invalid_codepoints = set([0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, - 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, - 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, - 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, - 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, - 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, - 0x10FFFE, 0x10FFFF]) - -ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005C\u005B-\u0060\u007B-\u007E]") - -# Cache for charsUntil() -charsUntilRegEx = {} - - -class BufferedStream(object): - """Buffering for streams that do not have buffering of their own - - The buffer is implemented as a list of chunks on the assumption that - joining many strings will be slow since it is O(n**2) - """ - - def __init__(self, stream): - self.stream = stream - self.buffer = [] - self.position = [-1, 0] # chunk number, offset - - def tell(self): - pos = 0 - for chunk in self.buffer[:self.position[0]]: - pos += len(chunk) - pos += self.position[1] - return pos - - def seek(self, pos): - assert pos <= self._bufferedBytes() - offset = pos - i = 0 - while len(self.buffer[i]) < offset: - offset -= len(self.buffer[i]) - i += 1 - self.position = [i, offset] - - def read(self, bytes): - if not self.buffer: - return self._readStream(bytes) - elif (self.position[0] == len(self.buffer) and - self.position[1] == len(self.buffer[-1])): - return self._readStream(bytes) - else: - return self._readFromBuffer(bytes) - - def _bufferedBytes(self): - return sum([len(item) for item in self.buffer]) - - def _readStream(self, bytes): - data = self.stream.read(bytes) - self.buffer.append(data) - self.position[0] += 1 - self.position[1] = len(data) - return data - - def _readFromBuffer(self, bytes): - remainingBytes = bytes - rv = [] - bufferIndex = self.position[0] - bufferOffset = self.position[1] - while bufferIndex < len(self.buffer) and remainingBytes != 0: - assert remainingBytes > 0 - bufferedData = self.buffer[bufferIndex] - - if remainingBytes <= len(bufferedData) - bufferOffset: - bytesToRead = remainingBytes - self.position = [bufferIndex, bufferOffset + bytesToRead] - else: - bytesToRead = len(bufferedData) - bufferOffset - self.position = [bufferIndex, len(bufferedData)] - bufferIndex += 1 - rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead]) - remainingBytes -= bytesToRead - - bufferOffset = 0 - - if remainingBytes: - rv.append(self._readStream(remainingBytes)) - - return b"".join(rv) - - -def HTMLInputStream(source, **kwargs): - # Work around Python bug #20007: read(0) closes the connection. - # http://bugs.python.org/issue20007 - if (isinstance(source, http_client.HTTPResponse) or - # Also check for addinfourl wrapping HTTPResponse - (isinstance(source, urllib.response.addbase) and - isinstance(source.fp, http_client.HTTPResponse))): - isUnicode = False - elif hasattr(source, "read"): - isUnicode = isinstance(source.read(0), text_type) - else: - isUnicode = isinstance(source, text_type) - - if isUnicode: - encodings = [x for x in kwargs if x.endswith("_encoding")] - if encodings: - raise TypeError("Cannot set an encoding with a unicode input, set %r" % encodings) - - return HTMLUnicodeInputStream(source, **kwargs) - else: - return HTMLBinaryInputStream(source, **kwargs) - - -class HTMLUnicodeInputStream(object): - """Provides a unicode stream of characters to the HTMLTokenizer. - - This class takes care of character encoding and removing or replacing - incorrect byte-sequences and also provides column and line tracking. - - """ - - _defaultChunkSize = 10240 - - def __init__(self, source): - """Initialises the HTMLInputStream. - - HTMLInputStream(source, [encoding]) -> Normalized stream from source - for use by html5lib. - - source can be either a file-object, local filename or a string. - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element) - - """ - - if not _utils.supports_lone_surrogates: - # Such platforms will have already checked for such - # surrogate errors, so no need to do this checking. - self.reportCharacterErrors = None - elif len("\U0010FFFF") == 1: - self.reportCharacterErrors = self.characterErrorsUCS4 - else: - self.reportCharacterErrors = self.characterErrorsUCS2 - - # List of where new lines occur - self.newLines = [0] - - self.charEncoding = (lookupEncoding("utf-8"), "certain") - self.dataStream = self.openStream(source) - - self.reset() - - def reset(self): - self.chunk = "" - self.chunkSize = 0 - self.chunkOffset = 0 - self.errors = [] - - # number of (complete) lines in previous chunks - self.prevNumLines = 0 - # number of columns in the last line of the previous chunk - self.prevNumCols = 0 - - # Deal with CR LF and surrogates split over chunk boundaries - self._bufferedCharacter = None - - def openStream(self, source): - """Produces a file object from source. - - source can be either a file object, local filename or a string. - - """ - # Already a file object - if hasattr(source, 'read'): - stream = source - else: - stream = StringIO(source) - - return stream - - def _position(self, offset): - chunk = self.chunk - nLines = chunk.count('\n', 0, offset) - positionLine = self.prevNumLines + nLines - lastLinePos = chunk.rfind('\n', 0, offset) - if lastLinePos == -1: - positionColumn = self.prevNumCols + offset - else: - positionColumn = offset - (lastLinePos + 1) - return (positionLine, positionColumn) - - def position(self): - """Returns (line, col) of the current position in the stream.""" - line, col = self._position(self.chunkOffset) - return (line + 1, col) - - def char(self): - """ Read one character from the stream or queue if available. Return - EOF when EOF is reached. - """ - # Read a new chunk from the input stream if necessary - if self.chunkOffset >= self.chunkSize: - if not self.readChunk(): - return EOF - - chunkOffset = self.chunkOffset - char = self.chunk[chunkOffset] - self.chunkOffset = chunkOffset + 1 - - return char - - def readChunk(self, chunkSize=None): - if chunkSize is None: - chunkSize = self._defaultChunkSize - - self.prevNumLines, self.prevNumCols = self._position(self.chunkSize) - - self.chunk = "" - self.chunkSize = 0 - self.chunkOffset = 0 - - data = self.dataStream.read(chunkSize) - - # Deal with CR LF and surrogates broken across chunks - if self._bufferedCharacter: - data = self._bufferedCharacter + data - self._bufferedCharacter = None - elif not data: - # We have no more data, bye-bye stream - return False - - if len(data) > 1: - lastv = ord(data[-1]) - if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF: - self._bufferedCharacter = data[-1] - data = data[:-1] - - if self.reportCharacterErrors: - self.reportCharacterErrors(data) - - # Replace invalid characters - data = data.replace("\r\n", "\n") - data = data.replace("\r", "\n") - - self.chunk = data - self.chunkSize = len(data) - - return True - - def characterErrorsUCS4(self, data): - for _ in range(len(invalid_unicode_re.findall(data))): - self.errors.append("invalid-codepoint") - - def characterErrorsUCS2(self, data): - # Someone picked the wrong compile option - # You lose - skip = False - for match in invalid_unicode_re.finditer(data): - if skip: - continue - codepoint = ord(match.group()) - pos = match.start() - # Pretty sure there should be endianness issues here - if _utils.isSurrogatePair(data[pos:pos + 2]): - # We have a surrogate pair! - char_val = _utils.surrogatePairToCodepoint(data[pos:pos + 2]) - if char_val in non_bmp_invalid_codepoints: - self.errors.append("invalid-codepoint") - skip = True - elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and - pos == len(data) - 1): - self.errors.append("invalid-codepoint") - else: - skip = False - self.errors.append("invalid-codepoint") - - def charsUntil(self, characters, opposite=False): - """ Returns a string of characters from the stream up to but not - including any character in 'characters' or EOF. 'characters' must be - a container that supports the 'in' method and iteration over its - characters. - """ - - # Use a cache of regexps to find the required characters - try: - chars = charsUntilRegEx[(characters, opposite)] - except KeyError: - if __debug__: - for c in characters: - assert(ord(c) < 128) - regex = "".join(["\\x%02x" % ord(c) for c in characters]) - if not opposite: - regex = "^%s" % regex - chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex) - - rv = [] - - while True: - # Find the longest matching prefix - m = chars.match(self.chunk, self.chunkOffset) - if m is None: - # If nothing matched, and it wasn't because we ran out of chunk, - # then stop - if self.chunkOffset != self.chunkSize: - break - else: - end = m.end() - # If not the whole chunk matched, return everything - # up to the part that didn't match - if end != self.chunkSize: - rv.append(self.chunk[self.chunkOffset:end]) - self.chunkOffset = end - break - # If the whole remainder of the chunk matched, - # use it all and read the next chunk - rv.append(self.chunk[self.chunkOffset:]) - if not self.readChunk(): - # Reached EOF - break - - r = "".join(rv) - return r - - def unget(self, char): - # Only one character is allowed to be ungotten at once - it must - # be consumed again before any further call to unget - if char is not None: - if self.chunkOffset == 0: - # unget is called quite rarely, so it's a good idea to do - # more work here if it saves a bit of work in the frequently - # called char and charsUntil. - # So, just prepend the ungotten character onto the current - # chunk: - self.chunk = char + self.chunk - self.chunkSize += 1 - else: - self.chunkOffset -= 1 - assert self.chunk[self.chunkOffset] == char - - -class HTMLBinaryInputStream(HTMLUnicodeInputStream): - """Provides a unicode stream of characters to the HTMLTokenizer. - - This class takes care of character encoding and removing or replacing - incorrect byte-sequences and also provides column and line tracking. - - """ - - def __init__(self, source, override_encoding=None, transport_encoding=None, - same_origin_parent_encoding=None, likely_encoding=None, - default_encoding="windows-1252", useChardet=True): - """Initialises the HTMLInputStream. - - HTMLInputStream(source, [encoding]) -> Normalized stream from source - for use by html5lib. - - source can be either a file-object, local filename or a string. - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element) - - """ - # Raw Stream - for unicode objects this will encode to utf-8 and set - # self.charEncoding as appropriate - self.rawStream = self.openStream(source) - - HTMLUnicodeInputStream.__init__(self, self.rawStream) - - # Encoding Information - # Number of bytes to use when looking for a meta element with - # encoding information - self.numBytesMeta = 1024 - # Number of bytes to use when using detecting encoding using chardet - self.numBytesChardet = 100 - # Things from args - self.override_encoding = override_encoding - self.transport_encoding = transport_encoding - self.same_origin_parent_encoding = same_origin_parent_encoding - self.likely_encoding = likely_encoding - self.default_encoding = default_encoding - - # Determine encoding - self.charEncoding = self.determineEncoding(useChardet) - assert self.charEncoding[0] is not None - - # Call superclass - self.reset() - - def reset(self): - self.dataStream = self.charEncoding[0].codec_info.streamreader(self.rawStream, 'replace') - HTMLUnicodeInputStream.reset(self) - - def openStream(self, source): - """Produces a file object from source. - - source can be either a file object, local filename or a string. - - """ - # Already a file object - if hasattr(source, 'read'): - stream = source - else: - stream = BytesIO(source) - - try: - stream.seek(stream.tell()) - except: # pylint:disable=bare-except - stream = BufferedStream(stream) - - return stream - - def determineEncoding(self, chardet=True): - # BOMs take precedence over everything - # This will also read past the BOM if present - charEncoding = self.detectBOM(), "certain" - if charEncoding[0] is not None: - return charEncoding - - # If we've been overriden, we've been overriden - charEncoding = lookupEncoding(self.override_encoding), "certain" - if charEncoding[0] is not None: - return charEncoding - - # Now check the transport layer - charEncoding = lookupEncoding(self.transport_encoding), "certain" - if charEncoding[0] is not None: - return charEncoding - - # Look for meta elements with encoding information - charEncoding = self.detectEncodingMeta(), "tentative" - if charEncoding[0] is not None: - return charEncoding - - # Parent document encoding - charEncoding = lookupEncoding(self.same_origin_parent_encoding), "tentative" - if charEncoding[0] is not None and not charEncoding[0].name.startswith("utf-16"): - return charEncoding - - # "likely" encoding - charEncoding = lookupEncoding(self.likely_encoding), "tentative" - if charEncoding[0] is not None: - return charEncoding - - # Guess with chardet, if available - if chardet: - try: - from pip._vendor.chardet.universaldetector import UniversalDetector - except ImportError: - pass - else: - buffers = [] - detector = UniversalDetector() - while not detector.done: - buffer = self.rawStream.read(self.numBytesChardet) - assert isinstance(buffer, bytes) - if not buffer: - break - buffers.append(buffer) - detector.feed(buffer) - detector.close() - encoding = lookupEncoding(detector.result['encoding']) - self.rawStream.seek(0) - if encoding is not None: - return encoding, "tentative" - - # Try the default encoding - charEncoding = lookupEncoding(self.default_encoding), "tentative" - if charEncoding[0] is not None: - return charEncoding - - # Fallback to html5lib's default if even that hasn't worked - return lookupEncoding("windows-1252"), "tentative" - - def changeEncoding(self, newEncoding): - assert self.charEncoding[1] != "certain" - newEncoding = lookupEncoding(newEncoding) - if newEncoding is None: - return - if newEncoding.name in ("utf-16be", "utf-16le"): - newEncoding = lookupEncoding("utf-8") - assert newEncoding is not None - elif newEncoding == self.charEncoding[0]: - self.charEncoding = (self.charEncoding[0], "certain") - else: - self.rawStream.seek(0) - self.charEncoding = (newEncoding, "certain") - self.reset() - raise _ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding)) - - def detectBOM(self): - """Attempts to detect at BOM at the start of the stream. If - an encoding can be determined from the BOM return the name of the - encoding otherwise return None""" - bomDict = { - codecs.BOM_UTF8: 'utf-8', - codecs.BOM_UTF16_LE: 'utf-16le', codecs.BOM_UTF16_BE: 'utf-16be', - codecs.BOM_UTF32_LE: 'utf-32le', codecs.BOM_UTF32_BE: 'utf-32be' - } - - # Go to beginning of file and read in 4 bytes - string = self.rawStream.read(4) - assert isinstance(string, bytes) - - # Try detecting the BOM using bytes from the string - encoding = bomDict.get(string[:3]) # UTF-8 - seek = 3 - if not encoding: - # Need to detect UTF-32 before UTF-16 - encoding = bomDict.get(string) # UTF-32 - seek = 4 - if not encoding: - encoding = bomDict.get(string[:2]) # UTF-16 - seek = 2 - - # Set the read position past the BOM if one was found, otherwise - # set it to the start of the stream - if encoding: - self.rawStream.seek(seek) - return lookupEncoding(encoding) - else: - self.rawStream.seek(0) - return None - - def detectEncodingMeta(self): - """Report the encoding declared by the meta element - """ - buffer = self.rawStream.read(self.numBytesMeta) - assert isinstance(buffer, bytes) - parser = EncodingParser(buffer) - self.rawStream.seek(0) - encoding = parser.getEncoding() - - if encoding is not None and encoding.name in ("utf-16be", "utf-16le"): - encoding = lookupEncoding("utf-8") - - return encoding - - -class EncodingBytes(bytes): - """String-like object with an associated position and various extra methods - If the position is ever greater than the string length then an exception is - raised""" - def __new__(self, value): - assert isinstance(value, bytes) - return bytes.__new__(self, value.lower()) - - def __init__(self, value): - # pylint:disable=unused-argument - self._position = -1 - - def __iter__(self): - return self - - def __next__(self): - p = self._position = self._position + 1 - if p >= len(self): - raise StopIteration - elif p < 0: - raise TypeError - return self[p:p + 1] - - def next(self): - # Py2 compat - return self.__next__() - - def previous(self): - p = self._position - if p >= len(self): - raise StopIteration - elif p < 0: - raise TypeError - self._position = p = p - 1 - return self[p:p + 1] - - def setPosition(self, position): - if self._position >= len(self): - raise StopIteration - self._position = position - - def getPosition(self): - if self._position >= len(self): - raise StopIteration - if self._position >= 0: - return self._position - else: - return None - - position = property(getPosition, setPosition) - - def getCurrentByte(self): - return self[self.position:self.position + 1] - - currentByte = property(getCurrentByte) - - def skip(self, chars=spaceCharactersBytes): - """Skip past a list of characters""" - p = self.position # use property for the error-checking - while p < len(self): - c = self[p:p + 1] - if c not in chars: - self._position = p - return c - p += 1 - self._position = p - return None - - def skipUntil(self, chars): - p = self.position - while p < len(self): - c = self[p:p + 1] - if c in chars: - self._position = p - return c - p += 1 - self._position = p - return None - - def matchBytes(self, bytes): - """Look for a sequence of bytes at the start of a string. If the bytes - are found return True and advance the position to the byte after the - match. Otherwise return False and leave the position alone""" - p = self.position - data = self[p:p + len(bytes)] - rv = data.startswith(bytes) - if rv: - self.position += len(bytes) - return rv - - def jumpTo(self, bytes): - """Look for the next sequence of bytes matching a given sequence. If - a match is found advance the position to the last byte of the match""" - newPosition = self[self.position:].find(bytes) - if newPosition > -1: - # XXX: This is ugly, but I can't see a nicer way to fix this. - if self._position == -1: - self._position = 0 - self._position += (newPosition + len(bytes) - 1) - return True - else: - raise StopIteration - - -class EncodingParser(object): - """Mini parser for detecting character encoding from meta elements""" - - def __init__(self, data): - """string - the data to work on for encoding detection""" - self.data = EncodingBytes(data) - self.encoding = None - - def getEncoding(self): - methodDispatch = ( - (b"<!--", self.handleComment), - (b"<meta", self.handleMeta), - (b"</", self.handlePossibleEndTag), - (b"<!", self.handleOther), - (b"<?", self.handleOther), - (b"<", self.handlePossibleStartTag)) - for _ in self.data: - keepParsing = True - for key, method in methodDispatch: - if self.data.matchBytes(key): - try: - keepParsing = method() - break - except StopIteration: - keepParsing = False - break - if not keepParsing: - break - - return self.encoding - - def handleComment(self): - """Skip over comments""" - return self.data.jumpTo(b"-->") - - def handleMeta(self): - if self.data.currentByte not in spaceCharactersBytes: - # if we have <meta not followed by a space so just keep going - return True - # We have a valid meta element we want to search for attributes - hasPragma = False - pendingEncoding = None - while True: - # Try to find the next attribute after the current position - attr = self.getAttribute() - if attr is None: - return True - else: - if attr[0] == b"http-equiv": - hasPragma = attr[1] == b"content-type" - if hasPragma and pendingEncoding is not None: - self.encoding = pendingEncoding - return False - elif attr[0] == b"charset": - tentativeEncoding = attr[1] - codec = lookupEncoding(tentativeEncoding) - if codec is not None: - self.encoding = codec - return False - elif attr[0] == b"content": - contentParser = ContentAttrParser(EncodingBytes(attr[1])) - tentativeEncoding = contentParser.parse() - if tentativeEncoding is not None: - codec = lookupEncoding(tentativeEncoding) - if codec is not None: - if hasPragma: - self.encoding = codec - return False - else: - pendingEncoding = codec - - def handlePossibleStartTag(self): - return self.handlePossibleTag(False) - - def handlePossibleEndTag(self): - next(self.data) - return self.handlePossibleTag(True) - - def handlePossibleTag(self, endTag): - data = self.data - if data.currentByte not in asciiLettersBytes: - # If the next byte is not an ascii letter either ignore this - # fragment (possible start tag case) or treat it according to - # handleOther - if endTag: - data.previous() - self.handleOther() - return True - - c = data.skipUntil(spacesAngleBrackets) - if c == b"<": - # return to the first step in the overall "two step" algorithm - # reprocessing the < byte - data.previous() - else: - # Read all attributes - attr = self.getAttribute() - while attr is not None: - attr = self.getAttribute() - return True - - def handleOther(self): - return self.data.jumpTo(b">") - - def getAttribute(self): - """Return a name,value pair for the next attribute in the stream, - if one is found, or None""" - data = self.data - # Step 1 (skip chars) - c = data.skip(spaceCharactersBytes | frozenset([b"/"])) - assert c is None or len(c) == 1 - # Step 2 - if c in (b">", None): - return None - # Step 3 - attrName = [] - attrValue = [] - # Step 4 attribute name - while True: - if c == b"=" and attrName: - break - elif c in spaceCharactersBytes: - # Step 6! - c = data.skip() - break - elif c in (b"/", b">"): - return b"".join(attrName), b"" - elif c in asciiUppercaseBytes: - attrName.append(c.lower()) - elif c is None: - return None - else: - attrName.append(c) - # Step 5 - c = next(data) - # Step 7 - if c != b"=": - data.previous() - return b"".join(attrName), b"" - # Step 8 - next(data) - # Step 9 - c = data.skip() - # Step 10 - if c in (b"'", b'"'): - # 10.1 - quoteChar = c - while True: - # 10.2 - c = next(data) - # 10.3 - if c == quoteChar: - next(data) - return b"".join(attrName), b"".join(attrValue) - # 10.4 - elif c in asciiUppercaseBytes: - attrValue.append(c.lower()) - # 10.5 - else: - attrValue.append(c) - elif c == b">": - return b"".join(attrName), b"" - elif c in asciiUppercaseBytes: - attrValue.append(c.lower()) - elif c is None: - return None - else: - attrValue.append(c) - # Step 11 - while True: - c = next(data) - if c in spacesAngleBrackets: - return b"".join(attrName), b"".join(attrValue) - elif c in asciiUppercaseBytes: - attrValue.append(c.lower()) - elif c is None: - return None - else: - attrValue.append(c) - - -class ContentAttrParser(object): - def __init__(self, data): - assert isinstance(data, bytes) - self.data = data - - def parse(self): - try: - # Check if the attr name is charset - # otherwise return - self.data.jumpTo(b"charset") - self.data.position += 1 - self.data.skip() - if not self.data.currentByte == b"=": - # If there is no = sign keep looking for attrs - return None - self.data.position += 1 - self.data.skip() - # Look for an encoding between matching quote marks - if self.data.currentByte in (b'"', b"'"): - quoteMark = self.data.currentByte - self.data.position += 1 - oldPosition = self.data.position - if self.data.jumpTo(quoteMark): - return self.data[oldPosition:self.data.position] - else: - return None - else: - # Unquoted value - oldPosition = self.data.position - try: - self.data.skipUntil(spaceCharactersBytes) - return self.data[oldPosition:self.data.position] - except StopIteration: - # Return the whole remaining value - return self.data[oldPosition:] - except StopIteration: - return None - - -def lookupEncoding(encoding): - """Return the python codec name corresponding to an encoding or None if the - string doesn't correspond to a valid encoding.""" - if isinstance(encoding, binary_type): - try: - encoding = encoding.decode("ascii") - except UnicodeDecodeError: - return None - - if encoding is not None: - try: - return webencodings.lookup(encoding) - except AttributeError: - return None - else: - return None diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_tokenizer.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_tokenizer.py deleted file mode 100644 index 178f6e7..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_tokenizer.py +++ /dev/null @@ -1,1721 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from pip._vendor.six import unichr as chr - -from collections import deque - -from .constants import spaceCharacters -from .constants import entities -from .constants import asciiLetters, asciiUpper2Lower -from .constants import digits, hexDigits, EOF -from .constants import tokenTypes, tagTokenTypes -from .constants import replacementCharacters - -from ._inputstream import HTMLInputStream - -from ._trie import Trie - -entitiesTrie = Trie(entities) - - -class HTMLTokenizer(object): - """ This class takes care of tokenizing HTML. - - * self.currentToken - Holds the token that is currently being processed. - - * self.state - Holds a reference to the method to be invoked... XXX - - * self.stream - Points to HTMLInputStream object. - """ - - def __init__(self, stream, parser=None, **kwargs): - - self.stream = HTMLInputStream(stream, **kwargs) - self.parser = parser - - # Setup the initial tokenizer state - self.escapeFlag = False - self.lastFourChars = [] - self.state = self.dataState - self.escape = False - - # The current token being created - self.currentToken = None - super(HTMLTokenizer, self).__init__() - - def __iter__(self): - """ This is where the magic happens. - - We do our usually processing through the states and when we have a token - to return we yield the token which pauses processing until the next token - is requested. - """ - self.tokenQueue = deque([]) - # Start processing. When EOF is reached self.state will return False - # instead of True and the loop will terminate. - while self.state(): - while self.stream.errors: - yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)} - while self.tokenQueue: - yield self.tokenQueue.popleft() - - def consumeNumberEntity(self, isHex): - """This function returns either U+FFFD or the character based on the - decimal or hexadecimal representation. It also discards ";" if present. - If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked. - """ - - allowed = digits - radix = 10 - if isHex: - allowed = hexDigits - radix = 16 - - charStack = [] - - # Consume all the characters that are in range while making sure we - # don't hit an EOF. - c = self.stream.char() - while c in allowed and c is not EOF: - charStack.append(c) - c = self.stream.char() - - # Convert the set of characters consumed to an int. - charAsInt = int("".join(charStack), radix) - - # Certain characters get replaced with others - if charAsInt in replacementCharacters: - char = replacementCharacters[charAsInt] - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "illegal-codepoint-for-numeric-entity", - "datavars": {"charAsInt": charAsInt}}) - elif ((0xD800 <= charAsInt <= 0xDFFF) or - (charAsInt > 0x10FFFF)): - char = "\uFFFD" - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "illegal-codepoint-for-numeric-entity", - "datavars": {"charAsInt": charAsInt}}) - else: - # Should speed up this check somehow (e.g. move the set to a constant) - if ((0x0001 <= charAsInt <= 0x0008) or - (0x000E <= charAsInt <= 0x001F) or - (0x007F <= charAsInt <= 0x009F) or - (0xFDD0 <= charAsInt <= 0xFDEF) or - charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, - 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, - 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, - 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, - 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, - 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, - 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, - 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, - 0xFFFFF, 0x10FFFE, 0x10FFFF])): - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": - "illegal-codepoint-for-numeric-entity", - "datavars": {"charAsInt": charAsInt}}) - try: - # Try/except needed as UCS-2 Python builds' unichar only works - # within the BMP. - char = chr(charAsInt) - except ValueError: - v = charAsInt - 0x10000 - char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF)) - - # Discard the ; if present. Otherwise, put it back on the queue and - # invoke parseError on parser. - if c != ";": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "numeric-entity-without-semicolon"}) - self.stream.unget(c) - - return char - - def consumeEntity(self, allowedChar=None, fromAttribute=False): - # Initialise to the default output for when no entity is matched - output = "&" - - charStack = [self.stream.char()] - if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") or - (allowedChar is not None and allowedChar == charStack[0])): - self.stream.unget(charStack[0]) - - elif charStack[0] == "#": - # Read the next character to see if it's hex or decimal - hex = False - charStack.append(self.stream.char()) - if charStack[-1] in ("x", "X"): - hex = True - charStack.append(self.stream.char()) - - # charStack[-1] should be the first digit - if (hex and charStack[-1] in hexDigits) \ - or (not hex and charStack[-1] in digits): - # At least one digit found, so consume the whole number - self.stream.unget(charStack[-1]) - output = self.consumeNumberEntity(hex) - else: - # No digits found - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "expected-numeric-entity"}) - self.stream.unget(charStack.pop()) - output = "&" + "".join(charStack) - - else: - # At this point in the process might have named entity. Entities - # are stored in the global variable "entities". - # - # Consume characters and compare to these to a substring of the - # entity names in the list until the substring no longer matches. - while (charStack[-1] is not EOF): - if not entitiesTrie.has_keys_with_prefix("".join(charStack)): - break - charStack.append(self.stream.char()) - - # At this point we have a string that starts with some characters - # that may match an entity - # Try to find the longest entity the string will match to take care - # of ¬i for instance. - try: - entityName = entitiesTrie.longest_prefix("".join(charStack[:-1])) - entityLength = len(entityName) - except KeyError: - entityName = None - - if entityName is not None: - if entityName[-1] != ";": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "named-entity-without-semicolon"}) - if (entityName[-1] != ";" and fromAttribute and - (charStack[entityLength] in asciiLetters or - charStack[entityLength] in digits or - charStack[entityLength] == "=")): - self.stream.unget(charStack.pop()) - output = "&" + "".join(charStack) - else: - output = entities[entityName] - self.stream.unget(charStack.pop()) - output += "".join(charStack[entityLength:]) - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-named-entity"}) - self.stream.unget(charStack.pop()) - output = "&" + "".join(charStack) - - if fromAttribute: - self.currentToken["data"][-1][1] += output - else: - if output in spaceCharacters: - tokenType = "SpaceCharacters" - else: - tokenType = "Characters" - self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output}) - - def processEntityInAttribute(self, allowedChar): - """This method replaces the need for "entityInAttributeValueState". - """ - self.consumeEntity(allowedChar=allowedChar, fromAttribute=True) - - def emitCurrentToken(self): - """This method is a generic handler for emitting the tags. It also sets - the state to "data" because that's what's needed after a token has been - emitted. - """ - token = self.currentToken - # Add token to the queue to be yielded - if (token["type"] in tagTokenTypes): - token["name"] = token["name"].translate(asciiUpper2Lower) - if token["type"] == tokenTypes["EndTag"]: - if token["data"]: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "attributes-in-end-tag"}) - if token["selfClosing"]: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "self-closing-flag-on-end-tag"}) - self.tokenQueue.append(token) - self.state = self.dataState - - # Below are the various tokenizer states worked out. - def dataState(self): - data = self.stream.char() - if data == "&": - self.state = self.entityDataState - elif data == "<": - self.state = self.tagOpenState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\u0000"}) - elif data is EOF: - # Tokenization ends. - return False - elif data in spaceCharacters: - # Directly after emitting a token you switch back to the "data - # state". At that point spaceCharacters are important so they are - # emitted separately. - self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": - data + self.stream.charsUntil(spaceCharacters, True)}) - # No need to update lastFourChars here, since the first space will - # have already been appended to lastFourChars and will have broken - # any <!-- or --> sequences - else: - chars = self.stream.charsUntil(("&", "<", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def entityDataState(self): - self.consumeEntity() - self.state = self.dataState - return True - - def rcdataState(self): - data = self.stream.char() - if data == "&": - self.state = self.characterReferenceInRcdata - elif data == "<": - self.state = self.rcdataLessThanSignState - elif data == EOF: - # Tokenization ends. - return False - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data in spaceCharacters: - # Directly after emitting a token you switch back to the "data - # state". At that point spaceCharacters are important so they are - # emitted separately. - self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": - data + self.stream.charsUntil(spaceCharacters, True)}) - # No need to update lastFourChars here, since the first space will - # have already been appended to lastFourChars and will have broken - # any <!-- or --> sequences - else: - chars = self.stream.charsUntil(("&", "<", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def characterReferenceInRcdata(self): - self.consumeEntity() - self.state = self.rcdataState - return True - - def rawtextState(self): - data = self.stream.char() - if data == "<": - self.state = self.rawtextLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data == EOF: - # Tokenization ends. - return False - else: - chars = self.stream.charsUntil(("<", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def scriptDataState(self): - data = self.stream.char() - if data == "<": - self.state = self.scriptDataLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data == EOF: - # Tokenization ends. - return False - else: - chars = self.stream.charsUntil(("<", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def plaintextState(self): - data = self.stream.char() - if data == EOF: - # Tokenization ends. - return False - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + self.stream.charsUntil("\u0000")}) - return True - - def tagOpenState(self): - data = self.stream.char() - if data == "!": - self.state = self.markupDeclarationOpenState - elif data == "/": - self.state = self.closeTagOpenState - elif data in asciiLetters: - self.currentToken = {"type": tokenTypes["StartTag"], - "name": data, "data": [], - "selfClosing": False, - "selfClosingAcknowledged": False} - self.state = self.tagNameState - elif data == ">": - # XXX In theory it could be something besides a tag name. But - # do we really care? - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-tag-name-but-got-right-bracket"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"}) - self.state = self.dataState - elif data == "?": - # XXX In theory it could be something besides a tag name. But - # do we really care? - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-tag-name-but-got-question-mark"}) - self.stream.unget(data) - self.state = self.bogusCommentState - else: - # XXX - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-tag-name"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.dataState - return True - - def closeTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.currentToken = {"type": tokenTypes["EndTag"], "name": data, - "data": [], "selfClosing": False} - self.state = self.tagNameState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-closing-tag-but-got-right-bracket"}) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-closing-tag-but-got-eof"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) - self.state = self.dataState - else: - # XXX data can be _'_... - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-closing-tag-but-got-char", - "datavars": {"data": data}}) - self.stream.unget(data) - self.state = self.bogusCommentState - return True - - def tagNameState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeAttributeNameState - elif data == ">": - self.emitCurrentToken() - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-tag-name"}) - self.state = self.dataState - elif data == "/": - self.state = self.selfClosingStartTagState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["name"] += "\uFFFD" - else: - self.currentToken["name"] += data - # (Don't use charsUntil here, because tag names are - # very short and it's faster to not do anything fancy) - return True - - def rcdataLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.temporaryBuffer = "" - self.state = self.rcdataEndTagOpenState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.rcdataState - return True - - def rcdataEndTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.temporaryBuffer += data - self.state = self.rcdataEndTagNameState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) - self.stream.unget(data) - self.state = self.rcdataState - return True - - def rcdataEndTagNameState(self): - appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() - data = self.stream.char() - if data in spaceCharacters and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.beforeAttributeNameState - elif data == "/" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.selfClosingStartTagState - elif data == ">" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.emitCurrentToken() - self.state = self.dataState - elif data in asciiLetters: - self.temporaryBuffer += data - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "</" + self.temporaryBuffer}) - self.stream.unget(data) - self.state = self.rcdataState - return True - - def rawtextLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.temporaryBuffer = "" - self.state = self.rawtextEndTagOpenState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.rawtextState - return True - - def rawtextEndTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.temporaryBuffer += data - self.state = self.rawtextEndTagNameState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) - self.stream.unget(data) - self.state = self.rawtextState - return True - - def rawtextEndTagNameState(self): - appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() - data = self.stream.char() - if data in spaceCharacters and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.beforeAttributeNameState - elif data == "/" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.selfClosingStartTagState - elif data == ">" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.emitCurrentToken() - self.state = self.dataState - elif data in asciiLetters: - self.temporaryBuffer += data - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "</" + self.temporaryBuffer}) - self.stream.unget(data) - self.state = self.rawtextState - return True - - def scriptDataLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.temporaryBuffer = "" - self.state = self.scriptDataEndTagOpenState - elif data == "!": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<!"}) - self.state = self.scriptDataEscapeStartState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.scriptDataState - return True - - def scriptDataEndTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.temporaryBuffer += data - self.state = self.scriptDataEndTagNameState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) - self.stream.unget(data) - self.state = self.scriptDataState - return True - - def scriptDataEndTagNameState(self): - appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() - data = self.stream.char() - if data in spaceCharacters and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.beforeAttributeNameState - elif data == "/" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.selfClosingStartTagState - elif data == ">" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.emitCurrentToken() - self.state = self.dataState - elif data in asciiLetters: - self.temporaryBuffer += data - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "</" + self.temporaryBuffer}) - self.stream.unget(data) - self.state = self.scriptDataState - return True - - def scriptDataEscapeStartState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataEscapeStartDashState - else: - self.stream.unget(data) - self.state = self.scriptDataState - return True - - def scriptDataEscapeStartDashState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataEscapedDashDashState - else: - self.stream.unget(data) - self.state = self.scriptDataState - return True - - def scriptDataEscapedState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataEscapedDashState - elif data == "<": - self.state = self.scriptDataEscapedLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data == EOF: - self.state = self.dataState - else: - chars = self.stream.charsUntil(("<", "-", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def scriptDataEscapedDashState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataEscapedDashDashState - elif data == "<": - self.state = self.scriptDataEscapedLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - self.state = self.scriptDataEscapedState - elif data == EOF: - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.state = self.scriptDataEscapedState - return True - - def scriptDataEscapedDashDashState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - elif data == "<": - self.state = self.scriptDataEscapedLessThanSignState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) - self.state = self.scriptDataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - self.state = self.scriptDataEscapedState - elif data == EOF: - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.state = self.scriptDataEscapedState - return True - - def scriptDataEscapedLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.temporaryBuffer = "" - self.state = self.scriptDataEscapedEndTagOpenState - elif data in asciiLetters: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data}) - self.temporaryBuffer = data - self.state = self.scriptDataDoubleEscapeStartState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.scriptDataEscapedState - return True - - def scriptDataEscapedEndTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.temporaryBuffer = data - self.state = self.scriptDataEscapedEndTagNameState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) - self.stream.unget(data) - self.state = self.scriptDataEscapedState - return True - - def scriptDataEscapedEndTagNameState(self): - appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() - data = self.stream.char() - if data in spaceCharacters and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.beforeAttributeNameState - elif data == "/" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.selfClosingStartTagState - elif data == ">" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.emitCurrentToken() - self.state = self.dataState - elif data in asciiLetters: - self.temporaryBuffer += data - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "</" + self.temporaryBuffer}) - self.stream.unget(data) - self.state = self.scriptDataEscapedState - return True - - def scriptDataDoubleEscapeStartState(self): - data = self.stream.char() - if data in (spaceCharacters | frozenset(("/", ">"))): - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - if self.temporaryBuffer.lower() == "script": - self.state = self.scriptDataDoubleEscapedState - else: - self.state = self.scriptDataEscapedState - elif data in asciiLetters: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.temporaryBuffer += data - else: - self.stream.unget(data) - self.state = self.scriptDataEscapedState - return True - - def scriptDataDoubleEscapedState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataDoubleEscapedDashState - elif data == "<": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.state = self.scriptDataDoubleEscapedLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data == EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-script-in-script"}) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - return True - - def scriptDataDoubleEscapedDashState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataDoubleEscapedDashDashState - elif data == "<": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.state = self.scriptDataDoubleEscapedLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - self.state = self.scriptDataDoubleEscapedState - elif data == EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-script-in-script"}) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.state = self.scriptDataDoubleEscapedState - return True - - def scriptDataDoubleEscapedDashDashState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - elif data == "<": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.state = self.scriptDataDoubleEscapedLessThanSignState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) - self.state = self.scriptDataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - self.state = self.scriptDataDoubleEscapedState - elif data == EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-script-in-script"}) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.state = self.scriptDataDoubleEscapedState - return True - - def scriptDataDoubleEscapedLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"}) - self.temporaryBuffer = "" - self.state = self.scriptDataDoubleEscapeEndState - else: - self.stream.unget(data) - self.state = self.scriptDataDoubleEscapedState - return True - - def scriptDataDoubleEscapeEndState(self): - data = self.stream.char() - if data in (spaceCharacters | frozenset(("/", ">"))): - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - if self.temporaryBuffer.lower() == "script": - self.state = self.scriptDataEscapedState - else: - self.state = self.scriptDataDoubleEscapedState - elif data in asciiLetters: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.temporaryBuffer += data - else: - self.stream.unget(data) - self.state = self.scriptDataDoubleEscapedState - return True - - def beforeAttributeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - self.stream.charsUntil(spaceCharacters, True) - elif data in asciiLetters: - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - elif data == ">": - self.emitCurrentToken() - elif data == "/": - self.state = self.selfClosingStartTagState - elif data in ("'", '"', "=", "<"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "invalid-character-in-attribute-name"}) - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"].append(["\uFFFD", ""]) - self.state = self.attributeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-attribute-name-but-got-eof"}) - self.state = self.dataState - else: - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - return True - - def attributeNameState(self): - data = self.stream.char() - leavingThisState = True - emitToken = False - if data == "=": - self.state = self.beforeAttributeValueState - elif data in asciiLetters: - self.currentToken["data"][-1][0] += data +\ - self.stream.charsUntil(asciiLetters, True) - leavingThisState = False - elif data == ">": - # XXX If we emit here the attributes are converted to a dict - # without being checked and when the code below runs we error - # because data is a dict not a list - emitToken = True - elif data in spaceCharacters: - self.state = self.afterAttributeNameState - elif data == "/": - self.state = self.selfClosingStartTagState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][0] += "\uFFFD" - leavingThisState = False - elif data in ("'", '"', "<"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": - "invalid-character-in-attribute-name"}) - self.currentToken["data"][-1][0] += data - leavingThisState = False - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "eof-in-attribute-name"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][0] += data - leavingThisState = False - - if leavingThisState: - # Attributes are not dropped at this stage. That happens when the - # start tag token is emitted so values can still be safely appended - # to attributes, but we do want to report the parse error in time. - self.currentToken["data"][-1][0] = ( - self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) - for name, _ in self.currentToken["data"][:-1]: - if self.currentToken["data"][-1][0] == name: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "duplicate-attribute"}) - break - # XXX Fix for above XXX - if emitToken: - self.emitCurrentToken() - return True - - def afterAttributeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - self.stream.charsUntil(spaceCharacters, True) - elif data == "=": - self.state = self.beforeAttributeValueState - elif data == ">": - self.emitCurrentToken() - elif data in asciiLetters: - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - elif data == "/": - self.state = self.selfClosingStartTagState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"].append(["\uFFFD", ""]) - self.state = self.attributeNameState - elif data in ("'", '"', "<"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "invalid-character-after-attribute-name"}) - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-end-of-tag-but-got-eof"}) - self.state = self.dataState - else: - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - return True - - def beforeAttributeValueState(self): - data = self.stream.char() - if data in spaceCharacters: - self.stream.charsUntil(spaceCharacters, True) - elif data == "\"": - self.state = self.attributeValueDoubleQuotedState - elif data == "&": - self.state = self.attributeValueUnQuotedState - self.stream.unget(data) - elif data == "'": - self.state = self.attributeValueSingleQuotedState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-attribute-value-but-got-right-bracket"}) - self.emitCurrentToken() - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][1] += "\uFFFD" - self.state = self.attributeValueUnQuotedState - elif data in ("=", "<", "`"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "equals-in-unquoted-attribute-value"}) - self.currentToken["data"][-1][1] += data - self.state = self.attributeValueUnQuotedState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-attribute-value-but-got-eof"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][1] += data - self.state = self.attributeValueUnQuotedState - return True - - def attributeValueDoubleQuotedState(self): - data = self.stream.char() - if data == "\"": - self.state = self.afterAttributeValueState - elif data == "&": - self.processEntityInAttribute('"') - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][1] += "\uFFFD" - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-attribute-value-double-quote"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][1] += data +\ - self.stream.charsUntil(("\"", "&", "\u0000")) - return True - - def attributeValueSingleQuotedState(self): - data = self.stream.char() - if data == "'": - self.state = self.afterAttributeValueState - elif data == "&": - self.processEntityInAttribute("'") - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][1] += "\uFFFD" - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-attribute-value-single-quote"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][1] += data +\ - self.stream.charsUntil(("'", "&", "\u0000")) - return True - - def attributeValueUnQuotedState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeAttributeNameState - elif data == "&": - self.processEntityInAttribute(">") - elif data == ">": - self.emitCurrentToken() - elif data in ('"', "'", "=", "<", "`"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-character-in-unquoted-attribute-value"}) - self.currentToken["data"][-1][1] += data - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][1] += "\uFFFD" - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-attribute-value-no-quotes"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][1] += data + self.stream.charsUntil( - frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters) - return True - - def afterAttributeValueState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeAttributeNameState - elif data == ">": - self.emitCurrentToken() - elif data == "/": - self.state = self.selfClosingStartTagState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-EOF-after-attribute-value"}) - self.stream.unget(data) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-character-after-attribute-value"}) - self.stream.unget(data) - self.state = self.beforeAttributeNameState - return True - - def selfClosingStartTagState(self): - data = self.stream.char() - if data == ">": - self.currentToken["selfClosing"] = True - self.emitCurrentToken() - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": - "unexpected-EOF-after-solidus-in-tag"}) - self.stream.unget(data) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-character-after-solidus-in-tag"}) - self.stream.unget(data) - self.state = self.beforeAttributeNameState - return True - - def bogusCommentState(self): - # Make a new comment token and give it as value all the characters - # until the first > or EOF (charsUntil checks for EOF automatically) - # and emit it. - data = self.stream.charsUntil(">") - data = data.replace("\u0000", "\uFFFD") - self.tokenQueue.append( - {"type": tokenTypes["Comment"], "data": data}) - - # Eat the character directly after the bogus comment which is either a - # ">" or an EOF. - self.stream.char() - self.state = self.dataState - return True - - def markupDeclarationOpenState(self): - charStack = [self.stream.char()] - if charStack[-1] == "-": - charStack.append(self.stream.char()) - if charStack[-1] == "-": - self.currentToken = {"type": tokenTypes["Comment"], "data": ""} - self.state = self.commentStartState - return True - elif charStack[-1] in ('d', 'D'): - matched = True - for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'), - ('y', 'Y'), ('p', 'P'), ('e', 'E')): - charStack.append(self.stream.char()) - if charStack[-1] not in expected: - matched = False - break - if matched: - self.currentToken = {"type": tokenTypes["Doctype"], - "name": "", - "publicId": None, "systemId": None, - "correct": True} - self.state = self.doctypeState - return True - elif (charStack[-1] == "[" and - self.parser is not None and - self.parser.tree.openElements and - self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace): - matched = True - for expected in ["C", "D", "A", "T", "A", "["]: - charStack.append(self.stream.char()) - if charStack[-1] != expected: - matched = False - break - if matched: - self.state = self.cdataSectionState - return True - - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-dashes-or-doctype"}) - - while charStack: - self.stream.unget(charStack.pop()) - self.state = self.bogusCommentState - return True - - def commentStartState(self): - data = self.stream.char() - if data == "-": - self.state = self.commentStartDashState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "incorrect-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += data - self.state = self.commentState - return True - - def commentStartDashState(self): - data = self.stream.char() - if data == "-": - self.state = self.commentEndState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "-\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "incorrect-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += "-" + data - self.state = self.commentState - return True - - def commentState(self): - data = self.stream.char() - if data == "-": - self.state = self.commentEndDashState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "\uFFFD" - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "eof-in-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += data + \ - self.stream.charsUntil(("-", "\u0000")) - return True - - def commentEndDashState(self): - data = self.stream.char() - if data == "-": - self.state = self.commentEndState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "-\uFFFD" - self.state = self.commentState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment-end-dash"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += "-" + data - self.state = self.commentState - return True - - def commentEndState(self): - data = self.stream.char() - if data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "--\uFFFD" - self.state = self.commentState - elif data == "!": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-bang-after-double-dash-in-comment"}) - self.state = self.commentEndBangState - elif data == "-": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-dash-after-double-dash-in-comment"}) - self.currentToken["data"] += data - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment-double-dash"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - # XXX - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-comment"}) - self.currentToken["data"] += "--" + data - self.state = self.commentState - return True - - def commentEndBangState(self): - data = self.stream.char() - if data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == "-": - self.currentToken["data"] += "--!" - self.state = self.commentEndDashState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "--!\uFFFD" - self.state = self.commentState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment-end-bang-state"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += "--!" + data - self.state = self.commentState - return True - - def doctypeState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeDoctypeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-doctype-name-but-got-eof"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "need-space-after-doctype"}) - self.stream.unget(data) - self.state = self.beforeDoctypeNameState - return True - - def beforeDoctypeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-doctype-name-but-got-right-bracket"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["name"] = "\uFFFD" - self.state = self.doctypeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-doctype-name-but-got-eof"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["name"] = data - self.state = self.doctypeNameState - return True - - def doctypeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) - self.state = self.afterDoctypeNameState - elif data == ">": - self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["name"] += "\uFFFD" - self.state = self.doctypeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype-name"}) - self.currentToken["correct"] = False - self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["name"] += data - return True - - def afterDoctypeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.currentToken["correct"] = False - self.stream.unget(data) - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - if data in ("p", "P"): - matched = True - for expected in (("u", "U"), ("b", "B"), ("l", "L"), - ("i", "I"), ("c", "C")): - data = self.stream.char() - if data not in expected: - matched = False - break - if matched: - self.state = self.afterDoctypePublicKeywordState - return True - elif data in ("s", "S"): - matched = True - for expected in (("y", "Y"), ("s", "S"), ("t", "T"), - ("e", "E"), ("m", "M")): - data = self.stream.char() - if data not in expected: - matched = False - break - if matched: - self.state = self.afterDoctypeSystemKeywordState - return True - - # All the characters read before the current 'data' will be - # [a-zA-Z], so they're garbage in the bogus doctype and can be - # discarded; only the latest character might be '>' or EOF - # and needs to be ungetted - self.stream.unget(data) - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-space-or-right-bracket-in-doctype", "datavars": - {"data": data}}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - - return True - - def afterDoctypePublicKeywordState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeDoctypePublicIdentifierState - elif data in ("'", '"'): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.stream.unget(data) - self.state = self.beforeDoctypePublicIdentifierState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.stream.unget(data) - self.state = self.beforeDoctypePublicIdentifierState - return True - - def beforeDoctypePublicIdentifierState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == "\"": - self.currentToken["publicId"] = "" - self.state = self.doctypePublicIdentifierDoubleQuotedState - elif data == "'": - self.currentToken["publicId"] = "" - self.state = self.doctypePublicIdentifierSingleQuotedState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - return True - - def doctypePublicIdentifierDoubleQuotedState(self): - data = self.stream.char() - if data == "\"": - self.state = self.afterDoctypePublicIdentifierState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["publicId"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["publicId"] += data - return True - - def doctypePublicIdentifierSingleQuotedState(self): - data = self.stream.char() - if data == "'": - self.state = self.afterDoctypePublicIdentifierState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["publicId"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["publicId"] += data - return True - - def afterDoctypePublicIdentifierState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.betweenDoctypePublicAndSystemIdentifiersState - elif data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == '"': - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierDoubleQuotedState - elif data == "'": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierSingleQuotedState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - return True - - def betweenDoctypePublicAndSystemIdentifiersState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == '"': - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierDoubleQuotedState - elif data == "'": - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierSingleQuotedState - elif data == EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - return True - - def afterDoctypeSystemKeywordState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeDoctypeSystemIdentifierState - elif data in ("'", '"'): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.stream.unget(data) - self.state = self.beforeDoctypeSystemIdentifierState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.stream.unget(data) - self.state = self.beforeDoctypeSystemIdentifierState - return True - - def beforeDoctypeSystemIdentifierState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == "\"": - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierDoubleQuotedState - elif data == "'": - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierSingleQuotedState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - return True - - def doctypeSystemIdentifierDoubleQuotedState(self): - data = self.stream.char() - if data == "\"": - self.state = self.afterDoctypeSystemIdentifierState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["systemId"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["systemId"] += data - return True - - def doctypeSystemIdentifierSingleQuotedState(self): - data = self.stream.char() - if data == "'": - self.state = self.afterDoctypeSystemIdentifierState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["systemId"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["systemId"] += data - return True - - def afterDoctypeSystemIdentifierState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.state = self.bogusDoctypeState - return True - - def bogusDoctypeState(self): - data = self.stream.char() - if data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - # XXX EMIT - self.stream.unget(data) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - pass - return True - - def cdataSectionState(self): - data = [] - while True: - data.append(self.stream.charsUntil("]")) - data.append(self.stream.charsUntil(">")) - char = self.stream.char() - if char == EOF: - break - else: - assert char == ">" - if data[-1][-2:] == "]]": - data[-1] = data[-1][:-2] - break - else: - data.append(char) - - data = "".join(data) # pylint:disable=redefined-variable-type - # Deal with null here rather than in the parser - nullCount = data.count("\u0000") - if nullCount > 0: - for _ in range(nullCount): - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - data = data.replace("\u0000", "\uFFFD") - if data: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": data}) - self.state = self.dataState - return True diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__init__.py deleted file mode 100644 index a5ba4bf..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from .py import Trie as PyTrie - -Trie = PyTrie - -# pylint:disable=wrong-import-position -try: - from .datrie import Trie as DATrie -except ImportError: - pass -else: - Trie = DATrie -# pylint:enable=wrong-import-position diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 5e97319080de6c01b8e82ce3c133524b597cbd20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444 zcmYjN%TB}~6ur=gwdyzvf52rIEgEB@i7}d}(Ty=aqIMyvf-_`jA(T#17ygfb;x}~b z%3pA!Fe@+NT+X?0IdHeOmV%4V-|T4<0epG#KN3fd+-$EMFknbRjY?GG64yZ)AYhmU zGOVLAM!@4TdK)j4C8s0^?xEQTfiKTebB@4|M`+>);7J*=@CLHz+x3Mk7}l%jR>{tC zDr&8a9TFzyq7|wc#$6*`6ysD1%S|QQZ|4*;G=#TC@XIV6Qc7Pt+Zj%&!LDWk521qr z>)ym}QN~xj-(JS7vWt9j?D?>AvAFNl7-c@d`0rT2&pVl_niDhSmN&|fGbyybCa*r3 zd{VjEoHuhK#WT^povLQ1*dwj;nCt3gR!w+Iw9xtXez8^T<hpm|f=?!1B-9;cuIbd) pa@TjD-V~u!G{RC^=zd5JYQ;Lq5B+P~k%JAqio*b-F&d#5{{csOc1{2Q diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-38.pyc deleted file mode 100644 index af7bbae4691ff1c94e6962af1051c5859e58513b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1549 zcmZ`(Pj4GV6n`_jw%3jmsw64|wNV5Y_7HDSsZ>xDfhgsG@PUNON@cX!8QZIjy_=bF zXw2q<gW5BnAmP?;!e`hkr+x)4@ZLJD99mYIH?uSE&HMe{pZRfhwFCJ5`A_)MA0EJ8 z^t1f=`12(W`xy!el4%&Tn2mYN$6o9)+T+?EH{u3^Z$Wy}zXa*4#@vgWvT+Du^A%b` z=vD6}$2Qkfr$ja`a^tE%W@nkr@=0}PI?2*pDxou{OrmYbs@C^OQDl>0O6JQSL88xo zfkHvdB*a{@*pn;IVZdq#?bw$M*}R0fAzL!QxhdPSgLCUS_z(vOtXug<CR4NfUmaU# zlGN=SCsysGI<a<VkeeNcr?#K++S@{4h~V|Gd-&tPu@dI|ieJM8e}UmR3Cy<hN<L?Y zP~%~eUj`+A473w^{gf?TNS8NoY~ZjTq8LF5PuDM4$*$l9Tr=aB?00_ZAHqw(sC2AL zjI%#yZWQv0_x39G>?Nz3g;9g-nQ7q-fBzDV^0A7{NI5mhP4q-(Me##4pvmkG6FfUp zle0)?$5C<aM)~AH?@?qi^t(lpo+LwMqarJIKmEM7*L$#Aoa1p%4TrQD2{e^>>Bx=s zL%Kmwm?A;3>lNo!d*3RT=Huev4pC~NXaa{0%<fUNdnfAL_V#t2VwMkjZ<Is7YS?L^ zj3JB4C$-AMtFUl<tMtHhao^CLNVhFSohBj73T>~xK5OH`1}K29@qh(<)_&vltwd5G zeN6@*p(x=BuHi8}-Mru>zry%q>;tTCOxkH6d7ZkWCn2vf81fN%W*w&*S>++(I{XVk zh^oy|Vg)e~lrOQ!5t%F?vM%co#H||QyLA5_@)6!rV&$DQO}9jd4uN7NvN@CNeXK_$ z@(B{b-YEGB{KmJCAnI-}?{Hv%<hC8^&DpQ0izIpf71bw(y<w8cP*t8*lPdU5oquCY zZf<dA*?$?Y=^SmWyWzS;Tq$wD0_O9(Y@KcL*+$Lxw&q(*smto*+{FbYhY~`mDUs0@ z3@9P2A2M?f&zDifExptXOWD}C?NMO8k3U9ZTR$k6irEM609LD!r*;(xF~Q~$qUs1S z&gE3ox+}!#G|@LFEg@u{VqH?D8p2)!H1}~;t=^Pvs<cKGYSx9I?q3w~qF)dcJ<Alc zwRX@7I(1j{!xniSOx@I=XG3p?p*R_0P_3l7)+%-Qpjtz3N^P{{rS?}BX0X42e?Y0O J`ET;B_b*cAVJ-jw diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-38.pyc deleted file mode 100644 index 7b1370b3a57fb2eed879d0b20f439551f7772b14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2056 zcmbVNTW=dh6rS0e*N)@3Ns1D#0gC8?VuLCqkSf&B0zyK5XbKM&Fxq$~_9lDF%sAB1 z`lZRQ;3;{`KjAmbD^L9kyudkYJ9SbEq>MFZX3v>9-?@%|T3)UZ7=Qi~{Pu@K$Y1y| zKY&Lb!Bjs2;e^weB(zHtt7|28*QUs`VkdFCUb(m9O5%5Y*gL?l0>4Jd_k_FLJ0si^ zwNtz6^2#m={Fk7S1h!cT_f!@SwO~<_XHpxVN5_$hveYz(Y1GTOU~!~{3}Y2g<2;j* zfVHZ{bItT97cVI&>Y=vzVZ+BGnCfRBf^;b-U5it0osq81ZSKJ8Ozc97xDVeRuksqK z6~4~veEE!aecs?Jz^U>kzXNNHuktlmm-rI+a96sZyk`NK4G%WRd<;_^0MX=>jIDy6 z(+l#1{QAk*)>dI_`_xkRw8QBseL)KwB#p6CSm$oxTu@4m?jJR@$F1{9VO_wPf-oO+ zR7)MJzgS~?>=tf84*bG?NRFOz0_NDAlZ~A?-Z~T`wUrE&-r5seO3NtiD?@^sv6axq zL9wYpgj1!%v?nCmY^u*7l;293Nn?kc8}G>uM%p+BS(F-=@lc1xg*+rG@QkBGyl<Qd zvo{E(GB)Tn4(^S69L7U&N#q7-{<~-ovP87yKxmO>vi)5g<@wY0J}z>*AA;;yq{r<z z+H2<{J;>4rtuNaOptkd{cNq4CYUfeD{rOj|&sq<*^AU(!qTfemo558MN(VZLzd#KP z{1t6543<_tGCpHb8fnI`(A6psLOoiiHR{8!VKr%!o-CuQt=Y+I3B}~%EE9@43P{EQ zIrMhPCGA{N*#zFDB~i1yiv*pXkWJW`I%B;o)ggqNu{VID%6g$Ecc!4Pq&=+U*}(lZ zU`+rRYGIeiw?GzH#*Rfg!KV}a8_*TT-~?l6#|*VTMJ)xd0V3#?r&zi#pl@b?)U0(f z{X>$+A`z(;yet>F1$S;bjZue|W$f)a=&LA~lK+V^#JHfFGi-@^<U0$HmKf^`jdjV` zdvjpTsh?NE&TD}9M3m0fVS`CMrv<%u72h(n5_3Myukmsz_M_)Fye*G>Fo#_&v9Zr? zhiTRap<;NS{T}H7o1%UM5I3Pe1|ITf>D?@$7hS)lDUCQwp#$}Q8F3#Bz&SHwtu*5L z#aqI!UDtwDmB>Yb2mt@nIU6<>*ihaMXeX%Svyj5e!<eZtmSlVw;~skTXc)#5iF^~( z$#;>wkK{un_mE&oNQ}HhuO&jy<)v&wY`OB^p$ePw*@5S#?%R`Jtz1iaCs;xg_J?{X z!32pdFR?Nu{`VSh@{*NDWdk`Y@a(mw&t6MGF_zD_%l1MgOl9Yr$LRPXbBzCR;^^1d P<;n-LZq;ess@wkpRqVd* diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-38.pyc deleted file mode 100644 index f3e51352c3a2688f1e1e8c24f65c096d3593fe97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2280 zcmb7F&2Jk;6rY*>@Y-=ww^V6^pcn)~3yNJ-Q9!DymX9K#DhC=ktbozRGqE>W@47SN zl0@qZ?%#o$W3T)b{0(#E)Dw3u@ZPMQ#-S2oEx(!f=FNLEzxOfUt*^HTe82x4|MX`_ z$REg@|9oKX!CyZFB8Z?l8PkN0S;EF%;!%{b+#d%?;O1T)jvGk>=DrB>XxvO%lzdG@ zC>l?RXvo&wOPV5jMB?TPut;LhUP||LnNN-6*?3YaV<VA0$#hm0wlgiVK`A89Gb2@+ z>zLZ6kw=D`<B0@jZ7<VuV0bR~%?pb5sP%VMCI@Kz{O1945B~ZA5J?g$NWuga>?uh+ z;Rzo`II;*~3`9djFovQjS}-<5N3_NIQ<_9#LtFw$Q>?)iE~^NP4H%H+hjYa23;64A zfEd6GomBK0Jtbd~Ih|8|!!Y5^=`XaR72%%o>(x1Of$)KbA~1~#boUu>ks#nM+!^2% zm*3Kr27$f~q#{3dX4HTyL+9*!Ldj!>8=upinAsLUT4<9N1E~Vg1`+GswDjmXQR~3} zb<`h~W7$_DX=G8V{)0T5Oup^!<Dj;ODXcw_#gl%X?e!<eW>glpdY|?+L}q)E4i3|y z)cr{|+5YIW-p$^v?a47L_vCPh!aj$s0*sE#IR6+ea05{SJH5%VZQdEmLLN=j-8H-m z;^z}aPP!P$9_Lw+8P0om@^Sz<aJP4+escYOo_7!BvF?ti+I071SA*SRs4Y=09h%ll z^W6HVW1G8>HD4)JDjRT-n$(6G5>5(WYXv??2O|kKte4BewrhS;W`)rJn6G8NZ++bA zFssQ1oYzLnV`4q&HV{HLX~aUhK|^}7zH*g+r3}W>r3~)Iq&Ogl;Ul7&z&@wyDh^D& z4ukdJq!*pHIUkgTNg=?TzXn>`<s?11ym0$+btQ!mq7~PWJmdhfZs9s+3KOgLPo4jZ zt{WVRui$+1oY(fkt6TV=4y})+?mViu(KqJi1)M>F^R06Z&(L)%|A8)GThT433x}?H z6YbwPbK=~&h^}!ylm<>S=KPIw&N_?Roh|OHIBb9_)|U(CZ!oE#)f`586GnQ-V1xtc zu5m#|q@nhq#t*zxsvg4V|G;K!=9vKXAQf2U&3&KD{8><RmeM(^B~a*O7FNCqQF{*d zm8l?c+}>b|fMp7Hf33o2jiv0AQc?wieL`lzV^epa%C7>~X?)xrdpoKFCs%lvI8qo} z>uG6h3mS+r`sd7y)HT$=C@6S1h)WbGHX-6hov7hN$^Goevb?lxl-a=TwKP*#P=7V9 zPWBeaHHHF9r^VW|MK@W;m5|Rmv;(pb{wGZr0j$^+<Pr5V<OMLxLQ)%|#u+hZfX8hZ zy#>zDZ4ZJa&NIJgLpOGkIh*+lWCMrnu3!$?pz;A(=-sDa6|mZU09VEmRqrFYfD3}> zz=?ypfMOJUfaF6Y+elWyuvbT^b{&Z$(!2)pHYjR@jsPycL+1)>vkjP^Y&k?;wJV0^ z-@@)xKm+I8wm2V`Vw&R|+Q#E)n%64|b6j<iyo2OjB<~?{;p*Y+<uTn1%fvl_*rqgc z5sjLWSN~eq+}cjOhEDgVW~#uc!hWOhHCEW??Im~}dW+Ygr?VsXHrcR#*Ii~M0pClt hbjFg#{m;L^yT0luHo8+^?Jo8;jc@Z++6IW)-ai*Y?5zL* diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/_base.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/_base.py deleted file mode 100644 index a1158bb..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/_base.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from collections import Mapping - - -class Trie(Mapping): - """Abstract base class for tries""" - - def keys(self, prefix=None): - # pylint:disable=arguments-differ - keys = super(Trie, self).keys() - - if prefix is None: - return set(keys) - - return {x for x in keys if x.startswith(prefix)} - - def has_keys_with_prefix(self, prefix): - for key in self.keys(): - if key.startswith(prefix): - return True - - return False - - def longest_prefix(self, prefix): - if prefix in self: - return prefix - - for i in range(1, len(prefix) + 1): - if prefix[:-i] in self: - return prefix[:-i] - - raise KeyError(prefix) - - def longest_prefix_item(self, prefix): - lprefix = self.longest_prefix(prefix) - return (lprefix, self[lprefix]) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/datrie.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/datrie.py deleted file mode 100644 index e2e5f86..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/datrie.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from datrie import Trie as DATrie -from pip._vendor.six import text_type - -from ._base import Trie as ABCTrie - - -class Trie(ABCTrie): - def __init__(self, data): - chars = set() - for key in data.keys(): - if not isinstance(key, text_type): - raise TypeError("All keys must be strings") - for char in key: - chars.add(char) - - self._data = DATrie("".join(chars)) - for key, value in data.items(): - self._data[key] = value - - def __contains__(self, key): - return key in self._data - - def __len__(self): - return len(self._data) - - def __iter__(self): - raise NotImplementedError() - - def __getitem__(self, key): - return self._data[key] - - def keys(self, prefix=None): - return self._data.keys(prefix) - - def has_keys_with_prefix(self, prefix): - return self._data.has_keys_with_prefix(prefix) - - def longest_prefix(self, prefix): - return self._data.longest_prefix(prefix) - - def longest_prefix_item(self, prefix): - return self._data.longest_prefix_item(prefix) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/py.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/py.py deleted file mode 100644 index c178b21..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/py.py +++ /dev/null @@ -1,67 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import text_type - -from bisect import bisect_left - -from ._base import Trie as ABCTrie - - -class Trie(ABCTrie): - def __init__(self, data): - if not all(isinstance(x, text_type) for x in data.keys()): - raise TypeError("All keys must be strings") - - self._data = data - self._keys = sorted(data.keys()) - self._cachestr = "" - self._cachepoints = (0, len(data)) - - def __contains__(self, key): - return key in self._data - - def __len__(self): - return len(self._data) - - def __iter__(self): - return iter(self._data) - - def __getitem__(self, key): - return self._data[key] - - def keys(self, prefix=None): - if prefix is None or prefix == "" or not self._keys: - return set(self._keys) - - if prefix.startswith(self._cachestr): - lo, hi = self._cachepoints - start = i = bisect_left(self._keys, prefix, lo, hi) - else: - start = i = bisect_left(self._keys, prefix) - - keys = set() - if start == len(self._keys): - return keys - - while self._keys[i].startswith(prefix): - keys.add(self._keys[i]) - i += 1 - - self._cachestr = prefix - self._cachepoints = (start, i) - - return keys - - def has_keys_with_prefix(self, prefix): - if prefix in self._data: - return True - - if prefix.startswith(self._cachestr): - lo, hi = self._cachepoints - i = bisect_left(self._keys, prefix, lo, hi) - else: - i = bisect_left(self._keys, prefix) - - if i == len(self._keys): - return False - - return self._keys[i].startswith(prefix) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_utils.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_utils.py deleted file mode 100644 index 0703afb..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_utils.py +++ /dev/null @@ -1,124 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from types import ModuleType - -from pip._vendor.six import text_type - -try: - import xml.etree.cElementTree as default_etree -except ImportError: - import xml.etree.ElementTree as default_etree - - -__all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair", - "surrogatePairToCodepoint", "moduleFactoryFactory", - "supports_lone_surrogates"] - - -# Platforms not supporting lone surrogates (\uD800-\uDFFF) should be -# caught by the below test. In general this would be any platform -# using UTF-16 as its encoding of unicode strings, such as -# Jython. This is because UTF-16 itself is based on the use of such -# surrogates, and there is no mechanism to further escape such -# escapes. -try: - _x = eval('"\\uD800"') # pylint:disable=eval-used - if not isinstance(_x, text_type): - # We need this with u"" because of http://bugs.jython.org/issue2039 - _x = eval('u"\\uD800"') # pylint:disable=eval-used - assert isinstance(_x, text_type) -except: # pylint:disable=bare-except - supports_lone_surrogates = False -else: - supports_lone_surrogates = True - - -class MethodDispatcher(dict): - """Dict with 2 special properties: - - On initiation, keys that are lists, sets or tuples are converted to - multiple keys so accessing any one of the items in the original - list-like object returns the matching value - - md = MethodDispatcher({("foo", "bar"):"baz"}) - md["foo"] == "baz" - - A default value which can be set through the default attribute. - """ - - def __init__(self, items=()): - # Using _dictEntries instead of directly assigning to self is about - # twice as fast. Please do careful performance testing before changing - # anything here. - _dictEntries = [] - for name, value in items: - if isinstance(name, (list, tuple, frozenset, set)): - for item in name: - _dictEntries.append((item, value)) - else: - _dictEntries.append((name, value)) - dict.__init__(self, _dictEntries) - assert len(self) == len(_dictEntries) - self.default = None - - def __getitem__(self, key): - return dict.get(self, key, self.default) - - -# Some utility functions to deal with weirdness around UCS2 vs UCS4 -# python builds - -def isSurrogatePair(data): - return (len(data) == 2 and - ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and - ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF) - - -def surrogatePairToCodepoint(data): - char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 + - (ord(data[1]) - 0xDC00)) - return char_val - -# Module Factory Factory (no, this isn't Java, I know) -# Here to stop this being duplicated all over the place. - - -def moduleFactoryFactory(factory): - moduleCache = {} - - def moduleFactory(baseModule, *args, **kwargs): - if isinstance(ModuleType.__name__, type("")): - name = "_%s_factory" % baseModule.__name__ - else: - name = b"_%s_factory" % baseModule.__name__ - - kwargs_tuple = tuple(kwargs.items()) - - try: - return moduleCache[name][args][kwargs_tuple] - except KeyError: - mod = ModuleType(name) - objs = factory(baseModule, *args, **kwargs) - mod.__dict__.update(objs) - if "name" not in moduleCache: - moduleCache[name] = {} - if "args" not in moduleCache[name]: - moduleCache[name][args] = {} - if "kwargs" not in moduleCache[name][args]: - moduleCache[name][args][kwargs_tuple] = {} - moduleCache[name][args][kwargs_tuple] = mod - return mod - - return moduleFactory - - -def memoize(func): - cache = {} - - def wrapped(*args, **kwargs): - key = (tuple(args), tuple(kwargs.items())) - if key not in cache: - cache[key] = func(*args, **kwargs) - return cache[key] - - return wrapped diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/constants.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/constants.py deleted file mode 100644 index 1ff8041..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/constants.py +++ /dev/null @@ -1,2947 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import string - -EOF = None - -E = { - "null-character": - "Null character in input stream, replaced with U+FFFD.", - "invalid-codepoint": - "Invalid codepoint in stream.", - "incorrectly-placed-solidus": - "Solidus (/) incorrectly placed in tag.", - "incorrect-cr-newline-entity": - "Incorrect CR newline entity, replaced with LF.", - "illegal-windows-1252-entity": - "Entity used with illegal number (windows-1252 reference).", - "cant-convert-numeric-entity": - "Numeric entity couldn't be converted to character " - "(codepoint U+%(charAsInt)08x).", - "illegal-codepoint-for-numeric-entity": - "Numeric entity represents an illegal codepoint: " - "U+%(charAsInt)08x.", - "numeric-entity-without-semicolon": - "Numeric entity didn't end with ';'.", - "expected-numeric-entity-but-got-eof": - "Numeric entity expected. Got end of file instead.", - "expected-numeric-entity": - "Numeric entity expected but none found.", - "named-entity-without-semicolon": - "Named entity didn't end with ';'.", - "expected-named-entity": - "Named entity expected. Got none.", - "attributes-in-end-tag": - "End tag contains unexpected attributes.", - 'self-closing-flag-on-end-tag': - "End tag contains unexpected self-closing flag.", - "expected-tag-name-but-got-right-bracket": - "Expected tag name. Got '>' instead.", - "expected-tag-name-but-got-question-mark": - "Expected tag name. Got '?' instead. (HTML doesn't " - "support processing instructions.)", - "expected-tag-name": - "Expected tag name. Got something else instead", - "expected-closing-tag-but-got-right-bracket": - "Expected closing tag. Got '>' instead. Ignoring '</>'.", - "expected-closing-tag-but-got-eof": - "Expected closing tag. Unexpected end of file.", - "expected-closing-tag-but-got-char": - "Expected closing tag. Unexpected character '%(data)s' found.", - "eof-in-tag-name": - "Unexpected end of file in the tag name.", - "expected-attribute-name-but-got-eof": - "Unexpected end of file. Expected attribute name instead.", - "eof-in-attribute-name": - "Unexpected end of file in attribute name.", - "invalid-character-in-attribute-name": - "Invalid character in attribute name", - "duplicate-attribute": - "Dropped duplicate attribute on tag.", - "expected-end-of-tag-name-but-got-eof": - "Unexpected end of file. Expected = or end of tag.", - "expected-attribute-value-but-got-eof": - "Unexpected end of file. Expected attribute value.", - "expected-attribute-value-but-got-right-bracket": - "Expected attribute value. Got '>' instead.", - 'equals-in-unquoted-attribute-value': - "Unexpected = in unquoted attribute", - 'unexpected-character-in-unquoted-attribute-value': - "Unexpected character in unquoted attribute", - "invalid-character-after-attribute-name": - "Unexpected character after attribute name.", - "unexpected-character-after-attribute-value": - "Unexpected character after attribute value.", - "eof-in-attribute-value-double-quote": - "Unexpected end of file in attribute value (\").", - "eof-in-attribute-value-single-quote": - "Unexpected end of file in attribute value (').", - "eof-in-attribute-value-no-quotes": - "Unexpected end of file in attribute value.", - "unexpected-EOF-after-solidus-in-tag": - "Unexpected end of file in tag. Expected >", - "unexpected-character-after-solidus-in-tag": - "Unexpected character after / in tag. Expected >", - "expected-dashes-or-doctype": - "Expected '--' or 'DOCTYPE'. Not found.", - "unexpected-bang-after-double-dash-in-comment": - "Unexpected ! after -- in comment", - "unexpected-space-after-double-dash-in-comment": - "Unexpected space after -- in comment", - "incorrect-comment": - "Incorrect comment.", - "eof-in-comment": - "Unexpected end of file in comment.", - "eof-in-comment-end-dash": - "Unexpected end of file in comment (-)", - "unexpected-dash-after-double-dash-in-comment": - "Unexpected '-' after '--' found in comment.", - "eof-in-comment-double-dash": - "Unexpected end of file in comment (--).", - "eof-in-comment-end-space-state": - "Unexpected end of file in comment.", - "eof-in-comment-end-bang-state": - "Unexpected end of file in comment.", - "unexpected-char-in-comment": - "Unexpected character in comment found.", - "need-space-after-doctype": - "No space after literal string 'DOCTYPE'.", - "expected-doctype-name-but-got-right-bracket": - "Unexpected > character. Expected DOCTYPE name.", - "expected-doctype-name-but-got-eof": - "Unexpected end of file. Expected DOCTYPE name.", - "eof-in-doctype-name": - "Unexpected end of file in DOCTYPE name.", - "eof-in-doctype": - "Unexpected end of file in DOCTYPE.", - "expected-space-or-right-bracket-in-doctype": - "Expected space or '>'. Got '%(data)s'", - "unexpected-end-of-doctype": - "Unexpected end of DOCTYPE.", - "unexpected-char-in-doctype": - "Unexpected character in DOCTYPE.", - "eof-in-innerhtml": - "XXX innerHTML EOF", - "unexpected-doctype": - "Unexpected DOCTYPE. Ignored.", - "non-html-root": - "html needs to be the first start tag.", - "expected-doctype-but-got-eof": - "Unexpected End of file. Expected DOCTYPE.", - "unknown-doctype": - "Erroneous DOCTYPE.", - "expected-doctype-but-got-chars": - "Unexpected non-space characters. Expected DOCTYPE.", - "expected-doctype-but-got-start-tag": - "Unexpected start tag (%(name)s). Expected DOCTYPE.", - "expected-doctype-but-got-end-tag": - "Unexpected end tag (%(name)s). Expected DOCTYPE.", - "end-tag-after-implied-root": - "Unexpected end tag (%(name)s) after the (implied) root element.", - "expected-named-closing-tag-but-got-eof": - "Unexpected end of file. Expected end tag (%(name)s).", - "two-heads-are-not-better-than-one": - "Unexpected start tag head in existing head. Ignored.", - "unexpected-end-tag": - "Unexpected end tag (%(name)s). Ignored.", - "unexpected-start-tag-out-of-my-head": - "Unexpected start tag (%(name)s) that can be in head. Moved.", - "unexpected-start-tag": - "Unexpected start tag (%(name)s).", - "missing-end-tag": - "Missing end tag (%(name)s).", - "missing-end-tags": - "Missing end tags (%(name)s).", - "unexpected-start-tag-implies-end-tag": - "Unexpected start tag (%(startName)s) " - "implies end tag (%(endName)s).", - "unexpected-start-tag-treated-as": - "Unexpected start tag (%(originalName)s). Treated as %(newName)s.", - "deprecated-tag": - "Unexpected start tag %(name)s. Don't use it!", - "unexpected-start-tag-ignored": - "Unexpected start tag %(name)s. Ignored.", - "expected-one-end-tag-but-got-another": - "Unexpected end tag (%(gotName)s). " - "Missing end tag (%(expectedName)s).", - "end-tag-too-early": - "End tag (%(name)s) seen too early. Expected other end tag.", - "end-tag-too-early-named": - "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).", - "end-tag-too-early-ignored": - "End tag (%(name)s) seen too early. Ignored.", - "adoption-agency-1.1": - "End tag (%(name)s) violates step 1, " - "paragraph 1 of the adoption agency algorithm.", - "adoption-agency-1.2": - "End tag (%(name)s) violates step 1, " - "paragraph 2 of the adoption agency algorithm.", - "adoption-agency-1.3": - "End tag (%(name)s) violates step 1, " - "paragraph 3 of the adoption agency algorithm.", - "adoption-agency-4.4": - "End tag (%(name)s) violates step 4, " - "paragraph 4 of the adoption agency algorithm.", - "unexpected-end-tag-treated-as": - "Unexpected end tag (%(originalName)s). Treated as %(newName)s.", - "no-end-tag": - "This element (%(name)s) has no end tag.", - "unexpected-implied-end-tag-in-table": - "Unexpected implied end tag (%(name)s) in the table phase.", - "unexpected-implied-end-tag-in-table-body": - "Unexpected implied end tag (%(name)s) in the table body phase.", - "unexpected-char-implies-table-voodoo": - "Unexpected non-space characters in " - "table context caused voodoo mode.", - "unexpected-hidden-input-in-table": - "Unexpected input with type hidden in table context.", - "unexpected-form-in-table": - "Unexpected form in table context.", - "unexpected-start-tag-implies-table-voodoo": - "Unexpected start tag (%(name)s) in " - "table context caused voodoo mode.", - "unexpected-end-tag-implies-table-voodoo": - "Unexpected end tag (%(name)s) in " - "table context caused voodoo mode.", - "unexpected-cell-in-table-body": - "Unexpected table cell start tag (%(name)s) " - "in the table body phase.", - "unexpected-cell-end-tag": - "Got table cell end tag (%(name)s) " - "while required end tags are missing.", - "unexpected-end-tag-in-table-body": - "Unexpected end tag (%(name)s) in the table body phase. Ignored.", - "unexpected-implied-end-tag-in-table-row": - "Unexpected implied end tag (%(name)s) in the table row phase.", - "unexpected-end-tag-in-table-row": - "Unexpected end tag (%(name)s) in the table row phase. Ignored.", - "unexpected-select-in-select": - "Unexpected select start tag in the select phase " - "treated as select end tag.", - "unexpected-input-in-select": - "Unexpected input start tag in the select phase.", - "unexpected-start-tag-in-select": - "Unexpected start tag token (%(name)s in the select phase. " - "Ignored.", - "unexpected-end-tag-in-select": - "Unexpected end tag (%(name)s) in the select phase. Ignored.", - "unexpected-table-element-start-tag-in-select-in-table": - "Unexpected table element start tag (%(name)s) in the select in table phase.", - "unexpected-table-element-end-tag-in-select-in-table": - "Unexpected table element end tag (%(name)s) in the select in table phase.", - "unexpected-char-after-body": - "Unexpected non-space characters in the after body phase.", - "unexpected-start-tag-after-body": - "Unexpected start tag token (%(name)s)" - " in the after body phase.", - "unexpected-end-tag-after-body": - "Unexpected end tag token (%(name)s)" - " in the after body phase.", - "unexpected-char-in-frameset": - "Unexpected characters in the frameset phase. Characters ignored.", - "unexpected-start-tag-in-frameset": - "Unexpected start tag token (%(name)s)" - " in the frameset phase. Ignored.", - "unexpected-frameset-in-frameset-innerhtml": - "Unexpected end tag token (frameset) " - "in the frameset phase (innerHTML).", - "unexpected-end-tag-in-frameset": - "Unexpected end tag token (%(name)s)" - " in the frameset phase. Ignored.", - "unexpected-char-after-frameset": - "Unexpected non-space characters in the " - "after frameset phase. Ignored.", - "unexpected-start-tag-after-frameset": - "Unexpected start tag (%(name)s)" - " in the after frameset phase. Ignored.", - "unexpected-end-tag-after-frameset": - "Unexpected end tag (%(name)s)" - " in the after frameset phase. Ignored.", - "unexpected-end-tag-after-body-innerhtml": - "Unexpected end tag after body(innerHtml)", - "expected-eof-but-got-char": - "Unexpected non-space characters. Expected end of file.", - "expected-eof-but-got-start-tag": - "Unexpected start tag (%(name)s)" - ". Expected end of file.", - "expected-eof-but-got-end-tag": - "Unexpected end tag (%(name)s)" - ". Expected end of file.", - "eof-in-table": - "Unexpected end of file. Expected table content.", - "eof-in-select": - "Unexpected end of file. Expected select content.", - "eof-in-frameset": - "Unexpected end of file. Expected frameset content.", - "eof-in-script-in-script": - "Unexpected end of file. Expected script content.", - "eof-in-foreign-lands": - "Unexpected end of file. Expected foreign content", - "non-void-element-with-trailing-solidus": - "Trailing solidus not allowed on element %(name)s", - "unexpected-html-element-in-foreign-content": - "Element %(name)s not allowed in a non-html context", - "unexpected-end-tag-before-html": - "Unexpected end tag (%(name)s) before html.", - "unexpected-inhead-noscript-tag": - "Element %(name)s not allowed in a inhead-noscript context", - "eof-in-head-noscript": - "Unexpected end of file. Expected inhead-noscript content", - "char-in-head-noscript": - "Unexpected non-space character. Expected inhead-noscript content", - "XXX-undefined-error": - "Undefined error (this sucks and should be fixed)", -} - -namespaces = { - "html": "http://www.w3.org/1999/xhtml", - "mathml": "http://www.w3.org/1998/Math/MathML", - "svg": "http://www.w3.org/2000/svg", - "xlink": "http://www.w3.org/1999/xlink", - "xml": "http://www.w3.org/XML/1998/namespace", - "xmlns": "http://www.w3.org/2000/xmlns/" -} - -scopingElements = frozenset([ - (namespaces["html"], "applet"), - (namespaces["html"], "caption"), - (namespaces["html"], "html"), - (namespaces["html"], "marquee"), - (namespaces["html"], "object"), - (namespaces["html"], "table"), - (namespaces["html"], "td"), - (namespaces["html"], "th"), - (namespaces["mathml"], "mi"), - (namespaces["mathml"], "mo"), - (namespaces["mathml"], "mn"), - (namespaces["mathml"], "ms"), - (namespaces["mathml"], "mtext"), - (namespaces["mathml"], "annotation-xml"), - (namespaces["svg"], "foreignObject"), - (namespaces["svg"], "desc"), - (namespaces["svg"], "title"), -]) - -formattingElements = frozenset([ - (namespaces["html"], "a"), - (namespaces["html"], "b"), - (namespaces["html"], "big"), - (namespaces["html"], "code"), - (namespaces["html"], "em"), - (namespaces["html"], "font"), - (namespaces["html"], "i"), - (namespaces["html"], "nobr"), - (namespaces["html"], "s"), - (namespaces["html"], "small"), - (namespaces["html"], "strike"), - (namespaces["html"], "strong"), - (namespaces["html"], "tt"), - (namespaces["html"], "u") -]) - -specialElements = frozenset([ - (namespaces["html"], "address"), - (namespaces["html"], "applet"), - (namespaces["html"], "area"), - (namespaces["html"], "article"), - (namespaces["html"], "aside"), - (namespaces["html"], "base"), - (namespaces["html"], "basefont"), - (namespaces["html"], "bgsound"), - (namespaces["html"], "blockquote"), - (namespaces["html"], "body"), - (namespaces["html"], "br"), - (namespaces["html"], "button"), - (namespaces["html"], "caption"), - (namespaces["html"], "center"), - (namespaces["html"], "col"), - (namespaces["html"], "colgroup"), - (namespaces["html"], "command"), - (namespaces["html"], "dd"), - (namespaces["html"], "details"), - (namespaces["html"], "dir"), - (namespaces["html"], "div"), - (namespaces["html"], "dl"), - (namespaces["html"], "dt"), - (namespaces["html"], "embed"), - (namespaces["html"], "fieldset"), - (namespaces["html"], "figure"), - (namespaces["html"], "footer"), - (namespaces["html"], "form"), - (namespaces["html"], "frame"), - (namespaces["html"], "frameset"), - (namespaces["html"], "h1"), - (namespaces["html"], "h2"), - (namespaces["html"], "h3"), - (namespaces["html"], "h4"), - (namespaces["html"], "h5"), - (namespaces["html"], "h6"), - (namespaces["html"], "head"), - (namespaces["html"], "header"), - (namespaces["html"], "hr"), - (namespaces["html"], "html"), - (namespaces["html"], "iframe"), - # Note that image is commented out in the spec as "this isn't an - # element that can end up on the stack, so it doesn't matter," - (namespaces["html"], "image"), - (namespaces["html"], "img"), - (namespaces["html"], "input"), - (namespaces["html"], "isindex"), - (namespaces["html"], "li"), - (namespaces["html"], "link"), - (namespaces["html"], "listing"), - (namespaces["html"], "marquee"), - (namespaces["html"], "menu"), - (namespaces["html"], "meta"), - (namespaces["html"], "nav"), - (namespaces["html"], "noembed"), - (namespaces["html"], "noframes"), - (namespaces["html"], "noscript"), - (namespaces["html"], "object"), - (namespaces["html"], "ol"), - (namespaces["html"], "p"), - (namespaces["html"], "param"), - (namespaces["html"], "plaintext"), - (namespaces["html"], "pre"), - (namespaces["html"], "script"), - (namespaces["html"], "section"), - (namespaces["html"], "select"), - (namespaces["html"], "style"), - (namespaces["html"], "table"), - (namespaces["html"], "tbody"), - (namespaces["html"], "td"), - (namespaces["html"], "textarea"), - (namespaces["html"], "tfoot"), - (namespaces["html"], "th"), - (namespaces["html"], "thead"), - (namespaces["html"], "title"), - (namespaces["html"], "tr"), - (namespaces["html"], "ul"), - (namespaces["html"], "wbr"), - (namespaces["html"], "xmp"), - (namespaces["svg"], "foreignObject") -]) - -htmlIntegrationPointElements = frozenset([ - (namespaces["mathml"], "annotation-xml"), - (namespaces["svg"], "foreignObject"), - (namespaces["svg"], "desc"), - (namespaces["svg"], "title") -]) - -mathmlTextIntegrationPointElements = frozenset([ - (namespaces["mathml"], "mi"), - (namespaces["mathml"], "mo"), - (namespaces["mathml"], "mn"), - (namespaces["mathml"], "ms"), - (namespaces["mathml"], "mtext") -]) - -adjustSVGAttributes = { - "attributename": "attributeName", - "attributetype": "attributeType", - "basefrequency": "baseFrequency", - "baseprofile": "baseProfile", - "calcmode": "calcMode", - "clippathunits": "clipPathUnits", - "contentscripttype": "contentScriptType", - "contentstyletype": "contentStyleType", - "diffuseconstant": "diffuseConstant", - "edgemode": "edgeMode", - "externalresourcesrequired": "externalResourcesRequired", - "filterres": "filterRes", - "filterunits": "filterUnits", - "glyphref": "glyphRef", - "gradienttransform": "gradientTransform", - "gradientunits": "gradientUnits", - "kernelmatrix": "kernelMatrix", - "kernelunitlength": "kernelUnitLength", - "keypoints": "keyPoints", - "keysplines": "keySplines", - "keytimes": "keyTimes", - "lengthadjust": "lengthAdjust", - "limitingconeangle": "limitingConeAngle", - "markerheight": "markerHeight", - "markerunits": "markerUnits", - "markerwidth": "markerWidth", - "maskcontentunits": "maskContentUnits", - "maskunits": "maskUnits", - "numoctaves": "numOctaves", - "pathlength": "pathLength", - "patterncontentunits": "patternContentUnits", - "patterntransform": "patternTransform", - "patternunits": "patternUnits", - "pointsatx": "pointsAtX", - "pointsaty": "pointsAtY", - "pointsatz": "pointsAtZ", - "preservealpha": "preserveAlpha", - "preserveaspectratio": "preserveAspectRatio", - "primitiveunits": "primitiveUnits", - "refx": "refX", - "refy": "refY", - "repeatcount": "repeatCount", - "repeatdur": "repeatDur", - "requiredextensions": "requiredExtensions", - "requiredfeatures": "requiredFeatures", - "specularconstant": "specularConstant", - "specularexponent": "specularExponent", - "spreadmethod": "spreadMethod", - "startoffset": "startOffset", - "stddeviation": "stdDeviation", - "stitchtiles": "stitchTiles", - "surfacescale": "surfaceScale", - "systemlanguage": "systemLanguage", - "tablevalues": "tableValues", - "targetx": "targetX", - "targety": "targetY", - "textlength": "textLength", - "viewbox": "viewBox", - "viewtarget": "viewTarget", - "xchannelselector": "xChannelSelector", - "ychannelselector": "yChannelSelector", - "zoomandpan": "zoomAndPan" -} - -adjustMathMLAttributes = {"definitionurl": "definitionURL"} - -adjustForeignAttributes = { - "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]), - "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]), - "xlink:href": ("xlink", "href", namespaces["xlink"]), - "xlink:role": ("xlink", "role", namespaces["xlink"]), - "xlink:show": ("xlink", "show", namespaces["xlink"]), - "xlink:title": ("xlink", "title", namespaces["xlink"]), - "xlink:type": ("xlink", "type", namespaces["xlink"]), - "xml:base": ("xml", "base", namespaces["xml"]), - "xml:lang": ("xml", "lang", namespaces["xml"]), - "xml:space": ("xml", "space", namespaces["xml"]), - "xmlns": (None, "xmlns", namespaces["xmlns"]), - "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"]) -} - -unadjustForeignAttributes = dict([((ns, local), qname) for qname, (prefix, local, ns) in - adjustForeignAttributes.items()]) - -spaceCharacters = frozenset([ - "\t", - "\n", - "\u000C", - " ", - "\r" -]) - -tableInsertModeElements = frozenset([ - "table", - "tbody", - "tfoot", - "thead", - "tr" -]) - -asciiLowercase = frozenset(string.ascii_lowercase) -asciiUppercase = frozenset(string.ascii_uppercase) -asciiLetters = frozenset(string.ascii_letters) -digits = frozenset(string.digits) -hexDigits = frozenset(string.hexdigits) - -asciiUpper2Lower = dict([(ord(c), ord(c.lower())) - for c in string.ascii_uppercase]) - -# Heading elements need to be ordered -headingElements = ( - "h1", - "h2", - "h3", - "h4", - "h5", - "h6" -) - -voidElements = frozenset([ - "base", - "command", - "event-source", - "link", - "meta", - "hr", - "br", - "img", - "embed", - "param", - "area", - "col", - "input", - "source", - "track" -]) - -cdataElements = frozenset(['title', 'textarea']) - -rcdataElements = frozenset([ - 'style', - 'script', - 'xmp', - 'iframe', - 'noembed', - 'noframes', - 'noscript' -]) - -booleanAttributes = { - "": frozenset(["irrelevant", "itemscope"]), - "style": frozenset(["scoped"]), - "img": frozenset(["ismap"]), - "audio": frozenset(["autoplay", "controls"]), - "video": frozenset(["autoplay", "controls"]), - "script": frozenset(["defer", "async"]), - "details": frozenset(["open"]), - "datagrid": frozenset(["multiple", "disabled"]), - "command": frozenset(["hidden", "disabled", "checked", "default"]), - "hr": frozenset(["noshade"]), - "menu": frozenset(["autosubmit"]), - "fieldset": frozenset(["disabled", "readonly"]), - "option": frozenset(["disabled", "readonly", "selected"]), - "optgroup": frozenset(["disabled", "readonly"]), - "button": frozenset(["disabled", "autofocus"]), - "input": frozenset(["disabled", "readonly", "required", "autofocus", "checked", "ismap"]), - "select": frozenset(["disabled", "readonly", "autofocus", "multiple"]), - "output": frozenset(["disabled", "readonly"]), - "iframe": frozenset(["seamless"]), -} - -# entitiesWindows1252 has to be _ordered_ and needs to have an index. It -# therefore can't be a frozenset. -entitiesWindows1252 = ( - 8364, # 0x80 0x20AC EURO SIGN - 65533, # 0x81 UNDEFINED - 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK - 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK - 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK - 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS - 8224, # 0x86 0x2020 DAGGER - 8225, # 0x87 0x2021 DOUBLE DAGGER - 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT - 8240, # 0x89 0x2030 PER MILLE SIGN - 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON - 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE - 65533, # 0x8D UNDEFINED - 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON - 65533, # 0x8F UNDEFINED - 65533, # 0x90 UNDEFINED - 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK - 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK - 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK - 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK - 8226, # 0x95 0x2022 BULLET - 8211, # 0x96 0x2013 EN DASH - 8212, # 0x97 0x2014 EM DASH - 732, # 0x98 0x02DC SMALL TILDE - 8482, # 0x99 0x2122 TRADE MARK SIGN - 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON - 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE - 65533, # 0x9D UNDEFINED - 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON - 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS -) - -xmlEntities = frozenset(['lt;', 'gt;', 'amp;', 'apos;', 'quot;']) - -entities = { - "AElig": "\xc6", - "AElig;": "\xc6", - "AMP": "&", - "AMP;": "&", - "Aacute": "\xc1", - "Aacute;": "\xc1", - "Abreve;": "\u0102", - "Acirc": "\xc2", - "Acirc;": "\xc2", - "Acy;": "\u0410", - "Afr;": "\U0001d504", - "Agrave": "\xc0", - "Agrave;": "\xc0", - "Alpha;": "\u0391", - "Amacr;": "\u0100", - "And;": "\u2a53", - "Aogon;": "\u0104", - "Aopf;": "\U0001d538", - "ApplyFunction;": "\u2061", - "Aring": "\xc5", - "Aring;": "\xc5", - "Ascr;": "\U0001d49c", - "Assign;": "\u2254", - "Atilde": "\xc3", - "Atilde;": "\xc3", - "Auml": "\xc4", - "Auml;": "\xc4", - "Backslash;": "\u2216", - "Barv;": "\u2ae7", - "Barwed;": "\u2306", - "Bcy;": "\u0411", - "Because;": "\u2235", - "Bernoullis;": "\u212c", - "Beta;": "\u0392", - "Bfr;": "\U0001d505", - "Bopf;": "\U0001d539", - "Breve;": "\u02d8", - "Bscr;": "\u212c", - "Bumpeq;": "\u224e", - "CHcy;": "\u0427", - "COPY": "\xa9", - "COPY;": "\xa9", - "Cacute;": "\u0106", - "Cap;": "\u22d2", - "CapitalDifferentialD;": "\u2145", - "Cayleys;": "\u212d", - "Ccaron;": "\u010c", - "Ccedil": "\xc7", - "Ccedil;": "\xc7", - "Ccirc;": "\u0108", - "Cconint;": "\u2230", - "Cdot;": "\u010a", - "Cedilla;": "\xb8", - "CenterDot;": "\xb7", - "Cfr;": "\u212d", - "Chi;": "\u03a7", - "CircleDot;": "\u2299", - "CircleMinus;": "\u2296", - "CirclePlus;": "\u2295", - "CircleTimes;": "\u2297", - "ClockwiseContourIntegral;": "\u2232", - "CloseCurlyDoubleQuote;": "\u201d", - "CloseCurlyQuote;": "\u2019", - "Colon;": "\u2237", - "Colone;": "\u2a74", - "Congruent;": "\u2261", - "Conint;": "\u222f", - "ContourIntegral;": "\u222e", - "Copf;": "\u2102", - "Coproduct;": "\u2210", - "CounterClockwiseContourIntegral;": "\u2233", - "Cross;": "\u2a2f", - "Cscr;": "\U0001d49e", - "Cup;": "\u22d3", - "CupCap;": "\u224d", - "DD;": "\u2145", - "DDotrahd;": "\u2911", - "DJcy;": "\u0402", - "DScy;": "\u0405", - "DZcy;": "\u040f", - "Dagger;": "\u2021", - "Darr;": "\u21a1", - "Dashv;": "\u2ae4", - "Dcaron;": "\u010e", - "Dcy;": "\u0414", - "Del;": "\u2207", - "Delta;": "\u0394", - "Dfr;": "\U0001d507", - "DiacriticalAcute;": "\xb4", - "DiacriticalDot;": "\u02d9", - "DiacriticalDoubleAcute;": "\u02dd", - "DiacriticalGrave;": "`", - "DiacriticalTilde;": "\u02dc", - "Diamond;": "\u22c4", - "DifferentialD;": "\u2146", - "Dopf;": "\U0001d53b", - "Dot;": "\xa8", - "DotDot;": "\u20dc", - "DotEqual;": "\u2250", - "DoubleContourIntegral;": "\u222f", - "DoubleDot;": "\xa8", - "DoubleDownArrow;": "\u21d3", - "DoubleLeftArrow;": "\u21d0", - "DoubleLeftRightArrow;": "\u21d4", - "DoubleLeftTee;": "\u2ae4", - "DoubleLongLeftArrow;": "\u27f8", - "DoubleLongLeftRightArrow;": "\u27fa", - "DoubleLongRightArrow;": "\u27f9", - "DoubleRightArrow;": "\u21d2", - "DoubleRightTee;": "\u22a8", - "DoubleUpArrow;": "\u21d1", - "DoubleUpDownArrow;": "\u21d5", - "DoubleVerticalBar;": "\u2225", - "DownArrow;": "\u2193", - "DownArrowBar;": "\u2913", - "DownArrowUpArrow;": "\u21f5", - "DownBreve;": "\u0311", - "DownLeftRightVector;": "\u2950", - "DownLeftTeeVector;": "\u295e", - "DownLeftVector;": "\u21bd", - "DownLeftVectorBar;": "\u2956", - "DownRightTeeVector;": "\u295f", - "DownRightVector;": "\u21c1", - "DownRightVectorBar;": "\u2957", - "DownTee;": "\u22a4", - "DownTeeArrow;": "\u21a7", - "Downarrow;": "\u21d3", - "Dscr;": "\U0001d49f", - "Dstrok;": "\u0110", - "ENG;": "\u014a", - "ETH": "\xd0", - "ETH;": "\xd0", - "Eacute": "\xc9", - "Eacute;": "\xc9", - "Ecaron;": "\u011a", - "Ecirc": "\xca", - "Ecirc;": "\xca", - "Ecy;": "\u042d", - "Edot;": "\u0116", - "Efr;": "\U0001d508", - "Egrave": "\xc8", - "Egrave;": "\xc8", - "Element;": "\u2208", - "Emacr;": "\u0112", - "EmptySmallSquare;": "\u25fb", - "EmptyVerySmallSquare;": "\u25ab", - "Eogon;": "\u0118", - "Eopf;": "\U0001d53c", - "Epsilon;": "\u0395", - "Equal;": "\u2a75", - "EqualTilde;": "\u2242", - "Equilibrium;": "\u21cc", - "Escr;": "\u2130", - "Esim;": "\u2a73", - "Eta;": "\u0397", - "Euml": "\xcb", - "Euml;": "\xcb", - "Exists;": "\u2203", - "ExponentialE;": "\u2147", - "Fcy;": "\u0424", - "Ffr;": "\U0001d509", - "FilledSmallSquare;": "\u25fc", - "FilledVerySmallSquare;": "\u25aa", - "Fopf;": "\U0001d53d", - "ForAll;": "\u2200", - "Fouriertrf;": "\u2131", - "Fscr;": "\u2131", - "GJcy;": "\u0403", - "GT": ">", - "GT;": ">", - "Gamma;": "\u0393", - "Gammad;": "\u03dc", - "Gbreve;": "\u011e", - "Gcedil;": "\u0122", - "Gcirc;": "\u011c", - "Gcy;": "\u0413", - "Gdot;": "\u0120", - "Gfr;": "\U0001d50a", - "Gg;": "\u22d9", - "Gopf;": "\U0001d53e", - "GreaterEqual;": "\u2265", - "GreaterEqualLess;": "\u22db", - "GreaterFullEqual;": "\u2267", - "GreaterGreater;": "\u2aa2", - "GreaterLess;": "\u2277", - "GreaterSlantEqual;": "\u2a7e", - "GreaterTilde;": "\u2273", - "Gscr;": "\U0001d4a2", - "Gt;": "\u226b", - "HARDcy;": "\u042a", - "Hacek;": "\u02c7", - "Hat;": "^", - "Hcirc;": "\u0124", - "Hfr;": "\u210c", - "HilbertSpace;": "\u210b", - "Hopf;": "\u210d", - "HorizontalLine;": "\u2500", - "Hscr;": "\u210b", - "Hstrok;": "\u0126", - "HumpDownHump;": "\u224e", - "HumpEqual;": "\u224f", - "IEcy;": "\u0415", - "IJlig;": "\u0132", - "IOcy;": "\u0401", - "Iacute": "\xcd", - "Iacute;": "\xcd", - "Icirc": "\xce", - "Icirc;": "\xce", - "Icy;": "\u0418", - "Idot;": "\u0130", - "Ifr;": "\u2111", - "Igrave": "\xcc", - "Igrave;": "\xcc", - "Im;": "\u2111", - "Imacr;": "\u012a", - "ImaginaryI;": "\u2148", - "Implies;": "\u21d2", - "Int;": "\u222c", - "Integral;": "\u222b", - "Intersection;": "\u22c2", - "InvisibleComma;": "\u2063", - "InvisibleTimes;": "\u2062", - "Iogon;": "\u012e", - "Iopf;": "\U0001d540", - "Iota;": "\u0399", - "Iscr;": "\u2110", - "Itilde;": "\u0128", - "Iukcy;": "\u0406", - "Iuml": "\xcf", - "Iuml;": "\xcf", - "Jcirc;": "\u0134", - "Jcy;": "\u0419", - "Jfr;": "\U0001d50d", - "Jopf;": "\U0001d541", - "Jscr;": "\U0001d4a5", - "Jsercy;": "\u0408", - "Jukcy;": "\u0404", - "KHcy;": "\u0425", - "KJcy;": "\u040c", - "Kappa;": "\u039a", - "Kcedil;": "\u0136", - "Kcy;": "\u041a", - "Kfr;": "\U0001d50e", - "Kopf;": "\U0001d542", - "Kscr;": "\U0001d4a6", - "LJcy;": "\u0409", - "LT": "<", - "LT;": "<", - "Lacute;": "\u0139", - "Lambda;": "\u039b", - "Lang;": "\u27ea", - "Laplacetrf;": "\u2112", - "Larr;": "\u219e", - "Lcaron;": "\u013d", - "Lcedil;": "\u013b", - "Lcy;": "\u041b", - "LeftAngleBracket;": "\u27e8", - "LeftArrow;": "\u2190", - "LeftArrowBar;": "\u21e4", - "LeftArrowRightArrow;": "\u21c6", - "LeftCeiling;": "\u2308", - "LeftDoubleBracket;": "\u27e6", - "LeftDownTeeVector;": "\u2961", - "LeftDownVector;": "\u21c3", - "LeftDownVectorBar;": "\u2959", - "LeftFloor;": "\u230a", - "LeftRightArrow;": "\u2194", - "LeftRightVector;": "\u294e", - "LeftTee;": "\u22a3", - "LeftTeeArrow;": "\u21a4", - "LeftTeeVector;": "\u295a", - "LeftTriangle;": "\u22b2", - "LeftTriangleBar;": "\u29cf", - "LeftTriangleEqual;": "\u22b4", - "LeftUpDownVector;": "\u2951", - "LeftUpTeeVector;": "\u2960", - "LeftUpVector;": "\u21bf", - "LeftUpVectorBar;": "\u2958", - "LeftVector;": "\u21bc", - "LeftVectorBar;": "\u2952", - "Leftarrow;": "\u21d0", - "Leftrightarrow;": "\u21d4", - "LessEqualGreater;": "\u22da", - "LessFullEqual;": "\u2266", - "LessGreater;": "\u2276", - "LessLess;": "\u2aa1", - "LessSlantEqual;": "\u2a7d", - "LessTilde;": "\u2272", - "Lfr;": "\U0001d50f", - "Ll;": "\u22d8", - "Lleftarrow;": "\u21da", - "Lmidot;": "\u013f", - "LongLeftArrow;": "\u27f5", - "LongLeftRightArrow;": "\u27f7", - "LongRightArrow;": "\u27f6", - "Longleftarrow;": "\u27f8", - "Longleftrightarrow;": "\u27fa", - "Longrightarrow;": "\u27f9", - "Lopf;": "\U0001d543", - "LowerLeftArrow;": "\u2199", - "LowerRightArrow;": "\u2198", - "Lscr;": "\u2112", - "Lsh;": "\u21b0", - "Lstrok;": "\u0141", - "Lt;": "\u226a", - "Map;": "\u2905", - "Mcy;": "\u041c", - "MediumSpace;": "\u205f", - "Mellintrf;": "\u2133", - "Mfr;": "\U0001d510", - "MinusPlus;": "\u2213", - "Mopf;": "\U0001d544", - "Mscr;": "\u2133", - "Mu;": "\u039c", - "NJcy;": "\u040a", - "Nacute;": "\u0143", - "Ncaron;": "\u0147", - "Ncedil;": "\u0145", - "Ncy;": "\u041d", - "NegativeMediumSpace;": "\u200b", - "NegativeThickSpace;": "\u200b", - "NegativeThinSpace;": "\u200b", - "NegativeVeryThinSpace;": "\u200b", - "NestedGreaterGreater;": "\u226b", - "NestedLessLess;": "\u226a", - "NewLine;": "\n", - "Nfr;": "\U0001d511", - "NoBreak;": "\u2060", - "NonBreakingSpace;": "\xa0", - "Nopf;": "\u2115", - "Not;": "\u2aec", - "NotCongruent;": "\u2262", - "NotCupCap;": "\u226d", - "NotDoubleVerticalBar;": "\u2226", - "NotElement;": "\u2209", - "NotEqual;": "\u2260", - "NotEqualTilde;": "\u2242\u0338", - "NotExists;": "\u2204", - "NotGreater;": "\u226f", - "NotGreaterEqual;": "\u2271", - "NotGreaterFullEqual;": "\u2267\u0338", - "NotGreaterGreater;": "\u226b\u0338", - "NotGreaterLess;": "\u2279", - "NotGreaterSlantEqual;": "\u2a7e\u0338", - "NotGreaterTilde;": "\u2275", - "NotHumpDownHump;": "\u224e\u0338", - "NotHumpEqual;": "\u224f\u0338", - "NotLeftTriangle;": "\u22ea", - "NotLeftTriangleBar;": "\u29cf\u0338", - "NotLeftTriangleEqual;": "\u22ec", - "NotLess;": "\u226e", - "NotLessEqual;": "\u2270", - "NotLessGreater;": "\u2278", - "NotLessLess;": "\u226a\u0338", - "NotLessSlantEqual;": "\u2a7d\u0338", - "NotLessTilde;": "\u2274", - "NotNestedGreaterGreater;": "\u2aa2\u0338", - "NotNestedLessLess;": "\u2aa1\u0338", - "NotPrecedes;": "\u2280", - "NotPrecedesEqual;": "\u2aaf\u0338", - "NotPrecedesSlantEqual;": "\u22e0", - "NotReverseElement;": "\u220c", - "NotRightTriangle;": "\u22eb", - "NotRightTriangleBar;": "\u29d0\u0338", - "NotRightTriangleEqual;": "\u22ed", - "NotSquareSubset;": "\u228f\u0338", - "NotSquareSubsetEqual;": "\u22e2", - "NotSquareSuperset;": "\u2290\u0338", - "NotSquareSupersetEqual;": "\u22e3", - "NotSubset;": "\u2282\u20d2", - "NotSubsetEqual;": "\u2288", - "NotSucceeds;": "\u2281", - "NotSucceedsEqual;": "\u2ab0\u0338", - "NotSucceedsSlantEqual;": "\u22e1", - "NotSucceedsTilde;": "\u227f\u0338", - "NotSuperset;": "\u2283\u20d2", - "NotSupersetEqual;": "\u2289", - "NotTilde;": "\u2241", - "NotTildeEqual;": "\u2244", - "NotTildeFullEqual;": "\u2247", - "NotTildeTilde;": "\u2249", - "NotVerticalBar;": "\u2224", - "Nscr;": "\U0001d4a9", - "Ntilde": "\xd1", - "Ntilde;": "\xd1", - "Nu;": "\u039d", - "OElig;": "\u0152", - "Oacute": "\xd3", - "Oacute;": "\xd3", - "Ocirc": "\xd4", - "Ocirc;": "\xd4", - "Ocy;": "\u041e", - "Odblac;": "\u0150", - "Ofr;": "\U0001d512", - "Ograve": "\xd2", - "Ograve;": "\xd2", - "Omacr;": "\u014c", - "Omega;": "\u03a9", - "Omicron;": "\u039f", - "Oopf;": "\U0001d546", - "OpenCurlyDoubleQuote;": "\u201c", - "OpenCurlyQuote;": "\u2018", - "Or;": "\u2a54", - "Oscr;": "\U0001d4aa", - "Oslash": "\xd8", - "Oslash;": "\xd8", - "Otilde": "\xd5", - "Otilde;": "\xd5", - "Otimes;": "\u2a37", - "Ouml": "\xd6", - "Ouml;": "\xd6", - "OverBar;": "\u203e", - "OverBrace;": "\u23de", - "OverBracket;": "\u23b4", - "OverParenthesis;": "\u23dc", - "PartialD;": "\u2202", - "Pcy;": "\u041f", - "Pfr;": "\U0001d513", - "Phi;": "\u03a6", - "Pi;": "\u03a0", - "PlusMinus;": "\xb1", - "Poincareplane;": "\u210c", - "Popf;": "\u2119", - "Pr;": "\u2abb", - "Precedes;": "\u227a", - "PrecedesEqual;": "\u2aaf", - "PrecedesSlantEqual;": "\u227c", - "PrecedesTilde;": "\u227e", - "Prime;": "\u2033", - "Product;": "\u220f", - "Proportion;": "\u2237", - "Proportional;": "\u221d", - "Pscr;": "\U0001d4ab", - "Psi;": "\u03a8", - "QUOT": "\"", - "QUOT;": "\"", - "Qfr;": "\U0001d514", - "Qopf;": "\u211a", - "Qscr;": "\U0001d4ac", - "RBarr;": "\u2910", - "REG": "\xae", - "REG;": "\xae", - "Racute;": "\u0154", - "Rang;": "\u27eb", - "Rarr;": "\u21a0", - "Rarrtl;": "\u2916", - "Rcaron;": "\u0158", - "Rcedil;": "\u0156", - "Rcy;": "\u0420", - "Re;": "\u211c", - "ReverseElement;": "\u220b", - "ReverseEquilibrium;": "\u21cb", - "ReverseUpEquilibrium;": "\u296f", - "Rfr;": "\u211c", - "Rho;": "\u03a1", - "RightAngleBracket;": "\u27e9", - "RightArrow;": "\u2192", - "RightArrowBar;": "\u21e5", - "RightArrowLeftArrow;": "\u21c4", - "RightCeiling;": "\u2309", - "RightDoubleBracket;": "\u27e7", - "RightDownTeeVector;": "\u295d", - "RightDownVector;": "\u21c2", - "RightDownVectorBar;": "\u2955", - "RightFloor;": "\u230b", - "RightTee;": "\u22a2", - "RightTeeArrow;": "\u21a6", - "RightTeeVector;": "\u295b", - "RightTriangle;": "\u22b3", - "RightTriangleBar;": "\u29d0", - "RightTriangleEqual;": "\u22b5", - "RightUpDownVector;": "\u294f", - "RightUpTeeVector;": "\u295c", - "RightUpVector;": "\u21be", - "RightUpVectorBar;": "\u2954", - "RightVector;": "\u21c0", - "RightVectorBar;": "\u2953", - "Rightarrow;": "\u21d2", - "Ropf;": "\u211d", - "RoundImplies;": "\u2970", - "Rrightarrow;": "\u21db", - "Rscr;": "\u211b", - "Rsh;": "\u21b1", - "RuleDelayed;": "\u29f4", - "SHCHcy;": "\u0429", - "SHcy;": "\u0428", - "SOFTcy;": "\u042c", - "Sacute;": "\u015a", - "Sc;": "\u2abc", - "Scaron;": "\u0160", - "Scedil;": "\u015e", - "Scirc;": "\u015c", - "Scy;": "\u0421", - "Sfr;": "\U0001d516", - "ShortDownArrow;": "\u2193", - "ShortLeftArrow;": "\u2190", - "ShortRightArrow;": "\u2192", - "ShortUpArrow;": "\u2191", - "Sigma;": "\u03a3", - "SmallCircle;": "\u2218", - "Sopf;": "\U0001d54a", - "Sqrt;": "\u221a", - "Square;": "\u25a1", - "SquareIntersection;": "\u2293", - "SquareSubset;": "\u228f", - "SquareSubsetEqual;": "\u2291", - "SquareSuperset;": "\u2290", - "SquareSupersetEqual;": "\u2292", - "SquareUnion;": "\u2294", - "Sscr;": "\U0001d4ae", - "Star;": "\u22c6", - "Sub;": "\u22d0", - "Subset;": "\u22d0", - "SubsetEqual;": "\u2286", - "Succeeds;": "\u227b", - "SucceedsEqual;": "\u2ab0", - "SucceedsSlantEqual;": "\u227d", - "SucceedsTilde;": "\u227f", - "SuchThat;": "\u220b", - "Sum;": "\u2211", - "Sup;": "\u22d1", - "Superset;": "\u2283", - "SupersetEqual;": "\u2287", - "Supset;": "\u22d1", - "THORN": "\xde", - "THORN;": "\xde", - "TRADE;": "\u2122", - "TSHcy;": "\u040b", - "TScy;": "\u0426", - "Tab;": "\t", - "Tau;": "\u03a4", - "Tcaron;": "\u0164", - "Tcedil;": "\u0162", - "Tcy;": "\u0422", - "Tfr;": "\U0001d517", - "Therefore;": "\u2234", - "Theta;": "\u0398", - "ThickSpace;": "\u205f\u200a", - "ThinSpace;": "\u2009", - "Tilde;": "\u223c", - "TildeEqual;": "\u2243", - "TildeFullEqual;": "\u2245", - "TildeTilde;": "\u2248", - "Topf;": "\U0001d54b", - "TripleDot;": "\u20db", - "Tscr;": "\U0001d4af", - "Tstrok;": "\u0166", - "Uacute": "\xda", - "Uacute;": "\xda", - "Uarr;": "\u219f", - "Uarrocir;": "\u2949", - "Ubrcy;": "\u040e", - "Ubreve;": "\u016c", - "Ucirc": "\xdb", - "Ucirc;": "\xdb", - "Ucy;": "\u0423", - "Udblac;": "\u0170", - "Ufr;": "\U0001d518", - "Ugrave": "\xd9", - "Ugrave;": "\xd9", - "Umacr;": "\u016a", - "UnderBar;": "_", - "UnderBrace;": "\u23df", - "UnderBracket;": "\u23b5", - "UnderParenthesis;": "\u23dd", - "Union;": "\u22c3", - "UnionPlus;": "\u228e", - "Uogon;": "\u0172", - "Uopf;": "\U0001d54c", - "UpArrow;": "\u2191", - "UpArrowBar;": "\u2912", - "UpArrowDownArrow;": "\u21c5", - "UpDownArrow;": "\u2195", - "UpEquilibrium;": "\u296e", - "UpTee;": "\u22a5", - "UpTeeArrow;": "\u21a5", - "Uparrow;": "\u21d1", - "Updownarrow;": "\u21d5", - "UpperLeftArrow;": "\u2196", - "UpperRightArrow;": "\u2197", - "Upsi;": "\u03d2", - "Upsilon;": "\u03a5", - "Uring;": "\u016e", - "Uscr;": "\U0001d4b0", - "Utilde;": "\u0168", - "Uuml": "\xdc", - "Uuml;": "\xdc", - "VDash;": "\u22ab", - "Vbar;": "\u2aeb", - "Vcy;": "\u0412", - "Vdash;": "\u22a9", - "Vdashl;": "\u2ae6", - "Vee;": "\u22c1", - "Verbar;": "\u2016", - "Vert;": "\u2016", - "VerticalBar;": "\u2223", - "VerticalLine;": "|", - "VerticalSeparator;": "\u2758", - "VerticalTilde;": "\u2240", - "VeryThinSpace;": "\u200a", - "Vfr;": "\U0001d519", - "Vopf;": "\U0001d54d", - "Vscr;": "\U0001d4b1", - "Vvdash;": "\u22aa", - "Wcirc;": "\u0174", - "Wedge;": "\u22c0", - "Wfr;": "\U0001d51a", - "Wopf;": "\U0001d54e", - "Wscr;": "\U0001d4b2", - "Xfr;": "\U0001d51b", - "Xi;": "\u039e", - "Xopf;": "\U0001d54f", - "Xscr;": "\U0001d4b3", - "YAcy;": "\u042f", - "YIcy;": "\u0407", - "YUcy;": "\u042e", - "Yacute": "\xdd", - "Yacute;": "\xdd", - "Ycirc;": "\u0176", - "Ycy;": "\u042b", - "Yfr;": "\U0001d51c", - "Yopf;": "\U0001d550", - "Yscr;": "\U0001d4b4", - "Yuml;": "\u0178", - "ZHcy;": "\u0416", - "Zacute;": "\u0179", - "Zcaron;": "\u017d", - "Zcy;": "\u0417", - "Zdot;": "\u017b", - "ZeroWidthSpace;": "\u200b", - "Zeta;": "\u0396", - "Zfr;": "\u2128", - "Zopf;": "\u2124", - "Zscr;": "\U0001d4b5", - "aacute": "\xe1", - "aacute;": "\xe1", - "abreve;": "\u0103", - "ac;": "\u223e", - "acE;": "\u223e\u0333", - "acd;": "\u223f", - "acirc": "\xe2", - "acirc;": "\xe2", - "acute": "\xb4", - "acute;": "\xb4", - "acy;": "\u0430", - "aelig": "\xe6", - "aelig;": "\xe6", - "af;": "\u2061", - "afr;": "\U0001d51e", - "agrave": "\xe0", - "agrave;": "\xe0", - "alefsym;": "\u2135", - "aleph;": "\u2135", - "alpha;": "\u03b1", - "amacr;": "\u0101", - "amalg;": "\u2a3f", - "amp": "&", - "amp;": "&", - "and;": "\u2227", - "andand;": "\u2a55", - "andd;": "\u2a5c", - "andslope;": "\u2a58", - "andv;": "\u2a5a", - "ang;": "\u2220", - "ange;": "\u29a4", - "angle;": "\u2220", - "angmsd;": "\u2221", - "angmsdaa;": "\u29a8", - "angmsdab;": "\u29a9", - "angmsdac;": "\u29aa", - "angmsdad;": "\u29ab", - "angmsdae;": "\u29ac", - "angmsdaf;": "\u29ad", - "angmsdag;": "\u29ae", - "angmsdah;": "\u29af", - "angrt;": "\u221f", - "angrtvb;": "\u22be", - "angrtvbd;": "\u299d", - "angsph;": "\u2222", - "angst;": "\xc5", - "angzarr;": "\u237c", - "aogon;": "\u0105", - "aopf;": "\U0001d552", - "ap;": "\u2248", - "apE;": "\u2a70", - "apacir;": "\u2a6f", - "ape;": "\u224a", - "apid;": "\u224b", - "apos;": "'", - "approx;": "\u2248", - "approxeq;": "\u224a", - "aring": "\xe5", - "aring;": "\xe5", - "ascr;": "\U0001d4b6", - "ast;": "*", - "asymp;": "\u2248", - "asympeq;": "\u224d", - "atilde": "\xe3", - "atilde;": "\xe3", - "auml": "\xe4", - "auml;": "\xe4", - "awconint;": "\u2233", - "awint;": "\u2a11", - "bNot;": "\u2aed", - "backcong;": "\u224c", - "backepsilon;": "\u03f6", - "backprime;": "\u2035", - "backsim;": "\u223d", - "backsimeq;": "\u22cd", - "barvee;": "\u22bd", - "barwed;": "\u2305", - "barwedge;": "\u2305", - "bbrk;": "\u23b5", - "bbrktbrk;": "\u23b6", - "bcong;": "\u224c", - "bcy;": "\u0431", - "bdquo;": "\u201e", - "becaus;": "\u2235", - "because;": "\u2235", - "bemptyv;": "\u29b0", - "bepsi;": "\u03f6", - "bernou;": "\u212c", - "beta;": "\u03b2", - "beth;": "\u2136", - "between;": "\u226c", - "bfr;": "\U0001d51f", - "bigcap;": "\u22c2", - "bigcirc;": "\u25ef", - "bigcup;": "\u22c3", - "bigodot;": "\u2a00", - "bigoplus;": "\u2a01", - "bigotimes;": "\u2a02", - "bigsqcup;": "\u2a06", - "bigstar;": "\u2605", - "bigtriangledown;": "\u25bd", - "bigtriangleup;": "\u25b3", - "biguplus;": "\u2a04", - "bigvee;": "\u22c1", - "bigwedge;": "\u22c0", - "bkarow;": "\u290d", - "blacklozenge;": "\u29eb", - "blacksquare;": "\u25aa", - "blacktriangle;": "\u25b4", - "blacktriangledown;": "\u25be", - "blacktriangleleft;": "\u25c2", - "blacktriangleright;": "\u25b8", - "blank;": "\u2423", - "blk12;": "\u2592", - "blk14;": "\u2591", - "blk34;": "\u2593", - "block;": "\u2588", - "bne;": "=\u20e5", - "bnequiv;": "\u2261\u20e5", - "bnot;": "\u2310", - "bopf;": "\U0001d553", - "bot;": "\u22a5", - "bottom;": "\u22a5", - "bowtie;": "\u22c8", - "boxDL;": "\u2557", - "boxDR;": "\u2554", - "boxDl;": "\u2556", - "boxDr;": "\u2553", - "boxH;": "\u2550", - "boxHD;": "\u2566", - "boxHU;": "\u2569", - "boxHd;": "\u2564", - "boxHu;": "\u2567", - "boxUL;": "\u255d", - "boxUR;": "\u255a", - "boxUl;": "\u255c", - "boxUr;": "\u2559", - "boxV;": "\u2551", - "boxVH;": "\u256c", - "boxVL;": "\u2563", - "boxVR;": "\u2560", - "boxVh;": "\u256b", - "boxVl;": "\u2562", - "boxVr;": "\u255f", - "boxbox;": "\u29c9", - "boxdL;": "\u2555", - "boxdR;": "\u2552", - "boxdl;": "\u2510", - "boxdr;": "\u250c", - "boxh;": "\u2500", - "boxhD;": "\u2565", - "boxhU;": "\u2568", - "boxhd;": "\u252c", - "boxhu;": "\u2534", - "boxminus;": "\u229f", - "boxplus;": "\u229e", - "boxtimes;": "\u22a0", - "boxuL;": "\u255b", - "boxuR;": "\u2558", - "boxul;": "\u2518", - "boxur;": "\u2514", - "boxv;": "\u2502", - "boxvH;": "\u256a", - "boxvL;": "\u2561", - "boxvR;": "\u255e", - "boxvh;": "\u253c", - "boxvl;": "\u2524", - "boxvr;": "\u251c", - "bprime;": "\u2035", - "breve;": "\u02d8", - "brvbar": "\xa6", - "brvbar;": "\xa6", - "bscr;": "\U0001d4b7", - "bsemi;": "\u204f", - "bsim;": "\u223d", - "bsime;": "\u22cd", - "bsol;": "\\", - "bsolb;": "\u29c5", - "bsolhsub;": "\u27c8", - "bull;": "\u2022", - "bullet;": "\u2022", - "bump;": "\u224e", - "bumpE;": "\u2aae", - "bumpe;": "\u224f", - "bumpeq;": "\u224f", - "cacute;": "\u0107", - "cap;": "\u2229", - "capand;": "\u2a44", - "capbrcup;": "\u2a49", - "capcap;": "\u2a4b", - "capcup;": "\u2a47", - "capdot;": "\u2a40", - "caps;": "\u2229\ufe00", - "caret;": "\u2041", - "caron;": "\u02c7", - "ccaps;": "\u2a4d", - "ccaron;": "\u010d", - "ccedil": "\xe7", - "ccedil;": "\xe7", - "ccirc;": "\u0109", - "ccups;": "\u2a4c", - "ccupssm;": "\u2a50", - "cdot;": "\u010b", - "cedil": "\xb8", - "cedil;": "\xb8", - "cemptyv;": "\u29b2", - "cent": "\xa2", - "cent;": "\xa2", - "centerdot;": "\xb7", - "cfr;": "\U0001d520", - "chcy;": "\u0447", - "check;": "\u2713", - "checkmark;": "\u2713", - "chi;": "\u03c7", - "cir;": "\u25cb", - "cirE;": "\u29c3", - "circ;": "\u02c6", - "circeq;": "\u2257", - "circlearrowleft;": "\u21ba", - "circlearrowright;": "\u21bb", - "circledR;": "\xae", - "circledS;": "\u24c8", - "circledast;": "\u229b", - "circledcirc;": "\u229a", - "circleddash;": "\u229d", - "cire;": "\u2257", - "cirfnint;": "\u2a10", - "cirmid;": "\u2aef", - "cirscir;": "\u29c2", - "clubs;": "\u2663", - "clubsuit;": "\u2663", - "colon;": ":", - "colone;": "\u2254", - "coloneq;": "\u2254", - "comma;": ",", - "commat;": "@", - "comp;": "\u2201", - "compfn;": "\u2218", - "complement;": "\u2201", - "complexes;": "\u2102", - "cong;": "\u2245", - "congdot;": "\u2a6d", - "conint;": "\u222e", - "copf;": "\U0001d554", - "coprod;": "\u2210", - "copy": "\xa9", - "copy;": "\xa9", - "copysr;": "\u2117", - "crarr;": "\u21b5", - "cross;": "\u2717", - "cscr;": "\U0001d4b8", - "csub;": "\u2acf", - "csube;": "\u2ad1", - "csup;": "\u2ad0", - "csupe;": "\u2ad2", - "ctdot;": "\u22ef", - "cudarrl;": "\u2938", - "cudarrr;": "\u2935", - "cuepr;": "\u22de", - "cuesc;": "\u22df", - "cularr;": "\u21b6", - "cularrp;": "\u293d", - "cup;": "\u222a", - "cupbrcap;": "\u2a48", - "cupcap;": "\u2a46", - "cupcup;": "\u2a4a", - "cupdot;": "\u228d", - "cupor;": "\u2a45", - "cups;": "\u222a\ufe00", - "curarr;": "\u21b7", - "curarrm;": "\u293c", - "curlyeqprec;": "\u22de", - "curlyeqsucc;": "\u22df", - "curlyvee;": "\u22ce", - "curlywedge;": "\u22cf", - "curren": "\xa4", - "curren;": "\xa4", - "curvearrowleft;": "\u21b6", - "curvearrowright;": "\u21b7", - "cuvee;": "\u22ce", - "cuwed;": "\u22cf", - "cwconint;": "\u2232", - "cwint;": "\u2231", - "cylcty;": "\u232d", - "dArr;": "\u21d3", - "dHar;": "\u2965", - "dagger;": "\u2020", - "daleth;": "\u2138", - "darr;": "\u2193", - "dash;": "\u2010", - "dashv;": "\u22a3", - "dbkarow;": "\u290f", - "dblac;": "\u02dd", - "dcaron;": "\u010f", - "dcy;": "\u0434", - "dd;": "\u2146", - "ddagger;": "\u2021", - "ddarr;": "\u21ca", - "ddotseq;": "\u2a77", - "deg": "\xb0", - "deg;": "\xb0", - "delta;": "\u03b4", - "demptyv;": "\u29b1", - "dfisht;": "\u297f", - "dfr;": "\U0001d521", - "dharl;": "\u21c3", - "dharr;": "\u21c2", - "diam;": "\u22c4", - "diamond;": "\u22c4", - "diamondsuit;": "\u2666", - "diams;": "\u2666", - "die;": "\xa8", - "digamma;": "\u03dd", - "disin;": "\u22f2", - "div;": "\xf7", - "divide": "\xf7", - "divide;": "\xf7", - "divideontimes;": "\u22c7", - "divonx;": "\u22c7", - "djcy;": "\u0452", - "dlcorn;": "\u231e", - "dlcrop;": "\u230d", - "dollar;": "$", - "dopf;": "\U0001d555", - "dot;": "\u02d9", - "doteq;": "\u2250", - "doteqdot;": "\u2251", - "dotminus;": "\u2238", - "dotplus;": "\u2214", - "dotsquare;": "\u22a1", - "doublebarwedge;": "\u2306", - "downarrow;": "\u2193", - "downdownarrows;": "\u21ca", - "downharpoonleft;": "\u21c3", - "downharpoonright;": "\u21c2", - "drbkarow;": "\u2910", - "drcorn;": "\u231f", - "drcrop;": "\u230c", - "dscr;": "\U0001d4b9", - "dscy;": "\u0455", - "dsol;": "\u29f6", - "dstrok;": "\u0111", - "dtdot;": "\u22f1", - "dtri;": "\u25bf", - "dtrif;": "\u25be", - "duarr;": "\u21f5", - "duhar;": "\u296f", - "dwangle;": "\u29a6", - "dzcy;": "\u045f", - "dzigrarr;": "\u27ff", - "eDDot;": "\u2a77", - "eDot;": "\u2251", - "eacute": "\xe9", - "eacute;": "\xe9", - "easter;": "\u2a6e", - "ecaron;": "\u011b", - "ecir;": "\u2256", - "ecirc": "\xea", - "ecirc;": "\xea", - "ecolon;": "\u2255", - "ecy;": "\u044d", - "edot;": "\u0117", - "ee;": "\u2147", - "efDot;": "\u2252", - "efr;": "\U0001d522", - "eg;": "\u2a9a", - "egrave": "\xe8", - "egrave;": "\xe8", - "egs;": "\u2a96", - "egsdot;": "\u2a98", - "el;": "\u2a99", - "elinters;": "\u23e7", - "ell;": "\u2113", - "els;": "\u2a95", - "elsdot;": "\u2a97", - "emacr;": "\u0113", - "empty;": "\u2205", - "emptyset;": "\u2205", - "emptyv;": "\u2205", - "emsp13;": "\u2004", - "emsp14;": "\u2005", - "emsp;": "\u2003", - "eng;": "\u014b", - "ensp;": "\u2002", - "eogon;": "\u0119", - "eopf;": "\U0001d556", - "epar;": "\u22d5", - "eparsl;": "\u29e3", - "eplus;": "\u2a71", - "epsi;": "\u03b5", - "epsilon;": "\u03b5", - "epsiv;": "\u03f5", - "eqcirc;": "\u2256", - "eqcolon;": "\u2255", - "eqsim;": "\u2242", - "eqslantgtr;": "\u2a96", - "eqslantless;": "\u2a95", - "equals;": "=", - "equest;": "\u225f", - "equiv;": "\u2261", - "equivDD;": "\u2a78", - "eqvparsl;": "\u29e5", - "erDot;": "\u2253", - "erarr;": "\u2971", - "escr;": "\u212f", - "esdot;": "\u2250", - "esim;": "\u2242", - "eta;": "\u03b7", - "eth": "\xf0", - "eth;": "\xf0", - "euml": "\xeb", - "euml;": "\xeb", - "euro;": "\u20ac", - "excl;": "!", - "exist;": "\u2203", - "expectation;": "\u2130", - "exponentiale;": "\u2147", - "fallingdotseq;": "\u2252", - "fcy;": "\u0444", - "female;": "\u2640", - "ffilig;": "\ufb03", - "fflig;": "\ufb00", - "ffllig;": "\ufb04", - "ffr;": "\U0001d523", - "filig;": "\ufb01", - "fjlig;": "fj", - "flat;": "\u266d", - "fllig;": "\ufb02", - "fltns;": "\u25b1", - "fnof;": "\u0192", - "fopf;": "\U0001d557", - "forall;": "\u2200", - "fork;": "\u22d4", - "forkv;": "\u2ad9", - "fpartint;": "\u2a0d", - "frac12": "\xbd", - "frac12;": "\xbd", - "frac13;": "\u2153", - "frac14": "\xbc", - "frac14;": "\xbc", - "frac15;": "\u2155", - "frac16;": "\u2159", - "frac18;": "\u215b", - "frac23;": "\u2154", - "frac25;": "\u2156", - "frac34": "\xbe", - "frac34;": "\xbe", - "frac35;": "\u2157", - "frac38;": "\u215c", - "frac45;": "\u2158", - "frac56;": "\u215a", - "frac58;": "\u215d", - "frac78;": "\u215e", - "frasl;": "\u2044", - "frown;": "\u2322", - "fscr;": "\U0001d4bb", - "gE;": "\u2267", - "gEl;": "\u2a8c", - "gacute;": "\u01f5", - "gamma;": "\u03b3", - "gammad;": "\u03dd", - "gap;": "\u2a86", - "gbreve;": "\u011f", - "gcirc;": "\u011d", - "gcy;": "\u0433", - "gdot;": "\u0121", - "ge;": "\u2265", - "gel;": "\u22db", - "geq;": "\u2265", - "geqq;": "\u2267", - "geqslant;": "\u2a7e", - "ges;": "\u2a7e", - "gescc;": "\u2aa9", - "gesdot;": "\u2a80", - "gesdoto;": "\u2a82", - "gesdotol;": "\u2a84", - "gesl;": "\u22db\ufe00", - "gesles;": "\u2a94", - "gfr;": "\U0001d524", - "gg;": "\u226b", - "ggg;": "\u22d9", - "gimel;": "\u2137", - "gjcy;": "\u0453", - "gl;": "\u2277", - "glE;": "\u2a92", - "gla;": "\u2aa5", - "glj;": "\u2aa4", - "gnE;": "\u2269", - "gnap;": "\u2a8a", - "gnapprox;": "\u2a8a", - "gne;": "\u2a88", - "gneq;": "\u2a88", - "gneqq;": "\u2269", - "gnsim;": "\u22e7", - "gopf;": "\U0001d558", - "grave;": "`", - "gscr;": "\u210a", - "gsim;": "\u2273", - "gsime;": "\u2a8e", - "gsiml;": "\u2a90", - "gt": ">", - "gt;": ">", - "gtcc;": "\u2aa7", - "gtcir;": "\u2a7a", - "gtdot;": "\u22d7", - "gtlPar;": "\u2995", - "gtquest;": "\u2a7c", - "gtrapprox;": "\u2a86", - "gtrarr;": "\u2978", - "gtrdot;": "\u22d7", - "gtreqless;": "\u22db", - "gtreqqless;": "\u2a8c", - "gtrless;": "\u2277", - "gtrsim;": "\u2273", - "gvertneqq;": "\u2269\ufe00", - "gvnE;": "\u2269\ufe00", - "hArr;": "\u21d4", - "hairsp;": "\u200a", - "half;": "\xbd", - "hamilt;": "\u210b", - "hardcy;": "\u044a", - "harr;": "\u2194", - "harrcir;": "\u2948", - "harrw;": "\u21ad", - "hbar;": "\u210f", - "hcirc;": "\u0125", - "hearts;": "\u2665", - "heartsuit;": "\u2665", - "hellip;": "\u2026", - "hercon;": "\u22b9", - "hfr;": "\U0001d525", - "hksearow;": "\u2925", - "hkswarow;": "\u2926", - "hoarr;": "\u21ff", - "homtht;": "\u223b", - "hookleftarrow;": "\u21a9", - "hookrightarrow;": "\u21aa", - "hopf;": "\U0001d559", - "horbar;": "\u2015", - "hscr;": "\U0001d4bd", - "hslash;": "\u210f", - "hstrok;": "\u0127", - "hybull;": "\u2043", - "hyphen;": "\u2010", - "iacute": "\xed", - "iacute;": "\xed", - "ic;": "\u2063", - "icirc": "\xee", - "icirc;": "\xee", - "icy;": "\u0438", - "iecy;": "\u0435", - "iexcl": "\xa1", - "iexcl;": "\xa1", - "iff;": "\u21d4", - "ifr;": "\U0001d526", - "igrave": "\xec", - "igrave;": "\xec", - "ii;": "\u2148", - "iiiint;": "\u2a0c", - "iiint;": "\u222d", - "iinfin;": "\u29dc", - "iiota;": "\u2129", - "ijlig;": "\u0133", - "imacr;": "\u012b", - "image;": "\u2111", - "imagline;": "\u2110", - "imagpart;": "\u2111", - "imath;": "\u0131", - "imof;": "\u22b7", - "imped;": "\u01b5", - "in;": "\u2208", - "incare;": "\u2105", - "infin;": "\u221e", - "infintie;": "\u29dd", - "inodot;": "\u0131", - "int;": "\u222b", - "intcal;": "\u22ba", - "integers;": "\u2124", - "intercal;": "\u22ba", - "intlarhk;": "\u2a17", - "intprod;": "\u2a3c", - "iocy;": "\u0451", - "iogon;": "\u012f", - "iopf;": "\U0001d55a", - "iota;": "\u03b9", - "iprod;": "\u2a3c", - "iquest": "\xbf", - "iquest;": "\xbf", - "iscr;": "\U0001d4be", - "isin;": "\u2208", - "isinE;": "\u22f9", - "isindot;": "\u22f5", - "isins;": "\u22f4", - "isinsv;": "\u22f3", - "isinv;": "\u2208", - "it;": "\u2062", - "itilde;": "\u0129", - "iukcy;": "\u0456", - "iuml": "\xef", - "iuml;": "\xef", - "jcirc;": "\u0135", - "jcy;": "\u0439", - "jfr;": "\U0001d527", - "jmath;": "\u0237", - "jopf;": "\U0001d55b", - "jscr;": "\U0001d4bf", - "jsercy;": "\u0458", - "jukcy;": "\u0454", - "kappa;": "\u03ba", - "kappav;": "\u03f0", - "kcedil;": "\u0137", - "kcy;": "\u043a", - "kfr;": "\U0001d528", - "kgreen;": "\u0138", - "khcy;": "\u0445", - "kjcy;": "\u045c", - "kopf;": "\U0001d55c", - "kscr;": "\U0001d4c0", - "lAarr;": "\u21da", - "lArr;": "\u21d0", - "lAtail;": "\u291b", - "lBarr;": "\u290e", - "lE;": "\u2266", - "lEg;": "\u2a8b", - "lHar;": "\u2962", - "lacute;": "\u013a", - "laemptyv;": "\u29b4", - "lagran;": "\u2112", - "lambda;": "\u03bb", - "lang;": "\u27e8", - "langd;": "\u2991", - "langle;": "\u27e8", - "lap;": "\u2a85", - "laquo": "\xab", - "laquo;": "\xab", - "larr;": "\u2190", - "larrb;": "\u21e4", - "larrbfs;": "\u291f", - "larrfs;": "\u291d", - "larrhk;": "\u21a9", - "larrlp;": "\u21ab", - "larrpl;": "\u2939", - "larrsim;": "\u2973", - "larrtl;": "\u21a2", - "lat;": "\u2aab", - "latail;": "\u2919", - "late;": "\u2aad", - "lates;": "\u2aad\ufe00", - "lbarr;": "\u290c", - "lbbrk;": "\u2772", - "lbrace;": "{", - "lbrack;": "[", - "lbrke;": "\u298b", - "lbrksld;": "\u298f", - "lbrkslu;": "\u298d", - "lcaron;": "\u013e", - "lcedil;": "\u013c", - "lceil;": "\u2308", - "lcub;": "{", - "lcy;": "\u043b", - "ldca;": "\u2936", - "ldquo;": "\u201c", - "ldquor;": "\u201e", - "ldrdhar;": "\u2967", - "ldrushar;": "\u294b", - "ldsh;": "\u21b2", - "le;": "\u2264", - "leftarrow;": "\u2190", - "leftarrowtail;": "\u21a2", - "leftharpoondown;": "\u21bd", - "leftharpoonup;": "\u21bc", - "leftleftarrows;": "\u21c7", - "leftrightarrow;": "\u2194", - "leftrightarrows;": "\u21c6", - "leftrightharpoons;": "\u21cb", - "leftrightsquigarrow;": "\u21ad", - "leftthreetimes;": "\u22cb", - "leg;": "\u22da", - "leq;": "\u2264", - "leqq;": "\u2266", - "leqslant;": "\u2a7d", - "les;": "\u2a7d", - "lescc;": "\u2aa8", - "lesdot;": "\u2a7f", - "lesdoto;": "\u2a81", - "lesdotor;": "\u2a83", - "lesg;": "\u22da\ufe00", - "lesges;": "\u2a93", - "lessapprox;": "\u2a85", - "lessdot;": "\u22d6", - "lesseqgtr;": "\u22da", - "lesseqqgtr;": "\u2a8b", - "lessgtr;": "\u2276", - "lesssim;": "\u2272", - "lfisht;": "\u297c", - "lfloor;": "\u230a", - "lfr;": "\U0001d529", - "lg;": "\u2276", - "lgE;": "\u2a91", - "lhard;": "\u21bd", - "lharu;": "\u21bc", - "lharul;": "\u296a", - "lhblk;": "\u2584", - "ljcy;": "\u0459", - "ll;": "\u226a", - "llarr;": "\u21c7", - "llcorner;": "\u231e", - "llhard;": "\u296b", - "lltri;": "\u25fa", - "lmidot;": "\u0140", - "lmoust;": "\u23b0", - "lmoustache;": "\u23b0", - "lnE;": "\u2268", - "lnap;": "\u2a89", - "lnapprox;": "\u2a89", - "lne;": "\u2a87", - "lneq;": "\u2a87", - "lneqq;": "\u2268", - "lnsim;": "\u22e6", - "loang;": "\u27ec", - "loarr;": "\u21fd", - "lobrk;": "\u27e6", - "longleftarrow;": "\u27f5", - "longleftrightarrow;": "\u27f7", - "longmapsto;": "\u27fc", - "longrightarrow;": "\u27f6", - "looparrowleft;": "\u21ab", - "looparrowright;": "\u21ac", - "lopar;": "\u2985", - "lopf;": "\U0001d55d", - "loplus;": "\u2a2d", - "lotimes;": "\u2a34", - "lowast;": "\u2217", - "lowbar;": "_", - "loz;": "\u25ca", - "lozenge;": "\u25ca", - "lozf;": "\u29eb", - "lpar;": "(", - "lparlt;": "\u2993", - "lrarr;": "\u21c6", - "lrcorner;": "\u231f", - "lrhar;": "\u21cb", - "lrhard;": "\u296d", - "lrm;": "\u200e", - "lrtri;": "\u22bf", - "lsaquo;": "\u2039", - "lscr;": "\U0001d4c1", - "lsh;": "\u21b0", - "lsim;": "\u2272", - "lsime;": "\u2a8d", - "lsimg;": "\u2a8f", - "lsqb;": "[", - "lsquo;": "\u2018", - "lsquor;": "\u201a", - "lstrok;": "\u0142", - "lt": "<", - "lt;": "<", - "ltcc;": "\u2aa6", - "ltcir;": "\u2a79", - "ltdot;": "\u22d6", - "lthree;": "\u22cb", - "ltimes;": "\u22c9", - "ltlarr;": "\u2976", - "ltquest;": "\u2a7b", - "ltrPar;": "\u2996", - "ltri;": "\u25c3", - "ltrie;": "\u22b4", - "ltrif;": "\u25c2", - "lurdshar;": "\u294a", - "luruhar;": "\u2966", - "lvertneqq;": "\u2268\ufe00", - "lvnE;": "\u2268\ufe00", - "mDDot;": "\u223a", - "macr": "\xaf", - "macr;": "\xaf", - "male;": "\u2642", - "malt;": "\u2720", - "maltese;": "\u2720", - "map;": "\u21a6", - "mapsto;": "\u21a6", - "mapstodown;": "\u21a7", - "mapstoleft;": "\u21a4", - "mapstoup;": "\u21a5", - "marker;": "\u25ae", - "mcomma;": "\u2a29", - "mcy;": "\u043c", - "mdash;": "\u2014", - "measuredangle;": "\u2221", - "mfr;": "\U0001d52a", - "mho;": "\u2127", - "micro": "\xb5", - "micro;": "\xb5", - "mid;": "\u2223", - "midast;": "*", - "midcir;": "\u2af0", - "middot": "\xb7", - "middot;": "\xb7", - "minus;": "\u2212", - "minusb;": "\u229f", - "minusd;": "\u2238", - "minusdu;": "\u2a2a", - "mlcp;": "\u2adb", - "mldr;": "\u2026", - "mnplus;": "\u2213", - "models;": "\u22a7", - "mopf;": "\U0001d55e", - "mp;": "\u2213", - "mscr;": "\U0001d4c2", - "mstpos;": "\u223e", - "mu;": "\u03bc", - "multimap;": "\u22b8", - "mumap;": "\u22b8", - "nGg;": "\u22d9\u0338", - "nGt;": "\u226b\u20d2", - "nGtv;": "\u226b\u0338", - "nLeftarrow;": "\u21cd", - "nLeftrightarrow;": "\u21ce", - "nLl;": "\u22d8\u0338", - "nLt;": "\u226a\u20d2", - "nLtv;": "\u226a\u0338", - "nRightarrow;": "\u21cf", - "nVDash;": "\u22af", - "nVdash;": "\u22ae", - "nabla;": "\u2207", - "nacute;": "\u0144", - "nang;": "\u2220\u20d2", - "nap;": "\u2249", - "napE;": "\u2a70\u0338", - "napid;": "\u224b\u0338", - "napos;": "\u0149", - "napprox;": "\u2249", - "natur;": "\u266e", - "natural;": "\u266e", - "naturals;": "\u2115", - "nbsp": "\xa0", - "nbsp;": "\xa0", - "nbump;": "\u224e\u0338", - "nbumpe;": "\u224f\u0338", - "ncap;": "\u2a43", - "ncaron;": "\u0148", - "ncedil;": "\u0146", - "ncong;": "\u2247", - "ncongdot;": "\u2a6d\u0338", - "ncup;": "\u2a42", - "ncy;": "\u043d", - "ndash;": "\u2013", - "ne;": "\u2260", - "neArr;": "\u21d7", - "nearhk;": "\u2924", - "nearr;": "\u2197", - "nearrow;": "\u2197", - "nedot;": "\u2250\u0338", - "nequiv;": "\u2262", - "nesear;": "\u2928", - "nesim;": "\u2242\u0338", - "nexist;": "\u2204", - "nexists;": "\u2204", - "nfr;": "\U0001d52b", - "ngE;": "\u2267\u0338", - "nge;": "\u2271", - "ngeq;": "\u2271", - "ngeqq;": "\u2267\u0338", - "ngeqslant;": "\u2a7e\u0338", - "nges;": "\u2a7e\u0338", - "ngsim;": "\u2275", - "ngt;": "\u226f", - "ngtr;": "\u226f", - "nhArr;": "\u21ce", - "nharr;": "\u21ae", - "nhpar;": "\u2af2", - "ni;": "\u220b", - "nis;": "\u22fc", - "nisd;": "\u22fa", - "niv;": "\u220b", - "njcy;": "\u045a", - "nlArr;": "\u21cd", - "nlE;": "\u2266\u0338", - "nlarr;": "\u219a", - "nldr;": "\u2025", - "nle;": "\u2270", - "nleftarrow;": "\u219a", - "nleftrightarrow;": "\u21ae", - "nleq;": "\u2270", - "nleqq;": "\u2266\u0338", - "nleqslant;": "\u2a7d\u0338", - "nles;": "\u2a7d\u0338", - "nless;": "\u226e", - "nlsim;": "\u2274", - "nlt;": "\u226e", - "nltri;": "\u22ea", - "nltrie;": "\u22ec", - "nmid;": "\u2224", - "nopf;": "\U0001d55f", - "not": "\xac", - "not;": "\xac", - "notin;": "\u2209", - "notinE;": "\u22f9\u0338", - "notindot;": "\u22f5\u0338", - "notinva;": "\u2209", - "notinvb;": "\u22f7", - "notinvc;": "\u22f6", - "notni;": "\u220c", - "notniva;": "\u220c", - "notnivb;": "\u22fe", - "notnivc;": "\u22fd", - "npar;": "\u2226", - "nparallel;": "\u2226", - "nparsl;": "\u2afd\u20e5", - "npart;": "\u2202\u0338", - "npolint;": "\u2a14", - "npr;": "\u2280", - "nprcue;": "\u22e0", - "npre;": "\u2aaf\u0338", - "nprec;": "\u2280", - "npreceq;": "\u2aaf\u0338", - "nrArr;": "\u21cf", - "nrarr;": "\u219b", - "nrarrc;": "\u2933\u0338", - "nrarrw;": "\u219d\u0338", - "nrightarrow;": "\u219b", - "nrtri;": "\u22eb", - "nrtrie;": "\u22ed", - "nsc;": "\u2281", - "nsccue;": "\u22e1", - "nsce;": "\u2ab0\u0338", - "nscr;": "\U0001d4c3", - "nshortmid;": "\u2224", - "nshortparallel;": "\u2226", - "nsim;": "\u2241", - "nsime;": "\u2244", - "nsimeq;": "\u2244", - "nsmid;": "\u2224", - "nspar;": "\u2226", - "nsqsube;": "\u22e2", - "nsqsupe;": "\u22e3", - "nsub;": "\u2284", - "nsubE;": "\u2ac5\u0338", - "nsube;": "\u2288", - "nsubset;": "\u2282\u20d2", - "nsubseteq;": "\u2288", - "nsubseteqq;": "\u2ac5\u0338", - "nsucc;": "\u2281", - "nsucceq;": "\u2ab0\u0338", - "nsup;": "\u2285", - "nsupE;": "\u2ac6\u0338", - "nsupe;": "\u2289", - "nsupset;": "\u2283\u20d2", - "nsupseteq;": "\u2289", - "nsupseteqq;": "\u2ac6\u0338", - "ntgl;": "\u2279", - "ntilde": "\xf1", - "ntilde;": "\xf1", - "ntlg;": "\u2278", - "ntriangleleft;": "\u22ea", - "ntrianglelefteq;": "\u22ec", - "ntriangleright;": "\u22eb", - "ntrianglerighteq;": "\u22ed", - "nu;": "\u03bd", - "num;": "#", - "numero;": "\u2116", - "numsp;": "\u2007", - "nvDash;": "\u22ad", - "nvHarr;": "\u2904", - "nvap;": "\u224d\u20d2", - "nvdash;": "\u22ac", - "nvge;": "\u2265\u20d2", - "nvgt;": ">\u20d2", - "nvinfin;": "\u29de", - "nvlArr;": "\u2902", - "nvle;": "\u2264\u20d2", - "nvlt;": "<\u20d2", - "nvltrie;": "\u22b4\u20d2", - "nvrArr;": "\u2903", - "nvrtrie;": "\u22b5\u20d2", - "nvsim;": "\u223c\u20d2", - "nwArr;": "\u21d6", - "nwarhk;": "\u2923", - "nwarr;": "\u2196", - "nwarrow;": "\u2196", - "nwnear;": "\u2927", - "oS;": "\u24c8", - "oacute": "\xf3", - "oacute;": "\xf3", - "oast;": "\u229b", - "ocir;": "\u229a", - "ocirc": "\xf4", - "ocirc;": "\xf4", - "ocy;": "\u043e", - "odash;": "\u229d", - "odblac;": "\u0151", - "odiv;": "\u2a38", - "odot;": "\u2299", - "odsold;": "\u29bc", - "oelig;": "\u0153", - "ofcir;": "\u29bf", - "ofr;": "\U0001d52c", - "ogon;": "\u02db", - "ograve": "\xf2", - "ograve;": "\xf2", - "ogt;": "\u29c1", - "ohbar;": "\u29b5", - "ohm;": "\u03a9", - "oint;": "\u222e", - "olarr;": "\u21ba", - "olcir;": "\u29be", - "olcross;": "\u29bb", - "oline;": "\u203e", - "olt;": "\u29c0", - "omacr;": "\u014d", - "omega;": "\u03c9", - "omicron;": "\u03bf", - "omid;": "\u29b6", - "ominus;": "\u2296", - "oopf;": "\U0001d560", - "opar;": "\u29b7", - "operp;": "\u29b9", - "oplus;": "\u2295", - "or;": "\u2228", - "orarr;": "\u21bb", - "ord;": "\u2a5d", - "order;": "\u2134", - "orderof;": "\u2134", - "ordf": "\xaa", - "ordf;": "\xaa", - "ordm": "\xba", - "ordm;": "\xba", - "origof;": "\u22b6", - "oror;": "\u2a56", - "orslope;": "\u2a57", - "orv;": "\u2a5b", - "oscr;": "\u2134", - "oslash": "\xf8", - "oslash;": "\xf8", - "osol;": "\u2298", - "otilde": "\xf5", - "otilde;": "\xf5", - "otimes;": "\u2297", - "otimesas;": "\u2a36", - "ouml": "\xf6", - "ouml;": "\xf6", - "ovbar;": "\u233d", - "par;": "\u2225", - "para": "\xb6", - "para;": "\xb6", - "parallel;": "\u2225", - "parsim;": "\u2af3", - "parsl;": "\u2afd", - "part;": "\u2202", - "pcy;": "\u043f", - "percnt;": "%", - "period;": ".", - "permil;": "\u2030", - "perp;": "\u22a5", - "pertenk;": "\u2031", - "pfr;": "\U0001d52d", - "phi;": "\u03c6", - "phiv;": "\u03d5", - "phmmat;": "\u2133", - "phone;": "\u260e", - "pi;": "\u03c0", - "pitchfork;": "\u22d4", - "piv;": "\u03d6", - "planck;": "\u210f", - "planckh;": "\u210e", - "plankv;": "\u210f", - "plus;": "+", - "plusacir;": "\u2a23", - "plusb;": "\u229e", - "pluscir;": "\u2a22", - "plusdo;": "\u2214", - "plusdu;": "\u2a25", - "pluse;": "\u2a72", - "plusmn": "\xb1", - "plusmn;": "\xb1", - "plussim;": "\u2a26", - "plustwo;": "\u2a27", - "pm;": "\xb1", - "pointint;": "\u2a15", - "popf;": "\U0001d561", - "pound": "\xa3", - "pound;": "\xa3", - "pr;": "\u227a", - "prE;": "\u2ab3", - "prap;": "\u2ab7", - "prcue;": "\u227c", - "pre;": "\u2aaf", - "prec;": "\u227a", - "precapprox;": "\u2ab7", - "preccurlyeq;": "\u227c", - "preceq;": "\u2aaf", - "precnapprox;": "\u2ab9", - "precneqq;": "\u2ab5", - "precnsim;": "\u22e8", - "precsim;": "\u227e", - "prime;": "\u2032", - "primes;": "\u2119", - "prnE;": "\u2ab5", - "prnap;": "\u2ab9", - "prnsim;": "\u22e8", - "prod;": "\u220f", - "profalar;": "\u232e", - "profline;": "\u2312", - "profsurf;": "\u2313", - "prop;": "\u221d", - "propto;": "\u221d", - "prsim;": "\u227e", - "prurel;": "\u22b0", - "pscr;": "\U0001d4c5", - "psi;": "\u03c8", - "puncsp;": "\u2008", - "qfr;": "\U0001d52e", - "qint;": "\u2a0c", - "qopf;": "\U0001d562", - "qprime;": "\u2057", - "qscr;": "\U0001d4c6", - "quaternions;": "\u210d", - "quatint;": "\u2a16", - "quest;": "?", - "questeq;": "\u225f", - "quot": "\"", - "quot;": "\"", - "rAarr;": "\u21db", - "rArr;": "\u21d2", - "rAtail;": "\u291c", - "rBarr;": "\u290f", - "rHar;": "\u2964", - "race;": "\u223d\u0331", - "racute;": "\u0155", - "radic;": "\u221a", - "raemptyv;": "\u29b3", - "rang;": "\u27e9", - "rangd;": "\u2992", - "range;": "\u29a5", - "rangle;": "\u27e9", - "raquo": "\xbb", - "raquo;": "\xbb", - "rarr;": "\u2192", - "rarrap;": "\u2975", - "rarrb;": "\u21e5", - "rarrbfs;": "\u2920", - "rarrc;": "\u2933", - "rarrfs;": "\u291e", - "rarrhk;": "\u21aa", - "rarrlp;": "\u21ac", - "rarrpl;": "\u2945", - "rarrsim;": "\u2974", - "rarrtl;": "\u21a3", - "rarrw;": "\u219d", - "ratail;": "\u291a", - "ratio;": "\u2236", - "rationals;": "\u211a", - "rbarr;": "\u290d", - "rbbrk;": "\u2773", - "rbrace;": "}", - "rbrack;": "]", - "rbrke;": "\u298c", - "rbrksld;": "\u298e", - "rbrkslu;": "\u2990", - "rcaron;": "\u0159", - "rcedil;": "\u0157", - "rceil;": "\u2309", - "rcub;": "}", - "rcy;": "\u0440", - "rdca;": "\u2937", - "rdldhar;": "\u2969", - "rdquo;": "\u201d", - "rdquor;": "\u201d", - "rdsh;": "\u21b3", - "real;": "\u211c", - "realine;": "\u211b", - "realpart;": "\u211c", - "reals;": "\u211d", - "rect;": "\u25ad", - "reg": "\xae", - "reg;": "\xae", - "rfisht;": "\u297d", - "rfloor;": "\u230b", - "rfr;": "\U0001d52f", - "rhard;": "\u21c1", - "rharu;": "\u21c0", - "rharul;": "\u296c", - "rho;": "\u03c1", - "rhov;": "\u03f1", - "rightarrow;": "\u2192", - "rightarrowtail;": "\u21a3", - "rightharpoondown;": "\u21c1", - "rightharpoonup;": "\u21c0", - "rightleftarrows;": "\u21c4", - "rightleftharpoons;": "\u21cc", - "rightrightarrows;": "\u21c9", - "rightsquigarrow;": "\u219d", - "rightthreetimes;": "\u22cc", - "ring;": "\u02da", - "risingdotseq;": "\u2253", - "rlarr;": "\u21c4", - "rlhar;": "\u21cc", - "rlm;": "\u200f", - "rmoust;": "\u23b1", - "rmoustache;": "\u23b1", - "rnmid;": "\u2aee", - "roang;": "\u27ed", - "roarr;": "\u21fe", - "robrk;": "\u27e7", - "ropar;": "\u2986", - "ropf;": "\U0001d563", - "roplus;": "\u2a2e", - "rotimes;": "\u2a35", - "rpar;": ")", - "rpargt;": "\u2994", - "rppolint;": "\u2a12", - "rrarr;": "\u21c9", - "rsaquo;": "\u203a", - "rscr;": "\U0001d4c7", - "rsh;": "\u21b1", - "rsqb;": "]", - "rsquo;": "\u2019", - "rsquor;": "\u2019", - "rthree;": "\u22cc", - "rtimes;": "\u22ca", - "rtri;": "\u25b9", - "rtrie;": "\u22b5", - "rtrif;": "\u25b8", - "rtriltri;": "\u29ce", - "ruluhar;": "\u2968", - "rx;": "\u211e", - "sacute;": "\u015b", - "sbquo;": "\u201a", - "sc;": "\u227b", - "scE;": "\u2ab4", - "scap;": "\u2ab8", - "scaron;": "\u0161", - "sccue;": "\u227d", - "sce;": "\u2ab0", - "scedil;": "\u015f", - "scirc;": "\u015d", - "scnE;": "\u2ab6", - "scnap;": "\u2aba", - "scnsim;": "\u22e9", - "scpolint;": "\u2a13", - "scsim;": "\u227f", - "scy;": "\u0441", - "sdot;": "\u22c5", - "sdotb;": "\u22a1", - "sdote;": "\u2a66", - "seArr;": "\u21d8", - "searhk;": "\u2925", - "searr;": "\u2198", - "searrow;": "\u2198", - "sect": "\xa7", - "sect;": "\xa7", - "semi;": ";", - "seswar;": "\u2929", - "setminus;": "\u2216", - "setmn;": "\u2216", - "sext;": "\u2736", - "sfr;": "\U0001d530", - "sfrown;": "\u2322", - "sharp;": "\u266f", - "shchcy;": "\u0449", - "shcy;": "\u0448", - "shortmid;": "\u2223", - "shortparallel;": "\u2225", - "shy": "\xad", - "shy;": "\xad", - "sigma;": "\u03c3", - "sigmaf;": "\u03c2", - "sigmav;": "\u03c2", - "sim;": "\u223c", - "simdot;": "\u2a6a", - "sime;": "\u2243", - "simeq;": "\u2243", - "simg;": "\u2a9e", - "simgE;": "\u2aa0", - "siml;": "\u2a9d", - "simlE;": "\u2a9f", - "simne;": "\u2246", - "simplus;": "\u2a24", - "simrarr;": "\u2972", - "slarr;": "\u2190", - "smallsetminus;": "\u2216", - "smashp;": "\u2a33", - "smeparsl;": "\u29e4", - "smid;": "\u2223", - "smile;": "\u2323", - "smt;": "\u2aaa", - "smte;": "\u2aac", - "smtes;": "\u2aac\ufe00", - "softcy;": "\u044c", - "sol;": "/", - "solb;": "\u29c4", - "solbar;": "\u233f", - "sopf;": "\U0001d564", - "spades;": "\u2660", - "spadesuit;": "\u2660", - "spar;": "\u2225", - "sqcap;": "\u2293", - "sqcaps;": "\u2293\ufe00", - "sqcup;": "\u2294", - "sqcups;": "\u2294\ufe00", - "sqsub;": "\u228f", - "sqsube;": "\u2291", - "sqsubset;": "\u228f", - "sqsubseteq;": "\u2291", - "sqsup;": "\u2290", - "sqsupe;": "\u2292", - "sqsupset;": "\u2290", - "sqsupseteq;": "\u2292", - "squ;": "\u25a1", - "square;": "\u25a1", - "squarf;": "\u25aa", - "squf;": "\u25aa", - "srarr;": "\u2192", - "sscr;": "\U0001d4c8", - "ssetmn;": "\u2216", - "ssmile;": "\u2323", - "sstarf;": "\u22c6", - "star;": "\u2606", - "starf;": "\u2605", - "straightepsilon;": "\u03f5", - "straightphi;": "\u03d5", - "strns;": "\xaf", - "sub;": "\u2282", - "subE;": "\u2ac5", - "subdot;": "\u2abd", - "sube;": "\u2286", - "subedot;": "\u2ac3", - "submult;": "\u2ac1", - "subnE;": "\u2acb", - "subne;": "\u228a", - "subplus;": "\u2abf", - "subrarr;": "\u2979", - "subset;": "\u2282", - "subseteq;": "\u2286", - "subseteqq;": "\u2ac5", - "subsetneq;": "\u228a", - "subsetneqq;": "\u2acb", - "subsim;": "\u2ac7", - "subsub;": "\u2ad5", - "subsup;": "\u2ad3", - "succ;": "\u227b", - "succapprox;": "\u2ab8", - "succcurlyeq;": "\u227d", - "succeq;": "\u2ab0", - "succnapprox;": "\u2aba", - "succneqq;": "\u2ab6", - "succnsim;": "\u22e9", - "succsim;": "\u227f", - "sum;": "\u2211", - "sung;": "\u266a", - "sup1": "\xb9", - "sup1;": "\xb9", - "sup2": "\xb2", - "sup2;": "\xb2", - "sup3": "\xb3", - "sup3;": "\xb3", - "sup;": "\u2283", - "supE;": "\u2ac6", - "supdot;": "\u2abe", - "supdsub;": "\u2ad8", - "supe;": "\u2287", - "supedot;": "\u2ac4", - "suphsol;": "\u27c9", - "suphsub;": "\u2ad7", - "suplarr;": "\u297b", - "supmult;": "\u2ac2", - "supnE;": "\u2acc", - "supne;": "\u228b", - "supplus;": "\u2ac0", - "supset;": "\u2283", - "supseteq;": "\u2287", - "supseteqq;": "\u2ac6", - "supsetneq;": "\u228b", - "supsetneqq;": "\u2acc", - "supsim;": "\u2ac8", - "supsub;": "\u2ad4", - "supsup;": "\u2ad6", - "swArr;": "\u21d9", - "swarhk;": "\u2926", - "swarr;": "\u2199", - "swarrow;": "\u2199", - "swnwar;": "\u292a", - "szlig": "\xdf", - "szlig;": "\xdf", - "target;": "\u2316", - "tau;": "\u03c4", - "tbrk;": "\u23b4", - "tcaron;": "\u0165", - "tcedil;": "\u0163", - "tcy;": "\u0442", - "tdot;": "\u20db", - "telrec;": "\u2315", - "tfr;": "\U0001d531", - "there4;": "\u2234", - "therefore;": "\u2234", - "theta;": "\u03b8", - "thetasym;": "\u03d1", - "thetav;": "\u03d1", - "thickapprox;": "\u2248", - "thicksim;": "\u223c", - "thinsp;": "\u2009", - "thkap;": "\u2248", - "thksim;": "\u223c", - "thorn": "\xfe", - "thorn;": "\xfe", - "tilde;": "\u02dc", - "times": "\xd7", - "times;": "\xd7", - "timesb;": "\u22a0", - "timesbar;": "\u2a31", - "timesd;": "\u2a30", - "tint;": "\u222d", - "toea;": "\u2928", - "top;": "\u22a4", - "topbot;": "\u2336", - "topcir;": "\u2af1", - "topf;": "\U0001d565", - "topfork;": "\u2ada", - "tosa;": "\u2929", - "tprime;": "\u2034", - "trade;": "\u2122", - "triangle;": "\u25b5", - "triangledown;": "\u25bf", - "triangleleft;": "\u25c3", - "trianglelefteq;": "\u22b4", - "triangleq;": "\u225c", - "triangleright;": "\u25b9", - "trianglerighteq;": "\u22b5", - "tridot;": "\u25ec", - "trie;": "\u225c", - "triminus;": "\u2a3a", - "triplus;": "\u2a39", - "trisb;": "\u29cd", - "tritime;": "\u2a3b", - "trpezium;": "\u23e2", - "tscr;": "\U0001d4c9", - "tscy;": "\u0446", - "tshcy;": "\u045b", - "tstrok;": "\u0167", - "twixt;": "\u226c", - "twoheadleftarrow;": "\u219e", - "twoheadrightarrow;": "\u21a0", - "uArr;": "\u21d1", - "uHar;": "\u2963", - "uacute": "\xfa", - "uacute;": "\xfa", - "uarr;": "\u2191", - "ubrcy;": "\u045e", - "ubreve;": "\u016d", - "ucirc": "\xfb", - "ucirc;": "\xfb", - "ucy;": "\u0443", - "udarr;": "\u21c5", - "udblac;": "\u0171", - "udhar;": "\u296e", - "ufisht;": "\u297e", - "ufr;": "\U0001d532", - "ugrave": "\xf9", - "ugrave;": "\xf9", - "uharl;": "\u21bf", - "uharr;": "\u21be", - "uhblk;": "\u2580", - "ulcorn;": "\u231c", - "ulcorner;": "\u231c", - "ulcrop;": "\u230f", - "ultri;": "\u25f8", - "umacr;": "\u016b", - "uml": "\xa8", - "uml;": "\xa8", - "uogon;": "\u0173", - "uopf;": "\U0001d566", - "uparrow;": "\u2191", - "updownarrow;": "\u2195", - "upharpoonleft;": "\u21bf", - "upharpoonright;": "\u21be", - "uplus;": "\u228e", - "upsi;": "\u03c5", - "upsih;": "\u03d2", - "upsilon;": "\u03c5", - "upuparrows;": "\u21c8", - "urcorn;": "\u231d", - "urcorner;": "\u231d", - "urcrop;": "\u230e", - "uring;": "\u016f", - "urtri;": "\u25f9", - "uscr;": "\U0001d4ca", - "utdot;": "\u22f0", - "utilde;": "\u0169", - "utri;": "\u25b5", - "utrif;": "\u25b4", - "uuarr;": "\u21c8", - "uuml": "\xfc", - "uuml;": "\xfc", - "uwangle;": "\u29a7", - "vArr;": "\u21d5", - "vBar;": "\u2ae8", - "vBarv;": "\u2ae9", - "vDash;": "\u22a8", - "vangrt;": "\u299c", - "varepsilon;": "\u03f5", - "varkappa;": "\u03f0", - "varnothing;": "\u2205", - "varphi;": "\u03d5", - "varpi;": "\u03d6", - "varpropto;": "\u221d", - "varr;": "\u2195", - "varrho;": "\u03f1", - "varsigma;": "\u03c2", - "varsubsetneq;": "\u228a\ufe00", - "varsubsetneqq;": "\u2acb\ufe00", - "varsupsetneq;": "\u228b\ufe00", - "varsupsetneqq;": "\u2acc\ufe00", - "vartheta;": "\u03d1", - "vartriangleleft;": "\u22b2", - "vartriangleright;": "\u22b3", - "vcy;": "\u0432", - "vdash;": "\u22a2", - "vee;": "\u2228", - "veebar;": "\u22bb", - "veeeq;": "\u225a", - "vellip;": "\u22ee", - "verbar;": "|", - "vert;": "|", - "vfr;": "\U0001d533", - "vltri;": "\u22b2", - "vnsub;": "\u2282\u20d2", - "vnsup;": "\u2283\u20d2", - "vopf;": "\U0001d567", - "vprop;": "\u221d", - "vrtri;": "\u22b3", - "vscr;": "\U0001d4cb", - "vsubnE;": "\u2acb\ufe00", - "vsubne;": "\u228a\ufe00", - "vsupnE;": "\u2acc\ufe00", - "vsupne;": "\u228b\ufe00", - "vzigzag;": "\u299a", - "wcirc;": "\u0175", - "wedbar;": "\u2a5f", - "wedge;": "\u2227", - "wedgeq;": "\u2259", - "weierp;": "\u2118", - "wfr;": "\U0001d534", - "wopf;": "\U0001d568", - "wp;": "\u2118", - "wr;": "\u2240", - "wreath;": "\u2240", - "wscr;": "\U0001d4cc", - "xcap;": "\u22c2", - "xcirc;": "\u25ef", - "xcup;": "\u22c3", - "xdtri;": "\u25bd", - "xfr;": "\U0001d535", - "xhArr;": "\u27fa", - "xharr;": "\u27f7", - "xi;": "\u03be", - "xlArr;": "\u27f8", - "xlarr;": "\u27f5", - "xmap;": "\u27fc", - "xnis;": "\u22fb", - "xodot;": "\u2a00", - "xopf;": "\U0001d569", - "xoplus;": "\u2a01", - "xotime;": "\u2a02", - "xrArr;": "\u27f9", - "xrarr;": "\u27f6", - "xscr;": "\U0001d4cd", - "xsqcup;": "\u2a06", - "xuplus;": "\u2a04", - "xutri;": "\u25b3", - "xvee;": "\u22c1", - "xwedge;": "\u22c0", - "yacute": "\xfd", - "yacute;": "\xfd", - "yacy;": "\u044f", - "ycirc;": "\u0177", - "ycy;": "\u044b", - "yen": "\xa5", - "yen;": "\xa5", - "yfr;": "\U0001d536", - "yicy;": "\u0457", - "yopf;": "\U0001d56a", - "yscr;": "\U0001d4ce", - "yucy;": "\u044e", - "yuml": "\xff", - "yuml;": "\xff", - "zacute;": "\u017a", - "zcaron;": "\u017e", - "zcy;": "\u0437", - "zdot;": "\u017c", - "zeetrf;": "\u2128", - "zeta;": "\u03b6", - "zfr;": "\U0001d537", - "zhcy;": "\u0436", - "zigrarr;": "\u21dd", - "zopf;": "\U0001d56b", - "zscr;": "\U0001d4cf", - "zwj;": "\u200d", - "zwnj;": "\u200c", -} - -replacementCharacters = { - 0x0: "\uFFFD", - 0x0d: "\u000D", - 0x80: "\u20AC", - 0x81: "\u0081", - 0x82: "\u201A", - 0x83: "\u0192", - 0x84: "\u201E", - 0x85: "\u2026", - 0x86: "\u2020", - 0x87: "\u2021", - 0x88: "\u02C6", - 0x89: "\u2030", - 0x8A: "\u0160", - 0x8B: "\u2039", - 0x8C: "\u0152", - 0x8D: "\u008D", - 0x8E: "\u017D", - 0x8F: "\u008F", - 0x90: "\u0090", - 0x91: "\u2018", - 0x92: "\u2019", - 0x93: "\u201C", - 0x94: "\u201D", - 0x95: "\u2022", - 0x96: "\u2013", - 0x97: "\u2014", - 0x98: "\u02DC", - 0x99: "\u2122", - 0x9A: "\u0161", - 0x9B: "\u203A", - 0x9C: "\u0153", - 0x9D: "\u009D", - 0x9E: "\u017E", - 0x9F: "\u0178", -} - -tokenTypes = { - "Doctype": 0, - "Characters": 1, - "SpaceCharacters": 2, - "StartTag": 3, - "EndTag": 4, - "EmptyTag": 5, - "Comment": 6, - "ParseError": 7 -} - -tagTokenTypes = frozenset([tokenTypes["StartTag"], tokenTypes["EndTag"], - tokenTypes["EmptyTag"]]) - - -prefixes = dict([(v, k) for k, v in namespaces.items()]) -prefixes["http://www.w3.org/1998/Math/MathML"] = "math" - - -class DataLossWarning(UserWarning): - """Raised when the current tree is unable to represent the input data""" - pass - - -class _ReparseException(Exception): - pass diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/alphabeticalattributes.py deleted file mode 100644 index 5ba926e..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/alphabeticalattributes.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from . import base - -from collections import OrderedDict - - -def _attr_key(attr): - """Return an appropriate key for an attribute for sorting - - Attributes have a namespace that can be either ``None`` or a string. We - can't compare the two because they're different types, so we convert - ``None`` to an empty string first. - - """ - return (attr[0][0] or ''), attr[0][1] - - -class Filter(base.Filter): - """Alphabetizes attributes for elements""" - def __iter__(self): - for token in base.Filter.__iter__(self): - if token["type"] in ("StartTag", "EmptyTag"): - attrs = OrderedDict() - for name, value in sorted(token["data"].items(), - key=_attr_key): - attrs[name] = value - token["data"] = attrs - yield token diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/base.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/base.py deleted file mode 100644 index c7dbaed..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/base.py +++ /dev/null @@ -1,12 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - - -class Filter(object): - def __init__(self, source): - self.source = source - - def __iter__(self): - return iter(self.source) - - def __getattr__(self, name): - return getattr(self.source, name) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/inject_meta_charset.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/inject_meta_charset.py deleted file mode 100644 index aefb5c8..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/inject_meta_charset.py +++ /dev/null @@ -1,73 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from . import base - - -class Filter(base.Filter): - """Injects ``<meta charset=ENCODING>`` tag into head of document""" - def __init__(self, source, encoding): - """Creates a Filter - - :arg source: the source token stream - - :arg encoding: the encoding to set - - """ - base.Filter.__init__(self, source) - self.encoding = encoding - - def __iter__(self): - state = "pre_head" - meta_found = (self.encoding is None) - pending = [] - - for token in base.Filter.__iter__(self): - type = token["type"] - if type == "StartTag": - if token["name"].lower() == "head": - state = "in_head" - - elif type == "EmptyTag": - if token["name"].lower() == "meta": - # replace charset with actual encoding - has_http_equiv_content_type = False - for (namespace, name), value in token["data"].items(): - if namespace is not None: - continue - elif name.lower() == 'charset': - token["data"][(namespace, name)] = self.encoding - meta_found = True - break - elif name == 'http-equiv' and value.lower() == 'content-type': - has_http_equiv_content_type = True - else: - if has_http_equiv_content_type and (None, "content") in token["data"]: - token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding - meta_found = True - - elif token["name"].lower() == "head" and not meta_found: - # insert meta into empty head - yield {"type": "StartTag", "name": "head", - "data": token["data"]} - yield {"type": "EmptyTag", "name": "meta", - "data": {(None, "charset"): self.encoding}} - yield {"type": "EndTag", "name": "head"} - meta_found = True - continue - - elif type == "EndTag": - if token["name"].lower() == "head" and pending: - # insert meta into head (if necessary) and flush pending queue - yield pending.pop(0) - if not meta_found: - yield {"type": "EmptyTag", "name": "meta", - "data": {(None, "charset"): self.encoding}} - while pending: - yield pending.pop(0) - meta_found = True - state = "post_head" - - if state == "in_head": - pending.append(token) - else: - yield token diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/lint.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/lint.py deleted file mode 100644 index fcc07ee..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/lint.py +++ /dev/null @@ -1,93 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from pip._vendor.six import text_type - -from . import base -from ..constants import namespaces, voidElements - -from ..constants import spaceCharacters -spaceCharacters = "".join(spaceCharacters) - - -class Filter(base.Filter): - """Lints the token stream for errors - - If it finds any errors, it'll raise an ``AssertionError``. - - """ - def __init__(self, source, require_matching_tags=True): - """Creates a Filter - - :arg source: the source token stream - - :arg require_matching_tags: whether or not to require matching tags - - """ - super(Filter, self).__init__(source) - self.require_matching_tags = require_matching_tags - - def __iter__(self): - open_elements = [] - for token in base.Filter.__iter__(self): - type = token["type"] - if type in ("StartTag", "EmptyTag"): - namespace = token["namespace"] - name = token["name"] - assert namespace is None or isinstance(namespace, text_type) - assert namespace != "" - assert isinstance(name, text_type) - assert name != "" - assert isinstance(token["data"], dict) - if (not namespace or namespace == namespaces["html"]) and name in voidElements: - assert type == "EmptyTag" - else: - assert type == "StartTag" - if type == "StartTag" and self.require_matching_tags: - open_elements.append((namespace, name)) - for (namespace, name), value in token["data"].items(): - assert namespace is None or isinstance(namespace, text_type) - assert namespace != "" - assert isinstance(name, text_type) - assert name != "" - assert isinstance(value, text_type) - - elif type == "EndTag": - namespace = token["namespace"] - name = token["name"] - assert namespace is None or isinstance(namespace, text_type) - assert namespace != "" - assert isinstance(name, text_type) - assert name != "" - if (not namespace or namespace == namespaces["html"]) and name in voidElements: - assert False, "Void element reported as EndTag token: %(tag)s" % {"tag": name} - elif self.require_matching_tags: - start = open_elements.pop() - assert start == (namespace, name) - - elif type == "Comment": - data = token["data"] - assert isinstance(data, text_type) - - elif type in ("Characters", "SpaceCharacters"): - data = token["data"] - assert isinstance(data, text_type) - assert data != "" - if type == "SpaceCharacters": - assert data.strip(spaceCharacters) == "" - - elif type == "Doctype": - name = token["name"] - assert name is None or isinstance(name, text_type) - assert token["publicId"] is None or isinstance(name, text_type) - assert token["systemId"] is None or isinstance(name, text_type) - - elif type == "Entity": - assert isinstance(token["name"], text_type) - - elif type == "SerializerError": - assert isinstance(token["data"], text_type) - - else: - assert False, "Unknown token type: %(type)s" % {"type": type} - - yield token diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/optionaltags.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/optionaltags.py deleted file mode 100644 index 4a86501..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/optionaltags.py +++ /dev/null @@ -1,207 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from . import base - - -class Filter(base.Filter): - """Removes optional tags from the token stream""" - def slider(self): - previous1 = previous2 = None - for token in self.source: - if previous1 is not None: - yield previous2, previous1, token - previous2 = previous1 - previous1 = token - if previous1 is not None: - yield previous2, previous1, None - - def __iter__(self): - for previous, token, next in self.slider(): - type = token["type"] - if type == "StartTag": - if (token["data"] or - not self.is_optional_start(token["name"], previous, next)): - yield token - elif type == "EndTag": - if not self.is_optional_end(token["name"], next): - yield token - else: - yield token - - def is_optional_start(self, tagname, previous, next): - type = next and next["type"] or None - if tagname in 'html': - # An html element's start tag may be omitted if the first thing - # inside the html element is not a space character or a comment. - return type not in ("Comment", "SpaceCharacters") - elif tagname == 'head': - # A head element's start tag may be omitted if the first thing - # inside the head element is an element. - # XXX: we also omit the start tag if the head element is empty - if type in ("StartTag", "EmptyTag"): - return True - elif type == "EndTag": - return next["name"] == "head" - elif tagname == 'body': - # A body element's start tag may be omitted if the first thing - # inside the body element is not a space character or a comment, - # except if the first thing inside the body element is a script - # or style element and the node immediately preceding the body - # element is a head element whose end tag has been omitted. - if type in ("Comment", "SpaceCharacters"): - return False - elif type == "StartTag": - # XXX: we do not look at the preceding event, so we never omit - # the body element's start tag if it's followed by a script or - # a style element. - return next["name"] not in ('script', 'style') - else: - return True - elif tagname == 'colgroup': - # A colgroup element's start tag may be omitted if the first thing - # inside the colgroup element is a col element, and if the element - # is not immediately preceded by another colgroup element whose - # end tag has been omitted. - if type in ("StartTag", "EmptyTag"): - # XXX: we do not look at the preceding event, so instead we never - # omit the colgroup element's end tag when it is immediately - # followed by another colgroup element. See is_optional_end. - return next["name"] == "col" - else: - return False - elif tagname == 'tbody': - # A tbody element's start tag may be omitted if the first thing - # inside the tbody element is a tr element, and if the element is - # not immediately preceded by a tbody, thead, or tfoot element - # whose end tag has been omitted. - if type == "StartTag": - # omit the thead and tfoot elements' end tag when they are - # immediately followed by a tbody element. See is_optional_end. - if previous and previous['type'] == 'EndTag' and \ - previous['name'] in ('tbody', 'thead', 'tfoot'): - return False - return next["name"] == 'tr' - else: - return False - return False - - def is_optional_end(self, tagname, next): - type = next and next["type"] or None - if tagname in ('html', 'head', 'body'): - # An html element's end tag may be omitted if the html element - # is not immediately followed by a space character or a comment. - return type not in ("Comment", "SpaceCharacters") - elif tagname in ('li', 'optgroup', 'tr'): - # A li element's end tag may be omitted if the li element is - # immediately followed by another li element or if there is - # no more content in the parent element. - # An optgroup element's end tag may be omitted if the optgroup - # element is immediately followed by another optgroup element, - # or if there is no more content in the parent element. - # A tr element's end tag may be omitted if the tr element is - # immediately followed by another tr element, or if there is - # no more content in the parent element. - if type == "StartTag": - return next["name"] == tagname - else: - return type == "EndTag" or type is None - elif tagname in ('dt', 'dd'): - # A dt element's end tag may be omitted if the dt element is - # immediately followed by another dt element or a dd element. - # A dd element's end tag may be omitted if the dd element is - # immediately followed by another dd element or a dt element, - # or if there is no more content in the parent element. - if type == "StartTag": - return next["name"] in ('dt', 'dd') - elif tagname == 'dd': - return type == "EndTag" or type is None - else: - return False - elif tagname == 'p': - # A p element's end tag may be omitted if the p element is - # immediately followed by an address, article, aside, - # blockquote, datagrid, dialog, dir, div, dl, fieldset, - # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu, - # nav, ol, p, pre, section, table, or ul, element, or if - # there is no more content in the parent element. - if type in ("StartTag", "EmptyTag"): - return next["name"] in ('address', 'article', 'aside', - 'blockquote', 'datagrid', 'dialog', - 'dir', 'div', 'dl', 'fieldset', 'footer', - 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', - 'header', 'hr', 'menu', 'nav', 'ol', - 'p', 'pre', 'section', 'table', 'ul') - else: - return type == "EndTag" or type is None - elif tagname == 'option': - # An option element's end tag may be omitted if the option - # element is immediately followed by another option element, - # or if it is immediately followed by an <code>optgroup</code> - # element, or if there is no more content in the parent - # element. - if type == "StartTag": - return next["name"] in ('option', 'optgroup') - else: - return type == "EndTag" or type is None - elif tagname in ('rt', 'rp'): - # An rt element's end tag may be omitted if the rt element is - # immediately followed by an rt or rp element, or if there is - # no more content in the parent element. - # An rp element's end tag may be omitted if the rp element is - # immediately followed by an rt or rp element, or if there is - # no more content in the parent element. - if type == "StartTag": - return next["name"] in ('rt', 'rp') - else: - return type == "EndTag" or type is None - elif tagname == 'colgroup': - # A colgroup element's end tag may be omitted if the colgroup - # element is not immediately followed by a space character or - # a comment. - if type in ("Comment", "SpaceCharacters"): - return False - elif type == "StartTag": - # XXX: we also look for an immediately following colgroup - # element. See is_optional_start. - return next["name"] != 'colgroup' - else: - return True - elif tagname in ('thead', 'tbody'): - # A thead element's end tag may be omitted if the thead element - # is immediately followed by a tbody or tfoot element. - # A tbody element's end tag may be omitted if the tbody element - # is immediately followed by a tbody or tfoot element, or if - # there is no more content in the parent element. - # A tfoot element's end tag may be omitted if the tfoot element - # is immediately followed by a tbody element, or if there is no - # more content in the parent element. - # XXX: we never omit the end tag when the following element is - # a tbody. See is_optional_start. - if type == "StartTag": - return next["name"] in ['tbody', 'tfoot'] - elif tagname == 'tbody': - return type == "EndTag" or type is None - else: - return False - elif tagname == 'tfoot': - # A tfoot element's end tag may be omitted if the tfoot element - # is immediately followed by a tbody element, or if there is no - # more content in the parent element. - # XXX: we never omit the end tag when the following element is - # a tbody. See is_optional_start. - if type == "StartTag": - return next["name"] == 'tbody' - else: - return type == "EndTag" or type is None - elif tagname in ('td', 'th'): - # A td element's end tag may be omitted if the td element is - # immediately followed by a td or th element, or if there is - # no more content in the parent element. - # A th element's end tag may be omitted if the th element is - # immediately followed by a td or th element, or if there is - # no more content in the parent element. - if type == "StartTag": - return next["name"] in ('td', 'th') - else: - return type == "EndTag" or type is None - return False diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/sanitizer.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/sanitizer.py deleted file mode 100644 index af8e77b..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/sanitizer.py +++ /dev/null @@ -1,896 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import re -from xml.sax.saxutils import escape, unescape - -from pip._vendor.six.moves import urllib_parse as urlparse - -from . import base -from ..constants import namespaces, prefixes - -__all__ = ["Filter"] - - -allowed_elements = frozenset(( - (namespaces['html'], 'a'), - (namespaces['html'], 'abbr'), - (namespaces['html'], 'acronym'), - (namespaces['html'], 'address'), - (namespaces['html'], 'area'), - (namespaces['html'], 'article'), - (namespaces['html'], 'aside'), - (namespaces['html'], 'audio'), - (namespaces['html'], 'b'), - (namespaces['html'], 'big'), - (namespaces['html'], 'blockquote'), - (namespaces['html'], 'br'), - (namespaces['html'], 'button'), - (namespaces['html'], 'canvas'), - (namespaces['html'], 'caption'), - (namespaces['html'], 'center'), - (namespaces['html'], 'cite'), - (namespaces['html'], 'code'), - (namespaces['html'], 'col'), - (namespaces['html'], 'colgroup'), - (namespaces['html'], 'command'), - (namespaces['html'], 'datagrid'), - (namespaces['html'], 'datalist'), - (namespaces['html'], 'dd'), - (namespaces['html'], 'del'), - (namespaces['html'], 'details'), - (namespaces['html'], 'dfn'), - (namespaces['html'], 'dialog'), - (namespaces['html'], 'dir'), - (namespaces['html'], 'div'), - (namespaces['html'], 'dl'), - (namespaces['html'], 'dt'), - (namespaces['html'], 'em'), - (namespaces['html'], 'event-source'), - (namespaces['html'], 'fieldset'), - (namespaces['html'], 'figcaption'), - (namespaces['html'], 'figure'), - (namespaces['html'], 'footer'), - (namespaces['html'], 'font'), - (namespaces['html'], 'form'), - (namespaces['html'], 'header'), - (namespaces['html'], 'h1'), - (namespaces['html'], 'h2'), - (namespaces['html'], 'h3'), - (namespaces['html'], 'h4'), - (namespaces['html'], 'h5'), - (namespaces['html'], 'h6'), - (namespaces['html'], 'hr'), - (namespaces['html'], 'i'), - (namespaces['html'], 'img'), - (namespaces['html'], 'input'), - (namespaces['html'], 'ins'), - (namespaces['html'], 'keygen'), - (namespaces['html'], 'kbd'), - (namespaces['html'], 'label'), - (namespaces['html'], 'legend'), - (namespaces['html'], 'li'), - (namespaces['html'], 'm'), - (namespaces['html'], 'map'), - (namespaces['html'], 'menu'), - (namespaces['html'], 'meter'), - (namespaces['html'], 'multicol'), - (namespaces['html'], 'nav'), - (namespaces['html'], 'nextid'), - (namespaces['html'], 'ol'), - (namespaces['html'], 'output'), - (namespaces['html'], 'optgroup'), - (namespaces['html'], 'option'), - (namespaces['html'], 'p'), - (namespaces['html'], 'pre'), - (namespaces['html'], 'progress'), - (namespaces['html'], 'q'), - (namespaces['html'], 's'), - (namespaces['html'], 'samp'), - (namespaces['html'], 'section'), - (namespaces['html'], 'select'), - (namespaces['html'], 'small'), - (namespaces['html'], 'sound'), - (namespaces['html'], 'source'), - (namespaces['html'], 'spacer'), - (namespaces['html'], 'span'), - (namespaces['html'], 'strike'), - (namespaces['html'], 'strong'), - (namespaces['html'], 'sub'), - (namespaces['html'], 'sup'), - (namespaces['html'], 'table'), - (namespaces['html'], 'tbody'), - (namespaces['html'], 'td'), - (namespaces['html'], 'textarea'), - (namespaces['html'], 'time'), - (namespaces['html'], 'tfoot'), - (namespaces['html'], 'th'), - (namespaces['html'], 'thead'), - (namespaces['html'], 'tr'), - (namespaces['html'], 'tt'), - (namespaces['html'], 'u'), - (namespaces['html'], 'ul'), - (namespaces['html'], 'var'), - (namespaces['html'], 'video'), - (namespaces['mathml'], 'maction'), - (namespaces['mathml'], 'math'), - (namespaces['mathml'], 'merror'), - (namespaces['mathml'], 'mfrac'), - (namespaces['mathml'], 'mi'), - (namespaces['mathml'], 'mmultiscripts'), - (namespaces['mathml'], 'mn'), - (namespaces['mathml'], 'mo'), - (namespaces['mathml'], 'mover'), - (namespaces['mathml'], 'mpadded'), - (namespaces['mathml'], 'mphantom'), - (namespaces['mathml'], 'mprescripts'), - (namespaces['mathml'], 'mroot'), - (namespaces['mathml'], 'mrow'), - (namespaces['mathml'], 'mspace'), - (namespaces['mathml'], 'msqrt'), - (namespaces['mathml'], 'mstyle'), - (namespaces['mathml'], 'msub'), - (namespaces['mathml'], 'msubsup'), - (namespaces['mathml'], 'msup'), - (namespaces['mathml'], 'mtable'), - (namespaces['mathml'], 'mtd'), - (namespaces['mathml'], 'mtext'), - (namespaces['mathml'], 'mtr'), - (namespaces['mathml'], 'munder'), - (namespaces['mathml'], 'munderover'), - (namespaces['mathml'], 'none'), - (namespaces['svg'], 'a'), - (namespaces['svg'], 'animate'), - (namespaces['svg'], 'animateColor'), - (namespaces['svg'], 'animateMotion'), - (namespaces['svg'], 'animateTransform'), - (namespaces['svg'], 'clipPath'), - (namespaces['svg'], 'circle'), - (namespaces['svg'], 'defs'), - (namespaces['svg'], 'desc'), - (namespaces['svg'], 'ellipse'), - (namespaces['svg'], 'font-face'), - (namespaces['svg'], 'font-face-name'), - (namespaces['svg'], 'font-face-src'), - (namespaces['svg'], 'g'), - (namespaces['svg'], 'glyph'), - (namespaces['svg'], 'hkern'), - (namespaces['svg'], 'linearGradient'), - (namespaces['svg'], 'line'), - (namespaces['svg'], 'marker'), - (namespaces['svg'], 'metadata'), - (namespaces['svg'], 'missing-glyph'), - (namespaces['svg'], 'mpath'), - (namespaces['svg'], 'path'), - (namespaces['svg'], 'polygon'), - (namespaces['svg'], 'polyline'), - (namespaces['svg'], 'radialGradient'), - (namespaces['svg'], 'rect'), - (namespaces['svg'], 'set'), - (namespaces['svg'], 'stop'), - (namespaces['svg'], 'svg'), - (namespaces['svg'], 'switch'), - (namespaces['svg'], 'text'), - (namespaces['svg'], 'title'), - (namespaces['svg'], 'tspan'), - (namespaces['svg'], 'use'), -)) - -allowed_attributes = frozenset(( - # HTML attributes - (None, 'abbr'), - (None, 'accept'), - (None, 'accept-charset'), - (None, 'accesskey'), - (None, 'action'), - (None, 'align'), - (None, 'alt'), - (None, 'autocomplete'), - (None, 'autofocus'), - (None, 'axis'), - (None, 'background'), - (None, 'balance'), - (None, 'bgcolor'), - (None, 'bgproperties'), - (None, 'border'), - (None, 'bordercolor'), - (None, 'bordercolordark'), - (None, 'bordercolorlight'), - (None, 'bottompadding'), - (None, 'cellpadding'), - (None, 'cellspacing'), - (None, 'ch'), - (None, 'challenge'), - (None, 'char'), - (None, 'charoff'), - (None, 'choff'), - (None, 'charset'), - (None, 'checked'), - (None, 'cite'), - (None, 'class'), - (None, 'clear'), - (None, 'color'), - (None, 'cols'), - (None, 'colspan'), - (None, 'compact'), - (None, 'contenteditable'), - (None, 'controls'), - (None, 'coords'), - (None, 'data'), - (None, 'datafld'), - (None, 'datapagesize'), - (None, 'datasrc'), - (None, 'datetime'), - (None, 'default'), - (None, 'delay'), - (None, 'dir'), - (None, 'disabled'), - (None, 'draggable'), - (None, 'dynsrc'), - (None, 'enctype'), - (None, 'end'), - (None, 'face'), - (None, 'for'), - (None, 'form'), - (None, 'frame'), - (None, 'galleryimg'), - (None, 'gutter'), - (None, 'headers'), - (None, 'height'), - (None, 'hidefocus'), - (None, 'hidden'), - (None, 'high'), - (None, 'href'), - (None, 'hreflang'), - (None, 'hspace'), - (None, 'icon'), - (None, 'id'), - (None, 'inputmode'), - (None, 'ismap'), - (None, 'keytype'), - (None, 'label'), - (None, 'leftspacing'), - (None, 'lang'), - (None, 'list'), - (None, 'longdesc'), - (None, 'loop'), - (None, 'loopcount'), - (None, 'loopend'), - (None, 'loopstart'), - (None, 'low'), - (None, 'lowsrc'), - (None, 'max'), - (None, 'maxlength'), - (None, 'media'), - (None, 'method'), - (None, 'min'), - (None, 'multiple'), - (None, 'name'), - (None, 'nohref'), - (None, 'noshade'), - (None, 'nowrap'), - (None, 'open'), - (None, 'optimum'), - (None, 'pattern'), - (None, 'ping'), - (None, 'point-size'), - (None, 'poster'), - (None, 'pqg'), - (None, 'preload'), - (None, 'prompt'), - (None, 'radiogroup'), - (None, 'readonly'), - (None, 'rel'), - (None, 'repeat-max'), - (None, 'repeat-min'), - (None, 'replace'), - (None, 'required'), - (None, 'rev'), - (None, 'rightspacing'), - (None, 'rows'), - (None, 'rowspan'), - (None, 'rules'), - (None, 'scope'), - (None, 'selected'), - (None, 'shape'), - (None, 'size'), - (None, 'span'), - (None, 'src'), - (None, 'start'), - (None, 'step'), - (None, 'style'), - (None, 'summary'), - (None, 'suppress'), - (None, 'tabindex'), - (None, 'target'), - (None, 'template'), - (None, 'title'), - (None, 'toppadding'), - (None, 'type'), - (None, 'unselectable'), - (None, 'usemap'), - (None, 'urn'), - (None, 'valign'), - (None, 'value'), - (None, 'variable'), - (None, 'volume'), - (None, 'vspace'), - (None, 'vrml'), - (None, 'width'), - (None, 'wrap'), - (namespaces['xml'], 'lang'), - # MathML attributes - (None, 'actiontype'), - (None, 'align'), - (None, 'columnalign'), - (None, 'columnalign'), - (None, 'columnalign'), - (None, 'columnlines'), - (None, 'columnspacing'), - (None, 'columnspan'), - (None, 'depth'), - (None, 'display'), - (None, 'displaystyle'), - (None, 'equalcolumns'), - (None, 'equalrows'), - (None, 'fence'), - (None, 'fontstyle'), - (None, 'fontweight'), - (None, 'frame'), - (None, 'height'), - (None, 'linethickness'), - (None, 'lspace'), - (None, 'mathbackground'), - (None, 'mathcolor'), - (None, 'mathvariant'), - (None, 'mathvariant'), - (None, 'maxsize'), - (None, 'minsize'), - (None, 'other'), - (None, 'rowalign'), - (None, 'rowalign'), - (None, 'rowalign'), - (None, 'rowlines'), - (None, 'rowspacing'), - (None, 'rowspan'), - (None, 'rspace'), - (None, 'scriptlevel'), - (None, 'selection'), - (None, 'separator'), - (None, 'stretchy'), - (None, 'width'), - (None, 'width'), - (namespaces['xlink'], 'href'), - (namespaces['xlink'], 'show'), - (namespaces['xlink'], 'type'), - # SVG attributes - (None, 'accent-height'), - (None, 'accumulate'), - (None, 'additive'), - (None, 'alphabetic'), - (None, 'arabic-form'), - (None, 'ascent'), - (None, 'attributeName'), - (None, 'attributeType'), - (None, 'baseProfile'), - (None, 'bbox'), - (None, 'begin'), - (None, 'by'), - (None, 'calcMode'), - (None, 'cap-height'), - (None, 'class'), - (None, 'clip-path'), - (None, 'color'), - (None, 'color-rendering'), - (None, 'content'), - (None, 'cx'), - (None, 'cy'), - (None, 'd'), - (None, 'dx'), - (None, 'dy'), - (None, 'descent'), - (None, 'display'), - (None, 'dur'), - (None, 'end'), - (None, 'fill'), - (None, 'fill-opacity'), - (None, 'fill-rule'), - (None, 'font-family'), - (None, 'font-size'), - (None, 'font-stretch'), - (None, 'font-style'), - (None, 'font-variant'), - (None, 'font-weight'), - (None, 'from'), - (None, 'fx'), - (None, 'fy'), - (None, 'g1'), - (None, 'g2'), - (None, 'glyph-name'), - (None, 'gradientUnits'), - (None, 'hanging'), - (None, 'height'), - (None, 'horiz-adv-x'), - (None, 'horiz-origin-x'), - (None, 'id'), - (None, 'ideographic'), - (None, 'k'), - (None, 'keyPoints'), - (None, 'keySplines'), - (None, 'keyTimes'), - (None, 'lang'), - (None, 'marker-end'), - (None, 'marker-mid'), - (None, 'marker-start'), - (None, 'markerHeight'), - (None, 'markerUnits'), - (None, 'markerWidth'), - (None, 'mathematical'), - (None, 'max'), - (None, 'min'), - (None, 'name'), - (None, 'offset'), - (None, 'opacity'), - (None, 'orient'), - (None, 'origin'), - (None, 'overline-position'), - (None, 'overline-thickness'), - (None, 'panose-1'), - (None, 'path'), - (None, 'pathLength'), - (None, 'points'), - (None, 'preserveAspectRatio'), - (None, 'r'), - (None, 'refX'), - (None, 'refY'), - (None, 'repeatCount'), - (None, 'repeatDur'), - (None, 'requiredExtensions'), - (None, 'requiredFeatures'), - (None, 'restart'), - (None, 'rotate'), - (None, 'rx'), - (None, 'ry'), - (None, 'slope'), - (None, 'stemh'), - (None, 'stemv'), - (None, 'stop-color'), - (None, 'stop-opacity'), - (None, 'strikethrough-position'), - (None, 'strikethrough-thickness'), - (None, 'stroke'), - (None, 'stroke-dasharray'), - (None, 'stroke-dashoffset'), - (None, 'stroke-linecap'), - (None, 'stroke-linejoin'), - (None, 'stroke-miterlimit'), - (None, 'stroke-opacity'), - (None, 'stroke-width'), - (None, 'systemLanguage'), - (None, 'target'), - (None, 'text-anchor'), - (None, 'to'), - (None, 'transform'), - (None, 'type'), - (None, 'u1'), - (None, 'u2'), - (None, 'underline-position'), - (None, 'underline-thickness'), - (None, 'unicode'), - (None, 'unicode-range'), - (None, 'units-per-em'), - (None, 'values'), - (None, 'version'), - (None, 'viewBox'), - (None, 'visibility'), - (None, 'width'), - (None, 'widths'), - (None, 'x'), - (None, 'x-height'), - (None, 'x1'), - (None, 'x2'), - (namespaces['xlink'], 'actuate'), - (namespaces['xlink'], 'arcrole'), - (namespaces['xlink'], 'href'), - (namespaces['xlink'], 'role'), - (namespaces['xlink'], 'show'), - (namespaces['xlink'], 'title'), - (namespaces['xlink'], 'type'), - (namespaces['xml'], 'base'), - (namespaces['xml'], 'lang'), - (namespaces['xml'], 'space'), - (None, 'y'), - (None, 'y1'), - (None, 'y2'), - (None, 'zoomAndPan'), -)) - -attr_val_is_uri = frozenset(( - (None, 'href'), - (None, 'src'), - (None, 'cite'), - (None, 'action'), - (None, 'longdesc'), - (None, 'poster'), - (None, 'background'), - (None, 'datasrc'), - (None, 'dynsrc'), - (None, 'lowsrc'), - (None, 'ping'), - (namespaces['xlink'], 'href'), - (namespaces['xml'], 'base'), -)) - -svg_attr_val_allows_ref = frozenset(( - (None, 'clip-path'), - (None, 'color-profile'), - (None, 'cursor'), - (None, 'fill'), - (None, 'filter'), - (None, 'marker'), - (None, 'marker-start'), - (None, 'marker-mid'), - (None, 'marker-end'), - (None, 'mask'), - (None, 'stroke'), -)) - -svg_allow_local_href = frozenset(( - (None, 'altGlyph'), - (None, 'animate'), - (None, 'animateColor'), - (None, 'animateMotion'), - (None, 'animateTransform'), - (None, 'cursor'), - (None, 'feImage'), - (None, 'filter'), - (None, 'linearGradient'), - (None, 'pattern'), - (None, 'radialGradient'), - (None, 'textpath'), - (None, 'tref'), - (None, 'set'), - (None, 'use') -)) - -allowed_css_properties = frozenset(( - 'azimuth', - 'background-color', - 'border-bottom-color', - 'border-collapse', - 'border-color', - 'border-left-color', - 'border-right-color', - 'border-top-color', - 'clear', - 'color', - 'cursor', - 'direction', - 'display', - 'elevation', - 'float', - 'font', - 'font-family', - 'font-size', - 'font-style', - 'font-variant', - 'font-weight', - 'height', - 'letter-spacing', - 'line-height', - 'overflow', - 'pause', - 'pause-after', - 'pause-before', - 'pitch', - 'pitch-range', - 'richness', - 'speak', - 'speak-header', - 'speak-numeral', - 'speak-punctuation', - 'speech-rate', - 'stress', - 'text-align', - 'text-decoration', - 'text-indent', - 'unicode-bidi', - 'vertical-align', - 'voice-family', - 'volume', - 'white-space', - 'width', -)) - -allowed_css_keywords = frozenset(( - 'auto', - 'aqua', - 'black', - 'block', - 'blue', - 'bold', - 'both', - 'bottom', - 'brown', - 'center', - 'collapse', - 'dashed', - 'dotted', - 'fuchsia', - 'gray', - 'green', - '!important', - 'italic', - 'left', - 'lime', - 'maroon', - 'medium', - 'none', - 'navy', - 'normal', - 'nowrap', - 'olive', - 'pointer', - 'purple', - 'red', - 'right', - 'solid', - 'silver', - 'teal', - 'top', - 'transparent', - 'underline', - 'white', - 'yellow', -)) - -allowed_svg_properties = frozenset(( - 'fill', - 'fill-opacity', - 'fill-rule', - 'stroke', - 'stroke-width', - 'stroke-linecap', - 'stroke-linejoin', - 'stroke-opacity', -)) - -allowed_protocols = frozenset(( - 'ed2k', - 'ftp', - 'http', - 'https', - 'irc', - 'mailto', - 'news', - 'gopher', - 'nntp', - 'telnet', - 'webcal', - 'xmpp', - 'callto', - 'feed', - 'urn', - 'aim', - 'rsync', - 'tag', - 'ssh', - 'sftp', - 'rtsp', - 'afs', - 'data', -)) - -allowed_content_types = frozenset(( - 'image/png', - 'image/jpeg', - 'image/gif', - 'image/webp', - 'image/bmp', - 'text/plain', -)) - - -data_content_type = re.compile(r''' - ^ - # Match a content type <application>/<type> - (?P<content_type>[-a-zA-Z0-9.]+/[-a-zA-Z0-9.]+) - # Match any character set and encoding - (?:(?:;charset=(?:[-a-zA-Z0-9]+)(?:;(?:base64))?) - |(?:;(?:base64))?(?:;charset=(?:[-a-zA-Z0-9]+))?) - # Assume the rest is data - ,.* - $ - ''', - re.VERBOSE) - - -class Filter(base.Filter): - """Sanitizes token stream of XHTML+MathML+SVG and of inline style attributes""" - def __init__(self, - source, - allowed_elements=allowed_elements, - allowed_attributes=allowed_attributes, - allowed_css_properties=allowed_css_properties, - allowed_css_keywords=allowed_css_keywords, - allowed_svg_properties=allowed_svg_properties, - allowed_protocols=allowed_protocols, - allowed_content_types=allowed_content_types, - attr_val_is_uri=attr_val_is_uri, - svg_attr_val_allows_ref=svg_attr_val_allows_ref, - svg_allow_local_href=svg_allow_local_href): - """Creates a Filter - - :arg allowed_elements: set of elements to allow--everything else will - be escaped - - :arg allowed_attributes: set of attributes to allow in - elements--everything else will be stripped - - :arg allowed_css_properties: set of CSS properties to allow--everything - else will be stripped - - :arg allowed_css_keywords: set of CSS keywords to allow--everything - else will be stripped - - :arg allowed_svg_properties: set of SVG properties to allow--everything - else will be removed - - :arg allowed_protocols: set of allowed protocols for URIs - - :arg allowed_content_types: set of allowed content types for ``data`` URIs. - - :arg attr_val_is_uri: set of attributes that have URI values--values - that have a scheme not listed in ``allowed_protocols`` are removed - - :arg svg_attr_val_allows_ref: set of SVG attributes that can have - references - - :arg svg_allow_local_href: set of SVG elements that can have local - hrefs--these are removed - - """ - super(Filter, self).__init__(source) - self.allowed_elements = allowed_elements - self.allowed_attributes = allowed_attributes - self.allowed_css_properties = allowed_css_properties - self.allowed_css_keywords = allowed_css_keywords - self.allowed_svg_properties = allowed_svg_properties - self.allowed_protocols = allowed_protocols - self.allowed_content_types = allowed_content_types - self.attr_val_is_uri = attr_val_is_uri - self.svg_attr_val_allows_ref = svg_attr_val_allows_ref - self.svg_allow_local_href = svg_allow_local_href - - def __iter__(self): - for token in base.Filter.__iter__(self): - token = self.sanitize_token(token) - if token: - yield token - - # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and - # stripping out all attributes not in ALLOWED_ATTRIBUTES. Style attributes - # are parsed, and a restricted set, specified by ALLOWED_CSS_PROPERTIES and - # ALLOWED_CSS_KEYWORDS, are allowed through. attributes in ATTR_VAL_IS_URI - # are scanned, and only URI schemes specified in ALLOWED_PROTOCOLS are - # allowed. - # - # sanitize_html('<script> do_nasty_stuff() </script>') - # => <script> do_nasty_stuff() </script> - # sanitize_html('<a href="javascript: sucker();">Click here for $100</a>') - # => <a>Click here for $100</a> - def sanitize_token(self, token): - - # accommodate filters which use token_type differently - token_type = token["type"] - if token_type in ("StartTag", "EndTag", "EmptyTag"): - name = token["name"] - namespace = token["namespace"] - if ((namespace, name) in self.allowed_elements or - (namespace is None and - (namespaces["html"], name) in self.allowed_elements)): - return self.allowed_token(token) - else: - return self.disallowed_token(token) - elif token_type == "Comment": - pass - else: - return token - - def allowed_token(self, token): - if "data" in token: - attrs = token["data"] - attr_names = set(attrs.keys()) - - # Remove forbidden attributes - for to_remove in (attr_names - self.allowed_attributes): - del token["data"][to_remove] - attr_names.remove(to_remove) - - # Remove attributes with disallowed URL values - for attr in (attr_names & self.attr_val_is_uri): - assert attr in attrs - # I don't have a clue where this regexp comes from or why it matches those - # characters, nor why we call unescape. I just know it's always been here. - # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all - # this will do is remove *more* than it otherwise would. - val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\\s]+", '', - unescape(attrs[attr])).lower() - # remove replacement characters from unescaped characters - val_unescaped = val_unescaped.replace("\ufffd", "") - try: - uri = urlparse.urlparse(val_unescaped) - except ValueError: - uri = None - del attrs[attr] - if uri and uri.scheme: - if uri.scheme not in self.allowed_protocols: - del attrs[attr] - if uri.scheme == 'data': - m = data_content_type.match(uri.path) - if not m: - del attrs[attr] - elif m.group('content_type') not in self.allowed_content_types: - del attrs[attr] - - for attr in self.svg_attr_val_allows_ref: - if attr in attrs: - attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', - ' ', - unescape(attrs[attr])) - if (token["name"] in self.svg_allow_local_href and - (namespaces['xlink'], 'href') in attrs and re.search(r'^\s*[^#\s].*', - attrs[(namespaces['xlink'], 'href')])): - del attrs[(namespaces['xlink'], 'href')] - if (None, 'style') in attrs: - attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) - token["data"] = attrs - return token - - def disallowed_token(self, token): - token_type = token["type"] - if token_type == "EndTag": - token["data"] = "</%s>" % token["name"] - elif token["data"]: - assert token_type in ("StartTag", "EmptyTag") - attrs = [] - for (ns, name), v in token["data"].items(): - attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) - token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) - else: - token["data"] = "<%s>" % token["name"] - if token.get("selfClosing"): - token["data"] = token["data"][:-1] + "/>" - - token["type"] = "Characters" - - del token["name"] - return token - - def sanitize_css(self, style): - # disallow urls - style = re.compile(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) - - # gauntlet - if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): - return '' - if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): - return '' - - clean = [] - for prop, value in re.findall(r"([-\w]+)\s*:\s*([^:;]*)", style): - if not value: - continue - if prop.lower() in self.allowed_css_properties: - clean.append(prop + ': ' + value + ';') - elif prop.split('-')[0].lower() in ['background', 'border', 'margin', - 'padding']: - for keyword in value.split(): - if keyword not in self.allowed_css_keywords and \ - not re.match(r"^(#[0-9a-fA-F]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa - break - else: - clean.append(prop + ': ' + value + ';') - elif prop.lower() in self.allowed_svg_properties: - clean.append(prop + ': ' + value + ';') - - return ' '.join(clean) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/whitespace.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/whitespace.py deleted file mode 100644 index 0d12584..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/whitespace.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import re - -from . import base -from ..constants import rcdataElements, spaceCharacters -spaceCharacters = "".join(spaceCharacters) - -SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) - - -class Filter(base.Filter): - """Collapses whitespace except in pre, textarea, and script elements""" - spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) - - def __iter__(self): - preserve = 0 - for token in base.Filter.__iter__(self): - type = token["type"] - if type == "StartTag" \ - and (preserve or token["name"] in self.spacePreserveElements): - preserve += 1 - - elif type == "EndTag" and preserve: - preserve -= 1 - - elif not preserve and type == "SpaceCharacters" and token["data"]: - # Test on token["data"] above to not introduce spaces where there were not - token["data"] = " " - - elif not preserve and type == "Characters": - token["data"] = collapse_spaces(token["data"]) - - yield token - - -def collapse_spaces(text): - return SPACES_REGEX.sub(' ', text) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/html5parser.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/html5parser.py deleted file mode 100644 index ae41a13..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/html5parser.py +++ /dev/null @@ -1,2791 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import with_metaclass, viewkeys - -import types -from collections import OrderedDict - -from . import _inputstream -from . import _tokenizer - -from . import treebuilders -from .treebuilders.base import Marker - -from . import _utils -from .constants import ( - spaceCharacters, asciiUpper2Lower, - specialElements, headingElements, cdataElements, rcdataElements, - tokenTypes, tagTokenTypes, - namespaces, - htmlIntegrationPointElements, mathmlTextIntegrationPointElements, - adjustForeignAttributes as adjustForeignAttributesMap, - adjustMathMLAttributes, adjustSVGAttributes, - E, - _ReparseException -) - - -def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs): - """Parse an HTML document as a string or file-like object into a tree - - :arg doc: the document to parse as a string or file-like object - - :arg treebuilder: the treebuilder to use when parsing - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - :returns: parsed tree - - Example: - - >>> from html5lib.html5parser import parse - >>> parse('<html><body><p>This is a doc</p></body></html>') - <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0> - - """ - tb = treebuilders.getTreeBuilder(treebuilder) - p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parse(doc, **kwargs) - - -def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): - """Parse an HTML fragment as a string or file-like object into a tree - - :arg doc: the fragment to parse as a string or file-like object - - :arg container: the container context to parse the fragment in - - :arg treebuilder: the treebuilder to use when parsing - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - :returns: parsed tree - - Example: - - >>> from html5lib.html5libparser import parseFragment - >>> parseFragment('<b>this is a fragment</b>') - <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090> - - """ - tb = treebuilders.getTreeBuilder(treebuilder) - p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parseFragment(doc, container=container, **kwargs) - - -def method_decorator_metaclass(function): - class Decorated(type): - def __new__(meta, classname, bases, classDict): - for attributeName, attribute in classDict.items(): - if isinstance(attribute, types.FunctionType): - attribute = function(attribute) - - classDict[attributeName] = attribute - return type.__new__(meta, classname, bases, classDict) - return Decorated - - -class HTMLParser(object): - """HTML parser - - Generates a tree structure from a stream of (possibly malformed) HTML. - - """ - - def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): - """ - :arg tree: a treebuilder class controlling the type of tree that will be - returned. Built in treebuilders can be accessed through - html5lib.treebuilders.getTreeBuilder(treeType) - - :arg strict: raise an exception when a parse error is encountered - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - :arg debug: whether or not to enable debug mode which logs things - - Example: - - >>> from html5lib.html5parser import HTMLParser - >>> parser = HTMLParser() # generates parser with etree builder - >>> parser = HTMLParser('lxml', strict=True) # generates parser with lxml builder which is strict - - """ - - # Raise an exception on the first error encountered - self.strict = strict - - if tree is None: - tree = treebuilders.getTreeBuilder("etree") - self.tree = tree(namespaceHTMLElements) - self.errors = [] - - self.phases = dict([(name, cls(self, self.tree)) for name, cls in - getPhases(debug).items()]) - - def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): - - self.innerHTMLMode = innerHTML - self.container = container - self.scripting = scripting - self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) - self.reset() - - try: - self.mainLoop() - except _ReparseException: - self.reset() - self.mainLoop() - - def reset(self): - self.tree.reset() - self.firstStartTag = False - self.errors = [] - self.log = [] # only used with debug mode - # "quirks" / "limited quirks" / "no quirks" - self.compatMode = "no quirks" - - if self.innerHTMLMode: - self.innerHTML = self.container.lower() - - if self.innerHTML in cdataElements: - self.tokenizer.state = self.tokenizer.rcdataState - elif self.innerHTML in rcdataElements: - self.tokenizer.state = self.tokenizer.rawtextState - elif self.innerHTML == 'plaintext': - self.tokenizer.state = self.tokenizer.plaintextState - else: - # state already is data state - # self.tokenizer.state = self.tokenizer.dataState - pass - self.phase = self.phases["beforeHtml"] - self.phase.insertHtmlElement() - self.resetInsertionMode() - else: - self.innerHTML = False # pylint:disable=redefined-variable-type - self.phase = self.phases["initial"] - - self.lastPhase = None - - self.beforeRCDataPhase = None - - self.framesetOK = True - - @property - def documentEncoding(self): - """Name of the character encoding that was used to decode the input stream, or - :obj:`None` if that is not determined yet - - """ - if not hasattr(self, 'tokenizer'): - return None - return self.tokenizer.stream.charEncoding[0].name - - def isHTMLIntegrationPoint(self, element): - if (element.name == "annotation-xml" and - element.namespace == namespaces["mathml"]): - return ("encoding" in element.attributes and - element.attributes["encoding"].translate( - asciiUpper2Lower) in - ("text/html", "application/xhtml+xml")) - else: - return (element.namespace, element.name) in htmlIntegrationPointElements - - def isMathMLTextIntegrationPoint(self, element): - return (element.namespace, element.name) in mathmlTextIntegrationPointElements - - def mainLoop(self): - CharactersToken = tokenTypes["Characters"] - SpaceCharactersToken = tokenTypes["SpaceCharacters"] - StartTagToken = tokenTypes["StartTag"] - EndTagToken = tokenTypes["EndTag"] - CommentToken = tokenTypes["Comment"] - DoctypeToken = tokenTypes["Doctype"] - ParseErrorToken = tokenTypes["ParseError"] - - for token in self.normalizedTokens(): - prev_token = None - new_token = token - while new_token is not None: - prev_token = new_token - currentNode = self.tree.openElements[-1] if self.tree.openElements else None - currentNodeNamespace = currentNode.namespace if currentNode else None - currentNodeName = currentNode.name if currentNode else None - - type = new_token["type"] - - if type == ParseErrorToken: - self.parseError(new_token["data"], new_token.get("datavars", {})) - new_token = None - else: - if (len(self.tree.openElements) == 0 or - currentNodeNamespace == self.tree.defaultNamespace or - (self.isMathMLTextIntegrationPoint(currentNode) and - ((type == StartTagToken and - token["name"] not in frozenset(["mglyph", "malignmark"])) or - type in (CharactersToken, SpaceCharactersToken))) or - (currentNodeNamespace == namespaces["mathml"] and - currentNodeName == "annotation-xml" and - type == StartTagToken and - token["name"] == "svg") or - (self.isHTMLIntegrationPoint(currentNode) and - type in (StartTagToken, CharactersToken, SpaceCharactersToken))): - phase = self.phase - else: - phase = self.phases["inForeignContent"] - - if type == CharactersToken: - new_token = phase.processCharacters(new_token) - elif type == SpaceCharactersToken: - new_token = phase.processSpaceCharacters(new_token) - elif type == StartTagToken: - new_token = phase.processStartTag(new_token) - elif type == EndTagToken: - new_token = phase.processEndTag(new_token) - elif type == CommentToken: - new_token = phase.processComment(new_token) - elif type == DoctypeToken: - new_token = phase.processDoctype(new_token) - - if (type == StartTagToken and prev_token["selfClosing"] and - not prev_token["selfClosingAcknowledged"]): - self.parseError("non-void-element-with-trailing-solidus", - {"name": prev_token["name"]}) - - # When the loop finishes it's EOF - reprocess = True - phases = [] - while reprocess: - phases.append(self.phase) - reprocess = self.phase.processEOF() - if reprocess: - assert self.phase not in phases - - def normalizedTokens(self): - for token in self.tokenizer: - yield self.normalizeToken(token) - - def parse(self, stream, *args, **kwargs): - """Parse a HTML document into a well-formed tree - - :arg stream: a file-like object or string containing the HTML to be parsed - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element). - - :arg scripting: treat noscript elements as if JavaScript was turned on - - :returns: parsed tree - - Example: - - >>> from html5lib.html5parser import HTMLParser - >>> parser = HTMLParser() - >>> parser.parse('<html><body><p>This is a doc</p></body></html>') - <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0> - - """ - self._parse(stream, False, None, *args, **kwargs) - return self.tree.getDocument() - - def parseFragment(self, stream, *args, **kwargs): - """Parse a HTML fragment into a well-formed tree fragment - - :arg container: name of the element we're setting the innerHTML - property if set to None, default to 'div' - - :arg stream: a file-like object or string containing the HTML to be parsed - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element) - - :arg scripting: treat noscript elements as if JavaScript was turned on - - :returns: parsed tree - - Example: - - >>> from html5lib.html5libparser import HTMLParser - >>> parser = HTMLParser() - >>> parser.parseFragment('<b>this is a fragment</b>') - <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090> - - """ - self._parse(stream, True, *args, **kwargs) - return self.tree.getFragment() - - def parseError(self, errorcode="XXX-undefined-error", datavars=None): - # XXX The idea is to make errorcode mandatory. - if datavars is None: - datavars = {} - self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) - if self.strict: - raise ParseError(E[errorcode] % datavars) - - def normalizeToken(self, token): - # HTML5 specific normalizations to the token stream - if token["type"] == tokenTypes["StartTag"]: - raw = token["data"] - token["data"] = OrderedDict(raw) - if len(raw) > len(token["data"]): - # we had some duplicated attribute, fix so first wins - token["data"].update(raw[::-1]) - - return token - - def adjustMathMLAttributes(self, token): - adjust_attributes(token, adjustMathMLAttributes) - - def adjustSVGAttributes(self, token): - adjust_attributes(token, adjustSVGAttributes) - - def adjustForeignAttributes(self, token): - adjust_attributes(token, adjustForeignAttributesMap) - - def reparseTokenNormal(self, token): - # pylint:disable=unused-argument - self.parser.phase() - - def resetInsertionMode(self): - # The name of this method is mostly historical. (It's also used in the - # specification.) - last = False - newModes = { - "select": "inSelect", - "td": "inCell", - "th": "inCell", - "tr": "inRow", - "tbody": "inTableBody", - "thead": "inTableBody", - "tfoot": "inTableBody", - "caption": "inCaption", - "colgroup": "inColumnGroup", - "table": "inTable", - "head": "inBody", - "body": "inBody", - "frameset": "inFrameset", - "html": "beforeHead" - } - for node in self.tree.openElements[::-1]: - nodeName = node.name - new_phase = None - if node == self.tree.openElements[0]: - assert self.innerHTML - last = True - nodeName = self.innerHTML - # Check for conditions that should only happen in the innerHTML - # case - if nodeName in ("select", "colgroup", "head", "html"): - assert self.innerHTML - - if not last and node.namespace != self.tree.defaultNamespace: - continue - - if nodeName in newModes: - new_phase = self.phases[newModes[nodeName]] - break - elif last: - new_phase = self.phases["inBody"] - break - - self.phase = new_phase - - def parseRCDataRawtext(self, token, contentType): - # Generic RCDATA/RAWTEXT Parsing algorithm - assert contentType in ("RAWTEXT", "RCDATA") - - self.tree.insertElement(token) - - if contentType == "RAWTEXT": - self.tokenizer.state = self.tokenizer.rawtextState - else: - self.tokenizer.state = self.tokenizer.rcdataState - - self.originalPhase = self.phase - - self.phase = self.phases["text"] - - -@_utils.memoize -def getPhases(debug): - def log(function): - """Logger that records which phase processes each token""" - type_names = dict((value, key) for key, value in - tokenTypes.items()) - - def wrapped(self, *args, **kwargs): - if function.__name__.startswith("process") and len(args) > 0: - token = args[0] - try: - info = {"type": type_names[token['type']]} - except: - raise - if token['type'] in tagTokenTypes: - info["name"] = token['name'] - - self.parser.log.append((self.parser.tokenizer.state.__name__, - self.parser.phase.__class__.__name__, - self.__class__.__name__, - function.__name__, - info)) - return function(self, *args, **kwargs) - else: - return function(self, *args, **kwargs) - return wrapped - - def getMetaclass(use_metaclass, metaclass_func): - if use_metaclass: - return method_decorator_metaclass(metaclass_func) - else: - return type - - # pylint:disable=unused-argument - class Phase(with_metaclass(getMetaclass(debug, log))): - """Base class for helper object that implements each phase of processing - """ - - def __init__(self, parser, tree): - self.parser = parser - self.tree = tree - - def processEOF(self): - raise NotImplementedError - - def processComment(self, token): - # For most phases the following is correct. Where it's not it will be - # overridden. - self.tree.insertComment(token, self.tree.openElements[-1]) - - def processDoctype(self, token): - self.parser.parseError("unexpected-doctype") - - def processCharacters(self, token): - self.tree.insertText(token["data"]) - - def processSpaceCharacters(self, token): - self.tree.insertText(token["data"]) - - def processStartTag(self, token): - return self.startTagHandler[token["name"]](token) - - def startTagHtml(self, token): - if not self.parser.firstStartTag and token["name"] == "html": - self.parser.parseError("non-html-root") - # XXX Need a check here to see if the first start tag token emitted is - # this token... If it's not, invoke self.parser.parseError(). - for attr, value in token["data"].items(): - if attr not in self.tree.openElements[0].attributes: - self.tree.openElements[0].attributes[attr] = value - self.parser.firstStartTag = False - - def processEndTag(self, token): - return self.endTagHandler[token["name"]](token) - - class InitialPhase(Phase): - def processSpaceCharacters(self, token): - pass - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processDoctype(self, token): - name = token["name"] - publicId = token["publicId"] - systemId = token["systemId"] - correct = token["correct"] - - if (name != "html" or publicId is not None or - systemId is not None and systemId != "about:legacy-compat"): - self.parser.parseError("unknown-doctype") - - if publicId is None: - publicId = "" - - self.tree.insertDoctype(token) - - if publicId != "": - publicId = publicId.translate(asciiUpper2Lower) - - if (not correct or token["name"] != "html" or - publicId.startswith( - ("+//silmaril//dtd html pro v0r11 19970101//", - "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", - "-//as//dtd html 3.0 aswedit + extensions//", - "-//ietf//dtd html 2.0 level 1//", - "-//ietf//dtd html 2.0 level 2//", - "-//ietf//dtd html 2.0 strict level 1//", - "-//ietf//dtd html 2.0 strict level 2//", - "-//ietf//dtd html 2.0 strict//", - "-//ietf//dtd html 2.0//", - "-//ietf//dtd html 2.1e//", - "-//ietf//dtd html 3.0//", - "-//ietf//dtd html 3.2 final//", - "-//ietf//dtd html 3.2//", - "-//ietf//dtd html 3//", - "-//ietf//dtd html level 0//", - "-//ietf//dtd html level 1//", - "-//ietf//dtd html level 2//", - "-//ietf//dtd html level 3//", - "-//ietf//dtd html strict level 0//", - "-//ietf//dtd html strict level 1//", - "-//ietf//dtd html strict level 2//", - "-//ietf//dtd html strict level 3//", - "-//ietf//dtd html strict//", - "-//ietf//dtd html//", - "-//metrius//dtd metrius presentational//", - "-//microsoft//dtd internet explorer 2.0 html strict//", - "-//microsoft//dtd internet explorer 2.0 html//", - "-//microsoft//dtd internet explorer 2.0 tables//", - "-//microsoft//dtd internet explorer 3.0 html strict//", - "-//microsoft//dtd internet explorer 3.0 html//", - "-//microsoft//dtd internet explorer 3.0 tables//", - "-//netscape comm. corp.//dtd html//", - "-//netscape comm. corp.//dtd strict html//", - "-//o'reilly and associates//dtd html 2.0//", - "-//o'reilly and associates//dtd html extended 1.0//", - "-//o'reilly and associates//dtd html extended relaxed 1.0//", - "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", - "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", - "-//spyglass//dtd html 2.0 extended//", - "-//sq//dtd html 2.0 hotmetal + extensions//", - "-//sun microsystems corp.//dtd hotjava html//", - "-//sun microsystems corp.//dtd hotjava strict html//", - "-//w3c//dtd html 3 1995-03-24//", - "-//w3c//dtd html 3.2 draft//", - "-//w3c//dtd html 3.2 final//", - "-//w3c//dtd html 3.2//", - "-//w3c//dtd html 3.2s draft//", - "-//w3c//dtd html 4.0 frameset//", - "-//w3c//dtd html 4.0 transitional//", - "-//w3c//dtd html experimental 19960712//", - "-//w3c//dtd html experimental 970421//", - "-//w3c//dtd w3 html//", - "-//w3o//dtd w3 html 3.0//", - "-//webtechs//dtd mozilla html 2.0//", - "-//webtechs//dtd mozilla html//")) or - publicId in ("-//w3o//dtd w3 html strict 3.0//en//", - "-/w3c/dtd html 4.0 transitional/en", - "html") or - publicId.startswith( - ("-//w3c//dtd html 4.01 frameset//", - "-//w3c//dtd html 4.01 transitional//")) and - systemId is None or - systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): - self.parser.compatMode = "quirks" - elif (publicId.startswith( - ("-//w3c//dtd xhtml 1.0 frameset//", - "-//w3c//dtd xhtml 1.0 transitional//")) or - publicId.startswith( - ("-//w3c//dtd html 4.01 frameset//", - "-//w3c//dtd html 4.01 transitional//")) and - systemId is not None): - self.parser.compatMode = "limited quirks" - - self.parser.phase = self.parser.phases["beforeHtml"] - - def anythingElse(self): - self.parser.compatMode = "quirks" - self.parser.phase = self.parser.phases["beforeHtml"] - - def processCharacters(self, token): - self.parser.parseError("expected-doctype-but-got-chars") - self.anythingElse() - return token - - def processStartTag(self, token): - self.parser.parseError("expected-doctype-but-got-start-tag", - {"name": token["name"]}) - self.anythingElse() - return token - - def processEndTag(self, token): - self.parser.parseError("expected-doctype-but-got-end-tag", - {"name": token["name"]}) - self.anythingElse() - return token - - def processEOF(self): - self.parser.parseError("expected-doctype-but-got-eof") - self.anythingElse() - return True - - class BeforeHtmlPhase(Phase): - # helper methods - def insertHtmlElement(self): - self.tree.insertRoot(impliedTagToken("html", "StartTag")) - self.parser.phase = self.parser.phases["beforeHead"] - - # other - def processEOF(self): - self.insertHtmlElement() - return True - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processSpaceCharacters(self, token): - pass - - def processCharacters(self, token): - self.insertHtmlElement() - return token - - def processStartTag(self, token): - if token["name"] == "html": - self.parser.firstStartTag = True - self.insertHtmlElement() - return token - - def processEndTag(self, token): - if token["name"] not in ("head", "body", "html", "br"): - self.parser.parseError("unexpected-end-tag-before-html", - {"name": token["name"]}) - else: - self.insertHtmlElement() - return token - - class BeforeHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - (("head", "body", "html", "br"), self.endTagImplyHead) - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.startTagHead(impliedTagToken("head", "StartTag")) - return True - - def processSpaceCharacters(self, token): - pass - - def processCharacters(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagHead(self, token): - self.tree.insertElement(token) - self.tree.headPointer = self.tree.openElements[-1] - self.parser.phase = self.parser.phases["inHead"] - - def startTagOther(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def endTagImplyHead(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def endTagOther(self, token): - self.parser.parseError("end-tag-after-implied-root", - {"name": token["name"]}) - - class InHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("title", self.startTagTitle), - (("noframes", "style"), self.startTagNoFramesStyle), - ("noscript", self.startTagNoscript), - ("script", self.startTagScript), - (("base", "basefont", "bgsound", "command", "link"), - self.startTagBaseLinkCommand), - ("meta", self.startTagMeta), - ("head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("head", self.endTagHead), - (("br", "html", "body"), self.endTagHtmlBodyBr) - ]) - self.endTagHandler.default = self.endTagOther - - # the real thing - def processEOF(self): - self.anythingElse() - return True - - def processCharacters(self, token): - self.anythingElse() - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagHead(self, token): - self.parser.parseError("two-heads-are-not-better-than-one") - - def startTagBaseLinkCommand(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagMeta(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - attributes = token["data"] - if self.parser.tokenizer.stream.charEncoding[1] == "tentative": - if "charset" in attributes: - self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) - elif ("content" in attributes and - "http-equiv" in attributes and - attributes["http-equiv"].lower() == "content-type"): - # Encoding it as UTF-8 here is a hack, as really we should pass - # the abstract Unicode string, and just use the - # ContentAttrParser on that, but using UTF-8 allows all chars - # to be encoded and as a ASCII-superset works. - data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) - parser = _inputstream.ContentAttrParser(data) - codec = parser.parse() - self.parser.tokenizer.stream.changeEncoding(codec) - - def startTagTitle(self, token): - self.parser.parseRCDataRawtext(token, "RCDATA") - - def startTagNoFramesStyle(self, token): - # Need to decide whether to implement the scripting-disabled case - self.parser.parseRCDataRawtext(token, "RAWTEXT") - - def startTagNoscript(self, token): - if self.parser.scripting: - self.parser.parseRCDataRawtext(token, "RAWTEXT") - else: - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inHeadNoscript"] - - def startTagScript(self, token): - self.tree.insertElement(token) - self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState - self.parser.originalPhase = self.parser.phase - self.parser.phase = self.parser.phases["text"] - - def startTagOther(self, token): - self.anythingElse() - return token - - def endTagHead(self, token): - node = self.parser.tree.openElements.pop() - assert node.name == "head", "Expected head got %s" % node.name - self.parser.phase = self.parser.phases["afterHead"] - - def endTagHtmlBodyBr(self, token): - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - self.endTagHead(impliedTagToken("head")) - - class InHeadNoscriptPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), - (("head", "noscript"), self.startTagHeadNoscript), - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("noscript", self.endTagNoscript), - ("br", self.endTagBr), - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.parser.parseError("eof-in-head-noscript") - self.anythingElse() - return True - - def processComment(self, token): - return self.parser.phases["inHead"].processComment(token) - - def processCharacters(self, token): - self.parser.parseError("char-in-head-noscript") - self.anythingElse() - return token - - def processSpaceCharacters(self, token): - return self.parser.phases["inHead"].processSpaceCharacters(token) - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagBaseLinkCommand(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagHeadNoscript(self, token): - self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) - - def startTagOther(self, token): - self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) - self.anythingElse() - return token - - def endTagNoscript(self, token): - node = self.parser.tree.openElements.pop() - assert node.name == "noscript", "Expected noscript got %s" % node.name - self.parser.phase = self.parser.phases["inHead"] - - def endTagBr(self, token): - self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - # Caller must raise parse error first! - self.endTagNoscript(impliedTagToken("noscript")) - - class AfterHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("body", self.startTagBody), - ("frameset", self.startTagFrameset), - (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", - "style", "title"), - self.startTagFromHead), - ("head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), - self.endTagHtmlBodyBr)]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.anythingElse() - return True - - def processCharacters(self, token): - self.anythingElse() - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagBody(self, token): - self.parser.framesetOK = False - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inBody"] - - def startTagFrameset(self, token): - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inFrameset"] - - def startTagFromHead(self, token): - self.parser.parseError("unexpected-start-tag-out-of-my-head", - {"name": token["name"]}) - self.tree.openElements.append(self.tree.headPointer) - self.parser.phases["inHead"].processStartTag(token) - for node in self.tree.openElements[::-1]: - if node.name == "head": - self.tree.openElements.remove(node) - break - - def startTagHead(self, token): - self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) - - def startTagOther(self, token): - self.anythingElse() - return token - - def endTagHtmlBodyBr(self, token): - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - self.tree.insertElement(impliedTagToken("body", "StartTag")) - self.parser.phase = self.parser.phases["inBody"] - self.parser.framesetOK = True - - class InBodyPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody - # the really-really-really-very crazy mode - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - # Set this to the default handler - self.processSpaceCharacters = self.processSpaceCharactersNonPre - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("base", "basefont", "bgsound", "command", "link", "meta", - "script", "style", "title"), - self.startTagProcessInHead), - ("body", self.startTagBody), - ("frameset", self.startTagFrameset), - (("address", "article", "aside", "blockquote", "center", "details", - "dir", "div", "dl", "fieldset", "figcaption", "figure", - "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", - "section", "summary", "ul"), - self.startTagCloseP), - (headingElements, self.startTagHeading), - (("pre", "listing"), self.startTagPreListing), - ("form", self.startTagForm), - (("li", "dd", "dt"), self.startTagListItem), - ("plaintext", self.startTagPlaintext), - ("a", self.startTagA), - (("b", "big", "code", "em", "font", "i", "s", "small", "strike", - "strong", "tt", "u"), self.startTagFormatting), - ("nobr", self.startTagNobr), - ("button", self.startTagButton), - (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), - ("xmp", self.startTagXmp), - ("table", self.startTagTable), - (("area", "br", "embed", "img", "keygen", "wbr"), - self.startTagVoidFormatting), - (("param", "source", "track"), self.startTagParamSource), - ("input", self.startTagInput), - ("hr", self.startTagHr), - ("image", self.startTagImage), - ("isindex", self.startTagIsIndex), - ("textarea", self.startTagTextarea), - ("iframe", self.startTagIFrame), - ("noscript", self.startTagNoscript), - (("noembed", "noframes"), self.startTagRawtext), - ("select", self.startTagSelect), - (("rp", "rt"), self.startTagRpRt), - (("option", "optgroup"), self.startTagOpt), - (("math"), self.startTagMath), - (("svg"), self.startTagSvg), - (("caption", "col", "colgroup", "frame", "head", - "tbody", "td", "tfoot", "th", "thead", - "tr"), self.startTagMisplaced) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("body", self.endTagBody), - ("html", self.endTagHtml), - (("address", "article", "aside", "blockquote", "button", "center", - "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", - "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", - "section", "summary", "ul"), self.endTagBlock), - ("form", self.endTagForm), - ("p", self.endTagP), - (("dd", "dt", "li"), self.endTagListItem), - (headingElements, self.endTagHeading), - (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", - "strike", "strong", "tt", "u"), self.endTagFormatting), - (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), - ("br", self.endTagBr), - ]) - self.endTagHandler.default = self.endTagOther - - def isMatchingFormattingElement(self, node1, node2): - return (node1.name == node2.name and - node1.namespace == node2.namespace and - node1.attributes == node2.attributes) - - # helper - def addFormattingElement(self, token): - self.tree.insertElement(token) - element = self.tree.openElements[-1] - - matchingElements = [] - for node in self.tree.activeFormattingElements[::-1]: - if node is Marker: - break - elif self.isMatchingFormattingElement(node, element): - matchingElements.append(node) - - assert len(matchingElements) <= 3 - if len(matchingElements) == 3: - self.tree.activeFormattingElements.remove(matchingElements[-1]) - self.tree.activeFormattingElements.append(element) - - # the real deal - def processEOF(self): - allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", - "tfoot", "th", "thead", "tr", "body", - "html")) - for node in self.tree.openElements[::-1]: - if node.name not in allowed_elements: - self.parser.parseError("expected-closing-tag-but-got-eof") - break - # Stop parsing - - def processSpaceCharactersDropNewline(self, token): - # Sometimes (start of <pre>, <listing>, and <textarea> blocks) we - # want to drop leading newlines - data = token["data"] - self.processSpaceCharacters = self.processSpaceCharactersNonPre - if (data.startswith("\n") and - self.tree.openElements[-1].name in ("pre", "listing", "textarea") and - not self.tree.openElements[-1].hasContent()): - data = data[1:] - if data: - self.tree.reconstructActiveFormattingElements() - self.tree.insertText(data) - - def processCharacters(self, token): - if token["data"] == "\u0000": - # The tokenizer should always emit null on its own - return - self.tree.reconstructActiveFormattingElements() - self.tree.insertText(token["data"]) - # This must be bad for performance - if (self.parser.framesetOK and - any([char not in spaceCharacters - for char in token["data"]])): - self.parser.framesetOK = False - - def processSpaceCharactersNonPre(self, token): - self.tree.reconstructActiveFormattingElements() - self.tree.insertText(token["data"]) - - def startTagProcessInHead(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagBody(self, token): - self.parser.parseError("unexpected-start-tag", {"name": "body"}) - if (len(self.tree.openElements) == 1 or - self.tree.openElements[1].name != "body"): - assert self.parser.innerHTML - else: - self.parser.framesetOK = False - for attr, value in token["data"].items(): - if attr not in self.tree.openElements[1].attributes: - self.tree.openElements[1].attributes[attr] = value - - def startTagFrameset(self, token): - self.parser.parseError("unexpected-start-tag", {"name": "frameset"}) - if (len(self.tree.openElements) == 1 or self.tree.openElements[1].name != "body"): - assert self.parser.innerHTML - elif not self.parser.framesetOK: - pass - else: - if self.tree.openElements[1].parent: - self.tree.openElements[1].parent.removeChild(self.tree.openElements[1]) - while self.tree.openElements[-1].name != "html": - self.tree.openElements.pop() - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inFrameset"] - - def startTagCloseP(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.insertElement(token) - - def startTagPreListing(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.insertElement(token) - self.parser.framesetOK = False - self.processSpaceCharacters = self.processSpaceCharactersDropNewline - - def startTagForm(self, token): - if self.tree.formPointer: - self.parser.parseError("unexpected-start-tag", {"name": "form"}) - else: - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.insertElement(token) - self.tree.formPointer = self.tree.openElements[-1] - - def startTagListItem(self, token): - self.parser.framesetOK = False - - stopNamesMap = {"li": ["li"], - "dt": ["dt", "dd"], - "dd": ["dt", "dd"]} - stopNames = stopNamesMap[token["name"]] - for node in reversed(self.tree.openElements): - if node.name in stopNames: - self.parser.phase.processEndTag( - impliedTagToken(node.name, "EndTag")) - break - if (node.nameTuple in specialElements and - node.name not in ("address", "div", "p")): - break - - if self.tree.elementInScope("p", variant="button"): - self.parser.phase.processEndTag( - impliedTagToken("p", "EndTag")) - - self.tree.insertElement(token) - - def startTagPlaintext(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.insertElement(token) - self.parser.tokenizer.state = self.parser.tokenizer.plaintextState - - def startTagHeading(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - if self.tree.openElements[-1].name in headingElements: - self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) - self.tree.openElements.pop() - self.tree.insertElement(token) - - def startTagA(self, token): - afeAElement = self.tree.elementInActiveFormattingElements("a") - if afeAElement: - self.parser.parseError("unexpected-start-tag-implies-end-tag", - {"startName": "a", "endName": "a"}) - self.endTagFormatting(impliedTagToken("a")) - if afeAElement in self.tree.openElements: - self.tree.openElements.remove(afeAElement) - if afeAElement in self.tree.activeFormattingElements: - self.tree.activeFormattingElements.remove(afeAElement) - self.tree.reconstructActiveFormattingElements() - self.addFormattingElement(token) - - def startTagFormatting(self, token): - self.tree.reconstructActiveFormattingElements() - self.addFormattingElement(token) - - def startTagNobr(self, token): - self.tree.reconstructActiveFormattingElements() - if self.tree.elementInScope("nobr"): - self.parser.parseError("unexpected-start-tag-implies-end-tag", - {"startName": "nobr", "endName": "nobr"}) - self.processEndTag(impliedTagToken("nobr")) - # XXX Need tests that trigger the following - self.tree.reconstructActiveFormattingElements() - self.addFormattingElement(token) - - def startTagButton(self, token): - if self.tree.elementInScope("button"): - self.parser.parseError("unexpected-start-tag-implies-end-tag", - {"startName": "button", "endName": "button"}) - self.processEndTag(impliedTagToken("button")) - return token - else: - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(token) - self.parser.framesetOK = False - - def startTagAppletMarqueeObject(self, token): - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(token) - self.tree.activeFormattingElements.append(Marker) - self.parser.framesetOK = False - - def startTagXmp(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.reconstructActiveFormattingElements() - self.parser.framesetOK = False - self.parser.parseRCDataRawtext(token, "RAWTEXT") - - def startTagTable(self, token): - if self.parser.compatMode != "quirks": - if self.tree.elementInScope("p", variant="button"): - self.processEndTag(impliedTagToken("p")) - self.tree.insertElement(token) - self.parser.framesetOK = False - self.parser.phase = self.parser.phases["inTable"] - - def startTagVoidFormatting(self, token): - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - self.parser.framesetOK = False - - def startTagInput(self, token): - framesetOK = self.parser.framesetOK - self.startTagVoidFormatting(token) - if ("type" in token["data"] and - token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): - # input type=hidden doesn't change framesetOK - self.parser.framesetOK = framesetOK - - def startTagParamSource(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagHr(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - self.parser.framesetOK = False - - def startTagImage(self, token): - # No really... - self.parser.parseError("unexpected-start-tag-treated-as", - {"originalName": "image", "newName": "img"}) - self.processStartTag(impliedTagToken("img", "StartTag", - attributes=token["data"], - selfClosing=token["selfClosing"])) - - def startTagIsIndex(self, token): - self.parser.parseError("deprecated-tag", {"name": "isindex"}) - if self.tree.formPointer: - return - form_attrs = {} - if "action" in token["data"]: - form_attrs["action"] = token["data"]["action"] - self.processStartTag(impliedTagToken("form", "StartTag", - attributes=form_attrs)) - self.processStartTag(impliedTagToken("hr", "StartTag")) - self.processStartTag(impliedTagToken("label", "StartTag")) - # XXX Localization ... - if "prompt" in token["data"]: - prompt = token["data"]["prompt"] - else: - prompt = "This is a searchable index. Enter search keywords: " - self.processCharacters( - {"type": tokenTypes["Characters"], "data": prompt}) - attributes = token["data"].copy() - if "action" in attributes: - del attributes["action"] - if "prompt" in attributes: - del attributes["prompt"] - attributes["name"] = "isindex" - self.processStartTag(impliedTagToken("input", "StartTag", - attributes=attributes, - selfClosing=token["selfClosing"])) - self.processEndTag(impliedTagToken("label")) - self.processStartTag(impliedTagToken("hr", "StartTag")) - self.processEndTag(impliedTagToken("form")) - - def startTagTextarea(self, token): - self.tree.insertElement(token) - self.parser.tokenizer.state = self.parser.tokenizer.rcdataState - self.processSpaceCharacters = self.processSpaceCharactersDropNewline - self.parser.framesetOK = False - - def startTagIFrame(self, token): - self.parser.framesetOK = False - self.startTagRawtext(token) - - def startTagNoscript(self, token): - if self.parser.scripting: - self.startTagRawtext(token) - else: - self.startTagOther(token) - - def startTagRawtext(self, token): - """iframe, noembed noframes, noscript(if scripting enabled)""" - self.parser.parseRCDataRawtext(token, "RAWTEXT") - - def startTagOpt(self, token): - if self.tree.openElements[-1].name == "option": - self.parser.phase.processEndTag(impliedTagToken("option")) - self.tree.reconstructActiveFormattingElements() - self.parser.tree.insertElement(token) - - def startTagSelect(self, token): - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(token) - self.parser.framesetOK = False - if self.parser.phase in (self.parser.phases["inTable"], - self.parser.phases["inCaption"], - self.parser.phases["inColumnGroup"], - self.parser.phases["inTableBody"], - self.parser.phases["inRow"], - self.parser.phases["inCell"]): - self.parser.phase = self.parser.phases["inSelectInTable"] - else: - self.parser.phase = self.parser.phases["inSelect"] - - def startTagRpRt(self, token): - if self.tree.elementInScope("ruby"): - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1].name != "ruby": - self.parser.parseError() - self.tree.insertElement(token) - - def startTagMath(self, token): - self.tree.reconstructActiveFormattingElements() - self.parser.adjustMathMLAttributes(token) - self.parser.adjustForeignAttributes(token) - token["namespace"] = namespaces["mathml"] - self.tree.insertElement(token) - # Need to get the parse error right for the case where the token - # has a namespace not equal to the xmlns attribute - if token["selfClosing"]: - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagSvg(self, token): - self.tree.reconstructActiveFormattingElements() - self.parser.adjustSVGAttributes(token) - self.parser.adjustForeignAttributes(token) - token["namespace"] = namespaces["svg"] - self.tree.insertElement(token) - # Need to get the parse error right for the case where the token - # has a namespace not equal to the xmlns attribute - if token["selfClosing"]: - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagMisplaced(self, token): - """ Elements that should be children of other elements that have a - different insertion mode; here they are ignored - "caption", "col", "colgroup", "frame", "frameset", "head", - "option", "optgroup", "tbody", "td", "tfoot", "th", "thead", - "tr", "noscript" - """ - self.parser.parseError("unexpected-start-tag-ignored", {"name": token["name"]}) - - def startTagOther(self, token): - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(token) - - def endTagP(self, token): - if not self.tree.elementInScope("p", variant="button"): - self.startTagCloseP(impliedTagToken("p", "StartTag")) - self.parser.parseError("unexpected-end-tag", {"name": "p"}) - self.endTagP(impliedTagToken("p", "EndTag")) - else: - self.tree.generateImpliedEndTags("p") - if self.tree.openElements[-1].name != "p": - self.parser.parseError("unexpected-end-tag", {"name": "p"}) - node = self.tree.openElements.pop() - while node.name != "p": - node = self.tree.openElements.pop() - - def endTagBody(self, token): - if not self.tree.elementInScope("body"): - self.parser.parseError() - return - elif self.tree.openElements[-1].name != "body": - for node in self.tree.openElements[2:]: - if node.name not in frozenset(("dd", "dt", "li", "optgroup", - "option", "p", "rp", "rt", - "tbody", "td", "tfoot", - "th", "thead", "tr", "body", - "html")): - # Not sure this is the correct name for the parse error - self.parser.parseError( - "expected-one-end-tag-but-got-another", - {"gotName": "body", "expectedName": node.name}) - break - self.parser.phase = self.parser.phases["afterBody"] - - def endTagHtml(self, token): - # We repeat the test for the body end tag token being ignored here - if self.tree.elementInScope("body"): - self.endTagBody(impliedTagToken("body")) - return token - - def endTagBlock(self, token): - # Put us back in the right whitespace handling mode - if token["name"] == "pre": - self.processSpaceCharacters = self.processSpaceCharactersNonPre - inScope = self.tree.elementInScope(token["name"]) - if inScope: - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError("end-tag-too-early", {"name": token["name"]}) - if inScope: - node = self.tree.openElements.pop() - while node.name != token["name"]: - node = self.tree.openElements.pop() - - def endTagForm(self, token): - node = self.tree.formPointer - self.tree.formPointer = None - if node is None or not self.tree.elementInScope(node): - self.parser.parseError("unexpected-end-tag", - {"name": "form"}) - else: - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1] != node: - self.parser.parseError("end-tag-too-early-ignored", - {"name": "form"}) - self.tree.openElements.remove(node) - - def endTagListItem(self, token): - if token["name"] == "li": - variant = "list" - else: - variant = None - if not self.tree.elementInScope(token["name"], variant=variant): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - else: - self.tree.generateImpliedEndTags(exclude=token["name"]) - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError( - "end-tag-too-early", - {"name": token["name"]}) - node = self.tree.openElements.pop() - while node.name != token["name"]: - node = self.tree.openElements.pop() - - def endTagHeading(self, token): - for item in headingElements: - if self.tree.elementInScope(item): - self.tree.generateImpliedEndTags() - break - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError("end-tag-too-early", {"name": token["name"]}) - - for item in headingElements: - if self.tree.elementInScope(item): - item = self.tree.openElements.pop() - while item.name not in headingElements: - item = self.tree.openElements.pop() - break - - def endTagFormatting(self, token): - """The much-feared adoption agency algorithm""" - # http://svn.whatwg.org/webapps/complete.html#adoptionAgency revision 7867 - # XXX Better parseError messages appreciated. - - # Step 1 - outerLoopCounter = 0 - - # Step 2 - while outerLoopCounter < 8: - - # Step 3 - outerLoopCounter += 1 - - # Step 4: - - # Let the formatting element be the last element in - # the list of active formatting elements that: - # - is between the end of the list and the last scope - # marker in the list, if any, or the start of the list - # otherwise, and - # - has the same tag name as the token. - formattingElement = self.tree.elementInActiveFormattingElements( - token["name"]) - if (not formattingElement or - (formattingElement in self.tree.openElements and - not self.tree.elementInScope(formattingElement.name))): - # If there is no such node, then abort these steps - # and instead act as described in the "any other - # end tag" entry below. - self.endTagOther(token) - return - - # Otherwise, if there is such a node, but that node is - # not in the stack of open elements, then this is a - # parse error; remove the element from the list, and - # abort these steps. - elif formattingElement not in self.tree.openElements: - self.parser.parseError("adoption-agency-1.2", {"name": token["name"]}) - self.tree.activeFormattingElements.remove(formattingElement) - return - - # Otherwise, if there is such a node, and that node is - # also in the stack of open elements, but the element - # is not in scope, then this is a parse error; ignore - # the token, and abort these steps. - elif not self.tree.elementInScope(formattingElement.name): - self.parser.parseError("adoption-agency-4.4", {"name": token["name"]}) - return - - # Otherwise, there is a formatting element and that - # element is in the stack and is in scope. If the - # element is not the current node, this is a parse - # error. In any case, proceed with the algorithm as - # written in the following steps. - else: - if formattingElement != self.tree.openElements[-1]: - self.parser.parseError("adoption-agency-1.3", {"name": token["name"]}) - - # Step 5: - - # Let the furthest block be the topmost node in the - # stack of open elements that is lower in the stack - # than the formatting element, and is an element in - # the special category. There might not be one. - afeIndex = self.tree.openElements.index(formattingElement) - furthestBlock = None - for element in self.tree.openElements[afeIndex:]: - if element.nameTuple in specialElements: - furthestBlock = element - break - - # Step 6: - - # If there is no furthest block, then the UA must - # first pop all the nodes from the bottom of the stack - # of open elements, from the current node up to and - # including the formatting element, then remove the - # formatting element from the list of active - # formatting elements, and finally abort these steps. - if furthestBlock is None: - element = self.tree.openElements.pop() - while element != formattingElement: - element = self.tree.openElements.pop() - self.tree.activeFormattingElements.remove(element) - return - - # Step 7 - commonAncestor = self.tree.openElements[afeIndex - 1] - - # Step 8: - # The bookmark is supposed to help us identify where to reinsert - # nodes in step 15. We have to ensure that we reinsert nodes after - # the node before the active formatting element. Note the bookmark - # can move in step 9.7 - bookmark = self.tree.activeFormattingElements.index(formattingElement) - - # Step 9 - lastNode = node = furthestBlock - innerLoopCounter = 0 - - index = self.tree.openElements.index(node) - while innerLoopCounter < 3: - innerLoopCounter += 1 - # Node is element before node in open elements - index -= 1 - node = self.tree.openElements[index] - if node not in self.tree.activeFormattingElements: - self.tree.openElements.remove(node) - continue - # Step 9.6 - if node == formattingElement: - break - # Step 9.7 - if lastNode == furthestBlock: - bookmark = self.tree.activeFormattingElements.index(node) + 1 - # Step 9.8 - clone = node.cloneNode() - # Replace node with clone - self.tree.activeFormattingElements[ - self.tree.activeFormattingElements.index(node)] = clone - self.tree.openElements[ - self.tree.openElements.index(node)] = clone - node = clone - # Step 9.9 - # Remove lastNode from its parents, if any - if lastNode.parent: - lastNode.parent.removeChild(lastNode) - node.appendChild(lastNode) - # Step 9.10 - lastNode = node - - # Step 10 - # Foster parent lastNode if commonAncestor is a - # table, tbody, tfoot, thead, or tr we need to foster - # parent the lastNode - if lastNode.parent: - lastNode.parent.removeChild(lastNode) - - if commonAncestor.name in frozenset(("table", "tbody", "tfoot", "thead", "tr")): - parent, insertBefore = self.tree.getTableMisnestedNodePosition() - parent.insertBefore(lastNode, insertBefore) - else: - commonAncestor.appendChild(lastNode) - - # Step 11 - clone = formattingElement.cloneNode() - - # Step 12 - furthestBlock.reparentChildren(clone) - - # Step 13 - furthestBlock.appendChild(clone) - - # Step 14 - self.tree.activeFormattingElements.remove(formattingElement) - self.tree.activeFormattingElements.insert(bookmark, clone) - - # Step 15 - self.tree.openElements.remove(formattingElement) - self.tree.openElements.insert( - self.tree.openElements.index(furthestBlock) + 1, clone) - - def endTagAppletMarqueeObject(self, token): - if self.tree.elementInScope(token["name"]): - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError("end-tag-too-early", {"name": token["name"]}) - - if self.tree.elementInScope(token["name"]): - element = self.tree.openElements.pop() - while element.name != token["name"]: - element = self.tree.openElements.pop() - self.tree.clearActiveFormattingElements() - - def endTagBr(self, token): - self.parser.parseError("unexpected-end-tag-treated-as", - {"originalName": "br", "newName": "br element"}) - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(impliedTagToken("br", "StartTag")) - self.tree.openElements.pop() - - def endTagOther(self, token): - for node in self.tree.openElements[::-1]: - if node.name == token["name"]: - self.tree.generateImpliedEndTags(exclude=token["name"]) - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - while self.tree.openElements.pop() != node: - pass - break - else: - if node.nameTuple in specialElements: - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - break - - class TextPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.startTagHandler = _utils.MethodDispatcher([]) - self.startTagHandler.default = self.startTagOther - self.endTagHandler = _utils.MethodDispatcher([ - ("script", self.endTagScript)]) - self.endTagHandler.default = self.endTagOther - - def processCharacters(self, token): - self.tree.insertText(token["data"]) - - def processEOF(self): - self.parser.parseError("expected-named-closing-tag-but-got-eof", - {"name": self.tree.openElements[-1].name}) - self.tree.openElements.pop() - self.parser.phase = self.parser.originalPhase - return True - - def startTagOther(self, token): - assert False, "Tried to process start tag %s in RCDATA/RAWTEXT mode" % token['name'] - - def endTagScript(self, token): - node = self.tree.openElements.pop() - assert node.name == "script" - self.parser.phase = self.parser.originalPhase - # The rest of this method is all stuff that only happens if - # document.write works - - def endTagOther(self, token): - self.tree.openElements.pop() - self.parser.phase = self.parser.originalPhase - - class InTablePhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-table - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("caption", self.startTagCaption), - ("colgroup", self.startTagColgroup), - ("col", self.startTagCol), - (("tbody", "tfoot", "thead"), self.startTagRowGroup), - (("td", "th", "tr"), self.startTagImplyTbody), - ("table", self.startTagTable), - (("style", "script"), self.startTagStyleScript), - ("input", self.startTagInput), - ("form", self.startTagForm) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("table", self.endTagTable), - (("body", "caption", "col", "colgroup", "html", "tbody", "td", - "tfoot", "th", "thead", "tr"), self.endTagIgnore) - ]) - self.endTagHandler.default = self.endTagOther - - # helper methods - def clearStackToTableContext(self): - # "clear the stack back to a table context" - while self.tree.openElements[-1].name not in ("table", "html"): - # self.parser.parseError("unexpected-implied-end-tag-in-table", - # {"name": self.tree.openElements[-1].name}) - self.tree.openElements.pop() - # When the current node is <html> it's an innerHTML case - - # processing methods - def processEOF(self): - if self.tree.openElements[-1].name != "html": - self.parser.parseError("eof-in-table") - else: - assert self.parser.innerHTML - # Stop parsing - - def processSpaceCharacters(self, token): - originalPhase = self.parser.phase - self.parser.phase = self.parser.phases["inTableText"] - self.parser.phase.originalPhase = originalPhase - self.parser.phase.processSpaceCharacters(token) - - def processCharacters(self, token): - originalPhase = self.parser.phase - self.parser.phase = self.parser.phases["inTableText"] - self.parser.phase.originalPhase = originalPhase - self.parser.phase.processCharacters(token) - - def insertText(self, token): - # If we get here there must be at least one non-whitespace character - # Do the table magic! - self.tree.insertFromTable = True - self.parser.phases["inBody"].processCharacters(token) - self.tree.insertFromTable = False - - def startTagCaption(self, token): - self.clearStackToTableContext() - self.tree.activeFormattingElements.append(Marker) - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inCaption"] - - def startTagColgroup(self, token): - self.clearStackToTableContext() - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inColumnGroup"] - - def startTagCol(self, token): - self.startTagColgroup(impliedTagToken("colgroup", "StartTag")) - return token - - def startTagRowGroup(self, token): - self.clearStackToTableContext() - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inTableBody"] - - def startTagImplyTbody(self, token): - self.startTagRowGroup(impliedTagToken("tbody", "StartTag")) - return token - - def startTagTable(self, token): - self.parser.parseError("unexpected-start-tag-implies-end-tag", - {"startName": "table", "endName": "table"}) - self.parser.phase.processEndTag(impliedTagToken("table")) - if not self.parser.innerHTML: - return token - - def startTagStyleScript(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagInput(self, token): - if ("type" in token["data"] and - token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): - self.parser.parseError("unexpected-hidden-input-in-table") - self.tree.insertElement(token) - # XXX associate with form - self.tree.openElements.pop() - else: - self.startTagOther(token) - - def startTagForm(self, token): - self.parser.parseError("unexpected-form-in-table") - if self.tree.formPointer is None: - self.tree.insertElement(token) - self.tree.formPointer = self.tree.openElements[-1] - self.tree.openElements.pop() - - def startTagOther(self, token): - self.parser.parseError("unexpected-start-tag-implies-table-voodoo", {"name": token["name"]}) - # Do the table magic! - self.tree.insertFromTable = True - self.parser.phases["inBody"].processStartTag(token) - self.tree.insertFromTable = False - - def endTagTable(self, token): - if self.tree.elementInScope("table", variant="table"): - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1].name != "table": - self.parser.parseError("end-tag-too-early-named", - {"gotName": "table", - "expectedName": self.tree.openElements[-1].name}) - while self.tree.openElements[-1].name != "table": - self.tree.openElements.pop() - self.tree.openElements.pop() - self.parser.resetInsertionMode() - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def endTagIgnore(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag-implies-table-voodoo", {"name": token["name"]}) - # Do the table magic! - self.tree.insertFromTable = True - self.parser.phases["inBody"].processEndTag(token) - self.tree.insertFromTable = False - - class InTableTextPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.originalPhase = None - self.characterTokens = [] - - def flushCharacters(self): - data = "".join([item["data"] for item in self.characterTokens]) - if any([item not in spaceCharacters for item in data]): - token = {"type": tokenTypes["Characters"], "data": data} - self.parser.phases["inTable"].insertText(token) - elif data: - self.tree.insertText(data) - self.characterTokens = [] - - def processComment(self, token): - self.flushCharacters() - self.parser.phase = self.originalPhase - return token - - def processEOF(self): - self.flushCharacters() - self.parser.phase = self.originalPhase - return True - - def processCharacters(self, token): - if token["data"] == "\u0000": - return - self.characterTokens.append(token) - - def processSpaceCharacters(self, token): - # pretty sure we should never reach here - self.characterTokens.append(token) - # assert False - - def processStartTag(self, token): - self.flushCharacters() - self.parser.phase = self.originalPhase - return token - - def processEndTag(self, token): - self.flushCharacters() - self.parser.phase = self.originalPhase - return token - - class InCaptionPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-caption - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", - "thead", "tr"), self.startTagTableElement) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("caption", self.endTagCaption), - ("table", self.endTagTable), - (("body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", - "thead", "tr"), self.endTagIgnore) - ]) - self.endTagHandler.default = self.endTagOther - - def ignoreEndTagCaption(self): - return not self.tree.elementInScope("caption", variant="table") - - def processEOF(self): - self.parser.phases["inBody"].processEOF() - - def processCharacters(self, token): - return self.parser.phases["inBody"].processCharacters(token) - - def startTagTableElement(self, token): - self.parser.parseError() - # XXX Have to duplicate logic here to find out if the tag is ignored - ignoreEndTag = self.ignoreEndTagCaption() - self.parser.phase.processEndTag(impliedTagToken("caption")) - if not ignoreEndTag: - return token - - def startTagOther(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def endTagCaption(self, token): - if not self.ignoreEndTagCaption(): - # AT this code is quite similar to endTagTable in "InTable" - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1].name != "caption": - self.parser.parseError("expected-one-end-tag-but-got-another", - {"gotName": "caption", - "expectedName": self.tree.openElements[-1].name}) - while self.tree.openElements[-1].name != "caption": - self.tree.openElements.pop() - self.tree.openElements.pop() - self.tree.clearActiveFormattingElements() - self.parser.phase = self.parser.phases["inTable"] - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def endTagTable(self, token): - self.parser.parseError() - ignoreEndTag = self.ignoreEndTagCaption() - self.parser.phase.processEndTag(impliedTagToken("caption")) - if not ignoreEndTag: - return token - - def endTagIgnore(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def endTagOther(self, token): - return self.parser.phases["inBody"].processEndTag(token) - - class InColumnGroupPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-column - - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("col", self.startTagCol) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("colgroup", self.endTagColgroup), - ("col", self.endTagCol) - ]) - self.endTagHandler.default = self.endTagOther - - def ignoreEndTagColgroup(self): - return self.tree.openElements[-1].name == "html" - - def processEOF(self): - if self.tree.openElements[-1].name == "html": - assert self.parser.innerHTML - return - else: - ignoreEndTag = self.ignoreEndTagColgroup() - self.endTagColgroup(impliedTagToken("colgroup")) - if not ignoreEndTag: - return True - - def processCharacters(self, token): - ignoreEndTag = self.ignoreEndTagColgroup() - self.endTagColgroup(impliedTagToken("colgroup")) - if not ignoreEndTag: - return token - - def startTagCol(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagOther(self, token): - ignoreEndTag = self.ignoreEndTagColgroup() - self.endTagColgroup(impliedTagToken("colgroup")) - if not ignoreEndTag: - return token - - def endTagColgroup(self, token): - if self.ignoreEndTagColgroup(): - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - else: - self.tree.openElements.pop() - self.parser.phase = self.parser.phases["inTable"] - - def endTagCol(self, token): - self.parser.parseError("no-end-tag", {"name": "col"}) - - def endTagOther(self, token): - ignoreEndTag = self.ignoreEndTagColgroup() - self.endTagColgroup(impliedTagToken("colgroup")) - if not ignoreEndTag: - return token - - class InTableBodyPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-table0 - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("tr", self.startTagTr), - (("td", "th"), self.startTagTableCell), - (("caption", "col", "colgroup", "tbody", "tfoot", "thead"), - self.startTagTableOther) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), - ("table", self.endTagTable), - (("body", "caption", "col", "colgroup", "html", "td", "th", - "tr"), self.endTagIgnore) - ]) - self.endTagHandler.default = self.endTagOther - - # helper methods - def clearStackToTableBodyContext(self): - while self.tree.openElements[-1].name not in ("tbody", "tfoot", - "thead", "html"): - # self.parser.parseError("unexpected-implied-end-tag-in-table", - # {"name": self.tree.openElements[-1].name}) - self.tree.openElements.pop() - if self.tree.openElements[-1].name == "html": - assert self.parser.innerHTML - - # the rest - def processEOF(self): - self.parser.phases["inTable"].processEOF() - - def processSpaceCharacters(self, token): - return self.parser.phases["inTable"].processSpaceCharacters(token) - - def processCharacters(self, token): - return self.parser.phases["inTable"].processCharacters(token) - - def startTagTr(self, token): - self.clearStackToTableBodyContext() - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inRow"] - - def startTagTableCell(self, token): - self.parser.parseError("unexpected-cell-in-table-body", - {"name": token["name"]}) - self.startTagTr(impliedTagToken("tr", "StartTag")) - return token - - def startTagTableOther(self, token): - # XXX AT Any ideas on how to share this with endTagTable? - if (self.tree.elementInScope("tbody", variant="table") or - self.tree.elementInScope("thead", variant="table") or - self.tree.elementInScope("tfoot", variant="table")): - self.clearStackToTableBodyContext() - self.endTagTableRowGroup( - impliedTagToken(self.tree.openElements[-1].name)) - return token - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def startTagOther(self, token): - return self.parser.phases["inTable"].processStartTag(token) - - def endTagTableRowGroup(self, token): - if self.tree.elementInScope(token["name"], variant="table"): - self.clearStackToTableBodyContext() - self.tree.openElements.pop() - self.parser.phase = self.parser.phases["inTable"] - else: - self.parser.parseError("unexpected-end-tag-in-table-body", - {"name": token["name"]}) - - def endTagTable(self, token): - if (self.tree.elementInScope("tbody", variant="table") or - self.tree.elementInScope("thead", variant="table") or - self.tree.elementInScope("tfoot", variant="table")): - self.clearStackToTableBodyContext() - self.endTagTableRowGroup( - impliedTagToken(self.tree.openElements[-1].name)) - return token - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def endTagIgnore(self, token): - self.parser.parseError("unexpected-end-tag-in-table-body", - {"name": token["name"]}) - - def endTagOther(self, token): - return self.parser.phases["inTable"].processEndTag(token) - - class InRowPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-row - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("td", "th"), self.startTagTableCell), - (("caption", "col", "colgroup", "tbody", "tfoot", "thead", - "tr"), self.startTagTableOther) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("tr", self.endTagTr), - ("table", self.endTagTable), - (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), - (("body", "caption", "col", "colgroup", "html", "td", "th"), - self.endTagIgnore) - ]) - self.endTagHandler.default = self.endTagOther - - # helper methods (XXX unify this with other table helper methods) - def clearStackToTableRowContext(self): - while self.tree.openElements[-1].name not in ("tr", "html"): - self.parser.parseError("unexpected-implied-end-tag-in-table-row", - {"name": self.tree.openElements[-1].name}) - self.tree.openElements.pop() - - def ignoreEndTagTr(self): - return not self.tree.elementInScope("tr", variant="table") - - # the rest - def processEOF(self): - self.parser.phases["inTable"].processEOF() - - def processSpaceCharacters(self, token): - return self.parser.phases["inTable"].processSpaceCharacters(token) - - def processCharacters(self, token): - return self.parser.phases["inTable"].processCharacters(token) - - def startTagTableCell(self, token): - self.clearStackToTableRowContext() - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inCell"] - self.tree.activeFormattingElements.append(Marker) - - def startTagTableOther(self, token): - ignoreEndTag = self.ignoreEndTagTr() - self.endTagTr(impliedTagToken("tr")) - # XXX how are we sure it's always ignored in the innerHTML case? - if not ignoreEndTag: - return token - - def startTagOther(self, token): - return self.parser.phases["inTable"].processStartTag(token) - - def endTagTr(self, token): - if not self.ignoreEndTagTr(): - self.clearStackToTableRowContext() - self.tree.openElements.pop() - self.parser.phase = self.parser.phases["inTableBody"] - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def endTagTable(self, token): - ignoreEndTag = self.ignoreEndTagTr() - self.endTagTr(impliedTagToken("tr")) - # Reprocess the current tag if the tr end tag was not ignored - # XXX how are we sure it's always ignored in the innerHTML case? - if not ignoreEndTag: - return token - - def endTagTableRowGroup(self, token): - if self.tree.elementInScope(token["name"], variant="table"): - self.endTagTr(impliedTagToken("tr")) - return token - else: - self.parser.parseError() - - def endTagIgnore(self, token): - self.parser.parseError("unexpected-end-tag-in-table-row", - {"name": token["name"]}) - - def endTagOther(self, token): - return self.parser.phases["inTable"].processEndTag(token) - - class InCellPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-cell - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", - "thead", "tr"), self.startTagTableOther) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - (("td", "th"), self.endTagTableCell), - (("body", "caption", "col", "colgroup", "html"), self.endTagIgnore), - (("table", "tbody", "tfoot", "thead", "tr"), self.endTagImply) - ]) - self.endTagHandler.default = self.endTagOther - - # helper - def closeCell(self): - if self.tree.elementInScope("td", variant="table"): - self.endTagTableCell(impliedTagToken("td")) - elif self.tree.elementInScope("th", variant="table"): - self.endTagTableCell(impliedTagToken("th")) - - # the rest - def processEOF(self): - self.parser.phases["inBody"].processEOF() - - def processCharacters(self, token): - return self.parser.phases["inBody"].processCharacters(token) - - def startTagTableOther(self, token): - if (self.tree.elementInScope("td", variant="table") or - self.tree.elementInScope("th", variant="table")): - self.closeCell() - return token - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def startTagOther(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def endTagTableCell(self, token): - if self.tree.elementInScope(token["name"], variant="table"): - self.tree.generateImpliedEndTags(token["name"]) - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError("unexpected-cell-end-tag", - {"name": token["name"]}) - while True: - node = self.tree.openElements.pop() - if node.name == token["name"]: - break - else: - self.tree.openElements.pop() - self.tree.clearActiveFormattingElements() - self.parser.phase = self.parser.phases["inRow"] - else: - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def endTagIgnore(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def endTagImply(self, token): - if self.tree.elementInScope(token["name"], variant="table"): - self.closeCell() - return token - else: - # sometimes innerHTML case - self.parser.parseError() - - def endTagOther(self, token): - return self.parser.phases["inBody"].processEndTag(token) - - class InSelectPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("option", self.startTagOption), - ("optgroup", self.startTagOptgroup), - ("select", self.startTagSelect), - (("input", "keygen", "textarea"), self.startTagInput), - ("script", self.startTagScript) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("option", self.endTagOption), - ("optgroup", self.endTagOptgroup), - ("select", self.endTagSelect) - ]) - self.endTagHandler.default = self.endTagOther - - # http://www.whatwg.org/specs/web-apps/current-work/#in-select - def processEOF(self): - if self.tree.openElements[-1].name != "html": - self.parser.parseError("eof-in-select") - else: - assert self.parser.innerHTML - - def processCharacters(self, token): - if token["data"] == "\u0000": - return - self.tree.insertText(token["data"]) - - def startTagOption(self, token): - # We need to imply </option> if <option> is the current node. - if self.tree.openElements[-1].name == "option": - self.tree.openElements.pop() - self.tree.insertElement(token) - - def startTagOptgroup(self, token): - if self.tree.openElements[-1].name == "option": - self.tree.openElements.pop() - if self.tree.openElements[-1].name == "optgroup": - self.tree.openElements.pop() - self.tree.insertElement(token) - - def startTagSelect(self, token): - self.parser.parseError("unexpected-select-in-select") - self.endTagSelect(impliedTagToken("select")) - - def startTagInput(self, token): - self.parser.parseError("unexpected-input-in-select") - if self.tree.elementInScope("select", variant="select"): - self.endTagSelect(impliedTagToken("select")) - return token - else: - assert self.parser.innerHTML - - def startTagScript(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("unexpected-start-tag-in-select", - {"name": token["name"]}) - - def endTagOption(self, token): - if self.tree.openElements[-1].name == "option": - self.tree.openElements.pop() - else: - self.parser.parseError("unexpected-end-tag-in-select", - {"name": "option"}) - - def endTagOptgroup(self, token): - # </optgroup> implicitly closes <option> - if (self.tree.openElements[-1].name == "option" and - self.tree.openElements[-2].name == "optgroup"): - self.tree.openElements.pop() - # It also closes </optgroup> - if self.tree.openElements[-1].name == "optgroup": - self.tree.openElements.pop() - # But nothing else - else: - self.parser.parseError("unexpected-end-tag-in-select", - {"name": "optgroup"}) - - def endTagSelect(self, token): - if self.tree.elementInScope("select", variant="select"): - node = self.tree.openElements.pop() - while node.name != "select": - node = self.tree.openElements.pop() - self.parser.resetInsertionMode() - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag-in-select", - {"name": token["name"]}) - - class InSelectInTablePhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), - self.startTagTable) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), - self.endTagTable) - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.parser.phases["inSelect"].processEOF() - - def processCharacters(self, token): - return self.parser.phases["inSelect"].processCharacters(token) - - def startTagTable(self, token): - self.parser.parseError("unexpected-table-element-start-tag-in-select-in-table", {"name": token["name"]}) - self.endTagOther(impliedTagToken("select")) - return token - - def startTagOther(self, token): - return self.parser.phases["inSelect"].processStartTag(token) - - def endTagTable(self, token): - self.parser.parseError("unexpected-table-element-end-tag-in-select-in-table", {"name": token["name"]}) - if self.tree.elementInScope(token["name"], variant="table"): - self.endTagOther(impliedTagToken("select")) - return token - - def endTagOther(self, token): - return self.parser.phases["inSelect"].processEndTag(token) - - class InForeignContentPhase(Phase): - breakoutElements = frozenset(["b", "big", "blockquote", "body", "br", - "center", "code", "dd", "div", "dl", "dt", - "em", "embed", "h1", "h2", "h3", - "h4", "h5", "h6", "head", "hr", "i", "img", - "li", "listing", "menu", "meta", "nobr", - "ol", "p", "pre", "ruby", "s", "small", - "span", "strong", "strike", "sub", "sup", - "table", "tt", "u", "ul", "var"]) - - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - def adjustSVGTagNames(self, token): - replacements = {"altglyph": "altGlyph", - "altglyphdef": "altGlyphDef", - "altglyphitem": "altGlyphItem", - "animatecolor": "animateColor", - "animatemotion": "animateMotion", - "animatetransform": "animateTransform", - "clippath": "clipPath", - "feblend": "feBlend", - "fecolormatrix": "feColorMatrix", - "fecomponenttransfer": "feComponentTransfer", - "fecomposite": "feComposite", - "feconvolvematrix": "feConvolveMatrix", - "fediffuselighting": "feDiffuseLighting", - "fedisplacementmap": "feDisplacementMap", - "fedistantlight": "feDistantLight", - "feflood": "feFlood", - "fefunca": "feFuncA", - "fefuncb": "feFuncB", - "fefuncg": "feFuncG", - "fefuncr": "feFuncR", - "fegaussianblur": "feGaussianBlur", - "feimage": "feImage", - "femerge": "feMerge", - "femergenode": "feMergeNode", - "femorphology": "feMorphology", - "feoffset": "feOffset", - "fepointlight": "fePointLight", - "fespecularlighting": "feSpecularLighting", - "fespotlight": "feSpotLight", - "fetile": "feTile", - "feturbulence": "feTurbulence", - "foreignobject": "foreignObject", - "glyphref": "glyphRef", - "lineargradient": "linearGradient", - "radialgradient": "radialGradient", - "textpath": "textPath"} - - if token["name"] in replacements: - token["name"] = replacements[token["name"]] - - def processCharacters(self, token): - if token["data"] == "\u0000": - token["data"] = "\uFFFD" - elif (self.parser.framesetOK and - any(char not in spaceCharacters for char in token["data"])): - self.parser.framesetOK = False - Phase.processCharacters(self, token) - - def processStartTag(self, token): - currentNode = self.tree.openElements[-1] - if (token["name"] in self.breakoutElements or - (token["name"] == "font" and - set(token["data"].keys()) & set(["color", "face", "size"]))): - self.parser.parseError("unexpected-html-element-in-foreign-content", - {"name": token["name"]}) - while (self.tree.openElements[-1].namespace != - self.tree.defaultNamespace and - not self.parser.isHTMLIntegrationPoint(self.tree.openElements[-1]) and - not self.parser.isMathMLTextIntegrationPoint(self.tree.openElements[-1])): - self.tree.openElements.pop() - return token - - else: - if currentNode.namespace == namespaces["mathml"]: - self.parser.adjustMathMLAttributes(token) - elif currentNode.namespace == namespaces["svg"]: - self.adjustSVGTagNames(token) - self.parser.adjustSVGAttributes(token) - self.parser.adjustForeignAttributes(token) - token["namespace"] = currentNode.namespace - self.tree.insertElement(token) - if token["selfClosing"]: - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def processEndTag(self, token): - nodeIndex = len(self.tree.openElements) - 1 - node = self.tree.openElements[-1] - if node.name.translate(asciiUpper2Lower) != token["name"]: - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - while True: - if node.name.translate(asciiUpper2Lower) == token["name"]: - # XXX this isn't in the spec but it seems necessary - if self.parser.phase == self.parser.phases["inTableText"]: - self.parser.phase.flushCharacters() - self.parser.phase = self.parser.phase.originalPhase - while self.tree.openElements.pop() != node: - assert self.tree.openElements - new_token = None - break - nodeIndex -= 1 - - node = self.tree.openElements[nodeIndex] - if node.namespace != self.tree.defaultNamespace: - continue - else: - new_token = self.parser.phase.processEndTag(token) - break - return new_token - - class AfterBodyPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([("html", self.endTagHtml)]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - # Stop parsing - pass - - def processComment(self, token): - # This is needed because data is to be appended to the <html> element - # here and not to whatever is currently open. - self.tree.insertComment(token, self.tree.openElements[0]) - - def processCharacters(self, token): - self.parser.parseError("unexpected-char-after-body") - self.parser.phase = self.parser.phases["inBody"] - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("unexpected-start-tag-after-body", - {"name": token["name"]}) - self.parser.phase = self.parser.phases["inBody"] - return token - - def endTagHtml(self, name): - if self.parser.innerHTML: - self.parser.parseError("unexpected-end-tag-after-body-innerhtml") - else: - self.parser.phase = self.parser.phases["afterAfterBody"] - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag-after-body", - {"name": token["name"]}) - self.parser.phase = self.parser.phases["inBody"] - return token - - class InFramesetPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-frameset - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("frameset", self.startTagFrameset), - ("frame", self.startTagFrame), - ("noframes", self.startTagNoframes) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("frameset", self.endTagFrameset) - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - if self.tree.openElements[-1].name != "html": - self.parser.parseError("eof-in-frameset") - else: - assert self.parser.innerHTML - - def processCharacters(self, token): - self.parser.parseError("unexpected-char-in-frameset") - - def startTagFrameset(self, token): - self.tree.insertElement(token) - - def startTagFrame(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - - def startTagNoframes(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("unexpected-start-tag-in-frameset", - {"name": token["name"]}) - - def endTagFrameset(self, token): - if self.tree.openElements[-1].name == "html": - # innerHTML case - self.parser.parseError("unexpected-frameset-in-frameset-innerhtml") - else: - self.tree.openElements.pop() - if (not self.parser.innerHTML and - self.tree.openElements[-1].name != "frameset"): - # If we're not in innerHTML mode and the current node is not a - # "frameset" element (anymore) then switch. - self.parser.phase = self.parser.phases["afterFrameset"] - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag-in-frameset", - {"name": token["name"]}) - - class AfterFramesetPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#after3 - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("noframes", self.startTagNoframes) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("html", self.endTagHtml) - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - # Stop parsing - pass - - def processCharacters(self, token): - self.parser.parseError("unexpected-char-after-frameset") - - def startTagNoframes(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("unexpected-start-tag-after-frameset", - {"name": token["name"]}) - - def endTagHtml(self, token): - self.parser.phase = self.parser.phases["afterAfterFrameset"] - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag-after-frameset", - {"name": token["name"]}) - - class AfterAfterBodyPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml) - ]) - self.startTagHandler.default = self.startTagOther - - def processEOF(self): - pass - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processSpaceCharacters(self, token): - return self.parser.phases["inBody"].processSpaceCharacters(token) - - def processCharacters(self, token): - self.parser.parseError("expected-eof-but-got-char") - self.parser.phase = self.parser.phases["inBody"] - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("expected-eof-but-got-start-tag", - {"name": token["name"]}) - self.parser.phase = self.parser.phases["inBody"] - return token - - def processEndTag(self, token): - self.parser.parseError("expected-eof-but-got-end-tag", - {"name": token["name"]}) - self.parser.phase = self.parser.phases["inBody"] - return token - - class AfterAfterFramesetPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("noframes", self.startTagNoFrames) - ]) - self.startTagHandler.default = self.startTagOther - - def processEOF(self): - pass - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processSpaceCharacters(self, token): - return self.parser.phases["inBody"].processSpaceCharacters(token) - - def processCharacters(self, token): - self.parser.parseError("expected-eof-but-got-char") - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagNoFrames(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("expected-eof-but-got-start-tag", - {"name": token["name"]}) - - def processEndTag(self, token): - self.parser.parseError("expected-eof-but-got-end-tag", - {"name": token["name"]}) - # pylint:enable=unused-argument - - return { - "initial": InitialPhase, - "beforeHtml": BeforeHtmlPhase, - "beforeHead": BeforeHeadPhase, - "inHead": InHeadPhase, - "inHeadNoscript": InHeadNoscriptPhase, - "afterHead": AfterHeadPhase, - "inBody": InBodyPhase, - "text": TextPhase, - "inTable": InTablePhase, - "inTableText": InTableTextPhase, - "inCaption": InCaptionPhase, - "inColumnGroup": InColumnGroupPhase, - "inTableBody": InTableBodyPhase, - "inRow": InRowPhase, - "inCell": InCellPhase, - "inSelect": InSelectPhase, - "inSelectInTable": InSelectInTablePhase, - "inForeignContent": InForeignContentPhase, - "afterBody": AfterBodyPhase, - "inFrameset": InFramesetPhase, - "afterFrameset": AfterFramesetPhase, - "afterAfterBody": AfterAfterBodyPhase, - "afterAfterFrameset": AfterAfterFramesetPhase, - # XXX after after frameset - } - - -def adjust_attributes(token, replacements): - needs_adjustment = viewkeys(token['data']) & viewkeys(replacements) - if needs_adjustment: - token['data'] = OrderedDict((replacements.get(k, k), v) - for k, v in token['data'].items()) - - -def impliedTagToken(name, type="EndTag", attributes=None, - selfClosing=False): - if attributes is None: - attributes = {} - return {"type": tokenTypes[type], "name": name, "data": attributes, - "selfClosing": selfClosing} - - -class ParseError(Exception): - """Error in parsed document""" - pass diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/serializer.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/serializer.py deleted file mode 100644 index 53f4d44..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/serializer.py +++ /dev/null @@ -1,409 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import text_type - -import re - -from codecs import register_error, xmlcharrefreplace_errors - -from .constants import voidElements, booleanAttributes, spaceCharacters -from .constants import rcdataElements, entities, xmlEntities -from . import treewalkers, _utils -from xml.sax.saxutils import escape - -_quoteAttributeSpecChars = "".join(spaceCharacters) + "\"'=<>`" -_quoteAttributeSpec = re.compile("[" + _quoteAttributeSpecChars + "]") -_quoteAttributeLegacy = re.compile("[" + _quoteAttributeSpecChars + - "\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" - "\x20\x2f\x60\xa0\u1680\u180e\u180f\u2000" - "\u2001\u2002\u2003\u2004\u2005\u2006\u2007" - "\u2008\u2009\u200a\u2028\u2029\u202f\u205f" - "\u3000]") - - -_encode_entity_map = {} -_is_ucs4 = len("\U0010FFFF") == 1 -for k, v in list(entities.items()): - # skip multi-character entities - if ((_is_ucs4 and len(v) > 1) or - (not _is_ucs4 and len(v) > 2)): - continue - if v != "&": - if len(v) == 2: - v = _utils.surrogatePairToCodepoint(v) - else: - v = ord(v) - if v not in _encode_entity_map or k.islower(): - # prefer < over < and similarly for &, >, etc. - _encode_entity_map[v] = k - - -def htmlentityreplace_errors(exc): - if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)): - res = [] - codepoints = [] - skip = False - for i, c in enumerate(exc.object[exc.start:exc.end]): - if skip: - skip = False - continue - index = i + exc.start - if _utils.isSurrogatePair(exc.object[index:min([exc.end, index + 2])]): - codepoint = _utils.surrogatePairToCodepoint(exc.object[index:index + 2]) - skip = True - else: - codepoint = ord(c) - codepoints.append(codepoint) - for cp in codepoints: - e = _encode_entity_map.get(cp) - if e: - res.append("&") - res.append(e) - if not e.endswith(";"): - res.append(";") - else: - res.append("&#x%s;" % (hex(cp)[2:])) - return ("".join(res), exc.end) - else: - return xmlcharrefreplace_errors(exc) - - -register_error("htmlentityreplace", htmlentityreplace_errors) - - -def serialize(input, tree="etree", encoding=None, **serializer_opts): - """Serializes the input token stream using the specified treewalker - - :arg input: the token stream to serialize - - :arg tree: the treewalker to use - - :arg encoding: the encoding to use - - :arg serializer_opts: any options to pass to the - :py:class:`html5lib.serializer.HTMLSerializer` that gets created - - :returns: the tree serialized as a string - - Example: - - >>> from html5lib.html5parser import parse - >>> from html5lib.serializer import serialize - >>> token_stream = parse('<html><body><p>Hi!</p></body></html>') - >>> serialize(token_stream, omit_optional_tags=False) - '<html><head></head><body><p>Hi!</p></body></html>' - - """ - # XXX: Should we cache this? - walker = treewalkers.getTreeWalker(tree) - s = HTMLSerializer(**serializer_opts) - return s.render(walker(input), encoding) - - -class HTMLSerializer(object): - - # attribute quoting options - quote_attr_values = "legacy" # be secure by default - quote_char = '"' - use_best_quote_char = True - - # tag syntax options - omit_optional_tags = True - minimize_boolean_attributes = True - use_trailing_solidus = False - space_before_trailing_solidus = True - - # escaping options - escape_lt_in_attrs = False - escape_rcdata = False - resolve_entities = True - - # miscellaneous options - alphabetical_attributes = False - inject_meta_charset = True - strip_whitespace = False - sanitize = False - - options = ("quote_attr_values", "quote_char", "use_best_quote_char", - "omit_optional_tags", "minimize_boolean_attributes", - "use_trailing_solidus", "space_before_trailing_solidus", - "escape_lt_in_attrs", "escape_rcdata", "resolve_entities", - "alphabetical_attributes", "inject_meta_charset", - "strip_whitespace", "sanitize") - - def __init__(self, **kwargs): - """Initialize HTMLSerializer - - :arg inject_meta_charset: Whether or not to inject the meta charset. - - Defaults to ``True``. - - :arg quote_attr_values: Whether to quote attribute values that don't - require quoting per legacy browser behavior (``"legacy"``), when - required by the standard (``"spec"``), or always (``"always"``). - - Defaults to ``"legacy"``. - - :arg quote_char: Use given quote character for attribute quoting. - - Defaults to ``"`` which will use double quotes unless attribute - value contains a double quote, in which case single quotes are - used. - - :arg escape_lt_in_attrs: Whether or not to escape ``<`` in attribute - values. - - Defaults to ``False``. - - :arg escape_rcdata: Whether to escape characters that need to be - escaped within normal elements within rcdata elements such as - style. - - Defaults to ``False``. - - :arg resolve_entities: Whether to resolve named character entities that - appear in the source tree. The XML predefined entities < > - & " ' are unaffected by this setting. - - Defaults to ``True``. - - :arg strip_whitespace: Whether to remove semantically meaningless - whitespace. (This compresses all whitespace to a single space - except within ``pre``.) - - Defaults to ``False``. - - :arg minimize_boolean_attributes: Shortens boolean attributes to give - just the attribute value, for example:: - - <input disabled="disabled"> - - becomes:: - - <input disabled> - - Defaults to ``True``. - - :arg use_trailing_solidus: Includes a close-tag slash at the end of the - start tag of void elements (empty elements whose end tag is - forbidden). E.g. ``<hr/>``. - - Defaults to ``False``. - - :arg space_before_trailing_solidus: Places a space immediately before - the closing slash in a tag using a trailing solidus. E.g. - ``<hr />``. Requires ``use_trailing_solidus=True``. - - Defaults to ``True``. - - :arg sanitize: Strip all unsafe or unknown constructs from output. - See :py:class:`html5lib.filters.sanitizer.Filter`. - - Defaults to ``False``. - - :arg omit_optional_tags: Omit start/end tags that are optional. - - Defaults to ``True``. - - :arg alphabetical_attributes: Reorder attributes to be in alphabetical order. - - Defaults to ``False``. - - """ - unexpected_args = frozenset(kwargs) - frozenset(self.options) - if len(unexpected_args) > 0: - raise TypeError("__init__() got an unexpected keyword argument '%s'" % next(iter(unexpected_args))) - if 'quote_char' in kwargs: - self.use_best_quote_char = False - for attr in self.options: - setattr(self, attr, kwargs.get(attr, getattr(self, attr))) - self.errors = [] - self.strict = False - - def encode(self, string): - assert(isinstance(string, text_type)) - if self.encoding: - return string.encode(self.encoding, "htmlentityreplace") - else: - return string - - def encodeStrict(self, string): - assert(isinstance(string, text_type)) - if self.encoding: - return string.encode(self.encoding, "strict") - else: - return string - - def serialize(self, treewalker, encoding=None): - # pylint:disable=too-many-nested-blocks - self.encoding = encoding - in_cdata = False - self.errors = [] - - if encoding and self.inject_meta_charset: - from .filters.inject_meta_charset import Filter - treewalker = Filter(treewalker, encoding) - # Alphabetical attributes is here under the assumption that none of - # the later filters add or change order of attributes; it needs to be - # before the sanitizer so escaped elements come out correctly - if self.alphabetical_attributes: - from .filters.alphabeticalattributes import Filter - treewalker = Filter(treewalker) - # WhitespaceFilter should be used before OptionalTagFilter - # for maximum efficiently of this latter filter - if self.strip_whitespace: - from .filters.whitespace import Filter - treewalker = Filter(treewalker) - if self.sanitize: - from .filters.sanitizer import Filter - treewalker = Filter(treewalker) - if self.omit_optional_tags: - from .filters.optionaltags import Filter - treewalker = Filter(treewalker) - - for token in treewalker: - type = token["type"] - if type == "Doctype": - doctype = "<!DOCTYPE %s" % token["name"] - - if token["publicId"]: - doctype += ' PUBLIC "%s"' % token["publicId"] - elif token["systemId"]: - doctype += " SYSTEM" - if token["systemId"]: - if token["systemId"].find('"') >= 0: - if token["systemId"].find("'") >= 0: - self.serializeError("System identifer contains both single and double quote characters") - quote_char = "'" - else: - quote_char = '"' - doctype += " %s%s%s" % (quote_char, token["systemId"], quote_char) - - doctype += ">" - yield self.encodeStrict(doctype) - - elif type in ("Characters", "SpaceCharacters"): - if type == "SpaceCharacters" or in_cdata: - if in_cdata and token["data"].find("</") >= 0: - self.serializeError("Unexpected </ in CDATA") - yield self.encode(token["data"]) - else: - yield self.encode(escape(token["data"])) - - elif type in ("StartTag", "EmptyTag"): - name = token["name"] - yield self.encodeStrict("<%s" % name) - if name in rcdataElements and not self.escape_rcdata: - in_cdata = True - elif in_cdata: - self.serializeError("Unexpected child element of a CDATA element") - for (_, attr_name), attr_value in token["data"].items(): - # TODO: Add namespace support here - k = attr_name - v = attr_value - yield self.encodeStrict(' ') - - yield self.encodeStrict(k) - if not self.minimize_boolean_attributes or \ - (k not in booleanAttributes.get(name, tuple()) and - k not in booleanAttributes.get("", tuple())): - yield self.encodeStrict("=") - if self.quote_attr_values == "always" or len(v) == 0: - quote_attr = True - elif self.quote_attr_values == "spec": - quote_attr = _quoteAttributeSpec.search(v) is not None - elif self.quote_attr_values == "legacy": - quote_attr = _quoteAttributeLegacy.search(v) is not None - else: - raise ValueError("quote_attr_values must be one of: " - "'always', 'spec', or 'legacy'") - v = v.replace("&", "&") - if self.escape_lt_in_attrs: - v = v.replace("<", "<") - if quote_attr: - quote_char = self.quote_char - if self.use_best_quote_char: - if "'" in v and '"' not in v: - quote_char = '"' - elif '"' in v and "'" not in v: - quote_char = "'" - if quote_char == "'": - v = v.replace("'", "'") - else: - v = v.replace('"', """) - yield self.encodeStrict(quote_char) - yield self.encode(v) - yield self.encodeStrict(quote_char) - else: - yield self.encode(v) - if name in voidElements and self.use_trailing_solidus: - if self.space_before_trailing_solidus: - yield self.encodeStrict(" /") - else: - yield self.encodeStrict("/") - yield self.encode(">") - - elif type == "EndTag": - name = token["name"] - if name in rcdataElements: - in_cdata = False - elif in_cdata: - self.serializeError("Unexpected child element of a CDATA element") - yield self.encodeStrict("</%s>" % name) - - elif type == "Comment": - data = token["data"] - if data.find("--") >= 0: - self.serializeError("Comment contains --") - yield self.encodeStrict("<!--%s-->" % token["data"]) - - elif type == "Entity": - name = token["name"] - key = name + ";" - if key not in entities: - self.serializeError("Entity %s not recognized" % name) - if self.resolve_entities and key not in xmlEntities: - data = entities[key] - else: - data = "&%s;" % name - yield self.encodeStrict(data) - - else: - self.serializeError(token["data"]) - - def render(self, treewalker, encoding=None): - """Serializes the stream from the treewalker into a string - - :arg treewalker: the treewalker to serialize - - :arg encoding: the string encoding to use - - :returns: the serialized tree - - Example: - - >>> from html5lib import parse, getTreeWalker - >>> from html5lib.serializer import HTMLSerializer - >>> token_stream = parse('<html><body>Hi!</body></html>') - >>> walker = getTreeWalker('etree') - >>> serializer = HTMLSerializer(omit_optional_tags=False) - >>> serializer.render(walker(token_stream)) - '<html><head></head><body>Hi!</body></html>' - - """ - if encoding: - return b"".join(list(self.serialize(treewalker, encoding))) - else: - return "".join(list(self.serialize(treewalker))) - - def serializeError(self, data="XXX ERROR MESSAGE NEEDED"): - # XXX The idea is to make data mandatory. - self.errors.append(data) - if self.strict: - raise SerializeError - - -class SerializeError(Exception): - """Error in serialized tree""" - pass diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/__init__.py deleted file mode 100644 index 7ef5959..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/__init__.py +++ /dev/null @@ -1,30 +0,0 @@ -"""Tree adapters let you convert from one tree structure to another - -Example: - -.. code-block:: python - - from pip._vendor import html5lib - from pip._vendor.html5lib.treeadapters import genshi - - doc = '<html><body>Hi!</body></html>' - treebuilder = html5lib.getTreeBuilder('etree') - parser = html5lib.HTMLParser(tree=treebuilder) - tree = parser.parse(doc) - TreeWalker = html5lib.getTreeWalker('etree') - - genshi_tree = genshi.to_genshi(TreeWalker(tree)) - -""" -from __future__ import absolute_import, division, unicode_literals - -from . import sax - -__all__ = ["sax"] - -try: - from . import genshi # noqa -except ImportError: - pass -else: - __all__.append("genshi") diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/genshi.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/genshi.py deleted file mode 100644 index 61d5fb6..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/genshi.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from genshi.core import QName, Attrs -from genshi.core import START, END, TEXT, COMMENT, DOCTYPE - - -def to_genshi(walker): - """Convert a tree to a genshi tree - - :arg walker: the treewalker to use to walk the tree to convert it - - :returns: generator of genshi nodes - - """ - text = [] - for token in walker: - type = token["type"] - if type in ("Characters", "SpaceCharacters"): - text.append(token["data"]) - elif text: - yield TEXT, "".join(text), (None, -1, -1) - text = [] - - if type in ("StartTag", "EmptyTag"): - if token["namespace"]: - name = "{%s}%s" % (token["namespace"], token["name"]) - else: - name = token["name"] - attrs = Attrs([(QName("{%s}%s" % attr if attr[0] is not None else attr[1]), value) - for attr, value in token["data"].items()]) - yield (START, (QName(name), attrs), (None, -1, -1)) - if type == "EmptyTag": - type = "EndTag" - - if type == "EndTag": - if token["namespace"]: - name = "{%s}%s" % (token["namespace"], token["name"]) - else: - name = token["name"] - - yield END, QName(name), (None, -1, -1) - - elif type == "Comment": - yield COMMENT, token["data"], (None, -1, -1) - - elif type == "Doctype": - yield DOCTYPE, (token["name"], token["publicId"], - token["systemId"]), (None, -1, -1) - - else: - pass # FIXME: What to do? - - if text: - yield TEXT, "".join(text), (None, -1, -1) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/sax.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/sax.py deleted file mode 100644 index f4ccea5..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/sax.py +++ /dev/null @@ -1,50 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from xml.sax.xmlreader import AttributesNSImpl - -from ..constants import adjustForeignAttributes, unadjustForeignAttributes - -prefix_mapping = {} -for prefix, localName, namespace in adjustForeignAttributes.values(): - if prefix is not None: - prefix_mapping[prefix] = namespace - - -def to_sax(walker, handler): - """Call SAX-like content handler based on treewalker walker - - :arg walker: the treewalker to use to walk the tree to convert it - - :arg handler: SAX handler to use - - """ - handler.startDocument() - for prefix, namespace in prefix_mapping.items(): - handler.startPrefixMapping(prefix, namespace) - - for token in walker: - type = token["type"] - if type == "Doctype": - continue - elif type in ("StartTag", "EmptyTag"): - attrs = AttributesNSImpl(token["data"], - unadjustForeignAttributes) - handler.startElementNS((token["namespace"], token["name"]), - token["name"], - attrs) - if type == "EmptyTag": - handler.endElementNS((token["namespace"], token["name"]), - token["name"]) - elif type == "EndTag": - handler.endElementNS((token["namespace"], token["name"]), - token["name"]) - elif type in ("Characters", "SpaceCharacters"): - handler.characters(token["data"]) - elif type == "Comment": - pass - else: - assert False, "Unknown token type" - - for prefix, namespace in prefix_mapping.items(): - handler.endPrefixMapping(prefix) - handler.endDocument() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__init__.py deleted file mode 100644 index d44447e..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__init__.py +++ /dev/null @@ -1,88 +0,0 @@ -"""A collection of modules for building different kinds of trees from HTML -documents. - -To create a treebuilder for a new type of tree, you need to do -implement several things: - -1. A set of classes for various types of elements: Document, Doctype, Comment, - Element. These must implement the interface of ``base.treebuilders.Node`` - (although comment nodes have a different signature for their constructor, - see ``treebuilders.etree.Comment``) Textual content may also be implemented - as another node type, or not, as your tree implementation requires. - -2. A treebuilder object (called ``TreeBuilder`` by convention) that inherits - from ``treebuilders.base.TreeBuilder``. This has 4 required attributes: - - * ``documentClass`` - the class to use for the bottommost node of a document - * ``elementClass`` - the class to use for HTML Elements - * ``commentClass`` - the class to use for comments - * ``doctypeClass`` - the class to use for doctypes - - It also has one required method: - - * ``getDocument`` - Returns the root node of the complete document tree - -3. If you wish to run the unit tests, you must also create a ``testSerializer`` - method on your treebuilder which accepts a node and returns a string - containing Node and its children serialized according to the format used in - the unittests - -""" - -from __future__ import absolute_import, division, unicode_literals - -from .._utils import default_etree - -treeBuilderCache = {} - - -def getTreeBuilder(treeType, implementation=None, **kwargs): - """Get a TreeBuilder class for various types of trees with built-in support - - :arg treeType: the name of the tree type required (case-insensitive). Supported - values are: - - * "dom" - A generic builder for DOM implementations, defaulting to a - xml.dom.minidom based implementation. - * "etree" - A generic builder for tree implementations exposing an - ElementTree-like interface, defaulting to xml.etree.cElementTree if - available and xml.etree.ElementTree if not. - * "lxml" - A etree-based builder for lxml.etree, handling limitations - of lxml's implementation. - - :arg implementation: (Currently applies to the "etree" and "dom" tree - types). A module implementing the tree type e.g. xml.etree.ElementTree - or xml.etree.cElementTree. - - :arg kwargs: Any additional options to pass to the TreeBuilder when - creating it. - - Example: - - >>> from html5lib.treebuilders import getTreeBuilder - >>> builder = getTreeBuilder('etree') - - """ - - treeType = treeType.lower() - if treeType not in treeBuilderCache: - if treeType == "dom": - from . import dom - # Come up with a sane default (pref. from the stdlib) - if implementation is None: - from xml.dom import minidom - implementation = minidom - # NEVER cache here, caching is done in the dom submodule - return dom.getDomModule(implementation, **kwargs).TreeBuilder - elif treeType == "lxml": - from . import etree_lxml - treeBuilderCache[treeType] = etree_lxml.TreeBuilder - elif treeType == "etree": - from . import etree - if implementation is None: - implementation = default_etree - # NEVER cache here, caching is done in the etree submodule - return etree.getETreeModule(implementation, **kwargs).TreeBuilder - else: - raise ValueError("""Unrecognised treebuilder "%s" """ % treeType) - return treeBuilderCache.get(treeType) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 760796b6067981147624baf12b656fb005ecdc3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3343 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-38.pyc deleted file mode 100644 index bf08fcbf29265bfb96e2ffe0b9054a0496fa47df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11369 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 H(#ih^R~y5u diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-38.pyc deleted file mode 100644 index 03ae39ee4d9b8e61da203d44abdc29522fb82c67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11863 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 I547|D50C_luK)l5 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/base.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/base.py deleted file mode 100644 index 73973db..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/base.py +++ /dev/null @@ -1,417 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import text_type - -from ..constants import scopingElements, tableInsertModeElements, namespaces - -# The scope markers are inserted when entering object elements, -# marquees, table cells, and table captions, and are used to prevent formatting -# from "leaking" into tables, object elements, and marquees. -Marker = None - -listElementsMap = { - None: (frozenset(scopingElements), False), - "button": (frozenset(scopingElements | set([(namespaces["html"], "button")])), False), - "list": (frozenset(scopingElements | set([(namespaces["html"], "ol"), - (namespaces["html"], "ul")])), False), - "table": (frozenset([(namespaces["html"], "html"), - (namespaces["html"], "table")]), False), - "select": (frozenset([(namespaces["html"], "optgroup"), - (namespaces["html"], "option")]), True) -} - - -class Node(object): - """Represents an item in the tree""" - def __init__(self, name): - """Creates a Node - - :arg name: The tag name associated with the node - - """ - # The tag name assocaited with the node - self.name = name - # The parent of the current node (or None for the document node) - self.parent = None - # The value of the current node (applies to text nodes and comments) - self.value = None - # A dict holding name -> value pairs for attributes of the node - self.attributes = {} - # A list of child nodes of the current node. This must include all - # elements but not necessarily other node types. - self.childNodes = [] - # A list of miscellaneous flags that can be set on the node. - self._flags = [] - - def __str__(self): - attributesStr = " ".join(["%s=\"%s\"" % (name, value) - for name, value in - self.attributes.items()]) - if attributesStr: - return "<%s %s>" % (self.name, attributesStr) - else: - return "<%s>" % (self.name) - - def __repr__(self): - return "<%s>" % (self.name) - - def appendChild(self, node): - """Insert node as a child of the current node - - :arg node: the node to insert - - """ - raise NotImplementedError - - def insertText(self, data, insertBefore=None): - """Insert data as text in the current node, positioned before the - start of node insertBefore or to the end of the node's text. - - :arg data: the data to insert - - :arg insertBefore: True if you want to insert the text before the node - and False if you want to insert it after the node - - """ - raise NotImplementedError - - def insertBefore(self, node, refNode): - """Insert node as a child of the current node, before refNode in the - list of child nodes. Raises ValueError if refNode is not a child of - the current node - - :arg node: the node to insert - - :arg refNode: the child node to insert the node before - - """ - raise NotImplementedError - - def removeChild(self, node): - """Remove node from the children of the current node - - :arg node: the child node to remove - - """ - raise NotImplementedError - - def reparentChildren(self, newParent): - """Move all the children of the current node to newParent. - This is needed so that trees that don't store text as nodes move the - text in the correct way - - :arg newParent: the node to move all this node's children to - - """ - # XXX - should this method be made more general? - for child in self.childNodes: - newParent.appendChild(child) - self.childNodes = [] - - def cloneNode(self): - """Return a shallow copy of the current node i.e. a node with the same - name and attributes but with no parent or child nodes - """ - raise NotImplementedError - - def hasContent(self): - """Return true if the node has children or text, false otherwise - """ - raise NotImplementedError - - -class ActiveFormattingElements(list): - def append(self, node): - equalCount = 0 - if node != Marker: - for element in self[::-1]: - if element == Marker: - break - if self.nodesEqual(element, node): - equalCount += 1 - if equalCount == 3: - self.remove(element) - break - list.append(self, node) - - def nodesEqual(self, node1, node2): - if not node1.nameTuple == node2.nameTuple: - return False - - if not node1.attributes == node2.attributes: - return False - - return True - - -class TreeBuilder(object): - """Base treebuilder implementation - - * documentClass - the class to use for the bottommost node of a document - * elementClass - the class to use for HTML Elements - * commentClass - the class to use for comments - * doctypeClass - the class to use for doctypes - - """ - # pylint:disable=not-callable - - # Document class - documentClass = None - - # The class to use for creating a node - elementClass = None - - # The class to use for creating comments - commentClass = None - - # The class to use for creating doctypes - doctypeClass = None - - # Fragment class - fragmentClass = None - - def __init__(self, namespaceHTMLElements): - """Create a TreeBuilder - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - """ - if namespaceHTMLElements: - self.defaultNamespace = "http://www.w3.org/1999/xhtml" - else: - self.defaultNamespace = None - self.reset() - - def reset(self): - self.openElements = [] - self.activeFormattingElements = ActiveFormattingElements() - - # XXX - rename these to headElement, formElement - self.headPointer = None - self.formPointer = None - - self.insertFromTable = False - - self.document = self.documentClass() - - def elementInScope(self, target, variant=None): - - # If we pass a node in we match that. if we pass a string - # match any node with that name - exactNode = hasattr(target, "nameTuple") - if not exactNode: - if isinstance(target, text_type): - target = (namespaces["html"], target) - assert isinstance(target, tuple) - - listElements, invert = listElementsMap[variant] - - for node in reversed(self.openElements): - if exactNode and node == target: - return True - elif not exactNode and node.nameTuple == target: - return True - elif (invert ^ (node.nameTuple in listElements)): - return False - - assert False # We should never reach this point - - def reconstructActiveFormattingElements(self): - # Within this algorithm the order of steps described in the - # specification is not quite the same as the order of steps in the - # code. It should still do the same though. - - # Step 1: stop the algorithm when there's nothing to do. - if not self.activeFormattingElements: - return - - # Step 2 and step 3: we start with the last element. So i is -1. - i = len(self.activeFormattingElements) - 1 - entry = self.activeFormattingElements[i] - if entry == Marker or entry in self.openElements: - return - - # Step 6 - while entry != Marker and entry not in self.openElements: - if i == 0: - # This will be reset to 0 below - i = -1 - break - i -= 1 - # Step 5: let entry be one earlier in the list. - entry = self.activeFormattingElements[i] - - while True: - # Step 7 - i += 1 - - # Step 8 - entry = self.activeFormattingElements[i] - clone = entry.cloneNode() # Mainly to get a new copy of the attributes - - # Step 9 - element = self.insertElement({"type": "StartTag", - "name": clone.name, - "namespace": clone.namespace, - "data": clone.attributes}) - - # Step 10 - self.activeFormattingElements[i] = element - - # Step 11 - if element == self.activeFormattingElements[-1]: - break - - def clearActiveFormattingElements(self): - entry = self.activeFormattingElements.pop() - while self.activeFormattingElements and entry != Marker: - entry = self.activeFormattingElements.pop() - - def elementInActiveFormattingElements(self, name): - """Check if an element exists between the end of the active - formatting elements and the last marker. If it does, return it, else - return false""" - - for item in self.activeFormattingElements[::-1]: - # Check for Marker first because if it's a Marker it doesn't have a - # name attribute. - if item == Marker: - break - elif item.name == name: - return item - return False - - def insertRoot(self, token): - element = self.createElement(token) - self.openElements.append(element) - self.document.appendChild(element) - - def insertDoctype(self, token): - name = token["name"] - publicId = token["publicId"] - systemId = token["systemId"] - - doctype = self.doctypeClass(name, publicId, systemId) - self.document.appendChild(doctype) - - def insertComment(self, token, parent=None): - if parent is None: - parent = self.openElements[-1] - parent.appendChild(self.commentClass(token["data"])) - - def createElement(self, token): - """Create an element but don't insert it anywhere""" - name = token["name"] - namespace = token.get("namespace", self.defaultNamespace) - element = self.elementClass(name, namespace) - element.attributes = token["data"] - return element - - def _getInsertFromTable(self): - return self._insertFromTable - - def _setInsertFromTable(self, value): - """Switch the function used to insert an element from the - normal one to the misnested table one and back again""" - self._insertFromTable = value - if value: - self.insertElement = self.insertElementTable - else: - self.insertElement = self.insertElementNormal - - insertFromTable = property(_getInsertFromTable, _setInsertFromTable) - - def insertElementNormal(self, token): - name = token["name"] - assert isinstance(name, text_type), "Element %s not unicode" % name - namespace = token.get("namespace", self.defaultNamespace) - element = self.elementClass(name, namespace) - element.attributes = token["data"] - self.openElements[-1].appendChild(element) - self.openElements.append(element) - return element - - def insertElementTable(self, token): - """Create an element and insert it into the tree""" - element = self.createElement(token) - if self.openElements[-1].name not in tableInsertModeElements: - return self.insertElementNormal(token) - else: - # We should be in the InTable mode. This means we want to do - # special magic element rearranging - parent, insertBefore = self.getTableMisnestedNodePosition() - if insertBefore is None: - parent.appendChild(element) - else: - parent.insertBefore(element, insertBefore) - self.openElements.append(element) - return element - - def insertText(self, data, parent=None): - """Insert text data.""" - if parent is None: - parent = self.openElements[-1] - - if (not self.insertFromTable or (self.insertFromTable and - self.openElements[-1].name - not in tableInsertModeElements)): - parent.insertText(data) - else: - # We should be in the InTable mode. This means we want to do - # special magic element rearranging - parent, insertBefore = self.getTableMisnestedNodePosition() - parent.insertText(data, insertBefore) - - def getTableMisnestedNodePosition(self): - """Get the foster parent element, and sibling to insert before - (or None) when inserting a misnested table node""" - # The foster parent element is the one which comes before the most - # recently opened table element - # XXX - this is really inelegant - lastTable = None - fosterParent = None - insertBefore = None - for elm in self.openElements[::-1]: - if elm.name == "table": - lastTable = elm - break - if lastTable: - # XXX - we should really check that this parent is actually a - # node here - if lastTable.parent: - fosterParent = lastTable.parent - insertBefore = lastTable - else: - fosterParent = self.openElements[ - self.openElements.index(lastTable) - 1] - else: - fosterParent = self.openElements[0] - return fosterParent, insertBefore - - def generateImpliedEndTags(self, exclude=None): - name = self.openElements[-1].name - # XXX td, th and tr are not actually needed - if (name in frozenset(("dd", "dt", "li", "option", "optgroup", "p", "rp", "rt")) and - name != exclude): - self.openElements.pop() - # XXX This is not entirely what the specification says. We should - # investigate it more closely. - self.generateImpliedEndTags(exclude) - - def getDocument(self): - """Return the final tree""" - return self.document - - def getFragment(self): - """Return the final fragment""" - # assert self.innerHTML - fragment = self.fragmentClass() - self.openElements[0].reparentChildren(fragment) - return fragment - - def testSerializer(self, node): - """Serialize the subtree of node in the format required by unit tests - - :arg node: the node from which to start serializing - - """ - raise NotImplementedError diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/dom.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/dom.py deleted file mode 100644 index dcfac22..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/dom.py +++ /dev/null @@ -1,236 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - - -from collections import MutableMapping -from xml.dom import minidom, Node -import weakref - -from . import base -from .. import constants -from ..constants import namespaces -from .._utils import moduleFactoryFactory - - -def getDomBuilder(DomImplementation): - Dom = DomImplementation - - class AttrList(MutableMapping): - def __init__(self, element): - self.element = element - - def __iter__(self): - return iter(self.element.attributes.keys()) - - def __setitem__(self, name, value): - if isinstance(name, tuple): - raise NotImplementedError - else: - attr = self.element.ownerDocument.createAttribute(name) - attr.value = value - self.element.attributes[name] = attr - - def __len__(self): - return len(self.element.attributes) - - def items(self): - return list(self.element.attributes.items()) - - def values(self): - return list(self.element.attributes.values()) - - def __getitem__(self, name): - if isinstance(name, tuple): - raise NotImplementedError - else: - return self.element.attributes[name].value - - def __delitem__(self, name): - if isinstance(name, tuple): - raise NotImplementedError - else: - del self.element.attributes[name] - - class NodeBuilder(base.Node): - def __init__(self, element): - base.Node.__init__(self, element.nodeName) - self.element = element - - namespace = property(lambda self: hasattr(self.element, "namespaceURI") and - self.element.namespaceURI or None) - - def appendChild(self, node): - node.parent = self - self.element.appendChild(node.element) - - def insertText(self, data, insertBefore=None): - text = self.element.ownerDocument.createTextNode(data) - if insertBefore: - self.element.insertBefore(text, insertBefore.element) - else: - self.element.appendChild(text) - - def insertBefore(self, node, refNode): - self.element.insertBefore(node.element, refNode.element) - node.parent = self - - def removeChild(self, node): - if node.element.parentNode == self.element: - self.element.removeChild(node.element) - node.parent = None - - def reparentChildren(self, newParent): - while self.element.hasChildNodes(): - child = self.element.firstChild - self.element.removeChild(child) - newParent.element.appendChild(child) - self.childNodes = [] - - def getAttributes(self): - return AttrList(self.element) - - def setAttributes(self, attributes): - if attributes: - for name, value in list(attributes.items()): - if isinstance(name, tuple): - if name[0] is not None: - qualifiedName = (name[0] + ":" + name[1]) - else: - qualifiedName = name[1] - self.element.setAttributeNS(name[2], qualifiedName, - value) - else: - self.element.setAttribute( - name, value) - attributes = property(getAttributes, setAttributes) - - def cloneNode(self): - return NodeBuilder(self.element.cloneNode(False)) - - def hasContent(self): - return self.element.hasChildNodes() - - def getNameTuple(self): - if self.namespace is None: - return namespaces["html"], self.name - else: - return self.namespace, self.name - - nameTuple = property(getNameTuple) - - class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable - def documentClass(self): - self.dom = Dom.getDOMImplementation().createDocument(None, None, None) - return weakref.proxy(self) - - def insertDoctype(self, token): - name = token["name"] - publicId = token["publicId"] - systemId = token["systemId"] - - domimpl = Dom.getDOMImplementation() - doctype = domimpl.createDocumentType(name, publicId, systemId) - self.document.appendChild(NodeBuilder(doctype)) - if Dom == minidom: - doctype.ownerDocument = self.dom - - def elementClass(self, name, namespace=None): - if namespace is None and self.defaultNamespace is None: - node = self.dom.createElement(name) - else: - node = self.dom.createElementNS(namespace, name) - - return NodeBuilder(node) - - def commentClass(self, data): - return NodeBuilder(self.dom.createComment(data)) - - def fragmentClass(self): - return NodeBuilder(self.dom.createDocumentFragment()) - - def appendChild(self, node): - self.dom.appendChild(node.element) - - def testSerializer(self, element): - return testSerializer(element) - - def getDocument(self): - return self.dom - - def getFragment(self): - return base.TreeBuilder.getFragment(self).element - - def insertText(self, data, parent=None): - data = data - if parent != self: - base.TreeBuilder.insertText(self, data, parent) - else: - # HACK: allow text nodes as children of the document node - if hasattr(self.dom, '_child_node_types'): - # pylint:disable=protected-access - if Node.TEXT_NODE not in self.dom._child_node_types: - self.dom._child_node_types = list(self.dom._child_node_types) - self.dom._child_node_types.append(Node.TEXT_NODE) - self.dom.appendChild(self.dom.createTextNode(data)) - - implementation = DomImplementation - name = None - - def testSerializer(element): - element.normalize() - rv = [] - - def serializeElement(element, indent=0): - if element.nodeType == Node.DOCUMENT_TYPE_NODE: - if element.name: - if element.publicId or element.systemId: - publicId = element.publicId or "" - systemId = element.systemId or "" - rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" % - (' ' * indent, element.name, publicId, systemId)) - else: - rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, element.name)) - else: - rv.append("|%s<!DOCTYPE >" % (' ' * indent,)) - elif element.nodeType == Node.DOCUMENT_NODE: - rv.append("#document") - elif element.nodeType == Node.DOCUMENT_FRAGMENT_NODE: - rv.append("#document-fragment") - elif element.nodeType == Node.COMMENT_NODE: - rv.append("|%s<!-- %s -->" % (' ' * indent, element.nodeValue)) - elif element.nodeType == Node.TEXT_NODE: - rv.append("|%s\"%s\"" % (' ' * indent, element.nodeValue)) - else: - if (hasattr(element, "namespaceURI") and - element.namespaceURI is not None): - name = "%s %s" % (constants.prefixes[element.namespaceURI], - element.nodeName) - else: - name = element.nodeName - rv.append("|%s<%s>" % (' ' * indent, name)) - if element.hasAttributes(): - attributes = [] - for i in range(len(element.attributes)): - attr = element.attributes.item(i) - name = attr.nodeName - value = attr.value - ns = attr.namespaceURI - if ns: - name = "%s %s" % (constants.prefixes[ns], attr.localName) - else: - name = attr.nodeName - attributes.append((name, value)) - - for name, value in sorted(attributes): - rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) - indent += 2 - for child in element.childNodes: - serializeElement(child, indent) - serializeElement(element, 0) - - return "\n".join(rv) - - return locals() - - -# The actual means to get a module! -getDomModule = moduleFactoryFactory(getDomBuilder) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree.py deleted file mode 100644 index 0dedf44..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree.py +++ /dev/null @@ -1,340 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -# pylint:disable=protected-access - -from pip._vendor.six import text_type - -import re - -from . import base -from .. import _ihatexml -from .. import constants -from ..constants import namespaces -from .._utils import moduleFactoryFactory - -tag_regexp = re.compile("{([^}]*)}(.*)") - - -def getETreeBuilder(ElementTreeImplementation, fullTree=False): - ElementTree = ElementTreeImplementation - ElementTreeCommentType = ElementTree.Comment("asd").tag - - class Element(base.Node): - def __init__(self, name, namespace=None): - self._name = name - self._namespace = namespace - self._element = ElementTree.Element(self._getETreeTag(name, - namespace)) - if namespace is None: - self.nameTuple = namespaces["html"], self._name - else: - self.nameTuple = self._namespace, self._name - self.parent = None - self._childNodes = [] - self._flags = [] - - def _getETreeTag(self, name, namespace): - if namespace is None: - etree_tag = name - else: - etree_tag = "{%s}%s" % (namespace, name) - return etree_tag - - def _setName(self, name): - self._name = name - self._element.tag = self._getETreeTag(self._name, self._namespace) - - def _getName(self): - return self._name - - name = property(_getName, _setName) - - def _setNamespace(self, namespace): - self._namespace = namespace - self._element.tag = self._getETreeTag(self._name, self._namespace) - - def _getNamespace(self): - return self._namespace - - namespace = property(_getNamespace, _setNamespace) - - def _getAttributes(self): - return self._element.attrib - - def _setAttributes(self, attributes): - # Delete existing attributes first - # XXX - there may be a better way to do this... - for key in list(self._element.attrib.keys()): - del self._element.attrib[key] - for key, value in attributes.items(): - if isinstance(key, tuple): - name = "{%s}%s" % (key[2], key[1]) - else: - name = key - self._element.set(name, value) - - attributes = property(_getAttributes, _setAttributes) - - def _getChildNodes(self): - return self._childNodes - - def _setChildNodes(self, value): - del self._element[:] - self._childNodes = [] - for element in value: - self.insertChild(element) - - childNodes = property(_getChildNodes, _setChildNodes) - - def hasContent(self): - """Return true if the node has children or text""" - return bool(self._element.text or len(self._element)) - - def appendChild(self, node): - self._childNodes.append(node) - self._element.append(node._element) - node.parent = self - - def insertBefore(self, node, refNode): - index = list(self._element).index(refNode._element) - self._element.insert(index, node._element) - node.parent = self - - def removeChild(self, node): - self._childNodes.remove(node) - self._element.remove(node._element) - node.parent = None - - def insertText(self, data, insertBefore=None): - if not(len(self._element)): - if not self._element.text: - self._element.text = "" - self._element.text += data - elif insertBefore is None: - # Insert the text as the tail of the last child element - if not self._element[-1].tail: - self._element[-1].tail = "" - self._element[-1].tail += data - else: - # Insert the text before the specified node - children = list(self._element) - index = children.index(insertBefore._element) - if index > 0: - if not self._element[index - 1].tail: - self._element[index - 1].tail = "" - self._element[index - 1].tail += data - else: - if not self._element.text: - self._element.text = "" - self._element.text += data - - def cloneNode(self): - element = type(self)(self.name, self.namespace) - for name, value in self.attributes.items(): - element.attributes[name] = value - return element - - def reparentChildren(self, newParent): - if newParent.childNodes: - newParent.childNodes[-1]._element.tail += self._element.text - else: - if not newParent._element.text: - newParent._element.text = "" - if self._element.text is not None: - newParent._element.text += self._element.text - self._element.text = "" - base.Node.reparentChildren(self, newParent) - - class Comment(Element): - def __init__(self, data): - # Use the superclass constructor to set all properties on the - # wrapper element - self._element = ElementTree.Comment(data) - self.parent = None - self._childNodes = [] - self._flags = [] - - def _getData(self): - return self._element.text - - def _setData(self, value): - self._element.text = value - - data = property(_getData, _setData) - - class DocumentType(Element): - def __init__(self, name, publicId, systemId): - Element.__init__(self, "<!DOCTYPE>") - self._element.text = name - self.publicId = publicId - self.systemId = systemId - - def _getPublicId(self): - return self._element.get("publicId", "") - - def _setPublicId(self, value): - if value is not None: - self._element.set("publicId", value) - - publicId = property(_getPublicId, _setPublicId) - - def _getSystemId(self): - return self._element.get("systemId", "") - - def _setSystemId(self, value): - if value is not None: - self._element.set("systemId", value) - - systemId = property(_getSystemId, _setSystemId) - - class Document(Element): - def __init__(self): - Element.__init__(self, "DOCUMENT_ROOT") - - class DocumentFragment(Element): - def __init__(self): - Element.__init__(self, "DOCUMENT_FRAGMENT") - - def testSerializer(element): - rv = [] - - def serializeElement(element, indent=0): - if not(hasattr(element, "tag")): - element = element.getroot() - if element.tag == "<!DOCTYPE>": - if element.get("publicId") or element.get("systemId"): - publicId = element.get("publicId") or "" - systemId = element.get("systemId") or "" - rv.append("""<!DOCTYPE %s "%s" "%s">""" % - (element.text, publicId, systemId)) - else: - rv.append("<!DOCTYPE %s>" % (element.text,)) - elif element.tag == "DOCUMENT_ROOT": - rv.append("#document") - if element.text is not None: - rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) - if element.tail is not None: - raise TypeError("Document node cannot have tail") - if hasattr(element, "attrib") and len(element.attrib): - raise TypeError("Document node cannot have attributes") - elif element.tag == ElementTreeCommentType: - rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) - else: - assert isinstance(element.tag, text_type), \ - "Expected unicode, got %s, %s" % (type(element.tag), element.tag) - nsmatch = tag_regexp.match(element.tag) - - if nsmatch is None: - name = element.tag - else: - ns, name = nsmatch.groups() - prefix = constants.prefixes[ns] - name = "%s %s" % (prefix, name) - rv.append("|%s<%s>" % (' ' * indent, name)) - - if hasattr(element, "attrib"): - attributes = [] - for name, value in element.attrib.items(): - nsmatch = tag_regexp.match(name) - if nsmatch is not None: - ns, name = nsmatch.groups() - prefix = constants.prefixes[ns] - attr_string = "%s %s" % (prefix, name) - else: - attr_string = name - attributes.append((attr_string, value)) - - for name, value in sorted(attributes): - rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) - if element.text: - rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) - indent += 2 - for child in element: - serializeElement(child, indent) - if element.tail: - rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) - serializeElement(element, 0) - - return "\n".join(rv) - - def tostring(element): # pylint:disable=unused-variable - """Serialize an element and its child nodes to a string""" - rv = [] - filter = _ihatexml.InfosetFilter() - - def serializeElement(element): - if isinstance(element, ElementTree.ElementTree): - element = element.getroot() - - if element.tag == "<!DOCTYPE>": - if element.get("publicId") or element.get("systemId"): - publicId = element.get("publicId") or "" - systemId = element.get("systemId") or "" - rv.append("""<!DOCTYPE %s PUBLIC "%s" "%s">""" % - (element.text, publicId, systemId)) - else: - rv.append("<!DOCTYPE %s>" % (element.text,)) - elif element.tag == "DOCUMENT_ROOT": - if element.text is not None: - rv.append(element.text) - if element.tail is not None: - raise TypeError("Document node cannot have tail") - if hasattr(element, "attrib") and len(element.attrib): - raise TypeError("Document node cannot have attributes") - - for child in element: - serializeElement(child) - - elif element.tag == ElementTreeCommentType: - rv.append("<!--%s-->" % (element.text,)) - else: - # This is assumed to be an ordinary element - if not element.attrib: - rv.append("<%s>" % (filter.fromXmlName(element.tag),)) - else: - attr = " ".join(["%s=\"%s\"" % ( - filter.fromXmlName(name), value) - for name, value in element.attrib.items()]) - rv.append("<%s %s>" % (element.tag, attr)) - if element.text: - rv.append(element.text) - - for child in element: - serializeElement(child) - - rv.append("</%s>" % (element.tag,)) - - if element.tail: - rv.append(element.tail) - - serializeElement(element) - - return "".join(rv) - - class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable - documentClass = Document - doctypeClass = DocumentType - elementClass = Element - commentClass = Comment - fragmentClass = DocumentFragment - implementation = ElementTreeImplementation - - def testSerializer(self, element): - return testSerializer(element) - - def getDocument(self): - if fullTree: - return self.document._element - else: - if self.defaultNamespace is not None: - return self.document._element.find( - "{%s}html" % self.defaultNamespace) - else: - return self.document._element.find("html") - - def getFragment(self): - return base.TreeBuilder.getFragment(self)._element - - return locals() - - -getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree_lxml.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree_lxml.py deleted file mode 100644 index ca12a99..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree_lxml.py +++ /dev/null @@ -1,366 +0,0 @@ -"""Module for supporting the lxml.etree library. The idea here is to use as much -of the native library as possible, without using fragile hacks like custom element -names that break between releases. The downside of this is that we cannot represent -all possible trees; specifically the following are known to cause problems: - -Text or comments as siblings of the root element -Docypes with no name - -When any of these things occur, we emit a DataLossWarning -""" - -from __future__ import absolute_import, division, unicode_literals -# pylint:disable=protected-access - -import warnings -import re -import sys - -from . import base -from ..constants import DataLossWarning -from .. import constants -from . import etree as etree_builders -from .. import _ihatexml - -import lxml.etree as etree - - -fullTree = True -tag_regexp = re.compile("{([^}]*)}(.*)") - -comment_type = etree.Comment("asd").tag - - -class DocumentType(object): - def __init__(self, name, publicId, systemId): - self.name = name - self.publicId = publicId - self.systemId = systemId - - -class Document(object): - def __init__(self): - self._elementTree = None - self._childNodes = [] - - def appendChild(self, element): - self._elementTree.getroot().addnext(element._element) - - def _getChildNodes(self): - return self._childNodes - - childNodes = property(_getChildNodes) - - -def testSerializer(element): - rv = [] - infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) - - def serializeElement(element, indent=0): - if not hasattr(element, "tag"): - if hasattr(element, "getroot"): - # Full tree case - rv.append("#document") - if element.docinfo.internalDTD: - if not (element.docinfo.public_id or - element.docinfo.system_url): - dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name - else: - dtd_str = """<!DOCTYPE %s "%s" "%s">""" % ( - element.docinfo.root_name, - element.docinfo.public_id, - element.docinfo.system_url) - rv.append("|%s%s" % (' ' * (indent + 2), dtd_str)) - next_element = element.getroot() - while next_element.getprevious() is not None: - next_element = next_element.getprevious() - while next_element is not None: - serializeElement(next_element, indent + 2) - next_element = next_element.getnext() - elif isinstance(element, str) or isinstance(element, bytes): - # Text in a fragment - assert isinstance(element, str) or sys.version_info[0] == 2 - rv.append("|%s\"%s\"" % (' ' * indent, element)) - else: - # Fragment case - rv.append("#document-fragment") - for next_element in element: - serializeElement(next_element, indent + 2) - elif element.tag == comment_type: - rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) - if hasattr(element, "tail") and element.tail: - rv.append("|%s\"%s\"" % (' ' * indent, element.tail)) - else: - assert isinstance(element, etree._Element) - nsmatch = etree_builders.tag_regexp.match(element.tag) - if nsmatch is not None: - ns = nsmatch.group(1) - tag = nsmatch.group(2) - prefix = constants.prefixes[ns] - rv.append("|%s<%s %s>" % (' ' * indent, prefix, - infosetFilter.fromXmlName(tag))) - else: - rv.append("|%s<%s>" % (' ' * indent, - infosetFilter.fromXmlName(element.tag))) - - if hasattr(element, "attrib"): - attributes = [] - for name, value in element.attrib.items(): - nsmatch = tag_regexp.match(name) - if nsmatch is not None: - ns, name = nsmatch.groups() - name = infosetFilter.fromXmlName(name) - prefix = constants.prefixes[ns] - attr_string = "%s %s" % (prefix, name) - else: - attr_string = infosetFilter.fromXmlName(name) - attributes.append((attr_string, value)) - - for name, value in sorted(attributes): - rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) - - if element.text: - rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) - indent += 2 - for child in element: - serializeElement(child, indent) - if hasattr(element, "tail") and element.tail: - rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) - serializeElement(element, 0) - - return "\n".join(rv) - - -def tostring(element): - """Serialize an element and its child nodes to a string""" - rv = [] - - def serializeElement(element): - if not hasattr(element, "tag"): - if element.docinfo.internalDTD: - if element.docinfo.doctype: - dtd_str = element.docinfo.doctype - else: - dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name - rv.append(dtd_str) - serializeElement(element.getroot()) - - elif element.tag == comment_type: - rv.append("<!--%s-->" % (element.text,)) - - else: - # This is assumed to be an ordinary element - if not element.attrib: - rv.append("<%s>" % (element.tag,)) - else: - attr = " ".join(["%s=\"%s\"" % (name, value) - for name, value in element.attrib.items()]) - rv.append("<%s %s>" % (element.tag, attr)) - if element.text: - rv.append(element.text) - - for child in element: - serializeElement(child) - - rv.append("</%s>" % (element.tag,)) - - if hasattr(element, "tail") and element.tail: - rv.append(element.tail) - - serializeElement(element) - - return "".join(rv) - - -class TreeBuilder(base.TreeBuilder): - documentClass = Document - doctypeClass = DocumentType - elementClass = None - commentClass = None - fragmentClass = Document - implementation = etree - - def __init__(self, namespaceHTMLElements, fullTree=False): - builder = etree_builders.getETreeModule(etree, fullTree=fullTree) - infosetFilter = self.infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) - self.namespaceHTMLElements = namespaceHTMLElements - - class Attributes(dict): - def __init__(self, element, value=None): - if value is None: - value = {} - self._element = element - dict.__init__(self, value) # pylint:disable=non-parent-init-called - for key, value in self.items(): - if isinstance(key, tuple): - name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) - else: - name = infosetFilter.coerceAttribute(key) - self._element._element.attrib[name] = value - - def __setitem__(self, key, value): - dict.__setitem__(self, key, value) - if isinstance(key, tuple): - name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) - else: - name = infosetFilter.coerceAttribute(key) - self._element._element.attrib[name] = value - - class Element(builder.Element): - def __init__(self, name, namespace): - name = infosetFilter.coerceElement(name) - builder.Element.__init__(self, name, namespace=namespace) - self._attributes = Attributes(self) - - def _setName(self, name): - self._name = infosetFilter.coerceElement(name) - self._element.tag = self._getETreeTag( - self._name, self._namespace) - - def _getName(self): - return infosetFilter.fromXmlName(self._name) - - name = property(_getName, _setName) - - def _getAttributes(self): - return self._attributes - - def _setAttributes(self, attributes): - self._attributes = Attributes(self, attributes) - - attributes = property(_getAttributes, _setAttributes) - - def insertText(self, data, insertBefore=None): - data = infosetFilter.coerceCharacters(data) - builder.Element.insertText(self, data, insertBefore) - - def appendChild(self, child): - builder.Element.appendChild(self, child) - - class Comment(builder.Comment): - def __init__(self, data): - data = infosetFilter.coerceComment(data) - builder.Comment.__init__(self, data) - - def _setData(self, data): - data = infosetFilter.coerceComment(data) - self._element.text = data - - def _getData(self): - return self._element.text - - data = property(_getData, _setData) - - self.elementClass = Element - self.commentClass = Comment - # self.fragmentClass = builder.DocumentFragment - base.TreeBuilder.__init__(self, namespaceHTMLElements) - - def reset(self): - base.TreeBuilder.reset(self) - self.insertComment = self.insertCommentInitial - self.initial_comments = [] - self.doctype = None - - def testSerializer(self, element): - return testSerializer(element) - - def getDocument(self): - if fullTree: - return self.document._elementTree - else: - return self.document._elementTree.getroot() - - def getFragment(self): - fragment = [] - element = self.openElements[0]._element - if element.text: - fragment.append(element.text) - fragment.extend(list(element)) - if element.tail: - fragment.append(element.tail) - return fragment - - def insertDoctype(self, token): - name = token["name"] - publicId = token["publicId"] - systemId = token["systemId"] - - if not name: - warnings.warn("lxml cannot represent empty doctype", DataLossWarning) - self.doctype = None - else: - coercedName = self.infosetFilter.coerceElement(name) - if coercedName != name: - warnings.warn("lxml cannot represent non-xml doctype", DataLossWarning) - - doctype = self.doctypeClass(coercedName, publicId, systemId) - self.doctype = doctype - - def insertCommentInitial(self, data, parent=None): - assert parent is None or parent is self.document - assert self.document._elementTree is None - self.initial_comments.append(data) - - def insertCommentMain(self, data, parent=None): - if (parent == self.document and - self.document._elementTree.getroot()[-1].tag == comment_type): - warnings.warn("lxml cannot represent adjacent comments beyond the root elements", DataLossWarning) - super(TreeBuilder, self).insertComment(data, parent) - - def insertRoot(self, token): - # Because of the way libxml2 works, it doesn't seem to be possible to - # alter information like the doctype after the tree has been parsed. - # Therefore we need to use the built-in parser to create our initial - # tree, after which we can add elements like normal - docStr = "" - if self.doctype: - assert self.doctype.name - docStr += "<!DOCTYPE %s" % self.doctype.name - if (self.doctype.publicId is not None or - self.doctype.systemId is not None): - docStr += (' PUBLIC "%s" ' % - (self.infosetFilter.coercePubid(self.doctype.publicId or ""))) - if self.doctype.systemId: - sysid = self.doctype.systemId - if sysid.find("'") >= 0 and sysid.find('"') >= 0: - warnings.warn("DOCTYPE system cannot contain single and double quotes", DataLossWarning) - sysid = sysid.replace("'", 'U00027') - if sysid.find("'") >= 0: - docStr += '"%s"' % sysid - else: - docStr += "'%s'" % sysid - else: - docStr += "''" - docStr += ">" - if self.doctype.name != token["name"]: - warnings.warn("lxml cannot represent doctype with a different name to the root element", DataLossWarning) - docStr += "<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>" - root = etree.fromstring(docStr) - - # Append the initial comments: - for comment_token in self.initial_comments: - comment = self.commentClass(comment_token["data"]) - root.addprevious(comment._element) - - # Create the root document and add the ElementTree to it - self.document = self.documentClass() - self.document._elementTree = root.getroottree() - - # Give the root element the right name - name = token["name"] - namespace = token.get("namespace", self.defaultNamespace) - if namespace is None: - etree_tag = name - else: - etree_tag = "{%s}%s" % (namespace, name) - root.tag = etree_tag - - # Add the root element to the internal child/open data structures - root_element = self.elementClass(name, namespace) - root_element._element = root - self.document._childNodes.append(root_element) - self.openElements.append(root_element) - - # Reset to the default insert comment function - self.insertComment = self.insertCommentMain diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/__init__.py deleted file mode 100644 index 9bec207..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/__init__.py +++ /dev/null @@ -1,154 +0,0 @@ -"""A collection of modules for iterating through different kinds of -tree, generating tokens identical to those produced by the tokenizer -module. - -To create a tree walker for a new type of tree, you need to do -implement a tree walker object (called TreeWalker by convention) that -implements a 'serialize' method taking a tree as sole argument and -returning an iterator generating tokens. -""" - -from __future__ import absolute_import, division, unicode_literals - -from .. import constants -from .._utils import default_etree - -__all__ = ["getTreeWalker", "pprint"] - -treeWalkerCache = {} - - -def getTreeWalker(treeType, implementation=None, **kwargs): - """Get a TreeWalker class for various types of tree with built-in support - - :arg str treeType: the name of the tree type required (case-insensitive). - Supported values are: - - * "dom": The xml.dom.minidom DOM implementation - * "etree": A generic walker for tree implementations exposing an - elementtree-like interface (known to work with ElementTree, - cElementTree and lxml.etree). - * "lxml": Optimized walker for lxml.etree - * "genshi": a Genshi stream - - :arg implementation: A module implementing the tree type e.g. - xml.etree.ElementTree or cElementTree (Currently applies to the "etree" - tree type only). - - :arg kwargs: keyword arguments passed to the etree walker--for other - walkers, this has no effect - - :returns: a TreeWalker class - - """ - - treeType = treeType.lower() - if treeType not in treeWalkerCache: - if treeType == "dom": - from . import dom - treeWalkerCache[treeType] = dom.TreeWalker - elif treeType == "genshi": - from . import genshi - treeWalkerCache[treeType] = genshi.TreeWalker - elif treeType == "lxml": - from . import etree_lxml - treeWalkerCache[treeType] = etree_lxml.TreeWalker - elif treeType == "etree": - from . import etree - if implementation is None: - implementation = default_etree - # XXX: NEVER cache here, caching is done in the etree submodule - return etree.getETreeModule(implementation, **kwargs).TreeWalker - return treeWalkerCache.get(treeType) - - -def concatenateCharacterTokens(tokens): - pendingCharacters = [] - for token in tokens: - type = token["type"] - if type in ("Characters", "SpaceCharacters"): - pendingCharacters.append(token["data"]) - else: - if pendingCharacters: - yield {"type": "Characters", "data": "".join(pendingCharacters)} - pendingCharacters = [] - yield token - if pendingCharacters: - yield {"type": "Characters", "data": "".join(pendingCharacters)} - - -def pprint(walker): - """Pretty printer for tree walkers - - Takes a TreeWalker instance and pretty prints the output of walking the tree. - - :arg walker: a TreeWalker instance - - """ - output = [] - indent = 0 - for token in concatenateCharacterTokens(walker): - type = token["type"] - if type in ("StartTag", "EmptyTag"): - # tag name - if token["namespace"] and token["namespace"] != constants.namespaces["html"]: - if token["namespace"] in constants.prefixes: - ns = constants.prefixes[token["namespace"]] - else: - ns = token["namespace"] - name = "%s %s" % (ns, token["name"]) - else: - name = token["name"] - output.append("%s<%s>" % (" " * indent, name)) - indent += 2 - # attributes (sorted for consistent ordering) - attrs = token["data"] - for (namespace, localname), value in sorted(attrs.items()): - if namespace: - if namespace in constants.prefixes: - ns = constants.prefixes[namespace] - else: - ns = namespace - name = "%s %s" % (ns, localname) - else: - name = localname - output.append("%s%s=\"%s\"" % (" " * indent, name, value)) - # self-closing - if type == "EmptyTag": - indent -= 2 - - elif type == "EndTag": - indent -= 2 - - elif type == "Comment": - output.append("%s<!-- %s -->" % (" " * indent, token["data"])) - - elif type == "Doctype": - if token["name"]: - if token["publicId"]: - output.append("""%s<!DOCTYPE %s "%s" "%s">""" % - (" " * indent, - token["name"], - token["publicId"], - token["systemId"] if token["systemId"] else "")) - elif token["systemId"]: - output.append("""%s<!DOCTYPE %s "" "%s">""" % - (" " * indent, - token["name"], - token["systemId"])) - else: - output.append("%s<!DOCTYPE %s>" % (" " * indent, - token["name"])) - else: - output.append("%s<!DOCTYPE >" % (" " * indent,)) - - elif type == "Characters": - output.append("%s\"%s\"" % (" " * indent, token["data"])) - - elif type == "SpaceCharacters": - assert False, "concatenateCharacterTokens should have got rid of all Space tokens" - - else: - raise ValueError("Unknown token type, %s" % type) - - return "\n".join(output) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index dc24fc288be65bf13689bfa5fa09810b973144f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4024 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/base.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/base.py deleted file mode 100644 index 80c474c..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/base.py +++ /dev/null @@ -1,252 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from xml.dom import Node -from ..constants import namespaces, voidElements, spaceCharacters - -__all__ = ["DOCUMENT", "DOCTYPE", "TEXT", "ELEMENT", "COMMENT", "ENTITY", "UNKNOWN", - "TreeWalker", "NonRecursiveTreeWalker"] - -DOCUMENT = Node.DOCUMENT_NODE -DOCTYPE = Node.DOCUMENT_TYPE_NODE -TEXT = Node.TEXT_NODE -ELEMENT = Node.ELEMENT_NODE -COMMENT = Node.COMMENT_NODE -ENTITY = Node.ENTITY_NODE -UNKNOWN = "<#UNKNOWN#>" - -spaceCharacters = "".join(spaceCharacters) - - -class TreeWalker(object): - """Walks a tree yielding tokens - - Tokens are dicts that all have a ``type`` field specifying the type of the - token. - - """ - def __init__(self, tree): - """Creates a TreeWalker - - :arg tree: the tree to walk - - """ - self.tree = tree - - def __iter__(self): - raise NotImplementedError - - def error(self, msg): - """Generates an error token with the given message - - :arg msg: the error message - - :returns: SerializeError token - - """ - return {"type": "SerializeError", "data": msg} - - def emptyTag(self, namespace, name, attrs, hasChildren=False): - """Generates an EmptyTag token - - :arg namespace: the namespace of the token--can be ``None`` - - :arg name: the name of the element - - :arg attrs: the attributes of the element as a dict - - :arg hasChildren: whether or not to yield a SerializationError because - this tag shouldn't have children - - :returns: EmptyTag token - - """ - yield {"type": "EmptyTag", "name": name, - "namespace": namespace, - "data": attrs} - if hasChildren: - yield self.error("Void element has children") - - def startTag(self, namespace, name, attrs): - """Generates a StartTag token - - :arg namespace: the namespace of the token--can be ``None`` - - :arg name: the name of the element - - :arg attrs: the attributes of the element as a dict - - :returns: StartTag token - - """ - return {"type": "StartTag", - "name": name, - "namespace": namespace, - "data": attrs} - - def endTag(self, namespace, name): - """Generates an EndTag token - - :arg namespace: the namespace of the token--can be ``None`` - - :arg name: the name of the element - - :returns: EndTag token - - """ - return {"type": "EndTag", - "name": name, - "namespace": namespace} - - def text(self, data): - """Generates SpaceCharacters and Characters tokens - - Depending on what's in the data, this generates one or more - ``SpaceCharacters`` and ``Characters`` tokens. - - For example: - - >>> from html5lib.treewalkers.base import TreeWalker - >>> # Give it an empty tree just so it instantiates - >>> walker = TreeWalker([]) - >>> list(walker.text('')) - [] - >>> list(walker.text(' ')) - [{u'data': ' ', u'type': u'SpaceCharacters'}] - >>> list(walker.text(' abc ')) # doctest: +NORMALIZE_WHITESPACE - [{u'data': ' ', u'type': u'SpaceCharacters'}, - {u'data': u'abc', u'type': u'Characters'}, - {u'data': u' ', u'type': u'SpaceCharacters'}] - - :arg data: the text data - - :returns: one or more ``SpaceCharacters`` and ``Characters`` tokens - - """ - data = data - middle = data.lstrip(spaceCharacters) - left = data[:len(data) - len(middle)] - if left: - yield {"type": "SpaceCharacters", "data": left} - data = middle - middle = data.rstrip(spaceCharacters) - right = data[len(middle):] - if middle: - yield {"type": "Characters", "data": middle} - if right: - yield {"type": "SpaceCharacters", "data": right} - - def comment(self, data): - """Generates a Comment token - - :arg data: the comment - - :returns: Comment token - - """ - return {"type": "Comment", "data": data} - - def doctype(self, name, publicId=None, systemId=None): - """Generates a Doctype token - - :arg name: - - :arg publicId: - - :arg systemId: - - :returns: the Doctype token - - """ - return {"type": "Doctype", - "name": name, - "publicId": publicId, - "systemId": systemId} - - def entity(self, name): - """Generates an Entity token - - :arg name: the entity name - - :returns: an Entity token - - """ - return {"type": "Entity", "name": name} - - def unknown(self, nodeType): - """Handles unknown node types""" - return self.error("Unknown node type: " + nodeType) - - -class NonRecursiveTreeWalker(TreeWalker): - def getNodeDetails(self, node): - raise NotImplementedError - - def getFirstChild(self, node): - raise NotImplementedError - - def getNextSibling(self, node): - raise NotImplementedError - - def getParentNode(self, node): - raise NotImplementedError - - def __iter__(self): - currentNode = self.tree - while currentNode is not None: - details = self.getNodeDetails(currentNode) - type, details = details[0], details[1:] - hasChildren = False - - if type == DOCTYPE: - yield self.doctype(*details) - - elif type == TEXT: - for token in self.text(*details): - yield token - - elif type == ELEMENT: - namespace, name, attributes, hasChildren = details - if (not namespace or namespace == namespaces["html"]) and name in voidElements: - for token in self.emptyTag(namespace, name, attributes, - hasChildren): - yield token - hasChildren = False - else: - yield self.startTag(namespace, name, attributes) - - elif type == COMMENT: - yield self.comment(details[0]) - - elif type == ENTITY: - yield self.entity(details[0]) - - elif type == DOCUMENT: - hasChildren = True - - else: - yield self.unknown(details[0]) - - if hasChildren: - firstChild = self.getFirstChild(currentNode) - else: - firstChild = None - - if firstChild is not None: - currentNode = firstChild - else: - while currentNode is not None: - details = self.getNodeDetails(currentNode) - type, details = details[0], details[1:] - if type == ELEMENT: - namespace, name, attributes, hasChildren = details - if (namespace and namespace != namespaces["html"]) or name not in voidElements: - yield self.endTag(namespace, name) - if self.tree is currentNode: - currentNode = None - break - nextSibling = self.getNextSibling(currentNode) - if nextSibling is not None: - currentNode = nextSibling - break - else: - currentNode = self.getParentNode(currentNode) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/dom.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/dom.py deleted file mode 100644 index b0c89b0..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/dom.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from xml.dom import Node - -from . import base - - -class TreeWalker(base.NonRecursiveTreeWalker): - def getNodeDetails(self, node): - if node.nodeType == Node.DOCUMENT_TYPE_NODE: - return base.DOCTYPE, node.name, node.publicId, node.systemId - - elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE): - return base.TEXT, node.nodeValue - - elif node.nodeType == Node.ELEMENT_NODE: - attrs = {} - for attr in list(node.attributes.keys()): - attr = node.getAttributeNode(attr) - if attr.namespaceURI: - attrs[(attr.namespaceURI, attr.localName)] = attr.value - else: - attrs[(None, attr.name)] = attr.value - return (base.ELEMENT, node.namespaceURI, node.nodeName, - attrs, node.hasChildNodes()) - - elif node.nodeType == Node.COMMENT_NODE: - return base.COMMENT, node.nodeValue - - elif node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE): - return (base.DOCUMENT,) - - else: - return base.UNKNOWN, node.nodeType - - def getFirstChild(self, node): - return node.firstChild - - def getNextSibling(self, node): - return node.nextSibling - - def getParentNode(self, node): - return node.parentNode diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree.py deleted file mode 100644 index 95fc0c1..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree.py +++ /dev/null @@ -1,130 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from collections import OrderedDict -import re - -from pip._vendor.six import string_types - -from . import base -from .._utils import moduleFactoryFactory - -tag_regexp = re.compile("{([^}]*)}(.*)") - - -def getETreeBuilder(ElementTreeImplementation): - ElementTree = ElementTreeImplementation - ElementTreeCommentType = ElementTree.Comment("asd").tag - - class TreeWalker(base.NonRecursiveTreeWalker): # pylint:disable=unused-variable - """Given the particular ElementTree representation, this implementation, - to avoid using recursion, returns "nodes" as tuples with the following - content: - - 1. The current element - - 2. The index of the element relative to its parent - - 3. A stack of ancestor elements - - 4. A flag "text", "tail" or None to indicate if the current node is a - text node; either the text or tail of the current element (1) - """ - def getNodeDetails(self, node): - if isinstance(node, tuple): # It might be the root Element - elt, _, _, flag = node - if flag in ("text", "tail"): - return base.TEXT, getattr(elt, flag) - else: - node = elt - - if not(hasattr(node, "tag")): - node = node.getroot() - - if node.tag in ("DOCUMENT_ROOT", "DOCUMENT_FRAGMENT"): - return (base.DOCUMENT,) - - elif node.tag == "<!DOCTYPE>": - return (base.DOCTYPE, node.text, - node.get("publicId"), node.get("systemId")) - - elif node.tag == ElementTreeCommentType: - return base.COMMENT, node.text - - else: - assert isinstance(node.tag, string_types), type(node.tag) - # This is assumed to be an ordinary element - match = tag_regexp.match(node.tag) - if match: - namespace, tag = match.groups() - else: - namespace = None - tag = node.tag - attrs = OrderedDict() - for name, value in list(node.attrib.items()): - match = tag_regexp.match(name) - if match: - attrs[(match.group(1), match.group(2))] = value - else: - attrs[(None, name)] = value - return (base.ELEMENT, namespace, tag, - attrs, len(node) or node.text) - - def getFirstChild(self, node): - if isinstance(node, tuple): - element, key, parents, flag = node - else: - element, key, parents, flag = node, None, [], None - - if flag in ("text", "tail"): - return None - else: - if element.text: - return element, key, parents, "text" - elif len(element): - parents.append(element) - return element[0], 0, parents, None - else: - return None - - def getNextSibling(self, node): - if isinstance(node, tuple): - element, key, parents, flag = node - else: - return None - - if flag == "text": - if len(element): - parents.append(element) - return element[0], 0, parents, None - else: - return None - else: - if element.tail and flag != "tail": - return element, key, parents, "tail" - elif key < len(parents[-1]) - 1: - return parents[-1][key + 1], key + 1, parents, None - else: - return None - - def getParentNode(self, node): - if isinstance(node, tuple): - element, key, parents, flag = node - else: - return None - - if flag == "text": - if not parents: - return element - else: - return element, key, parents, None - else: - parent = parents.pop() - if not parents: - return parent - else: - assert list(parents[-1]).count(parent) == 1 - return parent, list(parents[-1]).index(parent), parents, None - - return locals() - -getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree_lxml.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree_lxml.py deleted file mode 100644 index e81ddf3..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree_lxml.py +++ /dev/null @@ -1,213 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import text_type - -from lxml import etree -from ..treebuilders.etree import tag_regexp - -from . import base - -from .. import _ihatexml - - -def ensure_str(s): - if s is None: - return None - elif isinstance(s, text_type): - return s - else: - return s.decode("ascii", "strict") - - -class Root(object): - def __init__(self, et): - self.elementtree = et - self.children = [] - - try: - if et.docinfo.internalDTD: - self.children.append(Doctype(self, - ensure_str(et.docinfo.root_name), - ensure_str(et.docinfo.public_id), - ensure_str(et.docinfo.system_url))) - except AttributeError: - pass - - try: - node = et.getroot() - except AttributeError: - node = et - - while node.getprevious() is not None: - node = node.getprevious() - while node is not None: - self.children.append(node) - node = node.getnext() - - self.text = None - self.tail = None - - def __getitem__(self, key): - return self.children[key] - - def getnext(self): - return None - - def __len__(self): - return 1 - - -class Doctype(object): - def __init__(self, root_node, name, public_id, system_id): - self.root_node = root_node - self.name = name - self.public_id = public_id - self.system_id = system_id - - self.text = None - self.tail = None - - def getnext(self): - return self.root_node.children[1] - - -class FragmentRoot(Root): - def __init__(self, children): - self.children = [FragmentWrapper(self, child) for child in children] - self.text = self.tail = None - - def getnext(self): - return None - - -class FragmentWrapper(object): - def __init__(self, fragment_root, obj): - self.root_node = fragment_root - self.obj = obj - if hasattr(self.obj, 'text'): - self.text = ensure_str(self.obj.text) - else: - self.text = None - if hasattr(self.obj, 'tail'): - self.tail = ensure_str(self.obj.tail) - else: - self.tail = None - - def __getattr__(self, name): - return getattr(self.obj, name) - - def getnext(self): - siblings = self.root_node.children - idx = siblings.index(self) - if idx < len(siblings) - 1: - return siblings[idx + 1] - else: - return None - - def __getitem__(self, key): - return self.obj[key] - - def __bool__(self): - return bool(self.obj) - - def getparent(self): - return None - - def __str__(self): - return str(self.obj) - - def __unicode__(self): - return str(self.obj) - - def __len__(self): - return len(self.obj) - - -class TreeWalker(base.NonRecursiveTreeWalker): - def __init__(self, tree): - # pylint:disable=redefined-variable-type - if isinstance(tree, list): - self.fragmentChildren = set(tree) - tree = FragmentRoot(tree) - else: - self.fragmentChildren = set() - tree = Root(tree) - base.NonRecursiveTreeWalker.__init__(self, tree) - self.filter = _ihatexml.InfosetFilter() - - def getNodeDetails(self, node): - if isinstance(node, tuple): # Text node - node, key = node - assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key - return base.TEXT, ensure_str(getattr(node, key)) - - elif isinstance(node, Root): - return (base.DOCUMENT,) - - elif isinstance(node, Doctype): - return base.DOCTYPE, node.name, node.public_id, node.system_id - - elif isinstance(node, FragmentWrapper) and not hasattr(node, "tag"): - return base.TEXT, ensure_str(node.obj) - - elif node.tag == etree.Comment: - return base.COMMENT, ensure_str(node.text) - - elif node.tag == etree.Entity: - return base.ENTITY, ensure_str(node.text)[1:-1] # strip &; - - else: - # This is assumed to be an ordinary element - match = tag_regexp.match(ensure_str(node.tag)) - if match: - namespace, tag = match.groups() - else: - namespace = None - tag = ensure_str(node.tag) - attrs = {} - for name, value in list(node.attrib.items()): - name = ensure_str(name) - value = ensure_str(value) - match = tag_regexp.match(name) - if match: - attrs[(match.group(1), match.group(2))] = value - else: - attrs[(None, name)] = value - return (base.ELEMENT, namespace, self.filter.fromXmlName(tag), - attrs, len(node) > 0 or node.text) - - def getFirstChild(self, node): - assert not isinstance(node, tuple), "Text nodes have no children" - - assert len(node) or node.text, "Node has no children" - if node.text: - return (node, "text") - else: - return node[0] - - def getNextSibling(self, node): - if isinstance(node, tuple): # Text node - node, key = node - assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key - if key == "text": - # XXX: we cannot use a "bool(node) and node[0] or None" construct here - # because node[0] might evaluate to False if it has no child element - if len(node): - return node[0] - else: - return None - else: # tail - return node.getnext() - - return (node, "tail") if node.tail else node.getnext() - - def getParentNode(self, node): - if isinstance(node, tuple): # Text node - node, key = node - assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key - if key == "text": - return node - # else: fallback to "normal" processing - elif node in self.fragmentChildren: - return None - - return node.getparent() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/genshi.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/genshi.py deleted file mode 100644 index 7483be2..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/genshi.py +++ /dev/null @@ -1,69 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from genshi.core import QName -from genshi.core import START, END, XML_NAMESPACE, DOCTYPE, TEXT -from genshi.core import START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT - -from . import base - -from ..constants import voidElements, namespaces - - -class TreeWalker(base.TreeWalker): - def __iter__(self): - # Buffer the events so we can pass in the following one - previous = None - for event in self.tree: - if previous is not None: - for token in self.tokens(previous, event): - yield token - previous = event - - # Don't forget the final event! - if previous is not None: - for token in self.tokens(previous, None): - yield token - - def tokens(self, event, next): - kind, data, _ = event - if kind == START: - tag, attribs = data - name = tag.localname - namespace = tag.namespace - converted_attribs = {} - for k, v in attribs: - if isinstance(k, QName): - converted_attribs[(k.namespace, k.localname)] = v - else: - converted_attribs[(None, k)] = v - - if namespace == namespaces["html"] and name in voidElements: - for token in self.emptyTag(namespace, name, converted_attribs, - not next or next[0] != END or - next[1] != tag): - yield token - else: - yield self.startTag(namespace, name, converted_attribs) - - elif kind == END: - name = data.localname - namespace = data.namespace - if namespace != namespaces["html"] or name not in voidElements: - yield self.endTag(namespace, name) - - elif kind == COMMENT: - yield self.comment(data) - - elif kind == TEXT: - for token in self.text(data): - yield token - - elif kind == DOCTYPE: - yield self.doctype(*data) - - elif kind in (XML_NAMESPACE, DOCTYPE, START_NS, END_NS, - START_CDATA, END_CDATA, PI): - pass - - else: - yield self.unknown(kind) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__init__.py deleted file mode 100644 index 847bf93..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .package_data import __version__ -from .core import * diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 7ee4ff90674e1af6a529b76d0b6a8498be89d939..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276 zcmYjLyG{c!5VS85LXh<Q!Xcd(lm?;*QBhLxXi{LAc)7Fi*_Lfix=-Ry_=an#_yrnR zBZ{oFGdnxdXdai#BS!P_Q$MYVKa1F(io`W-Iw8<ZbIW?Z<-FXLtsa=3-LrcB#mTPu zbS&k7F&XcqB*{;2>)EsjYWJ#Ilv-sKOX4)&`H1f<9+3Eh?+l&q5n_iKosV#1O$c}J zQYbd9B5y!9fHlt$#@u<g5*Lt6#^yghK`@~?zZ7R;)r663fo)r!K&70fP@|m!DUCB( VN)g8CaMOGJX7Q@@Po>&|{{k9oN{9de diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__pycache__/core.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__pycache__/core.cpython-38.pyc deleted file mode 100644 index 8971da996b36d89f12491c37902a5a7cdf34b808..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9064 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 apM^Z_UO<|0Y-ilfIi7RK+3y~4pZ-4{w<Jyg diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__pycache__/idnadata.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__pycache__/idnadata.cpython-38.pyc deleted file mode 100644 index f37a9cb48b75d7e7566c4242727c2e6f98c6b1e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21400 zcmeI)4^-8K{r~X~h>D7eMoLDCMh1$AN{WhlRa8_`GcqGmw2OiwB3?}s>(=OxMP`j} zF(Y%16&Y*RsGMVs6_pj06_sPmQRCa!iZy=4nsa>X_j-L^pZDyy@7eGC&Ufeh&hK|l z^X%p0dGF_bE?iN!doNzqzkgo`|2h6m!m1Y^ahyLezWtvMLmkJ53$}LjbR55v?f66d zq5dBJFn>>fud1HeA^zU~@FN`E$NLeEpY`8x{LCNcuCYu0@#ntYk#;%HpdY%eo!u_| zXFuCL{qKJMXSe<DT&|Dvzuw!oAA@gy26i9)+{cJ@?zVQ_xzF7$Id`^m_jm5PZ%b$U z_9g$-JjO1i&h<Ij_5bS6eZO^Ic2DQ-{o7~frTVJk&vp%e-R*XE*}0$f+3J{oJnG!N z@T}qfzTZ0QxikE~u5-W7`uY3){ZaYXKI-1?V_|3h*Ut5ScI$}$<+1OB(to+V{Soe0 zpnfgwd=cOJT<up<M_cjN+x~m*>sHt58rySc=6%^c{P%y>eem|@^v};`U(5RF|M_wM zcdzNcFSM#HJJdhGKhPiPA5_&NyN7@9l}^HWH};w^At^a2IU%mF2mS^KU>f?n+yOR= zH-V?cAlNP521X8WkG%to7VidQ#e2YH@er6Qegu|_P8jZOpnHa~7dcL4z~x#nu+8O0 zUMe<#-P_$uhm62STIzB*m@Cc)gW?h}c6SHv$XN;ccDu)BgMKjwEEHFP0r4iVRD1?> zZgOw-5_nQ<2BU9wFKq=^ik)CU{4;o5{02OEb0I!M=hBh*EW$z@H`a{}aVp03RNNba zzj=FxD}IOw_VQx>a(wg|1Du3G?ydGG;XKp4Q*<E;E#4oGYtp=HdL=tfl+TNBM2y84 zM43ezq7Bi(kM7yaG0VK@91((Fs8D@CMK>b+y%jBphJxO@%?G3LKNOru#br|vG3P6W zry{QN;?R<wPB7Pt4>$I78m0}=*@oYU!*Yi@34Pp0^EfJfNC$txJ_CJ2-An%r)(>?* z|0%mdoIs)Xq0B(ES<FJ5v6zE!HhG85Lqu3CLqsDI!rV{#K|BIsv%LrEAR;iwixCrg zIAOm2`Y=OE_^U9`NeFju^*26<cAzuCak}PukDD_QU&#x+Q+$K)E%svNBz#htUKHOP z;#BVTKE4BpMvIVS+!O9Lp=V3a1tocT8(Vs0tSM^gm65l$B=3fn@Qi|zHS5<Dt!W8g zye6<_BlO8tIPoXxoaLOkoGeZzCcX_{Sp`lnOb92G(}NSn>B$M_^y9>GMsh}RF6P8> zF5!&kT*`^(Byh%X#&Qxl<2Xs2@tkDN1kOaxBu)zFGR|bq6izB<DrXvJIwy@YgENye zi{s<W=FH*D<)m}waprRta56XxIg2<&oXwmqoD$AfPJpwGvz>DTX9s5|=SI#hPAO+M z=O)h0oFL~G&aIs9amqNiac<|_!MT&OhjSO_ZcaJp9?o9Qy_|iV`#AS=zR#)P{2S*1 z&V!sv&JQ^IIS+BFI1h6Ua30|t<ou9xi1Q;(HRs2iM>&siYB-N`4s)L1)N+2pd6M%} z&JoU2oToWI<J57U;XKQEj&qdrbIvi&FF5s_Uvi%3{EE}S`8DSS&WoHz&P$w^Ij?Yz zb6(}V#(AC7#Ce1BCg&~A3C`P`cR25I-sAj^^Eu~FoU@$2ak@F*a0d3qL~;gm&f`RJ z&gTr_4CO>~F5nE~T*!&xT*Mj98NrF=jO2{sT+E5%T*4X6xs(&nN#Km(jO8S9#&ME3 z<2jdemT;DGmT|7&EazOw$>LnaS;4uQvyyWSC!2FECx>$#XBB5PCzrE^vzBu`2Y=o> z1$mrxob{Z14*u+S3N~;ya_~p4Q-D8E@w<$(nN!T!!YScw<pem}INLclaCUHZa&F}8 z;*@gmry+i;ac<_k#(AC7#Ce1BCg&~A3C`P`cR25InmO-r-sgP4Im!7Ar-k!dPAlhk zoKu|NbJ{o`az5hxfz!_Uch1M0|KObFe8TyZbC%-^$IRx;;mqZvbLMg8a~5ziI14$8 zIEy)%oXa^&I7>OpI9G6%bFSoMajxR5;9SjF$;suc;jHCc&+&8eIO{m;Ir*Fd&IZmw z&JQ_<I6vZ4bAHTul=B#;hVwY*Fy{$QE$1hkCpkam9N|30d7ASxP95i2&U2ijoS$=! zael$6=lqiM5vNx)rZ=ZAX8<RbGm<lkb1^55a|vfO=Tc5QCxJ7DGnSLc8OKTDjOQeC zCU7QlCUH_YmvJU@rf^a@Q#sQ((>ZCJ8JwA%SsWi{HfIiJE+?Hck29aMfRn*l$XUc$ z%*o_j&RN1)%2~#_g0q}+B`1q>6=wzKYR*c|HJohDwVWKzb(~e4)tp?;8qQkI^&CGZ zkF$=mo|Dfh;B4S*<P>r?af&#bImMhUoD$AfPJpwGvz>DTX9p+9xrK8p=X;zo&TX9A zId^dG<m}<x#kreP&bf!Pmvb*?ALl;K{haS}Dmeefd4TgEr;_sn&VJ5AoGQ-4oCBOk zI0rdD<Q(Gsh*Qn^G3QavW1Je!VNOIWraxyqXB}rfC!bTm@zr2vbLMd7a?&~TIP*CR zI2oLUoJE|)oJ`K;oF$y4oMoIVILkR#a<VvAaaM4y=B(sg!^!4c%gNzf$63W$&B^7g z;jHCc&+&8eIO{m;Ir*Fd&IZm#P9bL#r--weQ_R`IDdBA8H1rL@U-X<8I4^P<IWKWu z=Dfl=&Uuyd8s~LR6Xy-io1C{eCpd3&-r>B<Y397gd7twE=OpJhoEFY+Ijx-EaZYi5 z&uQa)$oYu#2TnWZGfoHRkDSjrf8qrDVQ%5v%K09rjB^|3cFrA~J2`tecX96KlymOk z?B(3c*~ht$^El@)=Lt?N=O>&eIX~q%{V^e&P)-j{7^f$v7pFHToYRNXm(!0E!RgN# zz!}Ji<P72r=A6fg;+)SJ!Wqhm=3KxT#<`Fa!?}nvoHK$G%NfZT#krW1JP<R1Gm$fi zlft=-Gnq4mlggROnZ}vUN#o4m%;e1C_&BpUb2xK3>703-D>%zJS8}pAzl_AZ!Ervp zgm6MRJvd>Uo}6Bs-kfkwA5LFRKTZUvKW6}EASaSDh%=aT9w&-(K4%DLC?}e80cRNJ zLQV|lBF=Em2u>_#Bxe-oVon_A63%GOrJQ(90%r_oEGLmOj+4Y0&q?M?;7sI9;-qjc z<4opE;iPh=a;9;nbJ937I5Ro3I6ls7&K%BMO#Bu+f#CjMbv`{&Cr$$!#9d%nh<m_a zz|tNr9sGavHZc?o3v(~U^CM1#*b9sj!@(F4zX6>%F#=2!2Y@LeevzFtaWI%JMuC~) z5HL%O26Mz=pkIsu3&r7JK#T=T#Zh3H7zdV%qrnO>9;_0_fYo9mSSu!hbz(ADFHQs- z#mQi^I2CLar-P@(8DOV43p^v@i3lgWr~63G10zK|BjH4g3&B_s&qg?j;u0`LTn46z z%fWOp3(OQ(fLY>7Fh|S={bCMSD6RqnVlG%Jt_90PKUglV11rRQuu9wjR*QvTtyl!s ziN#>OSOPYR0kBEj4mOKBz*dpZ5S<oxgPkItigC_}w}4JB_mM0EBgEUmC~*%MEA9o8 z#qWa|;saooSOxmUN5CE8A+SuW2Ft}q!3yzl@Ss==)`(Anb>dTCgZK=1LVON9Db|DS zVk6ikz6GZCc0aebL7(_8m?6FgE)zchSBk#@bH(3+`Qj<CSZo7J#gD);u^lWIKL#tr z(_oeODOfFbfVJZ1V4e6sz<Tj3uvt6{wu{|hhxj$vB|3QSt6K~O!@~6^3>YEy0;9xm zFh=YP#)%PNqBsCd5hKAgaWI%JMuC~)5HL%O26Mz=pkIsu3&r7JK#T=T#Zh3H7zdV% zqrnO>9;_0_fYo9mSSu!hbz(ADFHQs-#c5!ZI0NhyXM^41TrgZu%w~Ww;vz6k%mfp~ zC18qp1WXfO0NeYzkNP`cbU&AW1doV+0*{J5KI<Fd9xxXS*NY2F!Dz7<^oe{rwo&9O z6-^>vsc04XN=1iwAL!HT3~zx)#FJo-UUFyw{bDOvD4qfXVjEa0@<od>u^lWIKL#tr z(_oeODOfFbfVJZ1V4c_r){9+WllWJ#P5e)=L(IkBunm#!qq7z)8|2atmW%7a3Nat7 z5;uU=BA-966^p<+u^6luOTb1k05*x+!Dev>*ec!#wu_};hj<g%B?iH6@m4Twu>0}e z2}X$JV4}DeOcD2iY2y80x>x~biVuKUVkMX(?g#y16<8=900ZJduv9z*mWkD1x%enp zA=ZFZ;$g5_tOaYuC&4=L2v{#Z4K|8(V3YVP*eo6eTg78wyI2o)h|hyvVguMMz6ge& z=RSNdfsx`XV6^xu7%RRG#*1%&$>IqxReT3b7n{LM@qI8$JPGEAEudd)1q;PfU_fjG zOT~}CGO-;j7e59o#M5Av_$gQ|^3{}D@pG_F>;&t@FTh5z3v3d<0-MD%V5@i*Y!|!1 z4)JTSOLXu$QnwfihDEs#Y8V(H_5!2Ca4<&f3&x2NV4^qxOc5i&G;uJPE=GZw;t()P zj0SVWVW3}(0Sm?9U_guoOT|%OnHUF_i+uI1LW~Ei#4%vCm<ZO2Nno9r4AzU;p#OaL zakv8vihID=A?~HmgXv-e*e$*YhUvw*m%&JpuinKBE$M?l$KBh0iN@=8_(ROO5YMvv zqFwsHpqLAWUEp5I7h#Ty&0xF8r|z>ZbPxChEEPM!8qvX%uBXMtpfAQf_GvKXB9~u* z&Ip%ZgI!`$I4+HKFU=uGy4(l`#b?M-?xoLzCq+InnR&5$=}LT-<)R-9UgBO_3|5L| zV54{s7&Y2G;65--d>qUap8{*dpMl54W8g{gC9qR`6^yymJ=t4eqIeR_5!=C__yt%g z{wLTeegmEn!|;Bvuz2@m{lF-35SS(=fSKY1utuB&9v3Hr&Ehn$O`HLCigUp;;zBSc z!M(R7V4}DjOc$>Mi^c6=rC0`rjd5?b7mO0`2h+sI!A$Wfutux{kBi5^X7OdPQ+y4K z8S9?+O)yb>8}y0oU{LG?D@CUtzC6V+Ff7qMLw_(z90aC`31Fr;0jv>Iz~kaHuvwf3 zc8UwZm~ncbz(jE+xKi|krD8EyDVBhZVi_2o<euSfFiN}+OcfshGsK5LzxXg%EFJ`R zh(89)#V5dn;xX{3_#${ld=-oyuLl*37vBbb;z=+^>;x;t{t@_HnC#wc5SS_^fEnU6 zutuB*c8LqY=m~nDz<BX$FiX4^%oY7$P%H*3#WK*D=$_#oFiN}+OcfsoGsHTuMmz>K zi!Xtl;;UfvBz^K=y!Zi_CH@}VA-01-u@kHmzXTh_u>SbSQrwgE2cyJ6V5&F|%n%oX z(U-Z$E(PPomEbbb50;9>V5JxYPm5(>_+<AC4}wwR(_p?>4>pO<gI(e)pfkn2+3R4u z_#T)hegLi%+rV706RZ@wz~kbi0r>5d>Yi*mctTtXI#b<Cvq7KuJsvyFz4SIPQrrW^ zh<AhW;$ARCtOS>d2SLAB4VH<If)!#7SS8kiHR8{}I`J5ILVO<V5MKhF>F!7N3K%WE z3C4;opigWAcZeYaakDh{W)WbbI1J1c$ACd`GT1Dpg012-uw9%Bo)Ph`6(@3rd)~{z zIB_|cDqam{iaB7eSO5mZO<;|<6>Jo@fhWXUz|-PwVE9b;-o6h;i<RIq@nO&}9s+lW zkAdZ4EqGA;IanwD5<D%w0!Ghr?_yCT9y6cI1E6oV%fFFxT{?sCl`1YAjAJw0OP7H0 z3te6f`owF%TyYhcFYW<@;$AR*k$bbJK%e+5cwGDy*e3oObQZhEz6^$oAAqsqp!0BV z;t((+(>?ZDUMl8-fy>=X_kqq5mtTQFanlg|4p`=18U*XFarqE0&35@27!>~sHeTyq z+J7icmgDk#Fjc$^42oGi;5zq!O}tdx0v;6u;Bm2z$F6dZZ3a(@C&8T6?xm-|V)0Wj zC=SD`XTDtbfSq7ad;)aVx|e<hHi#oGz@>io(nK&QrhyG&5g4849<Ys<inXA#&b{<C zUMjYLzV+^<F~e{`zRT5MP~1%xxR>4qc8mK#-v;;68n8-y9&8XZFT}|T-2<{g-zJv< zuvYBi0Y&bmsWD)&%SGfCmp6ea;=7=4t9$8LaG98h_dVjRZ~PzA$zZ*h26l)`!PIT; z0Xx82@gcBXJPSHExCc1HaWgR#4BO#e8U{v)y}&3j9E=hBf^lL5m?#baQ^ZIxO&koS zi&0>vI0VcRqrn_;80Z&cz(R327!YH@QgIYmCdPr~;%Kl!j0da4F<`Zr2-b>8V4au@ z){7ItMll6!5+{SrVk+1wP6OM;G_XUQ33iD-uv?r1hV678-*hlSoDW8c8DNaK2#gam z!9;Nhm?AC%)5PUqx|juKiYve@aV3}|W`lk)2P_m<fdMfWEEU&+WuhM}7uSImVm??U zZUC#rLa<gW0_((LuwE<y8^r+FByI<r#T{U)cq7;@mVzDPO<<Q81iQss!LS?M$F~fO z5N`*g#5=(l@h&h<EC&<Cy<m#C4@?v92h+t0FjL$QW{C&DV(}nYDjovM#A>iyd=#t@ zYrrb;Fjy_tg0<q4V4ZjbtQVgK8^t=XNqiP;7LS6h;xVvYtOq;9=fN(q0qhoE0K;~< z4__k~A-)VoiO0bh@ij0`YyuO-H^CI~1ehki1E!13V5ay!m?fSBbHo<VFSde(;wdm7 zwt=PMM_`%Q4wj1_gB9XwuuA+CtQI@KTJdwRPV5Bh#V^1{u?uVxzXF@ZGhnND7Hk*0 z!4C0juuBZbd%n9xzDM0x>OQ{lp!de~RIovp^6l!*ZoYEmxJTvlsNF8N@F;OBcwF2D zo)B*UPl`LiHgOktTHFnGicf<LH@WA14)os1{tD>5ll@)Lce8uINzi*!`yardE<FwI z6aNBwZ)#sU5`XRV^xoHe8zQoo7poI-k9cvDPdqzo5oHs+SdXZ%C_o&v*odgH*n~J@ zQG#f+*oJ7bC`FvKxD^qGmr>n2Eki_D+>VH{xDyd$aTg-aq8yQEu@{kIu@8}EaX%v6 zq5_d=@c<&rq7so~u^-{Ls6rH496$st4kAh|4k5}csuATDk0L58Y7kWxhY{5lwTN1a zClPfPM-cTEPa_&F>JUv9&mx*Fjv`tujv?AD>Jc3l&m+1l8W7zUFCfAudA~l5hzN_9 z5m6S$5iu68A>u5W5Q!FVB2p|)Akr+}L8MzWBQh=CM`T%?MC4esAp91sh(e1~h=4^K zqSWFeM483EBg!rQh&W>L1>&eh7oy2x^f>(PNbw$!ctn*&5~9u`AJJg(Afo#+?>3Ji zf|I@YDdM2TbG(hkuMlk(uOOT$-fiAO#9DlS@LBvGk!#^3;eITV5%sCw3HS{rfB$Zi zBt(tRyJiNW6H$Vv&-7dJAzb30<6Zp-g5Pk#C$4n$H@pGf!{Gk*O~!XtM5TN23q)`} zj*Y;vC3xA;;fsJe@SZsS@#%dp&DRLud0zA%jcf2synDVxgbz=^yD<k5c7Ye^hzN`M zh$xE;M2y8EM4Uw?BGF<ABE@1EBF$nsBHbbjk!i64k!7(Gkz<jK@LS{{3N2P40v5T5 zQj4{SG7CSV++rP~!Xh70Ww8NKZBdA*wJ1i^S=@v;VG%@hTil8W!|NFO(-sk7aXTW) z;!Z@2#a)Ovi*iJw#a={;#Xdxu#r=qMiwZ=h#RG^ei%LX}#eRg}q6$%H@iAhD#TST% z3%ySv_EMYxFUGi^PaLA$Vl<+{A|6p?F$Pg>k%*|ZNJ7+EOhnXMq#&9sCL@|HQW32d z(-7?zX^0MsnTRe6AEMi04kGL#`?^L%Sj<O6S!5t$EEXZ+EHV*^7E2H*7RwN67RwRo z7Fmc)ixr40i<O8Ri)@77A_q}uu?i8e$VHS|tVNVr_z~q6>kt(d`G_iu4Tx%sLPV`a z5u(nb7*TJr6VYg~3vt?FH=@%bi0HPs6%mFP?DXZ2h_JXF5oNIl5o2)=BH3aeBGux4 zM7qTTh)j!0M2^LNgx{hHQD|`h5wJLjD783*D6^<Wlv_NCsIaI(R9PHGR9hTD)LT4@ zXtp?tXtg+oXty}SYesmFPCVWbciJMrx5th2u6db(*Eih<u?69~*o!lWphY*L!y+jG zU;Y+Zhz7hW>Ym`&2nVl=>THO#OTG985ww`Xcje(VQ}?hXj07*T5k89>5J8I<5vMIq zAqvNOx9Q|z7Joq;x9B|<Um<uE*1eyBh&YR(h;)lf5kZUbh=Uf_A{s3CJ)=SUp3%<` z&Uo+CpCgV~oaJpSs;|ajc*WQK2qN*#o2mFN9ybOf(k;$MWLm@`N-ahq$}BEHlv|8J zR9TF`8|rr0_g^O8gbx(o-Q(U*0MUf+@^K@=;a}a}H@9AjNU@lXIA}2w(P^;+(QUB` z;S2Fj@Hd1L>c!U~p?Kq$7Z39dUwyrJ8xgelkkQY(CbkC-i|}GLqRwIwBD}wM%`Sw` z;s9?mz`Ldq5wtjgh#lx%b07?#Pox)z5y8P;bR%-l^CG?{&KBi`AJJejr8lmL_O4mM zxX6oqM9`ua-?<j+UDF2<YcUxSZ!s0oYB2-RX|V#)ZE*u4IMO@YBM4`d7hm$4i@o>? zal&Fq9~>6vT{8_4v^dIZMtj#ZAkJ8X@lAH|-Zi}uQ5I2%WQ%A-mc?X*-(otV&BBN1 zw%CmbCU~cQ7~zcZ;y7ch7yp5XvzXiu*Ccw^tYD1uVk;tOaX+uYn+M!4<%N86V6qoq zGA4Nu-yf0U#WX~N#YF>gO`08ssIs^M(O|KF?=bXvhZQ3#XM6DrM7PB!2;W@qnzM)o zi^~S#1nJ&2KEz3j1&GLb-ZcS)&*BCiX7LijneQF;1|n{O7r*6gEPjV5wiwJeLuPn~ zr6MvdW+Bd4+`+>Zd57&m#9Hh{#9JIdq**+UD7E+u(O_|wvDiCX*m*d0rWgGYQ5J&` zX%-2HOp6JK8jBRfaf@k)W{Y`<4vU3|n9IHUS%OHkxB}s`Sc%B7@FM~in-G;2+Yk*F zi}^OvW!|Z?5k7qTpZoQ;8nMITWgdp_33RVHj)=L^ix%F-;@R_Y7`{!=J?z(rHj7h; zTzv1Kd(CXVVHMv)=*B!m<TYMoBYYM|d04i0&1;Nny|{2F0&k^pPmqWRSWH7SSWM@; zVROC1K4o0*g>wPEt}SNqowE7fH5rJQ0x!xCK8yW`=ndXA2M_^^zapHC-Zg#rX4_&f zrXb=iW+U1xvJt*5-eLO?$1Q3Q871B|&mpQUdS8T72fS<gB4RD3AQCO6BTie)M08qY zAi6EG5x#BS+14R~76phZi+d3@7WeZu+r8WT0Fh~N7!kDi3*KcM+~pm%|6+X9P9ObZ zrC)*=?8W#LgwKlw^AVAKb=cGmh}eFL)eOA1#r@UZfCyTAj_{53uK6>f!D7lr+$Pbx zCY>?Pi)@6?Vh5t!VjrT*B3Oj`nd;qU-e#O2&5N56z8PK|M5N91;v+<GmKR_2#uElU zFTU)Hh>g&vz<=w3|LB7I`E*b0;WXgA6>e-y!!>xvgd4jN4O_g}!)r>s*pKj8Jc0;V zOv%P!`2%!<O^6PQ?TF?A@0!~XksG`?h$yr;f+(}-or|+M19i3w5V01c5QP?(Aj&Pq zA}TFj%Et*}y%T(Z@LlZ1;({K|opD}dBYc+(bV~TtZ3*7S=kVW5aQNNa4!-vBiyz`X zA_HRaH=q;ZB=mBhH$IAMT0>oK$NhN!Y7GDRj;5jRr5kXT-~}%EZTJlr>Ji72J{@?{ zC!t46uVpJ{XD&={37@-kN!GlTS&ROzrArdRTKcVCy*;mFYr*EC)vH^2Z@s>xpg6F# zrT>P_1w{o#>sJSM7Uykk8Fc+-e_k;z3aq}qaLv}Od0QWMO7MiW=4@bm{^m`2<4f}M z0(nK7OUBPHEGRBsK7Jj4DjBza4X)dsSG0Y6VZqw*#XAG}n~NqTrH<cP5Xc)>yyp6i zYu4v&9ba5fJZ{2N{Chc*#ue|x)k%5l*Ym>h`0$GSIB9{uXpK95{3{(v#XDQV(>87P zZ!653$zQ;&eeubMg@%p}JukFhXs^&`dR-kF^4*W`9)a&3f$tuH?;e5w4<CV`V?Pdt W-|X0r{7{qqyeqUvs2yoP@A;qmG_9rp diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__pycache__/intranges.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__pycache__/intranges.cpython-38.pyc deleted file mode 100644 index c35778f6d2ddf6d39ad656e5439076730e5c82df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1828 zcmZux%Wm8@6eTH*JQ>?<ilmL*8Yqzhg$39eKQ?XQJkSO%kcA64>1L2tmPO8tU=1ac zlpO~eWZ@R*XC%x1Nq?XlZM*U>bmQJj`5BY~N%8W&c<$rp`S~7!@z;6y>)!z(|KQ=~ zU~qT})2zWF$bbkcSWX92c*6gU44CMM0CrEzh%W5DxFdS7cLaMu!r9~wC8YObb|e)~ zc%B){iy_aHl_ROm3ZEoG@~TAQ^0+AFu*&n35LnG5$#br%$-dNhn-^-tb)`%X4r!r` zOe+g&Z|F*kNm*G5!djME8mVkzvqGV`9ZNne^rW}EY;2<K`U;mytcNSSJ#V=4M#!Tm z3M2k<jQ%Qf48~FPu#(29dU%`|{+eH??`6te7djhdD#_ggpF9MgxXmV#|FoPJqvfxh z-(eW_&HzKQlL91H1288uFn@q){(!}jnw-)p9g!&$bn01ZSxryjdq#fQpZc{g*aOni z4v2nU)7oDoxFUU#2(~~Dn0|h^1T+t6?al9OkxV-^d*@ld?g$TLI)Wnq19HmVQwn@j z?{LWi&nbo2`N<dH=<X$y{}VnASU{vCprcZWFzZB(r1`GLVO$^`uQ_PrwJWUS7W^2| zN4QtGsnRh3nb=!sIxUx}!V@jIe4V5=KLM`7NC?BVoC|84@vTQd-on_z0RqlV0ddHp zo>R8#+-p^-v=CC@6HKN?`E?>)WCY*Z;+q@1MqS{dDlGEas?4Q{oVK%b7-twvjY}9b zfhn|=qUkss8ZVcs36in|70rAMAc4uaz3VtlVKC@mQN)AURy4*_6SO!EdU*nO$2zmJ zq1j+Qt+a-$ZdLqA^c<M|x9X4KjeR|qR;ohxxAUwlcl$%!^y(;qJE*>+exB|3%M*Z3 zZARbp4d`4glk^~gfc49)TwVV*T8lPU%M-Yc<Y<J%ehi`llx9LDeTYTtSX7=g_pVOy zP!|*DIJOe=87!pRr9OOj;ai}L-lt16VEQAtNwK3`4*bXIvL9blLw|V;+5A0$3}icJ z9BA&DA!|A=$c+acIa0gKBS#mOFJT&|oVxR^GQ$9QFrA^h@Pme);L4toA+{=SM}G|T z9J$Wlp1<`j?9ztn56nR<g}jdCLy)*Md=LI_y%1~Lhv^Kzfgh}IK~LF~S^5qtyJqj% z)PqW;2fp61UR$*bP|2tC6`T4{vwjUKJaRzwcHM!R-%&m#$`{@XQe!nkZvg61D|;mu zpd569Bjgi4JhAiU(KARAJ;@ZL`;hNJ2;)6IgidR)j~2Xui;HgAMjBh$Ui-Tjxir@Z z(97+x<3MhL{R~>MZD!j&&gIZ*L_uR`3ugvC8qt^;gTUo{+<0YS8Xq~KQnJz5HZ=Ya z;!m#A3%b2cGW9j6Xp@We=$zMuq*|apn}Za?WYeFcy`Y(iV^O4Wtnb6wWt?-g^$B@y gSi+3cm_SW;Yf^|Rmya<~40`L&bXoV)uGjVd1Enk0-v9sr diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__pycache__/package_data.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__pycache__/package_data.cpython-38.pyc deleted file mode 100644 index 07e77204ec5db7aafcdc9a536a37eae88069fd1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmWIL<>g`kf)oEW<3xe<V-N=!FakLaKwQiLBvKfn7*ZI688n%yn2q!-{4^PFamUA( zr4|)u=I6!7uVg4<0;&QNzbf=I@^e%5i!xG6QuFeQ^xbkY3krht(?C>_Zh9h6t}HdL zOg|?xNxz`7BqKl1SkFSgII|>Gw;(Y&J25@ASic~%K-bVx&p^*ux1bUzt(Tgf4ieM{ p+L@OEG&D0MFHs+=JU%6{BvG%R@)n0pZhlH>PO2Tq?Vo{|0RXB_Kdk@& diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/codec.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/codec.py deleted file mode 100644 index 98c65ea..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/codec.py +++ /dev/null @@ -1,118 +0,0 @@ -from .core import encode, decode, alabel, ulabel, IDNAError -import codecs -import re - -_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') - -class Codec(codecs.Codec): - - def encode(self, data, errors='strict'): - - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return "", 0 - - return encode(data), len(data) - - def decode(self, data, errors='strict'): - - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return u"", 0 - - return decode(data), len(data) - -class IncrementalEncoder(codecs.BufferedIncrementalEncoder): - def _buffer_encode(self, data, errors, final): - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return ("", 0) - - labels = _unicode_dots_re.split(data) - trailing_dot = u'' - if labels: - if not labels[-1]: - trailing_dot = '.' - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = '.' - - result = [] - size = 0 - for label in labels: - result.append(alabel(label)) - if size: - size += 1 - size += len(label) - - # Join with U+002E - result = ".".join(result) + trailing_dot - size += len(trailing_dot) - return (result, size) - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - def _buffer_decode(self, data, errors, final): - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return (u"", 0) - - # IDNA allows decoding to operate on Unicode strings, too. - if isinstance(data, unicode): - labels = _unicode_dots_re.split(data) - else: - # Must be ASCII string - data = str(data) - unicode(data, "ascii") - labels = data.split(".") - - trailing_dot = u'' - if labels: - if not labels[-1]: - trailing_dot = u'.' - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = u'.' - - result = [] - size = 0 - for label in labels: - result.append(ulabel(label)) - if size: - size += 1 - size += len(label) - - result = u".".join(result) + trailing_dot - size += len(trailing_dot) - return (result, size) - - -class StreamWriter(Codec, codecs.StreamWriter): - pass - -class StreamReader(Codec, codecs.StreamReader): - pass - -def getregentry(): - return codecs.CodecInfo( - name='idna', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamwriter=StreamWriter, - streamreader=StreamReader, - ) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/compat.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/compat.py deleted file mode 100644 index 4d47f33..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/compat.py +++ /dev/null @@ -1,12 +0,0 @@ -from .core import * -from .codec import * - -def ToASCII(label): - return encode(label) - -def ToUnicode(label): - return decode(label) - -def nameprep(s): - raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") - diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/core.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/core.py deleted file mode 100644 index 104624a..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/core.py +++ /dev/null @@ -1,396 +0,0 @@ -from . import idnadata -import bisect -import unicodedata -import re -import sys -from .intranges import intranges_contain - -_virama_combining_class = 9 -_alabel_prefix = b'xn--' -_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') - -if sys.version_info[0] == 3: - unicode = str - unichr = chr - -class IDNAError(UnicodeError): - """ Base exception for all IDNA-encoding related problems """ - pass - - -class IDNABidiError(IDNAError): - """ Exception when bidirectional requirements are not satisfied """ - pass - - -class InvalidCodepoint(IDNAError): - """ Exception when a disallowed or unallocated codepoint is used """ - pass - - -class InvalidCodepointContext(IDNAError): - """ Exception when the codepoint is not valid in the context it is used """ - pass - - -def _combining_class(cp): - v = unicodedata.combining(unichr(cp)) - if v == 0: - if not unicodedata.name(unichr(cp)): - raise ValueError("Unknown character in unicodedata") - return v - -def _is_script(cp, script): - return intranges_contain(ord(cp), idnadata.scripts[script]) - -def _punycode(s): - return s.encode('punycode') - -def _unot(s): - return 'U+{0:04X}'.format(s) - - -def valid_label_length(label): - - if len(label) > 63: - return False - return True - - -def valid_string_length(label, trailing_dot): - - if len(label) > (254 if trailing_dot else 253): - return False - return True - - -def check_bidi(label, check_ltr=False): - - # Bidi rules should only be applied if string contains RTL characters - bidi_label = False - for (idx, cp) in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - if direction == '': - # String likely comes from a newer version of Unicode - raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx)) - if direction in ['R', 'AL', 'AN']: - bidi_label = True - if not bidi_label and not check_ltr: - return True - - # Bidi rule 1 - direction = unicodedata.bidirectional(label[0]) - if direction in ['R', 'AL']: - rtl = True - elif direction == 'L': - rtl = False - else: - raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label))) - - valid_ending = False - number_type = False - for (idx, cp) in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - - if rtl: - # Bidi rule 2 - if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: - raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx)) - # Bidi rule 3 - if direction in ['R', 'AL', 'EN', 'AN']: - valid_ending = True - elif direction != 'NSM': - valid_ending = False - # Bidi rule 4 - if direction in ['AN', 'EN']: - if not number_type: - number_type = direction - else: - if number_type != direction: - raise IDNABidiError('Can not mix numeral types in a right-to-left label') - else: - # Bidi rule 5 - if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: - raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx)) - # Bidi rule 6 - if direction in ['L', 'EN']: - valid_ending = True - elif direction != 'NSM': - valid_ending = False - - if not valid_ending: - raise IDNABidiError('Label ends with illegal codepoint directionality') - - return True - - -def check_initial_combiner(label): - - if unicodedata.category(label[0])[0] == 'M': - raise IDNAError('Label begins with an illegal combining character') - return True - - -def check_hyphen_ok(label): - - if label[2:4] == '--': - raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') - if label[0] == '-' or label[-1] == '-': - raise IDNAError('Label must not start or end with a hyphen') - return True - - -def check_nfc(label): - - if unicodedata.normalize('NFC', label) != label: - raise IDNAError('Label must be in Normalization Form C') - - -def valid_contextj(label, pos): - - cp_value = ord(label[pos]) - - if cp_value == 0x200c: - - if pos > 0: - if _combining_class(ord(label[pos - 1])) == _virama_combining_class: - return True - - ok = False - for i in range(pos-1, -1, -1): - joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == ord('T'): - continue - if joining_type in [ord('L'), ord('D')]: - ok = True - break - - if not ok: - return False - - ok = False - for i in range(pos+1, len(label)): - joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == ord('T'): - continue - if joining_type in [ord('R'), ord('D')]: - ok = True - break - return ok - - if cp_value == 0x200d: - - if pos > 0: - if _combining_class(ord(label[pos - 1])) == _virama_combining_class: - return True - return False - - else: - - return False - - -def valid_contexto(label, pos, exception=False): - - cp_value = ord(label[pos]) - - if cp_value == 0x00b7: - if 0 < pos < len(label)-1: - if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: - return True - return False - - elif cp_value == 0x0375: - if pos < len(label)-1 and len(label) > 1: - return _is_script(label[pos + 1], 'Greek') - return False - - elif cp_value == 0x05f3 or cp_value == 0x05f4: - if pos > 0: - return _is_script(label[pos - 1], 'Hebrew') - return False - - elif cp_value == 0x30fb: - for cp in label: - if cp == u'\u30fb': - continue - if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): - return True - return False - - elif 0x660 <= cp_value <= 0x669: - for cp in label: - if 0x6f0 <= ord(cp) <= 0x06f9: - return False - return True - - elif 0x6f0 <= cp_value <= 0x6f9: - for cp in label: - if 0x660 <= ord(cp) <= 0x0669: - return False - return True - - -def check_label(label): - - if isinstance(label, (bytes, bytearray)): - label = label.decode('utf-8') - if len(label) == 0: - raise IDNAError('Empty Label') - - check_nfc(label) - check_hyphen_ok(label) - check_initial_combiner(label) - - for (pos, cp) in enumerate(label): - cp_value = ord(cp) - 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 {0} not allowed at position {1} in {2}'.format( - _unot(cp_value), pos+1, repr(label))) - except ValueError: - raise IDNAError('Unknown codepoint adjacent to joiner {0} at position {1} in {2}'.format( - _unot(cp_value), pos+1, repr(label))) - elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): - if not valid_contexto(label, pos): - raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) - else: - raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label))) - - check_bidi(label) - - -def alabel(label): - - try: - label = label.encode('ascii') - ulabel(label) - if not valid_label_length(label): - raise IDNAError('Label too long') - return label - except UnicodeEncodeError: - pass - - if not label: - raise IDNAError('No Input') - - label = unicode(label) - check_label(label) - label = _punycode(label) - label = _alabel_prefix + label - - if not valid_label_length(label): - raise IDNAError('Label too long') - - return label - - -def ulabel(label): - - if not isinstance(label, (bytes, bytearray)): - try: - label = label.encode('ascii') - except UnicodeEncodeError: - check_label(label) - return label - - label = label.lower() - if label.startswith(_alabel_prefix): - label = label[len(_alabel_prefix):] - else: - check_label(label) - return label.decode('ascii') - - label = label.decode('punycode') - check_label(label) - return label - - -def uts46_remap(domain, std3_rules=True, transitional=False): - """Re-map the characters in the string according to UTS46 processing.""" - from .uts46data import uts46data - output = u"" - try: - for pos, char in enumerate(domain): - code_point = ord(char) - uts46row = uts46data[code_point if code_point < 256 else - bisect.bisect_left(uts46data, (code_point, "Z")) - 1] - status = uts46row[1] - replacement = uts46row[2] if len(uts46row) == 3 else None - if (status == "V" or - (status == "D" and not transitional) or - (status == "3" and not std3_rules and replacement is None)): - output += char - elif replacement is not None and (status == "M" or - (status == "3" and not std3_rules) or - (status == "D" and transitional)): - output += replacement - elif status != "I": - raise IndexError() - return unicodedata.normalize("NFC", output) - except IndexError: - raise InvalidCodepoint( - "Codepoint {0} not allowed at position {1} in {2}".format( - _unot(code_point), pos + 1, repr(domain))) - - -def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): - - if isinstance(s, (bytes, bytearray)): - s = s.decode("ascii") - if uts46: - s = uts46_remap(s, std3_rules, transitional) - trailing_dot = False - result = [] - if strict: - labels = s.split('.') - else: - labels = _unicode_dots_re.split(s) - if not labels or labels == ['']: - raise IDNAError('Empty domain') - if labels[-1] == '': - del labels[-1] - trailing_dot = True - for label in labels: - s = alabel(label) - if s: - result.append(s) - else: - raise IDNAError('Empty label') - if trailing_dot: - result.append(b'') - s = b'.'.join(result) - if not valid_string_length(s, trailing_dot): - raise IDNAError('Domain too long') - return s - - -def decode(s, strict=False, uts46=False, std3_rules=False): - - if isinstance(s, (bytes, bytearray)): - s = s.decode("ascii") - if uts46: - s = uts46_remap(s, std3_rules, False) - trailing_dot = False - result = [] - if not strict: - labels = _unicode_dots_re.split(s) - else: - labels = s.split(u'.') - if not labels or labels == ['']: - raise IDNAError('Empty domain') - if not labels[-1]: - del labels[-1] - trailing_dot = True - for label in labels: - s = ulabel(label) - if s: - result.append(s) - else: - raise IDNAError('Empty label') - if trailing_dot: - result.append(u'') - return u'.'.join(result) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/idnadata.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/idnadata.py deleted file mode 100644 index a80c959..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/idnadata.py +++ /dev/null @@ -1,1979 +0,0 @@ -# This file is automatically generated by tools/idna-data - -__version__ = "11.0.0" -scripts = { - 'Greek': ( - 0x37000000374, - 0x37500000378, - 0x37a0000037e, - 0x37f00000380, - 0x38400000385, - 0x38600000387, - 0x3880000038b, - 0x38c0000038d, - 0x38e000003a2, - 0x3a3000003e2, - 0x3f000000400, - 0x1d2600001d2b, - 0x1d5d00001d62, - 0x1d6600001d6b, - 0x1dbf00001dc0, - 0x1f0000001f16, - 0x1f1800001f1e, - 0x1f2000001f46, - 0x1f4800001f4e, - 0x1f5000001f58, - 0x1f5900001f5a, - 0x1f5b00001f5c, - 0x1f5d00001f5e, - 0x1f5f00001f7e, - 0x1f8000001fb5, - 0x1fb600001fc5, - 0x1fc600001fd4, - 0x1fd600001fdc, - 0x1fdd00001ff0, - 0x1ff200001ff5, - 0x1ff600001fff, - 0x212600002127, - 0xab650000ab66, - 0x101400001018f, - 0x101a0000101a1, - 0x1d2000001d246, - ), - 'Han': ( - 0x2e8000002e9a, - 0x2e9b00002ef4, - 0x2f0000002fd6, - 0x300500003006, - 0x300700003008, - 0x30210000302a, - 0x30380000303c, - 0x340000004db6, - 0x4e0000009ff0, - 0xf9000000fa6e, - 0xfa700000fada, - 0x200000002a6d7, - 0x2a7000002b735, - 0x2b7400002b81e, - 0x2b8200002cea2, - 0x2ceb00002ebe1, - 0x2f8000002fa1e, - ), - 'Hebrew': ( - 0x591000005c8, - 0x5d0000005eb, - 0x5ef000005f5, - 0xfb1d0000fb37, - 0xfb380000fb3d, - 0xfb3e0000fb3f, - 0xfb400000fb42, - 0xfb430000fb45, - 0xfb460000fb50, - ), - 'Hiragana': ( - 0x304100003097, - 0x309d000030a0, - 0x1b0010001b11f, - 0x1f2000001f201, - ), - 'Katakana': ( - 0x30a1000030fb, - 0x30fd00003100, - 0x31f000003200, - 0x32d0000032ff, - 0x330000003358, - 0xff660000ff70, - 0xff710000ff9e, - 0x1b0000001b001, - ), -} -joining_types = { - 0x600: 85, - 0x601: 85, - 0x602: 85, - 0x603: 85, - 0x604: 85, - 0x605: 85, - 0x608: 85, - 0x60b: 85, - 0x620: 68, - 0x621: 85, - 0x622: 82, - 0x623: 82, - 0x624: 82, - 0x625: 82, - 0x626: 68, - 0x627: 82, - 0x628: 68, - 0x629: 82, - 0x62a: 68, - 0x62b: 68, - 0x62c: 68, - 0x62d: 68, - 0x62e: 68, - 0x62f: 82, - 0x630: 82, - 0x631: 82, - 0x632: 82, - 0x633: 68, - 0x634: 68, - 0x635: 68, - 0x636: 68, - 0x637: 68, - 0x638: 68, - 0x639: 68, - 0x63a: 68, - 0x63b: 68, - 0x63c: 68, - 0x63d: 68, - 0x63e: 68, - 0x63f: 68, - 0x640: 67, - 0x641: 68, - 0x642: 68, - 0x643: 68, - 0x644: 68, - 0x645: 68, - 0x646: 68, - 0x647: 68, - 0x648: 82, - 0x649: 68, - 0x64a: 68, - 0x66e: 68, - 0x66f: 68, - 0x671: 82, - 0x672: 82, - 0x673: 82, - 0x674: 85, - 0x675: 82, - 0x676: 82, - 0x677: 82, - 0x678: 68, - 0x679: 68, - 0x67a: 68, - 0x67b: 68, - 0x67c: 68, - 0x67d: 68, - 0x67e: 68, - 0x67f: 68, - 0x680: 68, - 0x681: 68, - 0x682: 68, - 0x683: 68, - 0x684: 68, - 0x685: 68, - 0x686: 68, - 0x687: 68, - 0x688: 82, - 0x689: 82, - 0x68a: 82, - 0x68b: 82, - 0x68c: 82, - 0x68d: 82, - 0x68e: 82, - 0x68f: 82, - 0x690: 82, - 0x691: 82, - 0x692: 82, - 0x693: 82, - 0x694: 82, - 0x695: 82, - 0x696: 82, - 0x697: 82, - 0x698: 82, - 0x699: 82, - 0x69a: 68, - 0x69b: 68, - 0x69c: 68, - 0x69d: 68, - 0x69e: 68, - 0x69f: 68, - 0x6a0: 68, - 0x6a1: 68, - 0x6a2: 68, - 0x6a3: 68, - 0x6a4: 68, - 0x6a5: 68, - 0x6a6: 68, - 0x6a7: 68, - 0x6a8: 68, - 0x6a9: 68, - 0x6aa: 68, - 0x6ab: 68, - 0x6ac: 68, - 0x6ad: 68, - 0x6ae: 68, - 0x6af: 68, - 0x6b0: 68, - 0x6b1: 68, - 0x6b2: 68, - 0x6b3: 68, - 0x6b4: 68, - 0x6b5: 68, - 0x6b6: 68, - 0x6b7: 68, - 0x6b8: 68, - 0x6b9: 68, - 0x6ba: 68, - 0x6bb: 68, - 0x6bc: 68, - 0x6bd: 68, - 0x6be: 68, - 0x6bf: 68, - 0x6c0: 82, - 0x6c1: 68, - 0x6c2: 68, - 0x6c3: 82, - 0x6c4: 82, - 0x6c5: 82, - 0x6c6: 82, - 0x6c7: 82, - 0x6c8: 82, - 0x6c9: 82, - 0x6ca: 82, - 0x6cb: 82, - 0x6cc: 68, - 0x6cd: 82, - 0x6ce: 68, - 0x6cf: 82, - 0x6d0: 68, - 0x6d1: 68, - 0x6d2: 82, - 0x6d3: 82, - 0x6d5: 82, - 0x6dd: 85, - 0x6ee: 82, - 0x6ef: 82, - 0x6fa: 68, - 0x6fb: 68, - 0x6fc: 68, - 0x6ff: 68, - 0x70f: 84, - 0x710: 82, - 0x712: 68, - 0x713: 68, - 0x714: 68, - 0x715: 82, - 0x716: 82, - 0x717: 82, - 0x718: 82, - 0x719: 82, - 0x71a: 68, - 0x71b: 68, - 0x71c: 68, - 0x71d: 68, - 0x71e: 82, - 0x71f: 68, - 0x720: 68, - 0x721: 68, - 0x722: 68, - 0x723: 68, - 0x724: 68, - 0x725: 68, - 0x726: 68, - 0x727: 68, - 0x728: 82, - 0x729: 68, - 0x72a: 82, - 0x72b: 68, - 0x72c: 82, - 0x72d: 68, - 0x72e: 68, - 0x72f: 82, - 0x74d: 82, - 0x74e: 68, - 0x74f: 68, - 0x750: 68, - 0x751: 68, - 0x752: 68, - 0x753: 68, - 0x754: 68, - 0x755: 68, - 0x756: 68, - 0x757: 68, - 0x758: 68, - 0x759: 82, - 0x75a: 82, - 0x75b: 82, - 0x75c: 68, - 0x75d: 68, - 0x75e: 68, - 0x75f: 68, - 0x760: 68, - 0x761: 68, - 0x762: 68, - 0x763: 68, - 0x764: 68, - 0x765: 68, - 0x766: 68, - 0x767: 68, - 0x768: 68, - 0x769: 68, - 0x76a: 68, - 0x76b: 82, - 0x76c: 82, - 0x76d: 68, - 0x76e: 68, - 0x76f: 68, - 0x770: 68, - 0x771: 82, - 0x772: 68, - 0x773: 82, - 0x774: 82, - 0x775: 68, - 0x776: 68, - 0x777: 68, - 0x778: 82, - 0x779: 82, - 0x77a: 68, - 0x77b: 68, - 0x77c: 68, - 0x77d: 68, - 0x77e: 68, - 0x77f: 68, - 0x7ca: 68, - 0x7cb: 68, - 0x7cc: 68, - 0x7cd: 68, - 0x7ce: 68, - 0x7cf: 68, - 0x7d0: 68, - 0x7d1: 68, - 0x7d2: 68, - 0x7d3: 68, - 0x7d4: 68, - 0x7d5: 68, - 0x7d6: 68, - 0x7d7: 68, - 0x7d8: 68, - 0x7d9: 68, - 0x7da: 68, - 0x7db: 68, - 0x7dc: 68, - 0x7dd: 68, - 0x7de: 68, - 0x7df: 68, - 0x7e0: 68, - 0x7e1: 68, - 0x7e2: 68, - 0x7e3: 68, - 0x7e4: 68, - 0x7e5: 68, - 0x7e6: 68, - 0x7e7: 68, - 0x7e8: 68, - 0x7e9: 68, - 0x7ea: 68, - 0x7fa: 67, - 0x840: 82, - 0x841: 68, - 0x842: 68, - 0x843: 68, - 0x844: 68, - 0x845: 68, - 0x846: 82, - 0x847: 82, - 0x848: 68, - 0x849: 82, - 0x84a: 68, - 0x84b: 68, - 0x84c: 68, - 0x84d: 68, - 0x84e: 68, - 0x84f: 68, - 0x850: 68, - 0x851: 68, - 0x852: 68, - 0x853: 68, - 0x854: 82, - 0x855: 68, - 0x856: 85, - 0x857: 85, - 0x858: 85, - 0x860: 68, - 0x861: 85, - 0x862: 68, - 0x863: 68, - 0x864: 68, - 0x865: 68, - 0x866: 85, - 0x867: 82, - 0x868: 68, - 0x869: 82, - 0x86a: 82, - 0x8a0: 68, - 0x8a1: 68, - 0x8a2: 68, - 0x8a3: 68, - 0x8a4: 68, - 0x8a5: 68, - 0x8a6: 68, - 0x8a7: 68, - 0x8a8: 68, - 0x8a9: 68, - 0x8aa: 82, - 0x8ab: 82, - 0x8ac: 82, - 0x8ad: 85, - 0x8ae: 82, - 0x8af: 68, - 0x8b0: 68, - 0x8b1: 82, - 0x8b2: 82, - 0x8b3: 68, - 0x8b4: 68, - 0x8b6: 68, - 0x8b7: 68, - 0x8b8: 68, - 0x8b9: 82, - 0x8ba: 68, - 0x8bb: 68, - 0x8bc: 68, - 0x8bd: 68, - 0x8e2: 85, - 0x1806: 85, - 0x1807: 68, - 0x180a: 67, - 0x180e: 85, - 0x1820: 68, - 0x1821: 68, - 0x1822: 68, - 0x1823: 68, - 0x1824: 68, - 0x1825: 68, - 0x1826: 68, - 0x1827: 68, - 0x1828: 68, - 0x1829: 68, - 0x182a: 68, - 0x182b: 68, - 0x182c: 68, - 0x182d: 68, - 0x182e: 68, - 0x182f: 68, - 0x1830: 68, - 0x1831: 68, - 0x1832: 68, - 0x1833: 68, - 0x1834: 68, - 0x1835: 68, - 0x1836: 68, - 0x1837: 68, - 0x1838: 68, - 0x1839: 68, - 0x183a: 68, - 0x183b: 68, - 0x183c: 68, - 0x183d: 68, - 0x183e: 68, - 0x183f: 68, - 0x1840: 68, - 0x1841: 68, - 0x1842: 68, - 0x1843: 68, - 0x1844: 68, - 0x1845: 68, - 0x1846: 68, - 0x1847: 68, - 0x1848: 68, - 0x1849: 68, - 0x184a: 68, - 0x184b: 68, - 0x184c: 68, - 0x184d: 68, - 0x184e: 68, - 0x184f: 68, - 0x1850: 68, - 0x1851: 68, - 0x1852: 68, - 0x1853: 68, - 0x1854: 68, - 0x1855: 68, - 0x1856: 68, - 0x1857: 68, - 0x1858: 68, - 0x1859: 68, - 0x185a: 68, - 0x185b: 68, - 0x185c: 68, - 0x185d: 68, - 0x185e: 68, - 0x185f: 68, - 0x1860: 68, - 0x1861: 68, - 0x1862: 68, - 0x1863: 68, - 0x1864: 68, - 0x1865: 68, - 0x1866: 68, - 0x1867: 68, - 0x1868: 68, - 0x1869: 68, - 0x186a: 68, - 0x186b: 68, - 0x186c: 68, - 0x186d: 68, - 0x186e: 68, - 0x186f: 68, - 0x1870: 68, - 0x1871: 68, - 0x1872: 68, - 0x1873: 68, - 0x1874: 68, - 0x1875: 68, - 0x1876: 68, - 0x1877: 68, - 0x1878: 68, - 0x1880: 85, - 0x1881: 85, - 0x1882: 85, - 0x1883: 85, - 0x1884: 85, - 0x1885: 84, - 0x1886: 84, - 0x1887: 68, - 0x1888: 68, - 0x1889: 68, - 0x188a: 68, - 0x188b: 68, - 0x188c: 68, - 0x188d: 68, - 0x188e: 68, - 0x188f: 68, - 0x1890: 68, - 0x1891: 68, - 0x1892: 68, - 0x1893: 68, - 0x1894: 68, - 0x1895: 68, - 0x1896: 68, - 0x1897: 68, - 0x1898: 68, - 0x1899: 68, - 0x189a: 68, - 0x189b: 68, - 0x189c: 68, - 0x189d: 68, - 0x189e: 68, - 0x189f: 68, - 0x18a0: 68, - 0x18a1: 68, - 0x18a2: 68, - 0x18a3: 68, - 0x18a4: 68, - 0x18a5: 68, - 0x18a6: 68, - 0x18a7: 68, - 0x18a8: 68, - 0x18aa: 68, - 0x200c: 85, - 0x200d: 67, - 0x202f: 85, - 0x2066: 85, - 0x2067: 85, - 0x2068: 85, - 0x2069: 85, - 0xa840: 68, - 0xa841: 68, - 0xa842: 68, - 0xa843: 68, - 0xa844: 68, - 0xa845: 68, - 0xa846: 68, - 0xa847: 68, - 0xa848: 68, - 0xa849: 68, - 0xa84a: 68, - 0xa84b: 68, - 0xa84c: 68, - 0xa84d: 68, - 0xa84e: 68, - 0xa84f: 68, - 0xa850: 68, - 0xa851: 68, - 0xa852: 68, - 0xa853: 68, - 0xa854: 68, - 0xa855: 68, - 0xa856: 68, - 0xa857: 68, - 0xa858: 68, - 0xa859: 68, - 0xa85a: 68, - 0xa85b: 68, - 0xa85c: 68, - 0xa85d: 68, - 0xa85e: 68, - 0xa85f: 68, - 0xa860: 68, - 0xa861: 68, - 0xa862: 68, - 0xa863: 68, - 0xa864: 68, - 0xa865: 68, - 0xa866: 68, - 0xa867: 68, - 0xa868: 68, - 0xa869: 68, - 0xa86a: 68, - 0xa86b: 68, - 0xa86c: 68, - 0xa86d: 68, - 0xa86e: 68, - 0xa86f: 68, - 0xa870: 68, - 0xa871: 68, - 0xa872: 76, - 0xa873: 85, - 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, - 0x10ad0: 82, - 0x10ad1: 82, - 0x10ad2: 82, - 0x10ad3: 68, - 0x10ad4: 68, - 0x10ad5: 68, - 0x10ad6: 68, - 0x10ad7: 76, - 0x10ad8: 68, - 0x10ad9: 68, - 0x10ada: 68, - 0x10adb: 68, - 0x10adc: 68, - 0x10add: 82, - 0x10ade: 68, - 0x10adf: 68, - 0x10ae0: 68, - 0x10ae1: 82, - 0x10ae2: 85, - 0x10ae3: 85, - 0x10ae4: 82, - 0x10aeb: 68, - 0x10aec: 68, - 0x10aed: 68, - 0x10aee: 68, - 0x10aef: 82, - 0x10b80: 68, - 0x10b81: 82, - 0x10b82: 68, - 0x10b83: 82, - 0x10b84: 82, - 0x10b85: 82, - 0x10b86: 68, - 0x10b87: 68, - 0x10b88: 68, - 0x10b89: 82, - 0x10b8a: 68, - 0x10b8b: 68, - 0x10b8c: 82, - 0x10b8d: 68, - 0x10b8e: 82, - 0x10b8f: 82, - 0x10b90: 68, - 0x10b91: 82, - 0x10ba9: 82, - 0x10baa: 82, - 0x10bab: 82, - 0x10bac: 82, - 0x10bad: 68, - 0x10bae: 68, - 0x10baf: 85, - 0x10d00: 76, - 0x10d01: 68, - 0x10d02: 68, - 0x10d03: 68, - 0x10d04: 68, - 0x10d05: 68, - 0x10d06: 68, - 0x10d07: 68, - 0x10d08: 68, - 0x10d09: 68, - 0x10d0a: 68, - 0x10d0b: 68, - 0x10d0c: 68, - 0x10d0d: 68, - 0x10d0e: 68, - 0x10d0f: 68, - 0x10d10: 68, - 0x10d11: 68, - 0x10d12: 68, - 0x10d13: 68, - 0x10d14: 68, - 0x10d15: 68, - 0x10d16: 68, - 0x10d17: 68, - 0x10d18: 68, - 0x10d19: 68, - 0x10d1a: 68, - 0x10d1b: 68, - 0x10d1c: 68, - 0x10d1d: 68, - 0x10d1e: 68, - 0x10d1f: 68, - 0x10d20: 68, - 0x10d21: 68, - 0x10d22: 82, - 0x10d23: 68, - 0x10f30: 68, - 0x10f31: 68, - 0x10f32: 68, - 0x10f33: 82, - 0x10f34: 68, - 0x10f35: 68, - 0x10f36: 68, - 0x10f37: 68, - 0x10f38: 68, - 0x10f39: 68, - 0x10f3a: 68, - 0x10f3b: 68, - 0x10f3c: 68, - 0x10f3d: 68, - 0x10f3e: 68, - 0x10f3f: 68, - 0x10f40: 68, - 0x10f41: 68, - 0x10f42: 68, - 0x10f43: 68, - 0x10f44: 68, - 0x10f45: 85, - 0x10f51: 68, - 0x10f52: 68, - 0x10f53: 68, - 0x10f54: 82, - 0x110bd: 85, - 0x110cd: 85, - 0x1e900: 68, - 0x1e901: 68, - 0x1e902: 68, - 0x1e903: 68, - 0x1e904: 68, - 0x1e905: 68, - 0x1e906: 68, - 0x1e907: 68, - 0x1e908: 68, - 0x1e909: 68, - 0x1e90a: 68, - 0x1e90b: 68, - 0x1e90c: 68, - 0x1e90d: 68, - 0x1e90e: 68, - 0x1e90f: 68, - 0x1e910: 68, - 0x1e911: 68, - 0x1e912: 68, - 0x1e913: 68, - 0x1e914: 68, - 0x1e915: 68, - 0x1e916: 68, - 0x1e917: 68, - 0x1e918: 68, - 0x1e919: 68, - 0x1e91a: 68, - 0x1e91b: 68, - 0x1e91c: 68, - 0x1e91d: 68, - 0x1e91e: 68, - 0x1e91f: 68, - 0x1e920: 68, - 0x1e921: 68, - 0x1e922: 68, - 0x1e923: 68, - 0x1e924: 68, - 0x1e925: 68, - 0x1e926: 68, - 0x1e927: 68, - 0x1e928: 68, - 0x1e929: 68, - 0x1e92a: 68, - 0x1e92b: 68, - 0x1e92c: 68, - 0x1e92d: 68, - 0x1e92e: 68, - 0x1e92f: 68, - 0x1e930: 68, - 0x1e931: 68, - 0x1e932: 68, - 0x1e933: 68, - 0x1e934: 68, - 0x1e935: 68, - 0x1e936: 68, - 0x1e937: 68, - 0x1e938: 68, - 0x1e939: 68, - 0x1e93a: 68, - 0x1e93b: 68, - 0x1e93c: 68, - 0x1e93d: 68, - 0x1e93e: 68, - 0x1e93f: 68, - 0x1e940: 68, - 0x1e941: 68, - 0x1e942: 68, - 0x1e943: 68, -} -codepoint_classes = { - 'PVALID': ( - 0x2d0000002e, - 0x300000003a, - 0x610000007b, - 0xdf000000f7, - 0xf800000100, - 0x10100000102, - 0x10300000104, - 0x10500000106, - 0x10700000108, - 0x1090000010a, - 0x10b0000010c, - 0x10d0000010e, - 0x10f00000110, - 0x11100000112, - 0x11300000114, - 0x11500000116, - 0x11700000118, - 0x1190000011a, - 0x11b0000011c, - 0x11d0000011e, - 0x11f00000120, - 0x12100000122, - 0x12300000124, - 0x12500000126, - 0x12700000128, - 0x1290000012a, - 0x12b0000012c, - 0x12d0000012e, - 0x12f00000130, - 0x13100000132, - 0x13500000136, - 0x13700000139, - 0x13a0000013b, - 0x13c0000013d, - 0x13e0000013f, - 0x14200000143, - 0x14400000145, - 0x14600000147, - 0x14800000149, - 0x14b0000014c, - 0x14d0000014e, - 0x14f00000150, - 0x15100000152, - 0x15300000154, - 0x15500000156, - 0x15700000158, - 0x1590000015a, - 0x15b0000015c, - 0x15d0000015e, - 0x15f00000160, - 0x16100000162, - 0x16300000164, - 0x16500000166, - 0x16700000168, - 0x1690000016a, - 0x16b0000016c, - 0x16d0000016e, - 0x16f00000170, - 0x17100000172, - 0x17300000174, - 0x17500000176, - 0x17700000178, - 0x17a0000017b, - 0x17c0000017d, - 0x17e0000017f, - 0x18000000181, - 0x18300000184, - 0x18500000186, - 0x18800000189, - 0x18c0000018e, - 0x19200000193, - 0x19500000196, - 0x1990000019c, - 0x19e0000019f, - 0x1a1000001a2, - 0x1a3000001a4, - 0x1a5000001a6, - 0x1a8000001a9, - 0x1aa000001ac, - 0x1ad000001ae, - 0x1b0000001b1, - 0x1b4000001b5, - 0x1b6000001b7, - 0x1b9000001bc, - 0x1bd000001c4, - 0x1ce000001cf, - 0x1d0000001d1, - 0x1d2000001d3, - 0x1d4000001d5, - 0x1d6000001d7, - 0x1d8000001d9, - 0x1da000001db, - 0x1dc000001de, - 0x1df000001e0, - 0x1e1000001e2, - 0x1e3000001e4, - 0x1e5000001e6, - 0x1e7000001e8, - 0x1e9000001ea, - 0x1eb000001ec, - 0x1ed000001ee, - 0x1ef000001f1, - 0x1f5000001f6, - 0x1f9000001fa, - 0x1fb000001fc, - 0x1fd000001fe, - 0x1ff00000200, - 0x20100000202, - 0x20300000204, - 0x20500000206, - 0x20700000208, - 0x2090000020a, - 0x20b0000020c, - 0x20d0000020e, - 0x20f00000210, - 0x21100000212, - 0x21300000214, - 0x21500000216, - 0x21700000218, - 0x2190000021a, - 0x21b0000021c, - 0x21d0000021e, - 0x21f00000220, - 0x22100000222, - 0x22300000224, - 0x22500000226, - 0x22700000228, - 0x2290000022a, - 0x22b0000022c, - 0x22d0000022e, - 0x22f00000230, - 0x23100000232, - 0x2330000023a, - 0x23c0000023d, - 0x23f00000241, - 0x24200000243, - 0x24700000248, - 0x2490000024a, - 0x24b0000024c, - 0x24d0000024e, - 0x24f000002b0, - 0x2b9000002c2, - 0x2c6000002d2, - 0x2ec000002ed, - 0x2ee000002ef, - 0x30000000340, - 0x34200000343, - 0x3460000034f, - 0x35000000370, - 0x37100000372, - 0x37300000374, - 0x37700000378, - 0x37b0000037e, - 0x39000000391, - 0x3ac000003cf, - 0x3d7000003d8, - 0x3d9000003da, - 0x3db000003dc, - 0x3dd000003de, - 0x3df000003e0, - 0x3e1000003e2, - 0x3e3000003e4, - 0x3e5000003e6, - 0x3e7000003e8, - 0x3e9000003ea, - 0x3eb000003ec, - 0x3ed000003ee, - 0x3ef000003f0, - 0x3f3000003f4, - 0x3f8000003f9, - 0x3fb000003fd, - 0x43000000460, - 0x46100000462, - 0x46300000464, - 0x46500000466, - 0x46700000468, - 0x4690000046a, - 0x46b0000046c, - 0x46d0000046e, - 0x46f00000470, - 0x47100000472, - 0x47300000474, - 0x47500000476, - 0x47700000478, - 0x4790000047a, - 0x47b0000047c, - 0x47d0000047e, - 0x47f00000480, - 0x48100000482, - 0x48300000488, - 0x48b0000048c, - 0x48d0000048e, - 0x48f00000490, - 0x49100000492, - 0x49300000494, - 0x49500000496, - 0x49700000498, - 0x4990000049a, - 0x49b0000049c, - 0x49d0000049e, - 0x49f000004a0, - 0x4a1000004a2, - 0x4a3000004a4, - 0x4a5000004a6, - 0x4a7000004a8, - 0x4a9000004aa, - 0x4ab000004ac, - 0x4ad000004ae, - 0x4af000004b0, - 0x4b1000004b2, - 0x4b3000004b4, - 0x4b5000004b6, - 0x4b7000004b8, - 0x4b9000004ba, - 0x4bb000004bc, - 0x4bd000004be, - 0x4bf000004c0, - 0x4c2000004c3, - 0x4c4000004c5, - 0x4c6000004c7, - 0x4c8000004c9, - 0x4ca000004cb, - 0x4cc000004cd, - 0x4ce000004d0, - 0x4d1000004d2, - 0x4d3000004d4, - 0x4d5000004d6, - 0x4d7000004d8, - 0x4d9000004da, - 0x4db000004dc, - 0x4dd000004de, - 0x4df000004e0, - 0x4e1000004e2, - 0x4e3000004e4, - 0x4e5000004e6, - 0x4e7000004e8, - 0x4e9000004ea, - 0x4eb000004ec, - 0x4ed000004ee, - 0x4ef000004f0, - 0x4f1000004f2, - 0x4f3000004f4, - 0x4f5000004f6, - 0x4f7000004f8, - 0x4f9000004fa, - 0x4fb000004fc, - 0x4fd000004fe, - 0x4ff00000500, - 0x50100000502, - 0x50300000504, - 0x50500000506, - 0x50700000508, - 0x5090000050a, - 0x50b0000050c, - 0x50d0000050e, - 0x50f00000510, - 0x51100000512, - 0x51300000514, - 0x51500000516, - 0x51700000518, - 0x5190000051a, - 0x51b0000051c, - 0x51d0000051e, - 0x51f00000520, - 0x52100000522, - 0x52300000524, - 0x52500000526, - 0x52700000528, - 0x5290000052a, - 0x52b0000052c, - 0x52d0000052e, - 0x52f00000530, - 0x5590000055a, - 0x56000000587, - 0x58800000589, - 0x591000005be, - 0x5bf000005c0, - 0x5c1000005c3, - 0x5c4000005c6, - 0x5c7000005c8, - 0x5d0000005eb, - 0x5ef000005f3, - 0x6100000061b, - 0x62000000640, - 0x64100000660, - 0x66e00000675, - 0x679000006d4, - 0x6d5000006dd, - 0x6df000006e9, - 0x6ea000006f0, - 0x6fa00000700, - 0x7100000074b, - 0x74d000007b2, - 0x7c0000007f6, - 0x7fd000007fe, - 0x8000000082e, - 0x8400000085c, - 0x8600000086b, - 0x8a0000008b5, - 0x8b6000008be, - 0x8d3000008e2, - 0x8e300000958, - 0x96000000964, - 0x96600000970, - 0x97100000984, - 0x9850000098d, - 0x98f00000991, - 0x993000009a9, - 0x9aa000009b1, - 0x9b2000009b3, - 0x9b6000009ba, - 0x9bc000009c5, - 0x9c7000009c9, - 0x9cb000009cf, - 0x9d7000009d8, - 0x9e0000009e4, - 0x9e6000009f2, - 0x9fc000009fd, - 0x9fe000009ff, - 0xa0100000a04, - 0xa0500000a0b, - 0xa0f00000a11, - 0xa1300000a29, - 0xa2a00000a31, - 0xa3200000a33, - 0xa3500000a36, - 0xa3800000a3a, - 0xa3c00000a3d, - 0xa3e00000a43, - 0xa4700000a49, - 0xa4b00000a4e, - 0xa5100000a52, - 0xa5c00000a5d, - 0xa6600000a76, - 0xa8100000a84, - 0xa8500000a8e, - 0xa8f00000a92, - 0xa9300000aa9, - 0xaaa00000ab1, - 0xab200000ab4, - 0xab500000aba, - 0xabc00000ac6, - 0xac700000aca, - 0xacb00000ace, - 0xad000000ad1, - 0xae000000ae4, - 0xae600000af0, - 0xaf900000b00, - 0xb0100000b04, - 0xb0500000b0d, - 0xb0f00000b11, - 0xb1300000b29, - 0xb2a00000b31, - 0xb3200000b34, - 0xb3500000b3a, - 0xb3c00000b45, - 0xb4700000b49, - 0xb4b00000b4e, - 0xb5600000b58, - 0xb5f00000b64, - 0xb6600000b70, - 0xb7100000b72, - 0xb8200000b84, - 0xb8500000b8b, - 0xb8e00000b91, - 0xb9200000b96, - 0xb9900000b9b, - 0xb9c00000b9d, - 0xb9e00000ba0, - 0xba300000ba5, - 0xba800000bab, - 0xbae00000bba, - 0xbbe00000bc3, - 0xbc600000bc9, - 0xbca00000bce, - 0xbd000000bd1, - 0xbd700000bd8, - 0xbe600000bf0, - 0xc0000000c0d, - 0xc0e00000c11, - 0xc1200000c29, - 0xc2a00000c3a, - 0xc3d00000c45, - 0xc4600000c49, - 0xc4a00000c4e, - 0xc5500000c57, - 0xc5800000c5b, - 0xc6000000c64, - 0xc6600000c70, - 0xc8000000c84, - 0xc8500000c8d, - 0xc8e00000c91, - 0xc9200000ca9, - 0xcaa00000cb4, - 0xcb500000cba, - 0xcbc00000cc5, - 0xcc600000cc9, - 0xcca00000cce, - 0xcd500000cd7, - 0xcde00000cdf, - 0xce000000ce4, - 0xce600000cf0, - 0xcf100000cf3, - 0xd0000000d04, - 0xd0500000d0d, - 0xd0e00000d11, - 0xd1200000d45, - 0xd4600000d49, - 0xd4a00000d4f, - 0xd5400000d58, - 0xd5f00000d64, - 0xd6600000d70, - 0xd7a00000d80, - 0xd8200000d84, - 0xd8500000d97, - 0xd9a00000db2, - 0xdb300000dbc, - 0xdbd00000dbe, - 0xdc000000dc7, - 0xdca00000dcb, - 0xdcf00000dd5, - 0xdd600000dd7, - 0xdd800000de0, - 0xde600000df0, - 0xdf200000df4, - 0xe0100000e33, - 0xe3400000e3b, - 0xe4000000e4f, - 0xe5000000e5a, - 0xe8100000e83, - 0xe8400000e85, - 0xe8700000e89, - 0xe8a00000e8b, - 0xe8d00000e8e, - 0xe9400000e98, - 0xe9900000ea0, - 0xea100000ea4, - 0xea500000ea6, - 0xea700000ea8, - 0xeaa00000eac, - 0xead00000eb3, - 0xeb400000eba, - 0xebb00000ebe, - 0xec000000ec5, - 0xec600000ec7, - 0xec800000ece, - 0xed000000eda, - 0xede00000ee0, - 0xf0000000f01, - 0xf0b00000f0c, - 0xf1800000f1a, - 0xf2000000f2a, - 0xf3500000f36, - 0xf3700000f38, - 0xf3900000f3a, - 0xf3e00000f43, - 0xf4400000f48, - 0xf4900000f4d, - 0xf4e00000f52, - 0xf5300000f57, - 0xf5800000f5c, - 0xf5d00000f69, - 0xf6a00000f6d, - 0xf7100000f73, - 0xf7400000f75, - 0xf7a00000f81, - 0xf8200000f85, - 0xf8600000f93, - 0xf9400000f98, - 0xf9900000f9d, - 0xf9e00000fa2, - 0xfa300000fa7, - 0xfa800000fac, - 0xfad00000fb9, - 0xfba00000fbd, - 0xfc600000fc7, - 0x10000000104a, - 0x10500000109e, - 0x10d0000010fb, - 0x10fd00001100, - 0x120000001249, - 0x124a0000124e, - 0x125000001257, - 0x125800001259, - 0x125a0000125e, - 0x126000001289, - 0x128a0000128e, - 0x1290000012b1, - 0x12b2000012b6, - 0x12b8000012bf, - 0x12c0000012c1, - 0x12c2000012c6, - 0x12c8000012d7, - 0x12d800001311, - 0x131200001316, - 0x13180000135b, - 0x135d00001360, - 0x138000001390, - 0x13a0000013f6, - 0x14010000166d, - 0x166f00001680, - 0x16810000169b, - 0x16a0000016eb, - 0x16f1000016f9, - 0x17000000170d, - 0x170e00001715, - 0x172000001735, - 0x174000001754, - 0x17600000176d, - 0x176e00001771, - 0x177200001774, - 0x1780000017b4, - 0x17b6000017d4, - 0x17d7000017d8, - 0x17dc000017de, - 0x17e0000017ea, - 0x18100000181a, - 0x182000001879, - 0x1880000018ab, - 0x18b0000018f6, - 0x19000000191f, - 0x19200000192c, - 0x19300000193c, - 0x19460000196e, - 0x197000001975, - 0x1980000019ac, - 0x19b0000019ca, - 0x19d0000019da, - 0x1a0000001a1c, - 0x1a2000001a5f, - 0x1a6000001a7d, - 0x1a7f00001a8a, - 0x1a9000001a9a, - 0x1aa700001aa8, - 0x1ab000001abe, - 0x1b0000001b4c, - 0x1b5000001b5a, - 0x1b6b00001b74, - 0x1b8000001bf4, - 0x1c0000001c38, - 0x1c4000001c4a, - 0x1c4d00001c7e, - 0x1cd000001cd3, - 0x1cd400001cfa, - 0x1d0000001d2c, - 0x1d2f00001d30, - 0x1d3b00001d3c, - 0x1d4e00001d4f, - 0x1d6b00001d78, - 0x1d7900001d9b, - 0x1dc000001dfa, - 0x1dfb00001e00, - 0x1e0100001e02, - 0x1e0300001e04, - 0x1e0500001e06, - 0x1e0700001e08, - 0x1e0900001e0a, - 0x1e0b00001e0c, - 0x1e0d00001e0e, - 0x1e0f00001e10, - 0x1e1100001e12, - 0x1e1300001e14, - 0x1e1500001e16, - 0x1e1700001e18, - 0x1e1900001e1a, - 0x1e1b00001e1c, - 0x1e1d00001e1e, - 0x1e1f00001e20, - 0x1e2100001e22, - 0x1e2300001e24, - 0x1e2500001e26, - 0x1e2700001e28, - 0x1e2900001e2a, - 0x1e2b00001e2c, - 0x1e2d00001e2e, - 0x1e2f00001e30, - 0x1e3100001e32, - 0x1e3300001e34, - 0x1e3500001e36, - 0x1e3700001e38, - 0x1e3900001e3a, - 0x1e3b00001e3c, - 0x1e3d00001e3e, - 0x1e3f00001e40, - 0x1e4100001e42, - 0x1e4300001e44, - 0x1e4500001e46, - 0x1e4700001e48, - 0x1e4900001e4a, - 0x1e4b00001e4c, - 0x1e4d00001e4e, - 0x1e4f00001e50, - 0x1e5100001e52, - 0x1e5300001e54, - 0x1e5500001e56, - 0x1e5700001e58, - 0x1e5900001e5a, - 0x1e5b00001e5c, - 0x1e5d00001e5e, - 0x1e5f00001e60, - 0x1e6100001e62, - 0x1e6300001e64, - 0x1e6500001e66, - 0x1e6700001e68, - 0x1e6900001e6a, - 0x1e6b00001e6c, - 0x1e6d00001e6e, - 0x1e6f00001e70, - 0x1e7100001e72, - 0x1e7300001e74, - 0x1e7500001e76, - 0x1e7700001e78, - 0x1e7900001e7a, - 0x1e7b00001e7c, - 0x1e7d00001e7e, - 0x1e7f00001e80, - 0x1e8100001e82, - 0x1e8300001e84, - 0x1e8500001e86, - 0x1e8700001e88, - 0x1e8900001e8a, - 0x1e8b00001e8c, - 0x1e8d00001e8e, - 0x1e8f00001e90, - 0x1e9100001e92, - 0x1e9300001e94, - 0x1e9500001e9a, - 0x1e9c00001e9e, - 0x1e9f00001ea0, - 0x1ea100001ea2, - 0x1ea300001ea4, - 0x1ea500001ea6, - 0x1ea700001ea8, - 0x1ea900001eaa, - 0x1eab00001eac, - 0x1ead00001eae, - 0x1eaf00001eb0, - 0x1eb100001eb2, - 0x1eb300001eb4, - 0x1eb500001eb6, - 0x1eb700001eb8, - 0x1eb900001eba, - 0x1ebb00001ebc, - 0x1ebd00001ebe, - 0x1ebf00001ec0, - 0x1ec100001ec2, - 0x1ec300001ec4, - 0x1ec500001ec6, - 0x1ec700001ec8, - 0x1ec900001eca, - 0x1ecb00001ecc, - 0x1ecd00001ece, - 0x1ecf00001ed0, - 0x1ed100001ed2, - 0x1ed300001ed4, - 0x1ed500001ed6, - 0x1ed700001ed8, - 0x1ed900001eda, - 0x1edb00001edc, - 0x1edd00001ede, - 0x1edf00001ee0, - 0x1ee100001ee2, - 0x1ee300001ee4, - 0x1ee500001ee6, - 0x1ee700001ee8, - 0x1ee900001eea, - 0x1eeb00001eec, - 0x1eed00001eee, - 0x1eef00001ef0, - 0x1ef100001ef2, - 0x1ef300001ef4, - 0x1ef500001ef6, - 0x1ef700001ef8, - 0x1ef900001efa, - 0x1efb00001efc, - 0x1efd00001efe, - 0x1eff00001f08, - 0x1f1000001f16, - 0x1f2000001f28, - 0x1f3000001f38, - 0x1f4000001f46, - 0x1f5000001f58, - 0x1f6000001f68, - 0x1f7000001f71, - 0x1f7200001f73, - 0x1f7400001f75, - 0x1f7600001f77, - 0x1f7800001f79, - 0x1f7a00001f7b, - 0x1f7c00001f7d, - 0x1fb000001fb2, - 0x1fb600001fb7, - 0x1fc600001fc7, - 0x1fd000001fd3, - 0x1fd600001fd8, - 0x1fe000001fe3, - 0x1fe400001fe8, - 0x1ff600001ff7, - 0x214e0000214f, - 0x218400002185, - 0x2c3000002c5f, - 0x2c6100002c62, - 0x2c6500002c67, - 0x2c6800002c69, - 0x2c6a00002c6b, - 0x2c6c00002c6d, - 0x2c7100002c72, - 0x2c7300002c75, - 0x2c7600002c7c, - 0x2c8100002c82, - 0x2c8300002c84, - 0x2c8500002c86, - 0x2c8700002c88, - 0x2c8900002c8a, - 0x2c8b00002c8c, - 0x2c8d00002c8e, - 0x2c8f00002c90, - 0x2c9100002c92, - 0x2c9300002c94, - 0x2c9500002c96, - 0x2c9700002c98, - 0x2c9900002c9a, - 0x2c9b00002c9c, - 0x2c9d00002c9e, - 0x2c9f00002ca0, - 0x2ca100002ca2, - 0x2ca300002ca4, - 0x2ca500002ca6, - 0x2ca700002ca8, - 0x2ca900002caa, - 0x2cab00002cac, - 0x2cad00002cae, - 0x2caf00002cb0, - 0x2cb100002cb2, - 0x2cb300002cb4, - 0x2cb500002cb6, - 0x2cb700002cb8, - 0x2cb900002cba, - 0x2cbb00002cbc, - 0x2cbd00002cbe, - 0x2cbf00002cc0, - 0x2cc100002cc2, - 0x2cc300002cc4, - 0x2cc500002cc6, - 0x2cc700002cc8, - 0x2cc900002cca, - 0x2ccb00002ccc, - 0x2ccd00002cce, - 0x2ccf00002cd0, - 0x2cd100002cd2, - 0x2cd300002cd4, - 0x2cd500002cd6, - 0x2cd700002cd8, - 0x2cd900002cda, - 0x2cdb00002cdc, - 0x2cdd00002cde, - 0x2cdf00002ce0, - 0x2ce100002ce2, - 0x2ce300002ce5, - 0x2cec00002ced, - 0x2cee00002cf2, - 0x2cf300002cf4, - 0x2d0000002d26, - 0x2d2700002d28, - 0x2d2d00002d2e, - 0x2d3000002d68, - 0x2d7f00002d97, - 0x2da000002da7, - 0x2da800002daf, - 0x2db000002db7, - 0x2db800002dbf, - 0x2dc000002dc7, - 0x2dc800002dcf, - 0x2dd000002dd7, - 0x2dd800002ddf, - 0x2de000002e00, - 0x2e2f00002e30, - 0x300500003008, - 0x302a0000302e, - 0x303c0000303d, - 0x304100003097, - 0x30990000309b, - 0x309d0000309f, - 0x30a1000030fb, - 0x30fc000030ff, - 0x310500003130, - 0x31a0000031bb, - 0x31f000003200, - 0x340000004db6, - 0x4e0000009ff0, - 0xa0000000a48d, - 0xa4d00000a4fe, - 0xa5000000a60d, - 0xa6100000a62c, - 0xa6410000a642, - 0xa6430000a644, - 0xa6450000a646, - 0xa6470000a648, - 0xa6490000a64a, - 0xa64b0000a64c, - 0xa64d0000a64e, - 0xa64f0000a650, - 0xa6510000a652, - 0xa6530000a654, - 0xa6550000a656, - 0xa6570000a658, - 0xa6590000a65a, - 0xa65b0000a65c, - 0xa65d0000a65e, - 0xa65f0000a660, - 0xa6610000a662, - 0xa6630000a664, - 0xa6650000a666, - 0xa6670000a668, - 0xa6690000a66a, - 0xa66b0000a66c, - 0xa66d0000a670, - 0xa6740000a67e, - 0xa67f0000a680, - 0xa6810000a682, - 0xa6830000a684, - 0xa6850000a686, - 0xa6870000a688, - 0xa6890000a68a, - 0xa68b0000a68c, - 0xa68d0000a68e, - 0xa68f0000a690, - 0xa6910000a692, - 0xa6930000a694, - 0xa6950000a696, - 0xa6970000a698, - 0xa6990000a69a, - 0xa69b0000a69c, - 0xa69e0000a6e6, - 0xa6f00000a6f2, - 0xa7170000a720, - 0xa7230000a724, - 0xa7250000a726, - 0xa7270000a728, - 0xa7290000a72a, - 0xa72b0000a72c, - 0xa72d0000a72e, - 0xa72f0000a732, - 0xa7330000a734, - 0xa7350000a736, - 0xa7370000a738, - 0xa7390000a73a, - 0xa73b0000a73c, - 0xa73d0000a73e, - 0xa73f0000a740, - 0xa7410000a742, - 0xa7430000a744, - 0xa7450000a746, - 0xa7470000a748, - 0xa7490000a74a, - 0xa74b0000a74c, - 0xa74d0000a74e, - 0xa74f0000a750, - 0xa7510000a752, - 0xa7530000a754, - 0xa7550000a756, - 0xa7570000a758, - 0xa7590000a75a, - 0xa75b0000a75c, - 0xa75d0000a75e, - 0xa75f0000a760, - 0xa7610000a762, - 0xa7630000a764, - 0xa7650000a766, - 0xa7670000a768, - 0xa7690000a76a, - 0xa76b0000a76c, - 0xa76d0000a76e, - 0xa76f0000a770, - 0xa7710000a779, - 0xa77a0000a77b, - 0xa77c0000a77d, - 0xa77f0000a780, - 0xa7810000a782, - 0xa7830000a784, - 0xa7850000a786, - 0xa7870000a789, - 0xa78c0000a78d, - 0xa78e0000a790, - 0xa7910000a792, - 0xa7930000a796, - 0xa7970000a798, - 0xa7990000a79a, - 0xa79b0000a79c, - 0xa79d0000a79e, - 0xa79f0000a7a0, - 0xa7a10000a7a2, - 0xa7a30000a7a4, - 0xa7a50000a7a6, - 0xa7a70000a7a8, - 0xa7a90000a7aa, - 0xa7af0000a7b0, - 0xa7b50000a7b6, - 0xa7b70000a7b8, - 0xa7b90000a7ba, - 0xa7f70000a7f8, - 0xa7fa0000a828, - 0xa8400000a874, - 0xa8800000a8c6, - 0xa8d00000a8da, - 0xa8e00000a8f8, - 0xa8fb0000a8fc, - 0xa8fd0000a92e, - 0xa9300000a954, - 0xa9800000a9c1, - 0xa9cf0000a9da, - 0xa9e00000a9ff, - 0xaa000000aa37, - 0xaa400000aa4e, - 0xaa500000aa5a, - 0xaa600000aa77, - 0xaa7a0000aac3, - 0xaadb0000aade, - 0xaae00000aaf0, - 0xaaf20000aaf7, - 0xab010000ab07, - 0xab090000ab0f, - 0xab110000ab17, - 0xab200000ab27, - 0xab280000ab2f, - 0xab300000ab5b, - 0xab600000ab66, - 0xabc00000abeb, - 0xabec0000abee, - 0xabf00000abfa, - 0xac000000d7a4, - 0xfa0e0000fa10, - 0xfa110000fa12, - 0xfa130000fa15, - 0xfa1f0000fa20, - 0xfa210000fa22, - 0xfa230000fa25, - 0xfa270000fa2a, - 0xfb1e0000fb1f, - 0xfe200000fe30, - 0xfe730000fe74, - 0x100000001000c, - 0x1000d00010027, - 0x100280001003b, - 0x1003c0001003e, - 0x1003f0001004e, - 0x100500001005e, - 0x10080000100fb, - 0x101fd000101fe, - 0x102800001029d, - 0x102a0000102d1, - 0x102e0000102e1, - 0x1030000010320, - 0x1032d00010341, - 0x103420001034a, - 0x103500001037b, - 0x103800001039e, - 0x103a0000103c4, - 0x103c8000103d0, - 0x104280001049e, - 0x104a0000104aa, - 0x104d8000104fc, - 0x1050000010528, - 0x1053000010564, - 0x1060000010737, - 0x1074000010756, - 0x1076000010768, - 0x1080000010806, - 0x1080800010809, - 0x1080a00010836, - 0x1083700010839, - 0x1083c0001083d, - 0x1083f00010856, - 0x1086000010877, - 0x108800001089f, - 0x108e0000108f3, - 0x108f4000108f6, - 0x1090000010916, - 0x109200001093a, - 0x10980000109b8, - 0x109be000109c0, - 0x10a0000010a04, - 0x10a0500010a07, - 0x10a0c00010a14, - 0x10a1500010a18, - 0x10a1900010a36, - 0x10a3800010a3b, - 0x10a3f00010a40, - 0x10a6000010a7d, - 0x10a8000010a9d, - 0x10ac000010ac8, - 0x10ac900010ae7, - 0x10b0000010b36, - 0x10b4000010b56, - 0x10b6000010b73, - 0x10b8000010b92, - 0x10c0000010c49, - 0x10cc000010cf3, - 0x10d0000010d28, - 0x10d3000010d3a, - 0x10f0000010f1d, - 0x10f2700010f28, - 0x10f3000010f51, - 0x1100000011047, - 0x1106600011070, - 0x1107f000110bb, - 0x110d0000110e9, - 0x110f0000110fa, - 0x1110000011135, - 0x1113600011140, - 0x1114400011147, - 0x1115000011174, - 0x1117600011177, - 0x11180000111c5, - 0x111c9000111cd, - 0x111d0000111db, - 0x111dc000111dd, - 0x1120000011212, - 0x1121300011238, - 0x1123e0001123f, - 0x1128000011287, - 0x1128800011289, - 0x1128a0001128e, - 0x1128f0001129e, - 0x1129f000112a9, - 0x112b0000112eb, - 0x112f0000112fa, - 0x1130000011304, - 0x113050001130d, - 0x1130f00011311, - 0x1131300011329, - 0x1132a00011331, - 0x1133200011334, - 0x113350001133a, - 0x1133b00011345, - 0x1134700011349, - 0x1134b0001134e, - 0x1135000011351, - 0x1135700011358, - 0x1135d00011364, - 0x113660001136d, - 0x1137000011375, - 0x114000001144b, - 0x114500001145a, - 0x1145e0001145f, - 0x11480000114c6, - 0x114c7000114c8, - 0x114d0000114da, - 0x11580000115b6, - 0x115b8000115c1, - 0x115d8000115de, - 0x1160000011641, - 0x1164400011645, - 0x116500001165a, - 0x11680000116b8, - 0x116c0000116ca, - 0x117000001171b, - 0x1171d0001172c, - 0x117300001173a, - 0x118000001183b, - 0x118c0000118ea, - 0x118ff00011900, - 0x11a0000011a3f, - 0x11a4700011a48, - 0x11a5000011a84, - 0x11a8600011a9a, - 0x11a9d00011a9e, - 0x11ac000011af9, - 0x11c0000011c09, - 0x11c0a00011c37, - 0x11c3800011c41, - 0x11c5000011c5a, - 0x11c7200011c90, - 0x11c9200011ca8, - 0x11ca900011cb7, - 0x11d0000011d07, - 0x11d0800011d0a, - 0x11d0b00011d37, - 0x11d3a00011d3b, - 0x11d3c00011d3e, - 0x11d3f00011d48, - 0x11d5000011d5a, - 0x11d6000011d66, - 0x11d6700011d69, - 0x11d6a00011d8f, - 0x11d9000011d92, - 0x11d9300011d99, - 0x11da000011daa, - 0x11ee000011ef7, - 0x120000001239a, - 0x1248000012544, - 0x130000001342f, - 0x1440000014647, - 0x1680000016a39, - 0x16a4000016a5f, - 0x16a6000016a6a, - 0x16ad000016aee, - 0x16af000016af5, - 0x16b0000016b37, - 0x16b4000016b44, - 0x16b5000016b5a, - 0x16b6300016b78, - 0x16b7d00016b90, - 0x16e6000016e80, - 0x16f0000016f45, - 0x16f5000016f7f, - 0x16f8f00016fa0, - 0x16fe000016fe2, - 0x17000000187f2, - 0x1880000018af3, - 0x1b0000001b11f, - 0x1b1700001b2fc, - 0x1bc000001bc6b, - 0x1bc700001bc7d, - 0x1bc800001bc89, - 0x1bc900001bc9a, - 0x1bc9d0001bc9f, - 0x1da000001da37, - 0x1da3b0001da6d, - 0x1da750001da76, - 0x1da840001da85, - 0x1da9b0001daa0, - 0x1daa10001dab0, - 0x1e0000001e007, - 0x1e0080001e019, - 0x1e01b0001e022, - 0x1e0230001e025, - 0x1e0260001e02b, - 0x1e8000001e8c5, - 0x1e8d00001e8d7, - 0x1e9220001e94b, - 0x1e9500001e95a, - 0x200000002a6d7, - 0x2a7000002b735, - 0x2b7400002b81e, - 0x2b8200002cea2, - 0x2ceb00002ebe1, - ), - 'CONTEXTJ': ( - 0x200c0000200e, - ), - 'CONTEXTO': ( - 0xb7000000b8, - 0x37500000376, - 0x5f3000005f5, - 0x6600000066a, - 0x6f0000006fa, - 0x30fb000030fc, - ), -} diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/intranges.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/intranges.py deleted file mode 100644 index fa8a735..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/intranges.py +++ /dev/null @@ -1,53 +0,0 @@ -""" -Given a list of integers, made up of (hopefully) a small number of long runs -of consecutive integers, compute a representation of the form -((start1, end1), (start2, end2) ...). Then answer the question "was x present -in the original list?" in time O(log(# runs)). -""" - -import bisect - -def intranges_from_list(list_): - """Represent a list of integers as a sequence of ranges: - ((start_0, end_0), (start_1, end_1), ...), such that the original - integers are exactly those x such that start_i <= x < end_i for some i. - - Ranges are encoded as single integers (start << 32 | end), not as tuples. - """ - - sorted_list = sorted(list_) - ranges = [] - last_write = -1 - for i in range(len(sorted_list)): - if i+1 < len(sorted_list): - if sorted_list[i] == sorted_list[i+1]-1: - continue - current_range = sorted_list[last_write+1:i+1] - ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) - last_write = i - - return tuple(ranges) - -def _encode_range(start, end): - return (start << 32) | end - -def _decode_range(r): - return (r >> 32), (r & ((1 << 32) - 1)) - - -def intranges_contain(int_, ranges): - """Determine if `int_` falls into one of the ranges in `ranges`.""" - tuple_ = _encode_range(int_, 0) - pos = bisect.bisect_left(ranges, tuple_) - # we could be immediately ahead of a tuple (start, end) - # with start < int_ <= end - if pos > 0: - left, right = _decode_range(ranges[pos-1]) - if left <= int_ < right: - return True - # or we could be immediately behind a tuple (int_, end) - if pos < len(ranges): - left, _ = _decode_range(ranges[pos]) - if left == int_: - return True - return False diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/package_data.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/package_data.py deleted file mode 100644 index 257e898..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/package_data.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = '2.8' - diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/uts46data.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/uts46data.py deleted file mode 100644 index a68ed4c..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/uts46data.py +++ /dev/null @@ -1,8205 +0,0 @@ -# This file is automatically generated by tools/idna-data -# vim: set fileencoding=utf-8 : - -"""IDNA Mapping Table from UTS46.""" - - -__version__ = "11.0.0" -def _seg_0(): - return [ - (0x0, '3'), - (0x1, '3'), - (0x2, '3'), - (0x3, '3'), - (0x4, '3'), - (0x5, '3'), - (0x6, '3'), - (0x7, '3'), - (0x8, '3'), - (0x9, '3'), - (0xA, '3'), - (0xB, '3'), - (0xC, '3'), - (0xD, '3'), - (0xE, '3'), - (0xF, '3'), - (0x10, '3'), - (0x11, '3'), - (0x12, '3'), - (0x13, '3'), - (0x14, '3'), - (0x15, '3'), - (0x16, '3'), - (0x17, '3'), - (0x18, '3'), - (0x19, '3'), - (0x1A, '3'), - (0x1B, '3'), - (0x1C, '3'), - (0x1D, '3'), - (0x1E, '3'), - (0x1F, '3'), - (0x20, '3'), - (0x21, '3'), - (0x22, '3'), - (0x23, '3'), - (0x24, '3'), - (0x25, '3'), - (0x26, '3'), - (0x27, '3'), - (0x28, '3'), - (0x29, '3'), - (0x2A, '3'), - (0x2B, '3'), - (0x2C, '3'), - (0x2D, 'V'), - (0x2E, 'V'), - (0x2F, '3'), - (0x30, 'V'), - (0x31, 'V'), - (0x32, 'V'), - (0x33, 'V'), - (0x34, 'V'), - (0x35, 'V'), - (0x36, 'V'), - (0x37, 'V'), - (0x38, 'V'), - (0x39, 'V'), - (0x3A, '3'), - (0x3B, '3'), - (0x3C, '3'), - (0x3D, '3'), - (0x3E, '3'), - (0x3F, '3'), - (0x40, '3'), - (0x41, 'M', u'a'), - (0x42, 'M', u'b'), - (0x43, 'M', u'c'), - (0x44, 'M', u'd'), - (0x45, 'M', u'e'), - (0x46, 'M', u'f'), - (0x47, 'M', u'g'), - (0x48, 'M', u'h'), - (0x49, 'M', u'i'), - (0x4A, 'M', u'j'), - (0x4B, 'M', u'k'), - (0x4C, 'M', u'l'), - (0x4D, 'M', u'm'), - (0x4E, 'M', u'n'), - (0x4F, 'M', u'o'), - (0x50, 'M', u'p'), - (0x51, 'M', u'q'), - (0x52, 'M', u'r'), - (0x53, 'M', u's'), - (0x54, 'M', u't'), - (0x55, 'M', u'u'), - (0x56, 'M', u'v'), - (0x57, 'M', u'w'), - (0x58, 'M', u'x'), - (0x59, 'M', u'y'), - (0x5A, 'M', u'z'), - (0x5B, '3'), - (0x5C, '3'), - (0x5D, '3'), - (0x5E, '3'), - (0x5F, '3'), - (0x60, '3'), - (0x61, 'V'), - (0x62, 'V'), - (0x63, 'V'), - ] - -def _seg_1(): - return [ - (0x64, 'V'), - (0x65, 'V'), - (0x66, 'V'), - (0x67, 'V'), - (0x68, 'V'), - (0x69, 'V'), - (0x6A, 'V'), - (0x6B, 'V'), - (0x6C, 'V'), - (0x6D, 'V'), - (0x6E, 'V'), - (0x6F, 'V'), - (0x70, 'V'), - (0x71, 'V'), - (0x72, 'V'), - (0x73, 'V'), - (0x74, 'V'), - (0x75, 'V'), - (0x76, 'V'), - (0x77, 'V'), - (0x78, 'V'), - (0x79, 'V'), - (0x7A, 'V'), - (0x7B, '3'), - (0x7C, '3'), - (0x7D, '3'), - (0x7E, '3'), - (0x7F, '3'), - (0x80, 'X'), - (0x81, 'X'), - (0x82, 'X'), - (0x83, 'X'), - (0x84, 'X'), - (0x85, 'X'), - (0x86, 'X'), - (0x87, 'X'), - (0x88, 'X'), - (0x89, 'X'), - (0x8A, 'X'), - (0x8B, 'X'), - (0x8C, 'X'), - (0x8D, 'X'), - (0x8E, 'X'), - (0x8F, 'X'), - (0x90, 'X'), - (0x91, 'X'), - (0x92, 'X'), - (0x93, 'X'), - (0x94, 'X'), - (0x95, 'X'), - (0x96, 'X'), - (0x97, 'X'), - (0x98, 'X'), - (0x99, 'X'), - (0x9A, 'X'), - (0x9B, 'X'), - (0x9C, 'X'), - (0x9D, 'X'), - (0x9E, 'X'), - (0x9F, 'X'), - (0xA0, '3', u' '), - (0xA1, 'V'), - (0xA2, 'V'), - (0xA3, 'V'), - (0xA4, 'V'), - (0xA5, 'V'), - (0xA6, 'V'), - (0xA7, 'V'), - (0xA8, '3', u' ̈'), - (0xA9, 'V'), - (0xAA, 'M', u'a'), - (0xAB, 'V'), - (0xAC, 'V'), - (0xAD, 'I'), - (0xAE, 'V'), - (0xAF, '3', u' ̄'), - (0xB0, 'V'), - (0xB1, 'V'), - (0xB2, 'M', u'2'), - (0xB3, 'M', u'3'), - (0xB4, '3', u' ́'), - (0xB5, 'M', u'μ'), - (0xB6, 'V'), - (0xB7, 'V'), - (0xB8, '3', u' ̧'), - (0xB9, 'M', u'1'), - (0xBA, 'M', u'o'), - (0xBB, 'V'), - (0xBC, 'M', u'1⁄4'), - (0xBD, 'M', u'1⁄2'), - (0xBE, 'M', u'3⁄4'), - (0xBF, 'V'), - (0xC0, 'M', u'à'), - (0xC1, 'M', u'á'), - (0xC2, 'M', u'â'), - (0xC3, 'M', u'ã'), - (0xC4, 'M', u'ä'), - (0xC5, 'M', u'å'), - (0xC6, 'M', u'æ'), - (0xC7, 'M', u'ç'), - ] - -def _seg_2(): - return [ - (0xC8, 'M', u'è'), - (0xC9, 'M', u'é'), - (0xCA, 'M', u'ê'), - (0xCB, 'M', u'ë'), - (0xCC, 'M', u'ì'), - (0xCD, 'M', u'í'), - (0xCE, 'M', u'î'), - (0xCF, 'M', u'ï'), - (0xD0, 'M', u'ð'), - (0xD1, 'M', u'ñ'), - (0xD2, 'M', u'ò'), - (0xD3, 'M', u'ó'), - (0xD4, 'M', u'ô'), - (0xD5, 'M', u'õ'), - (0xD6, 'M', u'ö'), - (0xD7, 'V'), - (0xD8, 'M', u'ø'), - (0xD9, 'M', u'ù'), - (0xDA, 'M', u'ú'), - (0xDB, 'M', u'û'), - (0xDC, 'M', u'ü'), - (0xDD, 'M', u'ý'), - (0xDE, 'M', u'þ'), - (0xDF, 'D', u'ss'), - (0xE0, 'V'), - (0xE1, 'V'), - (0xE2, 'V'), - (0xE3, 'V'), - (0xE4, 'V'), - (0xE5, 'V'), - (0xE6, 'V'), - (0xE7, 'V'), - (0xE8, 'V'), - (0xE9, 'V'), - (0xEA, 'V'), - (0xEB, 'V'), - (0xEC, 'V'), - (0xED, 'V'), - (0xEE, 'V'), - (0xEF, 'V'), - (0xF0, 'V'), - (0xF1, 'V'), - (0xF2, 'V'), - (0xF3, 'V'), - (0xF4, 'V'), - (0xF5, 'V'), - (0xF6, 'V'), - (0xF7, 'V'), - (0xF8, 'V'), - (0xF9, 'V'), - (0xFA, 'V'), - (0xFB, 'V'), - (0xFC, 'V'), - (0xFD, 'V'), - (0xFE, 'V'), - (0xFF, 'V'), - (0x100, 'M', u'ā'), - (0x101, 'V'), - (0x102, 'M', u'ă'), - (0x103, 'V'), - (0x104, 'M', u'ą'), - (0x105, 'V'), - (0x106, 'M', u'ć'), - (0x107, 'V'), - (0x108, 'M', u'ĉ'), - (0x109, 'V'), - (0x10A, 'M', u'ċ'), - (0x10B, 'V'), - (0x10C, 'M', u'č'), - (0x10D, 'V'), - (0x10E, 'M', u'ď'), - (0x10F, 'V'), - (0x110, 'M', u'đ'), - (0x111, 'V'), - (0x112, 'M', u'ē'), - (0x113, 'V'), - (0x114, 'M', u'ĕ'), - (0x115, 'V'), - (0x116, 'M', u'ė'), - (0x117, 'V'), - (0x118, 'M', u'ę'), - (0x119, 'V'), - (0x11A, 'M', u'ě'), - (0x11B, 'V'), - (0x11C, 'M', u'ĝ'), - (0x11D, 'V'), - (0x11E, 'M', u'ğ'), - (0x11F, 'V'), - (0x120, 'M', u'ġ'), - (0x121, 'V'), - (0x122, 'M', u'ģ'), - (0x123, 'V'), - (0x124, 'M', u'ĥ'), - (0x125, 'V'), - (0x126, 'M', u'ħ'), - (0x127, 'V'), - (0x128, 'M', u'ĩ'), - (0x129, 'V'), - (0x12A, 'M', u'ī'), - (0x12B, 'V'), - ] - -def _seg_3(): - return [ - (0x12C, 'M', u'ĭ'), - (0x12D, 'V'), - (0x12E, 'M', u'į'), - (0x12F, 'V'), - (0x130, 'M', u'i̇'), - (0x131, 'V'), - (0x132, 'M', u'ij'), - (0x134, 'M', u'ĵ'), - (0x135, 'V'), - (0x136, 'M', u'ķ'), - (0x137, 'V'), - (0x139, 'M', u'ĺ'), - (0x13A, 'V'), - (0x13B, 'M', u'ļ'), - (0x13C, 'V'), - (0x13D, 'M', u'ľ'), - (0x13E, 'V'), - (0x13F, 'M', u'l·'), - (0x141, 'M', u'ł'), - (0x142, 'V'), - (0x143, 'M', u'ń'), - (0x144, 'V'), - (0x145, 'M', u'ņ'), - (0x146, 'V'), - (0x147, 'M', u'ň'), - (0x148, 'V'), - (0x149, 'M', u'ʼn'), - (0x14A, 'M', u'ŋ'), - (0x14B, 'V'), - (0x14C, 'M', u'ō'), - (0x14D, 'V'), - (0x14E, 'M', u'ŏ'), - (0x14F, 'V'), - (0x150, 'M', u'ő'), - (0x151, 'V'), - (0x152, 'M', u'œ'), - (0x153, 'V'), - (0x154, 'M', u'ŕ'), - (0x155, 'V'), - (0x156, 'M', u'ŗ'), - (0x157, 'V'), - (0x158, 'M', u'ř'), - (0x159, 'V'), - (0x15A, 'M', u'ś'), - (0x15B, 'V'), - (0x15C, 'M', u'ŝ'), - (0x15D, 'V'), - (0x15E, 'M', u'ş'), - (0x15F, 'V'), - (0x160, 'M', u'š'), - (0x161, 'V'), - (0x162, 'M', u'ţ'), - (0x163, 'V'), - (0x164, 'M', u'ť'), - (0x165, 'V'), - (0x166, 'M', u'ŧ'), - (0x167, 'V'), - (0x168, 'M', u'ũ'), - (0x169, 'V'), - (0x16A, 'M', u'ū'), - (0x16B, 'V'), - (0x16C, 'M', u'ŭ'), - (0x16D, 'V'), - (0x16E, 'M', u'ů'), - (0x16F, 'V'), - (0x170, 'M', u'ű'), - (0x171, 'V'), - (0x172, 'M', u'ų'), - (0x173, 'V'), - (0x174, 'M', u'ŵ'), - (0x175, 'V'), - (0x176, 'M', u'ŷ'), - (0x177, 'V'), - (0x178, 'M', u'ÿ'), - (0x179, 'M', u'ź'), - (0x17A, 'V'), - (0x17B, 'M', u'ż'), - (0x17C, 'V'), - (0x17D, 'M', u'ž'), - (0x17E, 'V'), - (0x17F, 'M', u's'), - (0x180, 'V'), - (0x181, 'M', u'ɓ'), - (0x182, 'M', u'ƃ'), - (0x183, 'V'), - (0x184, 'M', u'ƅ'), - (0x185, 'V'), - (0x186, 'M', u'ɔ'), - (0x187, 'M', u'ƈ'), - (0x188, 'V'), - (0x189, 'M', u'ɖ'), - (0x18A, 'M', u'ɗ'), - (0x18B, 'M', u'ƌ'), - (0x18C, 'V'), - (0x18E, 'M', u'ǝ'), - (0x18F, 'M', u'ə'), - (0x190, 'M', u'ɛ'), - (0x191, 'M', u'ƒ'), - (0x192, 'V'), - (0x193, 'M', u'ɠ'), - ] - -def _seg_4(): - return [ - (0x194, 'M', u'ɣ'), - (0x195, 'V'), - (0x196, 'M', u'ɩ'), - (0x197, 'M', u'ɨ'), - (0x198, 'M', u'ƙ'), - (0x199, 'V'), - (0x19C, 'M', u'ɯ'), - (0x19D, 'M', u'ɲ'), - (0x19E, 'V'), - (0x19F, 'M', u'ɵ'), - (0x1A0, 'M', u'ơ'), - (0x1A1, 'V'), - (0x1A2, 'M', u'ƣ'), - (0x1A3, 'V'), - (0x1A4, 'M', u'ƥ'), - (0x1A5, 'V'), - (0x1A6, 'M', u'ʀ'), - (0x1A7, 'M', u'ƨ'), - (0x1A8, 'V'), - (0x1A9, 'M', u'ʃ'), - (0x1AA, 'V'), - (0x1AC, 'M', u'ƭ'), - (0x1AD, 'V'), - (0x1AE, 'M', u'ʈ'), - (0x1AF, 'M', u'ư'), - (0x1B0, 'V'), - (0x1B1, 'M', u'ʊ'), - (0x1B2, 'M', u'ʋ'), - (0x1B3, 'M', u'ƴ'), - (0x1B4, 'V'), - (0x1B5, 'M', u'ƶ'), - (0x1B6, 'V'), - (0x1B7, 'M', u'ʒ'), - (0x1B8, 'M', u'ƹ'), - (0x1B9, 'V'), - (0x1BC, 'M', u'ƽ'), - (0x1BD, 'V'), - (0x1C4, 'M', u'dž'), - (0x1C7, 'M', u'lj'), - (0x1CA, 'M', u'nj'), - (0x1CD, 'M', u'ǎ'), - (0x1CE, 'V'), - (0x1CF, 'M', u'ǐ'), - (0x1D0, 'V'), - (0x1D1, 'M', u'ǒ'), - (0x1D2, 'V'), - (0x1D3, 'M', u'ǔ'), - (0x1D4, 'V'), - (0x1D5, 'M', u'ǖ'), - (0x1D6, 'V'), - (0x1D7, 'M', u'ǘ'), - (0x1D8, 'V'), - (0x1D9, 'M', u'ǚ'), - (0x1DA, 'V'), - (0x1DB, 'M', u'ǜ'), - (0x1DC, 'V'), - (0x1DE, 'M', u'ǟ'), - (0x1DF, 'V'), - (0x1E0, 'M', u'ǡ'), - (0x1E1, 'V'), - (0x1E2, 'M', u'ǣ'), - (0x1E3, 'V'), - (0x1E4, 'M', u'ǥ'), - (0x1E5, 'V'), - (0x1E6, 'M', u'ǧ'), - (0x1E7, 'V'), - (0x1E8, 'M', u'ǩ'), - (0x1E9, 'V'), - (0x1EA, 'M', u'ǫ'), - (0x1EB, 'V'), - (0x1EC, 'M', u'ǭ'), - (0x1ED, 'V'), - (0x1EE, 'M', u'ǯ'), - (0x1EF, 'V'), - (0x1F1, 'M', u'dz'), - (0x1F4, 'M', u'ǵ'), - (0x1F5, 'V'), - (0x1F6, 'M', u'ƕ'), - (0x1F7, 'M', u'ƿ'), - (0x1F8, 'M', u'ǹ'), - (0x1F9, 'V'), - (0x1FA, 'M', u'ǻ'), - (0x1FB, 'V'), - (0x1FC, 'M', u'ǽ'), - (0x1FD, 'V'), - (0x1FE, 'M', u'ǿ'), - (0x1FF, 'V'), - (0x200, 'M', u'ȁ'), - (0x201, 'V'), - (0x202, 'M', u'ȃ'), - (0x203, 'V'), - (0x204, 'M', u'ȅ'), - (0x205, 'V'), - (0x206, 'M', u'ȇ'), - (0x207, 'V'), - (0x208, 'M', u'ȉ'), - (0x209, 'V'), - (0x20A, 'M', u'ȋ'), - (0x20B, 'V'), - (0x20C, 'M', u'ȍ'), - ] - -def _seg_5(): - return [ - (0x20D, 'V'), - (0x20E, 'M', u'ȏ'), - (0x20F, 'V'), - (0x210, 'M', u'ȑ'), - (0x211, 'V'), - (0x212, 'M', u'ȓ'), - (0x213, 'V'), - (0x214, 'M', u'ȕ'), - (0x215, 'V'), - (0x216, 'M', u'ȗ'), - (0x217, 'V'), - (0x218, 'M', u'ș'), - (0x219, 'V'), - (0x21A, 'M', u'ț'), - (0x21B, 'V'), - (0x21C, 'M', u'ȝ'), - (0x21D, 'V'), - (0x21E, 'M', u'ȟ'), - (0x21F, 'V'), - (0x220, 'M', u'ƞ'), - (0x221, 'V'), - (0x222, 'M', u'ȣ'), - (0x223, 'V'), - (0x224, 'M', u'ȥ'), - (0x225, 'V'), - (0x226, 'M', u'ȧ'), - (0x227, 'V'), - (0x228, 'M', u'ȩ'), - (0x229, 'V'), - (0x22A, 'M', u'ȫ'), - (0x22B, 'V'), - (0x22C, 'M', u'ȭ'), - (0x22D, 'V'), - (0x22E, 'M', u'ȯ'), - (0x22F, 'V'), - (0x230, 'M', u'ȱ'), - (0x231, 'V'), - (0x232, 'M', u'ȳ'), - (0x233, 'V'), - (0x23A, 'M', u'ⱥ'), - (0x23B, 'M', u'ȼ'), - (0x23C, 'V'), - (0x23D, 'M', u'ƚ'), - (0x23E, 'M', u'ⱦ'), - (0x23F, 'V'), - (0x241, 'M', u'ɂ'), - (0x242, 'V'), - (0x243, 'M', u'ƀ'), - (0x244, 'M', u'ʉ'), - (0x245, 'M', u'ʌ'), - (0x246, 'M', u'ɇ'), - (0x247, 'V'), - (0x248, 'M', u'ɉ'), - (0x249, 'V'), - (0x24A, 'M', u'ɋ'), - (0x24B, 'V'), - (0x24C, 'M', u'ɍ'), - (0x24D, 'V'), - (0x24E, 'M', u'ɏ'), - (0x24F, 'V'), - (0x2B0, 'M', u'h'), - (0x2B1, 'M', u'ɦ'), - (0x2B2, 'M', u'j'), - (0x2B3, 'M', u'r'), - (0x2B4, 'M', u'ɹ'), - (0x2B5, 'M', u'ɻ'), - (0x2B6, 'M', u'ʁ'), - (0x2B7, 'M', u'w'), - (0x2B8, 'M', u'y'), - (0x2B9, 'V'), - (0x2D8, '3', u' ̆'), - (0x2D9, '3', u' ̇'), - (0x2DA, '3', u' ̊'), - (0x2DB, '3', u' ̨'), - (0x2DC, '3', u' ̃'), - (0x2DD, '3', u' ̋'), - (0x2DE, 'V'), - (0x2E0, 'M', u'ɣ'), - (0x2E1, 'M', u'l'), - (0x2E2, 'M', u's'), - (0x2E3, 'M', u'x'), - (0x2E4, 'M', u'ʕ'), - (0x2E5, 'V'), - (0x340, 'M', u'̀'), - (0x341, 'M', u'́'), - (0x342, 'V'), - (0x343, 'M', u'̓'), - (0x344, 'M', u'̈́'), - (0x345, 'M', u'ι'), - (0x346, 'V'), - (0x34F, 'I'), - (0x350, 'V'), - (0x370, 'M', u'ͱ'), - (0x371, 'V'), - (0x372, 'M', u'ͳ'), - (0x373, 'V'), - (0x374, 'M', u'ʹ'), - (0x375, 'V'), - (0x376, 'M', u'ͷ'), - (0x377, 'V'), - ] - -def _seg_6(): - return [ - (0x378, 'X'), - (0x37A, '3', u' ι'), - (0x37B, 'V'), - (0x37E, '3', u';'), - (0x37F, 'M', u'ϳ'), - (0x380, 'X'), - (0x384, '3', u' ́'), - (0x385, '3', u' ̈́'), - (0x386, 'M', u'ά'), - (0x387, 'M', u'·'), - (0x388, 'M', u'έ'), - (0x389, 'M', u'ή'), - (0x38A, 'M', u'ί'), - (0x38B, 'X'), - (0x38C, 'M', u'ό'), - (0x38D, 'X'), - (0x38E, 'M', u'ύ'), - (0x38F, 'M', u'ώ'), - (0x390, 'V'), - (0x391, 'M', u'α'), - (0x392, 'M', u'β'), - (0x393, 'M', u'γ'), - (0x394, 'M', u'δ'), - (0x395, 'M', u'ε'), - (0x396, 'M', u'ζ'), - (0x397, 'M', u'η'), - (0x398, 'M', u'θ'), - (0x399, 'M', u'ι'), - (0x39A, 'M', u'κ'), - (0x39B, 'M', u'λ'), - (0x39C, 'M', u'μ'), - (0x39D, 'M', u'ν'), - (0x39E, 'M', u'ξ'), - (0x39F, 'M', u'ο'), - (0x3A0, 'M', u'π'), - (0x3A1, 'M', u'ρ'), - (0x3A2, 'X'), - (0x3A3, 'M', u'σ'), - (0x3A4, 'M', u'τ'), - (0x3A5, 'M', u'υ'), - (0x3A6, 'M', u'φ'), - (0x3A7, 'M', u'χ'), - (0x3A8, 'M', u'ψ'), - (0x3A9, 'M', u'ω'), - (0x3AA, 'M', u'ϊ'), - (0x3AB, 'M', u'ϋ'), - (0x3AC, 'V'), - (0x3C2, 'D', u'σ'), - (0x3C3, 'V'), - (0x3CF, 'M', u'ϗ'), - (0x3D0, 'M', u'β'), - (0x3D1, 'M', u'θ'), - (0x3D2, 'M', u'υ'), - (0x3D3, 'M', u'ύ'), - (0x3D4, 'M', u'ϋ'), - (0x3D5, 'M', u'φ'), - (0x3D6, 'M', u'π'), - (0x3D7, 'V'), - (0x3D8, 'M', u'ϙ'), - (0x3D9, 'V'), - (0x3DA, 'M', u'ϛ'), - (0x3DB, 'V'), - (0x3DC, 'M', u'ϝ'), - (0x3DD, 'V'), - (0x3DE, 'M', u'ϟ'), - (0x3DF, 'V'), - (0x3E0, 'M', u'ϡ'), - (0x3E1, 'V'), - (0x3E2, 'M', u'ϣ'), - (0x3E3, 'V'), - (0x3E4, 'M', u'ϥ'), - (0x3E5, 'V'), - (0x3E6, 'M', u'ϧ'), - (0x3E7, 'V'), - (0x3E8, 'M', u'ϩ'), - (0x3E9, 'V'), - (0x3EA, 'M', u'ϫ'), - (0x3EB, 'V'), - (0x3EC, 'M', u'ϭ'), - (0x3ED, 'V'), - (0x3EE, 'M', u'ϯ'), - (0x3EF, 'V'), - (0x3F0, 'M', u'κ'), - (0x3F1, 'M', u'ρ'), - (0x3F2, 'M', u'σ'), - (0x3F3, 'V'), - (0x3F4, 'M', u'θ'), - (0x3F5, 'M', u'ε'), - (0x3F6, 'V'), - (0x3F7, 'M', u'ϸ'), - (0x3F8, 'V'), - (0x3F9, 'M', u'σ'), - (0x3FA, 'M', u'ϻ'), - (0x3FB, 'V'), - (0x3FD, 'M', u'ͻ'), - (0x3FE, 'M', u'ͼ'), - (0x3FF, 'M', u'ͽ'), - (0x400, 'M', u'ѐ'), - (0x401, 'M', u'ё'), - (0x402, 'M', u'ђ'), - ] - -def _seg_7(): - return [ - (0x403, 'M', u'ѓ'), - (0x404, 'M', u'є'), - (0x405, 'M', u'ѕ'), - (0x406, 'M', u'і'), - (0x407, 'M', u'ї'), - (0x408, 'M', u'ј'), - (0x409, 'M', u'љ'), - (0x40A, 'M', u'њ'), - (0x40B, 'M', u'ћ'), - (0x40C, 'M', u'ќ'), - (0x40D, 'M', u'ѝ'), - (0x40E, 'M', u'ў'), - (0x40F, 'M', u'џ'), - (0x410, 'M', u'а'), - (0x411, 'M', u'б'), - (0x412, 'M', u'в'), - (0x413, 'M', u'г'), - (0x414, 'M', u'д'), - (0x415, 'M', u'е'), - (0x416, 'M', u'ж'), - (0x417, 'M', u'з'), - (0x418, 'M', u'и'), - (0x419, 'M', u'й'), - (0x41A, 'M', u'к'), - (0x41B, 'M', u'л'), - (0x41C, 'M', u'м'), - (0x41D, 'M', u'н'), - (0x41E, 'M', u'о'), - (0x41F, 'M', u'п'), - (0x420, 'M', u'р'), - (0x421, 'M', u'с'), - (0x422, 'M', u'т'), - (0x423, 'M', u'у'), - (0x424, 'M', u'ф'), - (0x425, 'M', u'х'), - (0x426, 'M', u'ц'), - (0x427, 'M', u'ч'), - (0x428, 'M', u'ш'), - (0x429, 'M', u'щ'), - (0x42A, 'M', u'ъ'), - (0x42B, 'M', u'ы'), - (0x42C, 'M', u'ь'), - (0x42D, 'M', u'э'), - (0x42E, 'M', u'ю'), - (0x42F, 'M', u'я'), - (0x430, 'V'), - (0x460, 'M', u'ѡ'), - (0x461, 'V'), - (0x462, 'M', u'ѣ'), - (0x463, 'V'), - (0x464, 'M', u'ѥ'), - (0x465, 'V'), - (0x466, 'M', u'ѧ'), - (0x467, 'V'), - (0x468, 'M', u'ѩ'), - (0x469, 'V'), - (0x46A, 'M', u'ѫ'), - (0x46B, 'V'), - (0x46C, 'M', u'ѭ'), - (0x46D, 'V'), - (0x46E, 'M', u'ѯ'), - (0x46F, 'V'), - (0x470, 'M', u'ѱ'), - (0x471, 'V'), - (0x472, 'M', u'ѳ'), - (0x473, 'V'), - (0x474, 'M', u'ѵ'), - (0x475, 'V'), - (0x476, 'M', u'ѷ'), - (0x477, 'V'), - (0x478, 'M', u'ѹ'), - (0x479, 'V'), - (0x47A, 'M', u'ѻ'), - (0x47B, 'V'), - (0x47C, 'M', u'ѽ'), - (0x47D, 'V'), - (0x47E, 'M', u'ѿ'), - (0x47F, 'V'), - (0x480, 'M', u'ҁ'), - (0x481, 'V'), - (0x48A, 'M', u'ҋ'), - (0x48B, 'V'), - (0x48C, 'M', u'ҍ'), - (0x48D, 'V'), - (0x48E, 'M', u'ҏ'), - (0x48F, 'V'), - (0x490, 'M', u'ґ'), - (0x491, 'V'), - (0x492, 'M', u'ғ'), - (0x493, 'V'), - (0x494, 'M', u'ҕ'), - (0x495, 'V'), - (0x496, 'M', u'җ'), - (0x497, 'V'), - (0x498, 'M', u'ҙ'), - (0x499, 'V'), - (0x49A, 'M', u'қ'), - (0x49B, 'V'), - (0x49C, 'M', u'ҝ'), - (0x49D, 'V'), - ] - -def _seg_8(): - return [ - (0x49E, 'M', u'ҟ'), - (0x49F, 'V'), - (0x4A0, 'M', u'ҡ'), - (0x4A1, 'V'), - (0x4A2, 'M', u'ң'), - (0x4A3, 'V'), - (0x4A4, 'M', u'ҥ'), - (0x4A5, 'V'), - (0x4A6, 'M', u'ҧ'), - (0x4A7, 'V'), - (0x4A8, 'M', u'ҩ'), - (0x4A9, 'V'), - (0x4AA, 'M', u'ҫ'), - (0x4AB, 'V'), - (0x4AC, 'M', u'ҭ'), - (0x4AD, 'V'), - (0x4AE, 'M', u'ү'), - (0x4AF, 'V'), - (0x4B0, 'M', u'ұ'), - (0x4B1, 'V'), - (0x4B2, 'M', u'ҳ'), - (0x4B3, 'V'), - (0x4B4, 'M', u'ҵ'), - (0x4B5, 'V'), - (0x4B6, 'M', u'ҷ'), - (0x4B7, 'V'), - (0x4B8, 'M', u'ҹ'), - (0x4B9, 'V'), - (0x4BA, 'M', u'һ'), - (0x4BB, 'V'), - (0x4BC, 'M', u'ҽ'), - (0x4BD, 'V'), - (0x4BE, 'M', u'ҿ'), - (0x4BF, 'V'), - (0x4C0, 'X'), - (0x4C1, 'M', u'ӂ'), - (0x4C2, 'V'), - (0x4C3, 'M', u'ӄ'), - (0x4C4, 'V'), - (0x4C5, 'M', u'ӆ'), - (0x4C6, 'V'), - (0x4C7, 'M', u'ӈ'), - (0x4C8, 'V'), - (0x4C9, 'M', u'ӊ'), - (0x4CA, 'V'), - (0x4CB, 'M', u'ӌ'), - (0x4CC, 'V'), - (0x4CD, 'M', u'ӎ'), - (0x4CE, 'V'), - (0x4D0, 'M', u'ӑ'), - (0x4D1, 'V'), - (0x4D2, 'M', u'ӓ'), - (0x4D3, 'V'), - (0x4D4, 'M', u'ӕ'), - (0x4D5, 'V'), - (0x4D6, 'M', u'ӗ'), - (0x4D7, 'V'), - (0x4D8, 'M', u'ә'), - (0x4D9, 'V'), - (0x4DA, 'M', u'ӛ'), - (0x4DB, 'V'), - (0x4DC, 'M', u'ӝ'), - (0x4DD, 'V'), - (0x4DE, 'M', u'ӟ'), - (0x4DF, 'V'), - (0x4E0, 'M', u'ӡ'), - (0x4E1, 'V'), - (0x4E2, 'M', u'ӣ'), - (0x4E3, 'V'), - (0x4E4, 'M', u'ӥ'), - (0x4E5, 'V'), - (0x4E6, 'M', u'ӧ'), - (0x4E7, 'V'), - (0x4E8, 'M', u'ө'), - (0x4E9, 'V'), - (0x4EA, 'M', u'ӫ'), - (0x4EB, 'V'), - (0x4EC, 'M', u'ӭ'), - (0x4ED, 'V'), - (0x4EE, 'M', u'ӯ'), - (0x4EF, 'V'), - (0x4F0, 'M', u'ӱ'), - (0x4F1, 'V'), - (0x4F2, 'M', u'ӳ'), - (0x4F3, 'V'), - (0x4F4, 'M', u'ӵ'), - (0x4F5, 'V'), - (0x4F6, 'M', u'ӷ'), - (0x4F7, 'V'), - (0x4F8, 'M', u'ӹ'), - (0x4F9, 'V'), - (0x4FA, 'M', u'ӻ'), - (0x4FB, 'V'), - (0x4FC, 'M', u'ӽ'), - (0x4FD, 'V'), - (0x4FE, 'M', u'ӿ'), - (0x4FF, 'V'), - (0x500, 'M', u'ԁ'), - (0x501, 'V'), - (0x502, 'M', u'ԃ'), - ] - -def _seg_9(): - return [ - (0x503, 'V'), - (0x504, 'M', u'ԅ'), - (0x505, 'V'), - (0x506, 'M', u'ԇ'), - (0x507, 'V'), - (0x508, 'M', u'ԉ'), - (0x509, 'V'), - (0x50A, 'M', u'ԋ'), - (0x50B, 'V'), - (0x50C, 'M', u'ԍ'), - (0x50D, 'V'), - (0x50E, 'M', u'ԏ'), - (0x50F, 'V'), - (0x510, 'M', u'ԑ'), - (0x511, 'V'), - (0x512, 'M', u'ԓ'), - (0x513, 'V'), - (0x514, 'M', u'ԕ'), - (0x515, 'V'), - (0x516, 'M', u'ԗ'), - (0x517, 'V'), - (0x518, 'M', u'ԙ'), - (0x519, 'V'), - (0x51A, 'M', u'ԛ'), - (0x51B, 'V'), - (0x51C, 'M', u'ԝ'), - (0x51D, 'V'), - (0x51E, 'M', u'ԟ'), - (0x51F, 'V'), - (0x520, 'M', u'ԡ'), - (0x521, 'V'), - (0x522, 'M', u'ԣ'), - (0x523, 'V'), - (0x524, 'M', u'ԥ'), - (0x525, 'V'), - (0x526, 'M', u'ԧ'), - (0x527, 'V'), - (0x528, 'M', u'ԩ'), - (0x529, 'V'), - (0x52A, 'M', u'ԫ'), - (0x52B, 'V'), - (0x52C, 'M', u'ԭ'), - (0x52D, 'V'), - (0x52E, 'M', u'ԯ'), - (0x52F, 'V'), - (0x530, 'X'), - (0x531, 'M', u'ա'), - (0x532, 'M', u'բ'), - (0x533, 'M', u'գ'), - (0x534, 'M', u'դ'), - (0x535, 'M', u'ե'), - (0x536, 'M', u'զ'), - (0x537, 'M', u'է'), - (0x538, 'M', u'ը'), - (0x539, 'M', u'թ'), - (0x53A, 'M', u'ժ'), - (0x53B, 'M', u'ի'), - (0x53C, 'M', u'լ'), - (0x53D, 'M', u'խ'), - (0x53E, 'M', u'ծ'), - (0x53F, 'M', u'կ'), - (0x540, 'M', u'հ'), - (0x541, 'M', u'ձ'), - (0x542, 'M', u'ղ'), - (0x543, 'M', u'ճ'), - (0x544, 'M', u'մ'), - (0x545, 'M', u'յ'), - (0x546, 'M', u'ն'), - (0x547, 'M', u'շ'), - (0x548, 'M', u'ո'), - (0x549, 'M', u'չ'), - (0x54A, 'M', u'պ'), - (0x54B, 'M', u'ջ'), - (0x54C, 'M', u'ռ'), - (0x54D, 'M', u'ս'), - (0x54E, 'M', u'վ'), - (0x54F, 'M', u'տ'), - (0x550, 'M', u'ր'), - (0x551, 'M', u'ց'), - (0x552, 'M', u'ւ'), - (0x553, 'M', u'փ'), - (0x554, 'M', u'ք'), - (0x555, 'M', u'օ'), - (0x556, 'M', u'ֆ'), - (0x557, 'X'), - (0x559, 'V'), - (0x587, 'M', u'եւ'), - (0x588, 'V'), - (0x58B, 'X'), - (0x58D, 'V'), - (0x590, 'X'), - (0x591, 'V'), - (0x5C8, 'X'), - (0x5D0, 'V'), - (0x5EB, 'X'), - (0x5EF, 'V'), - (0x5F5, 'X'), - (0x606, 'V'), - (0x61C, 'X'), - (0x61E, 'V'), - ] - -def _seg_10(): - return [ - (0x675, 'M', u'اٴ'), - (0x676, 'M', u'وٴ'), - (0x677, 'M', u'ۇٴ'), - (0x678, 'M', u'يٴ'), - (0x679, 'V'), - (0x6DD, 'X'), - (0x6DE, 'V'), - (0x70E, 'X'), - (0x710, 'V'), - (0x74B, 'X'), - (0x74D, 'V'), - (0x7B2, 'X'), - (0x7C0, 'V'), - (0x7FB, 'X'), - (0x7FD, 'V'), - (0x82E, 'X'), - (0x830, 'V'), - (0x83F, 'X'), - (0x840, 'V'), - (0x85C, 'X'), - (0x85E, 'V'), - (0x85F, 'X'), - (0x860, 'V'), - (0x86B, 'X'), - (0x8A0, 'V'), - (0x8B5, 'X'), - (0x8B6, 'V'), - (0x8BE, 'X'), - (0x8D3, 'V'), - (0x8E2, 'X'), - (0x8E3, 'V'), - (0x958, 'M', u'क़'), - (0x959, 'M', u'ख़'), - (0x95A, 'M', u'ग़'), - (0x95B, 'M', u'ज़'), - (0x95C, 'M', u'ड़'), - (0x95D, 'M', u'ढ़'), - (0x95E, 'M', u'फ़'), - (0x95F, 'M', u'य़'), - (0x960, 'V'), - (0x984, 'X'), - (0x985, 'V'), - (0x98D, 'X'), - (0x98F, 'V'), - (0x991, 'X'), - (0x993, 'V'), - (0x9A9, 'X'), - (0x9AA, 'V'), - (0x9B1, 'X'), - (0x9B2, 'V'), - (0x9B3, 'X'), - (0x9B6, 'V'), - (0x9BA, 'X'), - (0x9BC, 'V'), - (0x9C5, 'X'), - (0x9C7, 'V'), - (0x9C9, 'X'), - (0x9CB, 'V'), - (0x9CF, 'X'), - (0x9D7, 'V'), - (0x9D8, 'X'), - (0x9DC, 'M', u'ড়'), - (0x9DD, 'M', u'ঢ়'), - (0x9DE, 'X'), - (0x9DF, 'M', u'য়'), - (0x9E0, 'V'), - (0x9E4, 'X'), - (0x9E6, 'V'), - (0x9FF, 'X'), - (0xA01, 'V'), - (0xA04, 'X'), - (0xA05, 'V'), - (0xA0B, 'X'), - (0xA0F, 'V'), - (0xA11, 'X'), - (0xA13, 'V'), - (0xA29, 'X'), - (0xA2A, 'V'), - (0xA31, 'X'), - (0xA32, 'V'), - (0xA33, 'M', u'ਲ਼'), - (0xA34, 'X'), - (0xA35, 'V'), - (0xA36, 'M', u'ਸ਼'), - (0xA37, 'X'), - (0xA38, 'V'), - (0xA3A, 'X'), - (0xA3C, 'V'), - (0xA3D, 'X'), - (0xA3E, 'V'), - (0xA43, 'X'), - (0xA47, 'V'), - (0xA49, 'X'), - (0xA4B, 'V'), - (0xA4E, 'X'), - (0xA51, 'V'), - (0xA52, 'X'), - (0xA59, 'M', u'ਖ਼'), - (0xA5A, 'M', u'ਗ਼'), - (0xA5B, 'M', u'ਜ਼'), - ] - -def _seg_11(): - return [ - (0xA5C, 'V'), - (0xA5D, 'X'), - (0xA5E, 'M', u'ਫ਼'), - (0xA5F, 'X'), - (0xA66, 'V'), - (0xA77, 'X'), - (0xA81, 'V'), - (0xA84, 'X'), - (0xA85, 'V'), - (0xA8E, 'X'), - (0xA8F, 'V'), - (0xA92, 'X'), - (0xA93, 'V'), - (0xAA9, 'X'), - (0xAAA, 'V'), - (0xAB1, 'X'), - (0xAB2, 'V'), - (0xAB4, 'X'), - (0xAB5, 'V'), - (0xABA, 'X'), - (0xABC, 'V'), - (0xAC6, 'X'), - (0xAC7, 'V'), - (0xACA, 'X'), - (0xACB, 'V'), - (0xACE, 'X'), - (0xAD0, 'V'), - (0xAD1, 'X'), - (0xAE0, 'V'), - (0xAE4, 'X'), - (0xAE6, 'V'), - (0xAF2, 'X'), - (0xAF9, 'V'), - (0xB00, 'X'), - (0xB01, 'V'), - (0xB04, 'X'), - (0xB05, 'V'), - (0xB0D, 'X'), - (0xB0F, 'V'), - (0xB11, 'X'), - (0xB13, 'V'), - (0xB29, 'X'), - (0xB2A, 'V'), - (0xB31, 'X'), - (0xB32, 'V'), - (0xB34, 'X'), - (0xB35, 'V'), - (0xB3A, 'X'), - (0xB3C, 'V'), - (0xB45, 'X'), - (0xB47, 'V'), - (0xB49, 'X'), - (0xB4B, 'V'), - (0xB4E, 'X'), - (0xB56, 'V'), - (0xB58, 'X'), - (0xB5C, 'M', u'ଡ଼'), - (0xB5D, 'M', u'ଢ଼'), - (0xB5E, 'X'), - (0xB5F, 'V'), - (0xB64, 'X'), - (0xB66, 'V'), - (0xB78, 'X'), - (0xB82, 'V'), - (0xB84, 'X'), - (0xB85, 'V'), - (0xB8B, 'X'), - (0xB8E, 'V'), - (0xB91, 'X'), - (0xB92, 'V'), - (0xB96, 'X'), - (0xB99, 'V'), - (0xB9B, 'X'), - (0xB9C, 'V'), - (0xB9D, 'X'), - (0xB9E, 'V'), - (0xBA0, 'X'), - (0xBA3, 'V'), - (0xBA5, 'X'), - (0xBA8, 'V'), - (0xBAB, 'X'), - (0xBAE, 'V'), - (0xBBA, 'X'), - (0xBBE, 'V'), - (0xBC3, 'X'), - (0xBC6, 'V'), - (0xBC9, 'X'), - (0xBCA, 'V'), - (0xBCE, 'X'), - (0xBD0, 'V'), - (0xBD1, 'X'), - (0xBD7, 'V'), - (0xBD8, 'X'), - (0xBE6, 'V'), - (0xBFB, 'X'), - (0xC00, 'V'), - (0xC0D, 'X'), - (0xC0E, 'V'), - (0xC11, 'X'), - (0xC12, 'V'), - ] - -def _seg_12(): - return [ - (0xC29, 'X'), - (0xC2A, 'V'), - (0xC3A, 'X'), - (0xC3D, 'V'), - (0xC45, 'X'), - (0xC46, 'V'), - (0xC49, 'X'), - (0xC4A, 'V'), - (0xC4E, 'X'), - (0xC55, 'V'), - (0xC57, 'X'), - (0xC58, 'V'), - (0xC5B, 'X'), - (0xC60, 'V'), - (0xC64, 'X'), - (0xC66, 'V'), - (0xC70, 'X'), - (0xC78, 'V'), - (0xC8D, 'X'), - (0xC8E, 'V'), - (0xC91, 'X'), - (0xC92, 'V'), - (0xCA9, 'X'), - (0xCAA, 'V'), - (0xCB4, 'X'), - (0xCB5, 'V'), - (0xCBA, 'X'), - (0xCBC, 'V'), - (0xCC5, 'X'), - (0xCC6, 'V'), - (0xCC9, 'X'), - (0xCCA, 'V'), - (0xCCE, 'X'), - (0xCD5, 'V'), - (0xCD7, 'X'), - (0xCDE, 'V'), - (0xCDF, 'X'), - (0xCE0, 'V'), - (0xCE4, 'X'), - (0xCE6, 'V'), - (0xCF0, 'X'), - (0xCF1, 'V'), - (0xCF3, 'X'), - (0xD00, 'V'), - (0xD04, 'X'), - (0xD05, 'V'), - (0xD0D, 'X'), - (0xD0E, 'V'), - (0xD11, 'X'), - (0xD12, 'V'), - (0xD45, 'X'), - (0xD46, 'V'), - (0xD49, 'X'), - (0xD4A, 'V'), - (0xD50, 'X'), - (0xD54, 'V'), - (0xD64, 'X'), - (0xD66, 'V'), - (0xD80, 'X'), - (0xD82, 'V'), - (0xD84, 'X'), - (0xD85, 'V'), - (0xD97, 'X'), - (0xD9A, 'V'), - (0xDB2, 'X'), - (0xDB3, 'V'), - (0xDBC, 'X'), - (0xDBD, 'V'), - (0xDBE, 'X'), - (0xDC0, 'V'), - (0xDC7, 'X'), - (0xDCA, 'V'), - (0xDCB, 'X'), - (0xDCF, 'V'), - (0xDD5, 'X'), - (0xDD6, 'V'), - (0xDD7, 'X'), - (0xDD8, 'V'), - (0xDE0, 'X'), - (0xDE6, 'V'), - (0xDF0, 'X'), - (0xDF2, 'V'), - (0xDF5, 'X'), - (0xE01, 'V'), - (0xE33, 'M', u'ํา'), - (0xE34, 'V'), - (0xE3B, 'X'), - (0xE3F, 'V'), - (0xE5C, 'X'), - (0xE81, 'V'), - (0xE83, 'X'), - (0xE84, 'V'), - (0xE85, 'X'), - (0xE87, 'V'), - (0xE89, 'X'), - (0xE8A, 'V'), - (0xE8B, 'X'), - (0xE8D, 'V'), - (0xE8E, 'X'), - (0xE94, 'V'), - ] - -def _seg_13(): - return [ - (0xE98, 'X'), - (0xE99, 'V'), - (0xEA0, 'X'), - (0xEA1, 'V'), - (0xEA4, 'X'), - (0xEA5, 'V'), - (0xEA6, 'X'), - (0xEA7, 'V'), - (0xEA8, 'X'), - (0xEAA, 'V'), - (0xEAC, 'X'), - (0xEAD, 'V'), - (0xEB3, 'M', u'ໍາ'), - (0xEB4, 'V'), - (0xEBA, 'X'), - (0xEBB, 'V'), - (0xEBE, 'X'), - (0xEC0, 'V'), - (0xEC5, 'X'), - (0xEC6, 'V'), - (0xEC7, 'X'), - (0xEC8, 'V'), - (0xECE, 'X'), - (0xED0, 'V'), - (0xEDA, 'X'), - (0xEDC, 'M', u'ຫນ'), - (0xEDD, 'M', u'ຫມ'), - (0xEDE, 'V'), - (0xEE0, 'X'), - (0xF00, 'V'), - (0xF0C, 'M', u'་'), - (0xF0D, 'V'), - (0xF43, 'M', u'གྷ'), - (0xF44, 'V'), - (0xF48, 'X'), - (0xF49, 'V'), - (0xF4D, 'M', u'ཌྷ'), - (0xF4E, 'V'), - (0xF52, 'M', u'དྷ'), - (0xF53, 'V'), - (0xF57, 'M', u'བྷ'), - (0xF58, 'V'), - (0xF5C, 'M', u'ཛྷ'), - (0xF5D, 'V'), - (0xF69, 'M', u'ཀྵ'), - (0xF6A, 'V'), - (0xF6D, 'X'), - (0xF71, 'V'), - (0xF73, 'M', u'ཱི'), - (0xF74, 'V'), - (0xF75, 'M', u'ཱུ'), - (0xF76, 'M', u'ྲྀ'), - (0xF77, 'M', u'ྲཱྀ'), - (0xF78, 'M', u'ླྀ'), - (0xF79, 'M', u'ླཱྀ'), - (0xF7A, 'V'), - (0xF81, 'M', u'ཱྀ'), - (0xF82, 'V'), - (0xF93, 'M', u'ྒྷ'), - (0xF94, 'V'), - (0xF98, 'X'), - (0xF99, 'V'), - (0xF9D, 'M', u'ྜྷ'), - (0xF9E, 'V'), - (0xFA2, 'M', u'ྡྷ'), - (0xFA3, 'V'), - (0xFA7, 'M', u'ྦྷ'), - (0xFA8, 'V'), - (0xFAC, 'M', u'ྫྷ'), - (0xFAD, 'V'), - (0xFB9, 'M', u'ྐྵ'), - (0xFBA, 'V'), - (0xFBD, 'X'), - (0xFBE, 'V'), - (0xFCD, 'X'), - (0xFCE, 'V'), - (0xFDB, 'X'), - (0x1000, 'V'), - (0x10A0, 'X'), - (0x10C7, 'M', u'ⴧ'), - (0x10C8, 'X'), - (0x10CD, 'M', u'ⴭ'), - (0x10CE, 'X'), - (0x10D0, 'V'), - (0x10FC, 'M', u'ნ'), - (0x10FD, 'V'), - (0x115F, 'X'), - (0x1161, 'V'), - (0x1249, 'X'), - (0x124A, 'V'), - (0x124E, 'X'), - (0x1250, 'V'), - (0x1257, 'X'), - (0x1258, 'V'), - (0x1259, 'X'), - (0x125A, 'V'), - (0x125E, 'X'), - (0x1260, 'V'), - (0x1289, 'X'), - (0x128A, 'V'), - ] - -def _seg_14(): - return [ - (0x128E, 'X'), - (0x1290, 'V'), - (0x12B1, 'X'), - (0x12B2, 'V'), - (0x12B6, 'X'), - (0x12B8, 'V'), - (0x12BF, 'X'), - (0x12C0, 'V'), - (0x12C1, 'X'), - (0x12C2, 'V'), - (0x12C6, 'X'), - (0x12C8, 'V'), - (0x12D7, 'X'), - (0x12D8, 'V'), - (0x1311, 'X'), - (0x1312, 'V'), - (0x1316, 'X'), - (0x1318, 'V'), - (0x135B, 'X'), - (0x135D, 'V'), - (0x137D, 'X'), - (0x1380, 'V'), - (0x139A, 'X'), - (0x13A0, 'V'), - (0x13F6, 'X'), - (0x13F8, 'M', u'Ᏸ'), - (0x13F9, 'M', u'Ᏹ'), - (0x13FA, 'M', u'Ᏺ'), - (0x13FB, 'M', u'Ᏻ'), - (0x13FC, 'M', u'Ᏼ'), - (0x13FD, 'M', u'Ᏽ'), - (0x13FE, 'X'), - (0x1400, 'V'), - (0x1680, 'X'), - (0x1681, 'V'), - (0x169D, 'X'), - (0x16A0, 'V'), - (0x16F9, 'X'), - (0x1700, 'V'), - (0x170D, 'X'), - (0x170E, 'V'), - (0x1715, 'X'), - (0x1720, 'V'), - (0x1737, 'X'), - (0x1740, 'V'), - (0x1754, 'X'), - (0x1760, 'V'), - (0x176D, 'X'), - (0x176E, 'V'), - (0x1771, 'X'), - (0x1772, 'V'), - (0x1774, 'X'), - (0x1780, 'V'), - (0x17B4, 'X'), - (0x17B6, 'V'), - (0x17DE, 'X'), - (0x17E0, 'V'), - (0x17EA, 'X'), - (0x17F0, 'V'), - (0x17FA, 'X'), - (0x1800, 'V'), - (0x1806, 'X'), - (0x1807, 'V'), - (0x180B, 'I'), - (0x180E, 'X'), - (0x1810, 'V'), - (0x181A, 'X'), - (0x1820, 'V'), - (0x1879, 'X'), - (0x1880, 'V'), - (0x18AB, 'X'), - (0x18B0, 'V'), - (0x18F6, 'X'), - (0x1900, 'V'), - (0x191F, 'X'), - (0x1920, 'V'), - (0x192C, 'X'), - (0x1930, 'V'), - (0x193C, 'X'), - (0x1940, 'V'), - (0x1941, 'X'), - (0x1944, 'V'), - (0x196E, 'X'), - (0x1970, 'V'), - (0x1975, 'X'), - (0x1980, 'V'), - (0x19AC, 'X'), - (0x19B0, 'V'), - (0x19CA, 'X'), - (0x19D0, 'V'), - (0x19DB, 'X'), - (0x19DE, 'V'), - (0x1A1C, 'X'), - (0x1A1E, 'V'), - (0x1A5F, 'X'), - (0x1A60, 'V'), - (0x1A7D, 'X'), - (0x1A7F, 'V'), - (0x1A8A, 'X'), - (0x1A90, 'V'), - ] - -def _seg_15(): - return [ - (0x1A9A, 'X'), - (0x1AA0, 'V'), - (0x1AAE, 'X'), - (0x1AB0, 'V'), - (0x1ABF, 'X'), - (0x1B00, 'V'), - (0x1B4C, 'X'), - (0x1B50, 'V'), - (0x1B7D, 'X'), - (0x1B80, 'V'), - (0x1BF4, 'X'), - (0x1BFC, 'V'), - (0x1C38, 'X'), - (0x1C3B, 'V'), - (0x1C4A, 'X'), - (0x1C4D, 'V'), - (0x1C80, 'M', u'в'), - (0x1C81, 'M', u'д'), - (0x1C82, 'M', u'о'), - (0x1C83, 'M', u'с'), - (0x1C84, 'M', u'т'), - (0x1C86, 'M', u'ъ'), - (0x1C87, 'M', u'ѣ'), - (0x1C88, 'M', u'ꙋ'), - (0x1C89, 'X'), - (0x1CC0, 'V'), - (0x1CC8, 'X'), - (0x1CD0, 'V'), - (0x1CFA, 'X'), - (0x1D00, 'V'), - (0x1D2C, 'M', u'a'), - (0x1D2D, 'M', u'æ'), - (0x1D2E, 'M', u'b'), - (0x1D2F, 'V'), - (0x1D30, 'M', u'd'), - (0x1D31, 'M', u'e'), - (0x1D32, 'M', u'ǝ'), - (0x1D33, 'M', u'g'), - (0x1D34, 'M', u'h'), - (0x1D35, 'M', u'i'), - (0x1D36, 'M', u'j'), - (0x1D37, 'M', u'k'), - (0x1D38, 'M', u'l'), - (0x1D39, 'M', u'm'), - (0x1D3A, 'M', u'n'), - (0x1D3B, 'V'), - (0x1D3C, 'M', u'o'), - (0x1D3D, 'M', u'ȣ'), - (0x1D3E, 'M', u'p'), - (0x1D3F, 'M', u'r'), - (0x1D40, 'M', u't'), - (0x1D41, 'M', u'u'), - (0x1D42, 'M', u'w'), - (0x1D43, 'M', u'a'), - (0x1D44, 'M', u'ɐ'), - (0x1D45, 'M', u'ɑ'), - (0x1D46, 'M', u'ᴂ'), - (0x1D47, 'M', u'b'), - (0x1D48, 'M', u'd'), - (0x1D49, 'M', u'e'), - (0x1D4A, 'M', u'ə'), - (0x1D4B, 'M', u'ɛ'), - (0x1D4C, 'M', u'ɜ'), - (0x1D4D, 'M', u'g'), - (0x1D4E, 'V'), - (0x1D4F, 'M', u'k'), - (0x1D50, 'M', u'm'), - (0x1D51, 'M', u'ŋ'), - (0x1D52, 'M', u'o'), - (0x1D53, 'M', u'ɔ'), - (0x1D54, 'M', u'ᴖ'), - (0x1D55, 'M', u'ᴗ'), - (0x1D56, 'M', u'p'), - (0x1D57, 'M', u't'), - (0x1D58, 'M', u'u'), - (0x1D59, 'M', u'ᴝ'), - (0x1D5A, 'M', u'ɯ'), - (0x1D5B, 'M', u'v'), - (0x1D5C, 'M', u'ᴥ'), - (0x1D5D, 'M', u'β'), - (0x1D5E, 'M', u'γ'), - (0x1D5F, 'M', u'δ'), - (0x1D60, 'M', u'φ'), - (0x1D61, 'M', u'χ'), - (0x1D62, 'M', u'i'), - (0x1D63, 'M', u'r'), - (0x1D64, 'M', u'u'), - (0x1D65, 'M', u'v'), - (0x1D66, 'M', u'β'), - (0x1D67, 'M', u'γ'), - (0x1D68, 'M', u'ρ'), - (0x1D69, 'M', u'φ'), - (0x1D6A, 'M', u'χ'), - (0x1D6B, 'V'), - (0x1D78, 'M', u'н'), - (0x1D79, 'V'), - (0x1D9B, 'M', u'ɒ'), - (0x1D9C, 'M', u'c'), - (0x1D9D, 'M', u'ɕ'), - (0x1D9E, 'M', u'ð'), - ] - -def _seg_16(): - return [ - (0x1D9F, 'M', u'ɜ'), - (0x1DA0, 'M', u'f'), - (0x1DA1, 'M', u'ɟ'), - (0x1DA2, 'M', u'ɡ'), - (0x1DA3, 'M', u'ɥ'), - (0x1DA4, 'M', u'ɨ'), - (0x1DA5, 'M', u'ɩ'), - (0x1DA6, 'M', u'ɪ'), - (0x1DA7, 'M', u'ᵻ'), - (0x1DA8, 'M', u'ʝ'), - (0x1DA9, 'M', u'ɭ'), - (0x1DAA, 'M', u'ᶅ'), - (0x1DAB, 'M', u'ʟ'), - (0x1DAC, 'M', u'ɱ'), - (0x1DAD, 'M', u'ɰ'), - (0x1DAE, 'M', u'ɲ'), - (0x1DAF, 'M', u'ɳ'), - (0x1DB0, 'M', u'ɴ'), - (0x1DB1, 'M', u'ɵ'), - (0x1DB2, 'M', u'ɸ'), - (0x1DB3, 'M', u'ʂ'), - (0x1DB4, 'M', u'ʃ'), - (0x1DB5, 'M', u'ƫ'), - (0x1DB6, 'M', u'ʉ'), - (0x1DB7, 'M', u'ʊ'), - (0x1DB8, 'M', u'ᴜ'), - (0x1DB9, 'M', u'ʋ'), - (0x1DBA, 'M', u'ʌ'), - (0x1DBB, 'M', u'z'), - (0x1DBC, 'M', u'ʐ'), - (0x1DBD, 'M', u'ʑ'), - (0x1DBE, 'M', u'ʒ'), - (0x1DBF, 'M', u'θ'), - (0x1DC0, 'V'), - (0x1DFA, 'X'), - (0x1DFB, 'V'), - (0x1E00, 'M', u'ḁ'), - (0x1E01, 'V'), - (0x1E02, 'M', u'ḃ'), - (0x1E03, 'V'), - (0x1E04, 'M', u'ḅ'), - (0x1E05, 'V'), - (0x1E06, 'M', u'ḇ'), - (0x1E07, 'V'), - (0x1E08, 'M', u'ḉ'), - (0x1E09, 'V'), - (0x1E0A, 'M', u'ḋ'), - (0x1E0B, 'V'), - (0x1E0C, 'M', u'ḍ'), - (0x1E0D, 'V'), - (0x1E0E, 'M', u'ḏ'), - (0x1E0F, 'V'), - (0x1E10, 'M', u'ḑ'), - (0x1E11, 'V'), - (0x1E12, 'M', u'ḓ'), - (0x1E13, 'V'), - (0x1E14, 'M', u'ḕ'), - (0x1E15, 'V'), - (0x1E16, 'M', u'ḗ'), - (0x1E17, 'V'), - (0x1E18, 'M', u'ḙ'), - (0x1E19, 'V'), - (0x1E1A, 'M', u'ḛ'), - (0x1E1B, 'V'), - (0x1E1C, 'M', u'ḝ'), - (0x1E1D, 'V'), - (0x1E1E, 'M', u'ḟ'), - (0x1E1F, 'V'), - (0x1E20, 'M', u'ḡ'), - (0x1E21, 'V'), - (0x1E22, 'M', u'ḣ'), - (0x1E23, 'V'), - (0x1E24, 'M', u'ḥ'), - (0x1E25, 'V'), - (0x1E26, 'M', u'ḧ'), - (0x1E27, 'V'), - (0x1E28, 'M', u'ḩ'), - (0x1E29, 'V'), - (0x1E2A, 'M', u'ḫ'), - (0x1E2B, 'V'), - (0x1E2C, 'M', u'ḭ'), - (0x1E2D, 'V'), - (0x1E2E, 'M', u'ḯ'), - (0x1E2F, 'V'), - (0x1E30, 'M', u'ḱ'), - (0x1E31, 'V'), - (0x1E32, 'M', u'ḳ'), - (0x1E33, 'V'), - (0x1E34, 'M', u'ḵ'), - (0x1E35, 'V'), - (0x1E36, 'M', u'ḷ'), - (0x1E37, 'V'), - (0x1E38, 'M', u'ḹ'), - (0x1E39, 'V'), - (0x1E3A, 'M', u'ḻ'), - (0x1E3B, 'V'), - (0x1E3C, 'M', u'ḽ'), - (0x1E3D, 'V'), - (0x1E3E, 'M', u'ḿ'), - (0x1E3F, 'V'), - ] - -def _seg_17(): - return [ - (0x1E40, 'M', u'ṁ'), - (0x1E41, 'V'), - (0x1E42, 'M', u'ṃ'), - (0x1E43, 'V'), - (0x1E44, 'M', u'ṅ'), - (0x1E45, 'V'), - (0x1E46, 'M', u'ṇ'), - (0x1E47, 'V'), - (0x1E48, 'M', u'ṉ'), - (0x1E49, 'V'), - (0x1E4A, 'M', u'ṋ'), - (0x1E4B, 'V'), - (0x1E4C, 'M', u'ṍ'), - (0x1E4D, 'V'), - (0x1E4E, 'M', u'ṏ'), - (0x1E4F, 'V'), - (0x1E50, 'M', u'ṑ'), - (0x1E51, 'V'), - (0x1E52, 'M', u'ṓ'), - (0x1E53, 'V'), - (0x1E54, 'M', u'ṕ'), - (0x1E55, 'V'), - (0x1E56, 'M', u'ṗ'), - (0x1E57, 'V'), - (0x1E58, 'M', u'ṙ'), - (0x1E59, 'V'), - (0x1E5A, 'M', u'ṛ'), - (0x1E5B, 'V'), - (0x1E5C, 'M', u'ṝ'), - (0x1E5D, 'V'), - (0x1E5E, 'M', u'ṟ'), - (0x1E5F, 'V'), - (0x1E60, 'M', u'ṡ'), - (0x1E61, 'V'), - (0x1E62, 'M', u'ṣ'), - (0x1E63, 'V'), - (0x1E64, 'M', u'ṥ'), - (0x1E65, 'V'), - (0x1E66, 'M', u'ṧ'), - (0x1E67, 'V'), - (0x1E68, 'M', u'ṩ'), - (0x1E69, 'V'), - (0x1E6A, 'M', u'ṫ'), - (0x1E6B, 'V'), - (0x1E6C, 'M', u'ṭ'), - (0x1E6D, 'V'), - (0x1E6E, 'M', u'ṯ'), - (0x1E6F, 'V'), - (0x1E70, 'M', u'ṱ'), - (0x1E71, 'V'), - (0x1E72, 'M', u'ṳ'), - (0x1E73, 'V'), - (0x1E74, 'M', u'ṵ'), - (0x1E75, 'V'), - (0x1E76, 'M', u'ṷ'), - (0x1E77, 'V'), - (0x1E78, 'M', u'ṹ'), - (0x1E79, 'V'), - (0x1E7A, 'M', u'ṻ'), - (0x1E7B, 'V'), - (0x1E7C, 'M', u'ṽ'), - (0x1E7D, 'V'), - (0x1E7E, 'M', u'ṿ'), - (0x1E7F, 'V'), - (0x1E80, 'M', u'ẁ'), - (0x1E81, 'V'), - (0x1E82, 'M', u'ẃ'), - (0x1E83, 'V'), - (0x1E84, 'M', u'ẅ'), - (0x1E85, 'V'), - (0x1E86, 'M', u'ẇ'), - (0x1E87, 'V'), - (0x1E88, 'M', u'ẉ'), - (0x1E89, 'V'), - (0x1E8A, 'M', u'ẋ'), - (0x1E8B, 'V'), - (0x1E8C, 'M', u'ẍ'), - (0x1E8D, 'V'), - (0x1E8E, 'M', u'ẏ'), - (0x1E8F, 'V'), - (0x1E90, 'M', u'ẑ'), - (0x1E91, 'V'), - (0x1E92, 'M', u'ẓ'), - (0x1E93, 'V'), - (0x1E94, 'M', u'ẕ'), - (0x1E95, 'V'), - (0x1E9A, 'M', u'aʾ'), - (0x1E9B, 'M', u'ṡ'), - (0x1E9C, 'V'), - (0x1E9E, 'M', u'ss'), - (0x1E9F, 'V'), - (0x1EA0, 'M', u'ạ'), - (0x1EA1, 'V'), - (0x1EA2, 'M', u'ả'), - (0x1EA3, 'V'), - (0x1EA4, 'M', u'ấ'), - (0x1EA5, 'V'), - (0x1EA6, 'M', u'ầ'), - (0x1EA7, 'V'), - (0x1EA8, 'M', u'ẩ'), - ] - -def _seg_18(): - return [ - (0x1EA9, 'V'), - (0x1EAA, 'M', u'ẫ'), - (0x1EAB, 'V'), - (0x1EAC, 'M', u'ậ'), - (0x1EAD, 'V'), - (0x1EAE, 'M', u'ắ'), - (0x1EAF, 'V'), - (0x1EB0, 'M', u'ằ'), - (0x1EB1, 'V'), - (0x1EB2, 'M', u'ẳ'), - (0x1EB3, 'V'), - (0x1EB4, 'M', u'ẵ'), - (0x1EB5, 'V'), - (0x1EB6, 'M', u'ặ'), - (0x1EB7, 'V'), - (0x1EB8, 'M', u'ẹ'), - (0x1EB9, 'V'), - (0x1EBA, 'M', u'ẻ'), - (0x1EBB, 'V'), - (0x1EBC, 'M', u'ẽ'), - (0x1EBD, 'V'), - (0x1EBE, 'M', u'ế'), - (0x1EBF, 'V'), - (0x1EC0, 'M', u'ề'), - (0x1EC1, 'V'), - (0x1EC2, 'M', u'ể'), - (0x1EC3, 'V'), - (0x1EC4, 'M', u'ễ'), - (0x1EC5, 'V'), - (0x1EC6, 'M', u'ệ'), - (0x1EC7, 'V'), - (0x1EC8, 'M', u'ỉ'), - (0x1EC9, 'V'), - (0x1ECA, 'M', u'ị'), - (0x1ECB, 'V'), - (0x1ECC, 'M', u'ọ'), - (0x1ECD, 'V'), - (0x1ECE, 'M', u'ỏ'), - (0x1ECF, 'V'), - (0x1ED0, 'M', u'ố'), - (0x1ED1, 'V'), - (0x1ED2, 'M', u'ồ'), - (0x1ED3, 'V'), - (0x1ED4, 'M', u'ổ'), - (0x1ED5, 'V'), - (0x1ED6, 'M', u'ỗ'), - (0x1ED7, 'V'), - (0x1ED8, 'M', u'ộ'), - (0x1ED9, 'V'), - (0x1EDA, 'M', u'ớ'), - (0x1EDB, 'V'), - (0x1EDC, 'M', u'ờ'), - (0x1EDD, 'V'), - (0x1EDE, 'M', u'ở'), - (0x1EDF, 'V'), - (0x1EE0, 'M', u'ỡ'), - (0x1EE1, 'V'), - (0x1EE2, 'M', u'ợ'), - (0x1EE3, 'V'), - (0x1EE4, 'M', u'ụ'), - (0x1EE5, 'V'), - (0x1EE6, 'M', u'ủ'), - (0x1EE7, 'V'), - (0x1EE8, 'M', u'ứ'), - (0x1EE9, 'V'), - (0x1EEA, 'M', u'ừ'), - (0x1EEB, 'V'), - (0x1EEC, 'M', u'ử'), - (0x1EED, 'V'), - (0x1EEE, 'M', u'ữ'), - (0x1EEF, 'V'), - (0x1EF0, 'M', u'ự'), - (0x1EF1, 'V'), - (0x1EF2, 'M', u'ỳ'), - (0x1EF3, 'V'), - (0x1EF4, 'M', u'ỵ'), - (0x1EF5, 'V'), - (0x1EF6, 'M', u'ỷ'), - (0x1EF7, 'V'), - (0x1EF8, 'M', u'ỹ'), - (0x1EF9, 'V'), - (0x1EFA, 'M', u'ỻ'), - (0x1EFB, 'V'), - (0x1EFC, 'M', u'ỽ'), - (0x1EFD, 'V'), - (0x1EFE, 'M', u'ỿ'), - (0x1EFF, 'V'), - (0x1F08, 'M', u'ἀ'), - (0x1F09, 'M', u'ἁ'), - (0x1F0A, 'M', u'ἂ'), - (0x1F0B, 'M', u'ἃ'), - (0x1F0C, 'M', u'ἄ'), - (0x1F0D, 'M', u'ἅ'), - (0x1F0E, 'M', u'ἆ'), - (0x1F0F, 'M', u'ἇ'), - (0x1F10, 'V'), - (0x1F16, 'X'), - (0x1F18, 'M', u'ἐ'), - (0x1F19, 'M', u'ἑ'), - (0x1F1A, 'M', u'ἒ'), - ] - -def _seg_19(): - return [ - (0x1F1B, 'M', u'ἓ'), - (0x1F1C, 'M', u'ἔ'), - (0x1F1D, 'M', u'ἕ'), - (0x1F1E, 'X'), - (0x1F20, 'V'), - (0x1F28, 'M', u'ἠ'), - (0x1F29, 'M', u'ἡ'), - (0x1F2A, 'M', u'ἢ'), - (0x1F2B, 'M', u'ἣ'), - (0x1F2C, 'M', u'ἤ'), - (0x1F2D, 'M', u'ἥ'), - (0x1F2E, 'M', u'ἦ'), - (0x1F2F, 'M', u'ἧ'), - (0x1F30, 'V'), - (0x1F38, 'M', u'ἰ'), - (0x1F39, 'M', u'ἱ'), - (0x1F3A, 'M', u'ἲ'), - (0x1F3B, 'M', u'ἳ'), - (0x1F3C, 'M', u'ἴ'), - (0x1F3D, 'M', u'ἵ'), - (0x1F3E, 'M', u'ἶ'), - (0x1F3F, 'M', u'ἷ'), - (0x1F40, 'V'), - (0x1F46, 'X'), - (0x1F48, 'M', u'ὀ'), - (0x1F49, 'M', u'ὁ'), - (0x1F4A, 'M', u'ὂ'), - (0x1F4B, 'M', u'ὃ'), - (0x1F4C, 'M', u'ὄ'), - (0x1F4D, 'M', u'ὅ'), - (0x1F4E, 'X'), - (0x1F50, 'V'), - (0x1F58, 'X'), - (0x1F59, 'M', u'ὑ'), - (0x1F5A, 'X'), - (0x1F5B, 'M', u'ὓ'), - (0x1F5C, 'X'), - (0x1F5D, 'M', u'ὕ'), - (0x1F5E, 'X'), - (0x1F5F, 'M', u'ὗ'), - (0x1F60, 'V'), - (0x1F68, 'M', u'ὠ'), - (0x1F69, 'M', u'ὡ'), - (0x1F6A, 'M', u'ὢ'), - (0x1F6B, 'M', u'ὣ'), - (0x1F6C, 'M', u'ὤ'), - (0x1F6D, 'M', u'ὥ'), - (0x1F6E, 'M', u'ὦ'), - (0x1F6F, 'M', u'ὧ'), - (0x1F70, 'V'), - (0x1F71, 'M', u'ά'), - (0x1F72, 'V'), - (0x1F73, 'M', u'έ'), - (0x1F74, 'V'), - (0x1F75, 'M', u'ή'), - (0x1F76, 'V'), - (0x1F77, 'M', u'ί'), - (0x1F78, 'V'), - (0x1F79, 'M', u'ό'), - (0x1F7A, 'V'), - (0x1F7B, 'M', u'ύ'), - (0x1F7C, 'V'), - (0x1F7D, 'M', u'ώ'), - (0x1F7E, 'X'), - (0x1F80, 'M', u'ἀι'), - (0x1F81, 'M', u'ἁι'), - (0x1F82, 'M', u'ἂι'), - (0x1F83, 'M', u'ἃι'), - (0x1F84, 'M', u'ἄι'), - (0x1F85, 'M', u'ἅι'), - (0x1F86, 'M', u'ἆι'), - (0x1F87, 'M', u'ἇι'), - (0x1F88, 'M', u'ἀι'), - (0x1F89, 'M', u'ἁι'), - (0x1F8A, 'M', u'ἂι'), - (0x1F8B, 'M', u'ἃι'), - (0x1F8C, 'M', u'ἄι'), - (0x1F8D, 'M', u'ἅι'), - (0x1F8E, 'M', u'ἆι'), - (0x1F8F, 'M', u'ἇι'), - (0x1F90, 'M', u'ἠι'), - (0x1F91, 'M', u'ἡι'), - (0x1F92, 'M', u'ἢι'), - (0x1F93, 'M', u'ἣι'), - (0x1F94, 'M', u'ἤι'), - (0x1F95, 'M', u'ἥι'), - (0x1F96, 'M', u'ἦι'), - (0x1F97, 'M', u'ἧι'), - (0x1F98, 'M', u'ἠι'), - (0x1F99, 'M', u'ἡι'), - (0x1F9A, 'M', u'ἢι'), - (0x1F9B, 'M', u'ἣι'), - (0x1F9C, 'M', u'ἤι'), - (0x1F9D, 'M', u'ἥι'), - (0x1F9E, 'M', u'ἦι'), - (0x1F9F, 'M', u'ἧι'), - (0x1FA0, 'M', u'ὠι'), - (0x1FA1, 'M', u'ὡι'), - (0x1FA2, 'M', u'ὢι'), - (0x1FA3, 'M', u'ὣι'), - ] - -def _seg_20(): - return [ - (0x1FA4, 'M', u'ὤι'), - (0x1FA5, 'M', u'ὥι'), - (0x1FA6, 'M', u'ὦι'), - (0x1FA7, 'M', u'ὧι'), - (0x1FA8, 'M', u'ὠι'), - (0x1FA9, 'M', u'ὡι'), - (0x1FAA, 'M', u'ὢι'), - (0x1FAB, 'M', u'ὣι'), - (0x1FAC, 'M', u'ὤι'), - (0x1FAD, 'M', u'ὥι'), - (0x1FAE, 'M', u'ὦι'), - (0x1FAF, 'M', u'ὧι'), - (0x1FB0, 'V'), - (0x1FB2, 'M', u'ὰι'), - (0x1FB3, 'M', u'αι'), - (0x1FB4, 'M', u'άι'), - (0x1FB5, 'X'), - (0x1FB6, 'V'), - (0x1FB7, 'M', u'ᾶι'), - (0x1FB8, 'M', u'ᾰ'), - (0x1FB9, 'M', u'ᾱ'), - (0x1FBA, 'M', u'ὰ'), - (0x1FBB, 'M', u'ά'), - (0x1FBC, 'M', u'αι'), - (0x1FBD, '3', u' ̓'), - (0x1FBE, 'M', u'ι'), - (0x1FBF, '3', u' ̓'), - (0x1FC0, '3', u' ͂'), - (0x1FC1, '3', u' ̈͂'), - (0x1FC2, 'M', u'ὴι'), - (0x1FC3, 'M', u'ηι'), - (0x1FC4, 'M', u'ήι'), - (0x1FC5, 'X'), - (0x1FC6, 'V'), - (0x1FC7, 'M', u'ῆι'), - (0x1FC8, 'M', u'ὲ'), - (0x1FC9, 'M', u'έ'), - (0x1FCA, 'M', u'ὴ'), - (0x1FCB, 'M', u'ή'), - (0x1FCC, 'M', u'ηι'), - (0x1FCD, '3', u' ̓̀'), - (0x1FCE, '3', u' ̓́'), - (0x1FCF, '3', u' ̓͂'), - (0x1FD0, 'V'), - (0x1FD3, 'M', u'ΐ'), - (0x1FD4, 'X'), - (0x1FD6, 'V'), - (0x1FD8, 'M', u'ῐ'), - (0x1FD9, 'M', u'ῑ'), - (0x1FDA, 'M', u'ὶ'), - (0x1FDB, 'M', u'ί'), - (0x1FDC, 'X'), - (0x1FDD, '3', u' ̔̀'), - (0x1FDE, '3', u' ̔́'), - (0x1FDF, '3', u' ̔͂'), - (0x1FE0, 'V'), - (0x1FE3, 'M', u'ΰ'), - (0x1FE4, 'V'), - (0x1FE8, 'M', u'ῠ'), - (0x1FE9, 'M', u'ῡ'), - (0x1FEA, 'M', u'ὺ'), - (0x1FEB, 'M', u'ύ'), - (0x1FEC, 'M', u'ῥ'), - (0x1FED, '3', u' ̈̀'), - (0x1FEE, '3', u' ̈́'), - (0x1FEF, '3', u'`'), - (0x1FF0, 'X'), - (0x1FF2, 'M', u'ὼι'), - (0x1FF3, 'M', u'ωι'), - (0x1FF4, 'M', u'ώι'), - (0x1FF5, 'X'), - (0x1FF6, 'V'), - (0x1FF7, 'M', u'ῶι'), - (0x1FF8, 'M', u'ὸ'), - (0x1FF9, 'M', u'ό'), - (0x1FFA, 'M', u'ὼ'), - (0x1FFB, 'M', u'ώ'), - (0x1FFC, 'M', u'ωι'), - (0x1FFD, '3', u' ́'), - (0x1FFE, '3', u' ̔'), - (0x1FFF, 'X'), - (0x2000, '3', u' '), - (0x200B, 'I'), - (0x200C, 'D', u''), - (0x200E, 'X'), - (0x2010, 'V'), - (0x2011, 'M', u'‐'), - (0x2012, 'V'), - (0x2017, '3', u' ̳'), - (0x2018, 'V'), - (0x2024, 'X'), - (0x2027, 'V'), - (0x2028, 'X'), - (0x202F, '3', u' '), - (0x2030, 'V'), - (0x2033, 'M', u'′′'), - (0x2034, 'M', u'′′′'), - (0x2035, 'V'), - (0x2036, 'M', u'‵‵'), - (0x2037, 'M', u'‵‵‵'), - ] - -def _seg_21(): - return [ - (0x2038, 'V'), - (0x203C, '3', u'!!'), - (0x203D, 'V'), - (0x203E, '3', u' ̅'), - (0x203F, 'V'), - (0x2047, '3', u'??'), - (0x2048, '3', u'?!'), - (0x2049, '3', u'!?'), - (0x204A, 'V'), - (0x2057, 'M', u'′′′′'), - (0x2058, 'V'), - (0x205F, '3', u' '), - (0x2060, 'I'), - (0x2061, 'X'), - (0x2064, 'I'), - (0x2065, 'X'), - (0x2070, 'M', u'0'), - (0x2071, 'M', u'i'), - (0x2072, 'X'), - (0x2074, 'M', u'4'), - (0x2075, 'M', u'5'), - (0x2076, 'M', u'6'), - (0x2077, 'M', u'7'), - (0x2078, 'M', u'8'), - (0x2079, 'M', u'9'), - (0x207A, '3', u'+'), - (0x207B, 'M', u'−'), - (0x207C, '3', u'='), - (0x207D, '3', u'('), - (0x207E, '3', u')'), - (0x207F, 'M', u'n'), - (0x2080, 'M', u'0'), - (0x2081, 'M', u'1'), - (0x2082, 'M', u'2'), - (0x2083, 'M', u'3'), - (0x2084, 'M', u'4'), - (0x2085, 'M', u'5'), - (0x2086, 'M', u'6'), - (0x2087, 'M', u'7'), - (0x2088, 'M', u'8'), - (0x2089, 'M', u'9'), - (0x208A, '3', u'+'), - (0x208B, 'M', u'−'), - (0x208C, '3', u'='), - (0x208D, '3', u'('), - (0x208E, '3', u')'), - (0x208F, 'X'), - (0x2090, 'M', u'a'), - (0x2091, 'M', u'e'), - (0x2092, 'M', u'o'), - (0x2093, 'M', u'x'), - (0x2094, 'M', u'ə'), - (0x2095, 'M', u'h'), - (0x2096, 'M', u'k'), - (0x2097, 'M', u'l'), - (0x2098, 'M', u'm'), - (0x2099, 'M', u'n'), - (0x209A, 'M', u'p'), - (0x209B, 'M', u's'), - (0x209C, 'M', u't'), - (0x209D, 'X'), - (0x20A0, 'V'), - (0x20A8, 'M', u'rs'), - (0x20A9, 'V'), - (0x20C0, 'X'), - (0x20D0, 'V'), - (0x20F1, 'X'), - (0x2100, '3', u'a/c'), - (0x2101, '3', u'a/s'), - (0x2102, 'M', u'c'), - (0x2103, 'M', u'°c'), - (0x2104, 'V'), - (0x2105, '3', u'c/o'), - (0x2106, '3', u'c/u'), - (0x2107, 'M', u'ɛ'), - (0x2108, 'V'), - (0x2109, 'M', u'°f'), - (0x210A, 'M', u'g'), - (0x210B, 'M', u'h'), - (0x210F, 'M', u'ħ'), - (0x2110, 'M', u'i'), - (0x2112, 'M', u'l'), - (0x2114, 'V'), - (0x2115, 'M', u'n'), - (0x2116, 'M', u'no'), - (0x2117, 'V'), - (0x2119, 'M', u'p'), - (0x211A, 'M', u'q'), - (0x211B, 'M', u'r'), - (0x211E, 'V'), - (0x2120, 'M', u'sm'), - (0x2121, 'M', u'tel'), - (0x2122, 'M', u'tm'), - (0x2123, 'V'), - (0x2124, 'M', u'z'), - (0x2125, 'V'), - (0x2126, 'M', u'ω'), - (0x2127, 'V'), - (0x2128, 'M', u'z'), - (0x2129, 'V'), - ] - -def _seg_22(): - return [ - (0x212A, 'M', u'k'), - (0x212B, 'M', u'å'), - (0x212C, 'M', u'b'), - (0x212D, 'M', u'c'), - (0x212E, 'V'), - (0x212F, 'M', u'e'), - (0x2131, 'M', u'f'), - (0x2132, 'X'), - (0x2133, 'M', u'm'), - (0x2134, 'M', u'o'), - (0x2135, 'M', u'א'), - (0x2136, 'M', u'ב'), - (0x2137, 'M', u'ג'), - (0x2138, 'M', u'ד'), - (0x2139, 'M', u'i'), - (0x213A, 'V'), - (0x213B, 'M', u'fax'), - (0x213C, 'M', u'π'), - (0x213D, 'M', u'γ'), - (0x213F, 'M', u'π'), - (0x2140, 'M', u'∑'), - (0x2141, 'V'), - (0x2145, 'M', u'd'), - (0x2147, 'M', u'e'), - (0x2148, 'M', u'i'), - (0x2149, 'M', u'j'), - (0x214A, 'V'), - (0x2150, 'M', u'1⁄7'), - (0x2151, 'M', u'1⁄9'), - (0x2152, 'M', u'1⁄10'), - (0x2153, 'M', u'1⁄3'), - (0x2154, 'M', u'2⁄3'), - (0x2155, 'M', u'1⁄5'), - (0x2156, 'M', u'2⁄5'), - (0x2157, 'M', u'3⁄5'), - (0x2158, 'M', u'4⁄5'), - (0x2159, 'M', u'1⁄6'), - (0x215A, 'M', u'5⁄6'), - (0x215B, 'M', u'1⁄8'), - (0x215C, 'M', u'3⁄8'), - (0x215D, 'M', u'5⁄8'), - (0x215E, 'M', u'7⁄8'), - (0x215F, 'M', u'1⁄'), - (0x2160, 'M', u'i'), - (0x2161, 'M', u'ii'), - (0x2162, 'M', u'iii'), - (0x2163, 'M', u'iv'), - (0x2164, 'M', u'v'), - (0x2165, 'M', u'vi'), - (0x2166, 'M', u'vii'), - (0x2167, 'M', u'viii'), - (0x2168, 'M', u'ix'), - (0x2169, 'M', u'x'), - (0x216A, 'M', u'xi'), - (0x216B, 'M', u'xii'), - (0x216C, 'M', u'l'), - (0x216D, 'M', u'c'), - (0x216E, 'M', u'd'), - (0x216F, 'M', u'm'), - (0x2170, 'M', u'i'), - (0x2171, 'M', u'ii'), - (0x2172, 'M', u'iii'), - (0x2173, 'M', u'iv'), - (0x2174, 'M', u'v'), - (0x2175, 'M', u'vi'), - (0x2176, 'M', u'vii'), - (0x2177, 'M', u'viii'), - (0x2178, 'M', u'ix'), - (0x2179, 'M', u'x'), - (0x217A, 'M', u'xi'), - (0x217B, 'M', u'xii'), - (0x217C, 'M', u'l'), - (0x217D, 'M', u'c'), - (0x217E, 'M', u'd'), - (0x217F, 'M', u'm'), - (0x2180, 'V'), - (0x2183, 'X'), - (0x2184, 'V'), - (0x2189, 'M', u'0⁄3'), - (0x218A, 'V'), - (0x218C, 'X'), - (0x2190, 'V'), - (0x222C, 'M', u'∫∫'), - (0x222D, 'M', u'∫∫∫'), - (0x222E, 'V'), - (0x222F, 'M', u'∮∮'), - (0x2230, 'M', u'∮∮∮'), - (0x2231, 'V'), - (0x2260, '3'), - (0x2261, 'V'), - (0x226E, '3'), - (0x2270, 'V'), - (0x2329, 'M', u'〈'), - (0x232A, 'M', u'〉'), - (0x232B, 'V'), - (0x2427, 'X'), - (0x2440, 'V'), - (0x244B, 'X'), - (0x2460, 'M', u'1'), - (0x2461, 'M', u'2'), - ] - -def _seg_23(): - return [ - (0x2462, 'M', u'3'), - (0x2463, 'M', u'4'), - (0x2464, 'M', u'5'), - (0x2465, 'M', u'6'), - (0x2466, 'M', u'7'), - (0x2467, 'M', u'8'), - (0x2468, 'M', u'9'), - (0x2469, 'M', u'10'), - (0x246A, 'M', u'11'), - (0x246B, 'M', u'12'), - (0x246C, 'M', u'13'), - (0x246D, 'M', u'14'), - (0x246E, 'M', u'15'), - (0x246F, 'M', u'16'), - (0x2470, 'M', u'17'), - (0x2471, 'M', u'18'), - (0x2472, 'M', u'19'), - (0x2473, 'M', u'20'), - (0x2474, '3', u'(1)'), - (0x2475, '3', u'(2)'), - (0x2476, '3', u'(3)'), - (0x2477, '3', u'(4)'), - (0x2478, '3', u'(5)'), - (0x2479, '3', u'(6)'), - (0x247A, '3', u'(7)'), - (0x247B, '3', u'(8)'), - (0x247C, '3', u'(9)'), - (0x247D, '3', u'(10)'), - (0x247E, '3', u'(11)'), - (0x247F, '3', u'(12)'), - (0x2480, '3', u'(13)'), - (0x2481, '3', u'(14)'), - (0x2482, '3', u'(15)'), - (0x2483, '3', u'(16)'), - (0x2484, '3', u'(17)'), - (0x2485, '3', u'(18)'), - (0x2486, '3', u'(19)'), - (0x2487, '3', u'(20)'), - (0x2488, 'X'), - (0x249C, '3', u'(a)'), - (0x249D, '3', u'(b)'), - (0x249E, '3', u'(c)'), - (0x249F, '3', u'(d)'), - (0x24A0, '3', u'(e)'), - (0x24A1, '3', u'(f)'), - (0x24A2, '3', u'(g)'), - (0x24A3, '3', u'(h)'), - (0x24A4, '3', u'(i)'), - (0x24A5, '3', u'(j)'), - (0x24A6, '3', u'(k)'), - (0x24A7, '3', u'(l)'), - (0x24A8, '3', u'(m)'), - (0x24A9, '3', u'(n)'), - (0x24AA, '3', u'(o)'), - (0x24AB, '3', u'(p)'), - (0x24AC, '3', u'(q)'), - (0x24AD, '3', u'(r)'), - (0x24AE, '3', u'(s)'), - (0x24AF, '3', u'(t)'), - (0x24B0, '3', u'(u)'), - (0x24B1, '3', u'(v)'), - (0x24B2, '3', u'(w)'), - (0x24B3, '3', u'(x)'), - (0x24B4, '3', u'(y)'), - (0x24B5, '3', u'(z)'), - (0x24B6, 'M', u'a'), - (0x24B7, 'M', u'b'), - (0x24B8, 'M', u'c'), - (0x24B9, 'M', u'd'), - (0x24BA, 'M', u'e'), - (0x24BB, 'M', u'f'), - (0x24BC, 'M', u'g'), - (0x24BD, 'M', u'h'), - (0x24BE, 'M', u'i'), - (0x24BF, 'M', u'j'), - (0x24C0, 'M', u'k'), - (0x24C1, 'M', u'l'), - (0x24C2, 'M', u'm'), - (0x24C3, 'M', u'n'), - (0x24C4, 'M', u'o'), - (0x24C5, 'M', u'p'), - (0x24C6, 'M', u'q'), - (0x24C7, 'M', u'r'), - (0x24C8, 'M', u's'), - (0x24C9, 'M', u't'), - (0x24CA, 'M', u'u'), - (0x24CB, 'M', u'v'), - (0x24CC, 'M', u'w'), - (0x24CD, 'M', u'x'), - (0x24CE, 'M', u'y'), - (0x24CF, 'M', u'z'), - (0x24D0, 'M', u'a'), - (0x24D1, 'M', u'b'), - (0x24D2, 'M', u'c'), - (0x24D3, 'M', u'd'), - (0x24D4, 'M', u'e'), - (0x24D5, 'M', u'f'), - (0x24D6, 'M', u'g'), - (0x24D7, 'M', u'h'), - (0x24D8, 'M', u'i'), - ] - -def _seg_24(): - return [ - (0x24D9, 'M', u'j'), - (0x24DA, 'M', u'k'), - (0x24DB, 'M', u'l'), - (0x24DC, 'M', u'm'), - (0x24DD, 'M', u'n'), - (0x24DE, 'M', u'o'), - (0x24DF, 'M', u'p'), - (0x24E0, 'M', u'q'), - (0x24E1, 'M', u'r'), - (0x24E2, 'M', u's'), - (0x24E3, 'M', u't'), - (0x24E4, 'M', u'u'), - (0x24E5, 'M', u'v'), - (0x24E6, 'M', u'w'), - (0x24E7, 'M', u'x'), - (0x24E8, 'M', u'y'), - (0x24E9, 'M', u'z'), - (0x24EA, 'M', u'0'), - (0x24EB, 'V'), - (0x2A0C, 'M', u'∫∫∫∫'), - (0x2A0D, 'V'), - (0x2A74, '3', u'::='), - (0x2A75, '3', u'=='), - (0x2A76, '3', u'==='), - (0x2A77, 'V'), - (0x2ADC, 'M', u'⫝̸'), - (0x2ADD, 'V'), - (0x2B74, 'X'), - (0x2B76, 'V'), - (0x2B96, 'X'), - (0x2B98, 'V'), - (0x2BC9, 'X'), - (0x2BCA, 'V'), - (0x2BFF, 'X'), - (0x2C00, 'M', u'ⰰ'), - (0x2C01, 'M', u'ⰱ'), - (0x2C02, 'M', u'ⰲ'), - (0x2C03, 'M', u'ⰳ'), - (0x2C04, 'M', u'ⰴ'), - (0x2C05, 'M', u'ⰵ'), - (0x2C06, 'M', u'ⰶ'), - (0x2C07, 'M', u'ⰷ'), - (0x2C08, 'M', u'ⰸ'), - (0x2C09, 'M', u'ⰹ'), - (0x2C0A, 'M', u'ⰺ'), - (0x2C0B, 'M', u'ⰻ'), - (0x2C0C, 'M', u'ⰼ'), - (0x2C0D, 'M', u'ⰽ'), - (0x2C0E, 'M', u'ⰾ'), - (0x2C0F, 'M', u'ⰿ'), - (0x2C10, 'M', u'ⱀ'), - (0x2C11, 'M', u'ⱁ'), - (0x2C12, 'M', u'ⱂ'), - (0x2C13, 'M', u'ⱃ'), - (0x2C14, 'M', u'ⱄ'), - (0x2C15, 'M', u'ⱅ'), - (0x2C16, 'M', u'ⱆ'), - (0x2C17, 'M', u'ⱇ'), - (0x2C18, 'M', u'ⱈ'), - (0x2C19, 'M', u'ⱉ'), - (0x2C1A, 'M', u'ⱊ'), - (0x2C1B, 'M', u'ⱋ'), - (0x2C1C, 'M', u'ⱌ'), - (0x2C1D, 'M', u'ⱍ'), - (0x2C1E, 'M', u'ⱎ'), - (0x2C1F, 'M', u'ⱏ'), - (0x2C20, 'M', u'ⱐ'), - (0x2C21, 'M', u'ⱑ'), - (0x2C22, 'M', u'ⱒ'), - (0x2C23, 'M', u'ⱓ'), - (0x2C24, 'M', u'ⱔ'), - (0x2C25, 'M', u'ⱕ'), - (0x2C26, 'M', u'ⱖ'), - (0x2C27, 'M', u'ⱗ'), - (0x2C28, 'M', u'ⱘ'), - (0x2C29, 'M', u'ⱙ'), - (0x2C2A, 'M', u'ⱚ'), - (0x2C2B, 'M', u'ⱛ'), - (0x2C2C, 'M', u'ⱜ'), - (0x2C2D, 'M', u'ⱝ'), - (0x2C2E, 'M', u'ⱞ'), - (0x2C2F, 'X'), - (0x2C30, 'V'), - (0x2C5F, 'X'), - (0x2C60, 'M', u'ⱡ'), - (0x2C61, 'V'), - (0x2C62, 'M', u'ɫ'), - (0x2C63, 'M', u'ᵽ'), - (0x2C64, 'M', u'ɽ'), - (0x2C65, 'V'), - (0x2C67, 'M', u'ⱨ'), - (0x2C68, 'V'), - (0x2C69, 'M', u'ⱪ'), - (0x2C6A, 'V'), - (0x2C6B, 'M', u'ⱬ'), - (0x2C6C, 'V'), - (0x2C6D, 'M', u'ɑ'), - (0x2C6E, 'M', u'ɱ'), - (0x2C6F, 'M', u'ɐ'), - (0x2C70, 'M', u'ɒ'), - ] - -def _seg_25(): - return [ - (0x2C71, 'V'), - (0x2C72, 'M', u'ⱳ'), - (0x2C73, 'V'), - (0x2C75, 'M', u'ⱶ'), - (0x2C76, 'V'), - (0x2C7C, 'M', u'j'), - (0x2C7D, 'M', u'v'), - (0x2C7E, 'M', u'ȿ'), - (0x2C7F, 'M', u'ɀ'), - (0x2C80, 'M', u'ⲁ'), - (0x2C81, 'V'), - (0x2C82, 'M', u'ⲃ'), - (0x2C83, 'V'), - (0x2C84, 'M', u'ⲅ'), - (0x2C85, 'V'), - (0x2C86, 'M', u'ⲇ'), - (0x2C87, 'V'), - (0x2C88, 'M', u'ⲉ'), - (0x2C89, 'V'), - (0x2C8A, 'M', u'ⲋ'), - (0x2C8B, 'V'), - (0x2C8C, 'M', u'ⲍ'), - (0x2C8D, 'V'), - (0x2C8E, 'M', u'ⲏ'), - (0x2C8F, 'V'), - (0x2C90, 'M', u'ⲑ'), - (0x2C91, 'V'), - (0x2C92, 'M', u'ⲓ'), - (0x2C93, 'V'), - (0x2C94, 'M', u'ⲕ'), - (0x2C95, 'V'), - (0x2C96, 'M', u'ⲗ'), - (0x2C97, 'V'), - (0x2C98, 'M', u'ⲙ'), - (0x2C99, 'V'), - (0x2C9A, 'M', u'ⲛ'), - (0x2C9B, 'V'), - (0x2C9C, 'M', u'ⲝ'), - (0x2C9D, 'V'), - (0x2C9E, 'M', u'ⲟ'), - (0x2C9F, 'V'), - (0x2CA0, 'M', u'ⲡ'), - (0x2CA1, 'V'), - (0x2CA2, 'M', u'ⲣ'), - (0x2CA3, 'V'), - (0x2CA4, 'M', u'ⲥ'), - (0x2CA5, 'V'), - (0x2CA6, 'M', u'ⲧ'), - (0x2CA7, 'V'), - (0x2CA8, 'M', u'ⲩ'), - (0x2CA9, 'V'), - (0x2CAA, 'M', u'ⲫ'), - (0x2CAB, 'V'), - (0x2CAC, 'M', u'ⲭ'), - (0x2CAD, 'V'), - (0x2CAE, 'M', u'ⲯ'), - (0x2CAF, 'V'), - (0x2CB0, 'M', u'ⲱ'), - (0x2CB1, 'V'), - (0x2CB2, 'M', u'ⲳ'), - (0x2CB3, 'V'), - (0x2CB4, 'M', u'ⲵ'), - (0x2CB5, 'V'), - (0x2CB6, 'M', u'ⲷ'), - (0x2CB7, 'V'), - (0x2CB8, 'M', u'ⲹ'), - (0x2CB9, 'V'), - (0x2CBA, 'M', u'ⲻ'), - (0x2CBB, 'V'), - (0x2CBC, 'M', u'ⲽ'), - (0x2CBD, 'V'), - (0x2CBE, 'M', u'ⲿ'), - (0x2CBF, 'V'), - (0x2CC0, 'M', u'ⳁ'), - (0x2CC1, 'V'), - (0x2CC2, 'M', u'ⳃ'), - (0x2CC3, 'V'), - (0x2CC4, 'M', u'ⳅ'), - (0x2CC5, 'V'), - (0x2CC6, 'M', u'ⳇ'), - (0x2CC7, 'V'), - (0x2CC8, 'M', u'ⳉ'), - (0x2CC9, 'V'), - (0x2CCA, 'M', u'ⳋ'), - (0x2CCB, 'V'), - (0x2CCC, 'M', u'ⳍ'), - (0x2CCD, 'V'), - (0x2CCE, 'M', u'ⳏ'), - (0x2CCF, 'V'), - (0x2CD0, 'M', u'ⳑ'), - (0x2CD1, 'V'), - (0x2CD2, 'M', u'ⳓ'), - (0x2CD3, 'V'), - (0x2CD4, 'M', u'ⳕ'), - (0x2CD5, 'V'), - (0x2CD6, 'M', u'ⳗ'), - (0x2CD7, 'V'), - (0x2CD8, 'M', u'ⳙ'), - (0x2CD9, 'V'), - (0x2CDA, 'M', u'ⳛ'), - ] - -def _seg_26(): - return [ - (0x2CDB, 'V'), - (0x2CDC, 'M', u'ⳝ'), - (0x2CDD, 'V'), - (0x2CDE, 'M', u'ⳟ'), - (0x2CDF, 'V'), - (0x2CE0, 'M', u'ⳡ'), - (0x2CE1, 'V'), - (0x2CE2, 'M', u'ⳣ'), - (0x2CE3, 'V'), - (0x2CEB, 'M', u'ⳬ'), - (0x2CEC, 'V'), - (0x2CED, 'M', u'ⳮ'), - (0x2CEE, 'V'), - (0x2CF2, 'M', u'ⳳ'), - (0x2CF3, 'V'), - (0x2CF4, 'X'), - (0x2CF9, 'V'), - (0x2D26, 'X'), - (0x2D27, 'V'), - (0x2D28, 'X'), - (0x2D2D, 'V'), - (0x2D2E, 'X'), - (0x2D30, 'V'), - (0x2D68, 'X'), - (0x2D6F, 'M', u'ⵡ'), - (0x2D70, 'V'), - (0x2D71, 'X'), - (0x2D7F, 'V'), - (0x2D97, 'X'), - (0x2DA0, 'V'), - (0x2DA7, 'X'), - (0x2DA8, 'V'), - (0x2DAF, 'X'), - (0x2DB0, 'V'), - (0x2DB7, 'X'), - (0x2DB8, 'V'), - (0x2DBF, 'X'), - (0x2DC0, 'V'), - (0x2DC7, 'X'), - (0x2DC8, 'V'), - (0x2DCF, 'X'), - (0x2DD0, 'V'), - (0x2DD7, 'X'), - (0x2DD8, 'V'), - (0x2DDF, 'X'), - (0x2DE0, 'V'), - (0x2E4F, 'X'), - (0x2E80, 'V'), - (0x2E9A, 'X'), - (0x2E9B, 'V'), - (0x2E9F, 'M', u'母'), - (0x2EA0, 'V'), - (0x2EF3, 'M', u'龟'), - (0x2EF4, 'X'), - (0x2F00, 'M', u'一'), - (0x2F01, 'M', u'丨'), - (0x2F02, 'M', u'丶'), - (0x2F03, 'M', u'丿'), - (0x2F04, 'M', u'乙'), - (0x2F05, 'M', u'亅'), - (0x2F06, 'M', u'二'), - (0x2F07, 'M', u'亠'), - (0x2F08, 'M', u'人'), - (0x2F09, 'M', u'儿'), - (0x2F0A, 'M', u'入'), - (0x2F0B, 'M', u'八'), - (0x2F0C, 'M', u'冂'), - (0x2F0D, 'M', u'冖'), - (0x2F0E, 'M', u'冫'), - (0x2F0F, 'M', u'几'), - (0x2F10, 'M', u'凵'), - (0x2F11, 'M', u'刀'), - (0x2F12, 'M', u'力'), - (0x2F13, 'M', u'勹'), - (0x2F14, 'M', u'匕'), - (0x2F15, 'M', u'匚'), - (0x2F16, 'M', u'匸'), - (0x2F17, 'M', u'十'), - (0x2F18, 'M', u'卜'), - (0x2F19, 'M', u'卩'), - (0x2F1A, 'M', u'厂'), - (0x2F1B, 'M', u'厶'), - (0x2F1C, 'M', u'又'), - (0x2F1D, 'M', u'口'), - (0x2F1E, 'M', u'囗'), - (0x2F1F, 'M', u'土'), - (0x2F20, 'M', u'士'), - (0x2F21, 'M', u'夂'), - (0x2F22, 'M', u'夊'), - (0x2F23, 'M', u'夕'), - (0x2F24, 'M', u'大'), - (0x2F25, 'M', u'女'), - (0x2F26, 'M', u'子'), - (0x2F27, 'M', u'宀'), - (0x2F28, 'M', u'寸'), - (0x2F29, 'M', u'小'), - (0x2F2A, 'M', u'尢'), - (0x2F2B, 'M', u'尸'), - (0x2F2C, 'M', u'屮'), - (0x2F2D, 'M', u'山'), - ] - -def _seg_27(): - return [ - (0x2F2E, 'M', u'巛'), - (0x2F2F, 'M', u'工'), - (0x2F30, 'M', u'己'), - (0x2F31, 'M', u'巾'), - (0x2F32, 'M', u'干'), - (0x2F33, 'M', u'幺'), - (0x2F34, 'M', u'广'), - (0x2F35, 'M', u'廴'), - (0x2F36, 'M', u'廾'), - (0x2F37, 'M', u'弋'), - (0x2F38, 'M', u'弓'), - (0x2F39, 'M', u'彐'), - (0x2F3A, 'M', u'彡'), - (0x2F3B, 'M', u'彳'), - (0x2F3C, 'M', u'心'), - (0x2F3D, 'M', u'戈'), - (0x2F3E, 'M', u'戶'), - (0x2F3F, 'M', u'手'), - (0x2F40, 'M', u'支'), - (0x2F41, 'M', u'攴'), - (0x2F42, 'M', u'文'), - (0x2F43, 'M', u'斗'), - (0x2F44, 'M', u'斤'), - (0x2F45, 'M', u'方'), - (0x2F46, 'M', u'无'), - (0x2F47, 'M', u'日'), - (0x2F48, 'M', u'曰'), - (0x2F49, 'M', u'月'), - (0x2F4A, 'M', u'木'), - (0x2F4B, 'M', u'欠'), - (0x2F4C, 'M', u'止'), - (0x2F4D, 'M', u'歹'), - (0x2F4E, 'M', u'殳'), - (0x2F4F, 'M', u'毋'), - (0x2F50, 'M', u'比'), - (0x2F51, 'M', u'毛'), - (0x2F52, 'M', u'氏'), - (0x2F53, 'M', u'气'), - (0x2F54, 'M', u'水'), - (0x2F55, 'M', u'火'), - (0x2F56, 'M', u'爪'), - (0x2F57, 'M', u'父'), - (0x2F58, 'M', u'爻'), - (0x2F59, 'M', u'爿'), - (0x2F5A, 'M', u'片'), - (0x2F5B, 'M', u'牙'), - (0x2F5C, 'M', u'牛'), - (0x2F5D, 'M', u'犬'), - (0x2F5E, 'M', u'玄'), - (0x2F5F, 'M', u'玉'), - (0x2F60, 'M', u'瓜'), - (0x2F61, 'M', u'瓦'), - (0x2F62, 'M', u'甘'), - (0x2F63, 'M', u'生'), - (0x2F64, 'M', u'用'), - (0x2F65, 'M', u'田'), - (0x2F66, 'M', u'疋'), - (0x2F67, 'M', u'疒'), - (0x2F68, 'M', u'癶'), - (0x2F69, 'M', u'白'), - (0x2F6A, 'M', u'皮'), - (0x2F6B, 'M', u'皿'), - (0x2F6C, 'M', u'目'), - (0x2F6D, 'M', u'矛'), - (0x2F6E, 'M', u'矢'), - (0x2F6F, 'M', u'石'), - (0x2F70, 'M', u'示'), - (0x2F71, 'M', u'禸'), - (0x2F72, 'M', u'禾'), - (0x2F73, 'M', u'穴'), - (0x2F74, 'M', u'立'), - (0x2F75, 'M', u'竹'), - (0x2F76, 'M', u'米'), - (0x2F77, 'M', u'糸'), - (0x2F78, 'M', u'缶'), - (0x2F79, 'M', u'网'), - (0x2F7A, 'M', u'羊'), - (0x2F7B, 'M', u'羽'), - (0x2F7C, 'M', u'老'), - (0x2F7D, 'M', u'而'), - (0x2F7E, 'M', u'耒'), - (0x2F7F, 'M', u'耳'), - (0x2F80, 'M', u'聿'), - (0x2F81, 'M', u'肉'), - (0x2F82, 'M', u'臣'), - (0x2F83, 'M', u'自'), - (0x2F84, 'M', u'至'), - (0x2F85, 'M', u'臼'), - (0x2F86, 'M', u'舌'), - (0x2F87, 'M', u'舛'), - (0x2F88, 'M', u'舟'), - (0x2F89, 'M', u'艮'), - (0x2F8A, 'M', u'色'), - (0x2F8B, 'M', u'艸'), - (0x2F8C, 'M', u'虍'), - (0x2F8D, 'M', u'虫'), - (0x2F8E, 'M', u'血'), - (0x2F8F, 'M', u'行'), - (0x2F90, 'M', u'衣'), - (0x2F91, 'M', u'襾'), - ] - -def _seg_28(): - return [ - (0x2F92, 'M', u'見'), - (0x2F93, 'M', u'角'), - (0x2F94, 'M', u'言'), - (0x2F95, 'M', u'谷'), - (0x2F96, 'M', u'豆'), - (0x2F97, 'M', u'豕'), - (0x2F98, 'M', u'豸'), - (0x2F99, 'M', u'貝'), - (0x2F9A, 'M', u'赤'), - (0x2F9B, 'M', u'走'), - (0x2F9C, 'M', u'足'), - (0x2F9D, 'M', u'身'), - (0x2F9E, 'M', u'車'), - (0x2F9F, 'M', u'辛'), - (0x2FA0, 'M', u'辰'), - (0x2FA1, 'M', u'辵'), - (0x2FA2, 'M', u'邑'), - (0x2FA3, 'M', u'酉'), - (0x2FA4, 'M', u'釆'), - (0x2FA5, 'M', u'里'), - (0x2FA6, 'M', u'金'), - (0x2FA7, 'M', u'長'), - (0x2FA8, 'M', u'門'), - (0x2FA9, 'M', u'阜'), - (0x2FAA, 'M', u'隶'), - (0x2FAB, 'M', u'隹'), - (0x2FAC, 'M', u'雨'), - (0x2FAD, 'M', u'靑'), - (0x2FAE, 'M', u'非'), - (0x2FAF, 'M', u'面'), - (0x2FB0, 'M', u'革'), - (0x2FB1, 'M', u'韋'), - (0x2FB2, 'M', u'韭'), - (0x2FB3, 'M', u'音'), - (0x2FB4, 'M', u'頁'), - (0x2FB5, 'M', u'風'), - (0x2FB6, 'M', u'飛'), - (0x2FB7, 'M', u'食'), - (0x2FB8, 'M', u'首'), - (0x2FB9, 'M', u'香'), - (0x2FBA, 'M', u'馬'), - (0x2FBB, 'M', u'骨'), - (0x2FBC, 'M', u'高'), - (0x2FBD, 'M', u'髟'), - (0x2FBE, 'M', u'鬥'), - (0x2FBF, 'M', u'鬯'), - (0x2FC0, 'M', u'鬲'), - (0x2FC1, 'M', u'鬼'), - (0x2FC2, 'M', u'魚'), - (0x2FC3, 'M', u'鳥'), - (0x2FC4, 'M', u'鹵'), - (0x2FC5, 'M', u'鹿'), - (0x2FC6, 'M', u'麥'), - (0x2FC7, 'M', u'麻'), - (0x2FC8, 'M', u'黃'), - (0x2FC9, 'M', u'黍'), - (0x2FCA, 'M', u'黑'), - (0x2FCB, 'M', u'黹'), - (0x2FCC, 'M', u'黽'), - (0x2FCD, 'M', u'鼎'), - (0x2FCE, 'M', u'鼓'), - (0x2FCF, 'M', u'鼠'), - (0x2FD0, 'M', u'鼻'), - (0x2FD1, 'M', u'齊'), - (0x2FD2, 'M', u'齒'), - (0x2FD3, 'M', u'龍'), - (0x2FD4, 'M', u'龜'), - (0x2FD5, 'M', u'龠'), - (0x2FD6, 'X'), - (0x3000, '3', u' '), - (0x3001, 'V'), - (0x3002, 'M', u'.'), - (0x3003, 'V'), - (0x3036, 'M', u'〒'), - (0x3037, 'V'), - (0x3038, 'M', u'十'), - (0x3039, 'M', u'卄'), - (0x303A, 'M', u'卅'), - (0x303B, 'V'), - (0x3040, 'X'), - (0x3041, 'V'), - (0x3097, 'X'), - (0x3099, 'V'), - (0x309B, '3', u' ゙'), - (0x309C, '3', u' ゚'), - (0x309D, 'V'), - (0x309F, 'M', u'より'), - (0x30A0, 'V'), - (0x30FF, 'M', u'コト'), - (0x3100, 'X'), - (0x3105, 'V'), - (0x3130, 'X'), - (0x3131, 'M', u'ᄀ'), - (0x3132, 'M', u'ᄁ'), - (0x3133, 'M', u'ᆪ'), - (0x3134, 'M', u'ᄂ'), - (0x3135, 'M', u'ᆬ'), - (0x3136, 'M', u'ᆭ'), - (0x3137, 'M', u'ᄃ'), - (0x3138, 'M', u'ᄄ'), - ] - -def _seg_29(): - return [ - (0x3139, 'M', u'ᄅ'), - (0x313A, 'M', u'ᆰ'), - (0x313B, 'M', u'ᆱ'), - (0x313C, 'M', u'ᆲ'), - (0x313D, 'M', u'ᆳ'), - (0x313E, 'M', u'ᆴ'), - (0x313F, 'M', u'ᆵ'), - (0x3140, 'M', u'ᄚ'), - (0x3141, 'M', u'ᄆ'), - (0x3142, 'M', u'ᄇ'), - (0x3143, 'M', u'ᄈ'), - (0x3144, 'M', u'ᄡ'), - (0x3145, 'M', u'ᄉ'), - (0x3146, 'M', u'ᄊ'), - (0x3147, 'M', u'ᄋ'), - (0x3148, 'M', u'ᄌ'), - (0x3149, 'M', u'ᄍ'), - (0x314A, 'M', u'ᄎ'), - (0x314B, 'M', u'ᄏ'), - (0x314C, 'M', u'ᄐ'), - (0x314D, 'M', u'ᄑ'), - (0x314E, 'M', u'ᄒ'), - (0x314F, 'M', u'ᅡ'), - (0x3150, 'M', u'ᅢ'), - (0x3151, 'M', u'ᅣ'), - (0x3152, 'M', u'ᅤ'), - (0x3153, 'M', u'ᅥ'), - (0x3154, 'M', u'ᅦ'), - (0x3155, 'M', u'ᅧ'), - (0x3156, 'M', u'ᅨ'), - (0x3157, 'M', u'ᅩ'), - (0x3158, 'M', u'ᅪ'), - (0x3159, 'M', u'ᅫ'), - (0x315A, 'M', u'ᅬ'), - (0x315B, 'M', u'ᅭ'), - (0x315C, 'M', u'ᅮ'), - (0x315D, 'M', u'ᅯ'), - (0x315E, 'M', u'ᅰ'), - (0x315F, 'M', u'ᅱ'), - (0x3160, 'M', u'ᅲ'), - (0x3161, 'M', u'ᅳ'), - (0x3162, 'M', u'ᅴ'), - (0x3163, 'M', u'ᅵ'), - (0x3164, 'X'), - (0x3165, 'M', u'ᄔ'), - (0x3166, 'M', u'ᄕ'), - (0x3167, 'M', u'ᇇ'), - (0x3168, 'M', u'ᇈ'), - (0x3169, 'M', u'ᇌ'), - (0x316A, 'M', u'ᇎ'), - (0x316B, 'M', u'ᇓ'), - (0x316C, 'M', u'ᇗ'), - (0x316D, 'M', u'ᇙ'), - (0x316E, 'M', u'ᄜ'), - (0x316F, 'M', u'ᇝ'), - (0x3170, 'M', u'ᇟ'), - (0x3171, 'M', u'ᄝ'), - (0x3172, 'M', u'ᄞ'), - (0x3173, 'M', u'ᄠ'), - (0x3174, 'M', u'ᄢ'), - (0x3175, 'M', u'ᄣ'), - (0x3176, 'M', u'ᄧ'), - (0x3177, 'M', u'ᄩ'), - (0x3178, 'M', u'ᄫ'), - (0x3179, 'M', u'ᄬ'), - (0x317A, 'M', u'ᄭ'), - (0x317B, 'M', u'ᄮ'), - (0x317C, 'M', u'ᄯ'), - (0x317D, 'M', u'ᄲ'), - (0x317E, 'M', u'ᄶ'), - (0x317F, 'M', u'ᅀ'), - (0x3180, 'M', u'ᅇ'), - (0x3181, 'M', u'ᅌ'), - (0x3182, 'M', u'ᇱ'), - (0x3183, 'M', u'ᇲ'), - (0x3184, 'M', u'ᅗ'), - (0x3185, 'M', u'ᅘ'), - (0x3186, 'M', u'ᅙ'), - (0x3187, 'M', u'ᆄ'), - (0x3188, 'M', u'ᆅ'), - (0x3189, 'M', u'ᆈ'), - (0x318A, 'M', u'ᆑ'), - (0x318B, 'M', u'ᆒ'), - (0x318C, 'M', u'ᆔ'), - (0x318D, 'M', u'ᆞ'), - (0x318E, 'M', u'ᆡ'), - (0x318F, 'X'), - (0x3190, 'V'), - (0x3192, 'M', u'一'), - (0x3193, 'M', u'二'), - (0x3194, 'M', u'三'), - (0x3195, 'M', u'四'), - (0x3196, 'M', u'上'), - (0x3197, 'M', u'中'), - (0x3198, 'M', u'下'), - (0x3199, 'M', u'甲'), - (0x319A, 'M', u'乙'), - (0x319B, 'M', u'丙'), - (0x319C, 'M', u'丁'), - (0x319D, 'M', u'天'), - ] - -def _seg_30(): - return [ - (0x319E, 'M', u'地'), - (0x319F, 'M', u'人'), - (0x31A0, 'V'), - (0x31BB, 'X'), - (0x31C0, 'V'), - (0x31E4, 'X'), - (0x31F0, 'V'), - (0x3200, '3', u'(ᄀ)'), - (0x3201, '3', u'(ᄂ)'), - (0x3202, '3', u'(ᄃ)'), - (0x3203, '3', u'(ᄅ)'), - (0x3204, '3', u'(ᄆ)'), - (0x3205, '3', u'(ᄇ)'), - (0x3206, '3', u'(ᄉ)'), - (0x3207, '3', u'(ᄋ)'), - (0x3208, '3', u'(ᄌ)'), - (0x3209, '3', u'(ᄎ)'), - (0x320A, '3', u'(ᄏ)'), - (0x320B, '3', u'(ᄐ)'), - (0x320C, '3', u'(ᄑ)'), - (0x320D, '3', u'(ᄒ)'), - (0x320E, '3', u'(가)'), - (0x320F, '3', u'(나)'), - (0x3210, '3', u'(다)'), - (0x3211, '3', u'(라)'), - (0x3212, '3', u'(마)'), - (0x3213, '3', u'(바)'), - (0x3214, '3', u'(사)'), - (0x3215, '3', u'(아)'), - (0x3216, '3', u'(자)'), - (0x3217, '3', u'(차)'), - (0x3218, '3', u'(카)'), - (0x3219, '3', u'(타)'), - (0x321A, '3', u'(파)'), - (0x321B, '3', u'(하)'), - (0x321C, '3', u'(주)'), - (0x321D, '3', u'(오전)'), - (0x321E, '3', u'(오후)'), - (0x321F, 'X'), - (0x3220, '3', u'(一)'), - (0x3221, '3', u'(二)'), - (0x3222, '3', u'(三)'), - (0x3223, '3', u'(四)'), - (0x3224, '3', u'(五)'), - (0x3225, '3', u'(六)'), - (0x3226, '3', u'(七)'), - (0x3227, '3', u'(八)'), - (0x3228, '3', u'(九)'), - (0x3229, '3', u'(十)'), - (0x322A, '3', u'(月)'), - (0x322B, '3', u'(火)'), - (0x322C, '3', u'(水)'), - (0x322D, '3', u'(木)'), - (0x322E, '3', u'(金)'), - (0x322F, '3', u'(土)'), - (0x3230, '3', u'(日)'), - (0x3231, '3', u'(株)'), - (0x3232, '3', u'(有)'), - (0x3233, '3', u'(社)'), - (0x3234, '3', u'(名)'), - (0x3235, '3', u'(特)'), - (0x3236, '3', u'(財)'), - (0x3237, '3', u'(祝)'), - (0x3238, '3', u'(労)'), - (0x3239, '3', u'(代)'), - (0x323A, '3', u'(呼)'), - (0x323B, '3', u'(学)'), - (0x323C, '3', u'(監)'), - (0x323D, '3', u'(企)'), - (0x323E, '3', u'(資)'), - (0x323F, '3', u'(協)'), - (0x3240, '3', u'(祭)'), - (0x3241, '3', u'(休)'), - (0x3242, '3', u'(自)'), - (0x3243, '3', u'(至)'), - (0x3244, 'M', u'問'), - (0x3245, 'M', u'幼'), - (0x3246, 'M', u'文'), - (0x3247, 'M', u'箏'), - (0x3248, 'V'), - (0x3250, 'M', u'pte'), - (0x3251, 'M', u'21'), - (0x3252, 'M', u'22'), - (0x3253, 'M', u'23'), - (0x3254, 'M', u'24'), - (0x3255, 'M', u'25'), - (0x3256, 'M', u'26'), - (0x3257, 'M', u'27'), - (0x3258, 'M', u'28'), - (0x3259, 'M', u'29'), - (0x325A, 'M', u'30'), - (0x325B, 'M', u'31'), - (0x325C, 'M', u'32'), - (0x325D, 'M', u'33'), - (0x325E, 'M', u'34'), - (0x325F, 'M', u'35'), - (0x3260, 'M', u'ᄀ'), - (0x3261, 'M', u'ᄂ'), - (0x3262, 'M', u'ᄃ'), - (0x3263, 'M', u'ᄅ'), - ] - -def _seg_31(): - return [ - (0x3264, 'M', u'ᄆ'), - (0x3265, 'M', u'ᄇ'), - (0x3266, 'M', u'ᄉ'), - (0x3267, 'M', u'ᄋ'), - (0x3268, 'M', u'ᄌ'), - (0x3269, 'M', u'ᄎ'), - (0x326A, 'M', u'ᄏ'), - (0x326B, 'M', u'ᄐ'), - (0x326C, 'M', u'ᄑ'), - (0x326D, 'M', u'ᄒ'), - (0x326E, 'M', u'가'), - (0x326F, 'M', u'나'), - (0x3270, 'M', u'다'), - (0x3271, 'M', u'라'), - (0x3272, 'M', u'마'), - (0x3273, 'M', u'바'), - (0x3274, 'M', u'사'), - (0x3275, 'M', u'아'), - (0x3276, 'M', u'자'), - (0x3277, 'M', u'차'), - (0x3278, 'M', u'카'), - (0x3279, 'M', u'타'), - (0x327A, 'M', u'파'), - (0x327B, 'M', u'하'), - (0x327C, 'M', u'참고'), - (0x327D, 'M', u'주의'), - (0x327E, 'M', u'우'), - (0x327F, 'V'), - (0x3280, 'M', u'一'), - (0x3281, 'M', u'二'), - (0x3282, 'M', u'三'), - (0x3283, 'M', u'四'), - (0x3284, 'M', u'五'), - (0x3285, 'M', u'六'), - (0x3286, 'M', u'七'), - (0x3287, 'M', u'八'), - (0x3288, 'M', u'九'), - (0x3289, 'M', u'十'), - (0x328A, 'M', u'月'), - (0x328B, 'M', u'火'), - (0x328C, 'M', u'水'), - (0x328D, 'M', u'木'), - (0x328E, 'M', u'金'), - (0x328F, 'M', u'土'), - (0x3290, 'M', u'日'), - (0x3291, 'M', u'株'), - (0x3292, 'M', u'有'), - (0x3293, 'M', u'社'), - (0x3294, 'M', u'名'), - (0x3295, 'M', u'特'), - (0x3296, 'M', u'財'), - (0x3297, 'M', u'祝'), - (0x3298, 'M', u'労'), - (0x3299, 'M', u'秘'), - (0x329A, 'M', u'男'), - (0x329B, 'M', u'女'), - (0x329C, 'M', u'適'), - (0x329D, 'M', u'優'), - (0x329E, 'M', u'印'), - (0x329F, 'M', u'注'), - (0x32A0, 'M', u'項'), - (0x32A1, 'M', u'休'), - (0x32A2, 'M', u'写'), - (0x32A3, 'M', u'正'), - (0x32A4, 'M', u'上'), - (0x32A5, 'M', u'中'), - (0x32A6, 'M', u'下'), - (0x32A7, 'M', u'左'), - (0x32A8, 'M', u'右'), - (0x32A9, 'M', u'医'), - (0x32AA, 'M', u'宗'), - (0x32AB, 'M', u'学'), - (0x32AC, 'M', u'監'), - (0x32AD, 'M', u'企'), - (0x32AE, 'M', u'資'), - (0x32AF, 'M', u'協'), - (0x32B0, 'M', u'夜'), - (0x32B1, 'M', u'36'), - (0x32B2, 'M', u'37'), - (0x32B3, 'M', u'38'), - (0x32B4, 'M', u'39'), - (0x32B5, 'M', u'40'), - (0x32B6, 'M', u'41'), - (0x32B7, 'M', u'42'), - (0x32B8, 'M', u'43'), - (0x32B9, 'M', u'44'), - (0x32BA, 'M', u'45'), - (0x32BB, 'M', u'46'), - (0x32BC, 'M', u'47'), - (0x32BD, 'M', u'48'), - (0x32BE, 'M', u'49'), - (0x32BF, 'M', u'50'), - (0x32C0, 'M', u'1月'), - (0x32C1, 'M', u'2月'), - (0x32C2, 'M', u'3月'), - (0x32C3, 'M', u'4月'), - (0x32C4, 'M', u'5月'), - (0x32C5, 'M', u'6月'), - (0x32C6, 'M', u'7月'), - (0x32C7, 'M', u'8月'), - ] - -def _seg_32(): - return [ - (0x32C8, 'M', u'9月'), - (0x32C9, 'M', u'10月'), - (0x32CA, 'M', u'11月'), - (0x32CB, 'M', u'12月'), - (0x32CC, 'M', u'hg'), - (0x32CD, 'M', u'erg'), - (0x32CE, 'M', u'ev'), - (0x32CF, 'M', u'ltd'), - (0x32D0, 'M', u'ア'), - (0x32D1, 'M', u'イ'), - (0x32D2, 'M', u'ウ'), - (0x32D3, 'M', u'エ'), - (0x32D4, 'M', u'オ'), - (0x32D5, 'M', u'カ'), - (0x32D6, 'M', u'キ'), - (0x32D7, 'M', u'ク'), - (0x32D8, 'M', u'ケ'), - (0x32D9, 'M', u'コ'), - (0x32DA, 'M', u'サ'), - (0x32DB, 'M', u'シ'), - (0x32DC, 'M', u'ス'), - (0x32DD, 'M', u'セ'), - (0x32DE, 'M', u'ソ'), - (0x32DF, 'M', u'タ'), - (0x32E0, 'M', u'チ'), - (0x32E1, 'M', u'ツ'), - (0x32E2, 'M', u'テ'), - (0x32E3, 'M', u'ト'), - (0x32E4, 'M', u'ナ'), - (0x32E5, 'M', u'ニ'), - (0x32E6, 'M', u'ヌ'), - (0x32E7, 'M', u'ネ'), - (0x32E8, 'M', u'ノ'), - (0x32E9, 'M', u'ハ'), - (0x32EA, 'M', u'ヒ'), - (0x32EB, 'M', u'フ'), - (0x32EC, 'M', u'ヘ'), - (0x32ED, 'M', u'ホ'), - (0x32EE, 'M', u'マ'), - (0x32EF, 'M', u'ミ'), - (0x32F0, 'M', u'ム'), - (0x32F1, 'M', u'メ'), - (0x32F2, 'M', u'モ'), - (0x32F3, 'M', u'ヤ'), - (0x32F4, 'M', u'ユ'), - (0x32F5, 'M', u'ヨ'), - (0x32F6, 'M', u'ラ'), - (0x32F7, 'M', u'リ'), - (0x32F8, 'M', u'ル'), - (0x32F9, 'M', u'レ'), - (0x32FA, 'M', u'ロ'), - (0x32FB, 'M', u'ワ'), - (0x32FC, 'M', u'ヰ'), - (0x32FD, 'M', u'ヱ'), - (0x32FE, 'M', u'ヲ'), - (0x32FF, 'X'), - (0x3300, 'M', u'アパート'), - (0x3301, 'M', u'アルファ'), - (0x3302, 'M', u'アンペア'), - (0x3303, 'M', u'アール'), - (0x3304, 'M', u'イニング'), - (0x3305, 'M', u'インチ'), - (0x3306, 'M', u'ウォン'), - (0x3307, 'M', u'エスクード'), - (0x3308, 'M', u'エーカー'), - (0x3309, 'M', u'オンス'), - (0x330A, 'M', u'オーム'), - (0x330B, 'M', u'カイリ'), - (0x330C, 'M', u'カラット'), - (0x330D, 'M', u'カロリー'), - (0x330E, 'M', u'ガロン'), - (0x330F, 'M', u'ガンマ'), - (0x3310, 'M', u'ギガ'), - (0x3311, 'M', u'ギニー'), - (0x3312, 'M', u'キュリー'), - (0x3313, 'M', u'ギルダー'), - (0x3314, 'M', u'キロ'), - (0x3315, 'M', u'キログラム'), - (0x3316, 'M', u'キロメートル'), - (0x3317, 'M', u'キロワット'), - (0x3318, 'M', u'グラム'), - (0x3319, 'M', u'グラムトン'), - (0x331A, 'M', u'クルゼイロ'), - (0x331B, 'M', u'クローネ'), - (0x331C, 'M', u'ケース'), - (0x331D, 'M', u'コルナ'), - (0x331E, 'M', u'コーポ'), - (0x331F, 'M', u'サイクル'), - (0x3320, 'M', u'サンチーム'), - (0x3321, 'M', u'シリング'), - (0x3322, 'M', u'センチ'), - (0x3323, 'M', u'セント'), - (0x3324, 'M', u'ダース'), - (0x3325, 'M', u'デシ'), - (0x3326, 'M', u'ドル'), - (0x3327, 'M', u'トン'), - (0x3328, 'M', u'ナノ'), - (0x3329, 'M', u'ノット'), - (0x332A, 'M', u'ハイツ'), - (0x332B, 'M', u'パーセント'), - ] - -def _seg_33(): - return [ - (0x332C, 'M', u'パーツ'), - (0x332D, 'M', u'バーレル'), - (0x332E, 'M', u'ピアストル'), - (0x332F, 'M', u'ピクル'), - (0x3330, 'M', u'ピコ'), - (0x3331, 'M', u'ビル'), - (0x3332, 'M', u'ファラッド'), - (0x3333, 'M', u'フィート'), - (0x3334, 'M', u'ブッシェル'), - (0x3335, 'M', u'フラン'), - (0x3336, 'M', u'ヘクタール'), - (0x3337, 'M', u'ペソ'), - (0x3338, 'M', u'ペニヒ'), - (0x3339, 'M', u'ヘルツ'), - (0x333A, 'M', u'ペンス'), - (0x333B, 'M', u'ページ'), - (0x333C, 'M', u'ベータ'), - (0x333D, 'M', u'ポイント'), - (0x333E, 'M', u'ボルト'), - (0x333F, 'M', u'ホン'), - (0x3340, 'M', u'ポンド'), - (0x3341, 'M', u'ホール'), - (0x3342, 'M', u'ホーン'), - (0x3343, 'M', u'マイクロ'), - (0x3344, 'M', u'マイル'), - (0x3345, 'M', u'マッハ'), - (0x3346, 'M', u'マルク'), - (0x3347, 'M', u'マンション'), - (0x3348, 'M', u'ミクロン'), - (0x3349, 'M', u'ミリ'), - (0x334A, 'M', u'ミリバール'), - (0x334B, 'M', u'メガ'), - (0x334C, 'M', u'メガトン'), - (0x334D, 'M', u'メートル'), - (0x334E, 'M', u'ヤード'), - (0x334F, 'M', u'ヤール'), - (0x3350, 'M', u'ユアン'), - (0x3351, 'M', u'リットル'), - (0x3352, 'M', u'リラ'), - (0x3353, 'M', u'ルピー'), - (0x3354, 'M', u'ルーブル'), - (0x3355, 'M', u'レム'), - (0x3356, 'M', u'レントゲン'), - (0x3357, 'M', u'ワット'), - (0x3358, 'M', u'0点'), - (0x3359, 'M', u'1点'), - (0x335A, 'M', u'2点'), - (0x335B, 'M', u'3点'), - (0x335C, 'M', u'4点'), - (0x335D, 'M', u'5点'), - (0x335E, 'M', u'6点'), - (0x335F, 'M', u'7点'), - (0x3360, 'M', u'8点'), - (0x3361, 'M', u'9点'), - (0x3362, 'M', u'10点'), - (0x3363, 'M', u'11点'), - (0x3364, 'M', u'12点'), - (0x3365, 'M', u'13点'), - (0x3366, 'M', u'14点'), - (0x3367, 'M', u'15点'), - (0x3368, 'M', u'16点'), - (0x3369, 'M', u'17点'), - (0x336A, 'M', u'18点'), - (0x336B, 'M', u'19点'), - (0x336C, 'M', u'20点'), - (0x336D, 'M', u'21点'), - (0x336E, 'M', u'22点'), - (0x336F, 'M', u'23点'), - (0x3370, 'M', u'24点'), - (0x3371, 'M', u'hpa'), - (0x3372, 'M', u'da'), - (0x3373, 'M', u'au'), - (0x3374, 'M', u'bar'), - (0x3375, 'M', u'ov'), - (0x3376, 'M', u'pc'), - (0x3377, 'M', u'dm'), - (0x3378, 'M', u'dm2'), - (0x3379, 'M', u'dm3'), - (0x337A, 'M', u'iu'), - (0x337B, 'M', u'平成'), - (0x337C, 'M', u'昭和'), - (0x337D, 'M', u'大正'), - (0x337E, 'M', u'明治'), - (0x337F, 'M', u'株式会社'), - (0x3380, 'M', u'pa'), - (0x3381, 'M', u'na'), - (0x3382, 'M', u'μa'), - (0x3383, 'M', u'ma'), - (0x3384, 'M', u'ka'), - (0x3385, 'M', u'kb'), - (0x3386, 'M', u'mb'), - (0x3387, 'M', u'gb'), - (0x3388, 'M', u'cal'), - (0x3389, 'M', u'kcal'), - (0x338A, 'M', u'pf'), - (0x338B, 'M', u'nf'), - (0x338C, 'M', u'μf'), - (0x338D, 'M', u'μg'), - (0x338E, 'M', u'mg'), - (0x338F, 'M', u'kg'), - ] - -def _seg_34(): - return [ - (0x3390, 'M', u'hz'), - (0x3391, 'M', u'khz'), - (0x3392, 'M', u'mhz'), - (0x3393, 'M', u'ghz'), - (0x3394, 'M', u'thz'), - (0x3395, 'M', u'μl'), - (0x3396, 'M', u'ml'), - (0x3397, 'M', u'dl'), - (0x3398, 'M', u'kl'), - (0x3399, 'M', u'fm'), - (0x339A, 'M', u'nm'), - (0x339B, 'M', u'μm'), - (0x339C, 'M', u'mm'), - (0x339D, 'M', u'cm'), - (0x339E, 'M', u'km'), - (0x339F, 'M', u'mm2'), - (0x33A0, 'M', u'cm2'), - (0x33A1, 'M', u'm2'), - (0x33A2, 'M', u'km2'), - (0x33A3, 'M', u'mm3'), - (0x33A4, 'M', u'cm3'), - (0x33A5, 'M', u'm3'), - (0x33A6, 'M', u'km3'), - (0x33A7, 'M', u'm∕s'), - (0x33A8, 'M', u'm∕s2'), - (0x33A9, 'M', u'pa'), - (0x33AA, 'M', u'kpa'), - (0x33AB, 'M', u'mpa'), - (0x33AC, 'M', u'gpa'), - (0x33AD, 'M', u'rad'), - (0x33AE, 'M', u'rad∕s'), - (0x33AF, 'M', u'rad∕s2'), - (0x33B0, 'M', u'ps'), - (0x33B1, 'M', u'ns'), - (0x33B2, 'M', u'μs'), - (0x33B3, 'M', u'ms'), - (0x33B4, 'M', u'pv'), - (0x33B5, 'M', u'nv'), - (0x33B6, 'M', u'μv'), - (0x33B7, 'M', u'mv'), - (0x33B8, 'M', u'kv'), - (0x33B9, 'M', u'mv'), - (0x33BA, 'M', u'pw'), - (0x33BB, 'M', u'nw'), - (0x33BC, 'M', u'μw'), - (0x33BD, 'M', u'mw'), - (0x33BE, 'M', u'kw'), - (0x33BF, 'M', u'mw'), - (0x33C0, 'M', u'kω'), - (0x33C1, 'M', u'mω'), - (0x33C2, 'X'), - (0x33C3, 'M', u'bq'), - (0x33C4, 'M', u'cc'), - (0x33C5, 'M', u'cd'), - (0x33C6, 'M', u'c∕kg'), - (0x33C7, 'X'), - (0x33C8, 'M', u'db'), - (0x33C9, 'M', u'gy'), - (0x33CA, 'M', u'ha'), - (0x33CB, 'M', u'hp'), - (0x33CC, 'M', u'in'), - (0x33CD, 'M', u'kk'), - (0x33CE, 'M', u'km'), - (0x33CF, 'M', u'kt'), - (0x33D0, 'M', u'lm'), - (0x33D1, 'M', u'ln'), - (0x33D2, 'M', u'log'), - (0x33D3, 'M', u'lx'), - (0x33D4, 'M', u'mb'), - (0x33D5, 'M', u'mil'), - (0x33D6, 'M', u'mol'), - (0x33D7, 'M', u'ph'), - (0x33D8, 'X'), - (0x33D9, 'M', u'ppm'), - (0x33DA, 'M', u'pr'), - (0x33DB, 'M', u'sr'), - (0x33DC, 'M', u'sv'), - (0x33DD, 'M', u'wb'), - (0x33DE, 'M', u'v∕m'), - (0x33DF, 'M', u'a∕m'), - (0x33E0, 'M', u'1日'), - (0x33E1, 'M', u'2日'), - (0x33E2, 'M', u'3日'), - (0x33E3, 'M', u'4日'), - (0x33E4, 'M', u'5日'), - (0x33E5, 'M', u'6日'), - (0x33E6, 'M', u'7日'), - (0x33E7, 'M', u'8日'), - (0x33E8, 'M', u'9日'), - (0x33E9, 'M', u'10日'), - (0x33EA, 'M', u'11日'), - (0x33EB, 'M', u'12日'), - (0x33EC, 'M', u'13日'), - (0x33ED, 'M', u'14日'), - (0x33EE, 'M', u'15日'), - (0x33EF, 'M', u'16日'), - (0x33F0, 'M', u'17日'), - (0x33F1, 'M', u'18日'), - (0x33F2, 'M', u'19日'), - (0x33F3, 'M', u'20日'), - ] - -def _seg_35(): - return [ - (0x33F4, 'M', u'21日'), - (0x33F5, 'M', u'22日'), - (0x33F6, 'M', u'23日'), - (0x33F7, 'M', u'24日'), - (0x33F8, 'M', u'25日'), - (0x33F9, 'M', u'26日'), - (0x33FA, 'M', u'27日'), - (0x33FB, 'M', u'28日'), - (0x33FC, 'M', u'29日'), - (0x33FD, 'M', u'30日'), - (0x33FE, 'M', u'31日'), - (0x33FF, 'M', u'gal'), - (0x3400, 'V'), - (0x4DB6, 'X'), - (0x4DC0, 'V'), - (0x9FF0, 'X'), - (0xA000, 'V'), - (0xA48D, 'X'), - (0xA490, 'V'), - (0xA4C7, 'X'), - (0xA4D0, 'V'), - (0xA62C, 'X'), - (0xA640, 'M', u'ꙁ'), - (0xA641, 'V'), - (0xA642, 'M', u'ꙃ'), - (0xA643, 'V'), - (0xA644, 'M', u'ꙅ'), - (0xA645, 'V'), - (0xA646, 'M', u'ꙇ'), - (0xA647, 'V'), - (0xA648, 'M', u'ꙉ'), - (0xA649, 'V'), - (0xA64A, 'M', u'ꙋ'), - (0xA64B, 'V'), - (0xA64C, 'M', u'ꙍ'), - (0xA64D, 'V'), - (0xA64E, 'M', u'ꙏ'), - (0xA64F, 'V'), - (0xA650, 'M', u'ꙑ'), - (0xA651, 'V'), - (0xA652, 'M', u'ꙓ'), - (0xA653, 'V'), - (0xA654, 'M', u'ꙕ'), - (0xA655, 'V'), - (0xA656, 'M', u'ꙗ'), - (0xA657, 'V'), - (0xA658, 'M', u'ꙙ'), - (0xA659, 'V'), - (0xA65A, 'M', u'ꙛ'), - (0xA65B, 'V'), - (0xA65C, 'M', u'ꙝ'), - (0xA65D, 'V'), - (0xA65E, 'M', u'ꙟ'), - (0xA65F, 'V'), - (0xA660, 'M', u'ꙡ'), - (0xA661, 'V'), - (0xA662, 'M', u'ꙣ'), - (0xA663, 'V'), - (0xA664, 'M', u'ꙥ'), - (0xA665, 'V'), - (0xA666, 'M', u'ꙧ'), - (0xA667, 'V'), - (0xA668, 'M', u'ꙩ'), - (0xA669, 'V'), - (0xA66A, 'M', u'ꙫ'), - (0xA66B, 'V'), - (0xA66C, 'M', u'ꙭ'), - (0xA66D, 'V'), - (0xA680, 'M', u'ꚁ'), - (0xA681, 'V'), - (0xA682, 'M', u'ꚃ'), - (0xA683, 'V'), - (0xA684, 'M', u'ꚅ'), - (0xA685, 'V'), - (0xA686, 'M', u'ꚇ'), - (0xA687, 'V'), - (0xA688, 'M', u'ꚉ'), - (0xA689, 'V'), - (0xA68A, 'M', u'ꚋ'), - (0xA68B, 'V'), - (0xA68C, 'M', u'ꚍ'), - (0xA68D, 'V'), - (0xA68E, 'M', u'ꚏ'), - (0xA68F, 'V'), - (0xA690, 'M', u'ꚑ'), - (0xA691, 'V'), - (0xA692, 'M', u'ꚓ'), - (0xA693, 'V'), - (0xA694, 'M', u'ꚕ'), - (0xA695, 'V'), - (0xA696, 'M', u'ꚗ'), - (0xA697, 'V'), - (0xA698, 'M', u'ꚙ'), - (0xA699, 'V'), - (0xA69A, 'M', u'ꚛ'), - (0xA69B, 'V'), - (0xA69C, 'M', u'ъ'), - (0xA69D, 'M', u'ь'), - (0xA69E, 'V'), - (0xA6F8, 'X'), - ] - -def _seg_36(): - return [ - (0xA700, 'V'), - (0xA722, 'M', u'ꜣ'), - (0xA723, 'V'), - (0xA724, 'M', u'ꜥ'), - (0xA725, 'V'), - (0xA726, 'M', u'ꜧ'), - (0xA727, 'V'), - (0xA728, 'M', u'ꜩ'), - (0xA729, 'V'), - (0xA72A, 'M', u'ꜫ'), - (0xA72B, 'V'), - (0xA72C, 'M', u'ꜭ'), - (0xA72D, 'V'), - (0xA72E, 'M', u'ꜯ'), - (0xA72F, 'V'), - (0xA732, 'M', u'ꜳ'), - (0xA733, 'V'), - (0xA734, 'M', u'ꜵ'), - (0xA735, 'V'), - (0xA736, 'M', u'ꜷ'), - (0xA737, 'V'), - (0xA738, 'M', u'ꜹ'), - (0xA739, 'V'), - (0xA73A, 'M', u'ꜻ'), - (0xA73B, 'V'), - (0xA73C, 'M', u'ꜽ'), - (0xA73D, 'V'), - (0xA73E, 'M', u'ꜿ'), - (0xA73F, 'V'), - (0xA740, 'M', u'ꝁ'), - (0xA741, 'V'), - (0xA742, 'M', u'ꝃ'), - (0xA743, 'V'), - (0xA744, 'M', u'ꝅ'), - (0xA745, 'V'), - (0xA746, 'M', u'ꝇ'), - (0xA747, 'V'), - (0xA748, 'M', u'ꝉ'), - (0xA749, 'V'), - (0xA74A, 'M', u'ꝋ'), - (0xA74B, 'V'), - (0xA74C, 'M', u'ꝍ'), - (0xA74D, 'V'), - (0xA74E, 'M', u'ꝏ'), - (0xA74F, 'V'), - (0xA750, 'M', u'ꝑ'), - (0xA751, 'V'), - (0xA752, 'M', u'ꝓ'), - (0xA753, 'V'), - (0xA754, 'M', u'ꝕ'), - (0xA755, 'V'), - (0xA756, 'M', u'ꝗ'), - (0xA757, 'V'), - (0xA758, 'M', u'ꝙ'), - (0xA759, 'V'), - (0xA75A, 'M', u'ꝛ'), - (0xA75B, 'V'), - (0xA75C, 'M', u'ꝝ'), - (0xA75D, 'V'), - (0xA75E, 'M', u'ꝟ'), - (0xA75F, 'V'), - (0xA760, 'M', u'ꝡ'), - (0xA761, 'V'), - (0xA762, 'M', u'ꝣ'), - (0xA763, 'V'), - (0xA764, 'M', u'ꝥ'), - (0xA765, 'V'), - (0xA766, 'M', u'ꝧ'), - (0xA767, 'V'), - (0xA768, 'M', u'ꝩ'), - (0xA769, 'V'), - (0xA76A, 'M', u'ꝫ'), - (0xA76B, 'V'), - (0xA76C, 'M', u'ꝭ'), - (0xA76D, 'V'), - (0xA76E, 'M', u'ꝯ'), - (0xA76F, 'V'), - (0xA770, 'M', u'ꝯ'), - (0xA771, 'V'), - (0xA779, 'M', u'ꝺ'), - (0xA77A, 'V'), - (0xA77B, 'M', u'ꝼ'), - (0xA77C, 'V'), - (0xA77D, 'M', u'ᵹ'), - (0xA77E, 'M', u'ꝿ'), - (0xA77F, 'V'), - (0xA780, 'M', u'ꞁ'), - (0xA781, 'V'), - (0xA782, 'M', u'ꞃ'), - (0xA783, 'V'), - (0xA784, 'M', u'ꞅ'), - (0xA785, 'V'), - (0xA786, 'M', u'ꞇ'), - (0xA787, 'V'), - (0xA78B, 'M', u'ꞌ'), - (0xA78C, 'V'), - (0xA78D, 'M', u'ɥ'), - (0xA78E, 'V'), - (0xA790, 'M', u'ꞑ'), - (0xA791, 'V'), - ] - -def _seg_37(): - return [ - (0xA792, 'M', u'ꞓ'), - (0xA793, 'V'), - (0xA796, 'M', u'ꞗ'), - (0xA797, 'V'), - (0xA798, 'M', u'ꞙ'), - (0xA799, 'V'), - (0xA79A, 'M', u'ꞛ'), - (0xA79B, 'V'), - (0xA79C, 'M', u'ꞝ'), - (0xA79D, 'V'), - (0xA79E, 'M', u'ꞟ'), - (0xA79F, 'V'), - (0xA7A0, 'M', u'ꞡ'), - (0xA7A1, 'V'), - (0xA7A2, 'M', u'ꞣ'), - (0xA7A3, 'V'), - (0xA7A4, 'M', u'ꞥ'), - (0xA7A5, 'V'), - (0xA7A6, 'M', u'ꞧ'), - (0xA7A7, 'V'), - (0xA7A8, 'M', u'ꞩ'), - (0xA7A9, 'V'), - (0xA7AA, 'M', u'ɦ'), - (0xA7AB, 'M', u'ɜ'), - (0xA7AC, 'M', u'ɡ'), - (0xA7AD, 'M', u'ɬ'), - (0xA7AE, 'M', u'ɪ'), - (0xA7AF, 'V'), - (0xA7B0, 'M', u'ʞ'), - (0xA7B1, 'M', u'ʇ'), - (0xA7B2, 'M', u'ʝ'), - (0xA7B3, 'M', u'ꭓ'), - (0xA7B4, 'M', u'ꞵ'), - (0xA7B5, 'V'), - (0xA7B6, 'M', u'ꞷ'), - (0xA7B7, 'V'), - (0xA7B8, 'X'), - (0xA7B9, 'V'), - (0xA7BA, 'X'), - (0xA7F7, 'V'), - (0xA7F8, 'M', u'ħ'), - (0xA7F9, 'M', u'œ'), - (0xA7FA, 'V'), - (0xA82C, 'X'), - (0xA830, 'V'), - (0xA83A, 'X'), - (0xA840, 'V'), - (0xA878, 'X'), - (0xA880, 'V'), - (0xA8C6, 'X'), - (0xA8CE, 'V'), - (0xA8DA, 'X'), - (0xA8E0, 'V'), - (0xA954, 'X'), - (0xA95F, 'V'), - (0xA97D, 'X'), - (0xA980, 'V'), - (0xA9CE, 'X'), - (0xA9CF, 'V'), - (0xA9DA, 'X'), - (0xA9DE, 'V'), - (0xA9FF, 'X'), - (0xAA00, 'V'), - (0xAA37, 'X'), - (0xAA40, 'V'), - (0xAA4E, 'X'), - (0xAA50, 'V'), - (0xAA5A, 'X'), - (0xAA5C, 'V'), - (0xAAC3, 'X'), - (0xAADB, 'V'), - (0xAAF7, 'X'), - (0xAB01, 'V'), - (0xAB07, 'X'), - (0xAB09, 'V'), - (0xAB0F, 'X'), - (0xAB11, 'V'), - (0xAB17, 'X'), - (0xAB20, 'V'), - (0xAB27, 'X'), - (0xAB28, 'V'), - (0xAB2F, 'X'), - (0xAB30, 'V'), - (0xAB5C, 'M', u'ꜧ'), - (0xAB5D, 'M', u'ꬷ'), - (0xAB5E, 'M', u'ɫ'), - (0xAB5F, 'M', u'ꭒ'), - (0xAB60, 'V'), - (0xAB66, 'X'), - (0xAB70, 'M', u'Ꭰ'), - (0xAB71, 'M', u'Ꭱ'), - (0xAB72, 'M', u'Ꭲ'), - (0xAB73, 'M', u'Ꭳ'), - (0xAB74, 'M', u'Ꭴ'), - (0xAB75, 'M', u'Ꭵ'), - (0xAB76, 'M', u'Ꭶ'), - (0xAB77, 'M', u'Ꭷ'), - (0xAB78, 'M', u'Ꭸ'), - (0xAB79, 'M', u'Ꭹ'), - (0xAB7A, 'M', u'Ꭺ'), - ] - -def _seg_38(): - return [ - (0xAB7B, 'M', u'Ꭻ'), - (0xAB7C, 'M', u'Ꭼ'), - (0xAB7D, 'M', u'Ꭽ'), - (0xAB7E, 'M', u'Ꭾ'), - (0xAB7F, 'M', u'Ꭿ'), - (0xAB80, 'M', u'Ꮀ'), - (0xAB81, 'M', u'Ꮁ'), - (0xAB82, 'M', u'Ꮂ'), - (0xAB83, 'M', u'Ꮃ'), - (0xAB84, 'M', u'Ꮄ'), - (0xAB85, 'M', u'Ꮅ'), - (0xAB86, 'M', u'Ꮆ'), - (0xAB87, 'M', u'Ꮇ'), - (0xAB88, 'M', u'Ꮈ'), - (0xAB89, 'M', u'Ꮉ'), - (0xAB8A, 'M', u'Ꮊ'), - (0xAB8B, 'M', u'Ꮋ'), - (0xAB8C, 'M', u'Ꮌ'), - (0xAB8D, 'M', u'Ꮍ'), - (0xAB8E, 'M', u'Ꮎ'), - (0xAB8F, 'M', u'Ꮏ'), - (0xAB90, 'M', u'Ꮐ'), - (0xAB91, 'M', u'Ꮑ'), - (0xAB92, 'M', u'Ꮒ'), - (0xAB93, 'M', u'Ꮓ'), - (0xAB94, 'M', u'Ꮔ'), - (0xAB95, 'M', u'Ꮕ'), - (0xAB96, 'M', u'Ꮖ'), - (0xAB97, 'M', u'Ꮗ'), - (0xAB98, 'M', u'Ꮘ'), - (0xAB99, 'M', u'Ꮙ'), - (0xAB9A, 'M', u'Ꮚ'), - (0xAB9B, 'M', u'Ꮛ'), - (0xAB9C, 'M', u'Ꮜ'), - (0xAB9D, 'M', u'Ꮝ'), - (0xAB9E, 'M', u'Ꮞ'), - (0xAB9F, 'M', u'Ꮟ'), - (0xABA0, 'M', u'Ꮠ'), - (0xABA1, 'M', u'Ꮡ'), - (0xABA2, 'M', u'Ꮢ'), - (0xABA3, 'M', u'Ꮣ'), - (0xABA4, 'M', u'Ꮤ'), - (0xABA5, 'M', u'Ꮥ'), - (0xABA6, 'M', u'Ꮦ'), - (0xABA7, 'M', u'Ꮧ'), - (0xABA8, 'M', u'Ꮨ'), - (0xABA9, 'M', u'Ꮩ'), - (0xABAA, 'M', u'Ꮪ'), - (0xABAB, 'M', u'Ꮫ'), - (0xABAC, 'M', u'Ꮬ'), - (0xABAD, 'M', u'Ꮭ'), - (0xABAE, 'M', u'Ꮮ'), - (0xABAF, 'M', u'Ꮯ'), - (0xABB0, 'M', u'Ꮰ'), - (0xABB1, 'M', u'Ꮱ'), - (0xABB2, 'M', u'Ꮲ'), - (0xABB3, 'M', u'Ꮳ'), - (0xABB4, 'M', u'Ꮴ'), - (0xABB5, 'M', u'Ꮵ'), - (0xABB6, 'M', u'Ꮶ'), - (0xABB7, 'M', u'Ꮷ'), - (0xABB8, 'M', u'Ꮸ'), - (0xABB9, 'M', u'Ꮹ'), - (0xABBA, 'M', u'Ꮺ'), - (0xABBB, 'M', u'Ꮻ'), - (0xABBC, 'M', u'Ꮼ'), - (0xABBD, 'M', u'Ꮽ'), - (0xABBE, 'M', u'Ꮾ'), - (0xABBF, 'M', u'Ꮿ'), - (0xABC0, 'V'), - (0xABEE, 'X'), - (0xABF0, 'V'), - (0xABFA, 'X'), - (0xAC00, 'V'), - (0xD7A4, 'X'), - (0xD7B0, 'V'), - (0xD7C7, 'X'), - (0xD7CB, 'V'), - (0xD7FC, 'X'), - (0xF900, 'M', u'豈'), - (0xF901, 'M', u'更'), - (0xF902, 'M', u'車'), - (0xF903, 'M', u'賈'), - (0xF904, 'M', u'滑'), - (0xF905, 'M', u'串'), - (0xF906, 'M', u'句'), - (0xF907, 'M', u'龜'), - (0xF909, 'M', u'契'), - (0xF90A, 'M', u'金'), - (0xF90B, 'M', u'喇'), - (0xF90C, 'M', u'奈'), - (0xF90D, 'M', u'懶'), - (0xF90E, 'M', u'癩'), - (0xF90F, 'M', u'羅'), - (0xF910, 'M', u'蘿'), - (0xF911, 'M', u'螺'), - (0xF912, 'M', u'裸'), - (0xF913, 'M', u'邏'), - (0xF914, 'M', u'樂'), - (0xF915, 'M', u'洛'), - ] - -def _seg_39(): - return [ - (0xF916, 'M', u'烙'), - (0xF917, 'M', u'珞'), - (0xF918, 'M', u'落'), - (0xF919, 'M', u'酪'), - (0xF91A, 'M', u'駱'), - (0xF91B, 'M', u'亂'), - (0xF91C, 'M', u'卵'), - (0xF91D, 'M', u'欄'), - (0xF91E, 'M', u'爛'), - (0xF91F, 'M', u'蘭'), - (0xF920, 'M', u'鸞'), - (0xF921, 'M', u'嵐'), - (0xF922, 'M', u'濫'), - (0xF923, 'M', u'藍'), - (0xF924, 'M', u'襤'), - (0xF925, 'M', u'拉'), - (0xF926, 'M', u'臘'), - (0xF927, 'M', u'蠟'), - (0xF928, 'M', u'廊'), - (0xF929, 'M', u'朗'), - (0xF92A, 'M', u'浪'), - (0xF92B, 'M', u'狼'), - (0xF92C, 'M', u'郎'), - (0xF92D, 'M', u'來'), - (0xF92E, 'M', u'冷'), - (0xF92F, 'M', u'勞'), - (0xF930, 'M', u'擄'), - (0xF931, 'M', u'櫓'), - (0xF932, 'M', u'爐'), - (0xF933, 'M', u'盧'), - (0xF934, 'M', u'老'), - (0xF935, 'M', u'蘆'), - (0xF936, 'M', u'虜'), - (0xF937, 'M', u'路'), - (0xF938, 'M', u'露'), - (0xF939, 'M', u'魯'), - (0xF93A, 'M', u'鷺'), - (0xF93B, 'M', u'碌'), - (0xF93C, 'M', u'祿'), - (0xF93D, 'M', u'綠'), - (0xF93E, 'M', u'菉'), - (0xF93F, 'M', u'錄'), - (0xF940, 'M', u'鹿'), - (0xF941, 'M', u'論'), - (0xF942, 'M', u'壟'), - (0xF943, 'M', u'弄'), - (0xF944, 'M', u'籠'), - (0xF945, 'M', u'聾'), - (0xF946, 'M', u'牢'), - (0xF947, 'M', u'磊'), - (0xF948, 'M', u'賂'), - (0xF949, 'M', u'雷'), - (0xF94A, 'M', u'壘'), - (0xF94B, 'M', u'屢'), - (0xF94C, 'M', u'樓'), - (0xF94D, 'M', u'淚'), - (0xF94E, 'M', u'漏'), - (0xF94F, 'M', u'累'), - (0xF950, 'M', u'縷'), - (0xF951, 'M', u'陋'), - (0xF952, 'M', u'勒'), - (0xF953, 'M', u'肋'), - (0xF954, 'M', u'凜'), - (0xF955, 'M', u'凌'), - (0xF956, 'M', u'稜'), - (0xF957, 'M', u'綾'), - (0xF958, 'M', u'菱'), - (0xF959, 'M', u'陵'), - (0xF95A, 'M', u'讀'), - (0xF95B, 'M', u'拏'), - (0xF95C, 'M', u'樂'), - (0xF95D, 'M', u'諾'), - (0xF95E, 'M', u'丹'), - (0xF95F, 'M', u'寧'), - (0xF960, 'M', u'怒'), - (0xF961, 'M', u'率'), - (0xF962, 'M', u'異'), - (0xF963, 'M', u'北'), - (0xF964, 'M', u'磻'), - (0xF965, 'M', u'便'), - (0xF966, 'M', u'復'), - (0xF967, 'M', u'不'), - (0xF968, 'M', u'泌'), - (0xF969, 'M', u'數'), - (0xF96A, 'M', u'索'), - (0xF96B, 'M', u'參'), - (0xF96C, 'M', u'塞'), - (0xF96D, 'M', u'省'), - (0xF96E, 'M', u'葉'), - (0xF96F, 'M', u'說'), - (0xF970, 'M', u'殺'), - (0xF971, 'M', u'辰'), - (0xF972, 'M', u'沈'), - (0xF973, 'M', u'拾'), - (0xF974, 'M', u'若'), - (0xF975, 'M', u'掠'), - (0xF976, 'M', u'略'), - (0xF977, 'M', u'亮'), - (0xF978, 'M', u'兩'), - (0xF979, 'M', u'凉'), - ] - -def _seg_40(): - return [ - (0xF97A, 'M', u'梁'), - (0xF97B, 'M', u'糧'), - (0xF97C, 'M', u'良'), - (0xF97D, 'M', u'諒'), - (0xF97E, 'M', u'量'), - (0xF97F, 'M', u'勵'), - (0xF980, 'M', u'呂'), - (0xF981, 'M', u'女'), - (0xF982, 'M', u'廬'), - (0xF983, 'M', u'旅'), - (0xF984, 'M', u'濾'), - (0xF985, 'M', u'礪'), - (0xF986, 'M', u'閭'), - (0xF987, 'M', u'驪'), - (0xF988, 'M', u'麗'), - (0xF989, 'M', u'黎'), - (0xF98A, 'M', u'力'), - (0xF98B, 'M', u'曆'), - (0xF98C, 'M', u'歷'), - (0xF98D, 'M', u'轢'), - (0xF98E, 'M', u'年'), - (0xF98F, 'M', u'憐'), - (0xF990, 'M', u'戀'), - (0xF991, 'M', u'撚'), - (0xF992, 'M', u'漣'), - (0xF993, 'M', u'煉'), - (0xF994, 'M', u'璉'), - (0xF995, 'M', u'秊'), - (0xF996, 'M', u'練'), - (0xF997, 'M', u'聯'), - (0xF998, 'M', u'輦'), - (0xF999, 'M', u'蓮'), - (0xF99A, 'M', u'連'), - (0xF99B, 'M', u'鍊'), - (0xF99C, 'M', u'列'), - (0xF99D, 'M', u'劣'), - (0xF99E, 'M', u'咽'), - (0xF99F, 'M', u'烈'), - (0xF9A0, 'M', u'裂'), - (0xF9A1, 'M', u'說'), - (0xF9A2, 'M', u'廉'), - (0xF9A3, 'M', u'念'), - (0xF9A4, 'M', u'捻'), - (0xF9A5, 'M', u'殮'), - (0xF9A6, 'M', u'簾'), - (0xF9A7, 'M', u'獵'), - (0xF9A8, 'M', u'令'), - (0xF9A9, 'M', u'囹'), - (0xF9AA, 'M', u'寧'), - (0xF9AB, 'M', u'嶺'), - (0xF9AC, 'M', u'怜'), - (0xF9AD, 'M', u'玲'), - (0xF9AE, 'M', u'瑩'), - (0xF9AF, 'M', u'羚'), - (0xF9B0, 'M', u'聆'), - (0xF9B1, 'M', u'鈴'), - (0xF9B2, 'M', u'零'), - (0xF9B3, 'M', u'靈'), - (0xF9B4, 'M', u'領'), - (0xF9B5, 'M', u'例'), - (0xF9B6, 'M', u'禮'), - (0xF9B7, 'M', u'醴'), - (0xF9B8, 'M', u'隸'), - (0xF9B9, 'M', u'惡'), - (0xF9BA, 'M', u'了'), - (0xF9BB, 'M', u'僚'), - (0xF9BC, 'M', u'寮'), - (0xF9BD, 'M', u'尿'), - (0xF9BE, 'M', u'料'), - (0xF9BF, 'M', u'樂'), - (0xF9C0, 'M', u'燎'), - (0xF9C1, 'M', u'療'), - (0xF9C2, 'M', u'蓼'), - (0xF9C3, 'M', u'遼'), - (0xF9C4, 'M', u'龍'), - (0xF9C5, 'M', u'暈'), - (0xF9C6, 'M', u'阮'), - (0xF9C7, 'M', u'劉'), - (0xF9C8, 'M', u'杻'), - (0xF9C9, 'M', u'柳'), - (0xF9CA, 'M', u'流'), - (0xF9CB, 'M', u'溜'), - (0xF9CC, 'M', u'琉'), - (0xF9CD, 'M', u'留'), - (0xF9CE, 'M', u'硫'), - (0xF9CF, 'M', u'紐'), - (0xF9D0, 'M', u'類'), - (0xF9D1, 'M', u'六'), - (0xF9D2, 'M', u'戮'), - (0xF9D3, 'M', u'陸'), - (0xF9D4, 'M', u'倫'), - (0xF9D5, 'M', u'崙'), - (0xF9D6, 'M', u'淪'), - (0xF9D7, 'M', u'輪'), - (0xF9D8, 'M', u'律'), - (0xF9D9, 'M', u'慄'), - (0xF9DA, 'M', u'栗'), - (0xF9DB, 'M', u'率'), - (0xF9DC, 'M', u'隆'), - (0xF9DD, 'M', u'利'), - ] - -def _seg_41(): - return [ - (0xF9DE, 'M', u'吏'), - (0xF9DF, 'M', u'履'), - (0xF9E0, 'M', u'易'), - (0xF9E1, 'M', u'李'), - (0xF9E2, 'M', u'梨'), - (0xF9E3, 'M', u'泥'), - (0xF9E4, 'M', u'理'), - (0xF9E5, 'M', u'痢'), - (0xF9E6, 'M', u'罹'), - (0xF9E7, 'M', u'裏'), - (0xF9E8, 'M', u'裡'), - (0xF9E9, 'M', u'里'), - (0xF9EA, 'M', u'離'), - (0xF9EB, 'M', u'匿'), - (0xF9EC, 'M', u'溺'), - (0xF9ED, 'M', u'吝'), - (0xF9EE, 'M', u'燐'), - (0xF9EF, 'M', u'璘'), - (0xF9F0, 'M', u'藺'), - (0xF9F1, 'M', u'隣'), - (0xF9F2, 'M', u'鱗'), - (0xF9F3, 'M', u'麟'), - (0xF9F4, 'M', u'林'), - (0xF9F5, 'M', u'淋'), - (0xF9F6, 'M', u'臨'), - (0xF9F7, 'M', u'立'), - (0xF9F8, 'M', u'笠'), - (0xF9F9, 'M', u'粒'), - (0xF9FA, 'M', u'狀'), - (0xF9FB, 'M', u'炙'), - (0xF9FC, 'M', u'識'), - (0xF9FD, 'M', u'什'), - (0xF9FE, 'M', u'茶'), - (0xF9FF, 'M', u'刺'), - (0xFA00, 'M', u'切'), - (0xFA01, 'M', u'度'), - (0xFA02, 'M', u'拓'), - (0xFA03, 'M', u'糖'), - (0xFA04, 'M', u'宅'), - (0xFA05, 'M', u'洞'), - (0xFA06, 'M', u'暴'), - (0xFA07, 'M', u'輻'), - (0xFA08, 'M', u'行'), - (0xFA09, 'M', u'降'), - (0xFA0A, 'M', u'見'), - (0xFA0B, 'M', u'廓'), - (0xFA0C, 'M', u'兀'), - (0xFA0D, 'M', u'嗀'), - (0xFA0E, 'V'), - (0xFA10, 'M', u'塚'), - (0xFA11, 'V'), - (0xFA12, 'M', u'晴'), - (0xFA13, 'V'), - (0xFA15, 'M', u'凞'), - (0xFA16, 'M', u'猪'), - (0xFA17, 'M', u'益'), - (0xFA18, 'M', u'礼'), - (0xFA19, 'M', u'神'), - (0xFA1A, 'M', u'祥'), - (0xFA1B, 'M', u'福'), - (0xFA1C, 'M', u'靖'), - (0xFA1D, 'M', u'精'), - (0xFA1E, 'M', u'羽'), - (0xFA1F, 'V'), - (0xFA20, 'M', u'蘒'), - (0xFA21, 'V'), - (0xFA22, 'M', u'諸'), - (0xFA23, 'V'), - (0xFA25, 'M', u'逸'), - (0xFA26, 'M', u'都'), - (0xFA27, 'V'), - (0xFA2A, 'M', u'飯'), - (0xFA2B, 'M', u'飼'), - (0xFA2C, 'M', u'館'), - (0xFA2D, 'M', u'鶴'), - (0xFA2E, 'M', u'郞'), - (0xFA2F, 'M', u'隷'), - (0xFA30, 'M', u'侮'), - (0xFA31, 'M', u'僧'), - (0xFA32, 'M', u'免'), - (0xFA33, 'M', u'勉'), - (0xFA34, 'M', u'勤'), - (0xFA35, 'M', u'卑'), - (0xFA36, 'M', u'喝'), - (0xFA37, 'M', u'嘆'), - (0xFA38, 'M', u'器'), - (0xFA39, 'M', u'塀'), - (0xFA3A, 'M', u'墨'), - (0xFA3B, 'M', u'層'), - (0xFA3C, 'M', u'屮'), - (0xFA3D, 'M', u'悔'), - (0xFA3E, 'M', u'慨'), - (0xFA3F, 'M', u'憎'), - (0xFA40, 'M', u'懲'), - (0xFA41, 'M', u'敏'), - (0xFA42, 'M', u'既'), - (0xFA43, 'M', u'暑'), - (0xFA44, 'M', u'梅'), - (0xFA45, 'M', u'海'), - (0xFA46, 'M', u'渚'), - ] - -def _seg_42(): - return [ - (0xFA47, 'M', u'漢'), - (0xFA48, 'M', u'煮'), - (0xFA49, 'M', u'爫'), - (0xFA4A, 'M', u'琢'), - (0xFA4B, 'M', u'碑'), - (0xFA4C, 'M', u'社'), - (0xFA4D, 'M', u'祉'), - (0xFA4E, 'M', u'祈'), - (0xFA4F, 'M', u'祐'), - (0xFA50, 'M', u'祖'), - (0xFA51, 'M', u'祝'), - (0xFA52, 'M', u'禍'), - (0xFA53, 'M', u'禎'), - (0xFA54, 'M', u'穀'), - (0xFA55, 'M', u'突'), - (0xFA56, 'M', u'節'), - (0xFA57, 'M', u'練'), - (0xFA58, 'M', u'縉'), - (0xFA59, 'M', u'繁'), - (0xFA5A, 'M', u'署'), - (0xFA5B, 'M', u'者'), - (0xFA5C, 'M', u'臭'), - (0xFA5D, 'M', u'艹'), - (0xFA5F, 'M', u'著'), - (0xFA60, 'M', u'褐'), - (0xFA61, 'M', u'視'), - (0xFA62, 'M', u'謁'), - (0xFA63, 'M', u'謹'), - (0xFA64, 'M', u'賓'), - (0xFA65, 'M', u'贈'), - (0xFA66, 'M', u'辶'), - (0xFA67, 'M', u'逸'), - (0xFA68, 'M', u'難'), - (0xFA69, 'M', u'響'), - (0xFA6A, 'M', u'頻'), - (0xFA6B, 'M', u'恵'), - (0xFA6C, 'M', u'𤋮'), - (0xFA6D, 'M', u'舘'), - (0xFA6E, 'X'), - (0xFA70, 'M', u'並'), - (0xFA71, 'M', u'况'), - (0xFA72, 'M', u'全'), - (0xFA73, 'M', u'侀'), - (0xFA74, 'M', u'充'), - (0xFA75, 'M', u'冀'), - (0xFA76, 'M', u'勇'), - (0xFA77, 'M', u'勺'), - (0xFA78, 'M', u'喝'), - (0xFA79, 'M', u'啕'), - (0xFA7A, 'M', u'喙'), - (0xFA7B, 'M', u'嗢'), - (0xFA7C, 'M', u'塚'), - (0xFA7D, 'M', u'墳'), - (0xFA7E, 'M', u'奄'), - (0xFA7F, 'M', u'奔'), - (0xFA80, 'M', u'婢'), - (0xFA81, 'M', u'嬨'), - (0xFA82, 'M', u'廒'), - (0xFA83, 'M', u'廙'), - (0xFA84, 'M', u'彩'), - (0xFA85, 'M', u'徭'), - (0xFA86, 'M', u'惘'), - (0xFA87, 'M', u'慎'), - (0xFA88, 'M', u'愈'), - (0xFA89, 'M', u'憎'), - (0xFA8A, 'M', u'慠'), - (0xFA8B, 'M', u'懲'), - (0xFA8C, 'M', u'戴'), - (0xFA8D, 'M', u'揄'), - (0xFA8E, 'M', u'搜'), - (0xFA8F, 'M', u'摒'), - (0xFA90, 'M', u'敖'), - (0xFA91, 'M', u'晴'), - (0xFA92, 'M', u'朗'), - (0xFA93, 'M', u'望'), - (0xFA94, 'M', u'杖'), - (0xFA95, 'M', u'歹'), - (0xFA96, 'M', u'殺'), - (0xFA97, 'M', u'流'), - (0xFA98, 'M', u'滛'), - (0xFA99, 'M', u'滋'), - (0xFA9A, 'M', u'漢'), - (0xFA9B, 'M', u'瀞'), - (0xFA9C, 'M', u'煮'), - (0xFA9D, 'M', u'瞧'), - (0xFA9E, 'M', u'爵'), - (0xFA9F, 'M', u'犯'), - (0xFAA0, 'M', u'猪'), - (0xFAA1, 'M', u'瑱'), - (0xFAA2, 'M', u'甆'), - (0xFAA3, 'M', u'画'), - (0xFAA4, 'M', u'瘝'), - (0xFAA5, 'M', u'瘟'), - (0xFAA6, 'M', u'益'), - (0xFAA7, 'M', u'盛'), - (0xFAA8, 'M', u'直'), - (0xFAA9, 'M', u'睊'), - (0xFAAA, 'M', u'着'), - (0xFAAB, 'M', u'磌'), - (0xFAAC, 'M', u'窱'), - ] - -def _seg_43(): - return [ - (0xFAAD, 'M', u'節'), - (0xFAAE, 'M', u'类'), - (0xFAAF, 'M', u'絛'), - (0xFAB0, 'M', u'練'), - (0xFAB1, 'M', u'缾'), - (0xFAB2, 'M', u'者'), - (0xFAB3, 'M', u'荒'), - (0xFAB4, 'M', u'華'), - (0xFAB5, 'M', u'蝹'), - (0xFAB6, 'M', u'襁'), - (0xFAB7, 'M', u'覆'), - (0xFAB8, 'M', u'視'), - (0xFAB9, 'M', u'調'), - (0xFABA, 'M', u'諸'), - (0xFABB, 'M', u'請'), - (0xFABC, 'M', u'謁'), - (0xFABD, 'M', u'諾'), - (0xFABE, 'M', u'諭'), - (0xFABF, 'M', u'謹'), - (0xFAC0, 'M', u'變'), - (0xFAC1, 'M', u'贈'), - (0xFAC2, 'M', u'輸'), - (0xFAC3, 'M', u'遲'), - (0xFAC4, 'M', u'醙'), - (0xFAC5, 'M', u'鉶'), - (0xFAC6, 'M', u'陼'), - (0xFAC7, 'M', u'難'), - (0xFAC8, 'M', u'靖'), - (0xFAC9, 'M', u'韛'), - (0xFACA, 'M', u'響'), - (0xFACB, 'M', u'頋'), - (0xFACC, 'M', u'頻'), - (0xFACD, 'M', u'鬒'), - (0xFACE, 'M', u'龜'), - (0xFACF, 'M', u'𢡊'), - (0xFAD0, 'M', u'𢡄'), - (0xFAD1, 'M', u'𣏕'), - (0xFAD2, 'M', u'㮝'), - (0xFAD3, 'M', u'䀘'), - (0xFAD4, 'M', u'䀹'), - (0xFAD5, 'M', u'𥉉'), - (0xFAD6, 'M', u'𥳐'), - (0xFAD7, 'M', u'𧻓'), - (0xFAD8, 'M', u'齃'), - (0xFAD9, 'M', u'龎'), - (0xFADA, 'X'), - (0xFB00, 'M', u'ff'), - (0xFB01, 'M', u'fi'), - (0xFB02, 'M', u'fl'), - (0xFB03, 'M', u'ffi'), - (0xFB04, 'M', u'ffl'), - (0xFB05, 'M', u'st'), - (0xFB07, 'X'), - (0xFB13, 'M', u'մն'), - (0xFB14, 'M', u'մե'), - (0xFB15, 'M', u'մի'), - (0xFB16, 'M', u'վն'), - (0xFB17, 'M', u'մխ'), - (0xFB18, 'X'), - (0xFB1D, 'M', u'יִ'), - (0xFB1E, 'V'), - (0xFB1F, 'M', u'ײַ'), - (0xFB20, 'M', u'ע'), - (0xFB21, 'M', u'א'), - (0xFB22, 'M', u'ד'), - (0xFB23, 'M', u'ה'), - (0xFB24, 'M', u'כ'), - (0xFB25, 'M', u'ל'), - (0xFB26, 'M', u'ם'), - (0xFB27, 'M', u'ר'), - (0xFB28, 'M', u'ת'), - (0xFB29, '3', u'+'), - (0xFB2A, 'M', u'שׁ'), - (0xFB2B, 'M', u'שׂ'), - (0xFB2C, 'M', u'שּׁ'), - (0xFB2D, 'M', u'שּׂ'), - (0xFB2E, 'M', u'אַ'), - (0xFB2F, 'M', u'אָ'), - (0xFB30, 'M', u'אּ'), - (0xFB31, 'M', u'בּ'), - (0xFB32, 'M', u'גּ'), - (0xFB33, 'M', u'דּ'), - (0xFB34, 'M', u'הּ'), - (0xFB35, 'M', u'וּ'), - (0xFB36, 'M', u'זּ'), - (0xFB37, 'X'), - (0xFB38, 'M', u'טּ'), - (0xFB39, 'M', u'יּ'), - (0xFB3A, 'M', u'ךּ'), - (0xFB3B, 'M', u'כּ'), - (0xFB3C, 'M', u'לּ'), - (0xFB3D, 'X'), - (0xFB3E, 'M', u'מּ'), - (0xFB3F, 'X'), - (0xFB40, 'M', u'נּ'), - (0xFB41, 'M', u'סּ'), - (0xFB42, 'X'), - (0xFB43, 'M', u'ףּ'), - (0xFB44, 'M', u'פּ'), - (0xFB45, 'X'), - ] - -def _seg_44(): - return [ - (0xFB46, 'M', u'צּ'), - (0xFB47, 'M', u'קּ'), - (0xFB48, 'M', u'רּ'), - (0xFB49, 'M', u'שּ'), - (0xFB4A, 'M', u'תּ'), - (0xFB4B, 'M', u'וֹ'), - (0xFB4C, 'M', u'בֿ'), - (0xFB4D, 'M', u'כֿ'), - (0xFB4E, 'M', u'פֿ'), - (0xFB4F, 'M', u'אל'), - (0xFB50, 'M', u'ٱ'), - (0xFB52, 'M', u'ٻ'), - (0xFB56, 'M', u'پ'), - (0xFB5A, 'M', u'ڀ'), - (0xFB5E, 'M', u'ٺ'), - (0xFB62, 'M', u'ٿ'), - (0xFB66, 'M', u'ٹ'), - (0xFB6A, 'M', u'ڤ'), - (0xFB6E, 'M', u'ڦ'), - (0xFB72, 'M', u'ڄ'), - (0xFB76, 'M', u'ڃ'), - (0xFB7A, 'M', u'چ'), - (0xFB7E, 'M', u'ڇ'), - (0xFB82, 'M', u'ڍ'), - (0xFB84, 'M', u'ڌ'), - (0xFB86, 'M', u'ڎ'), - (0xFB88, 'M', u'ڈ'), - (0xFB8A, 'M', u'ژ'), - (0xFB8C, 'M', u'ڑ'), - (0xFB8E, 'M', u'ک'), - (0xFB92, 'M', u'گ'), - (0xFB96, 'M', u'ڳ'), - (0xFB9A, 'M', u'ڱ'), - (0xFB9E, 'M', u'ں'), - (0xFBA0, 'M', u'ڻ'), - (0xFBA4, 'M', u'ۀ'), - (0xFBA6, 'M', u'ہ'), - (0xFBAA, 'M', u'ھ'), - (0xFBAE, 'M', u'ے'), - (0xFBB0, 'M', u'ۓ'), - (0xFBB2, 'V'), - (0xFBC2, 'X'), - (0xFBD3, 'M', u'ڭ'), - (0xFBD7, 'M', u'ۇ'), - (0xFBD9, 'M', u'ۆ'), - (0xFBDB, 'M', u'ۈ'), - (0xFBDD, 'M', u'ۇٴ'), - (0xFBDE, 'M', u'ۋ'), - (0xFBE0, 'M', u'ۅ'), - (0xFBE2, 'M', u'ۉ'), - (0xFBE4, 'M', u'ې'), - (0xFBE8, 'M', u'ى'), - (0xFBEA, 'M', u'ئا'), - (0xFBEC, 'M', u'ئە'), - (0xFBEE, 'M', u'ئو'), - (0xFBF0, 'M', u'ئۇ'), - (0xFBF2, 'M', u'ئۆ'), - (0xFBF4, 'M', u'ئۈ'), - (0xFBF6, 'M', u'ئې'), - (0xFBF9, 'M', u'ئى'), - (0xFBFC, 'M', u'ی'), - (0xFC00, 'M', u'ئج'), - (0xFC01, 'M', u'ئح'), - (0xFC02, 'M', u'ئم'), - (0xFC03, 'M', u'ئى'), - (0xFC04, 'M', u'ئي'), - (0xFC05, 'M', u'بج'), - (0xFC06, 'M', u'بح'), - (0xFC07, 'M', u'بخ'), - (0xFC08, 'M', u'بم'), - (0xFC09, 'M', u'بى'), - (0xFC0A, 'M', u'بي'), - (0xFC0B, 'M', u'تج'), - (0xFC0C, 'M', u'تح'), - (0xFC0D, 'M', u'تخ'), - (0xFC0E, 'M', u'تم'), - (0xFC0F, 'M', u'تى'), - (0xFC10, 'M', u'تي'), - (0xFC11, 'M', u'ثج'), - (0xFC12, 'M', u'ثم'), - (0xFC13, 'M', u'ثى'), - (0xFC14, 'M', u'ثي'), - (0xFC15, 'M', u'جح'), - (0xFC16, 'M', u'جم'), - (0xFC17, 'M', u'حج'), - (0xFC18, 'M', u'حم'), - (0xFC19, 'M', u'خج'), - (0xFC1A, 'M', u'خح'), - (0xFC1B, 'M', u'خم'), - (0xFC1C, 'M', u'سج'), - (0xFC1D, 'M', u'سح'), - (0xFC1E, 'M', u'سخ'), - (0xFC1F, 'M', u'سم'), - (0xFC20, 'M', u'صح'), - (0xFC21, 'M', u'صم'), - (0xFC22, 'M', u'ضج'), - (0xFC23, 'M', u'ضح'), - (0xFC24, 'M', u'ضخ'), - (0xFC25, 'M', u'ضم'), - (0xFC26, 'M', u'طح'), - ] - -def _seg_45(): - return [ - (0xFC27, 'M', u'طم'), - (0xFC28, 'M', u'ظم'), - (0xFC29, 'M', u'عج'), - (0xFC2A, 'M', u'عم'), - (0xFC2B, 'M', u'غج'), - (0xFC2C, 'M', u'غم'), - (0xFC2D, 'M', u'فج'), - (0xFC2E, 'M', u'فح'), - (0xFC2F, 'M', u'فخ'), - (0xFC30, 'M', u'فم'), - (0xFC31, 'M', u'فى'), - (0xFC32, 'M', u'في'), - (0xFC33, 'M', u'قح'), - (0xFC34, 'M', u'قم'), - (0xFC35, 'M', u'قى'), - (0xFC36, 'M', u'قي'), - (0xFC37, 'M', u'كا'), - (0xFC38, 'M', u'كج'), - (0xFC39, 'M', u'كح'), - (0xFC3A, 'M', u'كخ'), - (0xFC3B, 'M', u'كل'), - (0xFC3C, 'M', u'كم'), - (0xFC3D, 'M', u'كى'), - (0xFC3E, 'M', u'كي'), - (0xFC3F, 'M', u'لج'), - (0xFC40, 'M', u'لح'), - (0xFC41, 'M', u'لخ'), - (0xFC42, 'M', u'لم'), - (0xFC43, 'M', u'لى'), - (0xFC44, 'M', u'لي'), - (0xFC45, 'M', u'مج'), - (0xFC46, 'M', u'مح'), - (0xFC47, 'M', u'مخ'), - (0xFC48, 'M', u'مم'), - (0xFC49, 'M', u'مى'), - (0xFC4A, 'M', u'مي'), - (0xFC4B, 'M', u'نج'), - (0xFC4C, 'M', u'نح'), - (0xFC4D, 'M', u'نخ'), - (0xFC4E, 'M', u'نم'), - (0xFC4F, 'M', u'نى'), - (0xFC50, 'M', u'ني'), - (0xFC51, 'M', u'هج'), - (0xFC52, 'M', u'هم'), - (0xFC53, 'M', u'هى'), - (0xFC54, 'M', u'هي'), - (0xFC55, 'M', u'يج'), - (0xFC56, 'M', u'يح'), - (0xFC57, 'M', u'يخ'), - (0xFC58, 'M', u'يم'), - (0xFC59, 'M', u'يى'), - (0xFC5A, 'M', u'يي'), - (0xFC5B, 'M', u'ذٰ'), - (0xFC5C, 'M', u'رٰ'), - (0xFC5D, 'M', u'ىٰ'), - (0xFC5E, '3', u' ٌّ'), - (0xFC5F, '3', u' ٍّ'), - (0xFC60, '3', u' َّ'), - (0xFC61, '3', u' ُّ'), - (0xFC62, '3', u' ِّ'), - (0xFC63, '3', u' ّٰ'), - (0xFC64, 'M', u'ئر'), - (0xFC65, 'M', u'ئز'), - (0xFC66, 'M', u'ئم'), - (0xFC67, 'M', u'ئن'), - (0xFC68, 'M', u'ئى'), - (0xFC69, 'M', u'ئي'), - (0xFC6A, 'M', u'بر'), - (0xFC6B, 'M', u'بز'), - (0xFC6C, 'M', u'بم'), - (0xFC6D, 'M', u'بن'), - (0xFC6E, 'M', u'بى'), - (0xFC6F, 'M', u'بي'), - (0xFC70, 'M', u'تر'), - (0xFC71, 'M', u'تز'), - (0xFC72, 'M', u'تم'), - (0xFC73, 'M', u'تن'), - (0xFC74, 'M', u'تى'), - (0xFC75, 'M', u'تي'), - (0xFC76, 'M', u'ثر'), - (0xFC77, 'M', u'ثز'), - (0xFC78, 'M', u'ثم'), - (0xFC79, 'M', u'ثن'), - (0xFC7A, 'M', u'ثى'), - (0xFC7B, 'M', u'ثي'), - (0xFC7C, 'M', u'فى'), - (0xFC7D, 'M', u'في'), - (0xFC7E, 'M', u'قى'), - (0xFC7F, 'M', u'قي'), - (0xFC80, 'M', u'كا'), - (0xFC81, 'M', u'كل'), - (0xFC82, 'M', u'كم'), - (0xFC83, 'M', u'كى'), - (0xFC84, 'M', u'كي'), - (0xFC85, 'M', u'لم'), - (0xFC86, 'M', u'لى'), - (0xFC87, 'M', u'لي'), - (0xFC88, 'M', u'ما'), - (0xFC89, 'M', u'مم'), - (0xFC8A, 'M', u'نر'), - ] - -def _seg_46(): - return [ - (0xFC8B, 'M', u'نز'), - (0xFC8C, 'M', u'نم'), - (0xFC8D, 'M', u'نن'), - (0xFC8E, 'M', u'نى'), - (0xFC8F, 'M', u'ني'), - (0xFC90, 'M', u'ىٰ'), - (0xFC91, 'M', u'ير'), - (0xFC92, 'M', u'يز'), - (0xFC93, 'M', u'يم'), - (0xFC94, 'M', u'ين'), - (0xFC95, 'M', u'يى'), - (0xFC96, 'M', u'يي'), - (0xFC97, 'M', u'ئج'), - (0xFC98, 'M', u'ئح'), - (0xFC99, 'M', u'ئخ'), - (0xFC9A, 'M', u'ئم'), - (0xFC9B, 'M', u'ئه'), - (0xFC9C, 'M', u'بج'), - (0xFC9D, 'M', u'بح'), - (0xFC9E, 'M', u'بخ'), - (0xFC9F, 'M', u'بم'), - (0xFCA0, 'M', u'به'), - (0xFCA1, 'M', u'تج'), - (0xFCA2, 'M', u'تح'), - (0xFCA3, 'M', u'تخ'), - (0xFCA4, 'M', u'تم'), - (0xFCA5, 'M', u'ته'), - (0xFCA6, 'M', u'ثم'), - (0xFCA7, 'M', u'جح'), - (0xFCA8, 'M', u'جم'), - (0xFCA9, 'M', u'حج'), - (0xFCAA, 'M', u'حم'), - (0xFCAB, 'M', u'خج'), - (0xFCAC, 'M', u'خم'), - (0xFCAD, 'M', u'سج'), - (0xFCAE, 'M', u'سح'), - (0xFCAF, 'M', u'سخ'), - (0xFCB0, 'M', u'سم'), - (0xFCB1, 'M', u'صح'), - (0xFCB2, 'M', u'صخ'), - (0xFCB3, 'M', u'صم'), - (0xFCB4, 'M', u'ضج'), - (0xFCB5, 'M', u'ضح'), - (0xFCB6, 'M', u'ضخ'), - (0xFCB7, 'M', u'ضم'), - (0xFCB8, 'M', u'طح'), - (0xFCB9, 'M', u'ظم'), - (0xFCBA, 'M', u'عج'), - (0xFCBB, 'M', u'عم'), - (0xFCBC, 'M', u'غج'), - (0xFCBD, 'M', u'غم'), - (0xFCBE, 'M', u'فج'), - (0xFCBF, 'M', u'فح'), - (0xFCC0, 'M', u'فخ'), - (0xFCC1, 'M', u'فم'), - (0xFCC2, 'M', u'قح'), - (0xFCC3, 'M', u'قم'), - (0xFCC4, 'M', u'كج'), - (0xFCC5, 'M', u'كح'), - (0xFCC6, 'M', u'كخ'), - (0xFCC7, 'M', u'كل'), - (0xFCC8, 'M', u'كم'), - (0xFCC9, 'M', u'لج'), - (0xFCCA, 'M', u'لح'), - (0xFCCB, 'M', u'لخ'), - (0xFCCC, 'M', u'لم'), - (0xFCCD, 'M', u'له'), - (0xFCCE, 'M', u'مج'), - (0xFCCF, 'M', u'مح'), - (0xFCD0, 'M', u'مخ'), - (0xFCD1, 'M', u'مم'), - (0xFCD2, 'M', u'نج'), - (0xFCD3, 'M', u'نح'), - (0xFCD4, 'M', u'نخ'), - (0xFCD5, 'M', u'نم'), - (0xFCD6, 'M', u'نه'), - (0xFCD7, 'M', u'هج'), - (0xFCD8, 'M', u'هم'), - (0xFCD9, 'M', u'هٰ'), - (0xFCDA, 'M', u'يج'), - (0xFCDB, 'M', u'يح'), - (0xFCDC, 'M', u'يخ'), - (0xFCDD, 'M', u'يم'), - (0xFCDE, 'M', u'يه'), - (0xFCDF, 'M', u'ئم'), - (0xFCE0, 'M', u'ئه'), - (0xFCE1, 'M', u'بم'), - (0xFCE2, 'M', u'به'), - (0xFCE3, 'M', u'تم'), - (0xFCE4, 'M', u'ته'), - (0xFCE5, 'M', u'ثم'), - (0xFCE6, 'M', u'ثه'), - (0xFCE7, 'M', u'سم'), - (0xFCE8, 'M', u'سه'), - (0xFCE9, 'M', u'شم'), - (0xFCEA, 'M', u'شه'), - (0xFCEB, 'M', u'كل'), - (0xFCEC, 'M', u'كم'), - (0xFCED, 'M', u'لم'), - (0xFCEE, 'M', u'نم'), - ] - -def _seg_47(): - return [ - (0xFCEF, 'M', u'نه'), - (0xFCF0, 'M', u'يم'), - (0xFCF1, 'M', u'يه'), - (0xFCF2, 'M', u'ـَّ'), - (0xFCF3, 'M', u'ـُّ'), - (0xFCF4, 'M', u'ـِّ'), - (0xFCF5, 'M', u'طى'), - (0xFCF6, 'M', u'طي'), - (0xFCF7, 'M', u'عى'), - (0xFCF8, 'M', u'عي'), - (0xFCF9, 'M', u'غى'), - (0xFCFA, 'M', u'غي'), - (0xFCFB, 'M', u'سى'), - (0xFCFC, 'M', u'سي'), - (0xFCFD, 'M', u'شى'), - (0xFCFE, 'M', u'شي'), - (0xFCFF, 'M', u'حى'), - (0xFD00, 'M', u'حي'), - (0xFD01, 'M', u'جى'), - (0xFD02, 'M', u'جي'), - (0xFD03, 'M', u'خى'), - (0xFD04, 'M', u'خي'), - (0xFD05, 'M', u'صى'), - (0xFD06, 'M', u'صي'), - (0xFD07, 'M', u'ضى'), - (0xFD08, 'M', u'ضي'), - (0xFD09, 'M', u'شج'), - (0xFD0A, 'M', u'شح'), - (0xFD0B, 'M', u'شخ'), - (0xFD0C, 'M', u'شم'), - (0xFD0D, 'M', u'شر'), - (0xFD0E, 'M', u'سر'), - (0xFD0F, 'M', u'صر'), - (0xFD10, 'M', u'ضر'), - (0xFD11, 'M', u'طى'), - (0xFD12, 'M', u'طي'), - (0xFD13, 'M', u'عى'), - (0xFD14, 'M', u'عي'), - (0xFD15, 'M', u'غى'), - (0xFD16, 'M', u'غي'), - (0xFD17, 'M', u'سى'), - (0xFD18, 'M', u'سي'), - (0xFD19, 'M', u'شى'), - (0xFD1A, 'M', u'شي'), - (0xFD1B, 'M', u'حى'), - (0xFD1C, 'M', u'حي'), - (0xFD1D, 'M', u'جى'), - (0xFD1E, 'M', u'جي'), - (0xFD1F, 'M', u'خى'), - (0xFD20, 'M', u'خي'), - (0xFD21, 'M', u'صى'), - (0xFD22, 'M', u'صي'), - (0xFD23, 'M', u'ضى'), - (0xFD24, 'M', u'ضي'), - (0xFD25, 'M', u'شج'), - (0xFD26, 'M', u'شح'), - (0xFD27, 'M', u'شخ'), - (0xFD28, 'M', u'شم'), - (0xFD29, 'M', u'شر'), - (0xFD2A, 'M', u'سر'), - (0xFD2B, 'M', u'صر'), - (0xFD2C, 'M', u'ضر'), - (0xFD2D, 'M', u'شج'), - (0xFD2E, 'M', u'شح'), - (0xFD2F, 'M', u'شخ'), - (0xFD30, 'M', u'شم'), - (0xFD31, 'M', u'سه'), - (0xFD32, 'M', u'شه'), - (0xFD33, 'M', u'طم'), - (0xFD34, 'M', u'سج'), - (0xFD35, 'M', u'سح'), - (0xFD36, 'M', u'سخ'), - (0xFD37, 'M', u'شج'), - (0xFD38, 'M', u'شح'), - (0xFD39, 'M', u'شخ'), - (0xFD3A, 'M', u'طم'), - (0xFD3B, 'M', u'ظم'), - (0xFD3C, 'M', u'اً'), - (0xFD3E, 'V'), - (0xFD40, 'X'), - (0xFD50, 'M', u'تجم'), - (0xFD51, 'M', u'تحج'), - (0xFD53, 'M', u'تحم'), - (0xFD54, 'M', u'تخم'), - (0xFD55, 'M', u'تمج'), - (0xFD56, 'M', u'تمح'), - (0xFD57, 'M', u'تمخ'), - (0xFD58, 'M', u'جمح'), - (0xFD5A, 'M', u'حمي'), - (0xFD5B, 'M', u'حمى'), - (0xFD5C, 'M', u'سحج'), - (0xFD5D, 'M', u'سجح'), - (0xFD5E, 'M', u'سجى'), - (0xFD5F, 'M', u'سمح'), - (0xFD61, 'M', u'سمج'), - (0xFD62, 'M', u'سمم'), - (0xFD64, 'M', u'صحح'), - (0xFD66, 'M', u'صمم'), - (0xFD67, 'M', u'شحم'), - (0xFD69, 'M', u'شجي'), - ] - -def _seg_48(): - return [ - (0xFD6A, 'M', u'شمخ'), - (0xFD6C, 'M', u'شمم'), - (0xFD6E, 'M', u'ضحى'), - (0xFD6F, 'M', u'ضخم'), - (0xFD71, 'M', u'طمح'), - (0xFD73, 'M', u'طمم'), - (0xFD74, 'M', u'طمي'), - (0xFD75, 'M', u'عجم'), - (0xFD76, 'M', u'عمم'), - (0xFD78, 'M', u'عمى'), - (0xFD79, 'M', u'غمم'), - (0xFD7A, 'M', u'غمي'), - (0xFD7B, 'M', u'غمى'), - (0xFD7C, 'M', u'فخم'), - (0xFD7E, 'M', u'قمح'), - (0xFD7F, 'M', u'قمم'), - (0xFD80, 'M', u'لحم'), - (0xFD81, 'M', u'لحي'), - (0xFD82, 'M', u'لحى'), - (0xFD83, 'M', u'لجج'), - (0xFD85, 'M', u'لخم'), - (0xFD87, 'M', u'لمح'), - (0xFD89, 'M', u'محج'), - (0xFD8A, 'M', u'محم'), - (0xFD8B, 'M', u'محي'), - (0xFD8C, 'M', u'مجح'), - (0xFD8D, 'M', u'مجم'), - (0xFD8E, 'M', u'مخج'), - (0xFD8F, 'M', u'مخم'), - (0xFD90, 'X'), - (0xFD92, 'M', u'مجخ'), - (0xFD93, 'M', u'همج'), - (0xFD94, 'M', u'همم'), - (0xFD95, 'M', u'نحم'), - (0xFD96, 'M', u'نحى'), - (0xFD97, 'M', u'نجم'), - (0xFD99, 'M', u'نجى'), - (0xFD9A, 'M', u'نمي'), - (0xFD9B, 'M', u'نمى'), - (0xFD9C, 'M', u'يمم'), - (0xFD9E, 'M', u'بخي'), - (0xFD9F, 'M', u'تجي'), - (0xFDA0, 'M', u'تجى'), - (0xFDA1, 'M', u'تخي'), - (0xFDA2, 'M', u'تخى'), - (0xFDA3, 'M', u'تمي'), - (0xFDA4, 'M', u'تمى'), - (0xFDA5, 'M', u'جمي'), - (0xFDA6, 'M', u'جحى'), - (0xFDA7, 'M', u'جمى'), - (0xFDA8, 'M', u'سخى'), - (0xFDA9, 'M', u'صحي'), - (0xFDAA, 'M', u'شحي'), - (0xFDAB, 'M', u'ضحي'), - (0xFDAC, 'M', u'لجي'), - (0xFDAD, 'M', u'لمي'), - (0xFDAE, 'M', u'يحي'), - (0xFDAF, 'M', u'يجي'), - (0xFDB0, 'M', u'يمي'), - (0xFDB1, 'M', u'ممي'), - (0xFDB2, 'M', u'قمي'), - (0xFDB3, 'M', u'نحي'), - (0xFDB4, 'M', u'قمح'), - (0xFDB5, 'M', u'لحم'), - (0xFDB6, 'M', u'عمي'), - (0xFDB7, 'M', u'كمي'), - (0xFDB8, 'M', u'نجح'), - (0xFDB9, 'M', u'مخي'), - (0xFDBA, 'M', u'لجم'), - (0xFDBB, 'M', u'كمم'), - (0xFDBC, 'M', u'لجم'), - (0xFDBD, 'M', u'نجح'), - (0xFDBE, 'M', u'جحي'), - (0xFDBF, 'M', u'حجي'), - (0xFDC0, 'M', u'مجي'), - (0xFDC1, 'M', u'فمي'), - (0xFDC2, 'M', u'بحي'), - (0xFDC3, 'M', u'كمم'), - (0xFDC4, 'M', u'عجم'), - (0xFDC5, 'M', u'صمم'), - (0xFDC6, 'M', u'سخي'), - (0xFDC7, 'M', u'نجي'), - (0xFDC8, 'X'), - (0xFDF0, 'M', u'صلے'), - (0xFDF1, 'M', u'قلے'), - (0xFDF2, 'M', u'الله'), - (0xFDF3, 'M', u'اكبر'), - (0xFDF4, 'M', u'محمد'), - (0xFDF5, 'M', u'صلعم'), - (0xFDF6, 'M', u'رسول'), - (0xFDF7, 'M', u'عليه'), - (0xFDF8, 'M', u'وسلم'), - (0xFDF9, 'M', u'صلى'), - (0xFDFA, '3', u'صلى الله عليه وسلم'), - (0xFDFB, '3', u'جل جلاله'), - (0xFDFC, 'M', u'ریال'), - (0xFDFD, 'V'), - (0xFDFE, 'X'), - (0xFE00, 'I'), - (0xFE10, '3', u','), - ] - -def _seg_49(): - return [ - (0xFE11, 'M', u'、'), - (0xFE12, 'X'), - (0xFE13, '3', u':'), - (0xFE14, '3', u';'), - (0xFE15, '3', u'!'), - (0xFE16, '3', u'?'), - (0xFE17, 'M', u'〖'), - (0xFE18, 'M', u'〗'), - (0xFE19, 'X'), - (0xFE20, 'V'), - (0xFE30, 'X'), - (0xFE31, 'M', u'—'), - (0xFE32, 'M', u'–'), - (0xFE33, '3', u'_'), - (0xFE35, '3', u'('), - (0xFE36, '3', u')'), - (0xFE37, '3', u'{'), - (0xFE38, '3', u'}'), - (0xFE39, 'M', u'〔'), - (0xFE3A, 'M', u'〕'), - (0xFE3B, 'M', u'【'), - (0xFE3C, 'M', u'】'), - (0xFE3D, 'M', u'《'), - (0xFE3E, 'M', u'》'), - (0xFE3F, 'M', u'〈'), - (0xFE40, 'M', u'〉'), - (0xFE41, 'M', u'「'), - (0xFE42, 'M', u'」'), - (0xFE43, 'M', u'『'), - (0xFE44, 'M', u'』'), - (0xFE45, 'V'), - (0xFE47, '3', u'['), - (0xFE48, '3', u']'), - (0xFE49, '3', u' ̅'), - (0xFE4D, '3', u'_'), - (0xFE50, '3', u','), - (0xFE51, 'M', u'、'), - (0xFE52, 'X'), - (0xFE54, '3', u';'), - (0xFE55, '3', u':'), - (0xFE56, '3', u'?'), - (0xFE57, '3', u'!'), - (0xFE58, 'M', u'—'), - (0xFE59, '3', u'('), - (0xFE5A, '3', u')'), - (0xFE5B, '3', u'{'), - (0xFE5C, '3', u'}'), - (0xFE5D, 'M', u'〔'), - (0xFE5E, 'M', u'〕'), - (0xFE5F, '3', u'#'), - (0xFE60, '3', u'&'), - (0xFE61, '3', u'*'), - (0xFE62, '3', u'+'), - (0xFE63, 'M', u'-'), - (0xFE64, '3', u'<'), - (0xFE65, '3', u'>'), - (0xFE66, '3', u'='), - (0xFE67, 'X'), - (0xFE68, '3', u'\\'), - (0xFE69, '3', u'$'), - (0xFE6A, '3', u'%'), - (0xFE6B, '3', u'@'), - (0xFE6C, 'X'), - (0xFE70, '3', u' ً'), - (0xFE71, 'M', u'ـً'), - (0xFE72, '3', u' ٌ'), - (0xFE73, 'V'), - (0xFE74, '3', u' ٍ'), - (0xFE75, 'X'), - (0xFE76, '3', u' َ'), - (0xFE77, 'M', u'ـَ'), - (0xFE78, '3', u' ُ'), - (0xFE79, 'M', u'ـُ'), - (0xFE7A, '3', u' ِ'), - (0xFE7B, 'M', u'ـِ'), - (0xFE7C, '3', u' ّ'), - (0xFE7D, 'M', u'ـّ'), - (0xFE7E, '3', u' ْ'), - (0xFE7F, 'M', u'ـْ'), - (0xFE80, 'M', u'ء'), - (0xFE81, 'M', u'آ'), - (0xFE83, 'M', u'أ'), - (0xFE85, 'M', u'ؤ'), - (0xFE87, 'M', u'إ'), - (0xFE89, 'M', u'ئ'), - (0xFE8D, 'M', u'ا'), - (0xFE8F, 'M', u'ب'), - (0xFE93, 'M', u'ة'), - (0xFE95, 'M', u'ت'), - (0xFE99, 'M', u'ث'), - (0xFE9D, 'M', u'ج'), - (0xFEA1, 'M', u'ح'), - (0xFEA5, 'M', u'خ'), - (0xFEA9, 'M', u'د'), - (0xFEAB, 'M', u'ذ'), - (0xFEAD, 'M', u'ر'), - (0xFEAF, 'M', u'ز'), - (0xFEB1, 'M', u'س'), - (0xFEB5, 'M', u'ش'), - (0xFEB9, 'M', u'ص'), - ] - -def _seg_50(): - return [ - (0xFEBD, 'M', u'ض'), - (0xFEC1, 'M', u'ط'), - (0xFEC5, 'M', u'ظ'), - (0xFEC9, 'M', u'ع'), - (0xFECD, 'M', u'غ'), - (0xFED1, 'M', u'ف'), - (0xFED5, 'M', u'ق'), - (0xFED9, 'M', u'ك'), - (0xFEDD, 'M', u'ل'), - (0xFEE1, 'M', u'م'), - (0xFEE5, 'M', u'ن'), - (0xFEE9, 'M', u'ه'), - (0xFEED, 'M', u'و'), - (0xFEEF, 'M', u'ى'), - (0xFEF1, 'M', u'ي'), - (0xFEF5, 'M', u'لآ'), - (0xFEF7, 'M', u'لأ'), - (0xFEF9, 'M', u'لإ'), - (0xFEFB, 'M', u'لا'), - (0xFEFD, 'X'), - (0xFEFF, 'I'), - (0xFF00, 'X'), - (0xFF01, '3', u'!'), - (0xFF02, '3', u'"'), - (0xFF03, '3', u'#'), - (0xFF04, '3', u'$'), - (0xFF05, '3', u'%'), - (0xFF06, '3', u'&'), - (0xFF07, '3', u'\''), - (0xFF08, '3', u'('), - (0xFF09, '3', u')'), - (0xFF0A, '3', u'*'), - (0xFF0B, '3', u'+'), - (0xFF0C, '3', u','), - (0xFF0D, 'M', u'-'), - (0xFF0E, 'M', u'.'), - (0xFF0F, '3', u'/'), - (0xFF10, 'M', u'0'), - (0xFF11, 'M', u'1'), - (0xFF12, 'M', u'2'), - (0xFF13, 'M', u'3'), - (0xFF14, 'M', u'4'), - (0xFF15, 'M', u'5'), - (0xFF16, 'M', u'6'), - (0xFF17, 'M', u'7'), - (0xFF18, 'M', u'8'), - (0xFF19, 'M', u'9'), - (0xFF1A, '3', u':'), - (0xFF1B, '3', u';'), - (0xFF1C, '3', u'<'), - (0xFF1D, '3', u'='), - (0xFF1E, '3', u'>'), - (0xFF1F, '3', u'?'), - (0xFF20, '3', u'@'), - (0xFF21, 'M', u'a'), - (0xFF22, 'M', u'b'), - (0xFF23, 'M', u'c'), - (0xFF24, 'M', u'd'), - (0xFF25, 'M', u'e'), - (0xFF26, 'M', u'f'), - (0xFF27, 'M', u'g'), - (0xFF28, 'M', u'h'), - (0xFF29, 'M', u'i'), - (0xFF2A, 'M', u'j'), - (0xFF2B, 'M', u'k'), - (0xFF2C, 'M', u'l'), - (0xFF2D, 'M', u'm'), - (0xFF2E, 'M', u'n'), - (0xFF2F, 'M', u'o'), - (0xFF30, 'M', u'p'), - (0xFF31, 'M', u'q'), - (0xFF32, 'M', u'r'), - (0xFF33, 'M', u's'), - (0xFF34, 'M', u't'), - (0xFF35, 'M', u'u'), - (0xFF36, 'M', u'v'), - (0xFF37, 'M', u'w'), - (0xFF38, 'M', u'x'), - (0xFF39, 'M', u'y'), - (0xFF3A, 'M', u'z'), - (0xFF3B, '3', u'['), - (0xFF3C, '3', u'\\'), - (0xFF3D, '3', u']'), - (0xFF3E, '3', u'^'), - (0xFF3F, '3', u'_'), - (0xFF40, '3', u'`'), - (0xFF41, 'M', u'a'), - (0xFF42, 'M', u'b'), - (0xFF43, 'M', u'c'), - (0xFF44, 'M', u'd'), - (0xFF45, 'M', u'e'), - (0xFF46, 'M', u'f'), - (0xFF47, 'M', u'g'), - (0xFF48, 'M', u'h'), - (0xFF49, 'M', u'i'), - (0xFF4A, 'M', u'j'), - (0xFF4B, 'M', u'k'), - (0xFF4C, 'M', u'l'), - (0xFF4D, 'M', u'm'), - (0xFF4E, 'M', u'n'), - ] - -def _seg_51(): - return [ - (0xFF4F, 'M', u'o'), - (0xFF50, 'M', u'p'), - (0xFF51, 'M', u'q'), - (0xFF52, 'M', u'r'), - (0xFF53, 'M', u's'), - (0xFF54, 'M', u't'), - (0xFF55, 'M', u'u'), - (0xFF56, 'M', u'v'), - (0xFF57, 'M', u'w'), - (0xFF58, 'M', u'x'), - (0xFF59, 'M', u'y'), - (0xFF5A, 'M', u'z'), - (0xFF5B, '3', u'{'), - (0xFF5C, '3', u'|'), - (0xFF5D, '3', u'}'), - (0xFF5E, '3', u'~'), - (0xFF5F, 'M', u'⦅'), - (0xFF60, 'M', u'⦆'), - (0xFF61, 'M', u'.'), - (0xFF62, 'M', u'「'), - (0xFF63, 'M', u'」'), - (0xFF64, 'M', u'、'), - (0xFF65, 'M', u'・'), - (0xFF66, 'M', u'ヲ'), - (0xFF67, 'M', u'ァ'), - (0xFF68, 'M', u'ィ'), - (0xFF69, 'M', u'ゥ'), - (0xFF6A, 'M', u'ェ'), - (0xFF6B, 'M', u'ォ'), - (0xFF6C, 'M', u'ャ'), - (0xFF6D, 'M', u'ュ'), - (0xFF6E, 'M', u'ョ'), - (0xFF6F, 'M', u'ッ'), - (0xFF70, 'M', u'ー'), - (0xFF71, 'M', u'ア'), - (0xFF72, 'M', u'イ'), - (0xFF73, 'M', u'ウ'), - (0xFF74, 'M', u'エ'), - (0xFF75, 'M', u'オ'), - (0xFF76, 'M', u'カ'), - (0xFF77, 'M', u'キ'), - (0xFF78, 'M', u'ク'), - (0xFF79, 'M', u'ケ'), - (0xFF7A, 'M', u'コ'), - (0xFF7B, 'M', u'サ'), - (0xFF7C, 'M', u'シ'), - (0xFF7D, 'M', u'ス'), - (0xFF7E, 'M', u'セ'), - (0xFF7F, 'M', u'ソ'), - (0xFF80, 'M', u'タ'), - (0xFF81, 'M', u'チ'), - (0xFF82, 'M', u'ツ'), - (0xFF83, 'M', u'テ'), - (0xFF84, 'M', u'ト'), - (0xFF85, 'M', u'ナ'), - (0xFF86, 'M', u'ニ'), - (0xFF87, 'M', u'ヌ'), - (0xFF88, 'M', u'ネ'), - (0xFF89, 'M', u'ノ'), - (0xFF8A, 'M', u'ハ'), - (0xFF8B, 'M', u'ヒ'), - (0xFF8C, 'M', u'フ'), - (0xFF8D, 'M', u'ヘ'), - (0xFF8E, 'M', u'ホ'), - (0xFF8F, 'M', u'マ'), - (0xFF90, 'M', u'ミ'), - (0xFF91, 'M', u'ム'), - (0xFF92, 'M', u'メ'), - (0xFF93, 'M', u'モ'), - (0xFF94, 'M', u'ヤ'), - (0xFF95, 'M', u'ユ'), - (0xFF96, 'M', u'ヨ'), - (0xFF97, 'M', u'ラ'), - (0xFF98, 'M', u'リ'), - (0xFF99, 'M', u'ル'), - (0xFF9A, 'M', u'レ'), - (0xFF9B, 'M', u'ロ'), - (0xFF9C, 'M', u'ワ'), - (0xFF9D, 'M', u'ン'), - (0xFF9E, 'M', u'゙'), - (0xFF9F, 'M', u'゚'), - (0xFFA0, 'X'), - (0xFFA1, 'M', u'ᄀ'), - (0xFFA2, 'M', u'ᄁ'), - (0xFFA3, 'M', u'ᆪ'), - (0xFFA4, 'M', u'ᄂ'), - (0xFFA5, 'M', u'ᆬ'), - (0xFFA6, 'M', u'ᆭ'), - (0xFFA7, 'M', u'ᄃ'), - (0xFFA8, 'M', u'ᄄ'), - (0xFFA9, 'M', u'ᄅ'), - (0xFFAA, 'M', u'ᆰ'), - (0xFFAB, 'M', u'ᆱ'), - (0xFFAC, 'M', u'ᆲ'), - (0xFFAD, 'M', u'ᆳ'), - (0xFFAE, 'M', u'ᆴ'), - (0xFFAF, 'M', u'ᆵ'), - (0xFFB0, 'M', u'ᄚ'), - (0xFFB1, 'M', u'ᄆ'), - (0xFFB2, 'M', u'ᄇ'), - ] - -def _seg_52(): - return [ - (0xFFB3, 'M', u'ᄈ'), - (0xFFB4, 'M', u'ᄡ'), - (0xFFB5, 'M', u'ᄉ'), - (0xFFB6, 'M', u'ᄊ'), - (0xFFB7, 'M', u'ᄋ'), - (0xFFB8, 'M', u'ᄌ'), - (0xFFB9, 'M', u'ᄍ'), - (0xFFBA, 'M', u'ᄎ'), - (0xFFBB, 'M', u'ᄏ'), - (0xFFBC, 'M', u'ᄐ'), - (0xFFBD, 'M', u'ᄑ'), - (0xFFBE, 'M', u'ᄒ'), - (0xFFBF, 'X'), - (0xFFC2, 'M', u'ᅡ'), - (0xFFC3, 'M', u'ᅢ'), - (0xFFC4, 'M', u'ᅣ'), - (0xFFC5, 'M', u'ᅤ'), - (0xFFC6, 'M', u'ᅥ'), - (0xFFC7, 'M', u'ᅦ'), - (0xFFC8, 'X'), - (0xFFCA, 'M', u'ᅧ'), - (0xFFCB, 'M', u'ᅨ'), - (0xFFCC, 'M', u'ᅩ'), - (0xFFCD, 'M', u'ᅪ'), - (0xFFCE, 'M', u'ᅫ'), - (0xFFCF, 'M', u'ᅬ'), - (0xFFD0, 'X'), - (0xFFD2, 'M', u'ᅭ'), - (0xFFD3, 'M', u'ᅮ'), - (0xFFD4, 'M', u'ᅯ'), - (0xFFD5, 'M', u'ᅰ'), - (0xFFD6, 'M', u'ᅱ'), - (0xFFD7, 'M', u'ᅲ'), - (0xFFD8, 'X'), - (0xFFDA, 'M', u'ᅳ'), - (0xFFDB, 'M', u'ᅴ'), - (0xFFDC, 'M', u'ᅵ'), - (0xFFDD, 'X'), - (0xFFE0, 'M', u'¢'), - (0xFFE1, 'M', u'£'), - (0xFFE2, 'M', u'¬'), - (0xFFE3, '3', u' ̄'), - (0xFFE4, 'M', u'¦'), - (0xFFE5, 'M', u'¥'), - (0xFFE6, 'M', u'₩'), - (0xFFE7, 'X'), - (0xFFE8, 'M', u'│'), - (0xFFE9, 'M', u'←'), - (0xFFEA, 'M', u'↑'), - (0xFFEB, 'M', u'→'), - (0xFFEC, 'M', u'↓'), - (0xFFED, 'M', u'■'), - (0xFFEE, 'M', u'○'), - (0xFFEF, 'X'), - (0x10000, 'V'), - (0x1000C, 'X'), - (0x1000D, 'V'), - (0x10027, 'X'), - (0x10028, 'V'), - (0x1003B, 'X'), - (0x1003C, 'V'), - (0x1003E, 'X'), - (0x1003F, 'V'), - (0x1004E, 'X'), - (0x10050, 'V'), - (0x1005E, 'X'), - (0x10080, 'V'), - (0x100FB, 'X'), - (0x10100, 'V'), - (0x10103, 'X'), - (0x10107, 'V'), - (0x10134, 'X'), - (0x10137, 'V'), - (0x1018F, 'X'), - (0x10190, 'V'), - (0x1019C, 'X'), - (0x101A0, 'V'), - (0x101A1, 'X'), - (0x101D0, 'V'), - (0x101FE, 'X'), - (0x10280, 'V'), - (0x1029D, 'X'), - (0x102A0, 'V'), - (0x102D1, 'X'), - (0x102E0, 'V'), - (0x102FC, 'X'), - (0x10300, 'V'), - (0x10324, 'X'), - (0x1032D, 'V'), - (0x1034B, 'X'), - (0x10350, 'V'), - (0x1037B, 'X'), - (0x10380, 'V'), - (0x1039E, 'X'), - (0x1039F, 'V'), - (0x103C4, 'X'), - (0x103C8, 'V'), - (0x103D6, 'X'), - (0x10400, 'M', u'𐐨'), - (0x10401, 'M', u'𐐩'), - ] - -def _seg_53(): - return [ - (0x10402, 'M', u'𐐪'), - (0x10403, 'M', u'𐐫'), - (0x10404, 'M', u'𐐬'), - (0x10405, 'M', u'𐐭'), - (0x10406, 'M', u'𐐮'), - (0x10407, 'M', u'𐐯'), - (0x10408, 'M', u'𐐰'), - (0x10409, 'M', u'𐐱'), - (0x1040A, 'M', u'𐐲'), - (0x1040B, 'M', u'𐐳'), - (0x1040C, 'M', u'𐐴'), - (0x1040D, 'M', u'𐐵'), - (0x1040E, 'M', u'𐐶'), - (0x1040F, 'M', u'𐐷'), - (0x10410, 'M', u'𐐸'), - (0x10411, 'M', u'𐐹'), - (0x10412, 'M', u'𐐺'), - (0x10413, 'M', u'𐐻'), - (0x10414, 'M', u'𐐼'), - (0x10415, 'M', u'𐐽'), - (0x10416, 'M', u'𐐾'), - (0x10417, 'M', u'𐐿'), - (0x10418, 'M', u'𐑀'), - (0x10419, 'M', u'𐑁'), - (0x1041A, 'M', u'𐑂'), - (0x1041B, 'M', u'𐑃'), - (0x1041C, 'M', u'𐑄'), - (0x1041D, 'M', u'𐑅'), - (0x1041E, 'M', u'𐑆'), - (0x1041F, 'M', u'𐑇'), - (0x10420, 'M', u'𐑈'), - (0x10421, 'M', u'𐑉'), - (0x10422, 'M', u'𐑊'), - (0x10423, 'M', u'𐑋'), - (0x10424, 'M', u'𐑌'), - (0x10425, 'M', u'𐑍'), - (0x10426, 'M', u'𐑎'), - (0x10427, 'M', u'𐑏'), - (0x10428, 'V'), - (0x1049E, 'X'), - (0x104A0, 'V'), - (0x104AA, 'X'), - (0x104B0, 'M', u'𐓘'), - (0x104B1, 'M', u'𐓙'), - (0x104B2, 'M', u'𐓚'), - (0x104B3, 'M', u'𐓛'), - (0x104B4, 'M', u'𐓜'), - (0x104B5, 'M', u'𐓝'), - (0x104B6, 'M', u'𐓞'), - (0x104B7, 'M', u'𐓟'), - (0x104B8, 'M', u'𐓠'), - (0x104B9, 'M', u'𐓡'), - (0x104BA, 'M', u'𐓢'), - (0x104BB, 'M', u'𐓣'), - (0x104BC, 'M', u'𐓤'), - (0x104BD, 'M', u'𐓥'), - (0x104BE, 'M', u'𐓦'), - (0x104BF, 'M', u'𐓧'), - (0x104C0, 'M', u'𐓨'), - (0x104C1, 'M', u'𐓩'), - (0x104C2, 'M', u'𐓪'), - (0x104C3, 'M', u'𐓫'), - (0x104C4, 'M', u'𐓬'), - (0x104C5, 'M', u'𐓭'), - (0x104C6, 'M', u'𐓮'), - (0x104C7, 'M', u'𐓯'), - (0x104C8, 'M', u'𐓰'), - (0x104C9, 'M', u'𐓱'), - (0x104CA, 'M', u'𐓲'), - (0x104CB, 'M', u'𐓳'), - (0x104CC, 'M', u'𐓴'), - (0x104CD, 'M', u'𐓵'), - (0x104CE, 'M', u'𐓶'), - (0x104CF, 'M', u'𐓷'), - (0x104D0, 'M', u'𐓸'), - (0x104D1, 'M', u'𐓹'), - (0x104D2, 'M', u'𐓺'), - (0x104D3, 'M', u'𐓻'), - (0x104D4, 'X'), - (0x104D8, 'V'), - (0x104FC, 'X'), - (0x10500, 'V'), - (0x10528, 'X'), - (0x10530, 'V'), - (0x10564, 'X'), - (0x1056F, 'V'), - (0x10570, 'X'), - (0x10600, 'V'), - (0x10737, 'X'), - (0x10740, 'V'), - (0x10756, 'X'), - (0x10760, 'V'), - (0x10768, 'X'), - (0x10800, 'V'), - (0x10806, 'X'), - (0x10808, 'V'), - (0x10809, 'X'), - (0x1080A, 'V'), - (0x10836, 'X'), - (0x10837, 'V'), - ] - -def _seg_54(): - return [ - (0x10839, 'X'), - (0x1083C, 'V'), - (0x1083D, 'X'), - (0x1083F, 'V'), - (0x10856, 'X'), - (0x10857, 'V'), - (0x1089F, 'X'), - (0x108A7, 'V'), - (0x108B0, 'X'), - (0x108E0, 'V'), - (0x108F3, 'X'), - (0x108F4, 'V'), - (0x108F6, 'X'), - (0x108FB, 'V'), - (0x1091C, 'X'), - (0x1091F, 'V'), - (0x1093A, 'X'), - (0x1093F, 'V'), - (0x10940, 'X'), - (0x10980, 'V'), - (0x109B8, 'X'), - (0x109BC, 'V'), - (0x109D0, 'X'), - (0x109D2, 'V'), - (0x10A04, 'X'), - (0x10A05, 'V'), - (0x10A07, 'X'), - (0x10A0C, 'V'), - (0x10A14, 'X'), - (0x10A15, 'V'), - (0x10A18, 'X'), - (0x10A19, 'V'), - (0x10A36, 'X'), - (0x10A38, 'V'), - (0x10A3B, 'X'), - (0x10A3F, 'V'), - (0x10A49, 'X'), - (0x10A50, 'V'), - (0x10A59, 'X'), - (0x10A60, 'V'), - (0x10AA0, 'X'), - (0x10AC0, 'V'), - (0x10AE7, 'X'), - (0x10AEB, 'V'), - (0x10AF7, 'X'), - (0x10B00, 'V'), - (0x10B36, 'X'), - (0x10B39, 'V'), - (0x10B56, 'X'), - (0x10B58, 'V'), - (0x10B73, 'X'), - (0x10B78, 'V'), - (0x10B92, 'X'), - (0x10B99, 'V'), - (0x10B9D, 'X'), - (0x10BA9, 'V'), - (0x10BB0, 'X'), - (0x10C00, 'V'), - (0x10C49, 'X'), - (0x10C80, 'M', u'𐳀'), - (0x10C81, 'M', u'𐳁'), - (0x10C82, 'M', u'𐳂'), - (0x10C83, 'M', u'𐳃'), - (0x10C84, 'M', u'𐳄'), - (0x10C85, 'M', u'𐳅'), - (0x10C86, 'M', u'𐳆'), - (0x10C87, 'M', u'𐳇'), - (0x10C88, 'M', u'𐳈'), - (0x10C89, 'M', u'𐳉'), - (0x10C8A, 'M', u'𐳊'), - (0x10C8B, 'M', u'𐳋'), - (0x10C8C, 'M', u'𐳌'), - (0x10C8D, 'M', u'𐳍'), - (0x10C8E, 'M', u'𐳎'), - (0x10C8F, 'M', u'𐳏'), - (0x10C90, 'M', u'𐳐'), - (0x10C91, 'M', u'𐳑'), - (0x10C92, 'M', u'𐳒'), - (0x10C93, 'M', u'𐳓'), - (0x10C94, 'M', u'𐳔'), - (0x10C95, 'M', u'𐳕'), - (0x10C96, 'M', u'𐳖'), - (0x10C97, 'M', u'𐳗'), - (0x10C98, 'M', u'𐳘'), - (0x10C99, 'M', u'𐳙'), - (0x10C9A, 'M', u'𐳚'), - (0x10C9B, 'M', u'𐳛'), - (0x10C9C, 'M', u'𐳜'), - (0x10C9D, 'M', u'𐳝'), - (0x10C9E, 'M', u'𐳞'), - (0x10C9F, 'M', u'𐳟'), - (0x10CA0, 'M', u'𐳠'), - (0x10CA1, 'M', u'𐳡'), - (0x10CA2, 'M', u'𐳢'), - (0x10CA3, 'M', u'𐳣'), - (0x10CA4, 'M', u'𐳤'), - (0x10CA5, 'M', u'𐳥'), - (0x10CA6, 'M', u'𐳦'), - (0x10CA7, 'M', u'𐳧'), - (0x10CA8, 'M', u'𐳨'), - ] - -def _seg_55(): - return [ - (0x10CA9, 'M', u'𐳩'), - (0x10CAA, 'M', u'𐳪'), - (0x10CAB, 'M', u'𐳫'), - (0x10CAC, 'M', u'𐳬'), - (0x10CAD, 'M', u'𐳭'), - (0x10CAE, 'M', u'𐳮'), - (0x10CAF, 'M', u'𐳯'), - (0x10CB0, 'M', u'𐳰'), - (0x10CB1, 'M', u'𐳱'), - (0x10CB2, 'M', u'𐳲'), - (0x10CB3, 'X'), - (0x10CC0, 'V'), - (0x10CF3, 'X'), - (0x10CFA, 'V'), - (0x10D28, 'X'), - (0x10D30, 'V'), - (0x10D3A, 'X'), - (0x10E60, 'V'), - (0x10E7F, 'X'), - (0x10F00, 'V'), - (0x10F28, 'X'), - (0x10F30, 'V'), - (0x10F5A, 'X'), - (0x11000, 'V'), - (0x1104E, 'X'), - (0x11052, 'V'), - (0x11070, 'X'), - (0x1107F, 'V'), - (0x110BD, 'X'), - (0x110BE, 'V'), - (0x110C2, 'X'), - (0x110D0, 'V'), - (0x110E9, 'X'), - (0x110F0, 'V'), - (0x110FA, 'X'), - (0x11100, 'V'), - (0x11135, 'X'), - (0x11136, 'V'), - (0x11147, 'X'), - (0x11150, 'V'), - (0x11177, 'X'), - (0x11180, 'V'), - (0x111CE, 'X'), - (0x111D0, 'V'), - (0x111E0, 'X'), - (0x111E1, 'V'), - (0x111F5, 'X'), - (0x11200, 'V'), - (0x11212, 'X'), - (0x11213, 'V'), - (0x1123F, 'X'), - (0x11280, 'V'), - (0x11287, 'X'), - (0x11288, 'V'), - (0x11289, 'X'), - (0x1128A, 'V'), - (0x1128E, 'X'), - (0x1128F, 'V'), - (0x1129E, 'X'), - (0x1129F, 'V'), - (0x112AA, 'X'), - (0x112B0, 'V'), - (0x112EB, 'X'), - (0x112F0, 'V'), - (0x112FA, 'X'), - (0x11300, 'V'), - (0x11304, 'X'), - (0x11305, 'V'), - (0x1130D, 'X'), - (0x1130F, 'V'), - (0x11311, 'X'), - (0x11313, 'V'), - (0x11329, 'X'), - (0x1132A, 'V'), - (0x11331, 'X'), - (0x11332, 'V'), - (0x11334, 'X'), - (0x11335, 'V'), - (0x1133A, 'X'), - (0x1133B, 'V'), - (0x11345, 'X'), - (0x11347, 'V'), - (0x11349, 'X'), - (0x1134B, 'V'), - (0x1134E, 'X'), - (0x11350, 'V'), - (0x11351, 'X'), - (0x11357, 'V'), - (0x11358, 'X'), - (0x1135D, 'V'), - (0x11364, 'X'), - (0x11366, 'V'), - (0x1136D, 'X'), - (0x11370, 'V'), - (0x11375, 'X'), - (0x11400, 'V'), - (0x1145A, 'X'), - (0x1145B, 'V'), - (0x1145C, 'X'), - (0x1145D, 'V'), - ] - -def _seg_56(): - return [ - (0x1145F, 'X'), - (0x11480, 'V'), - (0x114C8, 'X'), - (0x114D0, 'V'), - (0x114DA, 'X'), - (0x11580, 'V'), - (0x115B6, 'X'), - (0x115B8, 'V'), - (0x115DE, 'X'), - (0x11600, 'V'), - (0x11645, 'X'), - (0x11650, 'V'), - (0x1165A, 'X'), - (0x11660, 'V'), - (0x1166D, 'X'), - (0x11680, 'V'), - (0x116B8, 'X'), - (0x116C0, 'V'), - (0x116CA, 'X'), - (0x11700, 'V'), - (0x1171B, 'X'), - (0x1171D, 'V'), - (0x1172C, 'X'), - (0x11730, 'V'), - (0x11740, 'X'), - (0x11800, 'V'), - (0x1183C, 'X'), - (0x118A0, 'M', u'𑣀'), - (0x118A1, 'M', u'𑣁'), - (0x118A2, 'M', u'𑣂'), - (0x118A3, 'M', u'𑣃'), - (0x118A4, 'M', u'𑣄'), - (0x118A5, 'M', u'𑣅'), - (0x118A6, 'M', u'𑣆'), - (0x118A7, 'M', u'𑣇'), - (0x118A8, 'M', u'𑣈'), - (0x118A9, 'M', u'𑣉'), - (0x118AA, 'M', u'𑣊'), - (0x118AB, 'M', u'𑣋'), - (0x118AC, 'M', u'𑣌'), - (0x118AD, 'M', u'𑣍'), - (0x118AE, 'M', u'𑣎'), - (0x118AF, 'M', u'𑣏'), - (0x118B0, 'M', u'𑣐'), - (0x118B1, 'M', u'𑣑'), - (0x118B2, 'M', u'𑣒'), - (0x118B3, 'M', u'𑣓'), - (0x118B4, 'M', u'𑣔'), - (0x118B5, 'M', u'𑣕'), - (0x118B6, 'M', u'𑣖'), - (0x118B7, 'M', u'𑣗'), - (0x118B8, 'M', u'𑣘'), - (0x118B9, 'M', u'𑣙'), - (0x118BA, 'M', u'𑣚'), - (0x118BB, 'M', u'𑣛'), - (0x118BC, 'M', u'𑣜'), - (0x118BD, 'M', u'𑣝'), - (0x118BE, 'M', u'𑣞'), - (0x118BF, 'M', u'𑣟'), - (0x118C0, 'V'), - (0x118F3, 'X'), - (0x118FF, 'V'), - (0x11900, 'X'), - (0x11A00, 'V'), - (0x11A48, 'X'), - (0x11A50, 'V'), - (0x11A84, 'X'), - (0x11A86, 'V'), - (0x11AA3, 'X'), - (0x11AC0, 'V'), - (0x11AF9, 'X'), - (0x11C00, 'V'), - (0x11C09, 'X'), - (0x11C0A, 'V'), - (0x11C37, 'X'), - (0x11C38, 'V'), - (0x11C46, 'X'), - (0x11C50, 'V'), - (0x11C6D, 'X'), - (0x11C70, 'V'), - (0x11C90, 'X'), - (0x11C92, 'V'), - (0x11CA8, 'X'), - (0x11CA9, 'V'), - (0x11CB7, 'X'), - (0x11D00, 'V'), - (0x11D07, 'X'), - (0x11D08, 'V'), - (0x11D0A, 'X'), - (0x11D0B, 'V'), - (0x11D37, 'X'), - (0x11D3A, 'V'), - (0x11D3B, 'X'), - (0x11D3C, 'V'), - (0x11D3E, 'X'), - (0x11D3F, 'V'), - (0x11D48, 'X'), - (0x11D50, 'V'), - (0x11D5A, 'X'), - (0x11D60, 'V'), - ] - -def _seg_57(): - return [ - (0x11D66, 'X'), - (0x11D67, 'V'), - (0x11D69, 'X'), - (0x11D6A, 'V'), - (0x11D8F, 'X'), - (0x11D90, 'V'), - (0x11D92, 'X'), - (0x11D93, 'V'), - (0x11D99, 'X'), - (0x11DA0, 'V'), - (0x11DAA, 'X'), - (0x11EE0, 'V'), - (0x11EF9, 'X'), - (0x12000, 'V'), - (0x1239A, 'X'), - (0x12400, 'V'), - (0x1246F, 'X'), - (0x12470, 'V'), - (0x12475, 'X'), - (0x12480, 'V'), - (0x12544, 'X'), - (0x13000, 'V'), - (0x1342F, 'X'), - (0x14400, 'V'), - (0x14647, 'X'), - (0x16800, 'V'), - (0x16A39, 'X'), - (0x16A40, 'V'), - (0x16A5F, 'X'), - (0x16A60, 'V'), - (0x16A6A, 'X'), - (0x16A6E, 'V'), - (0x16A70, 'X'), - (0x16AD0, 'V'), - (0x16AEE, 'X'), - (0x16AF0, 'V'), - (0x16AF6, 'X'), - (0x16B00, 'V'), - (0x16B46, 'X'), - (0x16B50, 'V'), - (0x16B5A, 'X'), - (0x16B5B, 'V'), - (0x16B62, 'X'), - (0x16B63, 'V'), - (0x16B78, 'X'), - (0x16B7D, 'V'), - (0x16B90, 'X'), - (0x16E60, 'V'), - (0x16E9B, 'X'), - (0x16F00, 'V'), - (0x16F45, 'X'), - (0x16F50, 'V'), - (0x16F7F, 'X'), - (0x16F8F, 'V'), - (0x16FA0, 'X'), - (0x16FE0, 'V'), - (0x16FE2, 'X'), - (0x17000, 'V'), - (0x187F2, 'X'), - (0x18800, 'V'), - (0x18AF3, 'X'), - (0x1B000, 'V'), - (0x1B11F, 'X'), - (0x1B170, 'V'), - (0x1B2FC, 'X'), - (0x1BC00, 'V'), - (0x1BC6B, 'X'), - (0x1BC70, 'V'), - (0x1BC7D, 'X'), - (0x1BC80, 'V'), - (0x1BC89, 'X'), - (0x1BC90, 'V'), - (0x1BC9A, 'X'), - (0x1BC9C, 'V'), - (0x1BCA0, 'I'), - (0x1BCA4, 'X'), - (0x1D000, 'V'), - (0x1D0F6, 'X'), - (0x1D100, 'V'), - (0x1D127, 'X'), - (0x1D129, 'V'), - (0x1D15E, 'M', u'𝅗𝅥'), - (0x1D15F, 'M', u'𝅘𝅥'), - (0x1D160, 'M', u'𝅘𝅥𝅮'), - (0x1D161, 'M', u'𝅘𝅥𝅯'), - (0x1D162, 'M', u'𝅘𝅥𝅰'), - (0x1D163, 'M', u'𝅘𝅥𝅱'), - (0x1D164, 'M', u'𝅘𝅥𝅲'), - (0x1D165, 'V'), - (0x1D173, 'X'), - (0x1D17B, 'V'), - (0x1D1BB, 'M', u'𝆹𝅥'), - (0x1D1BC, 'M', u'𝆺𝅥'), - (0x1D1BD, 'M', u'𝆹𝅥𝅮'), - (0x1D1BE, 'M', u'𝆺𝅥𝅮'), - (0x1D1BF, 'M', u'𝆹𝅥𝅯'), - (0x1D1C0, 'M', u'𝆺𝅥𝅯'), - (0x1D1C1, 'V'), - (0x1D1E9, 'X'), - (0x1D200, 'V'), - ] - -def _seg_58(): - return [ - (0x1D246, 'X'), - (0x1D2E0, 'V'), - (0x1D2F4, 'X'), - (0x1D300, 'V'), - (0x1D357, 'X'), - (0x1D360, 'V'), - (0x1D379, 'X'), - (0x1D400, 'M', u'a'), - (0x1D401, 'M', u'b'), - (0x1D402, 'M', u'c'), - (0x1D403, 'M', u'd'), - (0x1D404, 'M', u'e'), - (0x1D405, 'M', u'f'), - (0x1D406, 'M', u'g'), - (0x1D407, 'M', u'h'), - (0x1D408, 'M', u'i'), - (0x1D409, 'M', u'j'), - (0x1D40A, 'M', u'k'), - (0x1D40B, 'M', u'l'), - (0x1D40C, 'M', u'm'), - (0x1D40D, 'M', u'n'), - (0x1D40E, 'M', u'o'), - (0x1D40F, 'M', u'p'), - (0x1D410, 'M', u'q'), - (0x1D411, 'M', u'r'), - (0x1D412, 'M', u's'), - (0x1D413, 'M', u't'), - (0x1D414, 'M', u'u'), - (0x1D415, 'M', u'v'), - (0x1D416, 'M', u'w'), - (0x1D417, 'M', u'x'), - (0x1D418, 'M', u'y'), - (0x1D419, 'M', u'z'), - (0x1D41A, 'M', u'a'), - (0x1D41B, 'M', u'b'), - (0x1D41C, 'M', u'c'), - (0x1D41D, 'M', u'd'), - (0x1D41E, 'M', u'e'), - (0x1D41F, 'M', u'f'), - (0x1D420, 'M', u'g'), - (0x1D421, 'M', u'h'), - (0x1D422, 'M', u'i'), - (0x1D423, 'M', u'j'), - (0x1D424, 'M', u'k'), - (0x1D425, 'M', u'l'), - (0x1D426, 'M', u'm'), - (0x1D427, 'M', u'n'), - (0x1D428, 'M', u'o'), - (0x1D429, 'M', u'p'), - (0x1D42A, 'M', u'q'), - (0x1D42B, 'M', u'r'), - (0x1D42C, 'M', u's'), - (0x1D42D, 'M', u't'), - (0x1D42E, 'M', u'u'), - (0x1D42F, 'M', u'v'), - (0x1D430, 'M', u'w'), - (0x1D431, 'M', u'x'), - (0x1D432, 'M', u'y'), - (0x1D433, 'M', u'z'), - (0x1D434, 'M', u'a'), - (0x1D435, 'M', u'b'), - (0x1D436, 'M', u'c'), - (0x1D437, 'M', u'd'), - (0x1D438, 'M', u'e'), - (0x1D439, 'M', u'f'), - (0x1D43A, 'M', u'g'), - (0x1D43B, 'M', u'h'), - (0x1D43C, 'M', u'i'), - (0x1D43D, 'M', u'j'), - (0x1D43E, 'M', u'k'), - (0x1D43F, 'M', u'l'), - (0x1D440, 'M', u'm'), - (0x1D441, 'M', u'n'), - (0x1D442, 'M', u'o'), - (0x1D443, 'M', u'p'), - (0x1D444, 'M', u'q'), - (0x1D445, 'M', u'r'), - (0x1D446, 'M', u's'), - (0x1D447, 'M', u't'), - (0x1D448, 'M', u'u'), - (0x1D449, 'M', u'v'), - (0x1D44A, 'M', u'w'), - (0x1D44B, 'M', u'x'), - (0x1D44C, 'M', u'y'), - (0x1D44D, 'M', u'z'), - (0x1D44E, 'M', u'a'), - (0x1D44F, 'M', u'b'), - (0x1D450, 'M', u'c'), - (0x1D451, 'M', u'd'), - (0x1D452, 'M', u'e'), - (0x1D453, 'M', u'f'), - (0x1D454, 'M', u'g'), - (0x1D455, 'X'), - (0x1D456, 'M', u'i'), - (0x1D457, 'M', u'j'), - (0x1D458, 'M', u'k'), - (0x1D459, 'M', u'l'), - (0x1D45A, 'M', u'm'), - (0x1D45B, 'M', u'n'), - (0x1D45C, 'M', u'o'), - ] - -def _seg_59(): - return [ - (0x1D45D, 'M', u'p'), - (0x1D45E, 'M', u'q'), - (0x1D45F, 'M', u'r'), - (0x1D460, 'M', u's'), - (0x1D461, 'M', u't'), - (0x1D462, 'M', u'u'), - (0x1D463, 'M', u'v'), - (0x1D464, 'M', u'w'), - (0x1D465, 'M', u'x'), - (0x1D466, 'M', u'y'), - (0x1D467, 'M', u'z'), - (0x1D468, 'M', u'a'), - (0x1D469, 'M', u'b'), - (0x1D46A, 'M', u'c'), - (0x1D46B, 'M', u'd'), - (0x1D46C, 'M', u'e'), - (0x1D46D, 'M', u'f'), - (0x1D46E, 'M', u'g'), - (0x1D46F, 'M', u'h'), - (0x1D470, 'M', u'i'), - (0x1D471, 'M', u'j'), - (0x1D472, 'M', u'k'), - (0x1D473, 'M', u'l'), - (0x1D474, 'M', u'm'), - (0x1D475, 'M', u'n'), - (0x1D476, 'M', u'o'), - (0x1D477, 'M', u'p'), - (0x1D478, 'M', u'q'), - (0x1D479, 'M', u'r'), - (0x1D47A, 'M', u's'), - (0x1D47B, 'M', u't'), - (0x1D47C, 'M', u'u'), - (0x1D47D, 'M', u'v'), - (0x1D47E, 'M', u'w'), - (0x1D47F, 'M', u'x'), - (0x1D480, 'M', u'y'), - (0x1D481, 'M', u'z'), - (0x1D482, 'M', u'a'), - (0x1D483, 'M', u'b'), - (0x1D484, 'M', u'c'), - (0x1D485, 'M', u'd'), - (0x1D486, 'M', u'e'), - (0x1D487, 'M', u'f'), - (0x1D488, 'M', u'g'), - (0x1D489, 'M', u'h'), - (0x1D48A, 'M', u'i'), - (0x1D48B, 'M', u'j'), - (0x1D48C, 'M', u'k'), - (0x1D48D, 'M', u'l'), - (0x1D48E, 'M', u'm'), - (0x1D48F, 'M', u'n'), - (0x1D490, 'M', u'o'), - (0x1D491, 'M', u'p'), - (0x1D492, 'M', u'q'), - (0x1D493, 'M', u'r'), - (0x1D494, 'M', u's'), - (0x1D495, 'M', u't'), - (0x1D496, 'M', u'u'), - (0x1D497, 'M', u'v'), - (0x1D498, 'M', u'w'), - (0x1D499, 'M', u'x'), - (0x1D49A, 'M', u'y'), - (0x1D49B, 'M', u'z'), - (0x1D49C, 'M', u'a'), - (0x1D49D, 'X'), - (0x1D49E, 'M', u'c'), - (0x1D49F, 'M', u'd'), - (0x1D4A0, 'X'), - (0x1D4A2, 'M', u'g'), - (0x1D4A3, 'X'), - (0x1D4A5, 'M', u'j'), - (0x1D4A6, 'M', u'k'), - (0x1D4A7, 'X'), - (0x1D4A9, 'M', u'n'), - (0x1D4AA, 'M', u'o'), - (0x1D4AB, 'M', u'p'), - (0x1D4AC, 'M', u'q'), - (0x1D4AD, 'X'), - (0x1D4AE, 'M', u's'), - (0x1D4AF, 'M', u't'), - (0x1D4B0, 'M', u'u'), - (0x1D4B1, 'M', u'v'), - (0x1D4B2, 'M', u'w'), - (0x1D4B3, 'M', u'x'), - (0x1D4B4, 'M', u'y'), - (0x1D4B5, 'M', u'z'), - (0x1D4B6, 'M', u'a'), - (0x1D4B7, 'M', u'b'), - (0x1D4B8, 'M', u'c'), - (0x1D4B9, 'M', u'd'), - (0x1D4BA, 'X'), - (0x1D4BB, 'M', u'f'), - (0x1D4BC, 'X'), - (0x1D4BD, 'M', u'h'), - (0x1D4BE, 'M', u'i'), - (0x1D4BF, 'M', u'j'), - (0x1D4C0, 'M', u'k'), - (0x1D4C1, 'M', u'l'), - (0x1D4C2, 'M', u'm'), - (0x1D4C3, 'M', u'n'), - ] - -def _seg_60(): - return [ - (0x1D4C4, 'X'), - (0x1D4C5, 'M', u'p'), - (0x1D4C6, 'M', u'q'), - (0x1D4C7, 'M', u'r'), - (0x1D4C8, 'M', u's'), - (0x1D4C9, 'M', u't'), - (0x1D4CA, 'M', u'u'), - (0x1D4CB, 'M', u'v'), - (0x1D4CC, 'M', u'w'), - (0x1D4CD, 'M', u'x'), - (0x1D4CE, 'M', u'y'), - (0x1D4CF, 'M', u'z'), - (0x1D4D0, 'M', u'a'), - (0x1D4D1, 'M', u'b'), - (0x1D4D2, 'M', u'c'), - (0x1D4D3, 'M', u'd'), - (0x1D4D4, 'M', u'e'), - (0x1D4D5, 'M', u'f'), - (0x1D4D6, 'M', u'g'), - (0x1D4D7, 'M', u'h'), - (0x1D4D8, 'M', u'i'), - (0x1D4D9, 'M', u'j'), - (0x1D4DA, 'M', u'k'), - (0x1D4DB, 'M', u'l'), - (0x1D4DC, 'M', u'm'), - (0x1D4DD, 'M', u'n'), - (0x1D4DE, 'M', u'o'), - (0x1D4DF, 'M', u'p'), - (0x1D4E0, 'M', u'q'), - (0x1D4E1, 'M', u'r'), - (0x1D4E2, 'M', u's'), - (0x1D4E3, 'M', u't'), - (0x1D4E4, 'M', u'u'), - (0x1D4E5, 'M', u'v'), - (0x1D4E6, 'M', u'w'), - (0x1D4E7, 'M', u'x'), - (0x1D4E8, 'M', u'y'), - (0x1D4E9, 'M', u'z'), - (0x1D4EA, 'M', u'a'), - (0x1D4EB, 'M', u'b'), - (0x1D4EC, 'M', u'c'), - (0x1D4ED, 'M', u'd'), - (0x1D4EE, 'M', u'e'), - (0x1D4EF, 'M', u'f'), - (0x1D4F0, 'M', u'g'), - (0x1D4F1, 'M', u'h'), - (0x1D4F2, 'M', u'i'), - (0x1D4F3, 'M', u'j'), - (0x1D4F4, 'M', u'k'), - (0x1D4F5, 'M', u'l'), - (0x1D4F6, 'M', u'm'), - (0x1D4F7, 'M', u'n'), - (0x1D4F8, 'M', u'o'), - (0x1D4F9, 'M', u'p'), - (0x1D4FA, 'M', u'q'), - (0x1D4FB, 'M', u'r'), - (0x1D4FC, 'M', u's'), - (0x1D4FD, 'M', u't'), - (0x1D4FE, 'M', u'u'), - (0x1D4FF, 'M', u'v'), - (0x1D500, 'M', u'w'), - (0x1D501, 'M', u'x'), - (0x1D502, 'M', u'y'), - (0x1D503, 'M', u'z'), - (0x1D504, 'M', u'a'), - (0x1D505, 'M', u'b'), - (0x1D506, 'X'), - (0x1D507, 'M', u'd'), - (0x1D508, 'M', u'e'), - (0x1D509, 'M', u'f'), - (0x1D50A, 'M', u'g'), - (0x1D50B, 'X'), - (0x1D50D, 'M', u'j'), - (0x1D50E, 'M', u'k'), - (0x1D50F, 'M', u'l'), - (0x1D510, 'M', u'm'), - (0x1D511, 'M', u'n'), - (0x1D512, 'M', u'o'), - (0x1D513, 'M', u'p'), - (0x1D514, 'M', u'q'), - (0x1D515, 'X'), - (0x1D516, 'M', u's'), - (0x1D517, 'M', u't'), - (0x1D518, 'M', u'u'), - (0x1D519, 'M', u'v'), - (0x1D51A, 'M', u'w'), - (0x1D51B, 'M', u'x'), - (0x1D51C, 'M', u'y'), - (0x1D51D, 'X'), - (0x1D51E, 'M', u'a'), - (0x1D51F, 'M', u'b'), - (0x1D520, 'M', u'c'), - (0x1D521, 'M', u'd'), - (0x1D522, 'M', u'e'), - (0x1D523, 'M', u'f'), - (0x1D524, 'M', u'g'), - (0x1D525, 'M', u'h'), - (0x1D526, 'M', u'i'), - (0x1D527, 'M', u'j'), - (0x1D528, 'M', u'k'), - ] - -def _seg_61(): - return [ - (0x1D529, 'M', u'l'), - (0x1D52A, 'M', u'm'), - (0x1D52B, 'M', u'n'), - (0x1D52C, 'M', u'o'), - (0x1D52D, 'M', u'p'), - (0x1D52E, 'M', u'q'), - (0x1D52F, 'M', u'r'), - (0x1D530, 'M', u's'), - (0x1D531, 'M', u't'), - (0x1D532, 'M', u'u'), - (0x1D533, 'M', u'v'), - (0x1D534, 'M', u'w'), - (0x1D535, 'M', u'x'), - (0x1D536, 'M', u'y'), - (0x1D537, 'M', u'z'), - (0x1D538, 'M', u'a'), - (0x1D539, 'M', u'b'), - (0x1D53A, 'X'), - (0x1D53B, 'M', u'd'), - (0x1D53C, 'M', u'e'), - (0x1D53D, 'M', u'f'), - (0x1D53E, 'M', u'g'), - (0x1D53F, 'X'), - (0x1D540, 'M', u'i'), - (0x1D541, 'M', u'j'), - (0x1D542, 'M', u'k'), - (0x1D543, 'M', u'l'), - (0x1D544, 'M', u'm'), - (0x1D545, 'X'), - (0x1D546, 'M', u'o'), - (0x1D547, 'X'), - (0x1D54A, 'M', u's'), - (0x1D54B, 'M', u't'), - (0x1D54C, 'M', u'u'), - (0x1D54D, 'M', u'v'), - (0x1D54E, 'M', u'w'), - (0x1D54F, 'M', u'x'), - (0x1D550, 'M', u'y'), - (0x1D551, 'X'), - (0x1D552, 'M', u'a'), - (0x1D553, 'M', u'b'), - (0x1D554, 'M', u'c'), - (0x1D555, 'M', u'd'), - (0x1D556, 'M', u'e'), - (0x1D557, 'M', u'f'), - (0x1D558, 'M', u'g'), - (0x1D559, 'M', u'h'), - (0x1D55A, 'M', u'i'), - (0x1D55B, 'M', u'j'), - (0x1D55C, 'M', u'k'), - (0x1D55D, 'M', u'l'), - (0x1D55E, 'M', u'm'), - (0x1D55F, 'M', u'n'), - (0x1D560, 'M', u'o'), - (0x1D561, 'M', u'p'), - (0x1D562, 'M', u'q'), - (0x1D563, 'M', u'r'), - (0x1D564, 'M', u's'), - (0x1D565, 'M', u't'), - (0x1D566, 'M', u'u'), - (0x1D567, 'M', u'v'), - (0x1D568, 'M', u'w'), - (0x1D569, 'M', u'x'), - (0x1D56A, 'M', u'y'), - (0x1D56B, 'M', u'z'), - (0x1D56C, 'M', u'a'), - (0x1D56D, 'M', u'b'), - (0x1D56E, 'M', u'c'), - (0x1D56F, 'M', u'd'), - (0x1D570, 'M', u'e'), - (0x1D571, 'M', u'f'), - (0x1D572, 'M', u'g'), - (0x1D573, 'M', u'h'), - (0x1D574, 'M', u'i'), - (0x1D575, 'M', u'j'), - (0x1D576, 'M', u'k'), - (0x1D577, 'M', u'l'), - (0x1D578, 'M', u'm'), - (0x1D579, 'M', u'n'), - (0x1D57A, 'M', u'o'), - (0x1D57B, 'M', u'p'), - (0x1D57C, 'M', u'q'), - (0x1D57D, 'M', u'r'), - (0x1D57E, 'M', u's'), - (0x1D57F, 'M', u't'), - (0x1D580, 'M', u'u'), - (0x1D581, 'M', u'v'), - (0x1D582, 'M', u'w'), - (0x1D583, 'M', u'x'), - (0x1D584, 'M', u'y'), - (0x1D585, 'M', u'z'), - (0x1D586, 'M', u'a'), - (0x1D587, 'M', u'b'), - (0x1D588, 'M', u'c'), - (0x1D589, 'M', u'd'), - (0x1D58A, 'M', u'e'), - (0x1D58B, 'M', u'f'), - (0x1D58C, 'M', u'g'), - (0x1D58D, 'M', u'h'), - (0x1D58E, 'M', u'i'), - ] - -def _seg_62(): - return [ - (0x1D58F, 'M', u'j'), - (0x1D590, 'M', u'k'), - (0x1D591, 'M', u'l'), - (0x1D592, 'M', u'm'), - (0x1D593, 'M', u'n'), - (0x1D594, 'M', u'o'), - (0x1D595, 'M', u'p'), - (0x1D596, 'M', u'q'), - (0x1D597, 'M', u'r'), - (0x1D598, 'M', u's'), - (0x1D599, 'M', u't'), - (0x1D59A, 'M', u'u'), - (0x1D59B, 'M', u'v'), - (0x1D59C, 'M', u'w'), - (0x1D59D, 'M', u'x'), - (0x1D59E, 'M', u'y'), - (0x1D59F, 'M', u'z'), - (0x1D5A0, 'M', u'a'), - (0x1D5A1, 'M', u'b'), - (0x1D5A2, 'M', u'c'), - (0x1D5A3, 'M', u'd'), - (0x1D5A4, 'M', u'e'), - (0x1D5A5, 'M', u'f'), - (0x1D5A6, 'M', u'g'), - (0x1D5A7, 'M', u'h'), - (0x1D5A8, 'M', u'i'), - (0x1D5A9, 'M', u'j'), - (0x1D5AA, 'M', u'k'), - (0x1D5AB, 'M', u'l'), - (0x1D5AC, 'M', u'm'), - (0x1D5AD, 'M', u'n'), - (0x1D5AE, 'M', u'o'), - (0x1D5AF, 'M', u'p'), - (0x1D5B0, 'M', u'q'), - (0x1D5B1, 'M', u'r'), - (0x1D5B2, 'M', u's'), - (0x1D5B3, 'M', u't'), - (0x1D5B4, 'M', u'u'), - (0x1D5B5, 'M', u'v'), - (0x1D5B6, 'M', u'w'), - (0x1D5B7, 'M', u'x'), - (0x1D5B8, 'M', u'y'), - (0x1D5B9, 'M', u'z'), - (0x1D5BA, 'M', u'a'), - (0x1D5BB, 'M', u'b'), - (0x1D5BC, 'M', u'c'), - (0x1D5BD, 'M', u'd'), - (0x1D5BE, 'M', u'e'), - (0x1D5BF, 'M', u'f'), - (0x1D5C0, 'M', u'g'), - (0x1D5C1, 'M', u'h'), - (0x1D5C2, 'M', u'i'), - (0x1D5C3, 'M', u'j'), - (0x1D5C4, 'M', u'k'), - (0x1D5C5, 'M', u'l'), - (0x1D5C6, 'M', u'm'), - (0x1D5C7, 'M', u'n'), - (0x1D5C8, 'M', u'o'), - (0x1D5C9, 'M', u'p'), - (0x1D5CA, 'M', u'q'), - (0x1D5CB, 'M', u'r'), - (0x1D5CC, 'M', u's'), - (0x1D5CD, 'M', u't'), - (0x1D5CE, 'M', u'u'), - (0x1D5CF, 'M', u'v'), - (0x1D5D0, 'M', u'w'), - (0x1D5D1, 'M', u'x'), - (0x1D5D2, 'M', u'y'), - (0x1D5D3, 'M', u'z'), - (0x1D5D4, 'M', u'a'), - (0x1D5D5, 'M', u'b'), - (0x1D5D6, 'M', u'c'), - (0x1D5D7, 'M', u'd'), - (0x1D5D8, 'M', u'e'), - (0x1D5D9, 'M', u'f'), - (0x1D5DA, 'M', u'g'), - (0x1D5DB, 'M', u'h'), - (0x1D5DC, 'M', u'i'), - (0x1D5DD, 'M', u'j'), - (0x1D5DE, 'M', u'k'), - (0x1D5DF, 'M', u'l'), - (0x1D5E0, 'M', u'm'), - (0x1D5E1, 'M', u'n'), - (0x1D5E2, 'M', u'o'), - (0x1D5E3, 'M', u'p'), - (0x1D5E4, 'M', u'q'), - (0x1D5E5, 'M', u'r'), - (0x1D5E6, 'M', u's'), - (0x1D5E7, 'M', u't'), - (0x1D5E8, 'M', u'u'), - (0x1D5E9, 'M', u'v'), - (0x1D5EA, 'M', u'w'), - (0x1D5EB, 'M', u'x'), - (0x1D5EC, 'M', u'y'), - (0x1D5ED, 'M', u'z'), - (0x1D5EE, 'M', u'a'), - (0x1D5EF, 'M', u'b'), - (0x1D5F0, 'M', u'c'), - (0x1D5F1, 'M', u'd'), - (0x1D5F2, 'M', u'e'), - ] - -def _seg_63(): - return [ - (0x1D5F3, 'M', u'f'), - (0x1D5F4, 'M', u'g'), - (0x1D5F5, 'M', u'h'), - (0x1D5F6, 'M', u'i'), - (0x1D5F7, 'M', u'j'), - (0x1D5F8, 'M', u'k'), - (0x1D5F9, 'M', u'l'), - (0x1D5FA, 'M', u'm'), - (0x1D5FB, 'M', u'n'), - (0x1D5FC, 'M', u'o'), - (0x1D5FD, 'M', u'p'), - (0x1D5FE, 'M', u'q'), - (0x1D5FF, 'M', u'r'), - (0x1D600, 'M', u's'), - (0x1D601, 'M', u't'), - (0x1D602, 'M', u'u'), - (0x1D603, 'M', u'v'), - (0x1D604, 'M', u'w'), - (0x1D605, 'M', u'x'), - (0x1D606, 'M', u'y'), - (0x1D607, 'M', u'z'), - (0x1D608, 'M', u'a'), - (0x1D609, 'M', u'b'), - (0x1D60A, 'M', u'c'), - (0x1D60B, 'M', u'd'), - (0x1D60C, 'M', u'e'), - (0x1D60D, 'M', u'f'), - (0x1D60E, 'M', u'g'), - (0x1D60F, 'M', u'h'), - (0x1D610, 'M', u'i'), - (0x1D611, 'M', u'j'), - (0x1D612, 'M', u'k'), - (0x1D613, 'M', u'l'), - (0x1D614, 'M', u'm'), - (0x1D615, 'M', u'n'), - (0x1D616, 'M', u'o'), - (0x1D617, 'M', u'p'), - (0x1D618, 'M', u'q'), - (0x1D619, 'M', u'r'), - (0x1D61A, 'M', u's'), - (0x1D61B, 'M', u't'), - (0x1D61C, 'M', u'u'), - (0x1D61D, 'M', u'v'), - (0x1D61E, 'M', u'w'), - (0x1D61F, 'M', u'x'), - (0x1D620, 'M', u'y'), - (0x1D621, 'M', u'z'), - (0x1D622, 'M', u'a'), - (0x1D623, 'M', u'b'), - (0x1D624, 'M', u'c'), - (0x1D625, 'M', u'd'), - (0x1D626, 'M', u'e'), - (0x1D627, 'M', u'f'), - (0x1D628, 'M', u'g'), - (0x1D629, 'M', u'h'), - (0x1D62A, 'M', u'i'), - (0x1D62B, 'M', u'j'), - (0x1D62C, 'M', u'k'), - (0x1D62D, 'M', u'l'), - (0x1D62E, 'M', u'm'), - (0x1D62F, 'M', u'n'), - (0x1D630, 'M', u'o'), - (0x1D631, 'M', u'p'), - (0x1D632, 'M', u'q'), - (0x1D633, 'M', u'r'), - (0x1D634, 'M', u's'), - (0x1D635, 'M', u't'), - (0x1D636, 'M', u'u'), - (0x1D637, 'M', u'v'), - (0x1D638, 'M', u'w'), - (0x1D639, 'M', u'x'), - (0x1D63A, 'M', u'y'), - (0x1D63B, 'M', u'z'), - (0x1D63C, 'M', u'a'), - (0x1D63D, 'M', u'b'), - (0x1D63E, 'M', u'c'), - (0x1D63F, 'M', u'd'), - (0x1D640, 'M', u'e'), - (0x1D641, 'M', u'f'), - (0x1D642, 'M', u'g'), - (0x1D643, 'M', u'h'), - (0x1D644, 'M', u'i'), - (0x1D645, 'M', u'j'), - (0x1D646, 'M', u'k'), - (0x1D647, 'M', u'l'), - (0x1D648, 'M', u'm'), - (0x1D649, 'M', u'n'), - (0x1D64A, 'M', u'o'), - (0x1D64B, 'M', u'p'), - (0x1D64C, 'M', u'q'), - (0x1D64D, 'M', u'r'), - (0x1D64E, 'M', u's'), - (0x1D64F, 'M', u't'), - (0x1D650, 'M', u'u'), - (0x1D651, 'M', u'v'), - (0x1D652, 'M', u'w'), - (0x1D653, 'M', u'x'), - (0x1D654, 'M', u'y'), - (0x1D655, 'M', u'z'), - (0x1D656, 'M', u'a'), - ] - -def _seg_64(): - return [ - (0x1D657, 'M', u'b'), - (0x1D658, 'M', u'c'), - (0x1D659, 'M', u'd'), - (0x1D65A, 'M', u'e'), - (0x1D65B, 'M', u'f'), - (0x1D65C, 'M', u'g'), - (0x1D65D, 'M', u'h'), - (0x1D65E, 'M', u'i'), - (0x1D65F, 'M', u'j'), - (0x1D660, 'M', u'k'), - (0x1D661, 'M', u'l'), - (0x1D662, 'M', u'm'), - (0x1D663, 'M', u'n'), - (0x1D664, 'M', u'o'), - (0x1D665, 'M', u'p'), - (0x1D666, 'M', u'q'), - (0x1D667, 'M', u'r'), - (0x1D668, 'M', u's'), - (0x1D669, 'M', u't'), - (0x1D66A, 'M', u'u'), - (0x1D66B, 'M', u'v'), - (0x1D66C, 'M', u'w'), - (0x1D66D, 'M', u'x'), - (0x1D66E, 'M', u'y'), - (0x1D66F, 'M', u'z'), - (0x1D670, 'M', u'a'), - (0x1D671, 'M', u'b'), - (0x1D672, 'M', u'c'), - (0x1D673, 'M', u'd'), - (0x1D674, 'M', u'e'), - (0x1D675, 'M', u'f'), - (0x1D676, 'M', u'g'), - (0x1D677, 'M', u'h'), - (0x1D678, 'M', u'i'), - (0x1D679, 'M', u'j'), - (0x1D67A, 'M', u'k'), - (0x1D67B, 'M', u'l'), - (0x1D67C, 'M', u'm'), - (0x1D67D, 'M', u'n'), - (0x1D67E, 'M', u'o'), - (0x1D67F, 'M', u'p'), - (0x1D680, 'M', u'q'), - (0x1D681, 'M', u'r'), - (0x1D682, 'M', u's'), - (0x1D683, 'M', u't'), - (0x1D684, 'M', u'u'), - (0x1D685, 'M', u'v'), - (0x1D686, 'M', u'w'), - (0x1D687, 'M', u'x'), - (0x1D688, 'M', u'y'), - (0x1D689, 'M', u'z'), - (0x1D68A, 'M', u'a'), - (0x1D68B, 'M', u'b'), - (0x1D68C, 'M', u'c'), - (0x1D68D, 'M', u'd'), - (0x1D68E, 'M', u'e'), - (0x1D68F, 'M', u'f'), - (0x1D690, 'M', u'g'), - (0x1D691, 'M', u'h'), - (0x1D692, 'M', u'i'), - (0x1D693, 'M', u'j'), - (0x1D694, 'M', u'k'), - (0x1D695, 'M', u'l'), - (0x1D696, 'M', u'm'), - (0x1D697, 'M', u'n'), - (0x1D698, 'M', u'o'), - (0x1D699, 'M', u'p'), - (0x1D69A, 'M', u'q'), - (0x1D69B, 'M', u'r'), - (0x1D69C, 'M', u's'), - (0x1D69D, 'M', u't'), - (0x1D69E, 'M', u'u'), - (0x1D69F, 'M', u'v'), - (0x1D6A0, 'M', u'w'), - (0x1D6A1, 'M', u'x'), - (0x1D6A2, 'M', u'y'), - (0x1D6A3, 'M', u'z'), - (0x1D6A4, 'M', u'ı'), - (0x1D6A5, 'M', u'ȷ'), - (0x1D6A6, 'X'), - (0x1D6A8, 'M', u'α'), - (0x1D6A9, 'M', u'β'), - (0x1D6AA, 'M', u'γ'), - (0x1D6AB, 'M', u'δ'), - (0x1D6AC, 'M', u'ε'), - (0x1D6AD, 'M', u'ζ'), - (0x1D6AE, 'M', u'η'), - (0x1D6AF, 'M', u'θ'), - (0x1D6B0, 'M', u'ι'), - (0x1D6B1, 'M', u'κ'), - (0x1D6B2, 'M', u'λ'), - (0x1D6B3, 'M', u'μ'), - (0x1D6B4, 'M', u'ν'), - (0x1D6B5, 'M', u'ξ'), - (0x1D6B6, 'M', u'ο'), - (0x1D6B7, 'M', u'π'), - (0x1D6B8, 'M', u'ρ'), - (0x1D6B9, 'M', u'θ'), - (0x1D6BA, 'M', u'σ'), - (0x1D6BB, 'M', u'τ'), - ] - -def _seg_65(): - return [ - (0x1D6BC, 'M', u'υ'), - (0x1D6BD, 'M', u'φ'), - (0x1D6BE, 'M', u'χ'), - (0x1D6BF, 'M', u'ψ'), - (0x1D6C0, 'M', u'ω'), - (0x1D6C1, 'M', u'∇'), - (0x1D6C2, 'M', u'α'), - (0x1D6C3, 'M', u'β'), - (0x1D6C4, 'M', u'γ'), - (0x1D6C5, 'M', u'δ'), - (0x1D6C6, 'M', u'ε'), - (0x1D6C7, 'M', u'ζ'), - (0x1D6C8, 'M', u'η'), - (0x1D6C9, 'M', u'θ'), - (0x1D6CA, 'M', u'ι'), - (0x1D6CB, 'M', u'κ'), - (0x1D6CC, 'M', u'λ'), - (0x1D6CD, 'M', u'μ'), - (0x1D6CE, 'M', u'ν'), - (0x1D6CF, 'M', u'ξ'), - (0x1D6D0, 'M', u'ο'), - (0x1D6D1, 'M', u'π'), - (0x1D6D2, 'M', u'ρ'), - (0x1D6D3, 'M', u'σ'), - (0x1D6D5, 'M', u'τ'), - (0x1D6D6, 'M', u'υ'), - (0x1D6D7, 'M', u'φ'), - (0x1D6D8, 'M', u'χ'), - (0x1D6D9, 'M', u'ψ'), - (0x1D6DA, 'M', u'ω'), - (0x1D6DB, 'M', u'∂'), - (0x1D6DC, 'M', u'ε'), - (0x1D6DD, 'M', u'θ'), - (0x1D6DE, 'M', u'κ'), - (0x1D6DF, 'M', u'φ'), - (0x1D6E0, 'M', u'ρ'), - (0x1D6E1, 'M', u'π'), - (0x1D6E2, 'M', u'α'), - (0x1D6E3, 'M', u'β'), - (0x1D6E4, 'M', u'γ'), - (0x1D6E5, 'M', u'δ'), - (0x1D6E6, 'M', u'ε'), - (0x1D6E7, 'M', u'ζ'), - (0x1D6E8, 'M', u'η'), - (0x1D6E9, 'M', u'θ'), - (0x1D6EA, 'M', u'ι'), - (0x1D6EB, 'M', u'κ'), - (0x1D6EC, 'M', u'λ'), - (0x1D6ED, 'M', u'μ'), - (0x1D6EE, 'M', u'ν'), - (0x1D6EF, 'M', u'ξ'), - (0x1D6F0, 'M', u'ο'), - (0x1D6F1, 'M', u'π'), - (0x1D6F2, 'M', u'ρ'), - (0x1D6F3, 'M', u'θ'), - (0x1D6F4, 'M', u'σ'), - (0x1D6F5, 'M', u'τ'), - (0x1D6F6, 'M', u'υ'), - (0x1D6F7, 'M', u'φ'), - (0x1D6F8, 'M', u'χ'), - (0x1D6F9, 'M', u'ψ'), - (0x1D6FA, 'M', u'ω'), - (0x1D6FB, 'M', u'∇'), - (0x1D6FC, 'M', u'α'), - (0x1D6FD, 'M', u'β'), - (0x1D6FE, 'M', u'γ'), - (0x1D6FF, 'M', u'δ'), - (0x1D700, 'M', u'ε'), - (0x1D701, 'M', u'ζ'), - (0x1D702, 'M', u'η'), - (0x1D703, 'M', u'θ'), - (0x1D704, 'M', u'ι'), - (0x1D705, 'M', u'κ'), - (0x1D706, 'M', u'λ'), - (0x1D707, 'M', u'μ'), - (0x1D708, 'M', u'ν'), - (0x1D709, 'M', u'ξ'), - (0x1D70A, 'M', u'ο'), - (0x1D70B, 'M', u'π'), - (0x1D70C, 'M', u'ρ'), - (0x1D70D, 'M', u'σ'), - (0x1D70F, 'M', u'τ'), - (0x1D710, 'M', u'υ'), - (0x1D711, 'M', u'φ'), - (0x1D712, 'M', u'χ'), - (0x1D713, 'M', u'ψ'), - (0x1D714, 'M', u'ω'), - (0x1D715, 'M', u'∂'), - (0x1D716, 'M', u'ε'), - (0x1D717, 'M', u'θ'), - (0x1D718, 'M', u'κ'), - (0x1D719, 'M', u'φ'), - (0x1D71A, 'M', u'ρ'), - (0x1D71B, 'M', u'π'), - (0x1D71C, 'M', u'α'), - (0x1D71D, 'M', u'β'), - (0x1D71E, 'M', u'γ'), - (0x1D71F, 'M', u'δ'), - (0x1D720, 'M', u'ε'), - (0x1D721, 'M', u'ζ'), - ] - -def _seg_66(): - return [ - (0x1D722, 'M', u'η'), - (0x1D723, 'M', u'θ'), - (0x1D724, 'M', u'ι'), - (0x1D725, 'M', u'κ'), - (0x1D726, 'M', u'λ'), - (0x1D727, 'M', u'μ'), - (0x1D728, 'M', u'ν'), - (0x1D729, 'M', u'ξ'), - (0x1D72A, 'M', u'ο'), - (0x1D72B, 'M', u'π'), - (0x1D72C, 'M', u'ρ'), - (0x1D72D, 'M', u'θ'), - (0x1D72E, 'M', u'σ'), - (0x1D72F, 'M', u'τ'), - (0x1D730, 'M', u'υ'), - (0x1D731, 'M', u'φ'), - (0x1D732, 'M', u'χ'), - (0x1D733, 'M', u'ψ'), - (0x1D734, 'M', u'ω'), - (0x1D735, 'M', u'∇'), - (0x1D736, 'M', u'α'), - (0x1D737, 'M', u'β'), - (0x1D738, 'M', u'γ'), - (0x1D739, 'M', u'δ'), - (0x1D73A, 'M', u'ε'), - (0x1D73B, 'M', u'ζ'), - (0x1D73C, 'M', u'η'), - (0x1D73D, 'M', u'θ'), - (0x1D73E, 'M', u'ι'), - (0x1D73F, 'M', u'κ'), - (0x1D740, 'M', u'λ'), - (0x1D741, 'M', u'μ'), - (0x1D742, 'M', u'ν'), - (0x1D743, 'M', u'ξ'), - (0x1D744, 'M', u'ο'), - (0x1D745, 'M', u'π'), - (0x1D746, 'M', u'ρ'), - (0x1D747, 'M', u'σ'), - (0x1D749, 'M', u'τ'), - (0x1D74A, 'M', u'υ'), - (0x1D74B, 'M', u'φ'), - (0x1D74C, 'M', u'χ'), - (0x1D74D, 'M', u'ψ'), - (0x1D74E, 'M', u'ω'), - (0x1D74F, 'M', u'∂'), - (0x1D750, 'M', u'ε'), - (0x1D751, 'M', u'θ'), - (0x1D752, 'M', u'κ'), - (0x1D753, 'M', u'φ'), - (0x1D754, 'M', u'ρ'), - (0x1D755, 'M', u'π'), - (0x1D756, 'M', u'α'), - (0x1D757, 'M', u'β'), - (0x1D758, 'M', u'γ'), - (0x1D759, 'M', u'δ'), - (0x1D75A, 'M', u'ε'), - (0x1D75B, 'M', u'ζ'), - (0x1D75C, 'M', u'η'), - (0x1D75D, 'M', u'θ'), - (0x1D75E, 'M', u'ι'), - (0x1D75F, 'M', u'κ'), - (0x1D760, 'M', u'λ'), - (0x1D761, 'M', u'μ'), - (0x1D762, 'M', u'ν'), - (0x1D763, 'M', u'ξ'), - (0x1D764, 'M', u'ο'), - (0x1D765, 'M', u'π'), - (0x1D766, 'M', u'ρ'), - (0x1D767, 'M', u'θ'), - (0x1D768, 'M', u'σ'), - (0x1D769, 'M', u'τ'), - (0x1D76A, 'M', u'υ'), - (0x1D76B, 'M', u'φ'), - (0x1D76C, 'M', u'χ'), - (0x1D76D, 'M', u'ψ'), - (0x1D76E, 'M', u'ω'), - (0x1D76F, 'M', u'∇'), - (0x1D770, 'M', u'α'), - (0x1D771, 'M', u'β'), - (0x1D772, 'M', u'γ'), - (0x1D773, 'M', u'δ'), - (0x1D774, 'M', u'ε'), - (0x1D775, 'M', u'ζ'), - (0x1D776, 'M', u'η'), - (0x1D777, 'M', u'θ'), - (0x1D778, 'M', u'ι'), - (0x1D779, 'M', u'κ'), - (0x1D77A, 'M', u'λ'), - (0x1D77B, 'M', u'μ'), - (0x1D77C, 'M', u'ν'), - (0x1D77D, 'M', u'ξ'), - (0x1D77E, 'M', u'ο'), - (0x1D77F, 'M', u'π'), - (0x1D780, 'M', u'ρ'), - (0x1D781, 'M', u'σ'), - (0x1D783, 'M', u'τ'), - (0x1D784, 'M', u'υ'), - (0x1D785, 'M', u'φ'), - (0x1D786, 'M', u'χ'), - (0x1D787, 'M', u'ψ'), - ] - -def _seg_67(): - return [ - (0x1D788, 'M', u'ω'), - (0x1D789, 'M', u'∂'), - (0x1D78A, 'M', u'ε'), - (0x1D78B, 'M', u'θ'), - (0x1D78C, 'M', u'κ'), - (0x1D78D, 'M', u'φ'), - (0x1D78E, 'M', u'ρ'), - (0x1D78F, 'M', u'π'), - (0x1D790, 'M', u'α'), - (0x1D791, 'M', u'β'), - (0x1D792, 'M', u'γ'), - (0x1D793, 'M', u'δ'), - (0x1D794, 'M', u'ε'), - (0x1D795, 'M', u'ζ'), - (0x1D796, 'M', u'η'), - (0x1D797, 'M', u'θ'), - (0x1D798, 'M', u'ι'), - (0x1D799, 'M', u'κ'), - (0x1D79A, 'M', u'λ'), - (0x1D79B, 'M', u'μ'), - (0x1D79C, 'M', u'ν'), - (0x1D79D, 'M', u'ξ'), - (0x1D79E, 'M', u'ο'), - (0x1D79F, 'M', u'π'), - (0x1D7A0, 'M', u'ρ'), - (0x1D7A1, 'M', u'θ'), - (0x1D7A2, 'M', u'σ'), - (0x1D7A3, 'M', u'τ'), - (0x1D7A4, 'M', u'υ'), - (0x1D7A5, 'M', u'φ'), - (0x1D7A6, 'M', u'χ'), - (0x1D7A7, 'M', u'ψ'), - (0x1D7A8, 'M', u'ω'), - (0x1D7A9, 'M', u'∇'), - (0x1D7AA, 'M', u'α'), - (0x1D7AB, 'M', u'β'), - (0x1D7AC, 'M', u'γ'), - (0x1D7AD, 'M', u'δ'), - (0x1D7AE, 'M', u'ε'), - (0x1D7AF, 'M', u'ζ'), - (0x1D7B0, 'M', u'η'), - (0x1D7B1, 'M', u'θ'), - (0x1D7B2, 'M', u'ι'), - (0x1D7B3, 'M', u'κ'), - (0x1D7B4, 'M', u'λ'), - (0x1D7B5, 'M', u'μ'), - (0x1D7B6, 'M', u'ν'), - (0x1D7B7, 'M', u'ξ'), - (0x1D7B8, 'M', u'ο'), - (0x1D7B9, 'M', u'π'), - (0x1D7BA, 'M', u'ρ'), - (0x1D7BB, 'M', u'σ'), - (0x1D7BD, 'M', u'τ'), - (0x1D7BE, 'M', u'υ'), - (0x1D7BF, 'M', u'φ'), - (0x1D7C0, 'M', u'χ'), - (0x1D7C1, 'M', u'ψ'), - (0x1D7C2, 'M', u'ω'), - (0x1D7C3, 'M', u'∂'), - (0x1D7C4, 'M', u'ε'), - (0x1D7C5, 'M', u'θ'), - (0x1D7C6, 'M', u'κ'), - (0x1D7C7, 'M', u'φ'), - (0x1D7C8, 'M', u'ρ'), - (0x1D7C9, 'M', u'π'), - (0x1D7CA, 'M', u'ϝ'), - (0x1D7CC, 'X'), - (0x1D7CE, 'M', u'0'), - (0x1D7CF, 'M', u'1'), - (0x1D7D0, 'M', u'2'), - (0x1D7D1, 'M', u'3'), - (0x1D7D2, 'M', u'4'), - (0x1D7D3, 'M', u'5'), - (0x1D7D4, 'M', u'6'), - (0x1D7D5, 'M', u'7'), - (0x1D7D6, 'M', u'8'), - (0x1D7D7, 'M', u'9'), - (0x1D7D8, 'M', u'0'), - (0x1D7D9, 'M', u'1'), - (0x1D7DA, 'M', u'2'), - (0x1D7DB, 'M', u'3'), - (0x1D7DC, 'M', u'4'), - (0x1D7DD, 'M', u'5'), - (0x1D7DE, 'M', u'6'), - (0x1D7DF, 'M', u'7'), - (0x1D7E0, 'M', u'8'), - (0x1D7E1, 'M', u'9'), - (0x1D7E2, 'M', u'0'), - (0x1D7E3, 'M', u'1'), - (0x1D7E4, 'M', u'2'), - (0x1D7E5, 'M', u'3'), - (0x1D7E6, 'M', u'4'), - (0x1D7E7, 'M', u'5'), - (0x1D7E8, 'M', u'6'), - (0x1D7E9, 'M', u'7'), - (0x1D7EA, 'M', u'8'), - (0x1D7EB, 'M', u'9'), - (0x1D7EC, 'M', u'0'), - (0x1D7ED, 'M', u'1'), - (0x1D7EE, 'M', u'2'), - ] - -def _seg_68(): - return [ - (0x1D7EF, 'M', u'3'), - (0x1D7F0, 'M', u'4'), - (0x1D7F1, 'M', u'5'), - (0x1D7F2, 'M', u'6'), - (0x1D7F3, 'M', u'7'), - (0x1D7F4, 'M', u'8'), - (0x1D7F5, 'M', u'9'), - (0x1D7F6, 'M', u'0'), - (0x1D7F7, 'M', u'1'), - (0x1D7F8, 'M', u'2'), - (0x1D7F9, 'M', u'3'), - (0x1D7FA, 'M', u'4'), - (0x1D7FB, 'M', u'5'), - (0x1D7FC, 'M', u'6'), - (0x1D7FD, 'M', u'7'), - (0x1D7FE, 'M', u'8'), - (0x1D7FF, 'M', u'9'), - (0x1D800, 'V'), - (0x1DA8C, 'X'), - (0x1DA9B, 'V'), - (0x1DAA0, 'X'), - (0x1DAA1, 'V'), - (0x1DAB0, 'X'), - (0x1E000, 'V'), - (0x1E007, 'X'), - (0x1E008, 'V'), - (0x1E019, 'X'), - (0x1E01B, 'V'), - (0x1E022, 'X'), - (0x1E023, 'V'), - (0x1E025, 'X'), - (0x1E026, 'V'), - (0x1E02B, 'X'), - (0x1E800, 'V'), - (0x1E8C5, 'X'), - (0x1E8C7, 'V'), - (0x1E8D7, 'X'), - (0x1E900, 'M', u'𞤢'), - (0x1E901, 'M', u'𞤣'), - (0x1E902, 'M', u'𞤤'), - (0x1E903, 'M', u'𞤥'), - (0x1E904, 'M', u'𞤦'), - (0x1E905, 'M', u'𞤧'), - (0x1E906, 'M', u'𞤨'), - (0x1E907, 'M', u'𞤩'), - (0x1E908, 'M', u'𞤪'), - (0x1E909, 'M', u'𞤫'), - (0x1E90A, 'M', u'𞤬'), - (0x1E90B, 'M', u'𞤭'), - (0x1E90C, 'M', u'𞤮'), - (0x1E90D, 'M', u'𞤯'), - (0x1E90E, 'M', u'𞤰'), - (0x1E90F, 'M', u'𞤱'), - (0x1E910, 'M', u'𞤲'), - (0x1E911, 'M', u'𞤳'), - (0x1E912, 'M', u'𞤴'), - (0x1E913, 'M', u'𞤵'), - (0x1E914, 'M', u'𞤶'), - (0x1E915, 'M', u'𞤷'), - (0x1E916, 'M', u'𞤸'), - (0x1E917, 'M', u'𞤹'), - (0x1E918, 'M', u'𞤺'), - (0x1E919, 'M', u'𞤻'), - (0x1E91A, 'M', u'𞤼'), - (0x1E91B, 'M', u'𞤽'), - (0x1E91C, 'M', u'𞤾'), - (0x1E91D, 'M', u'𞤿'), - (0x1E91E, 'M', u'𞥀'), - (0x1E91F, 'M', u'𞥁'), - (0x1E920, 'M', u'𞥂'), - (0x1E921, 'M', u'𞥃'), - (0x1E922, 'V'), - (0x1E94B, 'X'), - (0x1E950, 'V'), - (0x1E95A, 'X'), - (0x1E95E, 'V'), - (0x1E960, 'X'), - (0x1EC71, 'V'), - (0x1ECB5, 'X'), - (0x1EE00, 'M', u'ا'), - (0x1EE01, 'M', u'ب'), - (0x1EE02, 'M', u'ج'), - (0x1EE03, 'M', u'د'), - (0x1EE04, 'X'), - (0x1EE05, 'M', u'و'), - (0x1EE06, 'M', u'ز'), - (0x1EE07, 'M', u'ح'), - (0x1EE08, 'M', u'ط'), - (0x1EE09, 'M', u'ي'), - (0x1EE0A, 'M', u'ك'), - (0x1EE0B, 'M', u'ل'), - (0x1EE0C, 'M', u'م'), - (0x1EE0D, 'M', u'ن'), - (0x1EE0E, 'M', u'س'), - (0x1EE0F, 'M', u'ع'), - (0x1EE10, 'M', u'ف'), - (0x1EE11, 'M', u'ص'), - (0x1EE12, 'M', u'ق'), - (0x1EE13, 'M', u'ر'), - (0x1EE14, 'M', u'ش'), - ] - -def _seg_69(): - return [ - (0x1EE15, 'M', u'ت'), - (0x1EE16, 'M', u'ث'), - (0x1EE17, 'M', u'خ'), - (0x1EE18, 'M', u'ذ'), - (0x1EE19, 'M', u'ض'), - (0x1EE1A, 'M', u'ظ'), - (0x1EE1B, 'M', u'غ'), - (0x1EE1C, 'M', u'ٮ'), - (0x1EE1D, 'M', u'ں'), - (0x1EE1E, 'M', u'ڡ'), - (0x1EE1F, 'M', u'ٯ'), - (0x1EE20, 'X'), - (0x1EE21, 'M', u'ب'), - (0x1EE22, 'M', u'ج'), - (0x1EE23, 'X'), - (0x1EE24, 'M', u'ه'), - (0x1EE25, 'X'), - (0x1EE27, 'M', u'ح'), - (0x1EE28, 'X'), - (0x1EE29, 'M', u'ي'), - (0x1EE2A, 'M', u'ك'), - (0x1EE2B, 'M', u'ل'), - (0x1EE2C, 'M', u'م'), - (0x1EE2D, 'M', u'ن'), - (0x1EE2E, 'M', u'س'), - (0x1EE2F, 'M', u'ع'), - (0x1EE30, 'M', u'ف'), - (0x1EE31, 'M', u'ص'), - (0x1EE32, 'M', u'ق'), - (0x1EE33, 'X'), - (0x1EE34, 'M', u'ش'), - (0x1EE35, 'M', u'ت'), - (0x1EE36, 'M', u'ث'), - (0x1EE37, 'M', u'خ'), - (0x1EE38, 'X'), - (0x1EE39, 'M', u'ض'), - (0x1EE3A, 'X'), - (0x1EE3B, 'M', u'غ'), - (0x1EE3C, 'X'), - (0x1EE42, 'M', u'ج'), - (0x1EE43, 'X'), - (0x1EE47, 'M', u'ح'), - (0x1EE48, 'X'), - (0x1EE49, 'M', u'ي'), - (0x1EE4A, 'X'), - (0x1EE4B, 'M', u'ل'), - (0x1EE4C, 'X'), - (0x1EE4D, 'M', u'ن'), - (0x1EE4E, 'M', u'س'), - (0x1EE4F, 'M', u'ع'), - (0x1EE50, 'X'), - (0x1EE51, 'M', u'ص'), - (0x1EE52, 'M', u'ق'), - (0x1EE53, 'X'), - (0x1EE54, 'M', u'ش'), - (0x1EE55, 'X'), - (0x1EE57, 'M', u'خ'), - (0x1EE58, 'X'), - (0x1EE59, 'M', u'ض'), - (0x1EE5A, 'X'), - (0x1EE5B, 'M', u'غ'), - (0x1EE5C, 'X'), - (0x1EE5D, 'M', u'ں'), - (0x1EE5E, 'X'), - (0x1EE5F, 'M', u'ٯ'), - (0x1EE60, 'X'), - (0x1EE61, 'M', u'ب'), - (0x1EE62, 'M', u'ج'), - (0x1EE63, 'X'), - (0x1EE64, 'M', u'ه'), - (0x1EE65, 'X'), - (0x1EE67, 'M', u'ح'), - (0x1EE68, 'M', u'ط'), - (0x1EE69, 'M', u'ي'), - (0x1EE6A, 'M', u'ك'), - (0x1EE6B, 'X'), - (0x1EE6C, 'M', u'م'), - (0x1EE6D, 'M', u'ن'), - (0x1EE6E, 'M', u'س'), - (0x1EE6F, 'M', u'ع'), - (0x1EE70, 'M', u'ف'), - (0x1EE71, 'M', u'ص'), - (0x1EE72, 'M', u'ق'), - (0x1EE73, 'X'), - (0x1EE74, 'M', u'ش'), - (0x1EE75, 'M', u'ت'), - (0x1EE76, 'M', u'ث'), - (0x1EE77, 'M', u'خ'), - (0x1EE78, 'X'), - (0x1EE79, 'M', u'ض'), - (0x1EE7A, 'M', u'ظ'), - (0x1EE7B, 'M', u'غ'), - (0x1EE7C, 'M', u'ٮ'), - (0x1EE7D, 'X'), - (0x1EE7E, 'M', u'ڡ'), - (0x1EE7F, 'X'), - (0x1EE80, 'M', u'ا'), - (0x1EE81, 'M', u'ب'), - (0x1EE82, 'M', u'ج'), - (0x1EE83, 'M', u'د'), - ] - -def _seg_70(): - return [ - (0x1EE84, 'M', u'ه'), - (0x1EE85, 'M', u'و'), - (0x1EE86, 'M', u'ز'), - (0x1EE87, 'M', u'ح'), - (0x1EE88, 'M', u'ط'), - (0x1EE89, 'M', u'ي'), - (0x1EE8A, 'X'), - (0x1EE8B, 'M', u'ل'), - (0x1EE8C, 'M', u'م'), - (0x1EE8D, 'M', u'ن'), - (0x1EE8E, 'M', u'س'), - (0x1EE8F, 'M', u'ع'), - (0x1EE90, 'M', u'ف'), - (0x1EE91, 'M', u'ص'), - (0x1EE92, 'M', u'ق'), - (0x1EE93, 'M', u'ر'), - (0x1EE94, 'M', u'ش'), - (0x1EE95, 'M', u'ت'), - (0x1EE96, 'M', u'ث'), - (0x1EE97, 'M', u'خ'), - (0x1EE98, 'M', u'ذ'), - (0x1EE99, 'M', u'ض'), - (0x1EE9A, 'M', u'ظ'), - (0x1EE9B, 'M', u'غ'), - (0x1EE9C, 'X'), - (0x1EEA1, 'M', u'ب'), - (0x1EEA2, 'M', u'ج'), - (0x1EEA3, 'M', u'د'), - (0x1EEA4, 'X'), - (0x1EEA5, 'M', u'و'), - (0x1EEA6, 'M', u'ز'), - (0x1EEA7, 'M', u'ح'), - (0x1EEA8, 'M', u'ط'), - (0x1EEA9, 'M', u'ي'), - (0x1EEAA, 'X'), - (0x1EEAB, 'M', u'ل'), - (0x1EEAC, 'M', u'م'), - (0x1EEAD, 'M', u'ن'), - (0x1EEAE, 'M', u'س'), - (0x1EEAF, 'M', u'ع'), - (0x1EEB0, 'M', u'ف'), - (0x1EEB1, 'M', u'ص'), - (0x1EEB2, 'M', u'ق'), - (0x1EEB3, 'M', u'ر'), - (0x1EEB4, 'M', u'ش'), - (0x1EEB5, 'M', u'ت'), - (0x1EEB6, 'M', u'ث'), - (0x1EEB7, 'M', u'خ'), - (0x1EEB8, 'M', u'ذ'), - (0x1EEB9, 'M', u'ض'), - (0x1EEBA, 'M', u'ظ'), - (0x1EEBB, 'M', u'غ'), - (0x1EEBC, 'X'), - (0x1EEF0, 'V'), - (0x1EEF2, 'X'), - (0x1F000, 'V'), - (0x1F02C, 'X'), - (0x1F030, 'V'), - (0x1F094, 'X'), - (0x1F0A0, 'V'), - (0x1F0AF, 'X'), - (0x1F0B1, 'V'), - (0x1F0C0, 'X'), - (0x1F0C1, 'V'), - (0x1F0D0, 'X'), - (0x1F0D1, 'V'), - (0x1F0F6, 'X'), - (0x1F101, '3', u'0,'), - (0x1F102, '3', u'1,'), - (0x1F103, '3', u'2,'), - (0x1F104, '3', u'3,'), - (0x1F105, '3', u'4,'), - (0x1F106, '3', u'5,'), - (0x1F107, '3', u'6,'), - (0x1F108, '3', u'7,'), - (0x1F109, '3', u'8,'), - (0x1F10A, '3', u'9,'), - (0x1F10B, 'V'), - (0x1F10D, 'X'), - (0x1F110, '3', u'(a)'), - (0x1F111, '3', u'(b)'), - (0x1F112, '3', u'(c)'), - (0x1F113, '3', u'(d)'), - (0x1F114, '3', u'(e)'), - (0x1F115, '3', u'(f)'), - (0x1F116, '3', u'(g)'), - (0x1F117, '3', u'(h)'), - (0x1F118, '3', u'(i)'), - (0x1F119, '3', u'(j)'), - (0x1F11A, '3', u'(k)'), - (0x1F11B, '3', u'(l)'), - (0x1F11C, '3', u'(m)'), - (0x1F11D, '3', u'(n)'), - (0x1F11E, '3', u'(o)'), - (0x1F11F, '3', u'(p)'), - (0x1F120, '3', u'(q)'), - (0x1F121, '3', u'(r)'), - (0x1F122, '3', u'(s)'), - (0x1F123, '3', u'(t)'), - (0x1F124, '3', u'(u)'), - ] - -def _seg_71(): - return [ - (0x1F125, '3', u'(v)'), - (0x1F126, '3', u'(w)'), - (0x1F127, '3', u'(x)'), - (0x1F128, '3', u'(y)'), - (0x1F129, '3', u'(z)'), - (0x1F12A, 'M', u'〔s〕'), - (0x1F12B, 'M', u'c'), - (0x1F12C, 'M', u'r'), - (0x1F12D, 'M', u'cd'), - (0x1F12E, 'M', u'wz'), - (0x1F12F, 'V'), - (0x1F130, 'M', u'a'), - (0x1F131, 'M', u'b'), - (0x1F132, 'M', u'c'), - (0x1F133, 'M', u'd'), - (0x1F134, 'M', u'e'), - (0x1F135, 'M', u'f'), - (0x1F136, 'M', u'g'), - (0x1F137, 'M', u'h'), - (0x1F138, 'M', u'i'), - (0x1F139, 'M', u'j'), - (0x1F13A, 'M', u'k'), - (0x1F13B, 'M', u'l'), - (0x1F13C, 'M', u'm'), - (0x1F13D, 'M', u'n'), - (0x1F13E, 'M', u'o'), - (0x1F13F, 'M', u'p'), - (0x1F140, 'M', u'q'), - (0x1F141, 'M', u'r'), - (0x1F142, 'M', u's'), - (0x1F143, 'M', u't'), - (0x1F144, 'M', u'u'), - (0x1F145, 'M', u'v'), - (0x1F146, 'M', u'w'), - (0x1F147, 'M', u'x'), - (0x1F148, 'M', u'y'), - (0x1F149, 'M', u'z'), - (0x1F14A, 'M', u'hv'), - (0x1F14B, 'M', u'mv'), - (0x1F14C, 'M', u'sd'), - (0x1F14D, 'M', u'ss'), - (0x1F14E, 'M', u'ppv'), - (0x1F14F, 'M', u'wc'), - (0x1F150, 'V'), - (0x1F16A, 'M', u'mc'), - (0x1F16B, 'M', u'md'), - (0x1F16C, 'X'), - (0x1F170, 'V'), - (0x1F190, 'M', u'dj'), - (0x1F191, 'V'), - (0x1F1AD, 'X'), - (0x1F1E6, 'V'), - (0x1F200, 'M', u'ほか'), - (0x1F201, 'M', u'ココ'), - (0x1F202, 'M', u'サ'), - (0x1F203, 'X'), - (0x1F210, 'M', u'手'), - (0x1F211, 'M', u'字'), - (0x1F212, 'M', u'双'), - (0x1F213, 'M', u'デ'), - (0x1F214, 'M', u'二'), - (0x1F215, 'M', u'多'), - (0x1F216, 'M', u'解'), - (0x1F217, 'M', u'天'), - (0x1F218, 'M', u'交'), - (0x1F219, 'M', u'映'), - (0x1F21A, 'M', u'無'), - (0x1F21B, 'M', u'料'), - (0x1F21C, 'M', u'前'), - (0x1F21D, 'M', u'後'), - (0x1F21E, 'M', u'再'), - (0x1F21F, 'M', u'新'), - (0x1F220, 'M', u'初'), - (0x1F221, 'M', u'終'), - (0x1F222, 'M', u'生'), - (0x1F223, 'M', u'販'), - (0x1F224, 'M', u'声'), - (0x1F225, 'M', u'吹'), - (0x1F226, 'M', u'演'), - (0x1F227, 'M', u'投'), - (0x1F228, 'M', u'捕'), - (0x1F229, 'M', u'一'), - (0x1F22A, 'M', u'三'), - (0x1F22B, 'M', u'遊'), - (0x1F22C, 'M', u'左'), - (0x1F22D, 'M', u'中'), - (0x1F22E, 'M', u'右'), - (0x1F22F, 'M', u'指'), - (0x1F230, 'M', u'走'), - (0x1F231, 'M', u'打'), - (0x1F232, 'M', u'禁'), - (0x1F233, 'M', u'空'), - (0x1F234, 'M', u'合'), - (0x1F235, 'M', u'満'), - (0x1F236, 'M', u'有'), - (0x1F237, 'M', u'月'), - (0x1F238, 'M', u'申'), - (0x1F239, 'M', u'割'), - (0x1F23A, 'M', u'営'), - (0x1F23B, 'M', u'配'), - ] - -def _seg_72(): - return [ - (0x1F23C, 'X'), - (0x1F240, 'M', u'〔本〕'), - (0x1F241, 'M', u'〔三〕'), - (0x1F242, 'M', u'〔二〕'), - (0x1F243, 'M', u'〔安〕'), - (0x1F244, 'M', u'〔点〕'), - (0x1F245, 'M', u'〔打〕'), - (0x1F246, 'M', u'〔盗〕'), - (0x1F247, 'M', u'〔勝〕'), - (0x1F248, 'M', u'〔敗〕'), - (0x1F249, 'X'), - (0x1F250, 'M', u'得'), - (0x1F251, 'M', u'可'), - (0x1F252, 'X'), - (0x1F260, 'V'), - (0x1F266, 'X'), - (0x1F300, 'V'), - (0x1F6D5, 'X'), - (0x1F6E0, 'V'), - (0x1F6ED, 'X'), - (0x1F6F0, 'V'), - (0x1F6FA, 'X'), - (0x1F700, 'V'), - (0x1F774, 'X'), - (0x1F780, 'V'), - (0x1F7D9, 'X'), - (0x1F800, 'V'), - (0x1F80C, 'X'), - (0x1F810, 'V'), - (0x1F848, 'X'), - (0x1F850, 'V'), - (0x1F85A, 'X'), - (0x1F860, 'V'), - (0x1F888, 'X'), - (0x1F890, 'V'), - (0x1F8AE, 'X'), - (0x1F900, 'V'), - (0x1F90C, 'X'), - (0x1F910, 'V'), - (0x1F93F, 'X'), - (0x1F940, 'V'), - (0x1F971, 'X'), - (0x1F973, 'V'), - (0x1F977, 'X'), - (0x1F97A, 'V'), - (0x1F97B, 'X'), - (0x1F97C, 'V'), - (0x1F9A3, 'X'), - (0x1F9B0, 'V'), - (0x1F9BA, 'X'), - (0x1F9C0, 'V'), - (0x1F9C3, 'X'), - (0x1F9D0, 'V'), - (0x1FA00, 'X'), - (0x1FA60, 'V'), - (0x1FA6E, 'X'), - (0x20000, 'V'), - (0x2A6D7, 'X'), - (0x2A700, 'V'), - (0x2B735, 'X'), - (0x2B740, 'V'), - (0x2B81E, 'X'), - (0x2B820, 'V'), - (0x2CEA2, 'X'), - (0x2CEB0, 'V'), - (0x2EBE1, 'X'), - (0x2F800, 'M', u'丽'), - (0x2F801, 'M', u'丸'), - (0x2F802, 'M', u'乁'), - (0x2F803, 'M', u'𠄢'), - (0x2F804, 'M', u'你'), - (0x2F805, 'M', u'侮'), - (0x2F806, 'M', u'侻'), - (0x2F807, 'M', u'倂'), - (0x2F808, 'M', u'偺'), - (0x2F809, 'M', u'備'), - (0x2F80A, 'M', u'僧'), - (0x2F80B, 'M', u'像'), - (0x2F80C, 'M', u'㒞'), - (0x2F80D, 'M', u'𠘺'), - (0x2F80E, 'M', u'免'), - (0x2F80F, 'M', u'兔'), - (0x2F810, 'M', u'兤'), - (0x2F811, 'M', u'具'), - (0x2F812, 'M', u'𠔜'), - (0x2F813, 'M', u'㒹'), - (0x2F814, 'M', u'內'), - (0x2F815, 'M', u'再'), - (0x2F816, 'M', u'𠕋'), - (0x2F817, 'M', u'冗'), - (0x2F818, 'M', u'冤'), - (0x2F819, 'M', u'仌'), - (0x2F81A, 'M', u'冬'), - (0x2F81B, 'M', u'况'), - (0x2F81C, 'M', u'𩇟'), - (0x2F81D, 'M', u'凵'), - (0x2F81E, 'M', u'刃'), - (0x2F81F, 'M', u'㓟'), - (0x2F820, 'M', u'刻'), - (0x2F821, 'M', u'剆'), - ] - -def _seg_73(): - return [ - (0x2F822, 'M', u'割'), - (0x2F823, 'M', u'剷'), - (0x2F824, 'M', u'㔕'), - (0x2F825, 'M', u'勇'), - (0x2F826, 'M', u'勉'), - (0x2F827, 'M', u'勤'), - (0x2F828, 'M', u'勺'), - (0x2F829, 'M', u'包'), - (0x2F82A, 'M', u'匆'), - (0x2F82B, 'M', u'北'), - (0x2F82C, 'M', u'卉'), - (0x2F82D, 'M', u'卑'), - (0x2F82E, 'M', u'博'), - (0x2F82F, 'M', u'即'), - (0x2F830, 'M', u'卽'), - (0x2F831, 'M', u'卿'), - (0x2F834, 'M', u'𠨬'), - (0x2F835, 'M', u'灰'), - (0x2F836, 'M', u'及'), - (0x2F837, 'M', u'叟'), - (0x2F838, 'M', u'𠭣'), - (0x2F839, 'M', u'叫'), - (0x2F83A, 'M', u'叱'), - (0x2F83B, 'M', u'吆'), - (0x2F83C, 'M', u'咞'), - (0x2F83D, 'M', u'吸'), - (0x2F83E, 'M', u'呈'), - (0x2F83F, 'M', u'周'), - (0x2F840, 'M', u'咢'), - (0x2F841, 'M', u'哶'), - (0x2F842, 'M', u'唐'), - (0x2F843, 'M', u'啓'), - (0x2F844, 'M', u'啣'), - (0x2F845, 'M', u'善'), - (0x2F847, 'M', u'喙'), - (0x2F848, 'M', u'喫'), - (0x2F849, 'M', u'喳'), - (0x2F84A, 'M', u'嗂'), - (0x2F84B, 'M', u'圖'), - (0x2F84C, 'M', u'嘆'), - (0x2F84D, 'M', u'圗'), - (0x2F84E, 'M', u'噑'), - (0x2F84F, 'M', u'噴'), - (0x2F850, 'M', u'切'), - (0x2F851, 'M', u'壮'), - (0x2F852, 'M', u'城'), - (0x2F853, 'M', u'埴'), - (0x2F854, 'M', u'堍'), - (0x2F855, 'M', u'型'), - (0x2F856, 'M', u'堲'), - (0x2F857, 'M', u'報'), - (0x2F858, 'M', u'墬'), - (0x2F859, 'M', u'𡓤'), - (0x2F85A, 'M', u'売'), - (0x2F85B, 'M', u'壷'), - (0x2F85C, 'M', u'夆'), - (0x2F85D, 'M', u'多'), - (0x2F85E, 'M', u'夢'), - (0x2F85F, 'M', u'奢'), - (0x2F860, 'M', u'𡚨'), - (0x2F861, 'M', u'𡛪'), - (0x2F862, 'M', u'姬'), - (0x2F863, 'M', u'娛'), - (0x2F864, 'M', u'娧'), - (0x2F865, 'M', u'姘'), - (0x2F866, 'M', u'婦'), - (0x2F867, 'M', u'㛮'), - (0x2F868, 'X'), - (0x2F869, 'M', u'嬈'), - (0x2F86A, 'M', u'嬾'), - (0x2F86C, 'M', u'𡧈'), - (0x2F86D, 'M', u'寃'), - (0x2F86E, 'M', u'寘'), - (0x2F86F, 'M', u'寧'), - (0x2F870, 'M', u'寳'), - (0x2F871, 'M', u'𡬘'), - (0x2F872, 'M', u'寿'), - (0x2F873, 'M', u'将'), - (0x2F874, 'X'), - (0x2F875, 'M', u'尢'), - (0x2F876, 'M', u'㞁'), - (0x2F877, 'M', u'屠'), - (0x2F878, 'M', u'屮'), - (0x2F879, 'M', u'峀'), - (0x2F87A, 'M', u'岍'), - (0x2F87B, 'M', u'𡷤'), - (0x2F87C, 'M', u'嵃'), - (0x2F87D, 'M', u'𡷦'), - (0x2F87E, 'M', u'嵮'), - (0x2F87F, 'M', u'嵫'), - (0x2F880, 'M', u'嵼'), - (0x2F881, 'M', u'巡'), - (0x2F882, 'M', u'巢'), - (0x2F883, 'M', u'㠯'), - (0x2F884, 'M', u'巽'), - (0x2F885, 'M', u'帨'), - (0x2F886, 'M', u'帽'), - (0x2F887, 'M', u'幩'), - (0x2F888, 'M', u'㡢'), - (0x2F889, 'M', u'𢆃'), - ] - -def _seg_74(): - return [ - (0x2F88A, 'M', u'㡼'), - (0x2F88B, 'M', u'庰'), - (0x2F88C, 'M', u'庳'), - (0x2F88D, 'M', u'庶'), - (0x2F88E, 'M', u'廊'), - (0x2F88F, 'M', u'𪎒'), - (0x2F890, 'M', u'廾'), - (0x2F891, 'M', u'𢌱'), - (0x2F893, 'M', u'舁'), - (0x2F894, 'M', u'弢'), - (0x2F896, 'M', u'㣇'), - (0x2F897, 'M', u'𣊸'), - (0x2F898, 'M', u'𦇚'), - (0x2F899, 'M', u'形'), - (0x2F89A, 'M', u'彫'), - (0x2F89B, 'M', u'㣣'), - (0x2F89C, 'M', u'徚'), - (0x2F89D, 'M', u'忍'), - (0x2F89E, 'M', u'志'), - (0x2F89F, 'M', u'忹'), - (0x2F8A0, 'M', u'悁'), - (0x2F8A1, 'M', u'㤺'), - (0x2F8A2, 'M', u'㤜'), - (0x2F8A3, 'M', u'悔'), - (0x2F8A4, 'M', u'𢛔'), - (0x2F8A5, 'M', u'惇'), - (0x2F8A6, 'M', u'慈'), - (0x2F8A7, 'M', u'慌'), - (0x2F8A8, 'M', u'慎'), - (0x2F8A9, 'M', u'慌'), - (0x2F8AA, 'M', u'慺'), - (0x2F8AB, 'M', u'憎'), - (0x2F8AC, 'M', u'憲'), - (0x2F8AD, 'M', u'憤'), - (0x2F8AE, 'M', u'憯'), - (0x2F8AF, 'M', u'懞'), - (0x2F8B0, 'M', u'懲'), - (0x2F8B1, 'M', u'懶'), - (0x2F8B2, 'M', u'成'), - (0x2F8B3, 'M', u'戛'), - (0x2F8B4, 'M', u'扝'), - (0x2F8B5, 'M', u'抱'), - (0x2F8B6, 'M', u'拔'), - (0x2F8B7, 'M', u'捐'), - (0x2F8B8, 'M', u'𢬌'), - (0x2F8B9, 'M', u'挽'), - (0x2F8BA, 'M', u'拼'), - (0x2F8BB, 'M', u'捨'), - (0x2F8BC, 'M', u'掃'), - (0x2F8BD, 'M', u'揤'), - (0x2F8BE, 'M', u'𢯱'), - (0x2F8BF, 'M', u'搢'), - (0x2F8C0, 'M', u'揅'), - (0x2F8C1, 'M', u'掩'), - (0x2F8C2, 'M', u'㨮'), - (0x2F8C3, 'M', u'摩'), - (0x2F8C4, 'M', u'摾'), - (0x2F8C5, 'M', u'撝'), - (0x2F8C6, 'M', u'摷'), - (0x2F8C7, 'M', u'㩬'), - (0x2F8C8, 'M', u'敏'), - (0x2F8C9, 'M', u'敬'), - (0x2F8CA, 'M', u'𣀊'), - (0x2F8CB, 'M', u'旣'), - (0x2F8CC, 'M', u'書'), - (0x2F8CD, 'M', u'晉'), - (0x2F8CE, 'M', u'㬙'), - (0x2F8CF, 'M', u'暑'), - (0x2F8D0, 'M', u'㬈'), - (0x2F8D1, 'M', u'㫤'), - (0x2F8D2, 'M', u'冒'), - (0x2F8D3, 'M', u'冕'), - (0x2F8D4, 'M', u'最'), - (0x2F8D5, 'M', u'暜'), - (0x2F8D6, 'M', u'肭'), - (0x2F8D7, 'M', u'䏙'), - (0x2F8D8, 'M', u'朗'), - (0x2F8D9, 'M', u'望'), - (0x2F8DA, 'M', u'朡'), - (0x2F8DB, 'M', u'杞'), - (0x2F8DC, 'M', u'杓'), - (0x2F8DD, 'M', u'𣏃'), - (0x2F8DE, 'M', u'㭉'), - (0x2F8DF, 'M', u'柺'), - (0x2F8E0, 'M', u'枅'), - (0x2F8E1, 'M', u'桒'), - (0x2F8E2, 'M', u'梅'), - (0x2F8E3, 'M', u'𣑭'), - (0x2F8E4, 'M', u'梎'), - (0x2F8E5, 'M', u'栟'), - (0x2F8E6, 'M', u'椔'), - (0x2F8E7, 'M', u'㮝'), - (0x2F8E8, 'M', u'楂'), - (0x2F8E9, 'M', u'榣'), - (0x2F8EA, 'M', u'槪'), - (0x2F8EB, 'M', u'檨'), - (0x2F8EC, 'M', u'𣚣'), - (0x2F8ED, 'M', u'櫛'), - (0x2F8EE, 'M', u'㰘'), - (0x2F8EF, 'M', u'次'), - ] - -def _seg_75(): - return [ - (0x2F8F0, 'M', u'𣢧'), - (0x2F8F1, 'M', u'歔'), - (0x2F8F2, 'M', u'㱎'), - (0x2F8F3, 'M', u'歲'), - (0x2F8F4, 'M', u'殟'), - (0x2F8F5, 'M', u'殺'), - (0x2F8F6, 'M', u'殻'), - (0x2F8F7, 'M', u'𣪍'), - (0x2F8F8, 'M', u'𡴋'), - (0x2F8F9, 'M', u'𣫺'), - (0x2F8FA, 'M', u'汎'), - (0x2F8FB, 'M', u'𣲼'), - (0x2F8FC, 'M', u'沿'), - (0x2F8FD, 'M', u'泍'), - (0x2F8FE, 'M', u'汧'), - (0x2F8FF, 'M', u'洖'), - (0x2F900, 'M', u'派'), - (0x2F901, 'M', u'海'), - (0x2F902, 'M', u'流'), - (0x2F903, 'M', u'浩'), - (0x2F904, 'M', u'浸'), - (0x2F905, 'M', u'涅'), - (0x2F906, 'M', u'𣴞'), - (0x2F907, 'M', u'洴'), - (0x2F908, 'M', u'港'), - (0x2F909, 'M', u'湮'), - (0x2F90A, 'M', u'㴳'), - (0x2F90B, 'M', u'滋'), - (0x2F90C, 'M', u'滇'), - (0x2F90D, 'M', u'𣻑'), - (0x2F90E, 'M', u'淹'), - (0x2F90F, 'M', u'潮'), - (0x2F910, 'M', u'𣽞'), - (0x2F911, 'M', u'𣾎'), - (0x2F912, 'M', u'濆'), - (0x2F913, 'M', u'瀹'), - (0x2F914, 'M', u'瀞'), - (0x2F915, 'M', u'瀛'), - (0x2F916, 'M', u'㶖'), - (0x2F917, 'M', u'灊'), - (0x2F918, 'M', u'災'), - (0x2F919, 'M', u'灷'), - (0x2F91A, 'M', u'炭'), - (0x2F91B, 'M', u'𠔥'), - (0x2F91C, 'M', u'煅'), - (0x2F91D, 'M', u'𤉣'), - (0x2F91E, 'M', u'熜'), - (0x2F91F, 'X'), - (0x2F920, 'M', u'爨'), - (0x2F921, 'M', u'爵'), - (0x2F922, 'M', u'牐'), - (0x2F923, 'M', u'𤘈'), - (0x2F924, 'M', u'犀'), - (0x2F925, 'M', u'犕'), - (0x2F926, 'M', u'𤜵'), - (0x2F927, 'M', u'𤠔'), - (0x2F928, 'M', u'獺'), - (0x2F929, 'M', u'王'), - (0x2F92A, 'M', u'㺬'), - (0x2F92B, 'M', u'玥'), - (0x2F92C, 'M', u'㺸'), - (0x2F92E, 'M', u'瑇'), - (0x2F92F, 'M', u'瑜'), - (0x2F930, 'M', u'瑱'), - (0x2F931, 'M', u'璅'), - (0x2F932, 'M', u'瓊'), - (0x2F933, 'M', u'㼛'), - (0x2F934, 'M', u'甤'), - (0x2F935, 'M', u'𤰶'), - (0x2F936, 'M', u'甾'), - (0x2F937, 'M', u'𤲒'), - (0x2F938, 'M', u'異'), - (0x2F939, 'M', u'𢆟'), - (0x2F93A, 'M', u'瘐'), - (0x2F93B, 'M', u'𤾡'), - (0x2F93C, 'M', u'𤾸'), - (0x2F93D, 'M', u'𥁄'), - (0x2F93E, 'M', u'㿼'), - (0x2F93F, 'M', u'䀈'), - (0x2F940, 'M', u'直'), - (0x2F941, 'M', u'𥃳'), - (0x2F942, 'M', u'𥃲'), - (0x2F943, 'M', u'𥄙'), - (0x2F944, 'M', u'𥄳'), - (0x2F945, 'M', u'眞'), - (0x2F946, 'M', u'真'), - (0x2F948, 'M', u'睊'), - (0x2F949, 'M', u'䀹'), - (0x2F94A, 'M', u'瞋'), - (0x2F94B, 'M', u'䁆'), - (0x2F94C, 'M', u'䂖'), - (0x2F94D, 'M', u'𥐝'), - (0x2F94E, 'M', u'硎'), - (0x2F94F, 'M', u'碌'), - (0x2F950, 'M', u'磌'), - (0x2F951, 'M', u'䃣'), - (0x2F952, 'M', u'𥘦'), - (0x2F953, 'M', u'祖'), - (0x2F954, 'M', u'𥚚'), - (0x2F955, 'M', u'𥛅'), - ] - -def _seg_76(): - return [ - (0x2F956, 'M', u'福'), - (0x2F957, 'M', u'秫'), - (0x2F958, 'M', u'䄯'), - (0x2F959, 'M', u'穀'), - (0x2F95A, 'M', u'穊'), - (0x2F95B, 'M', u'穏'), - (0x2F95C, 'M', u'𥥼'), - (0x2F95D, 'M', u'𥪧'), - (0x2F95F, 'X'), - (0x2F960, 'M', u'䈂'), - (0x2F961, 'M', u'𥮫'), - (0x2F962, 'M', u'篆'), - (0x2F963, 'M', u'築'), - (0x2F964, 'M', u'䈧'), - (0x2F965, 'M', u'𥲀'), - (0x2F966, 'M', u'糒'), - (0x2F967, 'M', u'䊠'), - (0x2F968, 'M', u'糨'), - (0x2F969, 'M', u'糣'), - (0x2F96A, 'M', u'紀'), - (0x2F96B, 'M', u'𥾆'), - (0x2F96C, 'M', u'絣'), - (0x2F96D, 'M', u'䌁'), - (0x2F96E, 'M', u'緇'), - (0x2F96F, 'M', u'縂'), - (0x2F970, 'M', u'繅'), - (0x2F971, 'M', u'䌴'), - (0x2F972, 'M', u'𦈨'), - (0x2F973, 'M', u'𦉇'), - (0x2F974, 'M', u'䍙'), - (0x2F975, 'M', u'𦋙'), - (0x2F976, 'M', u'罺'), - (0x2F977, 'M', u'𦌾'), - (0x2F978, 'M', u'羕'), - (0x2F979, 'M', u'翺'), - (0x2F97A, 'M', u'者'), - (0x2F97B, 'M', u'𦓚'), - (0x2F97C, 'M', u'𦔣'), - (0x2F97D, 'M', u'聠'), - (0x2F97E, 'M', u'𦖨'), - (0x2F97F, 'M', u'聰'), - (0x2F980, 'M', u'𣍟'), - (0x2F981, 'M', u'䏕'), - (0x2F982, 'M', u'育'), - (0x2F983, 'M', u'脃'), - (0x2F984, 'M', u'䐋'), - (0x2F985, 'M', u'脾'), - (0x2F986, 'M', u'媵'), - (0x2F987, 'M', u'𦞧'), - (0x2F988, 'M', u'𦞵'), - (0x2F989, 'M', u'𣎓'), - (0x2F98A, 'M', u'𣎜'), - (0x2F98B, 'M', u'舁'), - (0x2F98C, 'M', u'舄'), - (0x2F98D, 'M', u'辞'), - (0x2F98E, 'M', u'䑫'), - (0x2F98F, 'M', u'芑'), - (0x2F990, 'M', u'芋'), - (0x2F991, 'M', u'芝'), - (0x2F992, 'M', u'劳'), - (0x2F993, 'M', u'花'), - (0x2F994, 'M', u'芳'), - (0x2F995, 'M', u'芽'), - (0x2F996, 'M', u'苦'), - (0x2F997, 'M', u'𦬼'), - (0x2F998, 'M', u'若'), - (0x2F999, 'M', u'茝'), - (0x2F99A, 'M', u'荣'), - (0x2F99B, 'M', u'莭'), - (0x2F99C, 'M', u'茣'), - (0x2F99D, 'M', u'莽'), - (0x2F99E, 'M', u'菧'), - (0x2F99F, 'M', u'著'), - (0x2F9A0, 'M', u'荓'), - (0x2F9A1, 'M', u'菊'), - (0x2F9A2, 'M', u'菌'), - (0x2F9A3, 'M', u'菜'), - (0x2F9A4, 'M', u'𦰶'), - (0x2F9A5, 'M', u'𦵫'), - (0x2F9A6, 'M', u'𦳕'), - (0x2F9A7, 'M', u'䔫'), - (0x2F9A8, 'M', u'蓱'), - (0x2F9A9, 'M', u'蓳'), - (0x2F9AA, 'M', u'蔖'), - (0x2F9AB, 'M', u'𧏊'), - (0x2F9AC, 'M', u'蕤'), - (0x2F9AD, 'M', u'𦼬'), - (0x2F9AE, 'M', u'䕝'), - (0x2F9AF, 'M', u'䕡'), - (0x2F9B0, 'M', u'𦾱'), - (0x2F9B1, 'M', u'𧃒'), - (0x2F9B2, 'M', u'䕫'), - (0x2F9B3, 'M', u'虐'), - (0x2F9B4, 'M', u'虜'), - (0x2F9B5, 'M', u'虧'), - (0x2F9B6, 'M', u'虩'), - (0x2F9B7, 'M', u'蚩'), - (0x2F9B8, 'M', u'蚈'), - (0x2F9B9, 'M', u'蜎'), - (0x2F9BA, 'M', u'蛢'), - ] - -def _seg_77(): - return [ - (0x2F9BB, 'M', u'蝹'), - (0x2F9BC, 'M', u'蜨'), - (0x2F9BD, 'M', u'蝫'), - (0x2F9BE, 'M', u'螆'), - (0x2F9BF, 'X'), - (0x2F9C0, 'M', u'蟡'), - (0x2F9C1, 'M', u'蠁'), - (0x2F9C2, 'M', u'䗹'), - (0x2F9C3, 'M', u'衠'), - (0x2F9C4, 'M', u'衣'), - (0x2F9C5, 'M', u'𧙧'), - (0x2F9C6, 'M', u'裗'), - (0x2F9C7, 'M', u'裞'), - (0x2F9C8, 'M', u'䘵'), - (0x2F9C9, 'M', u'裺'), - (0x2F9CA, 'M', u'㒻'), - (0x2F9CB, 'M', u'𧢮'), - (0x2F9CC, 'M', u'𧥦'), - (0x2F9CD, 'M', u'䚾'), - (0x2F9CE, 'M', u'䛇'), - (0x2F9CF, 'M', u'誠'), - (0x2F9D0, 'M', u'諭'), - (0x2F9D1, 'M', u'變'), - (0x2F9D2, 'M', u'豕'), - (0x2F9D3, 'M', u'𧲨'), - (0x2F9D4, 'M', u'貫'), - (0x2F9D5, 'M', u'賁'), - (0x2F9D6, 'M', u'贛'), - (0x2F9D7, 'M', u'起'), - (0x2F9D8, 'M', u'𧼯'), - (0x2F9D9, 'M', u'𠠄'), - (0x2F9DA, 'M', u'跋'), - (0x2F9DB, 'M', u'趼'), - (0x2F9DC, 'M', u'跰'), - (0x2F9DD, 'M', u'𠣞'), - (0x2F9DE, 'M', u'軔'), - (0x2F9DF, 'M', u'輸'), - (0x2F9E0, 'M', u'𨗒'), - (0x2F9E1, 'M', u'𨗭'), - (0x2F9E2, 'M', u'邔'), - (0x2F9E3, 'M', u'郱'), - (0x2F9E4, 'M', u'鄑'), - (0x2F9E5, 'M', u'𨜮'), - (0x2F9E6, 'M', u'鄛'), - (0x2F9E7, 'M', u'鈸'), - (0x2F9E8, 'M', u'鋗'), - (0x2F9E9, 'M', u'鋘'), - (0x2F9EA, 'M', u'鉼'), - (0x2F9EB, 'M', u'鏹'), - (0x2F9EC, 'M', u'鐕'), - (0x2F9ED, 'M', u'𨯺'), - (0x2F9EE, 'M', u'開'), - (0x2F9EF, 'M', u'䦕'), - (0x2F9F0, 'M', u'閷'), - (0x2F9F1, 'M', u'𨵷'), - (0x2F9F2, 'M', u'䧦'), - (0x2F9F3, 'M', u'雃'), - (0x2F9F4, 'M', u'嶲'), - (0x2F9F5, 'M', u'霣'), - (0x2F9F6, 'M', u'𩅅'), - (0x2F9F7, 'M', u'𩈚'), - (0x2F9F8, 'M', u'䩮'), - (0x2F9F9, 'M', u'䩶'), - (0x2F9FA, 'M', u'韠'), - (0x2F9FB, 'M', u'𩐊'), - (0x2F9FC, 'M', u'䪲'), - (0x2F9FD, 'M', u'𩒖'), - (0x2F9FE, 'M', u'頋'), - (0x2FA00, 'M', u'頩'), - (0x2FA01, 'M', u'𩖶'), - (0x2FA02, 'M', u'飢'), - (0x2FA03, 'M', u'䬳'), - (0x2FA04, 'M', u'餩'), - (0x2FA05, 'M', u'馧'), - (0x2FA06, 'M', u'駂'), - (0x2FA07, 'M', u'駾'), - (0x2FA08, 'M', u'䯎'), - (0x2FA09, 'M', u'𩬰'), - (0x2FA0A, 'M', u'鬒'), - (0x2FA0B, 'M', u'鱀'), - (0x2FA0C, 'M', u'鳽'), - (0x2FA0D, 'M', u'䳎'), - (0x2FA0E, 'M', u'䳭'), - (0x2FA0F, 'M', u'鵧'), - (0x2FA10, 'M', u'𪃎'), - (0x2FA11, 'M', u'䳸'), - (0x2FA12, 'M', u'𪄅'), - (0x2FA13, 'M', u'𪈎'), - (0x2FA14, 'M', u'𪊑'), - (0x2FA15, 'M', u'麻'), - (0x2FA16, 'M', u'䵖'), - (0x2FA17, 'M', u'黹'), - (0x2FA18, 'M', u'黾'), - (0x2FA19, 'M', u'鼅'), - (0x2FA1A, 'M', u'鼏'), - (0x2FA1B, 'M', u'鼖'), - (0x2FA1C, 'M', u'鼻'), - (0x2FA1D, 'M', u'𪘀'), - (0x2FA1E, 'X'), - (0xE0100, 'I'), - ] - -def _seg_78(): - return [ - (0xE01F0, 'X'), - ] - -uts46data = tuple( - _seg_0() - + _seg_1() - + _seg_2() - + _seg_3() - + _seg_4() - + _seg_5() - + _seg_6() - + _seg_7() - + _seg_8() - + _seg_9() - + _seg_10() - + _seg_11() - + _seg_12() - + _seg_13() - + _seg_14() - + _seg_15() - + _seg_16() - + _seg_17() - + _seg_18() - + _seg_19() - + _seg_20() - + _seg_21() - + _seg_22() - + _seg_23() - + _seg_24() - + _seg_25() - + _seg_26() - + _seg_27() - + _seg_28() - + _seg_29() - + _seg_30() - + _seg_31() - + _seg_32() - + _seg_33() - + _seg_34() - + _seg_35() - + _seg_36() - + _seg_37() - + _seg_38() - + _seg_39() - + _seg_40() - + _seg_41() - + _seg_42() - + _seg_43() - + _seg_44() - + _seg_45() - + _seg_46() - + _seg_47() - + _seg_48() - + _seg_49() - + _seg_50() - + _seg_51() - + _seg_52() - + _seg_53() - + _seg_54() - + _seg_55() - + _seg_56() - + _seg_57() - + _seg_58() - + _seg_59() - + _seg_60() - + _seg_61() - + _seg_62() - + _seg_63() - + _seg_64() - + _seg_65() - + _seg_66() - + _seg_67() - + _seg_68() - + _seg_69() - + _seg_70() - + _seg_71() - + _seg_72() - + _seg_73() - + _seg_74() - + _seg_75() - + _seg_76() - + _seg_77() - + _seg_78() -) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/ipaddress.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/ipaddress.py deleted file mode 100644 index f2d0766..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/ipaddress.py +++ /dev/null @@ -1,2419 +0,0 @@ -# Copyright 2007 Google Inc. -# Licensed to PSF under a Contributor Agreement. - -"""A fast, lightweight IPv4/IPv6 manipulation library in Python. - -This library is used to create/poke/manipulate IPv4 and IPv6 addresses -and networks. - -""" - -from __future__ import unicode_literals - - -import itertools -import struct - -__version__ = '1.0.22' - -# Compatibility functions -_compat_int_types = (int,) -try: - _compat_int_types = (int, long) -except NameError: - pass -try: - _compat_str = unicode -except NameError: - _compat_str = str - assert bytes != str -if b'\0'[0] == 0: # Python 3 semantics - def _compat_bytes_to_byte_vals(byt): - return byt -else: - def _compat_bytes_to_byte_vals(byt): - return [struct.unpack(b'!B', b)[0] for b in byt] -try: - _compat_int_from_byte_vals = int.from_bytes -except AttributeError: - def _compat_int_from_byte_vals(bytvals, endianess): - assert endianess == 'big' - res = 0 - for bv in bytvals: - assert isinstance(bv, _compat_int_types) - res = (res << 8) + bv - return res - - -def _compat_to_bytes(intval, length, endianess): - assert isinstance(intval, _compat_int_types) - assert endianess == 'big' - if length == 4: - if intval < 0 or intval >= 2 ** 32: - raise struct.error("integer out of range for 'I' format code") - return struct.pack(b'!I', intval) - elif length == 16: - if intval < 0 or intval >= 2 ** 128: - raise struct.error("integer out of range for 'QQ' format code") - return struct.pack(b'!QQ', intval >> 64, intval & 0xffffffffffffffff) - else: - raise NotImplementedError() - - -if hasattr(int, 'bit_length'): - # Not int.bit_length , since that won't work in 2.7 where long exists - def _compat_bit_length(i): - return i.bit_length() -else: - def _compat_bit_length(i): - for res in itertools.count(): - if i >> res == 0: - return res - - -def _compat_range(start, end, step=1): - assert step > 0 - i = start - while i < end: - yield i - i += step - - -class _TotalOrderingMixin(object): - __slots__ = () - - # Helper that derives the other comparison operations from - # __lt__ and __eq__ - # We avoid functools.total_ordering because it doesn't handle - # NotImplemented correctly yet (http://bugs.python.org/issue10042) - def __eq__(self, other): - raise NotImplementedError - - def __ne__(self, other): - equal = self.__eq__(other) - if equal is NotImplemented: - return NotImplemented - return not equal - - def __lt__(self, other): - raise NotImplementedError - - def __le__(self, other): - less = self.__lt__(other) - if less is NotImplemented or not less: - return self.__eq__(other) - return less - - def __gt__(self, other): - less = self.__lt__(other) - if less is NotImplemented: - return NotImplemented - equal = self.__eq__(other) - if equal is NotImplemented: - return NotImplemented - return not (less or equal) - - def __ge__(self, other): - less = self.__lt__(other) - if less is NotImplemented: - return NotImplemented - return not less - - -IPV4LENGTH = 32 -IPV6LENGTH = 128 - - -class AddressValueError(ValueError): - """A Value Error related to the address.""" - - -class NetmaskValueError(ValueError): - """A Value Error related to the netmask.""" - - -def ip_address(address): - """Take an IP string/int and return an object of the correct type. - - Args: - address: A string or integer, the IP address. Either IPv4 or - IPv6 addresses may be supplied; integers less than 2**32 will - be considered to be IPv4 by default. - - Returns: - An IPv4Address or IPv6Address object. - - Raises: - ValueError: if the *address* passed isn't either a v4 or a v6 - address - - """ - try: - return IPv4Address(address) - except (AddressValueError, NetmaskValueError): - pass - - try: - return IPv6Address(address) - except (AddressValueError, NetmaskValueError): - pass - - if isinstance(address, bytes): - raise AddressValueError( - '%r does not appear to be an IPv4 or IPv6 address. ' - 'Did you pass in a bytes (str in Python 2) instead of' - ' a unicode object?' % address) - - raise ValueError('%r does not appear to be an IPv4 or IPv6 address' % - address) - - -def ip_network(address, strict=True): - """Take an IP string/int and return an object of the correct type. - - Args: - address: A string or integer, the IP network. Either IPv4 or - IPv6 networks may be supplied; integers less than 2**32 will - be considered to be IPv4 by default. - - Returns: - An IPv4Network or IPv6Network object. - - Raises: - ValueError: if the string passed isn't either a v4 or a v6 - address. Or if the network has host bits set. - - """ - try: - return IPv4Network(address, strict) - except (AddressValueError, NetmaskValueError): - pass - - try: - return IPv6Network(address, strict) - except (AddressValueError, NetmaskValueError): - pass - - if isinstance(address, bytes): - raise AddressValueError( - '%r does not appear to be an IPv4 or IPv6 network. ' - 'Did you pass in a bytes (str in Python 2) instead of' - ' a unicode object?' % address) - - raise ValueError('%r does not appear to be an IPv4 or IPv6 network' % - address) - - -def ip_interface(address): - """Take an IP string/int and return an object of the correct type. - - Args: - address: A string or integer, the IP address. Either IPv4 or - IPv6 addresses may be supplied; integers less than 2**32 will - be considered to be IPv4 by default. - - Returns: - An IPv4Interface or IPv6Interface object. - - Raises: - ValueError: if the string passed isn't either a v4 or a v6 - address. - - Notes: - The IPv?Interface classes describe an Address on a particular - Network, so they're basically a combination of both the Address - and Network classes. - - """ - try: - return IPv4Interface(address) - except (AddressValueError, NetmaskValueError): - pass - - try: - return IPv6Interface(address) - except (AddressValueError, NetmaskValueError): - pass - - raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' % - address) - - -def v4_int_to_packed(address): - """Represent an address as 4 packed bytes in network (big-endian) order. - - Args: - address: An integer representation of an IPv4 IP address. - - Returns: - The integer address packed as 4 bytes in network (big-endian) order. - - Raises: - ValueError: If the integer is negative or too large to be an - IPv4 IP address. - - """ - try: - return _compat_to_bytes(address, 4, 'big') - except (struct.error, OverflowError): - raise ValueError("Address negative or too large for IPv4") - - -def v6_int_to_packed(address): - """Represent an address as 16 packed bytes in network (big-endian) order. - - Args: - address: An integer representation of an IPv6 IP address. - - Returns: - The integer address packed as 16 bytes in network (big-endian) order. - - """ - try: - return _compat_to_bytes(address, 16, 'big') - except (struct.error, OverflowError): - raise ValueError("Address negative or too large for IPv6") - - -def _split_optional_netmask(address): - """Helper to split the netmask and raise AddressValueError if needed""" - addr = _compat_str(address).split('/') - if len(addr) > 2: - raise AddressValueError("Only one '/' permitted in %r" % address) - return addr - - -def _find_address_range(addresses): - """Find a sequence of sorted deduplicated IPv#Address. - - Args: - addresses: a list of IPv#Address objects. - - Yields: - A tuple containing the first and last IP addresses in the sequence. - - """ - it = iter(addresses) - first = last = next(it) - for ip in it: - if ip._ip != last._ip + 1: - yield first, last - first = ip - last = ip - yield first, last - - -def _count_righthand_zero_bits(number, bits): - """Count the number of zero bits on the right hand side. - - Args: - number: an integer. - bits: maximum number of bits to count. - - Returns: - The number of zero bits on the right hand side of the number. - - """ - if number == 0: - return bits - return min(bits, _compat_bit_length(~number & (number - 1))) - - -def summarize_address_range(first, last): - """Summarize a network range given the first and last IP addresses. - - Example: - >>> list(summarize_address_range(IPv4Address('192.0.2.0'), - ... IPv4Address('192.0.2.130'))) - ... #doctest: +NORMALIZE_WHITESPACE - [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), - IPv4Network('192.0.2.130/32')] - - Args: - first: the first IPv4Address or IPv6Address in the range. - last: the last IPv4Address or IPv6Address in the range. - - Returns: - An iterator of the summarized IPv(4|6) network objects. - - Raise: - TypeError: - If the first and last objects are not IP addresses. - If the first and last objects are not the same version. - ValueError: - If the last object is not greater than the first. - If the version of the first address is not 4 or 6. - - """ - if (not (isinstance(first, _BaseAddress) and - isinstance(last, _BaseAddress))): - raise TypeError('first and last must be IP addresses, not networks') - if first.version != last.version: - raise TypeError("%s and %s are not of the same version" % ( - first, last)) - if first > last: - raise ValueError('last IP address must be greater than first') - - if first.version == 4: - ip = IPv4Network - elif first.version == 6: - ip = IPv6Network - else: - raise ValueError('unknown IP version') - - ip_bits = first._max_prefixlen - first_int = first._ip - last_int = last._ip - while first_int <= last_int: - nbits = min(_count_righthand_zero_bits(first_int, ip_bits), - _compat_bit_length(last_int - first_int + 1) - 1) - net = ip((first_int, ip_bits - nbits)) - yield net - first_int += 1 << nbits - if first_int - 1 == ip._ALL_ONES: - break - - -def _collapse_addresses_internal(addresses): - """Loops through the addresses, collapsing concurrent netblocks. - - Example: - - ip1 = IPv4Network('192.0.2.0/26') - ip2 = IPv4Network('192.0.2.64/26') - ip3 = IPv4Network('192.0.2.128/26') - ip4 = IPv4Network('192.0.2.192/26') - - _collapse_addresses_internal([ip1, ip2, ip3, ip4]) -> - [IPv4Network('192.0.2.0/24')] - - This shouldn't be called directly; it is called via - collapse_addresses([]). - - Args: - addresses: A list of IPv4Network's or IPv6Network's - - Returns: - A list of IPv4Network's or IPv6Network's depending on what we were - passed. - - """ - # First merge - to_merge = list(addresses) - subnets = {} - while to_merge: - net = to_merge.pop() - supernet = net.supernet() - existing = subnets.get(supernet) - if existing is None: - subnets[supernet] = net - elif existing != net: - # Merge consecutive subnets - del subnets[supernet] - to_merge.append(supernet) - # Then iterate over resulting networks, skipping subsumed subnets - last = None - for net in sorted(subnets.values()): - if last is not None: - # Since they are sorted, - # last.network_address <= net.network_address is a given. - if last.broadcast_address >= net.broadcast_address: - continue - yield net - last = net - - -def collapse_addresses(addresses): - """Collapse a list of IP objects. - - Example: - collapse_addresses([IPv4Network('192.0.2.0/25'), - IPv4Network('192.0.2.128/25')]) -> - [IPv4Network('192.0.2.0/24')] - - Args: - addresses: An iterator of IPv4Network or IPv6Network objects. - - Returns: - An iterator of the collapsed IPv(4|6)Network objects. - - Raises: - TypeError: If passed a list of mixed version objects. - - """ - addrs = [] - ips = [] - nets = [] - - # split IP addresses and networks - for ip in addresses: - if isinstance(ip, _BaseAddress): - if ips and ips[-1]._version != ip._version: - raise TypeError("%s and %s are not of the same version" % ( - ip, ips[-1])) - ips.append(ip) - elif ip._prefixlen == ip._max_prefixlen: - if ips and ips[-1]._version != ip._version: - raise TypeError("%s and %s are not of the same version" % ( - ip, ips[-1])) - try: - ips.append(ip.ip) - except AttributeError: - ips.append(ip.network_address) - else: - if nets and nets[-1]._version != ip._version: - raise TypeError("%s and %s are not of the same version" % ( - ip, nets[-1])) - nets.append(ip) - - # sort and dedup - ips = sorted(set(ips)) - - # find consecutive address ranges in the sorted sequence and summarize them - if ips: - for first, last in _find_address_range(ips): - addrs.extend(summarize_address_range(first, last)) - - return _collapse_addresses_internal(addrs + nets) - - -def get_mixed_type_key(obj): - """Return a key suitable for sorting between networks and addresses. - - Address and Network objects are not sortable by default; they're - fundamentally different so the expression - - IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24') - - doesn't make any sense. There are some times however, where you may wish - to have ipaddress sort these for you anyway. If you need to do this, you - can use this function as the key= argument to sorted(). - - Args: - obj: either a Network or Address object. - Returns: - appropriate key. - - """ - if isinstance(obj, _BaseNetwork): - return obj._get_networks_key() - elif isinstance(obj, _BaseAddress): - return obj._get_address_key() - return NotImplemented - - -class _IPAddressBase(_TotalOrderingMixin): - - """The mother class.""" - - __slots__ = () - - @property - def exploded(self): - """Return the longhand version of the IP address as a string.""" - return self._explode_shorthand_ip_string() - - @property - def compressed(self): - """Return the shorthand version of the IP address as a string.""" - return _compat_str(self) - - @property - def reverse_pointer(self): - """The name of the reverse DNS pointer for the IP address, e.g.: - >>> ipaddress.ip_address("127.0.0.1").reverse_pointer - '1.0.0.127.in-addr.arpa' - >>> ipaddress.ip_address("2001:db8::1").reverse_pointer - '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa' - - """ - return self._reverse_pointer() - - @property - def version(self): - msg = '%200s has no version specified' % (type(self),) - raise NotImplementedError(msg) - - def _check_int_address(self, address): - if address < 0: - msg = "%d (< 0) is not permitted as an IPv%d address" - raise AddressValueError(msg % (address, self._version)) - if address > self._ALL_ONES: - msg = "%d (>= 2**%d) is not permitted as an IPv%d address" - raise AddressValueError(msg % (address, self._max_prefixlen, - self._version)) - - def _check_packed_address(self, address, expected_len): - address_len = len(address) - if address_len != expected_len: - msg = ( - '%r (len %d != %d) is not permitted as an IPv%d address. ' - 'Did you pass in a bytes (str in Python 2) instead of' - ' a unicode object?') - raise AddressValueError(msg % (address, address_len, - expected_len, self._version)) - - @classmethod - def _ip_int_from_prefix(cls, prefixlen): - """Turn the prefix length into a bitwise netmask - - Args: - prefixlen: An integer, the prefix length. - - Returns: - An integer. - - """ - return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen) - - @classmethod - def _prefix_from_ip_int(cls, ip_int): - """Return prefix length from the bitwise netmask. - - Args: - ip_int: An integer, the netmask in expanded bitwise format - - Returns: - An integer, the prefix length. - - Raises: - ValueError: If the input intermingles zeroes & ones - """ - trailing_zeroes = _count_righthand_zero_bits(ip_int, - cls._max_prefixlen) - prefixlen = cls._max_prefixlen - trailing_zeroes - leading_ones = ip_int >> trailing_zeroes - all_ones = (1 << prefixlen) - 1 - if leading_ones != all_ones: - byteslen = cls._max_prefixlen // 8 - details = _compat_to_bytes(ip_int, byteslen, 'big') - msg = 'Netmask pattern %r mixes zeroes & ones' - raise ValueError(msg % details) - return prefixlen - - @classmethod - def _report_invalid_netmask(cls, netmask_str): - msg = '%r is not a valid netmask' % netmask_str - raise NetmaskValueError(msg) - - @classmethod - def _prefix_from_prefix_string(cls, prefixlen_str): - """Return prefix length from a numeric string - - Args: - prefixlen_str: The string to be converted - - Returns: - An integer, the prefix length. - - Raises: - NetmaskValueError: If the input is not a valid netmask - """ - # int allows a leading +/- as well as surrounding whitespace, - # so we ensure that isn't the case - if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str): - cls._report_invalid_netmask(prefixlen_str) - try: - prefixlen = int(prefixlen_str) - except ValueError: - cls._report_invalid_netmask(prefixlen_str) - if not (0 <= prefixlen <= cls._max_prefixlen): - cls._report_invalid_netmask(prefixlen_str) - return prefixlen - - @classmethod - def _prefix_from_ip_string(cls, ip_str): - """Turn a netmask/hostmask string into a prefix length - - Args: - ip_str: The netmask/hostmask to be converted - - Returns: - An integer, the prefix length. - - Raises: - NetmaskValueError: If the input is not a valid netmask/hostmask - """ - # Parse the netmask/hostmask like an IP address. - try: - ip_int = cls._ip_int_from_string(ip_str) - except AddressValueError: - cls._report_invalid_netmask(ip_str) - - # Try matching a netmask (this would be /1*0*/ as a bitwise regexp). - # Note that the two ambiguous cases (all-ones and all-zeroes) are - # treated as netmasks. - try: - return cls._prefix_from_ip_int(ip_int) - except ValueError: - pass - - # Invert the bits, and try matching a /0+1+/ hostmask instead. - ip_int ^= cls._ALL_ONES - try: - return cls._prefix_from_ip_int(ip_int) - except ValueError: - cls._report_invalid_netmask(ip_str) - - def __reduce__(self): - return self.__class__, (_compat_str(self),) - - -class _BaseAddress(_IPAddressBase): - - """A generic IP object. - - This IP class contains the version independent methods which are - used by single IP addresses. - """ - - __slots__ = () - - def __int__(self): - return self._ip - - def __eq__(self, other): - try: - return (self._ip == other._ip and - self._version == other._version) - except AttributeError: - return NotImplemented - - def __lt__(self, other): - if not isinstance(other, _IPAddressBase): - return NotImplemented - if not isinstance(other, _BaseAddress): - raise TypeError('%s and %s are not of the same type' % ( - self, other)) - if self._version != other._version: - raise TypeError('%s and %s are not of the same version' % ( - self, other)) - if self._ip != other._ip: - return self._ip < other._ip - return False - - # Shorthand for Integer addition and subtraction. This is not - # meant to ever support addition/subtraction of addresses. - def __add__(self, other): - if not isinstance(other, _compat_int_types): - return NotImplemented - return self.__class__(int(self) + other) - - def __sub__(self, other): - if not isinstance(other, _compat_int_types): - return NotImplemented - return self.__class__(int(self) - other) - - def __repr__(self): - return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) - - def __str__(self): - return _compat_str(self._string_from_ip_int(self._ip)) - - def __hash__(self): - return hash(hex(int(self._ip))) - - def _get_address_key(self): - return (self._version, self) - - def __reduce__(self): - return self.__class__, (self._ip,) - - -class _BaseNetwork(_IPAddressBase): - - """A generic IP network object. - - This IP class contains the version independent methods which are - used by networks. - - """ - def __init__(self, address): - self._cache = {} - - def __repr__(self): - return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) - - def __str__(self): - return '%s/%d' % (self.network_address, self.prefixlen) - - def hosts(self): - """Generate Iterator over usable hosts in a network. - - This is like __iter__ except it doesn't return the network - or broadcast addresses. - - """ - network = int(self.network_address) - broadcast = int(self.broadcast_address) - for x in _compat_range(network + 1, broadcast): - yield self._address_class(x) - - def __iter__(self): - network = int(self.network_address) - broadcast = int(self.broadcast_address) - for x in _compat_range(network, broadcast + 1): - yield self._address_class(x) - - def __getitem__(self, n): - network = int(self.network_address) - broadcast = int(self.broadcast_address) - if n >= 0: - if network + n > broadcast: - raise IndexError('address out of range') - return self._address_class(network + n) - else: - n += 1 - if broadcast + n < network: - raise IndexError('address out of range') - return self._address_class(broadcast + n) - - def __lt__(self, other): - if not isinstance(other, _IPAddressBase): - return NotImplemented - if not isinstance(other, _BaseNetwork): - raise TypeError('%s and %s are not of the same type' % ( - self, other)) - if self._version != other._version: - raise TypeError('%s and %s are not of the same version' % ( - self, other)) - if self.network_address != other.network_address: - return self.network_address < other.network_address - if self.netmask != other.netmask: - return self.netmask < other.netmask - return False - - def __eq__(self, other): - try: - return (self._version == other._version and - self.network_address == other.network_address and - int(self.netmask) == int(other.netmask)) - except AttributeError: - return NotImplemented - - def __hash__(self): - return hash(int(self.network_address) ^ int(self.netmask)) - - def __contains__(self, other): - # always false if one is v4 and the other is v6. - if self._version != other._version: - return False - # dealing with another network. - if isinstance(other, _BaseNetwork): - return False - # dealing with another address - else: - # address - return (int(self.network_address) <= int(other._ip) <= - int(self.broadcast_address)) - - def overlaps(self, other): - """Tell if self is partly contained in other.""" - return self.network_address in other or ( - self.broadcast_address in other or ( - other.network_address in self or ( - other.broadcast_address in self))) - - @property - def broadcast_address(self): - x = self._cache.get('broadcast_address') - if x is None: - x = self._address_class(int(self.network_address) | - int(self.hostmask)) - self._cache['broadcast_address'] = x - return x - - @property - def hostmask(self): - x = self._cache.get('hostmask') - if x is None: - x = self._address_class(int(self.netmask) ^ self._ALL_ONES) - self._cache['hostmask'] = x - return x - - @property - def with_prefixlen(self): - return '%s/%d' % (self.network_address, self._prefixlen) - - @property - def with_netmask(self): - return '%s/%s' % (self.network_address, self.netmask) - - @property - def with_hostmask(self): - return '%s/%s' % (self.network_address, self.hostmask) - - @property - def num_addresses(self): - """Number of hosts in the current subnet.""" - return int(self.broadcast_address) - int(self.network_address) + 1 - - @property - def _address_class(self): - # Returning bare address objects (rather than interfaces) allows for - # more consistent behaviour across the network address, broadcast - # address and individual host addresses. - msg = '%200s has no associated address class' % (type(self),) - raise NotImplementedError(msg) - - @property - def prefixlen(self): - return self._prefixlen - - def address_exclude(self, other): - """Remove an address from a larger block. - - For example: - - addr1 = ip_network('192.0.2.0/28') - addr2 = ip_network('192.0.2.1/32') - list(addr1.address_exclude(addr2)) = - [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'), - IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')] - - or IPv6: - - addr1 = ip_network('2001:db8::1/32') - addr2 = ip_network('2001:db8::1/128') - list(addr1.address_exclude(addr2)) = - [ip_network('2001:db8::1/128'), - ip_network('2001:db8::2/127'), - ip_network('2001:db8::4/126'), - ip_network('2001:db8::8/125'), - ... - ip_network('2001:db8:8000::/33')] - - Args: - other: An IPv4Network or IPv6Network object of the same type. - - Returns: - An iterator of the IPv(4|6)Network objects which is self - minus other. - - Raises: - TypeError: If self and other are of differing address - versions, or if other is not a network object. - ValueError: If other is not completely contained by self. - - """ - if not self._version == other._version: - raise TypeError("%s and %s are not of the same version" % ( - self, other)) - - if not isinstance(other, _BaseNetwork): - raise TypeError("%s is not a network object" % other) - - if not other.subnet_of(self): - raise ValueError('%s not contained in %s' % (other, self)) - if other == self: - return - - # Make sure we're comparing the network of other. - other = other.__class__('%s/%s' % (other.network_address, - other.prefixlen)) - - s1, s2 = self.subnets() - while s1 != other and s2 != other: - if other.subnet_of(s1): - yield s2 - s1, s2 = s1.subnets() - elif other.subnet_of(s2): - yield s1 - s1, s2 = s2.subnets() - else: - # If we got here, there's a bug somewhere. - raise AssertionError('Error performing exclusion: ' - 's1: %s s2: %s other: %s' % - (s1, s2, other)) - if s1 == other: - yield s2 - elif s2 == other: - yield s1 - else: - # If we got here, there's a bug somewhere. - raise AssertionError('Error performing exclusion: ' - 's1: %s s2: %s other: %s' % - (s1, s2, other)) - - def compare_networks(self, other): - """Compare two IP objects. - - This is only concerned about the comparison of the integer - representation of the network addresses. This means that the - host bits aren't considered at all in this method. If you want - to compare host bits, you can easily enough do a - 'HostA._ip < HostB._ip' - - Args: - other: An IP object. - - Returns: - If the IP versions of self and other are the same, returns: - - -1 if self < other: - eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25') - IPv6Network('2001:db8::1000/124') < - IPv6Network('2001:db8::2000/124') - 0 if self == other - eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24') - IPv6Network('2001:db8::1000/124') == - IPv6Network('2001:db8::1000/124') - 1 if self > other - eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25') - IPv6Network('2001:db8::2000/124') > - IPv6Network('2001:db8::1000/124') - - Raises: - TypeError if the IP versions are different. - - """ - # does this need to raise a ValueError? - if self._version != other._version: - raise TypeError('%s and %s are not of the same type' % ( - self, other)) - # self._version == other._version below here: - if self.network_address < other.network_address: - return -1 - if self.network_address > other.network_address: - return 1 - # self.network_address == other.network_address below here: - if self.netmask < other.netmask: - return -1 - if self.netmask > other.netmask: - return 1 - return 0 - - def _get_networks_key(self): - """Network-only key function. - - Returns an object that identifies this address' network and - netmask. This function is a suitable "key" argument for sorted() - and list.sort(). - - """ - return (self._version, self.network_address, self.netmask) - - def subnets(self, prefixlen_diff=1, new_prefix=None): - """The subnets which join to make the current subnet. - - In the case that self contains only one IP - (self._prefixlen == 32 for IPv4 or self._prefixlen == 128 - for IPv6), yield an iterator with just ourself. - - Args: - prefixlen_diff: An integer, the amount the prefix length - should be increased by. This should not be set if - new_prefix is also set. - new_prefix: The desired new prefix length. This must be a - larger number (smaller prefix) than the existing prefix. - This should not be set if prefixlen_diff is also set. - - Returns: - An iterator of IPv(4|6) objects. - - Raises: - ValueError: The prefixlen_diff is too small or too large. - OR - prefixlen_diff and new_prefix are both set or new_prefix - is a smaller number than the current prefix (smaller - number means a larger network) - - """ - if self._prefixlen == self._max_prefixlen: - yield self - return - - if new_prefix is not None: - if new_prefix < self._prefixlen: - raise ValueError('new prefix must be longer') - if prefixlen_diff != 1: - raise ValueError('cannot set prefixlen_diff and new_prefix') - prefixlen_diff = new_prefix - self._prefixlen - - if prefixlen_diff < 0: - raise ValueError('prefix length diff must be > 0') - new_prefixlen = self._prefixlen + prefixlen_diff - - if new_prefixlen > self._max_prefixlen: - raise ValueError( - 'prefix length diff %d is invalid for netblock %s' % ( - new_prefixlen, self)) - - start = int(self.network_address) - end = int(self.broadcast_address) + 1 - step = (int(self.hostmask) + 1) >> prefixlen_diff - for new_addr in _compat_range(start, end, step): - current = self.__class__((new_addr, new_prefixlen)) - yield current - - def supernet(self, prefixlen_diff=1, new_prefix=None): - """The supernet containing the current network. - - Args: - prefixlen_diff: An integer, the amount the prefix length of - the network should be decreased by. For example, given a - /24 network and a prefixlen_diff of 3, a supernet with a - /21 netmask is returned. - - Returns: - An IPv4 network object. - - Raises: - ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have - a negative prefix length. - OR - If prefixlen_diff and new_prefix are both set or new_prefix is a - larger number than the current prefix (larger number means a - smaller network) - - """ - if self._prefixlen == 0: - return self - - if new_prefix is not None: - if new_prefix > self._prefixlen: - raise ValueError('new prefix must be shorter') - if prefixlen_diff != 1: - raise ValueError('cannot set prefixlen_diff and new_prefix') - prefixlen_diff = self._prefixlen - new_prefix - - new_prefixlen = self.prefixlen - prefixlen_diff - if new_prefixlen < 0: - raise ValueError( - 'current prefixlen is %d, cannot have a prefixlen_diff of %d' % - (self.prefixlen, prefixlen_diff)) - return self.__class__(( - int(self.network_address) & (int(self.netmask) << prefixlen_diff), - new_prefixlen)) - - @property - def is_multicast(self): - """Test if the address is reserved for multicast use. - - Returns: - A boolean, True if the address is a multicast address. - See RFC 2373 2.7 for details. - - """ - return (self.network_address.is_multicast and - self.broadcast_address.is_multicast) - - @staticmethod - def _is_subnet_of(a, b): - try: - # Always false if one is v4 and the other is v6. - if a._version != b._version: - raise TypeError("%s and %s are not of the same version" (a, b)) - return (b.network_address <= a.network_address and - b.broadcast_address >= a.broadcast_address) - except AttributeError: - raise TypeError("Unable to test subnet containment " - "between %s and %s" % (a, b)) - - def subnet_of(self, other): - """Return True if this network is a subnet of other.""" - return self._is_subnet_of(self, other) - - def supernet_of(self, other): - """Return True if this network is a supernet of other.""" - return self._is_subnet_of(other, self) - - @property - def is_reserved(self): - """Test if the address is otherwise IETF reserved. - - Returns: - A boolean, True if the address is within one of the - reserved IPv6 Network ranges. - - """ - return (self.network_address.is_reserved and - self.broadcast_address.is_reserved) - - @property - def is_link_local(self): - """Test if the address is reserved for link-local. - - Returns: - A boolean, True if the address is reserved per RFC 4291. - - """ - return (self.network_address.is_link_local and - self.broadcast_address.is_link_local) - - @property - def is_private(self): - """Test if this address is allocated for private networks. - - Returns: - A boolean, True if the address is reserved per - iana-ipv4-special-registry or iana-ipv6-special-registry. - - """ - return (self.network_address.is_private and - self.broadcast_address.is_private) - - @property - def is_global(self): - """Test if this address is allocated for public networks. - - Returns: - A boolean, True if the address is not reserved per - iana-ipv4-special-registry or iana-ipv6-special-registry. - - """ - return not self.is_private - - @property - def is_unspecified(self): - """Test if the address is unspecified. - - Returns: - A boolean, True if this is the unspecified address as defined in - RFC 2373 2.5.2. - - """ - return (self.network_address.is_unspecified and - self.broadcast_address.is_unspecified) - - @property - def is_loopback(self): - """Test if the address is a loopback address. - - Returns: - A boolean, True if the address is a loopback address as defined in - RFC 2373 2.5.3. - - """ - return (self.network_address.is_loopback and - self.broadcast_address.is_loopback) - - -class _BaseV4(object): - - """Base IPv4 object. - - The following methods are used by IPv4 objects in both single IP - addresses and networks. - - """ - - __slots__ = () - _version = 4 - # Equivalent to 255.255.255.255 or 32 bits of 1's. - _ALL_ONES = (2 ** IPV4LENGTH) - 1 - _DECIMAL_DIGITS = frozenset('0123456789') - - # the valid octets for host and netmasks. only useful for IPv4. - _valid_mask_octets = frozenset([255, 254, 252, 248, 240, 224, 192, 128, 0]) - - _max_prefixlen = IPV4LENGTH - # There are only a handful of valid v4 netmasks, so we cache them all - # when constructed (see _make_netmask()). - _netmask_cache = {} - - def _explode_shorthand_ip_string(self): - return _compat_str(self) - - @classmethod - def _make_netmask(cls, arg): - """Make a (netmask, prefix_len) tuple from the given argument. - - Argument can be: - - an integer (the prefix length) - - a string representing the prefix length (e.g. "24") - - a string representing the prefix netmask (e.g. "255.255.255.0") - """ - if arg not in cls._netmask_cache: - if isinstance(arg, _compat_int_types): - prefixlen = arg - else: - try: - # Check for a netmask in prefix length form - prefixlen = cls._prefix_from_prefix_string(arg) - except NetmaskValueError: - # Check for a netmask or hostmask in dotted-quad form. - # This may raise NetmaskValueError. - prefixlen = cls._prefix_from_ip_string(arg) - netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen)) - cls._netmask_cache[arg] = netmask, prefixlen - return cls._netmask_cache[arg] - - @classmethod - def _ip_int_from_string(cls, ip_str): - """Turn the given IP string into an integer for comparison. - - Args: - ip_str: A string, the IP ip_str. - - Returns: - The IP ip_str as an integer. - - Raises: - AddressValueError: if ip_str isn't a valid IPv4 Address. - - """ - if not ip_str: - raise AddressValueError('Address cannot be empty') - - octets = ip_str.split('.') - if len(octets) != 4: - raise AddressValueError("Expected 4 octets in %r" % ip_str) - - try: - return _compat_int_from_byte_vals( - map(cls._parse_octet, octets), 'big') - except ValueError as exc: - raise AddressValueError("%s in %r" % (exc, ip_str)) - - @classmethod - def _parse_octet(cls, octet_str): - """Convert a decimal octet into an integer. - - Args: - octet_str: A string, the number to parse. - - Returns: - The octet as an integer. - - Raises: - ValueError: if the octet isn't strictly a decimal from [0..255]. - - """ - if not octet_str: - raise ValueError("Empty octet not permitted") - # Whitelist the characters, since int() allows a lot of bizarre stuff. - if not cls._DECIMAL_DIGITS.issuperset(octet_str): - msg = "Only decimal digits permitted in %r" - raise ValueError(msg % octet_str) - # We do the length check second, since the invalid character error - # is likely to be more informative for the user - if len(octet_str) > 3: - msg = "At most 3 characters permitted in %r" - raise ValueError(msg % octet_str) - # Convert to integer (we know digits are legal) - octet_int = int(octet_str, 10) - # Any octets that look like they *might* be written in octal, - # and which don't look exactly the same in both octal and - # decimal are rejected as ambiguous - if octet_int > 7 and octet_str[0] == '0': - msg = "Ambiguous (octal/decimal) value in %r not permitted" - raise ValueError(msg % octet_str) - if octet_int > 255: - raise ValueError("Octet %d (> 255) not permitted" % octet_int) - return octet_int - - @classmethod - def _string_from_ip_int(cls, ip_int): - """Turns a 32-bit integer into dotted decimal notation. - - Args: - ip_int: An integer, the IP address. - - Returns: - The IP address as a string in dotted decimal notation. - - """ - return '.'.join(_compat_str(struct.unpack(b'!B', b)[0] - if isinstance(b, bytes) - else b) - for b in _compat_to_bytes(ip_int, 4, 'big')) - - def _is_hostmask(self, ip_str): - """Test if the IP string is a hostmask (rather than a netmask). - - Args: - ip_str: A string, the potential hostmask. - - Returns: - A boolean, True if the IP string is a hostmask. - - """ - bits = ip_str.split('.') - try: - parts = [x for x in map(int, bits) if x in self._valid_mask_octets] - except ValueError: - return False - if len(parts) != len(bits): - return False - if parts[0] < parts[-1]: - return True - return False - - def _reverse_pointer(self): - """Return the reverse DNS pointer name for the IPv4 address. - - This implements the method described in RFC1035 3.5. - - """ - reverse_octets = _compat_str(self).split('.')[::-1] - return '.'.join(reverse_octets) + '.in-addr.arpa' - - @property - def max_prefixlen(self): - return self._max_prefixlen - - @property - def version(self): - return self._version - - -class IPv4Address(_BaseV4, _BaseAddress): - - """Represent and manipulate single IPv4 Addresses.""" - - __slots__ = ('_ip', '__weakref__') - - def __init__(self, address): - - """ - Args: - address: A string or integer representing the IP - - Additionally, an integer can be passed, so - IPv4Address('192.0.2.1') == IPv4Address(3221225985). - or, more generally - IPv4Address(int(IPv4Address('192.0.2.1'))) == - IPv4Address('192.0.2.1') - - Raises: - AddressValueError: If ipaddress isn't a valid IPv4 address. - - """ - # Efficient constructor from integer. - if isinstance(address, _compat_int_types): - self._check_int_address(address) - self._ip = address - return - - # Constructing from a packed address - if isinstance(address, bytes): - self._check_packed_address(address, 4) - bvs = _compat_bytes_to_byte_vals(address) - self._ip = _compat_int_from_byte_vals(bvs, 'big') - return - - # Assume input argument to be string or any object representation - # which converts into a formatted IP string. - addr_str = _compat_str(address) - if '/' in addr_str: - raise AddressValueError("Unexpected '/' in %r" % address) - self._ip = self._ip_int_from_string(addr_str) - - @property - def packed(self): - """The binary representation of this address.""" - return v4_int_to_packed(self._ip) - - @property - def is_reserved(self): - """Test if the address is otherwise IETF reserved. - - Returns: - A boolean, True if the address is within the - reserved IPv4 Network range. - - """ - return self in self._constants._reserved_network - - @property - def is_private(self): - """Test if this address is allocated for private networks. - - Returns: - A boolean, True if the address is reserved per - iana-ipv4-special-registry. - - """ - return any(self in net for net in self._constants._private_networks) - - @property - def is_global(self): - return ( - self not in self._constants._public_network and - not self.is_private) - - @property - def is_multicast(self): - """Test if the address is reserved for multicast use. - - Returns: - A boolean, True if the address is multicast. - See RFC 3171 for details. - - """ - return self in self._constants._multicast_network - - @property - def is_unspecified(self): - """Test if the address is unspecified. - - Returns: - A boolean, True if this is the unspecified address as defined in - RFC 5735 3. - - """ - return self == self._constants._unspecified_address - - @property - def is_loopback(self): - """Test if the address is a loopback address. - - Returns: - A boolean, True if the address is a loopback per RFC 3330. - - """ - return self in self._constants._loopback_network - - @property - def is_link_local(self): - """Test if the address is reserved for link-local. - - Returns: - A boolean, True if the address is link-local per RFC 3927. - - """ - return self in self._constants._linklocal_network - - -class IPv4Interface(IPv4Address): - - def __init__(self, address): - if isinstance(address, (bytes, _compat_int_types)): - IPv4Address.__init__(self, address) - self.network = IPv4Network(self._ip) - self._prefixlen = self._max_prefixlen - return - - if isinstance(address, tuple): - IPv4Address.__init__(self, address[0]) - if len(address) > 1: - self._prefixlen = int(address[1]) - else: - self._prefixlen = self._max_prefixlen - - self.network = IPv4Network(address, strict=False) - self.netmask = self.network.netmask - self.hostmask = self.network.hostmask - return - - addr = _split_optional_netmask(address) - IPv4Address.__init__(self, addr[0]) - - self.network = IPv4Network(address, strict=False) - self._prefixlen = self.network._prefixlen - - self.netmask = self.network.netmask - self.hostmask = self.network.hostmask - - def __str__(self): - return '%s/%d' % (self._string_from_ip_int(self._ip), - self.network.prefixlen) - - def __eq__(self, other): - address_equal = IPv4Address.__eq__(self, other) - if not address_equal or address_equal is NotImplemented: - return address_equal - try: - return self.network == other.network - except AttributeError: - # An interface with an associated network is NOT the - # same as an unassociated address. That's why the hash - # takes the extra info into account. - return False - - def __lt__(self, other): - address_less = IPv4Address.__lt__(self, other) - if address_less is NotImplemented: - return NotImplemented - try: - return (self.network < other.network or - self.network == other.network and address_less) - except AttributeError: - # We *do* allow addresses and interfaces to be sorted. The - # unassociated address is considered less than all interfaces. - return False - - def __hash__(self): - return self._ip ^ self._prefixlen ^ int(self.network.network_address) - - __reduce__ = _IPAddressBase.__reduce__ - - @property - def ip(self): - return IPv4Address(self._ip) - - @property - def with_prefixlen(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self._prefixlen) - - @property - def with_netmask(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self.netmask) - - @property - def with_hostmask(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self.hostmask) - - -class IPv4Network(_BaseV4, _BaseNetwork): - - """This class represents and manipulates 32-bit IPv4 network + addresses.. - - Attributes: [examples for IPv4Network('192.0.2.0/27')] - .network_address: IPv4Address('192.0.2.0') - .hostmask: IPv4Address('0.0.0.31') - .broadcast_address: IPv4Address('192.0.2.32') - .netmask: IPv4Address('255.255.255.224') - .prefixlen: 27 - - """ - # Class to use when creating address objects - _address_class = IPv4Address - - def __init__(self, address, strict=True): - - """Instantiate a new IPv4 network object. - - Args: - address: A string or integer representing the IP [& network]. - '192.0.2.0/24' - '192.0.2.0/255.255.255.0' - '192.0.0.2/0.0.0.255' - are all functionally the same in IPv4. Similarly, - '192.0.2.1' - '192.0.2.1/255.255.255.255' - '192.0.2.1/32' - are also functionally equivalent. That is to say, failing to - provide a subnetmask will create an object with a mask of /32. - - If the mask (portion after the / in the argument) is given in - dotted quad form, it is treated as a netmask if it starts with a - non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it - starts with a zero field (e.g. 0.255.255.255 == /8), with the - single exception of an all-zero mask which is treated as a - netmask == /0. If no mask is given, a default of /32 is used. - - Additionally, an integer can be passed, so - IPv4Network('192.0.2.1') == IPv4Network(3221225985) - or, more generally - IPv4Interface(int(IPv4Interface('192.0.2.1'))) == - IPv4Interface('192.0.2.1') - - Raises: - AddressValueError: If ipaddress isn't a valid IPv4 address. - NetmaskValueError: If the netmask isn't valid for - an IPv4 address. - ValueError: If strict is True and a network address is not - supplied. - - """ - _BaseNetwork.__init__(self, address) - - # Constructing from a packed address or integer - if isinstance(address, (_compat_int_types, bytes)): - self.network_address = IPv4Address(address) - self.netmask, self._prefixlen = self._make_netmask( - self._max_prefixlen) - # fixme: address/network test here. - return - - if isinstance(address, tuple): - if len(address) > 1: - arg = address[1] - else: - # We weren't given an address[1] - arg = self._max_prefixlen - self.network_address = IPv4Address(address[0]) - self.netmask, self._prefixlen = self._make_netmask(arg) - packed = int(self.network_address) - if packed & int(self.netmask) != packed: - if strict: - raise ValueError('%s has host bits set' % self) - else: - self.network_address = IPv4Address(packed & - int(self.netmask)) - return - - # Assume input argument to be string or any object representation - # which converts into a formatted IP prefix string. - addr = _split_optional_netmask(address) - self.network_address = IPv4Address(self._ip_int_from_string(addr[0])) - - if len(addr) == 2: - arg = addr[1] - else: - arg = self._max_prefixlen - self.netmask, self._prefixlen = self._make_netmask(arg) - - if strict: - if (IPv4Address(int(self.network_address) & int(self.netmask)) != - self.network_address): - raise ValueError('%s has host bits set' % self) - self.network_address = IPv4Address(int(self.network_address) & - int(self.netmask)) - - if self._prefixlen == (self._max_prefixlen - 1): - self.hosts = self.__iter__ - - @property - def is_global(self): - """Test if this address is allocated for public networks. - - Returns: - A boolean, True if the address is not reserved per - iana-ipv4-special-registry. - - """ - return (not (self.network_address in IPv4Network('100.64.0.0/10') and - self.broadcast_address in IPv4Network('100.64.0.0/10')) and - not self.is_private) - - -class _IPv4Constants(object): - - _linklocal_network = IPv4Network('169.254.0.0/16') - - _loopback_network = IPv4Network('127.0.0.0/8') - - _multicast_network = IPv4Network('224.0.0.0/4') - - _public_network = IPv4Network('100.64.0.0/10') - - _private_networks = [ - IPv4Network('0.0.0.0/8'), - IPv4Network('10.0.0.0/8'), - IPv4Network('127.0.0.0/8'), - IPv4Network('169.254.0.0/16'), - IPv4Network('172.16.0.0/12'), - IPv4Network('192.0.0.0/29'), - IPv4Network('192.0.0.170/31'), - IPv4Network('192.0.2.0/24'), - IPv4Network('192.168.0.0/16'), - IPv4Network('198.18.0.0/15'), - IPv4Network('198.51.100.0/24'), - IPv4Network('203.0.113.0/24'), - IPv4Network('240.0.0.0/4'), - IPv4Network('255.255.255.255/32'), - ] - - _reserved_network = IPv4Network('240.0.0.0/4') - - _unspecified_address = IPv4Address('0.0.0.0') - - -IPv4Address._constants = _IPv4Constants - - -class _BaseV6(object): - - """Base IPv6 object. - - The following methods are used by IPv6 objects in both single IP - addresses and networks. - - """ - - __slots__ = () - _version = 6 - _ALL_ONES = (2 ** IPV6LENGTH) - 1 - _HEXTET_COUNT = 8 - _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef') - _max_prefixlen = IPV6LENGTH - - # There are only a bunch of valid v6 netmasks, so we cache them all - # when constructed (see _make_netmask()). - _netmask_cache = {} - - @classmethod - def _make_netmask(cls, arg): - """Make a (netmask, prefix_len) tuple from the given argument. - - Argument can be: - - an integer (the prefix length) - - a string representing the prefix length (e.g. "24") - - a string representing the prefix netmask (e.g. "255.255.255.0") - """ - if arg not in cls._netmask_cache: - if isinstance(arg, _compat_int_types): - prefixlen = arg - else: - prefixlen = cls._prefix_from_prefix_string(arg) - netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen)) - cls._netmask_cache[arg] = netmask, prefixlen - return cls._netmask_cache[arg] - - @classmethod - def _ip_int_from_string(cls, ip_str): - """Turn an IPv6 ip_str into an integer. - - Args: - ip_str: A string, the IPv6 ip_str. - - Returns: - An int, the IPv6 address - - Raises: - AddressValueError: if ip_str isn't a valid IPv6 Address. - - """ - if not ip_str: - raise AddressValueError('Address cannot be empty') - - parts = ip_str.split(':') - - # An IPv6 address needs at least 2 colons (3 parts). - _min_parts = 3 - if len(parts) < _min_parts: - msg = "At least %d parts expected in %r" % (_min_parts, ip_str) - raise AddressValueError(msg) - - # If the address has an IPv4-style suffix, convert it to hexadecimal. - if '.' in parts[-1]: - try: - ipv4_int = IPv4Address(parts.pop())._ip - except AddressValueError as exc: - raise AddressValueError("%s in %r" % (exc, ip_str)) - parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF)) - parts.append('%x' % (ipv4_int & 0xFFFF)) - - # An IPv6 address can't have more than 8 colons (9 parts). - # The extra colon comes from using the "::" notation for a single - # leading or trailing zero part. - _max_parts = cls._HEXTET_COUNT + 1 - if len(parts) > _max_parts: - msg = "At most %d colons permitted in %r" % ( - _max_parts - 1, ip_str) - raise AddressValueError(msg) - - # Disregarding the endpoints, find '::' with nothing in between. - # This indicates that a run of zeroes has been skipped. - skip_index = None - for i in _compat_range(1, len(parts) - 1): - if not parts[i]: - if skip_index is not None: - # Can't have more than one '::' - msg = "At most one '::' permitted in %r" % ip_str - raise AddressValueError(msg) - skip_index = i - - # parts_hi is the number of parts to copy from above/before the '::' - # parts_lo is the number of parts to copy from below/after the '::' - if skip_index is not None: - # If we found a '::', then check if it also covers the endpoints. - parts_hi = skip_index - parts_lo = len(parts) - skip_index - 1 - if not parts[0]: - parts_hi -= 1 - if parts_hi: - msg = "Leading ':' only permitted as part of '::' in %r" - raise AddressValueError(msg % ip_str) # ^: requires ^:: - if not parts[-1]: - parts_lo -= 1 - if parts_lo: - msg = "Trailing ':' only permitted as part of '::' in %r" - raise AddressValueError(msg % ip_str) # :$ requires ::$ - parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo) - if parts_skipped < 1: - msg = "Expected at most %d other parts with '::' in %r" - raise AddressValueError(msg % (cls._HEXTET_COUNT - 1, ip_str)) - else: - # Otherwise, allocate the entire address to parts_hi. The - # endpoints could still be empty, but _parse_hextet() will check - # for that. - if len(parts) != cls._HEXTET_COUNT: - msg = "Exactly %d parts expected without '::' in %r" - raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str)) - if not parts[0]: - msg = "Leading ':' only permitted as part of '::' in %r" - raise AddressValueError(msg % ip_str) # ^: requires ^:: - if not parts[-1]: - msg = "Trailing ':' only permitted as part of '::' in %r" - raise AddressValueError(msg % ip_str) # :$ requires ::$ - parts_hi = len(parts) - parts_lo = 0 - parts_skipped = 0 - - try: - # Now, parse the hextets into a 128-bit integer. - ip_int = 0 - for i in range(parts_hi): - ip_int <<= 16 - ip_int |= cls._parse_hextet(parts[i]) - ip_int <<= 16 * parts_skipped - for i in range(-parts_lo, 0): - ip_int <<= 16 - ip_int |= cls._parse_hextet(parts[i]) - return ip_int - except ValueError as exc: - raise AddressValueError("%s in %r" % (exc, ip_str)) - - @classmethod - def _parse_hextet(cls, hextet_str): - """Convert an IPv6 hextet string into an integer. - - Args: - hextet_str: A string, the number to parse. - - Returns: - The hextet as an integer. - - Raises: - ValueError: if the input isn't strictly a hex number from - [0..FFFF]. - - """ - # Whitelist the characters, since int() allows a lot of bizarre stuff. - if not cls._HEX_DIGITS.issuperset(hextet_str): - raise ValueError("Only hex digits permitted in %r" % hextet_str) - # We do the length check second, since the invalid character error - # is likely to be more informative for the user - if len(hextet_str) > 4: - msg = "At most 4 characters permitted in %r" - raise ValueError(msg % hextet_str) - # Length check means we can skip checking the integer value - return int(hextet_str, 16) - - @classmethod - def _compress_hextets(cls, hextets): - """Compresses a list of hextets. - - Compresses a list of strings, replacing the longest continuous - sequence of "0" in the list with "" and adding empty strings at - the beginning or at the end of the string such that subsequently - calling ":".join(hextets) will produce the compressed version of - the IPv6 address. - - Args: - hextets: A list of strings, the hextets to compress. - - Returns: - A list of strings. - - """ - best_doublecolon_start = -1 - best_doublecolon_len = 0 - doublecolon_start = -1 - doublecolon_len = 0 - for index, hextet in enumerate(hextets): - if hextet == '0': - doublecolon_len += 1 - if doublecolon_start == -1: - # Start of a sequence of zeros. - doublecolon_start = index - if doublecolon_len > best_doublecolon_len: - # This is the longest sequence of zeros so far. - best_doublecolon_len = doublecolon_len - best_doublecolon_start = doublecolon_start - else: - doublecolon_len = 0 - doublecolon_start = -1 - - if best_doublecolon_len > 1: - best_doublecolon_end = (best_doublecolon_start + - best_doublecolon_len) - # For zeros at the end of the address. - if best_doublecolon_end == len(hextets): - hextets += [''] - hextets[best_doublecolon_start:best_doublecolon_end] = [''] - # For zeros at the beginning of the address. - if best_doublecolon_start == 0: - hextets = [''] + hextets - - return hextets - - @classmethod - def _string_from_ip_int(cls, ip_int=None): - """Turns a 128-bit integer into hexadecimal notation. - - Args: - ip_int: An integer, the IP address. - - Returns: - A string, the hexadecimal representation of the address. - - Raises: - ValueError: The address is bigger than 128 bits of all ones. - - """ - if ip_int is None: - ip_int = int(cls._ip) - - if ip_int > cls._ALL_ONES: - raise ValueError('IPv6 address is too large') - - hex_str = '%032x' % ip_int - hextets = ['%x' % int(hex_str[x:x + 4], 16) for x in range(0, 32, 4)] - - hextets = cls._compress_hextets(hextets) - return ':'.join(hextets) - - def _explode_shorthand_ip_string(self): - """Expand a shortened IPv6 address. - - Args: - ip_str: A string, the IPv6 address. - - Returns: - A string, the expanded IPv6 address. - - """ - if isinstance(self, IPv6Network): - ip_str = _compat_str(self.network_address) - elif isinstance(self, IPv6Interface): - ip_str = _compat_str(self.ip) - else: - ip_str = _compat_str(self) - - ip_int = self._ip_int_from_string(ip_str) - hex_str = '%032x' % ip_int - parts = [hex_str[x:x + 4] for x in range(0, 32, 4)] - if isinstance(self, (_BaseNetwork, IPv6Interface)): - return '%s/%d' % (':'.join(parts), self._prefixlen) - return ':'.join(parts) - - def _reverse_pointer(self): - """Return the reverse DNS pointer name for the IPv6 address. - - This implements the method described in RFC3596 2.5. - - """ - reverse_chars = self.exploded[::-1].replace(':', '') - return '.'.join(reverse_chars) + '.ip6.arpa' - - @property - def max_prefixlen(self): - return self._max_prefixlen - - @property - def version(self): - return self._version - - -class IPv6Address(_BaseV6, _BaseAddress): - - """Represent and manipulate single IPv6 Addresses.""" - - __slots__ = ('_ip', '__weakref__') - - def __init__(self, address): - """Instantiate a new IPv6 address object. - - Args: - address: A string or integer representing the IP - - Additionally, an integer can be passed, so - IPv6Address('2001:db8::') == - IPv6Address(42540766411282592856903984951653826560) - or, more generally - IPv6Address(int(IPv6Address('2001:db8::'))) == - IPv6Address('2001:db8::') - - Raises: - AddressValueError: If address isn't a valid IPv6 address. - - """ - # Efficient constructor from integer. - if isinstance(address, _compat_int_types): - self._check_int_address(address) - self._ip = address - return - - # Constructing from a packed address - if isinstance(address, bytes): - self._check_packed_address(address, 16) - bvs = _compat_bytes_to_byte_vals(address) - self._ip = _compat_int_from_byte_vals(bvs, 'big') - return - - # Assume input argument to be string or any object representation - # which converts into a formatted IP string. - addr_str = _compat_str(address) - if '/' in addr_str: - raise AddressValueError("Unexpected '/' in %r" % address) - self._ip = self._ip_int_from_string(addr_str) - - @property - def packed(self): - """The binary representation of this address.""" - return v6_int_to_packed(self._ip) - - @property - def is_multicast(self): - """Test if the address is reserved for multicast use. - - Returns: - A boolean, True if the address is a multicast address. - See RFC 2373 2.7 for details. - - """ - return self in self._constants._multicast_network - - @property - def is_reserved(self): - """Test if the address is otherwise IETF reserved. - - Returns: - A boolean, True if the address is within one of the - reserved IPv6 Network ranges. - - """ - return any(self in x for x in self._constants._reserved_networks) - - @property - def is_link_local(self): - """Test if the address is reserved for link-local. - - Returns: - A boolean, True if the address is reserved per RFC 4291. - - """ - return self in self._constants._linklocal_network - - @property - def is_site_local(self): - """Test if the address is reserved for site-local. - - Note that the site-local address space has been deprecated by RFC 3879. - Use is_private to test if this address is in the space of unique local - addresses as defined by RFC 4193. - - Returns: - A boolean, True if the address is reserved per RFC 3513 2.5.6. - - """ - return self in self._constants._sitelocal_network - - @property - def is_private(self): - """Test if this address is allocated for private networks. - - Returns: - A boolean, True if the address is reserved per - iana-ipv6-special-registry. - - """ - return any(self in net for net in self._constants._private_networks) - - @property - def is_global(self): - """Test if this address is allocated for public networks. - - Returns: - A boolean, true if the address is not reserved per - iana-ipv6-special-registry. - - """ - return not self.is_private - - @property - def is_unspecified(self): - """Test if the address is unspecified. - - Returns: - A boolean, True if this is the unspecified address as defined in - RFC 2373 2.5.2. - - """ - return self._ip == 0 - - @property - def is_loopback(self): - """Test if the address is a loopback address. - - Returns: - A boolean, True if the address is a loopback address as defined in - RFC 2373 2.5.3. - - """ - return self._ip == 1 - - @property - def ipv4_mapped(self): - """Return the IPv4 mapped address. - - Returns: - If the IPv6 address is a v4 mapped address, return the - IPv4 mapped address. Return None otherwise. - - """ - if (self._ip >> 32) != 0xFFFF: - return None - return IPv4Address(self._ip & 0xFFFFFFFF) - - @property - def teredo(self): - """Tuple of embedded teredo IPs. - - Returns: - Tuple of the (server, client) IPs or None if the address - doesn't appear to be a teredo address (doesn't start with - 2001::/32) - - """ - if (self._ip >> 96) != 0x20010000: - return None - return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF), - IPv4Address(~self._ip & 0xFFFFFFFF)) - - @property - def sixtofour(self): - """Return the IPv4 6to4 embedded address. - - Returns: - The IPv4 6to4-embedded address if present or None if the - address doesn't appear to contain a 6to4 embedded address. - - """ - if (self._ip >> 112) != 0x2002: - return None - return IPv4Address((self._ip >> 80) & 0xFFFFFFFF) - - -class IPv6Interface(IPv6Address): - - def __init__(self, address): - if isinstance(address, (bytes, _compat_int_types)): - IPv6Address.__init__(self, address) - self.network = IPv6Network(self._ip) - self._prefixlen = self._max_prefixlen - return - if isinstance(address, tuple): - IPv6Address.__init__(self, address[0]) - if len(address) > 1: - self._prefixlen = int(address[1]) - else: - self._prefixlen = self._max_prefixlen - self.network = IPv6Network(address, strict=False) - self.netmask = self.network.netmask - self.hostmask = self.network.hostmask - return - - addr = _split_optional_netmask(address) - IPv6Address.__init__(self, addr[0]) - self.network = IPv6Network(address, strict=False) - self.netmask = self.network.netmask - self._prefixlen = self.network._prefixlen - self.hostmask = self.network.hostmask - - def __str__(self): - return '%s/%d' % (self._string_from_ip_int(self._ip), - self.network.prefixlen) - - def __eq__(self, other): - address_equal = IPv6Address.__eq__(self, other) - if not address_equal or address_equal is NotImplemented: - return address_equal - try: - return self.network == other.network - except AttributeError: - # An interface with an associated network is NOT the - # same as an unassociated address. That's why the hash - # takes the extra info into account. - return False - - def __lt__(self, other): - address_less = IPv6Address.__lt__(self, other) - if address_less is NotImplemented: - return NotImplemented - try: - return (self.network < other.network or - self.network == other.network and address_less) - except AttributeError: - # We *do* allow addresses and interfaces to be sorted. The - # unassociated address is considered less than all interfaces. - return False - - def __hash__(self): - return self._ip ^ self._prefixlen ^ int(self.network.network_address) - - __reduce__ = _IPAddressBase.__reduce__ - - @property - def ip(self): - return IPv6Address(self._ip) - - @property - def with_prefixlen(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self._prefixlen) - - @property - def with_netmask(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self.netmask) - - @property - def with_hostmask(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self.hostmask) - - @property - def is_unspecified(self): - return self._ip == 0 and self.network.is_unspecified - - @property - def is_loopback(self): - return self._ip == 1 and self.network.is_loopback - - -class IPv6Network(_BaseV6, _BaseNetwork): - - """This class represents and manipulates 128-bit IPv6 networks. - - Attributes: [examples for IPv6('2001:db8::1000/124')] - .network_address: IPv6Address('2001:db8::1000') - .hostmask: IPv6Address('::f') - .broadcast_address: IPv6Address('2001:db8::100f') - .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0') - .prefixlen: 124 - - """ - - # Class to use when creating address objects - _address_class = IPv6Address - - def __init__(self, address, strict=True): - """Instantiate a new IPv6 Network object. - - Args: - address: A string or integer representing the IPv6 network or the - IP and prefix/netmask. - '2001:db8::/128' - '2001:db8:0000:0000:0000:0000:0000:0000/128' - '2001:db8::' - are all functionally the same in IPv6. That is to say, - failing to provide a subnetmask will create an object with - a mask of /128. - - Additionally, an integer can be passed, so - IPv6Network('2001:db8::') == - IPv6Network(42540766411282592856903984951653826560) - or, more generally - IPv6Network(int(IPv6Network('2001:db8::'))) == - IPv6Network('2001:db8::') - - strict: A boolean. If true, ensure that we have been passed - A true network address, eg, 2001:db8::1000/124 and not an - IP address on a network, eg, 2001:db8::1/124. - - Raises: - AddressValueError: If address isn't a valid IPv6 address. - NetmaskValueError: If the netmask isn't valid for - an IPv6 address. - ValueError: If strict was True and a network address was not - supplied. - - """ - _BaseNetwork.__init__(self, address) - - # Efficient constructor from integer or packed address - if isinstance(address, (bytes, _compat_int_types)): - self.network_address = IPv6Address(address) - self.netmask, self._prefixlen = self._make_netmask( - self._max_prefixlen) - return - - if isinstance(address, tuple): - if len(address) > 1: - arg = address[1] - else: - arg = self._max_prefixlen - self.netmask, self._prefixlen = self._make_netmask(arg) - self.network_address = IPv6Address(address[0]) - packed = int(self.network_address) - if packed & int(self.netmask) != packed: - if strict: - raise ValueError('%s has host bits set' % self) - else: - self.network_address = IPv6Address(packed & - int(self.netmask)) - return - - # Assume input argument to be string or any object representation - # which converts into a formatted IP prefix string. - addr = _split_optional_netmask(address) - - self.network_address = IPv6Address(self._ip_int_from_string(addr[0])) - - if len(addr) == 2: - arg = addr[1] - else: - arg = self._max_prefixlen - self.netmask, self._prefixlen = self._make_netmask(arg) - - if strict: - if (IPv6Address(int(self.network_address) & int(self.netmask)) != - self.network_address): - raise ValueError('%s has host bits set' % self) - self.network_address = IPv6Address(int(self.network_address) & - int(self.netmask)) - - if self._prefixlen == (self._max_prefixlen - 1): - self.hosts = self.__iter__ - - def hosts(self): - """Generate Iterator over usable hosts in a network. - - This is like __iter__ except it doesn't return the - Subnet-Router anycast address. - - """ - network = int(self.network_address) - broadcast = int(self.broadcast_address) - for x in _compat_range(network + 1, broadcast + 1): - yield self._address_class(x) - - @property - def is_site_local(self): - """Test if the address is reserved for site-local. - - Note that the site-local address space has been deprecated by RFC 3879. - Use is_private to test if this address is in the space of unique local - addresses as defined by RFC 4193. - - Returns: - A boolean, True if the address is reserved per RFC 3513 2.5.6. - - """ - return (self.network_address.is_site_local and - self.broadcast_address.is_site_local) - - -class _IPv6Constants(object): - - _linklocal_network = IPv6Network('fe80::/10') - - _multicast_network = IPv6Network('ff00::/8') - - _private_networks = [ - IPv6Network('::1/128'), - IPv6Network('::/128'), - IPv6Network('::ffff:0:0/96'), - IPv6Network('100::/64'), - IPv6Network('2001::/23'), - IPv6Network('2001:2::/48'), - IPv6Network('2001:db8::/32'), - IPv6Network('2001:10::/28'), - IPv6Network('fc00::/7'), - IPv6Network('fe80::/10'), - ] - - _reserved_networks = [ - IPv6Network('::/8'), IPv6Network('100::/8'), - IPv6Network('200::/7'), IPv6Network('400::/6'), - IPv6Network('800::/5'), IPv6Network('1000::/4'), - IPv6Network('4000::/3'), IPv6Network('6000::/3'), - IPv6Network('8000::/3'), IPv6Network('A000::/3'), - IPv6Network('C000::/3'), IPv6Network('E000::/4'), - IPv6Network('F000::/5'), IPv6Network('F800::/6'), - IPv6Network('FE00::/9'), - ] - - _sitelocal_network = IPv6Network('fec0::/10') - - -IPv6Address._constants = _IPv6Constants diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__init__.py deleted file mode 100644 index a6f44a5..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__init__.py +++ /dev/null @@ -1,347 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -lockfile.py - Platform-independent advisory file locks. - -Requires Python 2.5 unless you apply 2.4.diff -Locking is done on a per-thread basis instead of a per-process basis. - -Usage: - ->>> lock = LockFile('somefile') ->>> try: -... lock.acquire() -... except AlreadyLocked: -... print 'somefile', 'is locked already.' -... except LockFailed: -... print 'somefile', 'can\\'t be locked.' -... else: -... print 'got lock' -got lock ->>> print lock.is_locked() -True ->>> lock.release() - ->>> lock = LockFile('somefile') ->>> print lock.is_locked() -False ->>> with lock: -... print lock.is_locked() -True ->>> print lock.is_locked() -False - ->>> lock = LockFile('somefile') ->>> # It is okay to lock twice from the same thread... ->>> with lock: -... lock.acquire() -... ->>> # Though no counter is kept, so you can't unlock multiple times... ->>> print lock.is_locked() -False - -Exceptions: - - Error - base class for other exceptions - LockError - base class for all locking exceptions - AlreadyLocked - Another thread or process already holds the lock - LockFailed - Lock failed for some other reason - UnlockError - base class for all unlocking exceptions - AlreadyUnlocked - File was not locked. - NotMyLock - File was locked but not by the current thread/process -""" - -from __future__ import absolute_import - -import functools -import os -import socket -import threading -import warnings - -# Work with PEP8 and non-PEP8 versions of threading module. -if not hasattr(threading, "current_thread"): - threading.current_thread = threading.currentThread -if not hasattr(threading.Thread, "get_name"): - threading.Thread.get_name = threading.Thread.getName - -__all__ = ['Error', 'LockError', 'LockTimeout', 'AlreadyLocked', - 'LockFailed', 'UnlockError', 'NotLocked', 'NotMyLock', - 'LinkFileLock', 'MkdirFileLock', 'SQLiteFileLock', - 'LockBase', 'locked'] - - -class Error(Exception): - """ - Base class for other exceptions. - - >>> try: - ... raise Error - ... except Exception: - ... pass - """ - pass - - -class LockError(Error): - """ - Base class for error arising from attempts to acquire the lock. - - >>> try: - ... raise LockError - ... except Error: - ... pass - """ - pass - - -class LockTimeout(LockError): - """Raised when lock creation fails within a user-defined period of time. - - >>> try: - ... raise LockTimeout - ... except LockError: - ... pass - """ - pass - - -class AlreadyLocked(LockError): - """Some other thread/process is locking the file. - - >>> try: - ... raise AlreadyLocked - ... except LockError: - ... pass - """ - pass - - -class LockFailed(LockError): - """Lock file creation failed for some other reason. - - >>> try: - ... raise LockFailed - ... except LockError: - ... pass - """ - pass - - -class UnlockError(Error): - """ - Base class for errors arising from attempts to release the lock. - - >>> try: - ... raise UnlockError - ... except Error: - ... pass - """ - pass - - -class NotLocked(UnlockError): - """Raised when an attempt is made to unlock an unlocked file. - - >>> try: - ... raise NotLocked - ... except UnlockError: - ... pass - """ - pass - - -class NotMyLock(UnlockError): - """Raised when an attempt is made to unlock a file someone else locked. - - >>> try: - ... raise NotMyLock - ... except UnlockError: - ... pass - """ - pass - - -class _SharedBase(object): - def __init__(self, path): - self.path = path - - def acquire(self, timeout=None): - """ - Acquire the lock. - - * If timeout is omitted (or None), wait forever trying to lock the - file. - - * If timeout > 0, try to acquire the lock for that many seconds. If - the lock period expires and the file is still locked, raise - LockTimeout. - - * If timeout <= 0, raise AlreadyLocked immediately if the file is - already locked. - """ - raise NotImplemented("implement in subclass") - - def release(self): - """ - Release the lock. - - If the file is not locked, raise NotLocked. - """ - raise NotImplemented("implement in subclass") - - def __enter__(self): - """ - Context manager support. - """ - self.acquire() - return self - - def __exit__(self, *_exc): - """ - Context manager support. - """ - self.release() - - def __repr__(self): - return "<%s: %r>" % (self.__class__.__name__, self.path) - - -class LockBase(_SharedBase): - """Base class for platform-specific lock classes.""" - def __init__(self, path, threaded=True, timeout=None): - """ - >>> lock = LockBase('somefile') - >>> lock = LockBase('somefile', threaded=False) - """ - super(LockBase, self).__init__(path) - self.lock_file = os.path.abspath(path) + ".lock" - self.hostname = socket.gethostname() - self.pid = os.getpid() - if threaded: - t = threading.current_thread() - # Thread objects in Python 2.4 and earlier do not have ident - # attrs. Worm around that. - ident = getattr(t, "ident", hash(t)) - self.tname = "-%x" % (ident & 0xffffffff) - else: - self.tname = "" - dirname = os.path.dirname(self.lock_file) - - # unique name is mostly about the current process, but must - # also contain the path -- otherwise, two adjacent locked - # files conflict (one file gets locked, creating lock-file and - # unique file, the other one gets locked, creating lock-file - # and overwriting the already existing lock-file, then one - # gets unlocked, deleting both lock-file and unique file, - # finally the last lock errors out upon releasing. - self.unique_name = os.path.join(dirname, - "%s%s.%s%s" % (self.hostname, - self.tname, - self.pid, - hash(self.path))) - self.timeout = timeout - - def is_locked(self): - """ - Tell whether or not the file is locked. - """ - raise NotImplemented("implement in subclass") - - def i_am_locking(self): - """ - Return True if this object is locking the file. - """ - raise NotImplemented("implement in subclass") - - def break_lock(self): - """ - Remove a lock. Useful if a locking thread failed to unlock. - """ - raise NotImplemented("implement in subclass") - - def __repr__(self): - return "<%s: %r -- %r>" % (self.__class__.__name__, self.unique_name, - self.path) - - -def _fl_helper(cls, mod, *args, **kwds): - warnings.warn("Import from %s module instead of lockfile package" % mod, - DeprecationWarning, stacklevel=2) - # This is a bit funky, but it's only for awhile. The way the unit tests - # are constructed this function winds up as an unbound method, so it - # actually takes three args, not two. We want to toss out self. - if not isinstance(args[0], str): - # We are testing, avoid the first arg - args = args[1:] - if len(args) == 1 and not kwds: - kwds["threaded"] = True - return cls(*args, **kwds) - - -def LinkFileLock(*args, **kwds): - """Factory function provided for backwards compatibility. - - Do not use in new code. Instead, import LinkLockFile from the - lockfile.linklockfile module. - """ - from . import linklockfile - return _fl_helper(linklockfile.LinkLockFile, "lockfile.linklockfile", - *args, **kwds) - - -def MkdirFileLock(*args, **kwds): - """Factory function provided for backwards compatibility. - - Do not use in new code. Instead, import MkdirLockFile from the - lockfile.mkdirlockfile module. - """ - from . import mkdirlockfile - return _fl_helper(mkdirlockfile.MkdirLockFile, "lockfile.mkdirlockfile", - *args, **kwds) - - -def SQLiteFileLock(*args, **kwds): - """Factory function provided for backwards compatibility. - - Do not use in new code. Instead, import SQLiteLockFile from the - lockfile.mkdirlockfile module. - """ - from . import sqlitelockfile - return _fl_helper(sqlitelockfile.SQLiteLockFile, "lockfile.sqlitelockfile", - *args, **kwds) - - -def locked(path, timeout=None): - """Decorator which enables locks for decorated function. - - Arguments: - - path: path for lockfile. - - timeout (optional): Timeout for acquiring lock. - - Usage: - @locked('/var/run/myname', timeout=0) - def myname(...): - ... - """ - def decor(func): - @functools.wraps(func) - def wrapper(*args, **kwargs): - lock = FileLock(path, timeout=timeout) - lock.acquire() - try: - return func(*args, **kwargs) - finally: - lock.release() - return wrapper - return decor - - -if hasattr(os, "link"): - from . import linklockfile as _llf - LockFile = _llf.LinkLockFile -else: - from . import mkdirlockfile as _mlf - LockFile = _mlf.MkdirLockFile - -FileLock = LockFile diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 5c40c10762be01073c644fdd52d1b81e27bc4790..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9823 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-38.pyc deleted file mode 100644 index cb96a3c41a06adc6854d87a39330ae1a67a07cd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2331 zcma)7TaOe)6t3#->F$}G9Tu1%7cVWsLMQBuf)O>cAS%QJ2jgmlj<M4_RkPbOeVMJQ z0e3RI2tR-)6HQEJ9!dNI{sVtQzv9cj^5_G2PW7zp5=gA1PM@k%=l)gocZ-WP0^_e| z{*ONZ_ZSy@hXso(Fy+@k7-2LaDGew^-bjqV&|fn!naQlgN-IGnwF5hK0w;9?H?0QM zv=-DTxlUMx*$)V_dF8$tEHGn@_|6VkB|a?<MC&q7Mv8}VI?RRY>`)Zgg?l6K4z5O$ z7d7OrMRCGeQSIakmvi>3ZCn%!NWYC!o{v<q_-P_|#I%I7F8bL!OjuljDL)3nNkAEa zTqxwRh?zW~fmOyERG7ou2PCjrmDS+uumx6!ud6d?6!jZ%Hqfy_Xyf0J^P+B-OX;cH zi@Y9edm|ZV8(yUHH12vskq^00+g{%D5>P&S-fz`v9*ou1RWCsUm%P1J&z_Na%F)mn z|9_r4=c!H1pR-HXqD1miuhTUk-Q9t`bzy!6Q+iPFaZ`~A=~G7U8&hLODEXdbCoQ7P zK}~!>VNHp$n1N@Gko)v!dYfd%Ei!@X4XWbv3C%2!Rqjz`Pwg4GXUrvi_?iPt^e3=$ z5%$58Gj-7p%<9b0o_+yOwL$G670tOXXS#rAX0%_wXHK9m14I0A8?d*w>+?zJX<~r& zCt!22JWo-M9{*MiR)M_(WxQEKEiwD~8nh3VF@o0`aLx(xkPhq2odL#gldb+O?QN@% zKK*K^Fz&985BD?-vA<m?vf|!pDG;zbSl;pS9E0B7C|1~a#6fp!6boK<x0egh7&lK# zFP2_Z0#%DR+rj&|@!PLB{=DoTDl7m?RxFINcx%MNEJ}G%=_Wbc2<OY2UkH&4Q2~|0 zQFG*5$P`8{3k%UzR1r}jqNi|fu4#?Jk}6V#D^-~3GxkV-1;U}Qh7o|LiflzDoDY2q z6nN4ThhQ&odB#HY5!hNuJ|f~x5d1S~Zvsr)Vv{SL<)VEpiHE~)+CBV;l?{lzeTQdv z+DW|L9&W46JiE~Puq|W7SB6n{5N&YT9>&9!_daU9+q$qa+y-%rZ*1UZI|Nk*Mll)8 z1*~L)-9>A-T{!a+AB0fkc_4%uv`HJZX&j<1U81gq>m{Q>UDGz3v<|zLVLf#%i(1cY z<CHmW?!9%bxxp@Wc6T6;Z->4!_$E%sl+1`cs^HcDu8cX(URP${nCjawqw;-a>svFI zDs$?<*$QH8&TG7BjG3MBQVEPKS94H|Pn0{DFK6ex^^x*Wy1wnD+^-hZScauc*btLA zfusqfu=!81R8kzk9S6yABu9WeqT&tYv3DhT3%J4&JmK)*UWA3L10lM44X9+DzEGk0 z(N|Zf0qP2F@D$$+b4J&|Ysa^AY-N-u;e-xHyo22SV8q+7cNwPC?-m^&+1H@|vVL^{ zXF<7aQNFAww8Vr!tQp1C6dwlQ`!=Hk{2dt`feHJL_WNRxx`anTE{-92Nw`Hl4x?0e z0<Qg4I3@Mp6$)5?W*AFP$H(@^zvuL;Q^1n!t)V!sh(;FF6aT|&M4W~re&xl0vB_n- zUlwa^9iFa%4)!`mihlzFO&-6tFUIGmeCS-Ya6|nDg<(+(!!&23gacm>!>v)2;Ohh{ zCk$EM4MX99NpT7ZHc~7jIfLYRn>B~P6Id#o8gy_q?b@>Ix~5yv62FcPdm}Xx;6flC s#9<^F=0srl`XMZDfQCB0X8Ik|7GCDGa6c(?SjCGiQK4?Q)HOWoU+>^6od5s; diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-38.pyc deleted file mode 100644 index 16638d94c80b1f9c68e8dd8c63051d168c97540a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2699 zcmb7FOK%%D5GMDfl`P3h;yBLZun6j;LSrefzJSI}(!@o8L@jC;O$4+HSzOs`?L#K1 zBo^dLouAN4bCQnv3H<{_e?U$=73e9~9(#y8!<FI((nGo6aJa)=ew_Jc_<gBVAkhBU zul}@9B;+rg9Bvj&ZbKIg1S5<_B&JOo8%=}a+=$GksYk16>CtZ5dUTo&Gnp0TVz=qW z`DQ*YGz;-eb0#h}i*c!0qU3ABZ05Wm%n95*vsq@wDyin)z)qxUsM*%KNTa?C{4nmN zTq>7^PeT!=N#hO0C600*rtR+CmIzb<wUt&F1x)1|sl@3-eYArUHG^_3jDxf<Rq0N| zgBH`4fVFYQ!_9=rZRp}2h=4RHBTa)*IBA7h%zi=PtS6Yma-iAFW%(BbPFr9zFy>g1 zm0)yPna#qOXC|ELq$)k?vXE<-fO2pVHLnAzx4z@G0gVik4X@?FqM$8PzEfLkw9)<3 zhI$VASJ1^LAS4;lAsN!4F*L^(CDPb3N7j&R*$m!qInZ;^-Htg=#>SBNdF^0xAPU~3 zEiW&75dyj89f9}ZWs$}KqPtxEKZ~z;auXdJuv;swNCXET4|0p5wkQ@wqgvoLpjWQ% zhe;@XUm2-TR<9*Dm9>?IiOM4+A9q*oW-4UTiUVb5gV_t2n&~Iuc0cgZP_>jLf~dpG z`lr+VRZeEHent2KSpM0qZ^Du4d^3<ilJfdW6!v=G)jK%wr49H~{b`Uqtw-T{y|*Jb z)8t0&v$_anu+(d{yRD5t)O%rX>DuSDtF;?Ty&W*uf{hJ)S@+>n20umMh`SzRu&1+H zZ-+y25kx3Z5W8X)s6#Dky|wlS^GAGNoBE|~;L=G$m$}e&^vl5iA&|10=fxpSFy>^J zN;;xrvTIB%*I}exi(dzR&`+oDU4EMxyJk|BKxkNDo+o=SA5`RoJ7Y@84<z};BGTy= z_}`S^BXc8nOqg|+>{>%>D=+g~g|5N>l;+mVs0jO)#+1K&0wrN}itKfUXJ`P1*Apzi z%QCZJ^~^lkqd!wXG0TvrlR11*0WJdqu$*AXUOQX)glsn+6L}JMV(y+XIyDAVxZ8FE zWi{X6SQIv1{)+9lFW+EY<CrspOOvekp0z@qWHR+y?d?7!T1Ng(%DqJ~m|GNHD7;oy z8nh{3gHs({RXq4eXK4USmGNx7I>*nz-<5?tQ)b+H&PzDAb?A8o_1rhB_c>3wGR2Ni zZt%Pfl<%a<4meLz<=nsj_`&L0##|?O9ttV=9DK<0DDVWz7EuuNxP!Wt_JTy&?I?xJ zviWITq%pX_K40Uo@QliY|7+G~;w*lgn;iK(OvFtPgr1}>tx(r+sbiE)1N1U2(xOo| z96AR!%dp<MHjs4RF^cA#QK5s=N2xmbXB%BVZKz`b)lB^slpz_BF%b(A_z3YcCb7Q& z+%d9xHKyXGbQsjAsTJ6$qmNtw-33b?bscN7F{os*N>VwE)A{TT=3Kz8c<X)Xp%scN z)QE!0hr-Wn9E+&-xegfr0H@mPm|x22CsCMmmCa*FVI9X;H1jpqk;5M4K@`B{a|d1v z%x|LoS=L@W?y1Sz|MnEt1xdE(2)zI~uu5LhM%BtNqA>%CyyA5fN73*r@a_S0p{oWR zoH-h)cgO#41oQB97OQklQizQSNGwFcuYm~|hkG0cq&@c@K&lw}tyudUF1Ck=3`vYW zD((-?9Yc3$=@Ec<n0J@n3QP{Wh~I@P5Q`tU>mK>>9F#yZvh@lqD&~-m4J6I>Ie3qB z(xn9{lpV-DewHk0BgjJx{Ss`)XHnEZR1Hl6W#OfB%=xOY4!2%c9~K!ekVyo1P@xNS zuyFLO2TQBQTB8a<F5q2=zlFQ7;QMjP`Vs0y-{0=HqKPHv`z&qyzP?KMN3a3Eib4nF zI%*%IIG}~rF!%Wkh$3`-`9NONLaA`cbzRf7w5>Xe`*!-W&tYGVPUo1y`~nIrYurO| o5riW8`qmXGOC>z)LB-NPd>;zsevzGQ87qWNm<p60{TQD0FTE9j?*IS* diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/linklockfile.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/linklockfile.py deleted file mode 100644 index 2ca9be0..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/linklockfile.py +++ /dev/null @@ -1,73 +0,0 @@ -from __future__ import absolute_import - -import time -import os - -from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, - AlreadyLocked) - - -class LinkLockFile(LockBase): - """Lock access to a file using atomic property of link(2). - - >>> lock = LinkLockFile('somefile') - >>> lock = LinkLockFile('somefile', threaded=False) - """ - - def acquire(self, timeout=None): - try: - open(self.unique_name, "wb").close() - except IOError: - raise LockFailed("failed to create %s" % self.unique_name) - - timeout = timeout if timeout is not None else self.timeout - end_time = time.time() - if timeout is not None and timeout > 0: - end_time += timeout - - while True: - # Try and create a hard link to it. - try: - os.link(self.unique_name, self.lock_file) - except OSError: - # Link creation failed. Maybe we've double-locked? - nlinks = os.stat(self.unique_name).st_nlink - if nlinks == 2: - # The original link plus the one I created == 2. We're - # good to go. - return - else: - # Otherwise the lock creation failed. - if timeout is not None and time.time() > end_time: - os.unlink(self.unique_name) - if timeout > 0: - raise LockTimeout("Timeout waiting to acquire" - " lock for %s" % - self.path) - else: - raise AlreadyLocked("%s is already locked" % - self.path) - time.sleep(timeout is not None and timeout / 10 or 0.1) - else: - # Link creation succeeded. We're good to go. - return - - def release(self): - if not self.is_locked(): - raise NotLocked("%s is not locked" % self.path) - elif not os.path.exists(self.unique_name): - raise NotMyLock("%s is locked, but not by me" % self.path) - os.unlink(self.unique_name) - os.unlink(self.lock_file) - - def is_locked(self): - return os.path.exists(self.lock_file) - - def i_am_locking(self): - return (self.is_locked() and - os.path.exists(self.unique_name) and - os.stat(self.unique_name).st_nlink == 2) - - def break_lock(self): - if os.path.exists(self.lock_file): - os.unlink(self.lock_file) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/mkdirlockfile.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/mkdirlockfile.py deleted file mode 100644 index 05a8c96..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/mkdirlockfile.py +++ /dev/null @@ -1,84 +0,0 @@ -from __future__ import absolute_import, division - -import time -import os -import sys -import errno - -from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, - AlreadyLocked) - - -class MkdirLockFile(LockBase): - """Lock file by creating a directory.""" - def __init__(self, path, threaded=True, timeout=None): - """ - >>> lock = MkdirLockFile('somefile') - >>> lock = MkdirLockFile('somefile', threaded=False) - """ - LockBase.__init__(self, path, threaded, timeout) - # Lock file itself is a directory. Place the unique file name into - # it. - self.unique_name = os.path.join(self.lock_file, - "%s.%s%s" % (self.hostname, - self.tname, - self.pid)) - - def acquire(self, timeout=None): - timeout = timeout if timeout is not None else self.timeout - end_time = time.time() - if timeout is not None and timeout > 0: - end_time += timeout - - if timeout is None: - wait = 0.1 - else: - wait = max(0, timeout / 10) - - while True: - try: - os.mkdir(self.lock_file) - except OSError: - err = sys.exc_info()[1] - if err.errno == errno.EEXIST: - # Already locked. - if os.path.exists(self.unique_name): - # Already locked by me. - return - if timeout is not None and time.time() > end_time: - if timeout > 0: - raise LockTimeout("Timeout waiting to acquire" - " lock for %s" % - self.path) - else: - # Someone else has the lock. - raise AlreadyLocked("%s is already locked" % - self.path) - time.sleep(wait) - else: - # Couldn't create the lock for some other reason - raise LockFailed("failed to create %s" % self.lock_file) - else: - open(self.unique_name, "wb").close() - return - - def release(self): - if not self.is_locked(): - raise NotLocked("%s is not locked" % self.path) - elif not os.path.exists(self.unique_name): - raise NotMyLock("%s is locked, but not by me" % self.path) - os.unlink(self.unique_name) - os.rmdir(self.lock_file) - - def is_locked(self): - return os.path.exists(self.lock_file) - - def i_am_locking(self): - return (self.is_locked() and - os.path.exists(self.unique_name)) - - def break_lock(self): - if os.path.exists(self.lock_file): - for name in os.listdir(self.lock_file): - os.unlink(os.path.join(self.lock_file, name)) - os.rmdir(self.lock_file) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/pidlockfile.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/pidlockfile.py deleted file mode 100644 index 069e85b..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/pidlockfile.py +++ /dev/null @@ -1,190 +0,0 @@ -# -*- coding: utf-8 -*- - -# pidlockfile.py -# -# Copyright © 2008–2009 Ben Finney <ben+python@benfinney.id.au> -# -# This is free software: you may copy, modify, and/or distribute this work -# under the terms of the Python Software Foundation License, version 2 or -# later as published by the Python Software Foundation. -# No warranty expressed or implied. See the file LICENSE.PSF-2 for details. - -""" Lockfile behaviour implemented via Unix PID files. - """ - -from __future__ import absolute_import - -import errno -import os -import time - -from . import (LockBase, AlreadyLocked, LockFailed, NotLocked, NotMyLock, - LockTimeout) - - -class PIDLockFile(LockBase): - """ Lockfile implemented as a Unix PID file. - - The lock file is a normal file named by the attribute `path`. - A lock's PID file contains a single line of text, containing - the process ID (PID) of the process that acquired the lock. - - >>> lock = PIDLockFile('somefile') - >>> lock = PIDLockFile('somefile') - """ - - def __init__(self, path, threaded=False, timeout=None): - # pid lockfiles don't support threaded operation, so always force - # False as the threaded arg. - LockBase.__init__(self, path, False, timeout) - self.unique_name = self.path - - def read_pid(self): - """ Get the PID from the lock file. - """ - return read_pid_from_pidfile(self.path) - - def is_locked(self): - """ Test if the lock is currently held. - - The lock is held if the PID file for this lock exists. - - """ - return os.path.exists(self.path) - - def i_am_locking(self): - """ Test if the lock is held by the current process. - - Returns ``True`` if the current process ID matches the - number stored in the PID file. - """ - return self.is_locked() and os.getpid() == self.read_pid() - - def acquire(self, timeout=None): - """ Acquire the lock. - - Creates the PID file for this lock, or raises an error if - the lock could not be acquired. - """ - - timeout = timeout if timeout is not None else self.timeout - end_time = time.time() - if timeout is not None and timeout > 0: - end_time += timeout - - while True: - try: - write_pid_to_pidfile(self.path) - except OSError as exc: - if exc.errno == errno.EEXIST: - # The lock creation failed. Maybe sleep a bit. - if time.time() > end_time: - if timeout is not None and timeout > 0: - raise LockTimeout("Timeout waiting to acquire" - " lock for %s" % - self.path) - else: - raise AlreadyLocked("%s is already locked" % - self.path) - time.sleep(timeout is not None and timeout / 10 or 0.1) - else: - raise LockFailed("failed to create %s" % self.path) - else: - return - - def release(self): - """ Release the lock. - - Removes the PID file to release the lock, or raises an - error if the current process does not hold the lock. - - """ - if not self.is_locked(): - raise NotLocked("%s is not locked" % self.path) - if not self.i_am_locking(): - raise NotMyLock("%s is locked, but not by me" % self.path) - remove_existing_pidfile(self.path) - - def break_lock(self): - """ Break an existing lock. - - Removes the PID file if it already exists, otherwise does - nothing. - - """ - remove_existing_pidfile(self.path) - - -def read_pid_from_pidfile(pidfile_path): - """ Read the PID recorded in the named PID file. - - Read and return the numeric PID recorded as text in the named - PID file. If the PID file cannot be read, or if the content is - not a valid PID, return ``None``. - - """ - pid = None - try: - pidfile = open(pidfile_path, 'r') - except IOError: - pass - else: - # According to the FHS 2.3 section on PID files in /var/run: - # - # The file must consist of the process identifier in - # ASCII-encoded decimal, followed by a newline character. - # - # Programs that read PID files should be somewhat flexible - # in what they accept; i.e., they should ignore extra - # whitespace, leading zeroes, absence of the trailing - # newline, or additional lines in the PID file. - - line = pidfile.readline().strip() - try: - pid = int(line) - except ValueError: - pass - pidfile.close() - - return pid - - -def write_pid_to_pidfile(pidfile_path): - """ Write the PID in the named PID file. - - Get the numeric process ID (“PID”) of the current process - and write it to the named file as a line of text. - - """ - open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY) - open_mode = 0o644 - pidfile_fd = os.open(pidfile_path, open_flags, open_mode) - pidfile = os.fdopen(pidfile_fd, 'w') - - # According to the FHS 2.3 section on PID files in /var/run: - # - # The file must consist of the process identifier in - # ASCII-encoded decimal, followed by a newline character. For - # example, if crond was process number 25, /var/run/crond.pid - # would contain three characters: two, five, and newline. - - pid = os.getpid() - pidfile.write("%s\n" % pid) - pidfile.close() - - -def remove_existing_pidfile(pidfile_path): - """ Remove the named PID file if it exists. - - Removing a PID file that doesn't already exist puts us in the - desired state, so we ignore the condition if the file does not - exist. - - """ - try: - os.remove(pidfile_path) - except OSError as exc: - if exc.errno == errno.ENOENT: - pass - else: - raise diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/sqlitelockfile.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/sqlitelockfile.py deleted file mode 100644 index f997e24..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/sqlitelockfile.py +++ /dev/null @@ -1,156 +0,0 @@ -from __future__ import absolute_import, division - -import time -import os - -try: - unicode -except NameError: - unicode = str - -from . import LockBase, NotLocked, NotMyLock, LockTimeout, AlreadyLocked - - -class SQLiteLockFile(LockBase): - "Demonstrate SQL-based locking." - - testdb = None - - def __init__(self, path, threaded=True, timeout=None): - """ - >>> lock = SQLiteLockFile('somefile') - >>> lock = SQLiteLockFile('somefile', threaded=False) - """ - LockBase.__init__(self, path, threaded, timeout) - self.lock_file = unicode(self.lock_file) - self.unique_name = unicode(self.unique_name) - - if SQLiteLockFile.testdb is None: - import tempfile - _fd, testdb = tempfile.mkstemp() - os.close(_fd) - os.unlink(testdb) - del _fd, tempfile - SQLiteLockFile.testdb = testdb - - import sqlite3 - self.connection = sqlite3.connect(SQLiteLockFile.testdb) - - c = self.connection.cursor() - try: - c.execute("create table locks" - "(" - " lock_file varchar(32)," - " unique_name varchar(32)" - ")") - except sqlite3.OperationalError: - pass - else: - self.connection.commit() - import atexit - atexit.register(os.unlink, SQLiteLockFile.testdb) - - def acquire(self, timeout=None): - timeout = timeout if timeout is not None else self.timeout - end_time = time.time() - if timeout is not None and timeout > 0: - end_time += timeout - - if timeout is None: - wait = 0.1 - elif timeout <= 0: - wait = 0 - else: - wait = timeout / 10 - - cursor = self.connection.cursor() - - while True: - if not self.is_locked(): - # Not locked. Try to lock it. - cursor.execute("insert into locks" - " (lock_file, unique_name)" - " values" - " (?, ?)", - (self.lock_file, self.unique_name)) - self.connection.commit() - - # Check to see if we are the only lock holder. - cursor.execute("select * from locks" - " where unique_name = ?", - (self.unique_name,)) - rows = cursor.fetchall() - if len(rows) > 1: - # Nope. Someone else got there. Remove our lock. - cursor.execute("delete from locks" - " where unique_name = ?", - (self.unique_name,)) - self.connection.commit() - else: - # Yup. We're done, so go home. - return - else: - # Check to see if we are the only lock holder. - cursor.execute("select * from locks" - " where unique_name = ?", - (self.unique_name,)) - rows = cursor.fetchall() - if len(rows) == 1: - # We're the locker, so go home. - return - - # Maybe we should wait a bit longer. - if timeout is not None and time.time() > end_time: - if timeout > 0: - # No more waiting. - raise LockTimeout("Timeout waiting to acquire" - " lock for %s" % - self.path) - else: - # Someone else has the lock and we are impatient.. - raise AlreadyLocked("%s is already locked" % self.path) - - # Well, okay. We'll give it a bit longer. - time.sleep(wait) - - def release(self): - if not self.is_locked(): - raise NotLocked("%s is not locked" % self.path) - if not self.i_am_locking(): - raise NotMyLock("%s is locked, but not by me (by %s)" % - (self.unique_name, self._who_is_locking())) - cursor = self.connection.cursor() - cursor.execute("delete from locks" - " where unique_name = ?", - (self.unique_name,)) - self.connection.commit() - - def _who_is_locking(self): - cursor = self.connection.cursor() - cursor.execute("select unique_name from locks" - " where lock_file = ?", - (self.lock_file,)) - return cursor.fetchone()[0] - - def is_locked(self): - cursor = self.connection.cursor() - cursor.execute("select * from locks" - " where lock_file = ?", - (self.lock_file,)) - rows = cursor.fetchall() - return not not rows - - def i_am_locking(self): - cursor = self.connection.cursor() - cursor.execute("select * from locks" - " where lock_file = ?" - " and unique_name = ?", - (self.lock_file, self.unique_name)) - return not not cursor.fetchall() - - def break_lock(self): - cursor = self.connection.cursor() - cursor.execute("delete from locks" - " where lock_file = ?", - (self.lock_file,)) - self.connection.commit() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/symlinklockfile.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/symlinklockfile.py deleted file mode 100644 index 23b41f5..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/symlinklockfile.py +++ /dev/null @@ -1,70 +0,0 @@ -from __future__ import absolute_import - -import os -import time - -from . import (LockBase, NotLocked, NotMyLock, LockTimeout, - AlreadyLocked) - - -class SymlinkLockFile(LockBase): - """Lock access to a file using symlink(2).""" - - def __init__(self, path, threaded=True, timeout=None): - # super(SymlinkLockFile).__init(...) - LockBase.__init__(self, path, threaded, timeout) - # split it back! - self.unique_name = os.path.split(self.unique_name)[1] - - def acquire(self, timeout=None): - # Hopefully unnecessary for symlink. - # try: - # open(self.unique_name, "wb").close() - # except IOError: - # raise LockFailed("failed to create %s" % self.unique_name) - timeout = timeout if timeout is not None else self.timeout - end_time = time.time() - if timeout is not None and timeout > 0: - end_time += timeout - - while True: - # Try and create a symbolic link to it. - try: - os.symlink(self.unique_name, self.lock_file) - except OSError: - # Link creation failed. Maybe we've double-locked? - if self.i_am_locking(): - # Linked to out unique name. Proceed. - return - else: - # Otherwise the lock creation failed. - if timeout is not None and time.time() > end_time: - if timeout > 0: - raise LockTimeout("Timeout waiting to acquire" - " lock for %s" % - self.path) - else: - raise AlreadyLocked("%s is already locked" % - self.path) - time.sleep(timeout / 10 if timeout is not None else 0.1) - else: - # Link creation succeeded. We're good to go. - return - - def release(self): - if not self.is_locked(): - raise NotLocked("%s is not locked" % self.path) - elif not self.i_am_locking(): - raise NotMyLock("%s is locked, but not by me" % self.path) - os.unlink(self.lock_file) - - def is_locked(self): - return os.path.islink(self.lock_file) - - def i_am_locking(self): - return (os.path.islink(self.lock_file) - and os.readlink(self.lock_file) == self.unique_name) - - def break_lock(self): - if os.path.islink(self.lock_file): # exists && link - os.unlink(self.lock_file) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__init__.py deleted file mode 100644 index 2afca5a..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__init__.py +++ /dev/null @@ -1,66 +0,0 @@ -# coding: utf-8 -from pip._vendor.msgpack._version import version -from pip._vendor.msgpack.exceptions import * - -from collections import namedtuple - - -class ExtType(namedtuple('ExtType', 'code data')): - """ExtType represents ext type in msgpack.""" - def __new__(cls, code, data): - if not isinstance(code, int): - raise TypeError("code must be int") - if not isinstance(data, bytes): - 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) - - -import os -if os.environ.get('MSGPACK_PUREPYTHON'): - from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker -else: - try: - from pip._vendor.msgpack._packer import Packer - from pip._vendor.msgpack._unpacker import unpackb, Unpacker - except ImportError: - from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker - - -def pack(o, stream, **kwargs): - """ - Pack object `o` and write it to `stream` - - See :class:`Packer` for options. - """ - packer = Packer(**kwargs) - stream.write(packer.pack(o)) - - -def packb(o, **kwargs): - """ - Pack object `o` and return packed bytes - - See :class:`Packer` for options. - """ - return Packer(**kwargs).pack(o) - - -def unpack(stream, **kwargs): - """ - Unpack an object from `stream`. - - Raises `ExtraData` when `stream` contains extra bytes. - See :class:`Unpacker` for options. - """ - data = stream.read() - return unpackb(data, **kwargs) - - -# alias for compatibility to simplejson/marshal/pickle. -load = unpack -loads = unpackb - -dump = pack -dumps = packb diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 2dc7c9d9b4e7d90b07db3c4a43de772899b3277b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2106 zcmb7FOK%)S5bmCtogI(Yj=c#+N<tV=Bv>Tx=5ZiI2=NL5q691N%z@e2>E89k^P;;q zj#nFyaHL!yzrntdf5I=|&{t0R3tXV8XV-C%IndTrS6BCT)mL9t`_9smPhkB1cjx<G zT|)lE#o^(>;#2tKA0QZEG$T0;DMj7NtlK!-nVmbKL&;Ub9M*VBScAjN++Aze4jXWy znYp3M-G|LRk9qr4^ue}}E#!Xa=ZoQD-U?fk6yHt)u>08(+Kq?BZ28sxJyN{y5PodS z7r#-0e@ET&fE3n!!dh(UDG68DGCKzIDqCTzFt>R-JkA%x6MQ9ngRh2bta*!c+Ajec z=}_H##Dz@D0#y0|2)~GP&eXWdc!Ea`4|}$d0Vte=l#$S4G_;?QA!Qb`pL(J5j5s80 zfD1=AuRK<_cPc)4Z>9u-SAt7kC>ij_Dp0T)q(zX+Q57d!-DK_o9iiTs&GIfNicG1Z zyOwM#@VZNXreLv@4VJTDvCzWoDRtndTU1<P&K8xQ7ZxQ7s4?do%AJy3Yp*$lyQbE@ z4RN|RCM!wFc#w~!3I-UEnzUK0;seWIM{y}A#PISb5R>+6=g<9k{=$bHPy4A%3#sBF z;o62v^a6svB19>4!(5^LyKy$2o8-9SLLfxljG}^XM^VStc9Kc$pabn-5HF}+h@vEm zrHrB%<ge}CW|{Mz*yM^ArRaT?rB!vaH^fP-kAS`2BVIh}W$B<-?WoPNxY)hald0nC znB#cFWv@!B_46Nf&vh@ZS39uX<)aZAdlCGU!KE`odQp@Xsfwa*wIh}wP;4Bz41!Rf zdgfb$d2(z<aCeTw)gGu2OcZH9it>_;Gt^sA^usvLW;+0zl}QwtyY<oxX2P=!Y{$V% zEml!GfdZ3-?I|5ps6&lqvS9eYY~2Xk*Kb|j`0R^o(Z-#dS2iBp{`$KckX3gBuydiC z;{vlV(B2)RaM7XSBwW_9#3`7>X%LA8Vm{Cly1fRUJOe_JA(Y*7`UFaCk5279YfAR% zKE4kW%E_AC_X8N{FenEPd7^@T*$?7^1=|8>2vR8gGU!Vsc%1irbNUwN!DU18<$fJ% zKNyxGC@TfcDZAzn05P%ZhPg;P2nG6#mfEdv)9%)GEJiYPaSN*JRT549F#fj@2%;jc zPX$^MtnB$f?AUq+?+PdeFMW<!0Vg1&lY9S(P;fOCMPR(Mz!d%e00<-?7bYmsF;ejk ziq~Q22HrpDz>YLjx#C^WUxR@V4qzbmDcK|Y<cX!A?}u~>fDDvh43xSUfTKBMLs8}j z6m@F|H{(=t8T6snMf@ccTR+&|<i)|UASnwK!xMmSn}}=lHFJmQofqB_1a~a$Kv6JL zia>S%an}hzBL1BPx31+2uvPQf^r$!stInI@Y3Szeted;@=M~oGtrwWI@XS$1_~V4v zC8rmYGJ}5trv3!hOZ`+?rPNJ$U{X;Q+8%Lrw69^DWdmTTCiI}S!c#|ijp}L*-#T)$ zh6&BP_)T7wLYWuU)QF+oK-NxH#!NR*!t=?-d8HdD<)N&ZD#BXO-pBQe^a*A{V$NFB evs(6A%cCv2W?3Ll&}Dkk_Iz)_YdO@h9QqHHJsVE| diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__pycache__/_version.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__pycache__/_version.cpython-38.pyc deleted file mode 100644 index 64a9ce18d0169c40ac6b7de7d4b579a7ba630ee8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmWIL<>g`kf)oEW<3xb;V-N=!FakLaKwQiLBvKfn7*ZI688n$RnO_3=3@=$h1RId> z(`3BGUY1%^oSC1ulA#DB4kmt;>u2QWrs@}Eq?V-S<rnF@<zyBV1nH-Ns3P6;M4((* zYF?RsPG*vRL1jrsex9+Og?@2nNvdu^Vsdt3dTOzLL1uxjp{1UIp0RF0B~V%~H9Z|9 os2>m1ngTR5w>TZ77{mv=K(C<k7Kcr4eoARhsvXD+pMjVG0Q2cT_y7O^ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__pycache__/exceptions.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__pycache__/exceptions.cpython-38.pyc deleted file mode 100644 index 31065703e16aaa6d745f77c60709989d9f288b48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2153 zcmb_dPjBNy6t`oianhzu3(Ena)f_;O6|vdv1*Fxgg6$%Nlp;_$1ZhXEXOdXBwi(;m zP1M`&X*uyR`c3!@zVa=&!0%1!{An7bN{lsQ|K`oSdGF2dJ)gJREd%Y(f4VQ3Z5V$M zSZ#HH6ZGsIhHnjF2=gtvG~QSP6SyWUU`v|7HDFuRf$JJuz&oM=+>oZU-`ImXW*pJP zOjFjeV+Xh;c7b=b#s=`7Xal!pL+@}fvo8)Xb08hrgpQWz{A6?w1K6|HOrR6=tb;)s z15+4-nlJ~JsA0WT9-POiAN+dyI*@4|Ch_e1=Q33?@N+3##?CXz7BUvbSuTCS@`PbQ zFlK%fF<EV8qEKNxVujX-FSmbfmk#H#e<?XHTby4eqKN2wkMrLOKe~}LI2TF4`L&@M zFjEhIPrY$+DLploxr`I#y@<jz{m~oJOZ7(3=}lxj@uKj;OQ-obiI3ecy)4XSk38~6 zGV{_f?LGd={lY!&rBjGqIU3QV$FWsF>18&e#ooe+%uT0?f<`^7VQ@^1w?}pli<Xf^ zRBL7H>tZ;R>O~Pn{cB5ESfRipLlJS7KF+@!nrmVpVRa<odmY(4EAq49b3ga{ipYEC zDZ3Dm=IRu}+fUg-na-RtKl@Q3PnAm4?Bfm2EQJ+m+`gh{-f0#^u)Sgy;SIBB_X#cf z2*WboqW0DRn=N7EjXXpAcgp7J>s<L1jDTWaHTots-=OP+xH7K{Zd}zcA~CSl?Bn*F zIfJDr>yq>!P3%lYL$!~6>VSp?O%>f9kvxpUobw~nOgC+qJLc?YVTM~R2#8lzt9YjE zp<Tix`t)ZH=N5c+(PhX*8BU}?p1~9*;FGJ5@0yA(=(Z`yr7TyRe*l@jX2YBvuG*oc z{cim>D-TH-*}tMuyQ%p}*F!6`bB^iQie>`zwMHJDpl>TT?H|^P&37Bbxo@$d?A4`a zJG<V4Js*-yboIz)!uK|OpA28JdiMJ|W?{yZA7;3xS7RBoe40v@3_<?1$n~YsimXV} zM4_^>3(SW3rx}}27Llxo7gD#?VrUz&SsuSgD!uSOGV6W#`f$Z}!uR(5kbFIxNHvU- zSM!YjV`J)e1j0C%BdL}SCU6-MQGPtqp}8r&RZ!S3y(f<z9Y6k@(d$X~e+<F{IQ_{= z5D53XyHq7^{(8E?>l&=6B$lmZs1+3>O?FKjMG-99Ytc}o@UE;Wou~6Z-ZT9-q4LqO M={d4HO^l6y0Yhoku>b%7 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__pycache__/fallback.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__pycache__/fallback.cpython-38.pyc deleted file mode 100644 index 5e214fffabe7ca2a8d281cf13ebd85c56a809ab6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24406 zcmd6P3wT_|b>7~)Pb@$X06`F>Nb2$-5lfNaLob@57?L6>(Uu^YBK6qFUM_Gih{a<U zoO{8?b`d$I?D}(Emu*wmO%s1$zI?9LI=17_ah>$5BRgp$yRq}K9rrd5)k)pJbzio> z)^!}Q|9|Gb77s~IlYCuZXXno2%$zf4&YU@O=AK`(rkKL#<y)n<Kk)uk>QDHP{1otT z3}4qXQYkxCPT7WSP8(%Ie$BEezv*(?F(xy%u`y+*r%ZLy&XluGuAFxY<qoG<?zFRZ z?uAsjt3GJwnd7V(H<8<2?yw6w$64zbcE@#7{R$u!r+a34%e_Xb*@LIf>AsnD<$fde zbgFJ;QqKCRqWU=_#XsbBA-A8o&!+0;Gbyw@@NmjrV|Txhvb&uP*VE-eX>|Z)*G_Mo z*;F1xy&k(4{pm$o-}G%Wo6DPLwv@NbY%On{xxIY*j8(Q~ww1RD{B_gYXLgi#Fkaqi z_m}Um*O%|K)8$=w9>Q}8&%5z_mpxG4V{a($wFk??&OT@VxM^>+H@#q#57@Wao6*`q zdyBmlzjxcW+ZKNBK|i<I+tJVM($9PGyu;p!=biF=pKU&wD&5f>K3$!j9<7c|S+jG> zv7Wf*O*HCOZDw}bnQ`h~)vMvLF>cMc7iUpwk>fYAm_~SR45Jo(7&q~K2w#^2+e$5@ zZl<10y=aV-3_n}*oEi5;!#C^~Q!0=AA6(ft(U@`esR_q(>J7E;^mJ`@_UyiK{;0hd ztH`_T)GzOwu8r=Sm2TZVd}yBwKzrGf>P5%hH(Q(Cd*DsO`-kt|J9`b;!_LKvOx#yN zRU1HqZtoipupFMf=6Bn*F|PtRN;=iW9<%EyLv<iL{l@T8qyaGNhybZ9QUo_0kO~5^ z50Rh+zjyZ9>^1aGxgcz%Rv&KwMpxarGF@}M%0#X1@%h9x&v8%8)uwGn;d#xIo~qR^ z1_@&T*Y;sgj^XRxiNHx={-iK>I&9NUgG17G#?FExGIq|+<2P#;F!Dvepn;xw{JW@? z8WRdIh7aQe`VhYE9t15zSzgLBTE=z!wNe$cm6|jc(k<hrVWjE>FLfOQUNLP9xF$?S zb)%l2o_6YfepF-P=c==_7?&4KKjS*n<G$f8A(vmMfF?DsQnA=HDVQ=cMz_&zHhaVV z4u@q{@AG}A=b_i0fl1%rG8W96sd=N`CuwP<-RWhB%RF$I%r4|K9&zvUezE4(>aJI< zk2!vE#+hlTYnN-z6+iDaMmacs2Y;$cRj>J3Nl_eTwT?kQ12TEc2!8eo*^MLQic~a; z@>ejL-4S9^WOepqJ@hxVU~pn-I-Algx<C@YXsGp3tI|Fx=oc<J-sS4_oWr3E7%@T4 zFc<Sw^`Jy4$6=^r0#+)1u~M07*mKj2cU3Bv=Bm>=M{QtBTNqdjVsxX1)mmiSj<1_T zP%w(QLQc}a(s^O=GmkIBmV!k1E`!L$5KjS*Y8kiIbP{c8{EkdlXGZPn(F3R=C@9hy zcoa{}jgLF(^xX8c-|_gI_xSk9s#o=UðIo+3?7Db-MZ_Y>{Uy?lNg({y~gaYYyD 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/_version.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/_version.py deleted file mode 100644 index d28f0de..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/_version.py +++ /dev/null @@ -1 +0,0 @@ -version = (0, 5, 6) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/exceptions.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/exceptions.py deleted file mode 100644 index 9766881..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/exceptions.py +++ /dev/null @@ -1,41 +0,0 @@ -class UnpackException(Exception): - """Deprecated. Use Exception instead to catch all exception during unpacking.""" - - -class BufferFull(UnpackException): - pass - - -class OutOfData(UnpackException): - pass - - -class UnpackValueError(UnpackException, ValueError): - """Deprecated. Use ValueError instead.""" - - -class ExtraData(UnpackValueError): - def __init__(self, unpacked, extra): - self.unpacked = unpacked - self.extra = extra - - def __str__(self): - return "unpack(b) received extra data." - - -class PackException(Exception): - """Deprecated. Use Exception instead to catch all exception during packing.""" - - -class PackValueError(PackException, ValueError): - """PackValueError is raised when type of input data is supported but it's value is unsupported. - - Deprecated. Use ValueError instead. - """ - - -class PackOverflowError(PackValueError, OverflowError): - """PackOverflowError is raised when integer value is out of range of msgpack support [-2**31, 2**32). - - Deprecated. Use ValueError instead. - """ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/fallback.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/fallback.py deleted file mode 100644 index 9418421..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/fallback.py +++ /dev/null @@ -1,977 +0,0 @@ -"""Fallback pure Python implementation of msgpack""" - -import sys -import struct -import warnings - -if sys.version_info[0] == 3: - PY3 = True - int_types = int - Unicode = str - xrange = range - def dict_iteritems(d): - return d.items() -else: - PY3 = False - int_types = (int, long) - Unicode = unicode - def dict_iteritems(d): - return d.iteritems() - - -if hasattr(sys, 'pypy_version_info'): - # cStringIO is slow on PyPy, StringIO is faster. However: PyPy's own - # StringBuilder is fastest. - from __pypy__ import newlist_hint - try: - from __pypy__.builders import BytesBuilder as StringBuilder - except ImportError: - from __pypy__.builders import StringBuilder - USING_STRINGBUILDER = True - class StringIO(object): - def __init__(self, s=b''): - if s: - self.builder = StringBuilder(len(s)) - self.builder.append(s) - else: - self.builder = StringBuilder() - def write(self, s): - if isinstance(s, memoryview): - s = s.tobytes() - elif isinstance(s, bytearray): - s = bytes(s) - self.builder.append(s) - def getvalue(self): - return self.builder.build() -else: - USING_STRINGBUILDER = False - from io import BytesIO as StringIO - newlist_hint = lambda size: [] - - -from pip._vendor.msgpack.exceptions import ( - BufferFull, - OutOfData, - UnpackValueError, - PackValueError, - PackOverflowError, - ExtraData) - -from pip._vendor.msgpack import ExtType - - -EX_SKIP = 0 -EX_CONSTRUCT = 1 -EX_READ_ARRAY_HEADER = 2 -EX_READ_MAP_HEADER = 3 - -TYPE_IMMEDIATE = 0 -TYPE_ARRAY = 1 -TYPE_MAP = 2 -TYPE_RAW = 3 -TYPE_BIN = 4 -TYPE_EXT = 5 - -DEFAULT_RECURSE_LIMIT = 511 - - -def _check_type_strict(obj, t, type=type, tuple=tuple): - if type(t) is tuple: - return type(obj) in t - else: - return type(obj) is t - - -def _get_data_from_buffer(obj): - try: - view = memoryview(obj) - except TypeError: - # try to use legacy buffer protocol if 2.7, otherwise re-raise - if not PY3: - view = memoryview(buffer(obj)) - warnings.warn("using old buffer interface to unpack %s; " - "this leads to unpacking errors if slicing is used and " - "will be removed in a future version" % type(obj), - RuntimeWarning) - else: - raise - if view.itemsize != 1: - raise ValueError("cannot unpack from multi-byte object") - return view - - -def unpack(stream, **kwargs): - warnings.warn( - "Direct calling implementation's unpack() is deprecated, Use msgpack.unpack() or unpackb() instead.", - PendingDeprecationWarning) - data = stream.read() - return unpackb(data, **kwargs) - - -def unpackb(packed, **kwargs): - """ - Unpack an object from `packed`. - - Raises `ExtraData` when `packed` contains extra bytes. - See :class:`Unpacker` for options. - """ - unpacker = Unpacker(None, **kwargs) - unpacker.feed(packed) - try: - ret = unpacker._unpack() - except OutOfData: - raise UnpackValueError("Data is not enough.") - if unpacker._got_extradata(): - raise ExtraData(ret, unpacker._get_extradata()) - return ret - - -class Unpacker(object): - """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. - - :param int read_size: - Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`) - - :param bool use_list: - If true, unpack msgpack array to Python list. - Otherwise, unpack to Python tuple. (default: True) - - :param bool raw: - If true, unpack msgpack raw to Python bytes (default). - Otherwise, unpack to Python str (or unicode on Python 2) by decoding - with UTF-8 encoding (recommended). - Currently, the default is true, but it will be changed to false in - near future. So you must specify it explicitly for keeping backward - compatibility. - - *encoding* option which is deprecated overrides this option. - - :param callable 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: - When specified, it should be callable. - Unpacker calls it with a list of key-value pairs after unpacking msgpack map. - (See also simplejson) - - :param str encoding: - Encoding used for decoding msgpack raw. - If it is None (default), msgpack raw is deserialized to Python bytes. - - :param str unicode_errors: - (deprecated) Used for decoding msgpack raw with *encoding*. - (default: `'strict'`) - - :param int max_buffer_size: - Limits size of data waiting unpacked. 0 means system's INT_MAX (default). - Raises `BufferFull` exception when it is insufficient. - You should set this parameter when unpacking data from untrusted source. - - :param int max_str_len: - Limits max length of str. (default: 2**31-1) - - :param int max_bin_len: - Limits max length of bin. (default: 2**31-1) - - :param int max_array_len: - Limits max length of array. (default: 2**31-1) - - :param int max_map_len: - Limits max length of map. (default: 2**31-1) - - - example of streaming deserialize from file-like object:: - - unpacker = Unpacker(file_like, raw=False) - for o in unpacker: - process(o) - - example of streaming deserialize from socket:: - - unpacker = Unpacker(raw=False) - while True: - buf = sock.recv(1024**2) - if not buf: - break - unpacker.feed(buf) - for o in unpacker: - process(o) - """ - - def __init__(self, file_like=None, read_size=0, use_list=True, raw=True, - object_hook=None, object_pairs_hook=None, list_hook=None, - encoding=None, unicode_errors=None, max_buffer_size=0, - ext_hook=ExtType, - max_str_len=2147483647, # 2**32-1 - max_bin_len=2147483647, - max_array_len=2147483647, - max_map_len=2147483647, - max_ext_len=2147483647): - - if encoding is not None: - warnings.warn( - "encoding is deprecated, Use raw=False instead.", - PendingDeprecationWarning) - - if unicode_errors is None: - unicode_errors = 'strict' - - if file_like is None: - self._feeding = True - else: - if not callable(file_like.read): - raise TypeError("`file_like.read` must be callable") - self.file_like = file_like - self._feeding = False - - #: array of bytes fed. - self._buffer = bytearray() - # Some very old pythons don't support `struct.unpack_from()` with a - # `bytearray`. So we wrap it in a `buffer()` there. - if sys.version_info < (2, 7, 6): - self._buffer_view = buffer(self._buffer) - else: - self._buffer_view = self._buffer - #: Which position we currently reads - self._buff_i = 0 - - # When Unpacker is used as an iterable, between the calls to next(), - # the buffer is not "consumed" completely, for efficiency sake. - # Instead, it is done sloppily. To make sure we raise BufferFull at - # the correct moments, we have to keep track of how sloppy we were. - # Furthermore, when the buffer is incomplete (that is: in the case - # we raise an OutOfData) we need to rollback the buffer to the correct - # state, which _buf_checkpoint records. - self._buf_checkpoint = 0 - - self._max_buffer_size = max_buffer_size or 2**31-1 - if read_size > self._max_buffer_size: - raise ValueError("read_size must be smaller than max_buffer_size") - self._read_size = read_size or min(self._max_buffer_size, 16*1024) - self._raw = bool(raw) - self._encoding = encoding - self._unicode_errors = unicode_errors - self._use_list = use_list - self._list_hook = list_hook - self._object_hook = object_hook - self._object_pairs_hook = object_pairs_hook - self._ext_hook = ext_hook - self._max_str_len = max_str_len - self._max_bin_len = max_bin_len - self._max_array_len = max_array_len - self._max_map_len = max_map_len - self._max_ext_len = max_ext_len - self._stream_offset = 0 - - if list_hook is not None and not callable(list_hook): - raise TypeError('`list_hook` is not callable') - if object_hook is not None and not callable(object_hook): - raise TypeError('`object_hook` is not callable') - 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") - if not callable(ext_hook): - raise TypeError("`ext_hook` is not callable") - - def feed(self, next_bytes): - assert self._feeding - view = _get_data_from_buffer(next_bytes) - if (len(self._buffer) - self._buff_i + len(view) > self._max_buffer_size): - raise BufferFull - - # Strip buffer before checkpoint before reading file. - if self._buf_checkpoint > 0: - del self._buffer[:self._buf_checkpoint] - self._buff_i -= self._buf_checkpoint - self._buf_checkpoint = 0 - - self._buffer += view - - def _consume(self): - """ Gets rid of the used parts of the buffer. """ - self._stream_offset += self._buff_i - self._buf_checkpoint - self._buf_checkpoint = self._buff_i - - def _got_extradata(self): - return self._buff_i < len(self._buffer) - - def _get_extradata(self): - return self._buffer[self._buff_i:] - - def read_bytes(self, n): - return self._read(n) - - def _read(self, n): - # (int) -> bytearray - self._reserve(n) - i = self._buff_i - self._buff_i = i+n - return self._buffer[i:i+n] - - def _reserve(self, n): - remain_bytes = len(self._buffer) - self._buff_i - n - - # Fast path: buffer has n bytes already - if remain_bytes >= 0: - return - - if self._feeding: - self._buff_i = self._buf_checkpoint - raise OutOfData - - # Strip buffer before checkpoint before reading file. - if self._buf_checkpoint > 0: - del self._buffer[:self._buf_checkpoint] - self._buff_i -= self._buf_checkpoint - self._buf_checkpoint = 0 - - # Read from file - remain_bytes = -remain_bytes - while remain_bytes > 0: - to_read_bytes = max(self._read_size, remain_bytes) - read_data = self.file_like.read(to_read_bytes) - if not read_data: - break - assert isinstance(read_data, bytes) - self._buffer += read_data - remain_bytes -= len(read_data) - - if len(self._buffer) < n + self._buff_i: - self._buff_i = 0 # rollback - raise OutOfData - - def _read_header(self, execute=EX_CONSTRUCT): - typ = TYPE_IMMEDIATE - n = 0 - obj = None - self._reserve(1) - b = self._buffer[self._buff_i] - self._buff_i += 1 - if b & 0b10000000 == 0: - obj = b - elif b & 0b11100000 == 0b11100000: - obj = -1 - (b ^ 0xff) - elif b & 0b11100000 == 0b10100000: - n = b & 0b00011111 - typ = TYPE_RAW - if n > self._max_str_len: - raise UnpackValueError("%s exceeds max_str_len(%s)", n, 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 UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) - elif b & 0b11110000 == 0b10000000: - n = b & 0b00001111 - typ = TYPE_MAP - if n > self._max_map_len: - raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) - elif b == 0xc0: - obj = None - elif b == 0xc2: - obj = False - elif b == 0xc3: - obj = True - elif b == 0xc4: - typ = TYPE_BIN - self._reserve(1) - n = self._buffer[self._buff_i] - self._buff_i += 1 - if n > self._max_bin_len: - raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) - obj = self._read(n) - elif b == 0xc5: - typ = TYPE_BIN - self._reserve(2) - n = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0] - self._buff_i += 2 - if n > self._max_bin_len: - raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) - obj = self._read(n) - elif b == 0xc6: - typ = TYPE_BIN - self._reserve(4) - n = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0] - self._buff_i += 4 - if n > self._max_bin_len: - raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) - obj = self._read(n) - elif b == 0xc7: # ext 8 - typ = TYPE_EXT - self._reserve(2) - L, n = struct.unpack_from('Bb', self._buffer_view, self._buff_i) - self._buff_i += 2 - if L > self._max_ext_len: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) - obj = self._read(L) - elif b == 0xc8: # ext 16 - typ = TYPE_EXT - self._reserve(3) - L, n = struct.unpack_from('>Hb', self._buffer_view, self._buff_i) - self._buff_i += 3 - if L > self._max_ext_len: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) - obj = self._read(L) - elif b == 0xc9: # ext 32 - typ = TYPE_EXT - self._reserve(5) - L, n = struct.unpack_from('>Ib', self._buffer_view, self._buff_i) - self._buff_i += 5 - if L > self._max_ext_len: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) - obj = self._read(L) - elif b == 0xca: - self._reserve(4) - obj = struct.unpack_from(">f", self._buffer_view, self._buff_i)[0] - self._buff_i += 4 - elif b == 0xcb: - self._reserve(8) - obj = struct.unpack_from(">d", self._buffer_view, self._buff_i)[0] - self._buff_i += 8 - elif b == 0xcc: - self._reserve(1) - obj = self._buffer[self._buff_i] - self._buff_i += 1 - elif b == 0xcd: - self._reserve(2) - obj = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0] - self._buff_i += 2 - elif b == 0xce: - self._reserve(4) - obj = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0] - self._buff_i += 4 - elif b == 0xcf: - self._reserve(8) - obj = struct.unpack_from(">Q", self._buffer_view, self._buff_i)[0] - self._buff_i += 8 - elif b == 0xd0: - self._reserve(1) - obj = struct.unpack_from("b", self._buffer_view, self._buff_i)[0] - self._buff_i += 1 - elif b == 0xd1: - self._reserve(2) - obj = struct.unpack_from(">h", self._buffer_view, self._buff_i)[0] - self._buff_i += 2 - elif b == 0xd2: - self._reserve(4) - obj = struct.unpack_from(">i", self._buffer_view, self._buff_i)[0] - self._buff_i += 4 - elif b == 0xd3: - self._reserve(8) - obj = struct.unpack_from(">q", self._buffer_view, self._buff_i)[0] - self._buff_i += 8 - elif b == 0xd4: # fixext 1 - typ = TYPE_EXT - if self._max_ext_len < 1: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (1, self._max_ext_len)) - self._reserve(2) - n, obj = struct.unpack_from("b1s", self._buffer_view, self._buff_i) - self._buff_i += 2 - elif b == 0xd5: # fixext 2 - typ = TYPE_EXT - if self._max_ext_len < 2: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (2, self._max_ext_len)) - self._reserve(3) - n, obj = struct.unpack_from("b2s", self._buffer_view, self._buff_i) - self._buff_i += 3 - elif b == 0xd6: # fixext 4 - typ = TYPE_EXT - if self._max_ext_len < 4: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (4, self._max_ext_len)) - self._reserve(5) - n, obj = struct.unpack_from("b4s", self._buffer_view, self._buff_i) - self._buff_i += 5 - elif b == 0xd7: # fixext 8 - typ = TYPE_EXT - if self._max_ext_len < 8: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (8, self._max_ext_len)) - self._reserve(9) - n, obj = struct.unpack_from("b8s", self._buffer_view, self._buff_i) - self._buff_i += 9 - elif b == 0xd8: # fixext 16 - typ = TYPE_EXT - if self._max_ext_len < 16: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (16, self._max_ext_len)) - self._reserve(17) - n, obj = struct.unpack_from("b16s", self._buffer_view, self._buff_i) - self._buff_i += 17 - elif b == 0xd9: - typ = TYPE_RAW - self._reserve(1) - n = self._buffer[self._buff_i] - self._buff_i += 1 - if n > self._max_str_len: - raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) - obj = self._read(n) - elif b == 0xda: - typ = TYPE_RAW - self._reserve(2) - n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) - self._buff_i += 2 - if n > self._max_str_len: - raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) - obj = self._read(n) - elif b == 0xdb: - typ = TYPE_RAW - self._reserve(4) - n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) - self._buff_i += 4 - if n > self._max_str_len: - raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) - obj = self._read(n) - elif b == 0xdc: - typ = TYPE_ARRAY - self._reserve(2) - n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) - self._buff_i += 2 - if n > self._max_array_len: - raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) - elif b == 0xdd: - typ = TYPE_ARRAY - self._reserve(4) - n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) - self._buff_i += 4 - if n > self._max_array_len: - raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) - elif b == 0xde: - self._reserve(2) - n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) - self._buff_i += 2 - if n > self._max_map_len: - raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) - typ = TYPE_MAP - elif b == 0xdf: - self._reserve(4) - n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) - self._buff_i += 4 - if n > self._max_map_len: - raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) - typ = TYPE_MAP - else: - raise UnpackValueError("Unknown header: 0x%x" % b) - return typ, n, obj - - def _unpack(self, execute=EX_CONSTRUCT): - typ, n, obj = self._read_header(execute) - - if execute == EX_READ_ARRAY_HEADER: - if typ != TYPE_ARRAY: - raise UnpackValueError("Expected array") - return n - if execute == EX_READ_MAP_HEADER: - if typ != TYPE_MAP: - raise UnpackValueError("Expected map") - return n - # TODO should we eliminate the recursion? - if typ == TYPE_ARRAY: - if execute == EX_SKIP: - for i in xrange(n): - # TODO check whether we need to call `list_hook` - self._unpack(EX_SKIP) - return - ret = newlist_hint(n) - for i in xrange(n): - ret.append(self._unpack(EX_CONSTRUCT)) - if self._list_hook is not None: - ret = self._list_hook(ret) - # TODO is the interaction between `list_hook` and `use_list` ok? - return ret if self._use_list else tuple(ret) - if typ == TYPE_MAP: - if execute == EX_SKIP: - for i in xrange(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)) - else: - ret = {} - for _ in xrange(n): - key = self._unpack(EX_CONSTRUCT) - ret[key] = self._unpack(EX_CONSTRUCT) - if self._object_hook is not None: - ret = self._object_hook(ret) - return ret - if execute == EX_SKIP: - return - if typ == TYPE_RAW: - if self._encoding is not None: - obj = obj.decode(self._encoding, self._unicode_errors) - elif self._raw: - obj = bytes(obj) - else: - obj = obj.decode('utf_8') - return obj - if typ == TYPE_EXT: - return self._ext_hook(n, bytes(obj)) - if typ == TYPE_BIN: - return bytes(obj) - assert typ == TYPE_IMMEDIATE - return obj - - def __iter__(self): - return self - - def __next__(self): - try: - ret = self._unpack(EX_CONSTRUCT) - self._consume() - return ret - except OutOfData: - self._consume() - raise StopIteration - - next = __next__ - - def skip(self, write_bytes=None): - self._unpack(EX_SKIP) - if write_bytes is not None: - warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) - write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) - self._consume() - - def unpack(self, write_bytes=None): - ret = self._unpack(EX_CONSTRUCT) - if write_bytes is not None: - warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) - write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) - self._consume() - return ret - - def read_array_header(self, write_bytes=None): - ret = self._unpack(EX_READ_ARRAY_HEADER) - if write_bytes is not None: - warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) - write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) - self._consume() - return ret - - def read_map_header(self, write_bytes=None): - ret = self._unpack(EX_READ_MAP_HEADER) - if write_bytes is not None: - warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) - write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) - self._consume() - return ret - - def tell(self): - return self._stream_offset - - -class Packer(object): - """ - MessagePack Packer - - usage: - - packer = Packer() - astream.write(packer.pack(a)) - astream.write(packer.pack(b)) - - Packer's constructor has some keyword arguments: - - :param callable default: - Convert user type to builtin type that Packer supports. - See also simplejson's document. - - :param bool use_single_float: - Use single precision float type for float. (default: False) - - :param bool autoreset: - Reset buffer after each pack and return its content as `bytes`. (default: True). - If set this to false, use `bytes()` to get content and `.reset()` to clear buffer. - - :param bool use_bin_type: - Use bin type introduced in msgpack spec 2.0 for bytes. - It also enables str8 type for unicode. - - :param bool strict_types: - If set to true, types will be checked to be exact. Derived classes - from serializeable types will not be serialized and will be - treated as unsupported type and forwarded to default. - Additionally tuples will not be serialized as lists. - This is useful when trying to implement accurate serialization - for python types. - - :param str encoding: - (deprecated) Convert unicode to bytes with this encoding. (default: 'utf-8') - - :param str unicode_errors: - Error handler for encoding unicode. (default: 'strict') - """ - def __init__(self, default=None, encoding=None, unicode_errors=None, - use_single_float=False, autoreset=True, use_bin_type=False, - strict_types=False): - if encoding is None: - encoding = 'utf_8' - else: - warnings.warn( - "encoding is deprecated, Use raw=False instead.", - PendingDeprecationWarning) - - if unicode_errors is None: - unicode_errors = 'strict' - - self._strict_types = strict_types - self._use_float = use_single_float - self._autoreset = autoreset - self._use_bin_type = use_bin_type - self._encoding = encoding - self._unicode_errors = unicode_errors - self._buffer = StringIO() - if default is not None: - if not callable(default): - raise TypeError("default must be callable") - self._default = default - - def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT, - check=isinstance, check_type_strict=_check_type_strict): - default_used = False - if self._strict_types: - check = check_type_strict - list_types = list - else: - list_types = (list, tuple) - while True: - if nest_limit < 0: - raise PackValueError("recursion limit exceeded") - if obj is None: - return self._buffer.write(b"\xc0") - if check(obj, bool): - if obj: - return self._buffer.write(b"\xc3") - return self._buffer.write(b"\xc2") - if check(obj, int_types): - if 0 <= obj < 0x80: - return self._buffer.write(struct.pack("B", obj)) - if -0x20 <= obj < 0: - return self._buffer.write(struct.pack("b", obj)) - if 0x80 <= obj <= 0xff: - return self._buffer.write(struct.pack("BB", 0xcc, obj)) - if -0x80 <= obj < 0: - return self._buffer.write(struct.pack(">Bb", 0xd0, obj)) - if 0xff < obj <= 0xffff: - return self._buffer.write(struct.pack(">BH", 0xcd, obj)) - if -0x8000 <= obj < -0x80: - return self._buffer.write(struct.pack(">Bh", 0xd1, obj)) - if 0xffff < obj <= 0xffffffff: - return self._buffer.write(struct.pack(">BI", 0xce, obj)) - if -0x80000000 <= obj < -0x8000: - return self._buffer.write(struct.pack(">Bi", 0xd2, obj)) - if 0xffffffff < obj <= 0xffffffffffffffff: - return self._buffer.write(struct.pack(">BQ", 0xcf, obj)) - if -0x8000000000000000 <= obj < -0x80000000: - return self._buffer.write(struct.pack(">Bq", 0xd3, obj)) - if not default_used and self._default is not None: - obj = self._default(obj) - default_used = True - continue - raise PackOverflowError("Integer value out of range") - if check(obj, (bytes, bytearray)): - n = len(obj) - if n >= 2**32: - raise PackValueError("%s is too large" % type(obj).__name__) - self._pack_bin_header(n) - return self._buffer.write(obj) - if check(obj, Unicode): - if self._encoding is None: - raise TypeError( - "Can't encode unicode string: " - "no encoding is specified") - obj = obj.encode(self._encoding, self._unicode_errors) - n = len(obj) - if n >= 2**32: - raise PackValueError("String is too large") - self._pack_raw_header(n) - return self._buffer.write(obj) - if check(obj, memoryview): - n = len(obj) * obj.itemsize - if n >= 2**32: - raise PackValueError("Memoryview is too large") - self._pack_bin_header(n) - return self._buffer.write(obj) - if check(obj, float): - if self._use_float: - return self._buffer.write(struct.pack(">Bf", 0xca, obj)) - return self._buffer.write(struct.pack(">Bd", 0xcb, obj)) - if check(obj, ExtType): - code = obj.code - data = obj.data - assert isinstance(code, int) - assert isinstance(data, bytes) - L = len(data) - if L == 1: - self._buffer.write(b'\xd4') - elif L == 2: - self._buffer.write(b'\xd5') - elif L == 4: - self._buffer.write(b'\xd6') - elif L == 8: - self._buffer.write(b'\xd7') - elif L == 16: - self._buffer.write(b'\xd8') - elif L <= 0xff: - self._buffer.write(struct.pack(">BB", 0xc7, L)) - elif L <= 0xffff: - self._buffer.write(struct.pack(">BH", 0xc8, L)) - else: - self._buffer.write(struct.pack(">BI", 0xc9, L)) - self._buffer.write(struct.pack("b", code)) - self._buffer.write(data) - return - if check(obj, list_types): - n = len(obj) - self._pack_array_header(n) - for i in xrange(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) - if not default_used and self._default is not None: - obj = self._default(obj) - default_used = 1 - continue - raise TypeError("Cannot serialize %r" % (obj, )) - - def pack(self, obj): - try: - self._pack(obj) - except: - self._buffer = StringIO() # force reset - raise - ret = self._buffer.getvalue() - if self._autoreset: - self._buffer = StringIO() - elif USING_STRINGBUILDER: - self._buffer = StringIO(ret) - return ret - - def pack_map_pairs(self, pairs): - self._pack_map_pairs(len(pairs), pairs) - ret = self._buffer.getvalue() - if self._autoreset: - self._buffer = StringIO() - elif USING_STRINGBUILDER: - self._buffer = StringIO(ret) - return ret - - def pack_array_header(self, n): - if n >= 2**32: - raise PackValueError - self._pack_array_header(n) - ret = self._buffer.getvalue() - if self._autoreset: - self._buffer = StringIO() - elif USING_STRINGBUILDER: - self._buffer = StringIO(ret) - return ret - - def pack_map_header(self, n): - if n >= 2**32: - raise PackValueError - self._pack_map_header(n) - ret = self._buffer.getvalue() - if self._autoreset: - self._buffer = StringIO() - elif USING_STRINGBUILDER: - self._buffer = StringIO(ret) - return ret - - def pack_ext_type(self, typecode, data): - if not isinstance(typecode, int): - raise TypeError("typecode must have int type.") - if not 0 <= typecode <= 127: - raise ValueError("typecode should be 0-127") - if not isinstance(data, bytes): - raise TypeError("data must have bytes type") - L = len(data) - if L > 0xffffffff: - raise PackValueError("Too large data") - if L == 1: - self._buffer.write(b'\xd4') - elif L == 2: - self._buffer.write(b'\xd5') - elif L == 4: - self._buffer.write(b'\xd6') - elif L == 8: - self._buffer.write(b'\xd7') - elif L == 16: - self._buffer.write(b'\xd8') - elif L <= 0xff: - self._buffer.write(b'\xc7' + struct.pack('B', L)) - elif L <= 0xffff: - self._buffer.write(b'\xc8' + struct.pack('>H', L)) - else: - self._buffer.write(b'\xc9' + struct.pack('>I', L)) - self._buffer.write(struct.pack('B', typecode)) - self._buffer.write(data) - - def _pack_array_header(self, n): - if n <= 0x0f: - return self._buffer.write(struct.pack('B', 0x90 + n)) - if n <= 0xffff: - return self._buffer.write(struct.pack(">BH", 0xdc, n)) - if n <= 0xffffffff: - return self._buffer.write(struct.pack(">BI", 0xdd, n)) - raise PackValueError("Array is too large") - - def _pack_map_header(self, n): - if n <= 0x0f: - return self._buffer.write(struct.pack('B', 0x80 + n)) - if n <= 0xffff: - return self._buffer.write(struct.pack(">BH", 0xde, n)) - if n <= 0xffffffff: - return self._buffer.write(struct.pack(">BI", 0xdf, n)) - raise PackValueError("Dict is too large") - - def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT): - self._pack_map_header(n) - for (k, v) in pairs: - self._pack(k, nest_limit - 1) - self._pack(v, nest_limit - 1) - - def _pack_raw_header(self, n): - if n <= 0x1f: - self._buffer.write(struct.pack('B', 0xa0 + n)) - elif self._use_bin_type and n <= 0xff: - self._buffer.write(struct.pack('>BB', 0xd9, n)) - elif n <= 0xffff: - self._buffer.write(struct.pack(">BH", 0xda, n)) - elif n <= 0xffffffff: - self._buffer.write(struct.pack(">BI", 0xdb, n)) - else: - raise PackValueError('Raw is too large') - - def _pack_bin_header(self, n): - if not self._use_bin_type: - return self._pack_raw_header(n) - elif n <= 0xff: - return self._buffer.write(struct.pack('>BB', 0xc4, n)) - elif n <= 0xffff: - return self._buffer.write(struct.pack(">BH", 0xc5, n)) - elif n <= 0xffffffff: - return self._buffer.write(struct.pack(">BI", 0xc6, n)) - else: - raise PackValueError('Bin is too large') - - def bytes(self): - return self._buffer.getvalue() - - def reset(self): - self._buffer = StringIO() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__about__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__about__.py deleted file mode 100644 index 7481c9e..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__about__.py +++ /dev/null @@ -1,27 +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. -from __future__ import absolute_import, division, print_function - -__all__ = [ - "__title__", - "__summary__", - "__uri__", - "__version__", - "__author__", - "__email__", - "__license__", - "__copyright__", -] - -__title__ = "packaging" -__summary__ = "Core utilities for Python packages" -__uri__ = "https://github.com/pypa/packaging" - -__version__ = "19.0" - -__author__ = "Donald Stufft and individual contributors" -__email__ = "donald@stufft.io" - -__license__ = "BSD or Apache License, Version 2.0" -__copyright__ = "Copyright 2014-2019 %s" % __author__ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__init__.py deleted file mode 100644 index a0cf67d..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__init__.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. -from __future__ import absolute_import, division, print_function - -from .__about__ import ( - __author__, - __copyright__, - __email__, - __license__, - __summary__, - __title__, - __uri__, - __version__, -) - -__all__ = [ - "__title__", - "__summary__", - "__uri__", - "__version__", - "__author__", - "__email__", - "__license__", - "__copyright__", -] diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/__about__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/__about__.cpython-38.pyc deleted file mode 100644 index 0a2453918d84f9e5151e836309f7a6456b1e3ed0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 752 zcmY*XOOMkq5Kfvt(${WzXwRk+he|Zw2L~1*w6H5q2(75#kONlQaT9Bk*z%)N^N;u^ z{Dxk+z&}7-V7%4x@F-tA<C)K%&;BqT4+0!te$768YX!kq@BBMrbT05S*9Z_mSO!&? zhE*$VRZ$v+0kj~3Hgup1J&2*7$7ve|X$OXB7e;9h#%T-(X&(;L0Zh^%+~fVDARWQ| zMKF8t9a)1}v^&g}MwZTUCMqSh-Nhg_!U$RK4wM$PWouWjtoQqjSz$}g*lx&}aaEP+ zEjm5MoEH1&hHGDo&VaGZ*+OcZV<oRLQSNg}vEsGyG-JkAQf;-!3+vNVwz|o3QRmI{ zQff||6{WC(8?u&~TyK%CCi^6Ann#7T$~>nu7q)QAWF;%Awko54Y1${}$#FBgl66)B zSy;DTTawj4MD5!Imz88CYpcc5S*cAkf!ovzbDNq7*-T$At_be_3Rw$I-tG_ognZn0 zN=|WuqszN4$m#LP(>cO9d2HUz#$JZCvrc2X8m~Ffk%u;d*DWhi6W#Hlu7{onfAhNU z!M_ka^e{sB9O#Lkd-&PVLROsWf?HloP2ZG4srPj4e|ny0xVGW-hL&Q9qIluXl4sNi z%jb6jQYF;f3zVGA)fSf%p65PD8I}T){t=SmQJ2!;B_(RRi(ga{T*+VhHp~>^Vblu$ PvmfnYJ49=tc?^F8WZ2#9 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index b82ec892ce1a3bb32dc820cd4e9349a1d2b266dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 590 zcmY*V%Z}7A5Ok86$$Jsfegt!v7}yI)2yx=bfyc!MTA8sYV__$j<BXI~;!pU7TsiF@ zATH3ok<j8O<&<4rUFk1%T`*if{_MZLj2Zh$<nhXoyu)|=j3Ake46~7lY%F4%h$Lb% zmWkQet=QU~*x6L1HWQi6MQ#gG*iw|X5*6w;aw~T-m6^<CA<HfkwX8m|eSMG4Y@aMo z+T%EwDJam^4L&TH)K@*~p<iyC*L{HV)Sm+K`-m#Cr2uHBa2Y(nQUja@H+$V(0@55n z*;X6;ECGx@seV)|87FI7Kd+*ogQ4>jVDfquT$QJ;0KUXNo(AMAf|_7QKx6SaL5lEU ze?wW$Q<yxOc^oA33Bd+|vb4ux!dPoDl{|8I@PFv^uL;Fz4Tk^D{8LgB{GRz`u!{SO z3aTGGe{ZyNANiR!f9P7gyQ==mjXrWW<6Qc?<`o}xPzTqZzO|hixzq0O;&t=9xjVQS vuN&2MbjSfqC7P~E-FF;7_ZmYtZeFrCc94@%Z|R4|TZG&ASrteBJ-_|}*z=s_ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/_compat.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/_compat.cpython-38.pyc deleted file mode 100644 index 7382f857804d48ea43a598852594d4d7cea39826..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1026 zcmah{OK%e~5cXq}Y(ttNQGs|I!Ubs$*#&w5sj84baH|jqB=&%{T|3FrePKH(smiI9 z+MfZ({u6$Kublc9xWLSARl<ppW;`?YeDm_V_4Pgh`tdvXm~cXVqOnR0jAy{+JqSr8 z%}GIHTCkWEJmwUAEcaqhd7nCx+$NImv$%U@d0_QaPrp$9gvM)SSM~9f9oao0@iocb zlAw11*d*X?BiS=mKDSC_MO|s@e3>mWlU1b~);cS#n9R%6g1vizg<U|!B&8UAN$BVT z_khg<5U<E7Ii(XOsbnX<WM}l4e`S_@qeo0~>1E`*2PJe4qy7l!xmJl)qhz#~7&S`s z#F)`RW@q3jlua5(*t|>u{2#*9NahX*MPe#R%vO`fTyjX|9o|Po@fUA9uhJwpJK>cp z^%|&FppJY4*bG3N(Ia|Bj`%Uc(cN>vbUe+C^U9=9u5V|V5!irnRGu@}X>||bHBRQ& zmuOZMD$+A$RaxoiWuDdbn`nZE9!~)!TBvdn<=I|TFYT-<x56ip$*daJNxGj*m5J)C z9zS{-J`A_U^%AZ_HJzd}5)di@w0)VC(@3OMQ71O6m#!y7sSbp=ht1#)2|Wz{JCE=( zY8N{7L5Bi`aD5?)O3riC2SR+FCwY6LuLEw=sm6J=+6HKD?P|n#!E6ffsoun^4Xg0e zC3-2EH8)WKbDmw+szD669wOX23XEAv(V!3iZ3Lf~W|O^}p1uWEFu<ZGb34~iw8s85 z{u_<295+kj1`DO}$BV3-RF1#?@EFAwTw3i0AYh;ZOERwC?6vVU=xsT;;FXU3?RG{x Tn8INFo6P4!I`lm1vo8Mw>dOSE diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/_structures.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/_structures.cpython-38.pyc deleted file mode 100644 index 012a5c4bcfa65c379488947b56120116a679ece4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2808 zcmcImOK;Oa5Z<*D$4S#REk(Q^H;7PTP?2~DP$dwEOAb6PIk0lQo5Urt-SwtYtKQNB ze<lBf-{31J{sI@6Sz}0BJ1Gb@+S$kK?zb~L^EvOAmum#d=kLuApUQ-M!NF`P!C(t& z`~n0goDRu|cIn9I8Y8o7Qu2y$gPTW$o1!!^yJb<HkZu`fOS}xTWj$*N3uY~Dy(P`c zS2&3@&1BWxj>F+t3FeQYP^!e{{+=KEVUVmu(hn5tjRQ}?*ux#O#el&U)c73;LAsQa zuE8lcj!4(!CNDt?_}qfF%q!f6*5XxOgSNt#cpX}sFY^^>t9+F=psn#Wz7FjYKL@wm zNbJ`^&kuaH?@<8B3ih!+hZ>`EIEB?lM}qUnluT(-ip8)eEf{L??aBjLz_P$CGW z^K$4%(Hp0SjcoN@(Cvv}&l&pLPPDHEVX)bL=)}Gft;qF0x_uElksr10J!;==Z?>X+ zP`5?DkCP6AtsD+bSNcKUVX=~9PmQIB+tGevGbTkO8ME=i=r=+S)-u!Dnf8>8CM?u8 z)}f<_qK9NcCt&N8cBV#B8o2QwDdEww0xN#oE2}U>SX{x_5{&X-Q>~{j1WT}B|CDQ| zM(3qId}>HEAt{GyAmm9ri?N|%Yz0<iXsa_uqHZykY{2&P<h5Tt{gB!w#1M?3Di;HE zr!Y>q@etg&Lnp>tBGED6$QlHE5GyzEL{fzVhHf0gqZHtaUB)&F@KINckDgH^!>^N{ zH<0IHz6dP<i!KzPq3#q~-s`=a>(D+t%;f?I)GdaPxP3kbT=iNJ2AYA_&I<OAnV~XQ zHEGi5h`y`*J&}c0ZtPbW3q+r>n{ZSXD2;3fWSmxZrgcn`0Mehaq{i4N<YNr4q|Vsx z*d3-CiR>&_QJh18k1sExxP;;gimNEDqxeNSX%C}T^Acugybi*qwt4)g^&Y5>6->n~ zsQ-~)B|gb~*Z-u}gK8`DUTRkk;b=eI#v5x!p$C^vKGk1Poz78-1eo{E`c>{MfIKVB z&5vUJ_U##{3pv)Ek>lp3i;k~*i-0g^w3}fe7VOU_x<Z=Kv3wu)XYZD0*}r8rojDH{ zK%R}>=6^7Bc0OJJbVib!`(@G$@N^N-pD>+fh1{S=p4pm#x|kD*DZ$Abuq>C7F!OKW z83mMt`cAWgtk@glKN<KSVvI=)GKqh>5-Z%^5uQr#iR<%#68lNYs?TswjDH_C%*Hhf F>JMNA_7ngB diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/markers.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/markers.cpython-38.pyc deleted file mode 100644 index fedf61d0fbb4e654adb2b1527b34007d86642f77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8933 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/requirements.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/requirements.cpython-38.pyc deleted file mode 100644 index 8abbcbc3e70066f0ba4e79cc573bc9083f300d65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4031 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 GY2&|pZ4Ax; diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc deleted file mode 100644 index 006c969d47e75e138abacce751b66e94b947bab7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19782 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∋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 IXkqfd0WJ>VM*si- diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/utils.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/utils.cpython-38.pyc deleted file mode 100644 index fae3473ff679efccbb2ceb8730db1f4f9b799c49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1483 zcmbVM%Z?*86t!KIs-!x}JVCRVMF9gt)TFA>Y(Q$YkU%5Bq8B^{2n?m_*h!qO*Vs<F z6Ve-oFW?K3WpDTn#3y)*gfzQZ&j#+T&O91e;l!tG-{V{NSzmQJ0fF(`U%elmHVF9x zH?Ix{HXp&%p8;^fX-0B7pg9|`+!;6&&sgRTT<&l;YvkU*%l&~*iE!6V-q_GVi+kMv znG6En<SlsaaP|f11y4X9={fdFdZf#2W<(<Ms#L}{xtvQa%ffamB@2^`X2sCJ{_qLK zE6jF3E#_$^`2(S9p1)lzz3=)-^l*2GyypYgF3gW%>Z<^TtSP4}vSDksAz%tSd`A0V z$&F-~7G)uapnEA2CC1{^I(l|w8(DcGRF7J>NON&cR0s4to5zzf7qOZMBZ^YR_cK{l zpT{G7sQwt3@mv)1IFm<lwJ?*ixEFm8YiUHkN{7ekSm?NtRsa1DqrK=}zgmDe65}x* z#tB^Ip!9+%i*Y<NGSgADu-7h`i57LyHwHkMx&nA90C<i$t^@EC7R$CFEAp70k*`T{ z%O!>$2kH(b_*)T=d<#MOhK$J>1Zm1RJ$BUn6<s@=tzA6X&<zD9oS4Si!@Tpx+P}y$ z$eW*lZs0gIi%eU*dE8RJ)EZpiwXhn1*V^(>7nwqJ0PEM971Zwuw(lX+om%#LE!(MO zJ1=DITJ~oxYuB>&g^a_yR$vDtxU>8z2w{9VkvfF`T&P8;WiGQ+g{BO*<r5`|HY!Qp z3y)?doTNG|3lT#8O(sGvM<by`F%-Jibt26qG!qe?q>E4@z2KS9^^p>pNHts)<6IOb zsxK%k#HIV=-q{;V|K0DSz25E}ODv84l`L#Ijq`PY6?xb_qmVHAm_C36Jz^Zvb50M> zDb%J>=ghKb&(hPnCNBWX!M66tq7bK*I=G9vumxPg$nx%`>VZ&T3q|``31zPjq8GOg z|BqejI=n{RKzI!S`{bof>K1HwVZOAc8C9h=5R|1KaWTh*y9?OsC?D^70Jb5jayYSG zT2;^#)*F>7PmN_tC@gI2PD@!>e;an|R7zME^;!pXV)ue?@ZIpY-r7c$Dx?2loxS;A zkwIVdn*hXPv`xD#V6GF;>+U;%w{i7+GW9mFdTkpd@X0bWC6Yv8^C?WI!UU+>2yY>v vW3`LcAC`F~Goe~|gzZ}^dd0drigi+(`+3P{nK(dg8lAt%n(V3*IL*f2)HiMA diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/version.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__pycache__/version.cpython-38.pyc deleted file mode 100644 index 51b6d610a80650c151284e598542d9cb4c616def..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12113 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 F{|^SOUkU&K diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_compat.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_compat.py deleted file mode 100644 index 25da473..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_compat.py +++ /dev/null @@ -1,31 +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. -from __future__ import absolute_import, division, print_function - -import sys - - -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 - -# flake8: noqa - -if PY3: - string_types = (str,) -else: - string_types = (basestring,) - - -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(meta): - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - - return type.__new__(metaclass, "temporary_class", (), {}) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_structures.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_structures.py deleted file mode 100644 index 68dcca6..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_structures.py +++ /dev/null @@ -1,68 +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. -from __future__ import absolute_import, division, print_function - - -class Infinity(object): - def __repr__(self): - return "Infinity" - - def __hash__(self): - return hash(repr(self)) - - def __lt__(self, other): - return False - - def __le__(self, other): - return False - - def __eq__(self, other): - return isinstance(other, self.__class__) - - def __ne__(self, other): - return not isinstance(other, self.__class__) - - def __gt__(self, other): - return True - - def __ge__(self, other): - return True - - def __neg__(self): - return NegativeInfinity - - -Infinity = Infinity() - - -class NegativeInfinity(object): - def __repr__(self): - return "-Infinity" - - def __hash__(self): - return hash(repr(self)) - - def __lt__(self, other): - return True - - def __le__(self, other): - return True - - def __eq__(self, other): - return isinstance(other, self.__class__) - - def __ne__(self, other): - return not isinstance(other, self.__class__) - - def __gt__(self, other): - return False - - def __ge__(self, other): - return False - - def __neg__(self): - return Infinity - - -NegativeInfinity = NegativeInfinity() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/markers.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/markers.py deleted file mode 100644 index 5482476..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/markers.py +++ /dev/null @@ -1,296 +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. -from __future__ import absolute_import, division, print_function - -import operator -import os -import platform -import sys - -from pip._vendor.pyparsing import ParseException, ParseResults, stringStart, stringEnd -from pip._vendor.pyparsing import ZeroOrMore, Group, Forward, QuotedString -from pip._vendor.pyparsing import Literal as L # noqa - -from ._compat import string_types -from .specifiers import Specifier, InvalidSpecifier - - -__all__ = [ - "InvalidMarker", - "UndefinedComparison", - "UndefinedEnvironmentName", - "Marker", - "default_environment", -] - - -class InvalidMarker(ValueError): - """ - An invalid marker was found, users should refer to PEP 508. - """ - - -class UndefinedComparison(ValueError): - """ - An invalid operation was attempted on a value that doesn't support it. - """ - - -class UndefinedEnvironmentName(ValueError): - """ - A name was attempted to be used that does not exist inside of the - environment. - """ - - -class Node(object): - def __init__(self, value): - self.value = value - - def __str__(self): - return str(self.value) - - def __repr__(self): - return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) - - def serialize(self): - raise NotImplementedError - - -class Variable(Node): - def serialize(self): - return str(self) - - -class Value(Node): - def serialize(self): - return '"{0}"'.format(self) - - -class Op(Node): - def serialize(self): - 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") - | L("sys.platform") # PEP-345 - | L("platform.version") # PEP-345 - | L("platform.machine") # PEP-345 - | L("platform.python_implementation") # PEP-345 - | L("python_implementation") # PEP-345 - | L("extra") # undocumented setuptools legacy -) -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]))) - -VERSION_CMP = ( - L("===") | L("==") | L(">=") | L("<=") | L("!=") | L("~=") | L(">") | L("<") -) - -MARKER_OP = VERSION_CMP | L("not in") | L("in") -MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) - -MARKER_VALUE = QuotedString("'") | QuotedString('"') -MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) - -BOOLOP = L("and") | L("or") - -MARKER_VAR = VARIABLE | MARKER_VALUE - -MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) -MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) - -LPAREN = L("(").suppress() -RPAREN = L(")").suppress() - -MARKER_EXPR = Forward() -MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) -MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) - -MARKER = stringStart + MARKER_EXPR + stringEnd - - -def _coerce_parse_result(results): - if isinstance(results, ParseResults): - return [_coerce_parse_result(i) for i in results] - else: - return results - - -def _format_marker(marker, first=True): - assert isinstance(marker, (list, tuple, string_types)) - - # Sometimes we have a structure like [[...]] which is a single item list - # where the single item is itself it's own list. In that case we want skip - # the rest of this function so that we don't get extraneous () on the - # outside. - if ( - isinstance(marker, list) - and len(marker) == 1 - and isinstance(marker[0], (list, tuple)) - ): - return _format_marker(marker[0]) - - if isinstance(marker, list): - inner = (_format_marker(m, first=False) for m in marker) - if first: - return " ".join(inner) - else: - return "(" + " ".join(inner) + ")" - elif isinstance(marker, tuple): - return " ".join([m.serialize() for m in marker]) - else: - return marker - - -_operators = { - "in": lambda lhs, rhs: lhs in rhs, - "not in": lambda lhs, rhs: lhs not in rhs, - "<": operator.lt, - "<=": operator.le, - "==": operator.eq, - "!=": operator.ne, - ">=": operator.ge, - ">": operator.gt, -} - - -def _eval_op(lhs, op, rhs): - try: - spec = Specifier("".join([op.serialize(), rhs])) - except InvalidSpecifier: - pass - else: - return spec.contains(lhs) - - oper = _operators.get(op.serialize()) - if oper is None: - raise UndefinedComparison( - "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) - ) - - return oper(lhs, rhs) - - -_undefined = object() - - -def _get_env(environment, name): - value = environment.get(name, _undefined) - - if value is _undefined: - raise UndefinedEnvironmentName( - "{0!r} does not exist in evaluation environment.".format(name) - ) - - return value - - -def _evaluate_markers(markers, environment): - groups = [[]] - - for marker in markers: - assert isinstance(marker, (list, tuple, string_types)) - - if isinstance(marker, list): - groups[-1].append(_evaluate_markers(marker, environment)) - elif isinstance(marker, tuple): - lhs, op, rhs = marker - - if isinstance(lhs, Variable): - lhs_value = _get_env(environment, lhs.value) - rhs_value = rhs.value - else: - lhs_value = lhs.value - rhs_value = _get_env(environment, rhs.value) - - groups[-1].append(_eval_op(lhs_value, op, rhs_value)) - else: - assert marker in ["and", "or"] - if marker == "or": - groups.append([]) - - return any(all(item) for item in groups) - - -def format_full_version(info): - version = "{0.major}.{0.minor}.{0.micro}".format(info) - kind = info.releaselevel - if kind != "final": - version += kind[0] + str(info.serial) - return version - - -def default_environment(): - if hasattr(sys, "implementation"): - iver = format_full_version(sys.implementation.version) - implementation_name = sys.implementation.name - else: - iver = "0" - implementation_name = "" - - return { - "implementation_name": implementation_name, - "implementation_version": iver, - "os_name": os.name, - "platform_machine": platform.machine(), - "platform_release": platform.release(), - "platform_system": platform.system(), - "platform_version": platform.version(), - "python_full_version": platform.python_version(), - "platform_python_implementation": platform.python_implementation(), - "python_version": platform.python_version()[:3], - "sys_platform": sys.platform, - } - - -class Marker(object): - def __init__(self, marker): - try: - self._markers = _coerce_parse_result(MARKER.parseString(marker)) - except ParseException as e: - err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( - marker, marker[e.loc : e.loc + 8] - ) - raise InvalidMarker(err_str) - - def __str__(self): - return _format_marker(self._markers) - - def __repr__(self): - return "<Marker({0!r})>".format(str(self)) - - def evaluate(self, environment=None): - """Evaluate a marker. - - Return the boolean from evaluating the given marker against the - environment. environment is an optional argument to override all or - part of the determined environment. - - The environment is determined from the current Python process. - """ - current_environment = default_environment() - if environment is not None: - current_environment.update(environment) - - return _evaluate_markers(self._markers, current_environment) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/requirements.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/requirements.py deleted file mode 100644 index dbc5f11..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/requirements.py +++ /dev/null @@ -1,138 +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. -from __future__ import absolute_import, division, print_function - -import string -import re - -from pip._vendor.pyparsing import stringStart, stringEnd, originalTextFor, ParseException -from pip._vendor.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine -from pip._vendor.pyparsing import Literal as L # noqa -from pip._vendor.six.moves.urllib import parse as urlparse - -from .markers import MARKER_EXPR, Marker -from .specifiers import LegacySpecifier, Specifier, SpecifierSet - - -class InvalidRequirement(ValueError): - """ - An invalid requirement was found, users should refer to PEP 508. - """ - - -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(object): - """Parse a requirement. - - Parse a given requirement string into its parts, such as name, specifier, - URL, and extras. Raises InvalidRequirement on a badly-formed requirement - string. - """ - - # TODO: Can we test whether something is contained within a requirement? - # If so how do we do that? Do we need to test against the _name_ of - # the thing as well as the version? What about the markers? - # TODO: Can we normalize the name and extra name? - - def __init__(self, requirement_string): - try: - req = REQUIREMENT.parseString(requirement_string) - except ParseException as e: - raise InvalidRequirement( - 'Parse error at "{0!r}": {1}'.format( - requirement_string[e.loc : e.loc + 8], e.msg - ) - ) - - self.name = req.name - if req.url: - parsed_url = urlparse.urlparse(req.url) - if parsed_url.scheme == "file": - if urlparse.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("Invalid URL: {0}".format(req.url)) - self.url = req.url - else: - self.url = None - self.extras = set(req.extras.asList() if req.extras else []) - self.specifier = SpecifierSet(req.specifier) - self.marker = req.marker if req.marker else None - - def __str__(self): - parts = [self.name] - - if self.extras: - parts.append("[{0}]".format(",".join(sorted(self.extras)))) - - if self.specifier: - parts.append(str(self.specifier)) - - if self.url: - parts.append("@ {0}".format(self.url)) - if self.marker: - parts.append(" ") - - if self.marker: - parts.append("; {0}".format(self.marker)) - - return "".join(parts) - - def __repr__(self): - return "<Requirement({0!r})>".format(str(self)) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/specifiers.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/specifiers.py deleted file mode 100644 index 743576a..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/specifiers.py +++ /dev/null @@ -1,749 +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. -from __future__ import absolute_import, division, print_function - -import abc -import functools -import itertools -import re - -from ._compat import string_types, with_metaclass -from .version import Version, LegacyVersion, parse - - -class InvalidSpecifier(ValueError): - """ - An invalid specifier was found, users should refer to PEP 440. - """ - - -class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): - @abc.abstractmethod - def __str__(self): - """ - Returns the str representation of this Specifier like object. This - should be representative of the Specifier itself. - """ - - @abc.abstractmethod - def __hash__(self): - """ - Returns a hash value for this Specifier like object. - """ - - @abc.abstractmethod - def __eq__(self, other): - """ - Returns a boolean representing whether or not the two Specifier like - objects are equal. - """ - - @abc.abstractmethod - def __ne__(self, other): - """ - Returns a boolean representing whether or not the two Specifier like - objects are not equal. - """ - - @abc.abstractproperty - def prereleases(self): - """ - Returns whether or not pre-releases as a whole are allowed by this - specifier. - """ - - @prereleases.setter - def prereleases(self, value): - """ - Sets whether or not pre-releases as a whole are allowed by this - specifier. - """ - - @abc.abstractmethod - def contains(self, item, prereleases=None): - """ - Determines if the given item is contained within this specifier. - """ - - @abc.abstractmethod - def filter(self, iterable, prereleases=None): - """ - 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 = {} - - def __init__(self, spec="", prereleases=None): - match = self._regex.search(spec) - if not match: - raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) - - self._spec = (match.group("operator").strip(), match.group("version").strip()) - - # Store whether or not this Specifier should accept prereleases - self._prereleases = prereleases - - def __repr__(self): - pre = ( - ", prereleases={0!r}".format(self.prereleases) - if self._prereleases is not None - else "" - ) - - return "<{0}({1!r}{2})>".format(self.__class__.__name__, str(self), pre) - - def __str__(self): - return "{0}{1}".format(*self._spec) - - def __hash__(self): - return hash(self._spec) - - def __eq__(self, other): - if isinstance(other, string_types): - try: - other = self.__class__(other) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._spec == other._spec - - def __ne__(self, other): - if isinstance(other, string_types): - try: - other = self.__class__(other) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._spec != other._spec - - def _get_operator(self, op): - return getattr(self, "_compare_{0}".format(self._operators[op])) - - def _coerce_version(self, version): - if not isinstance(version, (LegacyVersion, Version)): - version = parse(version) - return version - - @property - def operator(self): - return self._spec[0] - - @property - def version(self): - return self._spec[1] - - @property - def prereleases(self): - return self._prereleases - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - def __contains__(self, item): - return self.contains(item) - - def contains(self, item, prereleases=None): - # 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") - 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 item.is_prerelease and not prereleases: - return False - - # Actually do the comparison to determine if this item is contained - # within this Specifier or not. - return self._get_operator(self.operator)(item, self.version) - - def filter(self, iterable, prereleases=None): - 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 incase 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 _coerce_version(self, version): - if not isinstance(version, LegacyVersion): - version = LegacyVersion(str(version)) - return version - - def _compare_equal(self, prospective, spec): - return prospective == self._coerce_version(spec) - - def _compare_not_equal(self, prospective, spec): - return prospective != self._coerce_version(spec) - - def _compare_less_than_equal(self, prospective, spec): - return prospective <= self._coerce_version(spec) - - def _compare_greater_than_equal(self, prospective, spec): - return prospective >= self._coerce_version(spec) - - def _compare_less_than(self, prospective, spec): - return prospective < self._coerce_version(spec) - - def _compare_greater_than(self, prospective, spec): - return prospective > self._coerce_version(spec) - - -def _require_version_compare(fn): - @functools.wraps(fn) - def wrapped(self, prospective, spec): - if not isinstance(prospective, Version): - return False - return fn(self, prospective, spec) - - return wrapped - - -class Specifier(_IndividualSpecifier): - - _regex_str = r""" - (?P<operator>(~=|==|!=|<=|>=|<|>|===)) - (?P<version> - (?: - # The identity operators allow for an escape hatch that will - # do an exact string match of the version you wish to install. - # This will not be parsed by PEP 440 and we cannot determine - # any semantic meaning from it. This operator is discouraged - # 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. - ) - | - (?: - # The (non)equality operators allow for wild card and local - # versions to be specified so we have to define these two - # operators separately to enable that. - (?<===|!=) # Only match for equals and not equals - - \s* - 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. - (?: - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local - | - \.\* # Wild card syntax of .* - )? - ) - | - (?: - # The compatible operator requires at least two digits in the - # release segment. - (?<=~=) # Only match for the compatible operator - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - | - (?: - # All other operators only allow a sub set of what the - # (non)equality operators do. Specifically they do not allow - # local versions to be specified nor do they allow the prefix - # matching wild cards. - (?<!==|!=|~=) # We have special cases for these - # operators so we want to make sure they - # don't match here. - - \s* - 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]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - ) - """ - - _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) - - _operators = { - "~=": "compatible", - "==": "equal", - "!=": "not_equal", - "<=": "less_than_equal", - ">=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - "===": "arbitrary", - } - - @_require_version_compare - def _compare_compatible(self, prospective, spec): - # 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 - # implementing it ourselves. The only thing we need to do is construct - # the other specifiers. - - # We want everything but the last item in the version, but we want to - # ignore post and dev releases and we want to treat the pre-release as - # it's own separate segment. - prefix = ".".join( - list( - itertools.takewhile( - lambda x: (not x.startswith("post") and not x.startswith("dev")), - _version_split(spec), - ) - )[:-1] - ) - - # Add the prefix notation to the end of our string - prefix += ".*" - - return self._get_operator(">=")(prospective, spec) and self._get_operator("==")( - prospective, prefix - ) - - @_require_version_compare - def _compare_equal(self, prospective, spec): - # 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. - spec = _version_split(spec[:-2]) # Remove the trailing .* - - # 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. - prospective = _version_split(str(prospective)) - - # 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. - prospective = prospective[: len(spec)] - - # Pad out our two sides with zeros so that they both equal the same - # length. - spec, prospective = _pad_version(spec, prospective) - else: - # Convert our spec string into a Version - spec = Version(spec) - - # If the specifier does not have a local segment, then we want to - # act as if the prospective version also does not have a local - # segment. - if not spec.local: - prospective = Version(prospective.public) - - return prospective == spec - - @_require_version_compare - def _compare_not_equal(self, prospective, spec): - return not self._compare_equal(prospective, spec) - - @_require_version_compare - def _compare_less_than_equal(self, prospective, spec): - return prospective <= Version(spec) - - @_require_version_compare - def _compare_greater_than_equal(self, prospective, spec): - return prospective >= Version(spec) - - @_require_version_compare - def _compare_less_than(self, prospective, spec): - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec) - - # Check to see if the prospective version is less than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective < spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a pre-release version, that we do not accept pre-release - # versions for the version mentioned in the specifier (e.g. <3.1 should - # not match 3.1.dev0, but should match 3.0.dev0). - if not spec.is_prerelease and prospective.is_prerelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # less than the spec version *and* it's not a pre-release of the same - # version in the spec. - return True - - @_require_version_compare - def _compare_greater_than(self, prospective, spec): - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec) - - # Check to see if the prospective version is greater than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective > spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a post-release version, that we do not accept - # post-release versions for the version mentioned in the specifier - # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). - if not spec.is_postrelease and prospective.is_postrelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # Ensure that we do not allow a local version of the version mentioned - # in the specifier, which is technically greater than, to match. - if prospective.local is not None: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # greater than the spec version *and* it's not a pre-release of the - # same version in the spec. - return True - - def _compare_arbitrary(self, prospective, spec): - return str(prospective).lower() == str(spec).lower() - - @property - def prereleases(self): - # 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 parse(version).is_prerelease: - return True - - return False - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - -_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") - - -def _version_split(version): - result = [] - for item in version.split("."): - match = _prefix_regex.search(item) - if match: - result.extend(match.groups()) - else: - result.append(item) - return result - - -def _pad_version(left, right): - left_split, right_split = [], [] - - # Get the release segment of our versions - left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) - right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) - - # Get the rest of our versions - left_split.append(left[len(left_split[0]) :]) - right_split.append(right[len(right_split[0]) :]) - - # Insert our padding - 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))) - - -class SpecifierSet(BaseSpecifier): - def __init__(self, specifiers="", prereleases=None): - # Split on , to break each indidivual specifier into it's own item, and - # strip each item to remove leading/trailing whitespace. - 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() - for specifier in 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) - - # Store our prereleases value so we can use it later to determine if - # we accept prereleases or not. - self._prereleases = prereleases - - def __repr__(self): - pre = ( - ", prereleases={0!r}".format(self.prereleases) - if self._prereleases is not None - else "" - ) - - return "<SpecifierSet({0!r}{1})>".format(str(self), pre) - - def __str__(self): - return ",".join(sorted(str(s) for s in self._specs)) - - def __hash__(self): - return hash(self._specs) - - def __and__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - specifier = SpecifierSet() - specifier._specs = frozenset(self._specs | other._specs) - - if self._prereleases is None and other._prereleases is not None: - specifier._prereleases = other._prereleases - elif self._prereleases is not None and other._prereleases is None: - specifier._prereleases = self._prereleases - elif self._prereleases == other._prereleases: - specifier._prereleases = self._prereleases - else: - raise ValueError( - "Cannot combine SpecifierSets with True and False prerelease " - "overrides." - ) - - return specifier - - def __eq__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif isinstance(other, _IndividualSpecifier): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs == other._specs - - def __ne__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif isinstance(other, _IndividualSpecifier): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs != other._specs - - def __len__(self): - return len(self._specs) - - def __iter__(self): - return iter(self._specs) - - @property - def prereleases(self): - # 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): - self._prereleases = value - - def __contains__(self, item): - return self.contains(item) - - def contains(self, item, prereleases=None): - # Ensure that our item is a Version or LegacyVersion instance. - if not isinstance(item, (LegacyVersion, Version)): - item = parse(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 - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # We can determine if we're going to allow pre-releases by looking to - # see if any of the underlying items supports them. If none of them do - # and this item is a pre-release then we do not allow it and we can - # short circuit that here. - # Note: This means that 1.0.dev1 would not be contained in something - # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 - if not prereleases and item.is_prerelease: - return False - - # 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 - # will always return True, this is an explicit design decision. - return all(s.contains(item, prereleases=prereleases) for s in self._specs) - - def filter(self, iterable, prereleases=None): - # 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. - if prereleases is None: - prereleases = self.prereleases - - # If we have any specifiers, then we want to wrap our iterable in the - # filter method for each one, this will act as a logical AND amongst - # each specifier. - if self._specs: - for spec in self._specs: - iterable = spec.filter(iterable, prereleases=bool(prereleases)) - return 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. - else: - filtered = [] - found_prereleases = [] - - 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 - - # Store any item which is a pre-release for later unless we've - # already found a final version or we are accepting prereleases - if parsed_version.is_prerelease and not prereleases: - if not filtered: - found_prereleases.append(item) - else: - filtered.append(item) - - # 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 filtered diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/utils.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/utils.py deleted file mode 100644 index 8841878..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/utils.py +++ /dev/null @@ -1,57 +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. -from __future__ import absolute_import, division, print_function - -import re - -from .version import InvalidVersion, Version - - -_canonicalize_regex = re.compile(r"[-_.]+") - - -def canonicalize_name(name): - # This is taken from PEP 503. - return _canonicalize_regex.sub("-", name).lower() - - -def canonicalize_version(version): - """ - This is very similar to Version.__str__, but has one subtle differences - with the way it handles the release segment. - """ - - try: - version = Version(version) - except InvalidVersion: - # Legacy versions cannot be normalized - return version - - parts = [] - - # Epoch - if version.epoch != 0: - parts.append("{0}!".format(version.epoch)) - - # Release segment - # NB: This strips trailing '.0's to normalize - parts.append(re.sub(r"(\.0)+$", "", ".".join(str(x) for x in version.release))) - - # Pre-release - if version.pre is not None: - parts.append("".join(str(x) for x in version.pre)) - - # Post-release - if version.post is not None: - parts.append(".post{0}".format(version.post)) - - # Development release - if version.dev is not None: - parts.append(".dev{0}".format(version.dev)) - - # Local version segment - if version.local is not None: - parts.append("+{0}".format(version.local)) - - return "".join(parts) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/version.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/version.py deleted file mode 100644 index 95157a1..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/version.py +++ /dev/null @@ -1,420 +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. -from __future__ import absolute_import, division, print_function - -import collections -import itertools -import re - -from ._structures import Infinity - - -__all__ = ["parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"] - - -_Version = collections.namedtuple( - "_Version", ["epoch", "release", "dev", "pre", "post", "local"] -) - - -def parse(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. - """ - try: - return Version(version) - except InvalidVersion: - return LegacyVersion(version) - - -class InvalidVersion(ValueError): - """ - An invalid version was found, users should refer to PEP 440. - """ - - -class _BaseVersion(object): - def __hash__(self): - return hash(self._key) - - def __lt__(self, other): - return self._compare(other, lambda s, o: s < o) - - def __le__(self, other): - return self._compare(other, lambda s, o: s <= o) - - def __eq__(self, other): - return self._compare(other, lambda s, o: s == o) - - def __ge__(self, other): - return self._compare(other, lambda s, o: s >= o) - - def __gt__(self, other): - return self._compare(other, lambda s, o: s > o) - - def __ne__(self, other): - return self._compare(other, lambda s, o: s != o) - - def _compare(self, other, method): - if not isinstance(other, _BaseVersion): - return NotImplemented - - return method(self._key, other._key) - - -class LegacyVersion(_BaseVersion): - def __init__(self, version): - self._version = str(version) - self._key = _legacy_cmpkey(self._version) - - def __str__(self): - return self._version - - def __repr__(self): - return "<LegacyVersion({0})>".format(repr(str(self))) - - @property - def public(self): - return self._version - - @property - def base_version(self): - return self._version - - @property - def epoch(self): - return -1 - - @property - def release(self): - return None - - @property - def pre(self): - return None - - @property - def post(self): - return None - - @property - def dev(self): - return None - - @property - def local(self): - return None - - @property - def is_prerelease(self): - return False - - @property - def is_postrelease(self): - return False - - @property - def is_devrelease(self): - 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): - 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): - # 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 = [] - 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) - parts = tuple(parts) - - return epoch, 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""" - 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_n>[0-9]+)? - )? - (?P<post> # post release - (?:-(?P<post_n1>[0-9]+)) - | - (?: - [-_\.]? - (?P<post_l>post|rev|r) - [-_\.]? - (?P<post_n2>[0-9]+)? - ) - )? - (?P<dev> # dev release - [-_\.]? - (?P<dev_l>dev) - [-_\.]? - (?P<dev_n>[0-9]+)? - )? - ) - (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version -""" - - -class Version(_BaseVersion): - - _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE) - - def __init__(self, version): - # Validate the version and parse it into pieces - match = self._regex.search(version) - if not match: - raise InvalidVersion("Invalid version: '{0}'".format(version)) - - # Store the parsed out pieces of the version - self._version = _Version( - epoch=int(match.group("epoch")) if match.group("epoch") else 0, - release=tuple(int(i) for i in match.group("release").split(".")), - pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")), - post=_parse_letter_version( - match.group("post_l"), match.group("post_n1") or match.group("post_n2") - ), - dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")), - local=_parse_local_version(match.group("local")), - ) - - # Generate a key which will be used for sorting - self._key = _cmpkey( - self._version.epoch, - self._version.release, - self._version.pre, - self._version.post, - self._version.dev, - self._version.local, - ) - - def __repr__(self): - return "<Version({0})>".format(repr(str(self))) - - def __str__(self): - parts = [] - - # Epoch - if self.epoch != 0: - parts.append("{0}!".format(self.epoch)) - - # Release segment - parts.append(".".join(str(x) for x in self.release)) - - # Pre-release - if self.pre is not None: - parts.append("".join(str(x) for x in self.pre)) - - # Post-release - if self.post is not None: - parts.append(".post{0}".format(self.post)) - - # Development release - if self.dev is not None: - parts.append(".dev{0}".format(self.dev)) - - # Local version segment - if self.local is not None: - parts.append("+{0}".format(self.local)) - - return "".join(parts) - - @property - def epoch(self): - return self._version.epoch - - @property - def release(self): - return self._version.release - - @property - def pre(self): - return self._version.pre - - @property - def post(self): - return self._version.post[1] if self._version.post else None - - @property - def dev(self): - return self._version.dev[1] if self._version.dev else None - - @property - def local(self): - if self._version.local: - return ".".join(str(x) for x in self._version.local) - else: - return None - - @property - def public(self): - return str(self).split("+", 1)[0] - - @property - def base_version(self): - parts = [] - - # Epoch - if self.epoch != 0: - parts.append("{0}!".format(self.epoch)) - - # Release segment - parts.append(".".join(str(x) for x in self.release)) - - return "".join(parts) - - @property - def is_prerelease(self): - return self.dev is not None or self.pre is not None - - @property - def is_postrelease(self): - return self.post is not None - - @property - def is_devrelease(self): - return self.dev is not None - - -def _parse_letter_version(letter, number): - if letter: - # We consider there to be an implicit 0 in a pre-release if there is - # not a numeral associated with it. - if number is None: - number = 0 - - # We normalize any letters to their lower case form - letter = letter.lower() - - # We consider some words to be alternate spellings of other words and - # in those cases we want to normalize the spellings to our preferred - # spelling. - if letter == "alpha": - letter = "a" - elif letter == "beta": - letter = "b" - elif letter in ["c", "pre", "preview"]: - letter = "rc" - elif letter in ["rev", "r"]: - letter = "post" - - return letter, int(number) - if not letter and number: - # We assume if we are given a number, but we are not given a letter - # then this is using the implicit post release syntax (e.g. 1.0-1) - letter = "post" - - return letter, int(number) - - -_local_version_separators = re.compile(r"[\._-]") - - -def _parse_local_version(local): - """ - Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). - """ - if local is not None: - return tuple( - part.lower() if not part.isdigit() else int(part) - for part in _local_version_separators.split(local) - ) - - -def _cmpkey(epoch, release, pre, post, dev, local): - # 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 - # re-reverse it back into the correct order and make it a tuple and use - # that for our sorting key. - release = tuple( - reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release)))) - ) - - # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. - # We'll do this by abusing the pre segment, but we _only_ want to do this - # 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 = -Infinity - # Versions without a pre-release (except as noted above) should sort after - # those with one. - elif pre is None: - pre = Infinity - - # Versions without a post segment should sort before those with one. - if post is None: - post = -Infinity - - # Versions without a development segment should sort after those with one. - if dev is None: - dev = Infinity - - if local is None: - # Versions without a local segment should sort before those with one. - local = -Infinity - else: - # Versions with a local segment need that segment parsed to implement - # the sorting rules in PEP440. - # - Alpha numeric segments sort before numeric segments - # - Alpha numeric segments sort lexicographically - # - Numeric segments sort numerically - # - Shorter versions sort before longer versions when the prefixes - # match exactly - local = tuple((i, "") if isinstance(i, int) else (-Infinity, i) for i in local) - - return epoch, release, pre, post, dev, local diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__init__.py deleted file mode 100644 index 9c1a098..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Wrappers to build Python packages using PEP 517 hooks -""" - -__version__ = '0.5.0' diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index d9b3b0a7a0bf41bbf23a6cfdf1fc757d134c0446..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmYjN+e*Vg5Y0tVs{Mz3%|mumO1*%HFZw9K3ql_p((alpO?QXgB#{1*f6{NrtAF8( zP6~npbA~eq&Kc%)I-LYm`=8|fh33~t{#Qukj@q9S$Y2@Ba2d+zIY{E&#hWV-mGi8z zY}M*ovb=99YZw;mO;IY(TCYvX^81`EW|yq8cH<|z<BTtO_LxM&34pX~fZ+_FBO`4M zz-QoM3Om4eCn~#D!d0qK#yas(Ys4q<F%FlO1!<i!ov8In;30g@uY}i)O8<@!s4<;g t^Ni0^>`CUTEXSpwOe4t@71DVEKpWivaO{WEo2`{?t!~E$_=w;r{sm@5R%rkL diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__pycache__/compat.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__pycache__/compat.cpython-38.pyc deleted file mode 100644 index badee03158bc230ac355f62e05a934a41d497a63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1023 zcma)3O>fgc5Zzrni5uDy5EQr|Un4bk+fWgt3Lzm?6-WVEs-hgQoa`oXKD?{7n<ywf z!4-Ps3gVQ1!f)6sr~ZXrV8#hhRa9c7dE=Sg^}K!WaAl=PV155temiD_{J`Skf*yGS zk?a9*(jc62HlPifW!7MV^(;>B5pMN!`T@6j?gMGqJkJY|b8(3~i_X%#!`T5T7vJsd zg)tupSBsEGamR(q9qTB??`H=u>TVRfhp%@lwRKm<?#oHqg;dRsZFy(Fh1Ab1z!nnx zy=?ecf_M&*cmOGxW<<I5(K=l_u~OP&Q!=&MY|1`SN{+}jc}4cg8+aPfvg?M9&vVCV zyHcA`<A}H=k=@KPwp1cEb}x~D{CKElwy|WhXKWRwU6b#RL)}RXZO@1<!Q}JQ@5-U@ zbyuV!mfGJPL`v=ZZA`k-31M#};*mdyn!d`OSM_Rs5~ZS|!d5@*h{RWss%$>;HoR&@ zO<>y-oennr0IqWQsS;{?^P%68Ltx>li7BFnB0!o26af_>v_$ny$SsQ1Vxewm{Zoi! z0|2zj%+0jAdqPwCg-z*KdPLYlrEj3oCAGB12|5Qbv$TWXXn?T?GUPL+SFm#(0Y#a^ z4Lq=f#%DaQLHU>G9jLDMbPIOpp1x<N_b>X%8Mh)jWuLF`m5rM^54Y!hQ5%heFVV_m zLVgQE%k*l^*5TM(GvM++da=4;x~XsB*tLJm#;4zg_%pklH-#YJvK0h#Rjp)_nB|es sNhISSirX?HtnucBmt<0BDmyzv$&Ux(F*={D0@&1{4qIi8UCcZ7FA(0;cmMzZ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__pycache__/wrappers.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__pycache__/wrappers.cpython-38.pyc deleted file mode 100644 index e8cf1de045d257e98ce7b92b8a60c45e66ea9f78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5563 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/_in_process.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/_in_process.py deleted file mode 100644 index d6524b6..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/_in_process.py +++ /dev/null @@ -1,207 +0,0 @@ -"""This is invoked in a subprocess to call the build backend hooks. - -It expects: -- Command line args: hook_name, control_dir -- Environment variable: PEP517_BUILD_BACKEND=entry.point:spec -- control_dir/input.json: - - {"kwargs": {...}} - -Results: -- control_dir/output.json - - {"return_val": ...} -""" -from glob import glob -from importlib import import_module -import os -from os.path import join as pjoin -import re -import shutil -import sys - -# This is run as a script, not a module, so it can't do a relative import -import compat - - -class BackendUnavailable(Exception): - """Raised if we cannot import the backend""" - - -def _build_backend(): - """Find and load the build backend""" - ep = os.environ['PEP517_BUILD_BACKEND'] - mod_path, _, obj_path = ep.partition(':') - try: - obj = import_module(mod_path) - except ImportError: - raise BackendUnavailable - if obj_path: - for path_part in obj_path.split('.'): - obj = getattr(obj, path_part) - return obj - - -def get_requires_for_build_wheel(config_settings): - """Invoke the optional get_requires_for_build_wheel hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_wheel - except AttributeError: - return [] - else: - return hook(config_settings) - - -def prepare_metadata_for_build_wheel(metadata_directory, config_settings): - """Invoke optional prepare_metadata_for_build_wheel - - Implements a fallback by building a wheel if the hook isn't defined. - """ - backend = _build_backend() - try: - hook = backend.prepare_metadata_for_build_wheel - except AttributeError: - return _get_wheel_metadata_from_wheel(backend, metadata_directory, - config_settings) - else: - return hook(metadata_directory, config_settings) - - -WHEEL_BUILT_MARKER = 'PEP517_ALREADY_BUILT_WHEEL' - - -def _dist_info_files(whl_zip): - """Identify the .dist-info folder inside a wheel ZipFile.""" - res = [] - for path in whl_zip.namelist(): - m = re.match(r'[^/\\]+-[^/\\]+\.dist-info/', path) - if m: - res.append(path) - if res: - return res - raise Exception("No .dist-info folder found in wheel") - - -def _get_wheel_metadata_from_wheel( - backend, metadata_directory, config_settings): - """Build a wheel and extract the metadata from it. - - Fallback for when the build backend does not - define the 'get_wheel_metadata' hook. - """ - from zipfile import ZipFile - whl_basename = backend.build_wheel(metadata_directory, config_settings) - with open(os.path.join(metadata_directory, WHEEL_BUILT_MARKER), 'wb'): - pass # Touch marker file - - whl_file = os.path.join(metadata_directory, whl_basename) - with ZipFile(whl_file) as zipf: - dist_info = _dist_info_files(zipf) - zipf.extractall(path=metadata_directory, members=dist_info) - return dist_info[0].split('/')[0] - - -def _find_already_built_wheel(metadata_directory): - """Check for a wheel already built during the get_wheel_metadata hook. - """ - if not metadata_directory: - return None - metadata_parent = os.path.dirname(metadata_directory) - if not os.path.isfile(pjoin(metadata_parent, WHEEL_BUILT_MARKER)): - return None - - whl_files = glob(os.path.join(metadata_parent, '*.whl')) - if not whl_files: - print('Found wheel built marker, but no .whl files') - return None - if len(whl_files) > 1: - print('Found multiple .whl files; unspecified behaviour. ' - 'Will call build_wheel.') - return None - - # Exactly one .whl file - return whl_files[0] - - -def build_wheel(wheel_directory, config_settings, metadata_directory=None): - """Invoke the mandatory build_wheel hook. - - If a wheel was already built in the - prepare_metadata_for_build_wheel fallback, this - will copy it rather than rebuilding the wheel. - """ - prebuilt_whl = _find_already_built_wheel(metadata_directory) - if prebuilt_whl: - shutil.copy2(prebuilt_whl, wheel_directory) - return os.path.basename(prebuilt_whl) - - return _build_backend().build_wheel(wheel_directory, config_settings, - metadata_directory) - - -def get_requires_for_build_sdist(config_settings): - """Invoke the optional get_requires_for_build_wheel hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_sdist - except AttributeError: - return [] - else: - return hook(config_settings) - - -class _DummyException(Exception): - """Nothing should ever raise this exception""" - - -class GotUnsupportedOperation(Exception): - """For internal use when backend raises UnsupportedOperation""" - - -def build_sdist(sdist_directory, config_settings): - """Invoke the mandatory build_sdist hook.""" - backend = _build_backend() - try: - return backend.build_sdist(sdist_directory, config_settings) - except getattr(backend, 'UnsupportedOperation', _DummyException): - raise GotUnsupportedOperation - - -HOOK_NAMES = { - 'get_requires_for_build_wheel', - 'prepare_metadata_for_build_wheel', - 'build_wheel', - 'get_requires_for_build_sdist', - 'build_sdist', -} - - -def main(): - if len(sys.argv) < 3: - sys.exit("Needs args: hook_name, control_dir") - hook_name = sys.argv[1] - control_dir = sys.argv[2] - if hook_name not in HOOK_NAMES: - sys.exit("Unknown hook: %s" % hook_name) - hook = globals()[hook_name] - - hook_input = compat.read_json(pjoin(control_dir, 'input.json')) - - json_out = {'unsupported': False, 'return_val': None} - try: - json_out['return_val'] = hook(**hook_input['kwargs']) - except BackendUnavailable: - json_out['no_backend'] = True - except GotUnsupportedOperation: - json_out['unsupported'] = True - - compat.write_json(json_out, pjoin(control_dir, 'output.json'), indent=2) - - -if __name__ == '__main__': - main() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/build.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/build.py deleted file mode 100644 index ac6c949..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/build.py +++ /dev/null @@ -1,108 +0,0 @@ -"""Build a project using PEP 517 hooks. -""" -import argparse -import logging -import os -import contextlib -from pip._vendor import pytoml -import shutil -import errno -import tempfile - -from .envbuild import BuildEnvironment -from .wrappers import Pep517HookCaller - -log = logging.getLogger(__name__) - - -@contextlib.contextmanager -def tempdir(): - td = tempfile.mkdtemp() - try: - yield td - finally: - shutil.rmtree(td) - - -def _do_build(hooks, env, dist, dest): - get_requires_name = 'get_requires_for_build_{dist}'.format(**locals()) - get_requires = getattr(hooks, get_requires_name) - reqs = get_requires({}) - log.info('Got build requires: %s', reqs) - - env.pip_install(reqs) - log.info('Installed dynamic build dependencies') - - with tempdir() as td: - log.info('Trying to build %s in %s', dist, td) - build_name = 'build_{dist}'.format(**locals()) - build = getattr(hooks, build_name) - filename = build(td, {}) - source = os.path.join(td, filename) - shutil.move(source, os.path.join(dest, os.path.basename(filename))) - - -def mkdir_p(*args, **kwargs): - """Like `mkdir`, but does not raise an exception if the - directory already exists. - """ - try: - return os.mkdir(*args, **kwargs) - except OSError as exc: - if exc.errno != errno.EEXIST: - raise - - -def build(source_dir, dist, dest=None): - pyproject = os.path.join(source_dir, 'pyproject.toml') - dest = os.path.join(source_dir, dest or 'dist') - mkdir_p(dest) - - with open(pyproject) as f: - pyproject_data = pytoml.load(f) - # Ensure the mandatory data can be loaded - buildsys = pyproject_data['build-system'] - requires = buildsys['requires'] - backend = buildsys['build-backend'] - - hooks = Pep517HookCaller(source_dir, backend) - - with BuildEnvironment() as env: - env.pip_install(requires) - _do_build(hooks, env, dist, dest) - - -parser = argparse.ArgumentParser() -parser.add_argument( - 'source_dir', - help="A directory containing pyproject.toml", -) -parser.add_argument( - '--binary', '-b', - action='store_true', - default=False, -) -parser.add_argument( - '--source', '-s', - action='store_true', - default=False, -) -parser.add_argument( - '--out-dir', '-o', - help="Destination in which to save the builds relative to source dir", -) - - -def main(args): - # determine which dists to build - dists = list(filter(None, ( - 'sdist' if args.source or not args.binary else None, - 'wheel' if args.binary or not args.source else None, - ))) - - for dist in dists: - build(args.source_dir, dist, args.out_dir) - - -if __name__ == '__main__': - main(parser.parse_args()) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/check.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/check.py deleted file mode 100644 index f4cdc6b..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/check.py +++ /dev/null @@ -1,202 +0,0 @@ -"""Check a project and backend by attempting to build using PEP 517 hooks. -""" -import argparse -import logging -import os -from os.path import isfile, join as pjoin -from pip._vendor.pytoml import TomlError, load as toml_load -import shutil -from subprocess import CalledProcessError -import sys -import tarfile -from tempfile import mkdtemp -import zipfile - -from .colorlog import enable_colourful_output -from .envbuild import BuildEnvironment -from .wrappers import Pep517HookCaller - -log = logging.getLogger(__name__) - - -def check_build_sdist(hooks, build_sys_requires): - with BuildEnvironment() as env: - try: - env.pip_install(build_sys_requires) - log.info('Installed static build dependencies') - except CalledProcessError: - log.error('Failed to install static build dependencies') - return False - - try: - reqs = hooks.get_requires_for_build_sdist({}) - log.info('Got build requires: %s', reqs) - except Exception: - log.error('Failure in get_requires_for_build_sdist', exc_info=True) - return False - - try: - env.pip_install(reqs) - log.info('Installed dynamic build dependencies') - except CalledProcessError: - log.error('Failed to install dynamic build dependencies') - return False - - td = mkdtemp() - log.info('Trying to build sdist in %s', td) - try: - try: - filename = hooks.build_sdist(td, {}) - log.info('build_sdist returned %r', filename) - except Exception: - log.info('Failure in build_sdist', exc_info=True) - return False - - if not filename.endswith('.tar.gz'): - log.error( - "Filename %s doesn't have .tar.gz extension", filename) - return False - - path = pjoin(td, filename) - if isfile(path): - log.info("Output file %s exists", path) - else: - log.error("Output file %s does not exist", path) - return False - - if tarfile.is_tarfile(path): - log.info("Output file is a tar file") - else: - log.error("Output file is not a tar file") - return False - - finally: - shutil.rmtree(td) - - return True - - -def check_build_wheel(hooks, build_sys_requires): - with BuildEnvironment() as env: - try: - env.pip_install(build_sys_requires) - log.info('Installed static build dependencies') - except CalledProcessError: - log.error('Failed to install static build dependencies') - return False - - try: - reqs = hooks.get_requires_for_build_wheel({}) - log.info('Got build requires: %s', reqs) - except Exception: - log.error('Failure in get_requires_for_build_sdist', exc_info=True) - return False - - try: - env.pip_install(reqs) - log.info('Installed dynamic build dependencies') - except CalledProcessError: - log.error('Failed to install dynamic build dependencies') - return False - - td = mkdtemp() - log.info('Trying to build wheel in %s', td) - try: - try: - filename = hooks.build_wheel(td, {}) - log.info('build_wheel returned %r', filename) - except Exception: - log.info('Failure in build_wheel', exc_info=True) - return False - - if not filename.endswith('.whl'): - log.error("Filename %s doesn't have .whl extension", filename) - return False - - path = pjoin(td, filename) - if isfile(path): - log.info("Output file %s exists", path) - else: - log.error("Output file %s does not exist", path) - return False - - if zipfile.is_zipfile(path): - log.info("Output file is a zip file") - else: - log.error("Output file is not a zip file") - return False - - finally: - shutil.rmtree(td) - - return True - - -def check(source_dir): - pyproject = pjoin(source_dir, 'pyproject.toml') - if isfile(pyproject): - log.info('Found pyproject.toml') - else: - log.error('Missing pyproject.toml') - return False - - try: - with open(pyproject) as f: - pyproject_data = toml_load(f) - # Ensure the mandatory data can be loaded - buildsys = pyproject_data['build-system'] - requires = buildsys['requires'] - backend = buildsys['build-backend'] - log.info('Loaded pyproject.toml') - except (TomlError, KeyError): - log.error("Invalid pyproject.toml", exc_info=True) - return False - - hooks = Pep517HookCaller(source_dir, backend) - - sdist_ok = check_build_sdist(hooks, requires) - wheel_ok = check_build_wheel(hooks, requires) - - if not sdist_ok: - log.warning('Sdist checks failed; scroll up to see') - if not wheel_ok: - log.warning('Wheel checks failed') - - return sdist_ok - - -def main(argv=None): - ap = argparse.ArgumentParser() - ap.add_argument( - 'source_dir', - help="A directory containing pyproject.toml") - args = ap.parse_args(argv) - - enable_colourful_output() - - ok = check(args.source_dir) - - if ok: - print(ansi('Checks passed', 'green')) - else: - print(ansi('Checks failed', 'red')) - sys.exit(1) - - -ansi_codes = { - 'reset': '\x1b[0m', - 'bold': '\x1b[1m', - 'red': '\x1b[31m', - 'green': '\x1b[32m', -} - - -def ansi(s, attr): - if os.name != 'nt' and sys.stdout.isatty(): - return ansi_codes[attr] + str(s) + ansi_codes['reset'] - else: - return str(s) - - -if __name__ == '__main__': - main() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/colorlog.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/colorlog.py deleted file mode 100644 index 69c8a59..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/colorlog.py +++ /dev/null @@ -1,115 +0,0 @@ -"""Nicer log formatting with colours. - -Code copied from Tornado, Apache licensed. -""" -# Copyright 2012 Facebook -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import sys - -try: - import curses -except ImportError: - curses = None - - -def _stderr_supports_color(): - color = False - if curses and hasattr(sys.stderr, 'isatty') and sys.stderr.isatty(): - try: - curses.setupterm() - if curses.tigetnum("colors") > 0: - color = True - except Exception: - pass - return color - - -class LogFormatter(logging.Formatter): - """Log formatter with colour support - """ - DEFAULT_COLORS = { - logging.INFO: 2, # Green - logging.WARNING: 3, # Yellow - logging.ERROR: 1, # Red - logging.CRITICAL: 1, - } - - def __init__(self, color=True, datefmt=None): - r""" - :arg bool color: Enables color support. - :arg string fmt: Log message format. - It will be applied to the attributes dict of log records. The - text between ``%(color)s`` and ``%(end_color)s`` will be colored - depending on the level if color support is on. - :arg dict colors: color mappings from logging level to terminal color - code - :arg string datefmt: Datetime format. - Used for formatting ``(asctime)`` placeholder in ``prefix_fmt``. - .. versionchanged:: 3.2 - Added ``fmt`` and ``datefmt`` arguments. - """ - logging.Formatter.__init__(self, datefmt=datefmt) - self._colors = {} - if color and _stderr_supports_color(): - # The curses module has some str/bytes confusion in - # python3. Until version 3.2.3, most methods return - # bytes, but only accept strings. In addition, we want to - # output these strings with the logging module, which - # works with unicode strings. The explicit calls to - # unicode() below are harmless in python2 but will do the - # right conversion in python 3. - fg_color = (curses.tigetstr("setaf") or - curses.tigetstr("setf") or "") - if (3, 0) < sys.version_info < (3, 2, 3): - fg_color = str(fg_color, "ascii") - - for levelno, code in self.DEFAULT_COLORS.items(): - self._colors[levelno] = str( - curses.tparm(fg_color, code), "ascii") - self._normal = str(curses.tigetstr("sgr0"), "ascii") - - scr = curses.initscr() - self.termwidth = scr.getmaxyx()[1] - curses.endwin() - else: - self._normal = '' - # Default width is usually 80, but too wide is - # worse than too narrow - self.termwidth = 70 - - def formatMessage(self, record): - mlen = len(record.message) - right_text = '{initial}-{name}'.format(initial=record.levelname[0], - name=record.name) - if mlen + len(right_text) < self.termwidth: - space = ' ' * (self.termwidth - (mlen + len(right_text))) - else: - space = ' ' - - if record.levelno in self._colors: - start_color = self._colors[record.levelno] - end_color = self._normal - else: - start_color = end_color = '' - - return record.message + space + start_color + right_text + end_color - - -def enable_colourful_output(level=logging.INFO): - handler = logging.StreamHandler() - handler.setFormatter(LogFormatter()) - logging.root.addHandler(handler) - logging.root.setLevel(level) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/compat.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/compat.py deleted file mode 100644 index 01c66fc..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/compat.py +++ /dev/null @@ -1,23 +0,0 @@ -"""Handle reading and writing JSON in UTF-8, on Python 3 and 2.""" -import json -import sys - -if sys.version_info[0] >= 3: - # Python 3 - def write_json(obj, path, **kwargs): - with open(path, 'w', encoding='utf-8') as f: - json.dump(obj, f, **kwargs) - - def read_json(path): - with open(path, 'r', encoding='utf-8') as f: - return json.load(f) - -else: - # Python 2 - def write_json(obj, path, **kwargs): - with open(path, 'wb') as f: - json.dump(obj, f, encoding='utf-8', **kwargs) - - def read_json(path): - with open(path, 'rb') as f: - return json.load(f) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/envbuild.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/envbuild.py deleted file mode 100644 index f7ac5f4..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/envbuild.py +++ /dev/null @@ -1,158 +0,0 @@ -"""Build wheels/sdists by installing build deps to a temporary environment. -""" - -import os -import logging -from pip._vendor import pytoml -import shutil -from subprocess import check_call -import sys -from sysconfig import get_paths -from tempfile import mkdtemp - -from .wrappers import Pep517HookCaller - -log = logging.getLogger(__name__) - - -def _load_pyproject(source_dir): - with open(os.path.join(source_dir, 'pyproject.toml')) as f: - pyproject_data = pytoml.load(f) - buildsys = pyproject_data['build-system'] - return buildsys['requires'], buildsys['build-backend'] - - -class BuildEnvironment(object): - """Context manager to install build deps in a simple temporary environment - - Based on code I wrote for pip, which is MIT licensed. - """ - # Copyright (c) 2008-2016 The pip developers (see AUTHORS.txt file) - # - # 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. - - path = None - - def __init__(self, cleanup=True): - self._cleanup = cleanup - - def __enter__(self): - self.path = mkdtemp(prefix='pep517-build-env-') - log.info('Temporary build environment: %s', self.path) - - self.save_path = os.environ.get('PATH', None) - self.save_pythonpath = os.environ.get('PYTHONPATH', None) - - install_scheme = 'nt' if (os.name == 'nt') else 'posix_prefix' - install_dirs = get_paths(install_scheme, vars={ - 'base': self.path, - 'platbase': self.path, - }) - - scripts = install_dirs['scripts'] - if self.save_path: - os.environ['PATH'] = scripts + os.pathsep + self.save_path - else: - os.environ['PATH'] = scripts + os.pathsep + os.defpath - - if install_dirs['purelib'] == install_dirs['platlib']: - lib_dirs = install_dirs['purelib'] - else: - lib_dirs = install_dirs['purelib'] + os.pathsep + \ - install_dirs['platlib'] - if self.save_pythonpath: - os.environ['PYTHONPATH'] = lib_dirs + os.pathsep + \ - self.save_pythonpath - else: - os.environ['PYTHONPATH'] = lib_dirs - - return self - - def pip_install(self, reqs): - """Install dependencies into this env by calling pip in a subprocess""" - if not reqs: - return - log.info('Calling pip to install %s', reqs) - check_call([ - sys.executable, '-m', 'pip', 'install', '--ignore-installed', - '--prefix', self.path] + list(reqs)) - - def __exit__(self, exc_type, exc_val, exc_tb): - needs_cleanup = ( - self._cleanup and - self.path is not None and - os.path.isdir(self.path) - ) - if needs_cleanup: - shutil.rmtree(self.path) - - if self.save_path is None: - os.environ.pop('PATH', None) - else: - os.environ['PATH'] = self.save_path - - if self.save_pythonpath is None: - os.environ.pop('PYTHONPATH', None) - else: - os.environ['PYTHONPATH'] = self.save_pythonpath - - -def build_wheel(source_dir, wheel_dir, config_settings=None): - """Build a wheel from a source directory using PEP 517 hooks. - - :param str source_dir: Source directory containing pyproject.toml - :param str wheel_dir: Target directory to create wheel in - :param dict config_settings: Options to pass to build backend - - This is a blocking function which will run pip in a subprocess to install - build requirements. - """ - if config_settings is None: - config_settings = {} - requires, backend = _load_pyproject(source_dir) - hooks = Pep517HookCaller(source_dir, backend) - - with BuildEnvironment() as env: - env.pip_install(requires) - reqs = hooks.get_requires_for_build_wheel(config_settings) - env.pip_install(reqs) - return hooks.build_wheel(wheel_dir, config_settings) - - -def build_sdist(source_dir, sdist_dir, config_settings=None): - """Build an sdist from a source directory using PEP 517 hooks. - - :param str source_dir: Source directory containing pyproject.toml - :param str sdist_dir: Target directory to place sdist in - :param dict config_settings: Options to pass to build backend - - This is a blocking function which will run pip in a subprocess to install - build requirements. - """ - if config_settings is None: - config_settings = {} - requires, backend = _load_pyproject(source_dir) - hooks = Pep517HookCaller(source_dir, backend) - - with BuildEnvironment() as env: - env.pip_install(requires) - reqs = hooks.get_requires_for_build_sdist(config_settings) - env.pip_install(reqs) - return hooks.build_sdist(sdist_dir, config_settings) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/wrappers.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/wrappers.py deleted file mode 100644 index b14b899..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/wrappers.py +++ /dev/null @@ -1,163 +0,0 @@ -from contextlib import contextmanager -import os -from os.path import dirname, abspath, join as pjoin -import shutil -from subprocess import check_call -import sys -from tempfile import mkdtemp - -from . import compat - -_in_proc_script = pjoin(dirname(abspath(__file__)), '_in_process.py') - - -@contextmanager -def tempdir(): - td = mkdtemp() - try: - yield td - finally: - shutil.rmtree(td) - - -class BackendUnavailable(Exception): - """Will be raised if the backend cannot be imported in the hook process.""" - - -class UnsupportedOperation(Exception): - """May be raised by build_sdist if the backend indicates that it can't.""" - - -def default_subprocess_runner(cmd, cwd=None, extra_environ=None): - """The default method of calling the wrapper subprocess.""" - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - - check_call(cmd, cwd=cwd, env=env) - - -class Pep517HookCaller(object): - """A wrapper around a source directory to be built with a PEP 517 backend. - - source_dir : The path to the source directory, containing pyproject.toml. - backend : The build backend spec, as per PEP 517, from pyproject.toml. - """ - def __init__(self, source_dir, build_backend): - self.source_dir = abspath(source_dir) - self.build_backend = build_backend - self._subprocess_runner = default_subprocess_runner - - # TODO: Is this over-engineered? Maybe frontends only need to - # set this when creating the wrapper, not on every call. - @contextmanager - def subprocess_runner(self, runner): - prev = self._subprocess_runner - self._subprocess_runner = runner - yield - self._subprocess_runner = prev - - def get_requires_for_build_wheel(self, config_settings=None): - """Identify packages required for building a wheel - - Returns a list of dependency specifications, e.g.: - ["wheel >= 0.25", "setuptools"] - - This does not include requirements specified in pyproject.toml. - It returns the result of calling the equivalently named hook in a - subprocess. - """ - return self._call_hook('get_requires_for_build_wheel', { - 'config_settings': config_settings - }) - - def prepare_metadata_for_build_wheel( - self, metadata_directory, config_settings=None): - """Prepare a *.dist-info folder with metadata for this project. - - Returns the name of the newly created folder. - - If the build backend defines a hook with this name, it will be called - in a subprocess. If not, the backend will be asked to build a wheel, - and the dist-info extracted from that. - """ - return self._call_hook('prepare_metadata_for_build_wheel', { - 'metadata_directory': abspath(metadata_directory), - 'config_settings': config_settings, - }) - - def build_wheel( - self, wheel_directory, config_settings=None, - metadata_directory=None): - """Build a wheel from this project. - - Returns the name of the newly created file. - - In general, this will call the 'build_wheel' hook in the backend. - However, if that was previously called by - 'prepare_metadata_for_build_wheel', and the same metadata_directory is - used, the previously built wheel will be copied to wheel_directory. - """ - if metadata_directory is not None: - metadata_directory = abspath(metadata_directory) - return self._call_hook('build_wheel', { - 'wheel_directory': abspath(wheel_directory), - 'config_settings': config_settings, - 'metadata_directory': metadata_directory, - }) - - def get_requires_for_build_sdist(self, config_settings=None): - """Identify packages required for building a wheel - - Returns a list of dependency specifications, e.g.: - ["setuptools >= 26"] - - This does not include requirements specified in pyproject.toml. - It returns the result of calling the equivalently named hook in a - subprocess. - """ - return self._call_hook('get_requires_for_build_sdist', { - 'config_settings': config_settings - }) - - def build_sdist(self, sdist_directory, config_settings=None): - """Build an sdist from this project. - - Returns the name of the newly created file. - - This calls the 'build_sdist' backend hook in a subprocess. - """ - return self._call_hook('build_sdist', { - 'sdist_directory': abspath(sdist_directory), - 'config_settings': config_settings, - }) - - def _call_hook(self, hook_name, kwargs): - # On Python 2, pytoml returns Unicode values (which is correct) but the - # environment passed to check_call needs to contain string values. We - # convert here by encoding using ASCII (the backend can only contain - # letters, digits and _, . and : characters, and will be used as a - # Python identifier, so non-ASCII content is wrong on Python 2 in - # any case). - if sys.version_info[0] == 2: - build_backend = self.build_backend.encode('ASCII') - else: - build_backend = self.build_backend - - with tempdir() as td: - compat.write_json({'kwargs': kwargs}, pjoin(td, 'input.json'), - indent=2) - - # Run the hook in a subprocess - self._subprocess_runner( - [sys.executable, _in_proc_script, hook_name, td], - cwd=self.source_dir, - extra_environ={'PEP517_BUILD_BACKEND': build_backend} - ) - - data = compat.read_json(pjoin(td, 'output.json')) - if data.get('unsupported'): - raise UnsupportedOperation - if data.get('no_backend'): - raise BackendUnavailable - return data['return_val'] diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__init__.py deleted file mode 100644 index 9c4fd8e..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__init__.py +++ /dev/null @@ -1,3171 +0,0 @@ -# coding: utf-8 -""" -Package resource API --------------------- - -A resource is a logical file contained within a package, or a logical -subdirectory thereof. The package resource API expects resource names -to have their path parts separated with ``/``, *not* whatever the local -path separator is. Do not use os.path operations to manipulate resource -names being passed into the API. - -The package resource API is designed to work with normal filesystem packages, -.egg files, and unpacked .egg files. It can also work in a limited way with -.zip files and with custom PEP 302 loaders that support the ``get_data()`` -method. -""" - -from __future__ import absolute_import - -import sys -import os -import io -import time -import re -import types -import zipfile -import zipimport -import warnings -import stat -import functools -import pkgutil -import operator -import platform -import collections -import plistlib -import email.parser -import errno -import tempfile -import textwrap -import itertools -import inspect -from pkgutil import get_importer - -try: - import _imp -except ImportError: - # Python 3.2 compatibility - import imp as _imp - -try: - FileExistsError -except NameError: - FileExistsError = OSError - -from pip._vendor import six -from pip._vendor.six.moves import urllib, map, filter - -# capture these to bypass sandboxing -from os import utime -try: - from os import mkdir, rename, unlink - WRITE_SUPPORT = True -except ImportError: - # no write support, probably under GAE - WRITE_SUPPORT = False - -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 . import py31compat -from pip._vendor import appdirs -from pip._vendor import packaging -__import__('pip._vendor.packaging.version') -__import__('pip._vendor.packaging.specifiers') -__import__('pip._vendor.packaging.requirements') -__import__('pip._vendor.packaging.markers') - - -__metaclass__ = type - - -if (3, 0) < sys.version_info < (3, 4): - raise RuntimeError("Python 3.4 or later is required") - -if six.PY2: - # Those builtin exceptions are only defined in Python 3 - PermissionError = None - NotADirectoryError = None - -# 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 -resource_string = None -iter_entry_points = None -resource_listdir = None -resource_filename = None -resource_exists = None -_distribution_finders = None -_namespace_handlers = None -_namespace_packages = None - - -class PEP440Warning(RuntimeWarning): - """ - Used when there is an issue with a version or specifier not complying with - PEP 440. - """ - - -def parse_version(v): - try: - return packaging.version.Version(v) - except packaging.version.InvalidVersion: - return packaging.version.LegacyVersion(v) - - -_state_vars = {} - - -def _declare_state(vartype, **kw): - globals().update(kw) - _state_vars.update(dict.fromkeys(kw, vartype)) - - -def __getstate__(): - state = {} - g = globals() - for k, v in _state_vars.items(): - state[k] = g['_sget_' + v](g[k]) - return state - - -def __setstate__(state): - g = globals() - for k, v in state.items(): - g['_sset_' + _state_vars[k]](k, g[k], v) - return state - - -def _sget_dict(val): - return val.copy() - - -def _sset_dict(key, ob, state): - ob.clear() - ob.update(state) - - -def _sget_object(val): - return val.__getstate__() - - -def _sset_object(key, ob, state): - ob.__setstate__(state) - - -_sget_none = _sset_none = lambda *args: None - - -def get_supported_platform(): - """Return this platform's maximum compatible version. - - distutils.util.get_platform() normally reports the minimum version - of Mac OS X that would be required to *use* extensions produced by - distutils. But what we want when checking compatibility is to know the - version of Mac OS X that we are *running*. To allow usage of packages that - explicitly require a newer version of Mac OS X, we must also know the - current version of the OS. - - If this condition occurs for any other platform with a version in its - platform strings, this function should be extended accordingly. - """ - plat = get_build_platform() - m = macosVersionString.match(plat) - if m is not None and sys.platform == "darwin": - try: - plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3)) - except ValueError: - # not Mac OS X - pass - return plat - - -__all__ = [ - # Basic resource access and distribution/entry point discovery - 'require', 'run_script', 'get_provider', 'get_distribution', - 'load_entry_point', 'get_entry_map', 'get_entry_info', - 'iter_entry_points', - 'resource_string', 'resource_stream', 'resource_filename', - 'resource_listdir', 'resource_exists', 'resource_isdir', - - # Environmental control - 'declare_namespace', 'working_set', 'add_activation_listener', - 'find_distributions', 'set_extraction_path', 'cleanup_resources', - 'get_default_cache', - - # Primary implementation classes - 'Environment', 'WorkingSet', 'ResourceManager', - 'Distribution', 'Requirement', 'EntryPoint', - - # Exceptions - 'ResolutionError', 'VersionConflict', 'DistributionNotFound', - 'UnknownExtra', 'ExtractionError', - - # Warnings - 'PEP440Warning', - - # Parsing functions and string utilities - 'parse_requirements', 'parse_version', 'safe_name', 'safe_version', - 'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections', - 'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker', - - # filesystem utilities - 'ensure_directory', 'normalize_path', - - # Distribution "precedence" constants - 'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST', - - # "Provider" interfaces, implementations, and registration/lookup APIs - 'IMetadataProvider', 'IResourceProvider', 'FileMetadata', - 'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider', - 'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider', - 'register_finder', 'register_namespace_handler', 'register_loader_type', - 'fixup_namespace_packages', 'get_importer', - - # Warnings - 'PkgResourcesDeprecationWarning', - - # Deprecated/backward compatibility only - 'run_main', 'AvailableDistributions', -] - - -class ResolutionError(Exception): - """Abstract base for dependency resolution errors""" - - def __repr__(self): - return self.__class__.__name__ + repr(self.args) - - -class VersionConflict(ResolutionError): - """ - An already-installed version conflicts with the requested version. - - Should be initialized with the installed Distribution and the requested - Requirement. - """ - - _template = "{self.dist} is installed but {self.req} is required" - - @property - def dist(self): - return self.args[0] - - @property - def req(self): - return self.args[1] - - def report(self): - return self._template.format(**locals()) - - def with_context(self, required_by): - """ - If required_by is non-empty, return a version of self that is a - ContextualVersionConflict. - """ - if not required_by: - return self - args = self.args + (required_by,) - return ContextualVersionConflict(*args) - - -class ContextualVersionConflict(VersionConflict): - """ - A VersionConflict that accepts a third parameter, the set of the - requirements that required the installed Distribution. - """ - - _template = VersionConflict._template + ' by {self.required_by}' - - @property - def required_by(self): - return self.args[2] - - -class DistributionNotFound(ResolutionError): - """A requested distribution was not found""" - - _template = ("The '{self.req}' distribution was not found " - "and is required by {self.requirers_str}") - - @property - def req(self): - return self.args[0] - - @property - def requirers(self): - return self.args[1] - - @property - def requirers_str(self): - if not self.requirers: - return 'the application' - return ', '.join(self.requirers) - - def report(self): - return self._template.format(**locals()) - - def __str__(self): - return self.report() - - -class UnknownExtra(ResolutionError): - """Distribution doesn't have an "extra feature" of the given name""" - - -_provider_factories = {} - -PY_MAJOR = sys.version[:3] -EGG_DIST = 3 -BINARY_DIST = 2 -SOURCE_DIST = 1 -CHECKOUT_DIST = 0 -DEVELOP_DIST = -1 - - -def register_loader_type(loader_type, provider_factory): - """Register `provider_factory` to make providers for `loader_type` - - `loader_type` is the type or class of a PEP 302 ``module.__loader__``, - and `provider_factory` is a function that, passed a *module* object, - returns an ``IResourceProvider`` for that module. - """ - _provider_factories[loader_type] = provider_factory - - -def get_provider(moduleOrReq): - """Return an IResourceProvider for the named module or requirement""" - if isinstance(moduleOrReq, Requirement): - return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] - try: - module = sys.modules[moduleOrReq] - except KeyError: - __import__(moduleOrReq) - module = sys.modules[moduleOrReq] - loader = getattr(module, '__loader__', None) - return _find_adapter(_provider_factories, loader)(module) - - -def _macosx_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] - - -def _macosx_arch(machine): - return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) - - -def get_build_platform(): - """Return this platform's string for platform-specific distributions - - XXX Currently this is the same as ``distutils.util.get_platform()``, but it - needs some hacks for Linux and Mac OS X. - """ - from sysconfig import get_platform - - plat = get_platform() - if sys.platform == "darwin" and not plat.startswith('macosx-'): - try: - version = _macosx_vers() - machine = os.uname()[4].replace(" ", "_") - return "macosx-%d.%d-%s" % ( - int(version[0]), int(version[1]), - _macosx_arch(machine), - ) - except ValueError: - # if someone is running a non-Mac darwin system, this will fall - # through to the default implementation - pass - return plat - - -macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") -darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") -# XXX backward compat -get_platform = get_build_platform - - -def compatible_platforms(provided, required): - """Can code for the `provided` platform run on the `required` platform? - - Returns true if either platform is ``None``, or the platforms are equal. - - XXX Needs compatibility checks for Linux and other unixy OSes. - """ - if provided is None or required is None or provided == required: - # easy case - return True - - # Mac OS X special cases - reqMac = macosVersionString.match(required) - if reqMac: - provMac = macosVersionString.match(provided) - - # is this a Mac package? - if not provMac: - # this is backwards compatibility for packages built before - # setuptools 0.6. All packages built after this point will - # use the new macosx designation. - provDarwin = darwinVersionString.match(provided) - if provDarwin: - dversion = int(provDarwin.group(1)) - macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) - if dversion == 7 and macosversion >= "10.3" or \ - dversion == 8 and macosversion >= "10.4": - return True - # egg isn't macosx or legacy darwin - return False - - # are they the same major version and machine type? - if provMac.group(1) != reqMac.group(1) or \ - provMac.group(3) != reqMac.group(3): - return False - - # is the required OS major update >= the provided one? - if int(provMac.group(2)) > int(reqMac.group(2)): - return False - - return True - - # XXX Linux and other platforms' special cases should go here - 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, six.string_types): - dist = Requirement.parse(dist) - if isinstance(dist, Requirement): - dist = get_provider(dist) - if not isinstance(dist, Distribution): - raise TypeError("Expected string, Requirement, or Distribution", dist) - return dist - - -def load_entry_point(dist, group, name): - """Return `name` entry point of `group` for `dist` or raise ImportError""" - return get_distribution(dist).load_entry_point(group, name) - - -def get_entry_map(dist, group=None): - """Return the entry point map for `group`, or the full entry map""" - return get_distribution(dist).get_entry_map(group) - - -def get_entry_info(dist, group, name): - """Return the EntryPoint object for `group`+`name`, or ``None``""" - return get_distribution(dist).get_entry_info(group, name) - - -class IMetadataProvider: - def has_metadata(name): - """Does the package's distribution contain the named metadata?""" - - def get_metadata(name): - """The named metadata resource as a string""" - - def get_metadata_lines(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): - """Is the named metadata a directory? (like ``os.path.isdir()``)""" - - def metadata_listdir(name): - """List of metadata names in the directory (like ``os.listdir()``)""" - - def run_script(script_name, namespace): - """Execute the named script in the supplied namespace dictionary""" - - -class IResourceProvider(IMetadataProvider): - """An object that provides access to package resources""" - - def get_resource_filename(manager, resource_name): - """Return a true filesystem path for `resource_name` - - `manager` must be an ``IResourceManager``""" - - def get_resource_stream(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` - - `manager` must be an ``IResourceManager``""" - - def has_resource(resource_name): - """Does the package contain the named resource?""" - - def resource_isdir(resource_name): - """Is the named resource a directory? (like ``os.path.isdir()``)""" - - def resource_listdir(resource_name): - """List of resource names in the directory (like ``os.listdir()``)""" - - -class WorkingSet: - """A collection of active distributions on sys.path (or a similar list)""" - - def __init__(self, entries=None): - """Create working set from list of path entries (default=sys.path)""" - self.entries = [] - self.entry_keys = {} - self.by_key = {} - self.callbacks = [] - - if entries is None: - entries = sys.path - - for entry in entries: - self.add_entry(entry) - - @classmethod - def _build_master(cls): - """ - Prepare the master working set. - """ - ws = cls() - try: - from __main__ import __requires__ - except ImportError: - # The main program does not list any requirements - return ws - - # ensure the requirements are met - try: - ws.require(__requires__) - except VersionConflict: - return cls._build_from_requirements(__requires__) - - return ws - - @classmethod - def _build_from_requirements(cls, req_spec): - """ - Build a working set from a requirement spec. Rewrites sys.path. - """ - # try it without defaults already on sys.path - # by starting with an empty path - ws = cls([]) - reqs = parse_requirements(req_spec) - dists = ws.resolve(reqs, Environment()) - for dist in dists: - ws.add(dist) - - # add any missing entries from sys.path - for entry in sys.path: - if entry not in ws.entries: - ws.add_entry(entry) - - # then copy back to sys.path - sys.path[:] = ws.entries - return ws - - def add_entry(self, entry): - """Add a path item to ``.entries``, finding any distributions on it - - ``find_distributions(entry, True)`` is used to find distributions - corresponding to the path entry, and they are added. `entry` is - always appended to ``.entries``, even if it is already present. - (This is because ``sys.path`` can contain the same value more than - once, and the ``.entries`` of the ``sys.path`` WorkingSet should always - equal ``sys.path``.) - """ - self.entry_keys.setdefault(entry, []) - self.entries.append(entry) - for dist in find_distributions(entry, True): - self.add(dist, entry, False) - - def __contains__(self, dist): - """True if `dist` is the active distribution for its project""" - return self.by_key.get(dist.key) == dist - - def find(self, req): - """Find a distribution matching requirement `req` - - If there is an active distribution for the requested project, this - returns it as long as it meets the version requirement specified by - `req`. But, if there is an active distribution for the project and it - does *not* meet the `req` requirement, ``VersionConflict`` is raised. - If there is no active distribution for the requested project, ``None`` - is returned. - """ - dist = self.by_key.get(req.key) - if dist is not None and dist not in req: - # XXX add more info - raise VersionConflict(dist, req) - return dist - - def iter_entry_points(self, group, name=None): - """Yield entry point objects from `group` matching `name` - - If `name` is None, yields all entry points in `group` from all - distributions in the working set, otherwise only ones matching - both `group` and `name` are yielded (in distribution order). - """ - return ( - entry - for dist in self - for entry in dist.get_entry_map(group).values() - if name is None or name == entry.name - ) - - def run_script(self, requires, script_name): - """Locate distribution for `requires` and run `script_name` script""" - ns = sys._getframe(1).f_globals - name = ns['__name__'] - ns.clear() - ns['__name__'] = name - self.require(requires)[0].run_script(script_name, ns) - - def __iter__(self): - """Yield distributions for non-duplicate projects in the working set - - The yield order is the order in which the items' path entries were - added to the working set. - """ - seen = {} - for item in self.entries: - if item not in self.entry_keys: - # workaround a cache issue - continue - - for key in self.entry_keys[item]: - if key not in seen: - seen[key] = 1 - yield self.by_key[key] - - def add(self, dist, entry=None, insert=True, replace=False): - """Add `dist` to working set, associated with `entry` - - If `entry` is unspecified, it defaults to the ``.location`` of `dist`. - On exit from this routine, `entry` is added to the end of the working - set's ``.entries`` (if it wasn't already present). - - `dist` is only added to the working set if it's for a project that - doesn't already have a distribution in the set, unless `replace=True`. - If it's added, any callbacks registered with the ``subscribe()`` method - will be called. - """ - if insert: - dist.insert_on(self.entries, entry, replace=replace) - - if entry is None: - entry = dist.location - keys = self.entry_keys.setdefault(entry, []) - keys2 = self.entry_keys.setdefault(dist.location, []) - if not replace and dist.key in self.by_key: - # ignore hidden distros - return - - self.by_key[dist.key] = dist - if dist.key not in keys: - keys.append(dist.key) - if dist.key not in keys2: - keys2.append(dist.key) - self._added_new(dist) - - def resolve(self, requirements, env=None, installer=None, - replace_conflicting=False, extras=None): - """List all distributions needed to (recursively) meet `requirements` - - `requirements` must be a sequence of ``Requirement`` objects. `env`, - if supplied, should be an ``Environment`` instance. If - not supplied, it defaults to all distributions available within any - entry or distribution in the working set. `installer`, if supplied, - will be invoked with each requirement that cannot be met by an - already-installed distribution; it should return a ``Distribution`` or - ``None``. - - Unless `replace_conflicting=True`, raises a VersionConflict exception - if - any requirements are found on the path that have the correct name but - the wrong version. Otherwise, if an `installer` is supplied it will be - invoked to obtain the correct version of the requirement and activate - it. - - `extras` is a list of the extras to be used with these requirements. - This is important because extra requirements may look like `my_req; - extra = "my_extra"`, which would otherwise be interpreted as a purely - optional requirement. Instead, we want to be able to assert that these - requirements are truly required. - """ - - # set up the stack - requirements = list(requirements)[::-1] - # set of processed requirements - processed = {} - # key -> dist - best = {} - to_activate = [] - - req_extras = _ReqExtras() - - # Mapping of requirement to set of distributions that required it; - # useful for reporting info about conflicts. - required_by = collections.defaultdict(set) - - while requirements: - # process dependencies breadth-first - req = requirements.pop(0) - if req in processed: - # Ignore cyclic or redundant dependencies - continue - - if not req_extras.markers_pass(req, extras): - continue - - dist = best.get(req.key) - if dist is None: - # Find the best distribution and add it to the map - dist = self.by_key.get(req.key) - if dist is None or (dist not in req and replace_conflicting): - ws = self - if env is None: - if dist is None: - env = Environment(self.entries) - else: - # Use an empty environment and workingset to avoid - # any further conflicts with the conflicting - # distribution - env = Environment([]) - ws = WorkingSet([]) - dist = best[req.key] = env.best_match( - req, ws, installer, - replace_conflicting=replace_conflicting - ) - if dist is None: - requirers = required_by.get(req, None) - raise DistributionNotFound(req, requirers) - to_activate.append(dist) - if dist not in req: - # Oops, the "best" so far conflicts with a dependency - dependent_req = required_by[req] - raise VersionConflict(dist, req).with_context(dependent_req) - - # push the new requirements onto the stack - new_requirements = dist.requires(req.extras)[::-1] - requirements.extend(new_requirements) - - # Register the new requirements needed by req - for new_requirement in new_requirements: - required_by[new_requirement].add(req.project_name) - req_extras[new_requirement] = req.extras - - processed[req] = True - - # return list of distros to activate - return to_activate - - def find_plugins( - self, plugin_env, full_env=None, installer=None, fallback=True): - """Find all activatable distributions in `plugin_env` - - Example usage:: - - distributions, errors = working_set.find_plugins( - Environment(plugin_dirlist) - ) - # add plugins+libs to sys.path - map(working_set.add, distributions) - # display errors - print('Could not load', errors) - - The `plugin_env` should be an ``Environment`` instance that contains - only distributions that are in the project's "plugin directory" or - directories. The `full_env`, if supplied, should be an ``Environment`` - contains all currently-available distributions. If `full_env` is not - supplied, one is created automatically from the ``WorkingSet`` this - method is called on, which will typically mean that every directory on - ``sys.path`` will be scanned for distributions. - - `installer` is a standard installer callback as used by the - ``resolve()`` method. The `fallback` flag indicates whether we should - attempt to resolve older versions of a plugin if the newest version - cannot be resolved. - - This method returns a 2-tuple: (`distributions`, `error_info`), where - `distributions` is a list of the distributions found in `plugin_env` - that were loadable, along with any other distributions that are needed - to resolve their dependencies. `error_info` is a dictionary mapping - unloadable plugin distributions to an exception instance describing the - error that occurred. Usually this will be a ``DistributionNotFound`` or - ``VersionConflict`` instance. - """ - - plugin_projects = list(plugin_env) - # scan project names in alphabetic order - plugin_projects.sort() - - error_info = {} - distributions = {} - - if full_env is None: - env = Environment(self.entries) - env += plugin_env - else: - env = full_env + plugin_env - - shadow_set = self.__class__([]) - # put all our entries in shadow_set - list(map(shadow_set.add, self)) - - for project_name in plugin_projects: - - for dist in plugin_env[project_name]: - - req = [dist.as_requirement()] - - try: - resolvees = shadow_set.resolve(req, env, installer) - - except ResolutionError as v: - # save error info - error_info[dist] = v - if fallback: - # try the next older version of project - continue - else: - # give up on this project, keep going - break - - else: - list(map(shadow_set.add, resolvees)) - distributions.update(dict.fromkeys(resolvees)) - - # success, no need to try any more versions of this project - break - - distributions = list(distributions) - distributions.sort() - - return distributions, error_info - - def require(self, *requirements): - """Ensure that distributions matching `requirements` are activated - - `requirements` must be a string or a (possibly-nested) sequence - thereof, specifying the distributions and versions required. The - return value is a sequence of the distributions that needed to be - activated to fulfill the requirements; all relevant distributions are - included, even if they were already activated in this working set. - """ - needed = self.resolve(parse_requirements(requirements)) - - for dist in needed: - self.add(dist) - - return needed - - def subscribe(self, callback, existing=True): - """Invoke `callback` for all distributions - - If `existing=True` (default), - call on all existing ones, as well. - """ - if callback in self.callbacks: - return - self.callbacks.append(callback) - if not existing: - return - for dist in self: - callback(dist) - - def _added_new(self, dist): - for callback in self.callbacks: - callback(dist) - - def __getstate__(self): - return ( - self.entries[:], self.entry_keys.copy(), self.by_key.copy(), - self.callbacks[:] - ) - - def __setstate__(self, e_k_b_c): - entries, keys, by_key, callbacks = e_k_b_c - self.entries = entries[:] - self.entry_keys = keys.copy() - self.by_key = by_key.copy() - self.callbacks = callbacks[:] - - -class _ReqExtras(dict): - """ - Map each requirement to the extras that demanded it. - """ - - def markers_pass(self, req, extras=None): - """ - Evaluate markers for req against each extra that - demanded it. - - Return False if the req has a marker and fails - evaluation. Otherwise, return True. - """ - extra_evals = ( - req.marker.evaluate({'extra': extra}) - for extra in self.get(req, ()) + (extras or (None,)) - ) - return not req.marker or any(extra_evals) - - -class Environment: - """Searchable snapshot of distributions on a search path""" - - def __init__( - self, search_path=None, platform=get_supported_platform(), - python=PY_MAJOR): - """Snapshot distributions available on a search path - - Any distributions found on `search_path` are added to the environment. - `search_path` should be a sequence of ``sys.path`` items. If not - supplied, ``sys.path`` is used. - - `platform` is an optional string specifying the name of the platform - that platform-specific distributions must be compatible with. If - unspecified, it defaults to the current platform. `python` is an - optional string naming the desired version of Python (e.g. ``'3.6'``); - it defaults to the current version. - - You may explicitly set `platform` (and/or `python`) to ``None`` if you - wish to map *all* distributions, not just those compatible with the - running platform or Python version. - """ - self._distmap = {} - self.platform = platform - self.python = python - self.scan(search_path) - - def can_add(self, dist): - """Is distribution `dist` acceptable for this environment? - - The distribution must match the platform and python version - requirements specified when this environment was created, or False - is returned. - """ - py_compat = ( - self.python is None - or dist.py_version is None - or dist.py_version == self.python - ) - return py_compat and compatible_platforms(dist.platform, self.platform) - - def remove(self, dist): - """Remove `dist` from the environment""" - self._distmap[dist.key].remove(dist) - - def scan(self, search_path=None): - """Scan `search_path` for distributions usable in this environment - - Any distributions found are added to the environment. - `search_path` should be a sequence of ``sys.path`` items. If not - supplied, ``sys.path`` is used. Only distributions conforming to - the platform/python version defined at initialization are added. - """ - if search_path is None: - search_path = sys.path - - for item in search_path: - for dist in find_distributions(item): - self.add(dist) - - def __getitem__(self, project_name): - """Return a newest-to-oldest list of distributions for `project_name` - - Uses case-insensitive `project_name` comparison, assuming all the - project's distributions use their project's name converted to all - lowercase as their key. - - """ - distribution_key = project_name.lower() - return self._distmap.get(distribution_key, []) - - def add(self, dist): - """Add `dist` if we ``can_add()`` it and it has not already been added - """ - if self.can_add(dist) and dist.has_version(): - dists = self._distmap.setdefault(dist.key, []) - if dist not in dists: - dists.append(dist) - dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) - - def best_match( - self, req, working_set, installer=None, replace_conflicting=False): - """Find distribution best matching `req` and usable on `working_set` - - This calls the ``find(req)`` method of the `working_set` to see if a - suitable distribution is already active. (This may raise - ``VersionConflict`` if an unsuitable version of the project is already - active in the specified `working_set`.) If a suitable distribution - isn't active, this method returns the newest distribution in the - environment that meets the ``Requirement`` in `req`. If no suitable - distribution is found, and `installer` is supplied, then the result of - calling the environment's ``obtain(req, installer)`` method will be - returned. - """ - try: - dist = working_set.find(req) - except VersionConflict: - if not replace_conflicting: - raise - dist = None - if dist is not None: - return dist - for dist in self[req.key]: - if dist in req: - return dist - # try to download/install - return self.obtain(req, installer) - - def obtain(self, requirement, installer=None): - """Obtain a distribution matching `requirement` (e.g. via download) - - Obtain a distro that matches requirement (e.g. via download). In the - base ``Environment`` class, this routine just returns - ``installer(requirement)``, unless `installer` is None, in which case - 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) - - def __iter__(self): - """Yield the unique project names of the available distributions""" - for key in self._distmap.keys(): - if self[key]: - yield key - - def __iadd__(self, other): - """In-place addition of a distribution or environment""" - if isinstance(other, Distribution): - self.add(other) - elif isinstance(other, Environment): - for project in other: - for dist in other[project]: - self.add(dist) - else: - raise TypeError("Can't add %r to environment" % (other,)) - return self - - def __add__(self, other): - """Add an environment or distribution to an environment""" - new = self.__class__([], platform=None, python=None) - for env in self, other: - new += env - return new - - -# XXX backward compatibility -AvailableDistributions = Environment - - -class ExtractionError(RuntimeError): - """An error occurred extracting a resource - - The following attributes are available from instances of this exception: - - manager - The resource manager that raised this exception - - cache_path - The base directory for resource extraction - - original_error - The exception instance that caused extraction to fail - """ - - -class ResourceManager: - """Manage resource extraction and packages""" - extraction_path = None - - def __init__(self): - self.cached_files = {} - - def resource_exists(self, package_or_requirement, resource_name): - """Does the named resource exist?""" - return get_provider(package_or_requirement).has_resource(resource_name) - - def resource_isdir(self, package_or_requirement, resource_name): - """Is the named resource an existing directory?""" - return get_provider(package_or_requirement).resource_isdir( - resource_name - ) - - def resource_filename(self, package_or_requirement, resource_name): - """Return a true filesystem path for specified resource""" - return get_provider(package_or_requirement).get_resource_filename( - self, resource_name - ) - - def resource_stream(self, package_or_requirement, resource_name): - """Return a readable file-like object for specified resource""" - return get_provider(package_or_requirement).get_resource_stream( - self, resource_name - ) - - def resource_string(self, package_or_requirement, resource_name): - """Return specified resource as a string""" - return get_provider(package_or_requirement).get_resource_string( - self, resource_name - ) - - def resource_listdir(self, package_or_requirement, resource_name): - """List the contents of the named resource directory""" - return get_provider(package_or_requirement).resource_listdir( - resource_name - ) - - def extraction_error(self): - """Give an error message for problems extracting file(s)""" - - old_exc = sys.exc_info()[1] - cache_path = self.extraction_path or get_default_cache() - - tmpl = textwrap.dedent(""" - Can't extract file(s) to egg cache - - The following error occurred while trying to extract file(s) - to the Python egg cache: - - {old_exc} - - The Python egg cache directory is currently set to: - - {cache_path} - - Perhaps your account does not have write access to this directory? - You can change the cache directory by setting the PYTHON_EGG_CACHE - environment variable to point to an accessible directory. - """).lstrip() - err = ExtractionError(tmpl.format(**locals())) - err.manager = self - err.cache_path = cache_path - err.original_error = old_exc - raise err - - def get_cache_path(self, archive_name, names=()): - """Return absolute location in cache for `archive_name` and `names` - - The parent directory of the resulting path will be created if it does - not already exist. `archive_name` should be the base filename of the - enclosing egg (which may not be the name of the enclosing zipfile!), - including its ".egg" extension. `names`, if provided, should be a - sequence of path name parts "under" the egg's extraction location. - - This method should only be called by resource providers that need to - obtain an extraction location, and only for names they intend to - extract, as it tracks the generated names for possible cleanup later. - """ - extract_path = self.extraction_path or get_default_cache() - target_path = os.path.join(extract_path, archive_name + '-tmp', *names) - try: - _bypass_ensure_directory(target_path) - except Exception: - self.extraction_error() - - self._warn_unsafe_extraction_path(extract_path) - - self.cached_files[target_path] = 1 - return target_path - - @staticmethod - def _warn_unsafe_extraction_path(path): - """ - If the default extraction path is overridden and set to an insecure - location, such as /tmp, it opens up an opportunity for an attacker to - replace an extracted file with an unauthorized payload. Warn the user - if a known insecure location is used. - - See Distribute #375 for more details. - """ - if os.name == 'nt' and not path.startswith(os.environ['windir']): - # On Windows, permissions are generally restrictive by default - # and temp directories are not writable by other users, so - # bypass the warning. - return - mode = os.stat(path).st_mode - if mode & stat.S_IWOTH or mode & stat.S_IWGRP: - msg = ( - "%s is writable by group/others and vulnerable to attack " - "when " - "used with get_resource_filename. Consider a more secure " - "location (set with .set_extraction_path or the " - "PYTHON_EGG_CACHE environment variable)." % path - ) - warnings.warn(msg, UserWarning) - - def postprocess(self, tempname, filename): - """Perform any platform-specific postprocessing of `tempname` - - This is where Mac header rewrites should be done; other platforms don't - have anything special they should do. - - Resource providers should call this method ONLY after successfully - extracting a compressed resource. They must NOT call it on resources - that are already in the filesystem. - - `tempname` is the current (temporary) name of the file, and `filename` - is the name it will be renamed to by the caller after this routine - returns. - """ - - if os.name == 'posix': - # Make the resource executable - mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777 - os.chmod(tempname, mode) - - def set_extraction_path(self, path): - """Set the base path where resources will be extracted to, if needed. - - If you do not call this routine before any extractions take place, the - path defaults to the return value of ``get_default_cache()``. (Which - is based on the ``PYTHON_EGG_CACHE`` environment variable, with various - platform-specific fallbacks. See that routine's documentation for more - details.) - - Resources are extracted to subdirectories of this path based upon - information given by the ``IResourceProvider``. You may set this to a - temporary directory, but then you must call ``cleanup_resources()`` to - delete the extracted files when done. There is no guarantee that - ``cleanup_resources()`` will be able to remove all extracted files. - - (Note: you may not change the extraction path for a given resource - manager once resources have been extracted, unless you first call - ``cleanup_resources()``.) - """ - if self.cached_files: - raise ValueError( - "Can't change extraction path, files already extracted" - ) - - self.extraction_path = path - - def cleanup_resources(self, force=False): - """ - Delete all extracted resource files and directories, returning a list - of the file and directory names that could not be successfully removed. - This function does not have any concurrency protection, so it should - generally only be called when the extraction path is a temporary - directory exclusive to a single process. This method is not - automatically called; you must call it explicitly or register it as an - ``atexit`` function if you wish to ensure cleanup of a temporary - directory used for extractions. - """ - # XXX - - -def get_default_cache(): - """ - Return the ``PYTHON_EGG_CACHE`` environment variable - or a platform-relevant user cache dir for an app - named "Python-Eggs". - """ - return ( - os.environ.get('PYTHON_EGG_CACHE') - or appdirs.user_cache_dir(appname='Python-Eggs') - ) - - -def safe_name(name): - """Convert an arbitrary string to a standard distribution name - - Any runs of non-alphanumeric/. characters are replaced with a single '-'. - """ - return re.sub('[^A-Za-z0-9.]+', '-', name) - - -def safe_version(version): - """ - Convert an arbitrary string to a standard version string - """ - try: - # normalize the version - return str(packaging.version.Version(version)) - except packaging.version.InvalidVersion: - version = version.replace(' ', '.') - return re.sub('[^A-Za-z0-9.]+', '-', version) - - -def safe_extra(extra): - """Convert an arbitrary string to a standard 'extra' name - - Any runs of non-alphanumeric characters are replaced with a single '_', - and the result is always lowercased. - """ - return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() - - -def to_filename(name): - """Convert a project or version name to its filename-escaped form - - Any '-' characters are currently replaced with '_'. - """ - return name.replace('-', '_') - - -def invalid_marker(text): - """ - Validate text as a PEP 508 environment marker; return an exception - if invalid or False otherwise. - """ - try: - evaluate_marker(text) - except SyntaxError as e: - e.filename = None - e.lineno = None - return e - return False - - -def evaluate_marker(text, extra=None): - """ - Evaluate a PEP 508 environment marker. - Return a boolean indicating the marker result in this environment. - Raise SyntaxError if marker is invalid. - - This implementation uses the 'pyparsing' module. - """ - try: - marker = packaging.markers.Marker(text) - return marker.evaluate() - except packaging.markers.InvalidMarker as e: - raise SyntaxError(e) - - -class NullProvider: - """Try to implement resources and metadata for arbitrary PEP 302 loaders""" - - egg_name = None - egg_info = None - loader = None - - def __init__(self, module): - self.loader = getattr(module, '__loader__', None) - self.module_path = os.path.dirname(getattr(module, '__file__', '')) - - def get_resource_filename(self, manager, resource_name): - return self._fn(self.module_path, resource_name) - - 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): - return self._get(self._fn(self.module_path, resource_name)) - - def has_resource(self, resource_name): - return self._has(self._fn(self.module_path, resource_name)) - - def has_metadata(self, name): - return self.egg_info and self._has(self._fn(self.egg_info, name)) - - def get_metadata(self, name): - if not self.egg_info: - return "" - value = self._get(self._fn(self.egg_info, name)) - return value.decode('utf-8') if six.PY3 else value - - def get_metadata_lines(self, name): - return yield_lines(self.get_metadata(name)) - - 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 resource_listdir(self, resource_name): - return self._listdir(self._fn(self.module_path, resource_name)) - - def metadata_listdir(self, name): - if self.egg_info: - return self._listdir(self._fn(self.egg_info, name)) - return [] - - def run_script(self, script_name, namespace): - script = 'scripts/' + script_name - if not self.has_metadata(script): - raise ResolutionError( - "Script {script!r} not found in metadata at {self.egg_info!r}" - .format(**locals()), - ) - script_text = self.get_metadata(script).replace('\r\n', '\n') - script_text = script_text.replace('\r', '\n') - script_filename = self._fn(self.egg_info, script) - namespace['__file__'] = script_filename - if os.path.exists(script_filename): - source = open(script_filename).read() - code = compile(source, script_filename, 'exec') - exec(code, namespace, namespace) - else: - from linecache import cache - cache[script_filename] = ( - len(script_text), 0, script_text.split('\n'), script_filename - ) - script_code = compile(script_text, script_filename, 'exec') - exec(script_code, namespace, namespace) - - def _has(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _isdir(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _listdir(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _fn(self, base, resource_name): - if resource_name: - return os.path.join(base, *resource_name.split('/')) - return base - - def _get(self, path): - if hasattr(self.loader, 'get_data'): - return self.loader.get_data(path) - raise NotImplementedError( - "Can't perform this operation for loaders without 'get_data()'" - ) - - -register_loader_type(object, NullProvider) - - -class EggProvider(NullProvider): - """Provider based on a virtual filesystem""" - - def __init__(self, module): - NullProvider.__init__(self, module) - self._setup_prefix() - - def _setup_prefix(self): - # we assume here that our metadata may be nested inside a "basket" - # of multiple eggs; that's why we use module_path instead of .archive - path = self.module_path - old = None - while path != old: - if _is_egg_path(path): - self.egg_name = os.path.basename(path) - self.egg_info = os.path.join(path, 'EGG-INFO') - self.egg_root = path - break - old = path - path, base = os.path.split(path) - - -class DefaultProvider(EggProvider): - """Provides access to package resources in the filesystem""" - - def _has(self, path): - return os.path.exists(path) - - def _isdir(self, path): - return os.path.isdir(path) - - def _listdir(self, path): - return os.listdir(path) - - def get_resource_stream(self, manager, resource_name): - return open(self._fn(self.module_path, resource_name), 'rb') - - def _get(self, path): - with open(path, 'rb') as stream: - return stream.read() - - @classmethod - def _register(cls): - loader_names = 'SourceFileLoader', 'SourcelessFileLoader', - for name in loader_names: - loader_cls = getattr(importlib_machinery, name, type(None)) - register_loader_type(loader_cls, cls) - - -DefaultProvider._register() - - -class EmptyProvider(NullProvider): - """Provider that returns nothing for all requests""" - - module_path = None - - _isdir = _has = lambda self, path: False - - def _get(self, path): - return '' - - def _listdir(self, path): - return [] - - def __init__(self): - pass - - -empty_provider = EmptyProvider() - - -class ZipManifests(dict): - """ - zip manifest builder - """ - - @classmethod - def build(cls, path): - """ - Build a dictionary similar to the zipimport directory - caches, except instead of tuples, store ZipInfo objects. - - Use a platform-specific path separator (os.sep) for the path keys - for compatibility with pypy on Windows. - """ - with zipfile.ZipFile(path) as zfile: - items = ( - ( - name.replace('/', os.sep), - zfile.getinfo(name), - ) - for name in zfile.namelist() - ) - return dict(items) - - load = build - - -class MemoizedZipManifests(ZipManifests): - """ - Memoized zipfile manifests. - """ - manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime') - - def load(self, path): - """ - Load a manifest at path or return a suitable manifest already loaded. - """ - path = os.path.normpath(path) - mtime = os.stat(path).st_mtime - - if path not in self or self[path].mtime != mtime: - manifest = self.build(path) - self[path] = self.manifest_mod(manifest, mtime) - - return self[path].manifest - - -class ZipProvider(EggProvider): - """Resource support for zips and eggs""" - - eagers = None - _zip_manifests = MemoizedZipManifests() - - def __init__(self, module): - EggProvider.__init__(self, module) - self.zip_pre = self.loader.archive + os.sep - - def _zipinfo_name(self, fspath): - # Convert a virtual filename (full path to file) into a zipfile subpath - # usable with the zipimport directory cache for our target archive - fspath = fspath.rstrip(os.sep) - if fspath == self.loader.archive: - return '' - if fspath.startswith(self.zip_pre): - return fspath[len(self.zip_pre):] - raise AssertionError( - "%s is not a subpath of %s" % (fspath, self.zip_pre) - ) - - def _parts(self, zip_path): - # Convert a zipfile subpath into an egg-relative path part list. - # pseudo-fs path - fspath = self.zip_pre + zip_path - if fspath.startswith(self.egg_root + os.sep): - return fspath[len(self.egg_root) + 1:].split(os.sep) - raise AssertionError( - "%s is not a subpath of %s" % (fspath, self.egg_root) - ) - - @property - def zipinfo(self): - return self._zip_manifests.load(self.loader.archive) - - def get_resource_filename(self, manager, resource_name): - if not self.egg_name: - raise NotImplementedError( - "resource_filename() only supported for .egg, not .zip" - ) - # no need to lock for extraction, since we use temp names - zip_path = self._resource_to_zip(resource_name) - eagers = self._get_eager_resources() - if '/'.join(self._parts(zip_path)) in eagers: - for name in eagers: - self._extract_resource(manager, self._eager_to_zip(name)) - return self._extract_resource(manager, zip_path) - - @staticmethod - def _get_date_and_size(zip_stat): - size = zip_stat.file_size - # ymdhms+wday, yday, dst - date_time = zip_stat.date_time + (0, 0, -1) - # 1980 offset already done - timestamp = time.mktime(date_time) - return timestamp, size - - def _extract_resource(self, manager, zip_path): - - if zip_path in self._index(): - for name in self._index()[zip_path]: - last = self._extract_resource( - manager, os.path.join(zip_path, name) - ) - # return the extracted directory name - return os.path.dirname(last) - - timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) - - if not WRITE_SUPPORT: - raise IOError('"os.rename" and "os.unlink" are not supported ' - 'on this platform') - try: - - real_path = manager.get_cache_path( - self.egg_name, self._parts(zip_path) - ) - - if self._is_current(real_path, zip_path): - return real_path - - outf, tmpnam = _mkstemp( - ".$extract", - dir=os.path.dirname(real_path), - ) - os.write(outf, self.loader.get_data(zip_path)) - os.close(outf) - utime(tmpnam, (timestamp, timestamp)) - manager.postprocess(tmpnam, real_path) - - try: - rename(tmpnam, real_path) - - except os.error: - if os.path.isfile(real_path): - if self._is_current(real_path, zip_path): - # the file became current since it was checked above, - # so proceed. - return real_path - # Windows, del old file and retry - elif os.name == 'nt': - unlink(real_path) - rename(tmpnam, real_path) - return real_path - raise - - except os.error: - # report a user-friendly error - manager.extraction_error() - - return real_path - - def _is_current(self, file_path, zip_path): - """ - Return True if the file_path is current for this zip_path - """ - timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) - if not os.path.isfile(file_path): - return False - stat = os.stat(file_path) - if stat.st_size != size or stat.st_mtime != timestamp: - return False - # check that the contents match - zip_contents = self.loader.get_data(zip_path) - with open(file_path, 'rb') as f: - file_contents = f.read() - return zip_contents == file_contents - - def _get_eager_resources(self): - if self.eagers is None: - eagers = [] - for name in ('native_libs.txt', 'eager_resources.txt'): - if self.has_metadata(name): - eagers.extend(self.get_metadata_lines(name)) - self.eagers = eagers - return self.eagers - - def _index(self): - try: - return self._dirindex - except AttributeError: - ind = {} - for path in self.zipinfo: - parts = path.split(os.sep) - while parts: - parent = os.sep.join(parts[:-1]) - if parent in ind: - ind[parent].append(parts[-1]) - break - else: - ind[parent] = [parts.pop()] - self._dirindex = ind - return ind - - def _has(self, fspath): - zip_path = self._zipinfo_name(fspath) - return zip_path in self.zipinfo or zip_path in self._index() - - def _isdir(self, fspath): - return self._zipinfo_name(fspath) in self._index() - - def _listdir(self, fspath): - return list(self._index().get(self._zipinfo_name(fspath), ())) - - def _eager_to_zip(self, resource_name): - return self._zipinfo_name(self._fn(self.egg_root, resource_name)) - - def _resource_to_zip(self, resource_name): - return self._zipinfo_name(self._fn(self.module_path, resource_name)) - - -register_loader_type(zipimport.zipimporter, ZipProvider) - - -class FileMetadata(EmptyProvider): - """Metadata handler for standalone PKG-INFO files - - Usage:: - - metadata = FileMetadata("/path/to/PKG-INFO") - - This provider rejects all data and metadata requests except for PKG-INFO, - which is treated as existing, and will be the contents of the file at - the provided location. - """ - - def __init__(self, path): - self.path = path - - def has_metadata(self, name): - 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: - metadata = f.read() - self._warn_on_replacement(metadata) - return metadata - - def _warn_on_replacement(self, metadata): - # Python 2.7 compat for: replacement_char = '�' - replacement_char = b'\xef\xbf\xbd'.decode('utf-8') - if replacement_char in metadata: - tmpl = "{self.path} could not be properly decoded in UTF-8" - msg = tmpl.format(**locals()) - warnings.warn(msg) - - def get_metadata_lines(self, name): - return yield_lines(self.get_metadata(name)) - - -class PathMetadata(DefaultProvider): - """Metadata provider for egg directories - - Usage:: - - # Development eggs: - - egg_info = "/path/to/PackageName.egg-info" - base_dir = os.path.dirname(egg_info) - metadata = PathMetadata(base_dir, egg_info) - dist_name = os.path.splitext(os.path.basename(egg_info))[0] - dist = Distribution(basedir, project_name=dist_name, metadata=metadata) - - # Unpacked egg directories: - - egg_path = "/path/to/PackageName-ver-pyver-etc.egg" - metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO')) - dist = Distribution.from_filename(egg_path, metadata=metadata) - """ - - def __init__(self, path, egg_info): - self.module_path = path - self.egg_info = egg_info - - -class EggMetadata(ZipProvider): - """Metadata provider for .egg files""" - - def __init__(self, importer): - """Create a metadata provider from a zipimporter""" - - self.zip_pre = importer.archive + os.sep - self.loader = importer - if importer.prefix: - self.module_path = os.path.join(importer.archive, importer.prefix) - else: - self.module_path = importer.archive - self._setup_prefix() - - -_declare_state('dict', _distribution_finders={}) - - -def register_finder(importer_type, distribution_finder): - """Register `distribution_finder` to find distributions in sys.path items - - `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item - handler), and `distribution_finder` is a callable that, passed a path - item and the importer instance, yields ``Distribution`` instances found on - that path item. See ``pkg_resources.find_on_path`` for an example.""" - _distribution_finders[importer_type] = distribution_finder - - -def find_distributions(path_item, only=False): - """Yield distributions accessible via `path_item`""" - importer = get_importer(path_item) - finder = _find_adapter(_distribution_finders, importer) - return finder(importer, path_item, only) - - -def find_eggs_in_zip(importer, path_item, only=False): - """ - Find eggs in zip files; possibly multiple nested eggs. - """ - if importer.archive.endswith('.whl'): - # wheels are not supported with this finder - # they don't have PKG-INFO metadata, and won't ever contain eggs - return - metadata = EggMetadata(importer) - if metadata.has_metadata('PKG-INFO'): - yield Distribution.from_filename(path_item, metadata=metadata) - if only: - # don't yield nested distros - return - for subitem in metadata.resource_listdir('/'): - 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 - elif subitem.lower().endswith('.dist-info'): - subpath = os.path.join(path_item, subitem) - submeta = EggMetadata(zipimport.zipimporter(subpath)) - submeta.egg_info = subpath - yield Distribution.from_location(path_item, subitem, submeta) - - -register_finder(zipimport.zipimporter, find_eggs_in_zip) - - -def find_nothing(importer, path_item, only=False): - return () - - -register_finder(object, find_nothing) - - -def _by_version_descending(names): - """ - Given a list of filenames, return them in descending order - by version number. - - >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg' - >>> _by_version_descending(names) - ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar'] - >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg' - >>> _by_version_descending(names) - ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg'] - >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg' - >>> _by_version_descending(names) - ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg'] - """ - def _by_version(name): - """ - Parse each component of the filename - """ - name, ext = os.path.splitext(name) - parts = itertools.chain(name.split('-'), [ext]) - return [packaging.version.parse(part) for part in parts] - - return sorted(names, key=_by_version, reverse=True) - - -def find_on_path(importer, path_item, only=False): - """Yield distributions accessible on a sys.path directory""" - path_item = _normalize_cached(path_item) - - if _is_unpacked_egg(path_item): - yield Distribution.from_filename( - path_item, metadata=PathMetadata( - path_item, os.path.join(path_item, 'EGG-INFO') - ) - ) - return - - entries = safe_listdir(path_item) - - # for performance, before sorting by version, - # screen entries for only those that will yield - # distributions - filtered = ( - entry - for entry in entries - if dist_factory(path_item, entry, only) - ) - - # scan for .egg and .egg-info in directory - path_item_entries = _by_version_descending(filtered) - for entry in path_item_entries: - fullpath = os.path.join(path_item, entry) - factory = dist_factory(path_item, entry, only) - for dist in factory(fullpath): - yield dist - - -def dist_factory(path_item, entry, only): - """ - Return a dist_factory for a path_item and entry - """ - lower = entry.lower() - is_meta = any(map(lower.endswith, ('.egg-info', '.dist-info'))) - return ( - distributions_from_metadata - if is_meta else - find_distributions - if not only and _is_egg_path(entry) else - resolve_egg_link - if not only and lower.endswith('.egg-link') else - NoDists() - ) - - -class NoDists: - """ - >>> bool(NoDists()) - False - - >>> list(NoDists()('anything')) - [] - """ - def __bool__(self): - return False - if six.PY2: - __nonzero__ = __bool__ - - def __call__(self, fullpath): - return iter(()) - - -def safe_listdir(path): - """ - Attempt to list contents of path, but suppress some exceptions. - """ - try: - return os.listdir(path) - except (PermissionError, NotADirectoryError): - pass - except OSError as e: - # Ignore the directory if does not exist, not a directory or - # permission denied - ignorable = ( - e.errno in (errno.ENOTDIR, errno.EACCES, errno.ENOENT) - # Python 2 on Windows needs to be handled this way :( - or getattr(e, "winerror", None) == 267 - ) - if not ignorable: - raise - return () - - -def distributions_from_metadata(path): - root = os.path.dirname(path) - if os.path.isdir(path): - if len(os.listdir(path)) == 0: - # empty metadata dir; skip - return - metadata = PathMetadata(root, path) - else: - metadata = FileMetadata(path) - entry = os.path.basename(path) - yield Distribution.from_location( - root, entry, metadata, precedence=DEVELOP_DIST, - ) - - -def non_empty_lines(path): - """ - Yield non-empty lines from file at path - """ - with open(path) as f: - for line in f: - line = line.strip() - if line: - yield line - - -def resolve_egg_link(path): - """ - Given a path to an .egg-link, resolve distributions - present in the referenced path. - """ - referenced_paths = non_empty_lines(path) - resolved_paths = ( - os.path.join(os.path.dirname(path), ref) - for ref in referenced_paths - ) - dist_groups = map(find_distributions, resolved_paths) - return next(dist_groups, ()) - - -register_finder(pkgutil.ImpImporter, find_on_path) - -if hasattr(importlib_machinery, 'FileFinder'): - register_finder(importlib_machinery.FileFinder, find_on_path) - -_declare_state('dict', _namespace_handlers={}) -_declare_state('dict', _namespace_packages={}) - - -def register_namespace_handler(importer_type, namespace_handler): - """Register `namespace_handler` to declare namespace packages - - `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item - handler), and `namespace_handler` is a callable like this:: - - def namespace_handler(importer, path_entry, moduleName, module): - # return a path_entry to use for child packages - - Namespace handlers are only called if the importer object has already - agreed that it can handle the relevant path item, and they should only - return a subpath if the module __path__ does not already contain an - equivalent subpath. For an example namespace handler, see - ``pkg_resources.file_ns_handler``. - """ - _namespace_handlers[importer_type] = namespace_handler - - -def _handle_ns(packageName, path_item): - """Ensure that named package includes a subpath of path_item (if needed)""" - - importer = get_importer(path_item) - if importer is None: - return None - - # capture warnings due to #1111 - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - loader = importer.find_module(packageName) - - if loader is None: - return None - module = sys.modules.get(packageName) - if module is None: - module = sys.modules[packageName] = types.ModuleType(packageName) - module.__path__ = [] - _set_parent_ns(packageName) - elif not hasattr(module, '__path__'): - raise TypeError("Not a package:", packageName) - handler = _find_adapter(_namespace_handlers, importer) - subpath = handler(importer, path_item, packageName, module) - if subpath is not None: - path = module.__path__ - path.append(subpath) - loader.load_module(packageName) - _rebuild_mod_path(path, packageName, module) - return subpath - - -def _rebuild_mod_path(orig_path, package_name, module): - """ - Rebuild module.__path__ ensuring that all entries are ordered - corresponding to their sys.path order - """ - sys_path = [_normalize_cached(p) for p in sys.path] - - def safe_sys_path_index(entry): - """ - Workaround for #520 and #513. - """ - try: - return sys_path.index(entry) - except ValueError: - return float('inf') - - def position_in_sys_path(path): - """ - Return the ordinal of the path based on its position in sys.path - """ - path_parts = path.split(os.sep) - module_parts = package_name.count('.') + 1 - parts = path_parts[:-module_parts] - return safe_sys_path_index(_normalize_cached(os.sep.join(parts))) - - new_path = sorted(orig_path, key=position_in_sys_path) - new_path = [_normalize_cached(p) for p in new_path] - - if isinstance(module.__path__, list): - module.__path__[:] = new_path - else: - module.__path__ = new_path - - -def declare_namespace(packageName): - """Declare that package 'packageName' is a namespace package""" - - _imp.acquire_lock() - try: - if packageName in _namespace_packages: - return - - path = sys.path - parent, _, _ = packageName.rpartition('.') - - if parent: - declare_namespace(parent) - if parent not in _namespace_packages: - __import__(parent) - try: - path = sys.modules[parent].__path__ - except AttributeError: - raise TypeError("Not a package:", parent) - - # Track what packages are namespaces, so when new path items are added, - # they can be updated - _namespace_packages.setdefault(parent or None, []).append(packageName) - _namespace_packages.setdefault(packageName, []) - - for path_item in path: - # Ensure all the parent's path items are reflected in the child, - # if they apply - _handle_ns(packageName, path_item) - - finally: - _imp.release_lock() - - -def fixup_namespace_packages(path_item, parent=None): - """Ensure that previously-declared namespace packages include path_item""" - _imp.acquire_lock() - try: - for package in _namespace_packages.get(parent, ()): - subpath = _handle_ns(package, path_item) - if subpath: - fixup_namespace_packages(subpath, package) - finally: - _imp.release_lock() - - -def file_ns_handler(importer, path_item, packageName, module): - """Compute an ns-package subpath for a filesystem or zipfile importer""" - - subpath = os.path.join(path_item, packageName.split('.')[-1]) - normalized = _normalize_cached(subpath) - for item in module.__path__: - if _normalize_cached(item) == normalized: - break - else: - # Only return the path if it's not already there - return subpath - - -register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) -register_namespace_handler(zipimport.zipimporter, file_ns_handler) - -if hasattr(importlib_machinery, 'FileFinder'): - register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) - - -def null_ns_handler(importer, path_item, packageName, module): - return None - - -register_namespace_handler(object, null_ns_handler) - - -def normalize_path(filename): - """Normalize a file/dir name for comparison purposes""" - return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename)))) - - -def _cygwin_patch(filename): # pragma: nocover - """ - Contrary to POSIX 2008, on Cygwin, getcwd (3) contains - symlink components. Using - os.path.abspath() works around this limitation. A fix in os.getcwd() - would probably better, in Cygwin even more so, except - that this seems to be by design... - """ - 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 - - -def _is_egg_path(path): - """ - Determine if given path appears to be an egg. - """ - return path.lower().endswith('.egg') - - -def _is_unpacked_egg(path): - """ - Determine if given path appears to be an unpacked egg. - """ - return ( - _is_egg_path(path) and - os.path.isfile(os.path.join(path, 'EGG-INFO', 'PKG-INFO')) - ) - - -def _set_parent_ns(packageName): - parts = packageName.split('.') - name = parts.pop() - if parts: - parent = '.'.join(parts) - setattr(sys.modules[parent], name, sys.modules[packageName]) - - -def yield_lines(strs): - """Yield non-empty/non-comment lines of a string or sequence""" - if isinstance(strs, six.string_types): - for s in strs.splitlines(): - s = s.strip() - # skip blank lines/comments - if s and not s.startswith('#'): - yield s - else: - for ss in strs: - for s in yield_lines(ss): - yield s - - -MODULE = re.compile(r"\w+(\.\w+)*$").match -EGG_NAME = re.compile( - r""" - (?P<name>[^-]+) ( - -(?P<ver>[^-]+) ( - -py(?P<pyver>[^-]+) ( - -(?P<plat>.+) - )? - )? - )? - """, - re.VERBOSE | re.IGNORECASE, -).match - - -class EntryPoint: - """Object representing an advertised importable object""" - - def __init__(self, name, module_name, attrs=(), extras=(), dist=None): - if not MODULE(module_name): - raise ValueError("Invalid module name", module_name) - self.name = name - self.module_name = module_name - self.attrs = tuple(attrs) - self.extras = tuple(extras) - self.dist = dist - - def __str__(self): - s = "%s = %s" % (self.name, self.module_name) - if self.attrs: - s += ':' + '.'.join(self.attrs) - if self.extras: - s += ' [%s]' % ','.join(self.extras) - return s - - def __repr__(self): - return "EntryPoint.parse(%r)" % str(self) - - def load(self, require=True, *args, **kwargs): - """ - Require packages for this EntryPoint, then resolve it. - """ - if not require or args or kwargs: - warnings.warn( - "Parameters to load are deprecated. Call .resolve and " - ".require separately.", - PkgResourcesDeprecationWarning, - stacklevel=2, - ) - if require: - self.require(*args, **kwargs) - return self.resolve() - - def resolve(self): - """ - Resolve the entry point from its module and attrs. - """ - module = __import__(self.module_name, fromlist=['__name__'], level=0) - try: - return functools.reduce(getattr, self.attrs, module) - except AttributeError as exc: - raise ImportError(str(exc)) - - def require(self, env=None, installer=None): - if self.extras and not self.dist: - raise UnknownExtra("Can't require() without a distribution", self) - - # Get the requirements for this entry point with all its extras and - # then resolve them. We have to pass `extras` along when resolving so - # that the working set knows what extras we want. Otherwise, for - # dist-info distributions, the working set will assume that the - # requirements for that extra are purely optional and skip over them. - reqs = self.dist.requires(self.extras) - items = working_set.resolve(reqs, env, installer, extras=self.extras) - list(map(working_set.add, items)) - - pattern = re.compile( - r'\s*' - r'(?P<name>.+?)\s*' - r'=\s*' - r'(?P<module>[\w.]+)\s*' - r'(:\s*(?P<attr>[\w.]+))?\s*' - r'(?P<extras>\[.*\])?\s*$' - ) - - @classmethod - def parse(cls, src, dist=None): - """Parse a single entry point from string `src` - - Entry point syntax follows the form:: - - name = some.module:some.attr [extra1, extra2] - - The entry name and module name are required, but the ``:attrs`` and - ``[extras]`` parts are optional - """ - m = cls.pattern.match(src) - if not m: - msg = "EntryPoint must be in 'name=module:attrs [extras]' format" - raise ValueError(msg, src) - res = m.groupdict() - extras = cls._parse_extras(res['extras']) - attrs = res['attr'].split('.') if res['attr'] else () - return cls(res['name'], res['module'], attrs, extras, dist) - - @classmethod - def _parse_extras(cls, extras_spec): - if not extras_spec: - return () - req = Requirement.parse('x' + extras_spec) - if req.specs: - raise ValueError() - return req.extras - - @classmethod - def parse_group(cls, group, lines, dist=None): - """Parse an entry point group""" - if not MODULE(group): - raise ValueError("Invalid group name", group) - this = {} - for line in yield_lines(lines): - ep = cls.parse(line, dist) - if ep.name in this: - raise ValueError("Duplicate entry point", group, ep.name) - this[ep.name] = ep - return this - - @classmethod - def parse_map(cls, data, dist=None): - """Parse a map of entry point groups""" - if isinstance(data, dict): - data = data.items() - else: - data = split_sections(data) - maps = {} - for group, lines in data: - if group is None: - if not lines: - continue - raise ValueError("Entry points must be listed in groups") - group = group.strip() - if group in maps: - raise ValueError("Duplicate group name", group) - maps[group] = cls.parse_group(group, lines, dist) - return maps - - -def _remove_md5_fragment(location): - if not location: - return '' - parsed = urllib.parse.urlparse(location) - if parsed[-1].startswith('md5='): - return urllib.parse.urlunparse(parsed[:-1] + ('',)) - return location - - -def _version_from_file(lines): - """ - Given an iterable of lines from a Metadata file, return - the value of the Version field, if present, or None otherwise. - """ - def is_version_line(line): - return line.lower().startswith('version:') - version_lines = filter(is_version_line, lines) - line = next(iter(version_lines), '') - _, _, value = line.partition(':') - return safe_version(value.strip()) or None - - -class Distribution: - """Wrap an actual or potential sys.path entry w/metadata""" - PKG_INFO = 'PKG-INFO' - - def __init__( - self, location=None, metadata=None, project_name=None, - version=None, py_version=PY_MAJOR, platform=None, - precedence=EGG_DIST): - self.project_name = safe_name(project_name or 'Unknown') - if version is not None: - self._version = safe_version(version) - self.py_version = py_version - self.platform = platform - self.location = location - self.precedence = precedence - self._provider = metadata or empty_provider - - @classmethod - def from_location(cls, location, basename, metadata=None, **kw): - project_name, version, py_version, platform = [None] * 4 - basename, ext = os.path.splitext(basename) - if ext.lower() in _distributionImpl: - cls = _distributionImpl[ext.lower()] - - match = EGG_NAME(basename) - if match: - project_name, version, py_version, platform = match.group( - 'name', 'ver', 'pyver', 'plat' - ) - return cls( - location, metadata, project_name=project_name, version=version, - py_version=py_version, platform=platform, **kw - )._reload_version() - - def _reload_version(self): - return self - - @property - def hashcmp(self): - return ( - self.parsed_version, - self.precedence, - self.key, - _remove_md5_fragment(self.location), - self.py_version or '', - self.platform or '', - ) - - def __hash__(self): - return hash(self.hashcmp) - - def __lt__(self, other): - return self.hashcmp < other.hashcmp - - def __le__(self, other): - return self.hashcmp <= other.hashcmp - - def __gt__(self, other): - return self.hashcmp > other.hashcmp - - def __ge__(self, other): - return self.hashcmp >= other.hashcmp - - def __eq__(self, other): - if not isinstance(other, self.__class__): - # It's not a Distribution, so they are not equal - return False - return self.hashcmp == other.hashcmp - - def __ne__(self, other): - return not self == other - - # These properties have to be lazy so that we don't have to load any - # metadata until/unless it's actually needed. (i.e., some distributions - # may not know their name or version without loading PKG-INFO) - - @property - def key(self): - try: - return self._key - except AttributeError: - self._key = key = self.project_name.lower() - return key - - @property - def parsed_version(self): - if not hasattr(self, "_parsed_version"): - self._parsed_version = parse_version(self.version) - - return self._parsed_version - - def _warn_legacy_version(self): - LV = packaging.version.LegacyVersion - is_legacy = isinstance(self._parsed_version, LV) - if not is_legacy: - return - - # While an empty version is technically a legacy version and - # is not a valid PEP 440 version, it's also unlikely to - # actually come from someone and instead it is more likely that - # it comes from setuptools attempting to parse a filename and - # including it in the list. So for that we'll gate this warning - # on if the version is anything at all or not. - if not self.version: - return - - tmpl = textwrap.dedent(""" - '{project_name} ({version})' is being parsed as a legacy, - non PEP 440, - version. You may find odd behavior and sort order. - In particular it will be sorted as less than 0.0. It - is recommended to migrate to PEP 440 compatible - versions. - """).strip().replace('\n', ' ') - - warnings.warn(tmpl.format(**vars(self)), PEP440Warning) - - @property - def version(self): - try: - return self._version - except AttributeError: - version = _version_from_file(self._get_metadata(self.PKG_INFO)) - if version is None: - tmpl = "Missing 'Version:' header and/or %s file" - raise ValueError(tmpl % self.PKG_INFO, self) - return version - - @property - def _dep_map(self): - """ - A map of extra to its list of (direct) requirements - for this distribution, including the null extra. - """ - try: - return self.__dep_map - except AttributeError: - self.__dep_map = self._filter_extras(self._build_dep_map()) - return self.__dep_map - - @staticmethod - def _filter_extras(dm): - """ - Given a mapping of extras to dependencies, strip off - environment markers and filter out any dependencies - not matching the markers. - """ - for extra in list(filter(None, dm)): - new_extra = extra - reqs = dm.pop(extra) - new_extra, _, marker = extra.partition(':') - fails_marker = marker and ( - invalid_marker(marker) - or not evaluate_marker(marker) - ) - if fails_marker: - reqs = [] - new_extra = safe_extra(new_extra) or None - - dm.setdefault(new_extra, []).extend(reqs) - return dm - - def _build_dep_map(self): - dm = {} - for name in 'requires.txt', 'depends.txt': - for extra, reqs in split_sections(self._get_metadata(name)): - dm.setdefault(extra, []).extend(parse_requirements(reqs)) - return dm - - def requires(self, extras=()): - """List of Requirements needed for this distro if `extras` are used""" - dm = self._dep_map - deps = [] - deps.extend(dm.get(None, ())) - for ext in extras: - try: - deps.extend(dm[safe_extra(ext)]) - except KeyError: - raise UnknownExtra( - "%s has no such extra feature %r" % (self, ext) - ) - return deps - - def _get_metadata(self, name): - if self.has_metadata(name): - for line in self.get_metadata_lines(name): - yield line - - def activate(self, path=None, replace=False): - """Ensure distribution is importable on `path` (default=sys.path)""" - if path is None: - path = sys.path - self.insert_on(path, replace=replace) - if path is sys.path: - fixup_namespace_packages(self.location) - for pkg in self._get_metadata('namespace_packages.txt'): - if pkg in sys.modules: - declare_namespace(pkg) - - def egg_name(self): - """Return what this distribution's standard .egg filename should be""" - filename = "%s-%s-py%s" % ( - to_filename(self.project_name), to_filename(self.version), - self.py_version or PY_MAJOR - ) - - if self.platform: - filename += '-' + self.platform - return filename - - def __repr__(self): - if self.location: - return "%s (%s)" % (self, self.location) - else: - return str(self) - - def __str__(self): - try: - version = getattr(self, 'version', None) - except ValueError: - version = None - version = version or "[unknown version]" - return "%s %s" % (self.project_name, version) - - def __getattr__(self, attr): - """Delegate all unrecognized public attributes to .metadata provider""" - if attr.startswith('_'): - raise AttributeError(attr) - return getattr(self._provider, attr) - - def __dir__(self): - return list( - set(super(Distribution, self).__dir__()) - | set( - attr for attr in self._provider.__dir__() - if not attr.startswith('_') - ) - ) - - if not hasattr(object, '__dir__'): - # python 2.7 not supported - del __dir__ - - @classmethod - def from_filename(cls, filename, metadata=None, **kw): - return cls.from_location( - _normalize_cached(filename), os.path.basename(filename), metadata, - **kw - ) - - def as_requirement(self): - """Return a ``Requirement`` that matches this distribution exactly""" - if isinstance(self.parsed_version, packaging.version.Version): - spec = "%s==%s" % (self.project_name, self.parsed_version) - else: - spec = "%s===%s" % (self.project_name, self.parsed_version) - - return Requirement.parse(spec) - - def load_entry_point(self, group, name): - """Return the `name` entry point of `group` or raise ImportError""" - ep = self.get_entry_info(group, name) - if ep is None: - raise ImportError("Entry point %r not found" % ((group, name),)) - return ep.load() - - def get_entry_map(self, group=None): - """Return the entry point map for `group`, or the full entry map""" - try: - ep_map = self._ep_map - except AttributeError: - ep_map = self._ep_map = EntryPoint.parse_map( - self._get_metadata('entry_points.txt'), self - ) - if group is not None: - return ep_map.get(group, {}) - return ep_map - - def get_entry_info(self, group, name): - """Return the EntryPoint object for `group`+`name`, or ``None``""" - return self.get_entry_map(group).get(name) - - def insert_on(self, path, loc=None, replace=False): - """Ensure self.location is on path - - If replace=False (default): - - If location is already in path anywhere, do nothing. - - Else: - - If it's an egg and its parent directory is on path, - insert just ahead of the parent. - - Else: add to the end of path. - If replace=True: - - If location is already on path anywhere (not eggs) - or higher priority than its parent (eggs) - do nothing. - - Else: - - If it's an egg and its parent directory is on path, - insert just ahead of the parent, - removing any lower-priority entries. - - Else: add it to the front of path. - """ - - loc = loc or self.location - if not loc: - return - - nloc = _normalize_cached(loc) - bdir = os.path.dirname(nloc) - npath = [(p and _normalize_cached(p) or p) for p in path] - - for p, item in enumerate(npath): - if item == nloc: - if replace: - break - else: - # don't modify path (even removing duplicates) if - # found and not replace - return - elif item == bdir and self.precedence == EGG_DIST: - # if it's an .egg, give it precedence over its directory - # UNLESS it's already been added to sys.path and replace=False - if (not replace) and nloc in npath[p:]: - return - if path is sys.path: - self.check_version_conflict() - path.insert(p, loc) - npath.insert(p, nloc) - break - else: - if path is sys.path: - self.check_version_conflict() - if replace: - path.insert(0, loc) - else: - path.append(loc) - return - - # p is the spot where we found or inserted loc; now remove duplicates - while True: - try: - np = npath.index(nloc, p + 1) - except ValueError: - break - else: - del npath[np], path[np] - # ha! - p = np - - return - - def check_version_conflict(self): - if self.key == 'setuptools': - # ignore the inevitable setuptools self-conflicts :( - return - - nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) - loc = normalize_path(self.location) - for modname in self._get_metadata('top_level.txt'): - if (modname not in sys.modules or modname in nsp - or modname in _namespace_packages): - continue - if modname in ('pkg_resources', 'setuptools', 'site'): - continue - fn = getattr(sys.modules[modname], '__file__', None) - if fn and (normalize_path(fn).startswith(loc) or - fn.startswith(self.location)): - continue - issue_warning( - "Module %s was already imported from %s, but %s is being added" - " to sys.path" % (modname, fn, self.location), - ) - - def has_version(self): - try: - self.version - except ValueError: - issue_warning("Unbuilt egg for " + repr(self)) - return False - return True - - def clone(self, **kw): - """Copy this distribution, substituting in any changed keyword args""" - names = 'project_name version py_version platform location precedence' - for attr in names.split(): - kw.setdefault(attr, getattr(self, attr, None)) - kw.setdefault('metadata', self._provider) - return self.__class__(**kw) - - @property - def extras(self): - return [dep for dep in self._dep_map if dep] - - -class EggInfoDistribution(Distribution): - def _reload_version(self): - """ - Packages installed by distutils (e.g. numpy or scipy), - which uses an old safe_version, and so - their version numbers can get mangled when - converted to filenames (e.g., 1.11.0.dev0+2329eae to - 1.11.0.dev0_2329eae). These distributions will not be - parsed properly - downstream by Distribution and safe_version, so - take an extra step and try to get the version number from - the metadata file itself instead of the filename. - """ - md_version = _version_from_file(self._get_metadata(self.PKG_INFO)) - if md_version: - self._version = md_version - return self - - -class DistInfoDistribution(Distribution): - """ - Wrap an actual or potential sys.path entry - w/metadata, .dist-info style. - """ - PKG_INFO = 'METADATA' - EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") - - @property - def _parsed_pkg_info(self): - """Parse and cache metadata""" - try: - return self._pkg_info - except AttributeError: - metadata = self.get_metadata(self.PKG_INFO) - self._pkg_info = email.parser.Parser().parsestr(metadata) - return self._pkg_info - - @property - def _dep_map(self): - try: - return self.__dep_map - except AttributeError: - self.__dep_map = self._compute_dependencies() - return self.__dep_map - - def _compute_dependencies(self): - """Recompute this distribution's dependencies.""" - dm = self.__dep_map = {None: []} - - reqs = [] - # Including any condition expressions - for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: - reqs.extend(parse_requirements(req)) - - def reqs_for_extra(extra): - for req in reqs: - if not req.marker or req.marker.evaluate({'extra': extra}): - yield req - - common = frozenset(reqs_for_extra(None)) - dm[None].extend(common) - - for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: - s_extra = safe_extra(extra.strip()) - dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common) - - return dm - - -_distributionImpl = { - '.egg': Distribution, - '.egg-info': EggInfoDistribution, - '.dist-info': DistInfoDistribution, -} - - -def issue_warning(*args, **kw): - level = 1 - g = globals() - try: - # find the first stack frame that is *not* code in - # the pkg_resources module, to use for the warning - while sys._getframe(level).f_globals is g: - level += 1 - except ValueError: - pass - warnings.warn(stacklevel=level + 1, *args, **kw) - - -class RequirementParseError(ValueError): - def __str__(self): - return ' '.join(self.args) - - -def parse_requirements(strs): - """Yield ``Requirement`` objects for each specification in `strs` - - `strs` must be a string, or a (possibly-nested) iterable thereof. - """ - # create a steppable iterator, so we can handle \-continuations - lines = iter(yield_lines(strs)) - - for line in lines: - # Drop comments -- a hash without a space may be in a URL. - if ' #' in line: - line = line[:line.find(' #')] - # If there is a line continuation, drop it, and append the next line. - if line.endswith('\\'): - line = line[:-2].strip() - try: - line += next(lines) - except StopIteration: - return - yield Requirement(line) - - -class Requirement(packaging.requirements.Requirement): - def __init__(self, requirement_string): - """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" - try: - super(Requirement, self).__init__(requirement_string) - except packaging.requirements.InvalidRequirement as e: - raise RequirementParseError(str(e)) - self.unsafe_name = self.name - project_name = safe_name(self.name) - self.project_name, self.key = project_name, project_name.lower() - self.specs = [ - (spec.operator, spec.version) for spec in self.specifier] - self.extras = tuple(map(safe_extra, self.extras)) - self.hashCmp = ( - self.key, - self.specifier, - frozenset(self.extras), - str(self.marker) if self.marker else None, - ) - self.__hash = hash(self.hashCmp) - - def __eq__(self, other): - return ( - isinstance(other, Requirement) and - self.hashCmp == other.hashCmp - ) - - def __ne__(self, other): - return not self == other - - def __contains__(self, item): - if isinstance(item, Distribution): - if item.key != self.key: - return False - - item = item.version - - # Allow prereleases always in order to match the previous behavior of - # this method. In the future this should be smarter and follow PEP 440 - # more accurately. - return self.specifier.contains(item, prereleases=True) - - def __hash__(self): - return self.__hash - - def __repr__(self): - return "Requirement.parse(%r)" % str(self) - - @staticmethod - def parse(s): - req, = parse_requirements(s) - return req - - -def _always_object(classes): - """ - Ensure object appears in the mro even - for old-style classes. - """ - if object not in classes: - return classes + (object,) - return classes - - -def _find_adapter(registry, ob): - """Return an adapter factory for `ob` from `registry`""" - types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob)))) - for t in types: - if t in registry: - return registry[t] - - -def ensure_directory(path): - """Ensure that the parent directory of `path` exists""" - dirname = os.path.dirname(path) - py31compat.makedirs(dirname, exist_ok=True) - - -def _bypass_ensure_directory(path): - """Sandbox-bypassing version of ensure_directory()""" - if not WRITE_SUPPORT: - raise IOError('"os.mkdir" not supported on this platform.') - dirname, filename = split(path) - if dirname and filename and not isdir(dirname): - _bypass_ensure_directory(dirname) - try: - mkdir(dirname, 0o755) - except FileExistsError: - pass - - -def split_sections(s): - """Split a string or iterable thereof into (section, content) pairs - - Each ``section`` is a stripped version of the section header ("[section]") - and each ``content`` is a list of stripped lines excluding blank lines and - comment-only lines. If there are any such lines before the first section - header, they're returned in a first ``section`` of ``None``. - """ - section = None - content = [] - for line in yield_lines(s): - if line.startswith("["): - if line.endswith("]"): - if section or content: - yield section, content - section = line[1:-1].strip() - content = [] - else: - raise ValueError("Invalid section heading", line) - else: - content.append(line) - - # wrap up last segment - yield section, content - - -def _mkstemp(*args, **kw): - old_open = os.open - try: - # temporarily bypass sandboxing - os.open = os_open - return tempfile.mkstemp(*args, **kw) - finally: - # and then put it back - os.open = old_open - - -# Silence the PEP440Warning by default, so that end users don't get hit by it -# randomly just because they use pkg_resources. We want to append the rule -# because we want earlier uses of filterwarnings to take precedence over this -# one. -warnings.filterwarnings("ignore", category=PEP440Warning, append=True) - - -# from jaraco.functools 1.3 -def _call_aside(f, *args, **kwargs): - f(*args, **kwargs) - return f - - -@_call_aside -def _initialize(g=globals()): - "Set up global resource manager (deliberately not state-saved)" - manager = ResourceManager() - g['_manager'] = manager - g.update( - (name, getattr(manager, name)) - for name in dir(manager) - if not name.startswith('_') - ) - - -@_call_aside -def _initialize_master_working_set(): - """ - Prepare the master working set and make the ``require()`` - API available. - - This function has explicit effects on the global state - of pkg_resources. It is intended to be invoked once at - the initialization of this module. - - Invocation by other packages is unsupported and done - at their own risk. - """ - working_set = WorkingSet._build_master() - _declare_state('object', working_set=working_set) - - require = working_set.require - iter_entry_points = working_set.iter_entry_points - add_activation_listener = working_set.subscribe - run_script = working_set.run_script - # backward compatibility - run_main = run_script - # Activate all distributions already on sys.path with replace=False and - # ensure that all distributions added to the working set in the future - # (e.g. by calling ``require()``) will get activated as well, - # with higher priority (replace=True). - tuple( - dist.activate(replace=False) - for dist in working_set - ) - add_activation_listener( - lambda dist: dist.activate(replace=True), - existing=False, - ) - working_set.entries = [] - # match order - list(map(working_set.add_entry, sys.path)) - globals().update(locals()) - -class PkgResourcesDeprecationWarning(Warning): - """ - Base class for warning about deprecations in ``pkg_resources`` - - This class is not derived from ``DeprecationWarning``, and as such is - visible by default. - """ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 1d2f0e2617dfd482dde1a4f53865332f19bb0ef1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97425 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̲QF^%kZ1$>>BY_-stZX++OZrDPVUB*RuWo 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-38.pyc deleted file mode 100644 index f8383424fc5f49d8fc0287fdc76261cd8e8db7b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 667 zcmYjO&5qMB5FXoUn|8ZpPl#8@p~<!d2_%FNsMR8&1yO!>b0C!3+ooybXq>IuRTm`0 zgTRqD;Te48)K}mDj0>!GEPs=kvFH2Zd9}aa0J87DgSTA{@WTbyO;GTVws}V&L9#i- ze?5!YF6J>O&*x&{#U2CcOHWolv$&$XS+#g7tBTKR9tg;oK9aQza*qRp*jGNjR+ZdS zFssLP$%YWrx5NU+0kguStHGEQU71tjv_7V7jtDMVC46BU_{tc(f&8`yCC?i8h`}Xi zaB*|P@NmOtq7*YP6WIMkr|yvUOa6hMz$xT}5{Q)@2Nlb;vHoI|DVd_NwP(XVqDEU$ zh`F}ae*fgj@MR#ZSB%Q3_0=jhWuh}H)N1?<aE}E2{1{F3LPa=LrOGu%gLzsMFQPN& zuss=3ZK?8QG*910#k!p8ycgb$Oj@dTF&by1i84`<7VXZx@G$JPi#3%)HJP|%l+aa4 zO^a-jpfdU#$L{#L*BR>ti3*FgZ6^Q!AnA2{_fWg(GR|7;fEMmkF5p}DmRrw#3v7|Y z8!o|If(?QOx;j<~Xbx**_lQ6I$B%9%yFOMtKkeG)QlUw8o}~Giwyj(#X|7bD<Ji5; gHE6oN{{4lP=X3SIk(vVnpV8t?(P&oLtzX>x1C6(!ivR!s diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/py31compat.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/py31compat.py deleted file mode 100644 index a2d3007..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/py31compat.py +++ /dev/null @@ -1,23 +0,0 @@ -import os -import errno -import sys - -from pip._vendor import six - - -def _makedirs_31(path, exist_ok=False): - try: - os.makedirs(path) - except OSError as exc: - if not exist_ok or exc.errno != errno.EEXIST: - raise - - -# rely on compatibility behavior until mode considerations -# and exists_ok considerations are disentangled. -# See https://github.com/pypa/setuptools/pull/1083#issuecomment-315168663 -needs_makedirs = ( - six.PY2 or - (3, 4) <= sys.version_info < (3, 4, 1) -) -makedirs = _makedirs_31 if needs_makedirs else os.makedirs diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__init__.py deleted file mode 100644 index a41f65d..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__init__.py +++ /dev/null @@ -1,127 +0,0 @@ -# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -from __future__ import division - -from collections import deque -from datetime import timedelta -from math import ceil -from sys import stderr -from time import time - - -__version__ = '1.4' - - -class Infinite(object): - file = stderr - sma_window = 10 # Simple Moving Average window - - def __init__(self, *args, **kwargs): - self.index = 0 - self.start_ts = time() - self.avg = 0 - self._ts = self.start_ts - self._xput = deque(maxlen=self.sma_window) - for key, val in kwargs.items(): - setattr(self, key, val) - - def __getitem__(self, key): - if key.startswith('_'): - return None - return getattr(self, key, None) - - @property - def elapsed(self): - return int(time() - self.start_ts) - - @property - def elapsed_td(self): - return timedelta(seconds=self.elapsed) - - def update_avg(self, n, dt): - if n > 0: - self._xput.append(dt / n) - self.avg = sum(self._xput) / len(self._xput) - - def update(self): - pass - - def start(self): - pass - - def finish(self): - pass - - def next(self, n=1): - now = time() - dt = now - self._ts - self.update_avg(n, dt) - self._ts = now - self.index = self.index + n - self.update() - - def iter(self, it): - try: - for x in it: - yield x - self.next() - finally: - self.finish() - - -class Progress(Infinite): - def __init__(self, *args, **kwargs): - super(Progress, self).__init__(*args, **kwargs) - self.max = kwargs.get('max', 100) - - @property - def eta(self): - return int(ceil(self.avg * self.remaining)) - - @property - def eta_td(self): - return timedelta(seconds=self.eta) - - @property - def percent(self): - return self.progress * 100 - - @property - def progress(self): - return min(1, self.index / self.max) - - @property - def remaining(self): - return max(self.max - self.index, 0) - - def start(self): - self.update() - - def goto(self, index): - incr = index - self.index - self.next(incr) - - def iter(self, it): - try: - self.max = len(it) - except TypeError: - pass - - try: - for x in it: - yield x - self.next() - finally: - self.finish() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 5be37c08028b14b019d22b9f8c354aa1dff3eedc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3991 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__pycache__/bar.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__pycache__/bar.cpython-38.pyc deleted file mode 100644 index 51d76df75b2b52044d789933979398d4bf5491da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2742 zcmbtW&2Jk;6yMozukF-H(>5(%ff5vh5*Ny$NPwb7DsaH6C<w6<SgvPnZ@ONa*>&@w zH9|@SEuR9URNRvGfO<mW!jUU~!ye(3KY&Xw<@aVciQA+H#5(W2`MsH)eQ)N?Z}LI8 z>?nBtd{F)5v!bH>O<?>n0G1%p9Vo7F7AQUDGDdARP+gU4To1IK?&|Pq+z5=G>6%P= zOW`KBZYbRHOi$m`T?-zY7vL#))~4p#zz#107d;!e09@i_;IhOH@B}{wd`yln0$2DX z@T6D7_!96GKMs6c;xbpSDAnm*#HmzSS{a6ZtIxeg;K!b522p*NWj*#~(eDT^iZH75 zp+I*KzU!~~VT)cJe^h`aNc1X{r?`wONSL`AS6!WJuEBNJ<c4c;)3v$f7P##?yuh6s zid*DGgi}hji%qdRi}zDyV{&fZ54pEi<+Zu_UK4gholQ2>WcEJ8-`V$D6yn}vqd~F^ ziB_OuB~exwM4eVP*@#*!VKd4|MN3PRlgbEsMNinYGSbm95{w)fXqmFt<ZRnYXpEic z3Hb|&*)ez6$V!xLC$V<q#v*RDF6h(MVygLJoEob>kGrWo$X714dRV_^$4m9L9|Wo6 z^#<{JL$=Lm*lzo4slL+p!_>Lj6pexK$Rpc%ueF*jeAQ0%$P3zTnO^pIBk;mb+;vOY zj2RLWh$Yo9Rcc7Tm?VcD_@Q@C5oZAIN40Lh=hZ~li@mTfYL^0kFnF)lCL<O)P4r#& z!t1rbzgiot$K8H-e(^#r!tO5&nyqWdC8`bl!NSY0EuLFEzc5%w_oCP7kh9jns~nT= z<zGW6i-Yyl91eIh_Rb=JXc|gk73Qc8%YIW#ePF5^4k}<V8(2p{*o{VrXc~>wX*7C$ zJ`AW`YBW9_HiN83lrWV{S|%!v6Qub?h14;qwAl4g+^wOA`a(QOZd!&h^#nl^>NF&p zg0h+Z@K2TfhsvIcaEV@;g*sIBD#~6%+2cfW1Epf7#pP~Obo{V`L^sNF^8-(`yfCiv zxj9k56hjT_ubV&rBkk7Bdes(B!6lw1^$aQ6&!f^D%SWaslX@0|&p{%hu7jim`5&JQ zt>2+!G$f#>lb29?i2n+<0K|YavXHm#<o0g;p7ChN`&)5jjA!w+3y?^Mq8J5v{#SI% zzGwww(cS(vi|+QVx_BOw9~s9SI^KXB#6g}zacFQZ(Xbbx_EyQ$R`hLyvmGYRfbq<b zI1d}o4e%Q{4{K+o6YqpA;q|cJ%>WCRYO8)&)#SeC`~8i04wF_3W3{mLeZH{Y<@Q@K zk1;v;I=5ft_LiLBA#S7tLZ!6~iGG91xG`r%$%kM*HP#aqK8<Xm%_zi-z{HIbOKt=Y zf;qvED~z+#N}}OSE77@nO&3?mo9L&N5EtFZ1~OxdtBHZ{*_+_rO=8#r{OH3h4%fE9 zslZ^<#7?NEm^d9U>!=8hEhWW$j@9eC5AX;&ZW-H_Qw@ZdnuBgL@}i6d%G8USIp+ha zx>Up6ksTR2)??@91Yor!PQtiWm`&q42h8dkVS5O^He?reG-FeuS8)m|wLmBWdnsnf zB~K;M$5?5}6G(jXHYB1Gtbp!H%+9HAf}LbD@Kl(tNcubRaDnVI;iDXoYSDUxD<){h z?Y`)xP82sq9Ig6sSG<I;Jf7rUK<`CJL|2xLSWHz{1$htE`98JLI_}kZcB7-3wbZ`s zuX$9*RXZ!bozHW7Be!4V_RGxP-Lt>s`1joYQNO1@N*OYZqiFgSMDr0OQlV@n2><uk zuXLMyonkk}kJ=AeKwCfN_9uCo>f$`UF}AM<^h*Eid<@wOhH!O)Zmae%9tzx6g2EIv zQnciPIL@`YUI6Bg1pUh>FBVD2lJ^9Wj@%KMnxH9<`gUr+p52IVQt8PnwWQi=iIude NQx&^n;CHH`{|jXvK4|~| diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__pycache__/helpers.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__pycache__/helpers.cpython-38.pyc deleted file mode 100644 index fd8e99aad040f20ece3a2892be24f2dae5531774..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2999 zcmai0TW=Fb6rS0;FM$9lr~;`jw6xncHVp!`Rj<$jQPm(N1=L0AYS~%a8`f)gW=x1> zo)U?^(BBXq^H2I4=Cx1#3%s=F%x>a!2<=#VJoh=5?>jU178dFR%Af!Ezy97J<S%Sg ziv^8u;S&r5BaCKbKm$q%GXjH|fq9!Si`lz`*@?Ad1~#-E=0e-mZ3otPnLBU;ci;sc ztRt+J)duyTP6^Ddvj)s<=(!En+#vqK-*6J~sX8&@X)eR=IFDsI%qPzIhu^GR%gX<L zjMJ(GRmCD!KqMrfjDU(XFj?(6=~8AgYqu7Fvdq~ffz4dz!N2pISR`=a;JT_m;HgZ0 zN}s0rt+m+DyA{HOKN~)95fOb5l1MrwJI1EbB~#-MbO^LVb4vNeDb}nh*|a%Bx#zqj zy5{mb(vvl2U@tRYn3PBl>Q=Q!uc*Hy=qk|4TH_SXQ)J&zW|A{yb<-^I8_E{rQNlTD zro1pr^HheRa>A{Y$-Z(2i4ajQ;VzClsfeW9R*injk}w`~G33hD{#A`TtKa_+-n_TI zad%zW-E1uS`=+u)l65(ntDMJM5$}n8s%l{vXOR$LxKCbfb^60W(&7C?Ci#$eZe{6c zwBG6BA7Ac8F!m(LpLDYHQD?L*`@{Td`?HP!2QQDJ_%Y}vI-_*7{ORZIEA6Yxqiq;& zC%qnac0yRnVAByF_BdG5=_eUjE83%NUIV4xhEJRZLFj4fP>VXoBK$8xYjS25#rA<; z=7Nbp!C>BmPXr*q<%Hiyxkn*X_c4^4#u9mEOzED9^_TRSDXpn7HO~R^ab_7l8%L!x zr8{&7`a?ao=T^e^ih3MR<ang->45Mib|CYVoo$YV<R`Fh4x*>Z%#xfh;#`ZPg^CJA zA1NC1v(PHUIqbK$5UuY+Rp536tgq81T|yr$R(znR#R#H<g7rfOd;|?Nh+jsj9e_21 zUzT99b_JM>SVcVUn`;$o?20uDuuow|W8==<2PLBRsW#%M?oJo*D*DT?MrhvBvvhK* zqI5Ct(>32ibmsskKzBV12SYZ_u-**A-^Ni^jBtHAB7?t!;t~k8P{K7%vMdZMDlFj? z^r2=Cx>a}}JZc#ynx3b7W9XPGhw0@D=$=b2jsHq7tj6k)W?Y?SJRo#aHMN~t{=bRl z7M%2YqJb21L8ll*rp0fd+_M3<SabLd=}J$B4bsX%*mw)J@@pK;<R7BYzCwN<7eam# z2Tq~TzS79k4#Q>F;1l}V0H`7LAa-w6ZJN>Uji`GM_5gJWZ=uwvYe~q~RdSX2Z(=Q+ zfB0hsb!J6n<PE=w;s`t3I7=d)<zJz)1;iHVWNA*#a>`tCz^s4BjqA|RTCN;w3AH@~ z=`A7GSJ|OwSO>%}9A4#zk4kEFHMxy~+*X$6$!ofAA+xjmJJcORhTQhxJEDI%?akai zPJgLW6r(TT&H|lHz9J3adC{xyq|)y`E&PnmE0R~$9Bqka-Mct`Ob9dyZ^PiB2~9}R zWqK~r-=6Wj#t{=7^BKR4Vn%80x{t9BdCfmSF$?#M%?NC~{53c=n?29+91VEiP>x7@ zd6X$<WA*mx+RyOBu#%^#e2wWQY=K4KepRMxp2MqW*Mnz-e)R;l=CuR7c2r{{?XBig z(|U4!J?W)F!kyKMTE)Swew4E;;Vs#ZWGjxcOtcF7Tf@9nC^Z*LR0Ka{qd*VOk^v+D z{p!FR4N<grjPktz8Ph3f-hl-L%|F2!=2~?!1Xb`=RjT5fB@FR~=Vx%<F@(Pd{UwLs zZdt0BIb-^P(_pIB8F_RQ*WrG^8KOA@jM>4r625GV;$`C-MO51`??4?Lsqp}wBODTc zCDu9zU4fau;MN7LJvuo*r_vD<-6OzKZWyv*3^#(#fw<e7A%#v{$Fm#|2&tyUv2P9X zINV0vu^e-_jX0WHWKE=la)ysKlUVATq{z3k7?@&PaI{u$R54CNT3_wnm&G;rwT?Ve Qt!Y}+G8Zqvk2cMJ0YC&+qyPW_ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__pycache__/spinner.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__pycache__/spinner.cpython-38.pyc deleted file mode 100644 index 55e7bb22b02623cb6b6acdb9fd5deb8356a1d288..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1483 zcmbVMOK;Oa5Z?7Gu9KEhpuABJ9Eeb2P%j`M6bT80M5Bs=kSv51vfISq*k(8BOXbv_ zD;@`qrR3BT7akJNE5E@<IQ1{&0yEAQT7r7O*3RrVvzh(o5#Jsjb_hJ*eirYon}qy8 zu=4>Mslbv;AQ)jZBrWPuN|?s<P;2R)p6!j$Xqlc#$u+`EW~~xtag*yShG&5#$850J z+*;AS9N;150CqBL1J1Jo;6jFn01vYfz#|!U*uEK39NmKZNs*?bohYcsjQe5G=AstL zE!ub3*Q41W0wWx9?g-dS1q(q`$KUOIGyoM?asmV=9%aPS81;0fc?Q!xlNrohC7#7B zxHp&PW|AO^xJXIS=+RP--tE!l9(8Zk@#5_VqZ+WTz>=pyERzSMO+jiabeuef-Af(O zGCfK*uzm!h(`wO3%^+fYA=N`3rB>3cNiI`!9up{PsUdkdo6=yDh%t!Tn|GUWi@T!9 z+dPVedo>J_<fc1|N|YKk@XhgP&JBb6ZnD^J#?fT?f-50dDXG;T)*4*8NsyGzUo4+1 zPnMEJaF=<bfkxMdpE3xVh`1rRl&<WjUQQNMtCO%=n;*ygFi}EB>C%X*O}X!^Lb+_; zkAQ{mr;hKpV%7<9U-11$om!|oxfTQmDq;lUr1@q5?W}i%jD<J|mMqg9;sDw#5aY0< z4Z@}dzFKA-=rGc&;L#%>{&W~8mKhBLI&DJjt<;$gxJsa-!_n_A-Yfl1>9<P1scstL z5F8OmK^#Vb+;@<~?ud-(G1yJOk~kAK6^Q?vV}2@*qunH*DpJpsexmgAs=)62lhX-s z;8bpNLOj3;OI*Q2=>5BHP&=(*{jOd9MiA{T-r9#gkF}3Ve^UDM9=uM%O=s{*RV%~; zys+aHJTw7ffERpi@cYuRf!h%D)kzD}!2%C=6|MWFPo}Fn+<mR^dS7pR?dw-ccU2PI zy~v*eI%koWB9FLQ%;VtCcG?{QgD=n}awu>r(_E8>2^Uh}cQu>dY&-;3TwwA7gZ!(7 ZseP&cZ@Ro6PDq@-0)<x}b4Cq#^<P{0KCl1) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/bar.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/bar.py deleted file mode 100644 index 025e61c..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/bar.py +++ /dev/null @@ -1,94 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -from __future__ import unicode_literals - -import sys - -from . import Progress -from .helpers import WritelnMixin - - -class Bar(WritelnMixin, Progress): - width = 32 - message = '' - suffix = '%(index)d/%(max)d' - bar_prefix = ' |' - bar_suffix = '| ' - empty_fill = ' ' - fill = '#' - hide_cursor = True - - def update(self): - filled_length = int(self.width * self.progress) - empty_length = self.width - filled_length - - message = self.message % self - bar = self.fill * filled_length - empty = self.empty_fill * empty_length - suffix = self.suffix % self - line = ''.join([message, self.bar_prefix, bar, empty, self.bar_suffix, - suffix]) - self.writeln(line) - - -class ChargingBar(Bar): - suffix = '%(percent)d%%' - bar_prefix = ' ' - bar_suffix = ' ' - empty_fill = '∙' - fill = '█' - - -class FillingSquaresBar(ChargingBar): - empty_fill = '▢' - fill = '▣' - - -class FillingCirclesBar(ChargingBar): - empty_fill = '◯' - fill = '◉' - - -class IncrementalBar(Bar): - if sys.platform.startswith('win'): - phases = (u' ', u'▌', u'█') - else: - phases = (' ', '▏', '▎', '▍', '▌', '▋', '▊', '▉', '█') - - def update(self): - nphases = len(self.phases) - filled_len = self.width * self.progress - nfull = int(filled_len) # Number of full chars - phase = int((filled_len - nfull) * nphases) # Phase of last char - nempty = self.width - nfull # Number of empty chars - - message = self.message % self - bar = self.phases[-1] * nfull - current = self.phases[phase] if phase > 0 else '' - empty = self.empty_fill * max(0, nempty - len(current)) - suffix = self.suffix % self - line = ''.join([message, self.bar_prefix, bar, current, empty, - self.bar_suffix, suffix]) - self.writeln(line) - - -class PixelBar(IncrementalBar): - phases = ('⡀', '⡄', '⡆', '⡇', '⣇', '⣧', '⣷', '⣿') - - -class ShadyBar(IncrementalBar): - phases = (' ', '░', '▒', '▓', '█') diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/counter.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/counter.py deleted file mode 100644 index 6b45a1e..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/counter.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -from __future__ import unicode_literals -from . import Infinite, Progress -from .helpers import WriteMixin - - -class Counter(WriteMixin, Infinite): - message = '' - hide_cursor = True - - def update(self): - self.write(str(self.index)) - - -class Countdown(WriteMixin, Progress): - hide_cursor = True - - def update(self): - self.write(str(self.remaining)) - - -class Stack(WriteMixin, Progress): - phases = (' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█') - hide_cursor = True - - def update(self): - nphases = len(self.phases) - i = min(nphases - 1, int(self.progress * nphases)) - self.write(self.phases[i]) - - -class Pie(Stack): - phases = ('○', '◔', '◑', '◕', '●') diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/helpers.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/helpers.py deleted file mode 100644 index 0cde44e..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/helpers.py +++ /dev/null @@ -1,91 +0,0 @@ -# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -from __future__ import print_function - - -HIDE_CURSOR = '\x1b[?25l' -SHOW_CURSOR = '\x1b[?25h' - - -class WriteMixin(object): - hide_cursor = False - - def __init__(self, message=None, **kwargs): - super(WriteMixin, self).__init__(**kwargs) - self._width = 0 - if message: - self.message = message - - if self.file and self.file.isatty(): - if self.hide_cursor: - print(HIDE_CURSOR, end='', file=self.file) - print(self.message, end='', file=self.file) - self.file.flush() - - def write(self, s): - if self.file and self.file.isatty(): - b = '\b' * self._width - c = s.ljust(self._width) - print(b + c, end='', file=self.file) - self._width = max(self._width, len(s)) - self.file.flush() - - def finish(self): - if self.file and self.file.isatty() and self.hide_cursor: - print(SHOW_CURSOR, end='', file=self.file) - - -class WritelnMixin(object): - hide_cursor = False - - def __init__(self, message=None, **kwargs): - super(WritelnMixin, self).__init__(**kwargs) - if message: - self.message = message - - if self.file and self.file.isatty() and self.hide_cursor: - print(HIDE_CURSOR, end='', file=self.file) - - def clearln(self): - if self.file and self.file.isatty(): - print('\r\x1b[K', end='', file=self.file) - - def writeln(self, line): - if self.file and self.file.isatty(): - self.clearln() - print(line, end='', file=self.file) - self.file.flush() - - def finish(self): - if self.file and self.file.isatty(): - print(file=self.file) - if self.hide_cursor: - print(SHOW_CURSOR, end='', file=self.file) - - -from signal import signal, SIGINT -from sys import exit - - -class SigIntMixin(object): - """Registers a signal handler that calls finish on SIGINT""" - - def __init__(self, *args, **kwargs): - super(SigIntMixin, self).__init__(*args, **kwargs) - signal(SIGINT, self._sigint_handler) - - def _sigint_handler(self, signum, frame): - self.finish() - exit(0) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/spinner.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/spinner.py deleted file mode 100644 index 464c7b2..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/spinner.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -from __future__ import unicode_literals -from . import Infinite -from .helpers import WriteMixin - - -class Spinner(WriteMixin, Infinite): - message = '' - phases = ('-', '\\', '|', '/') - hide_cursor = True - - def update(self): - i = self.index % len(self.phases) - self.write(self.phases[i]) - - -class PieSpinner(Spinner): - phases = ['◷', '◶', '◵', '◴'] - - -class MoonSpinner(Spinner): - phases = ['◑', '◒', '◐', '◓'] - - -class LineSpinner(Spinner): - phases = ['⎺', '⎻', '⎼', '⎽', '⎼', '⎻'] - -class PixelSpinner(Spinner): - phases = ['⣾','⣷', '⣯', '⣟', '⡿', '⢿', '⣻', '⣽'] diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pyparsing.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pyparsing.py deleted file mode 100644 index bea4d9c..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pyparsing.py +++ /dev/null @@ -1,6452 +0,0 @@ -#-*- coding: utf-8 -*- -# module pyparsing.py -# -# Copyright (c) 2003-2019 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 :class:`'+'<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.parseString(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 '+', '|' and '^' operators. - -The :class:`ParseResults` object returned from -:class:`ParserElement.parseString` 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.setResultsName` - - find some helpful expression short-cuts like :class:`delimitedList` - and :class:`oneOf` - - find more useful common expressions in the :class:`pyparsing_common` - namespace class -""" - -__version__ = "2.3.1" -__versionTime__ = "09 Jan 2019 23:26 UTC" -__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" - -import string -from weakref import ref as wkref -import copy -import sys -import warnings -import re -import sre_constants -import collections -import pprint -import traceback -import types -from datetime import datetime - -try: - # Python 3 - from itertools import filterfalse -except ImportError: - from itertools import ifilterfalse as filterfalse - -try: - from _thread import RLock -except ImportError: - from threading import RLock - -try: - # Python 3 - from collections.abc import Iterable - from collections.abc import MutableMapping -except ImportError: - # Python 2.7 - from collections import Iterable - from collections import MutableMapping - -try: - from collections import OrderedDict as _OrderedDict -except ImportError: - try: - from ordereddict import OrderedDict as _OrderedDict - except ImportError: - _OrderedDict = None - -try: - from types import SimpleNamespace -except ImportError: - class SimpleNamespace: pass - - -#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) - -__all__ = [ -'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', -'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', -'PrecededBy', 'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', -'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', -'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', -'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', -'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', 'Char', -'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', -'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', -'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', -'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', -'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', -'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', -'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', -'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', -'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', -'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', -'CloseMatch', 'tokenMap', 'pyparsing_common', 'pyparsing_unicode', 'unicode_set', -] - -system_version = tuple(sys.version_info)[:3] -PY_3 = system_version[0] == 3 -if PY_3: - _MAX_INT = sys.maxsize - basestring = str - unichr = chr - unicode = str - _ustr = str - - # build list of single arg builtins, that can be used as parse actions - singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] - -else: - _MAX_INT = sys.maxint - range = xrange - - def _ustr(obj): - """Drop-in replacement for str(obj) that tries to be Unicode - friendly. It first tries str(obj). If that fails with - a UnicodeEncodeError, then it tries unicode(obj). It then - < returns the unicode object | encodes it with the default - encoding | ... >. - """ - if isinstance(obj,unicode): - return obj - - try: - # If this works, then _ustr(obj) has the same behaviour as str(obj), so - # it won't break any existing code. - return str(obj) - - except UnicodeEncodeError: - # Else encode it - ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') - xmlcharref = Regex(r'&#\d+;') - xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) - return xmlcharref.transformString(ret) - - # build list of single arg builtins, tolerant of Python version, that can be used as parse actions - singleArgBuiltins = [] - import __builtin__ - for fname in "sum len sorted reversed list tuple set any all min max".split(): - try: - singleArgBuiltins.append(getattr(__builtin__,fname)) - except AttributeError: - continue - -_generatorType = type((y for y in range(1))) - -def _xml_escape(data): - """Escape &, <, >, ", ', etc. in a string of data.""" - - # ampersand must be replaced first - from_symbols = '&><"\'' - to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) - for from_,to_ in zip(from_symbols, to_symbols): - data = data.replace(from_, to_) - return data - -alphas = string.ascii_uppercase + string.ascii_lowercase -nums = "0123456789" -hexnums = nums + "ABCDEFabcdef" -alphanums = alphas + nums -_bslash = chr(92) -printables = "".join(c for c in string.printable if c not in string.whitespace) - -class ParseBaseException(Exception): - """base exception class for all parsing runtime exceptions""" - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( self, pstr, loc=0, msg=None, elem=None ): - self.loc = loc - if msg is None: - self.msg = pstr - self.pstr = "" - else: - self.msg = msg - self.pstr = pstr - self.parserElement = elem - self.args = (pstr, loc, msg) - - @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.parserElement) - - def __getattr__( self, aname ): - """supported attributes by name are: - - lineno - returns the line number of the exception text - - col - returns the column number of the exception text - - line - returns the line containing the exception text - """ - if( aname == "lineno" ): - return lineno( self.loc, self.pstr ) - elif( aname in ("col", "column") ): - return col( self.loc, self.pstr ) - elif( aname == "line" ): - return line( self.loc, self.pstr ) - else: - raise AttributeError(aname) - - def __str__( self ): - return "%s (at char %d), (line:%d, col:%d)" % \ - ( self.msg, self.loc, self.lineno, self.column ) - def __repr__( self ): - return _ustr(self) - def markInputline( self, markerString = ">!<" ): - """Extracts the exception line from the input string, and marks - the location of the exception with a special symbol. - """ - 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 __dir__(self): - return "lineno col line".split() + dir(type(self)) - -class ParseException(ParseBaseException): - """ - Exception thrown when parse expressions don't match class; - supported attributes by name are: - - lineno - returns the line number of the exception text - - col - returns the column number of the exception text - - line - returns the line containing the exception text - - Example:: - - try: - Word(nums).setName("integer").parseString("ABC") - except ParseException as pe: - print(pe) - print("column: {}".format(pe.col)) - - prints:: - - Expected integer (at char 0), (line:1, col:1) - column: 1 - - """ - - @staticmethod - def explain(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. - - Note: the diagnostic output will include string representations of the expressions - that failed to parse. These representations will be more helpful if you use `setName` to - give identifiable names to your expressions. Otherwise they will use the default string - forms, which may be cryptic to read. - - explain() is only supported under Python 3. - """ - import inspect - - if depth is None: - depth = sys.getrecursionlimit() - ret = [] - if isinstance(exc, ParseBaseException): - ret.append(exc.line) - ret.append(' ' * (exc.col - 1) + '^') - ret.append("{0}: {1}".format(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.frame - - f_self = frm.f_locals.get('self', None) - if isinstance(f_self, ParserElement): - if frm.f_code.co_name not in ('parseImpl', '_parseNoCache'): - continue - if f_self in seen: - continue - seen.add(f_self) - - self_type = type(f_self) - ret.append("{0}.{1} - {2}".format(self_type.__module__, - self_type.__name__, - f_self)) - elif f_self is not None: - self_type = type(f_self) - ret.append("{0}.{1}".format(self_type.__module__, - self_type.__name__)) - else: - code = frm.f_code - if code.co_name in ('wrapper', '<module>'): - continue - - ret.append("{0}".format(code.co_name)) - - depth -= 1 - if not depth: - break - - return '\n'.join(ret) - - -class ParseFatalException(ParseBaseException): - """user-throwable exception thrown when inconsistent parse content - is found; stops all parsing immediately""" - pass - -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. - """ - pass - -#~ class ReparseException(ParseBaseException): - #~ """Experimental class - parse actions can raise this exception to cause - #~ pyparsing to reparse the input string: - #~ - with a modified input string, and/or - #~ - with a modified start location - #~ Set the values of the ReparseException in the constructor, and raise the - #~ exception in a parse action to cause pyparsing to use the new string/location. - #~ Setting the values as None causes no change to be made. - #~ """ - #~ def __init_( self, newstring, restartLoc ): - #~ self.newParseText = newstring - #~ self.reparseLoc = restartLoc - -class RecursiveGrammarException(Exception): - """exception thrown by :class:`ParserElement.validate` if the - grammar could be improperly recursive - """ - def __init__( self, parseElementList ): - self.parseElementTrace = parseElementList - - def __str__( self ): - return "RecursiveGrammarException: %s" % self.parseElementTrace - -class _ParseResultsWithOffset(object): - def __init__(self,p1,p2): - self.tup = (p1,p2) - def __getitem__(self,i): - return self.tup[i] - def __repr__(self): - return repr(self.tup[0]) - def setOffset(self,i): - self.tup = (self.tup[0],i) - -class ParseResults(object): - """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.<resultsName>`` - see :class:`ParserElement.setResultsName`) - - Example:: - - integer = Word(nums) - date_str = (integer.setResultsName("year") + '/' - + integer.setResultsName("month") + '/' - + integer.setResultsName("day")) - # equivalent form: - # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - # parseString returns a ParseResults object - result = date_str.parseString("1999/12/31") - - def test(s, fn=repr): - print("%s -> %s" % (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 - """ - def __new__(cls, toklist=None, name=None, asList=True, modal=True ): - if isinstance(toklist, cls): - return toklist - retobj = object.__new__(cls) - retobj.__doinit = True - return retobj - - # 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 ): - if self.__doinit: - self.__doinit = False - self.__name = None - self.__parent = None - self.__accumNames = {} - self.__asList = asList - self.__modal = modal - if toklist is None: - toklist = [] - if isinstance(toklist, list): - self.__toklist = toklist[:] - elif isinstance(toklist, _generatorType): - self.__toklist = list(toklist) - else: - self.__toklist = [toklist] - self.__tokdict = dict() - - if name is not None and name: - if not modal: - self.__accumNames[name] = 0 - if isinstance(name,int): - name = _ustr(name) # will always return a str, but use _ustr for consistency - self.__name = name - if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): - if isinstance(toklist,basestring): - 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): - self[name] = toklist - - def __getitem__( self, i ): - if isinstance( i, (int,slice) ): - return self.__toklist[i] - else: - if i not in self.__accumNames: - 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 = wkref(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 ): - return k in self.__tokdict - - def __len__( self ): return len( self.__toklist ) - def __bool__(self): return ( not not self.__toklist ) - __nonzero__ = __bool__ - def __iter__( self ): return iter( self.__toklist ) - def __reversed__( self ): return iter( self.__toklist[::-1] ) - def _iterkeys( self ): - if hasattr(self.__tokdict, "iterkeys"): - return self.__tokdict.iterkeys() - else: - return iter(self.__tokdict) - - def _itervalues( self ): - return (self[k] for k in self._iterkeys()) - - def _iteritems( self ): - return ((k, self[k]) for k in self._iterkeys()) - - if PY_3: - keys = _iterkeys - """Returns an iterator of all named result keys.""" - - values = _itervalues - """Returns an iterator of all named result values.""" - - items = _iteritems - """Returns an iterator of all named result key-value tuples.""" - - else: - iterkeys = _iterkeys - """Returns an iterator of all named result keys (Python 2.x only).""" - - itervalues = _itervalues - """Returns an iterator of all named result values (Python 2.x only).""" - - iteritems = _iteritems - """Returns an iterator of all named result key-value tuples (Python 2.x only).""" - - def keys( self ): - """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" - return list(self.iterkeys()) - - def values( self ): - """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" - return list(self.itervalues()) - - def items( self ): - """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" - return list(self.iteritems()) - - def haskeys( self ): - """Since keys() returns an iterator, this method is helpful in bypassing - code that looks for the existence of any defined results names.""" - return bool(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:: - - def remove_first(tokens): - tokens.pop(0) - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] - - label = Word(alphas) - patt = label("LABEL") + OneOrMore(Word(nums)) - print(patt.parseString("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.addParseAction(remove_LABEL) - print(patt.parseString("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("pop() got an unexpected keyword argument '%s'" % k) - 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, defaultValue=None): - """ - Returns named result matching the given key, or if there is no - such name, then returns the given ``defaultValue`` or ``None`` if no - ``defaultValue`` is specified. - - Similar to ``dict.get()``. - - Example:: - - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString("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 defaultValue - - def insert( self, index, insStr ): - """ - Inserts new element at location index in the list of parsed tokens. - - Similar to ``list.insert()``. - - Example:: - - print(OneOrMore(Word(nums)).parseString("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) - print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] - """ - self.__toklist.insert(index, insStr) - # 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:: - - print(OneOrMore(Word(nums)).parseString("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))) - print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("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 = OneOrMore(Word(alphas)) - - # 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) - print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' - """ - if isinstance(itemseq, ParseResults): - self += 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: - return "" - - if name in self.__tokdict: - if name not in self.__accumNames: - return self.__tokdict[name][-1][0] - else: - return ParseResults([ v[0] for v in self.__tokdict[name] ]) - else: - return "" - - def __add__( self, other ): - ret = self.copy() - ret += other - return ret - - def __iadd__( self, other ): - 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 = wkref(self) - - self.__toklist += other.__toklist - self.__accumNames.update( other.__accumNames ) - return self - - def __radd__(self, other): - 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 ): - return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) - - def __str__( self ): - return '[' + ', '.join(_ustr(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( _ustr(item) ) - return out - - def asList( self ): - """ - Returns the parse results as a nested list of matching tokens, all converted to strings. - - Example:: - - patt = OneOrMore(Word(alphas)) - result = patt.parseString("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 asList() to create an actual list - result_list = result.asList() - print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] - """ - return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] - - def asDict( self ): - """ - Returns the named parse results as a nested dictionary. - - Example:: - - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString('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.asDict() - 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.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} - """ - if PY_3: - item_fn = self.items - else: - item_fn = self.iteritems - - def toItem(obj): - if isinstance(obj, ParseResults): - if obj.haskeys(): - return obj.asDict() - else: - return [toItem(v) for v in obj] - else: - return obj - - return dict((k,toItem(v)) for k,v in item_fn()) - - def copy( self ): - """ - Returns a new copy of a :class:`ParseResults` object. - """ - ret = ParseResults( self.__toklist ) - ret.__tokdict = dict(self.__tokdict.items()) - ret.__parent = self.__parent - ret.__accumNames.update( self.__accumNames ) - ret.__name = self.__name - return ret - - def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): - """ - (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. - """ - nl = "\n" - out = [] - namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() - for v in vlist) - nextLevelIndent = indent + " " - - # collapse out indents if formatting is not desired - if not formatted: - indent = "" - nextLevelIndent = "" - nl = "" - - selfTag = None - if doctag is not None: - selfTag = doctag - else: - if self.__name: - selfTag = self.__name - - if not selfTag: - if namedItemsOnly: - return "" - else: - selfTag = "ITEM" - - out += [ nl, indent, "<", selfTag, ">" ] - - for i,res in enumerate(self.__toklist): - if isinstance(res,ParseResults): - if i in namedItems: - out += [ res.asXML(namedItems[i], - namedItemsOnly and doctag is None, - nextLevelIndent, - formatted)] - else: - out += [ res.asXML(None, - namedItemsOnly and doctag is None, - nextLevelIndent, - formatted)] - else: - # individual token, see if there is a name for it - resTag = None - if i in namedItems: - resTag = namedItems[i] - if not resTag: - if namedItemsOnly: - continue - else: - resTag = "ITEM" - xmlBodyText = _xml_escape(_ustr(res)) - out += [ nl, nextLevelIndent, "<", resTag, ">", - xmlBodyText, - "</", resTag, ">" ] - - out += [ nl, indent, "</", selfTag, ">" ] - return "".join(out) - - def __lookup(self,sub): - for k,vlist in self.__tokdict.items(): - for v,loc in vlist: - if sub is v: - return k - return None - - def getName(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 = OneOrMore(user_data) - - result = user_info.parseString("22 111-22-3333 #221B") - for item in result: - print(item.getName(), ':', item[0]) - - prints:: - - age : 22 - ssn : 111-22-3333 - house_number : 221B - """ - if self.__name: - return self.__name - elif self.__parent: - par = self.__parent() - if par: - return par.__lookup(self) - else: - return 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='', depth=0, full=True): - """ - 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.parseString('12/31/1999') - print(result.dump()) - - prints:: - - ['12', '/', '31', '/', '1999'] - - day: 1999 - - month: 31 - - year: 12 - """ - out = [] - NL = '\n' - out.append( indent+_ustr(self.asList()) ) - 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( "%s%s- %s: " % (indent,(' '*depth), k) ) - if isinstance(v,ParseResults): - if v: - out.append( v.dump(indent,depth+1) ) - else: - out.append(_ustr(v)) - else: - out.append(repr(v)) - elif any(isinstance(vv,ParseResults) for vv in self): - v = self - for i,vv in enumerate(v): - if isinstance(vv,ParseResults): - out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) - else: - out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(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.parseString("fna a,b,(fnb c,d,200),100") - result.pprint(width=40) - - prints:: - - ['fna', - ['a', - 'b', - ['(', 'fnb', ['c', 'd', '200'], ')'], - '100']] - """ - pprint.pprint(self.asList(), *args, **kwargs) - - # add support for pickle protocol - def __getstate__(self): - return ( self.__toklist, - ( self.__tokdict.copy(), - self.__parent is not None and self.__parent() or None, - self.__accumNames, - self.__name ) ) - - def __setstate__(self,state): - self.__toklist = state[0] - (self.__tokdict, - par, - inAccumNames, - self.__name) = state[1] - self.__accumNames = {} - self.__accumNames.update(inAccumNames) - if par is not None: - self.__parent = wkref(par) - else: - self.__parent = None - - def __getnewargs__(self): - return self.__toklist, self.__name, self.__asList, self.__modal - - def __dir__(self): - return (dir(type(self)) + list(self.keys())) - -MutableMapping.register(ParseResults) - -def col (loc,strg): - """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.parseString` 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) - -def lineno(loc,strg): - """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.parseString` - 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 - -def line( loc, strg ): - """Returns the line of text containing loc within a string, counting newlines as line separators. - """ - lastCR = strg.rfind("\n", 0, loc) - nextCR = strg.find("\n", loc) - if nextCR >= 0: - return strg[lastCR+1:nextCR] - else: - return strg[lastCR+1:] - -def _defaultStartDebugAction( instring, loc, expr ): - print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) - -def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): - print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) - -def _defaultExceptionDebugAction( instring, loc, expr, exc ): - print ("Exception raised:" + _ustr(exc)) - -def nullDebugAction(*args): - """'Do-nothing' debug action, to suppress debugging output during parsing.""" - pass - -# Only works on Python 3.x - nonlocal is toxic to Python 2 installs -#~ 'decorator to trim function calls to match the arity of the target' -#~ def _trim_arity(func, maxargs=3): - #~ if func in singleArgBuiltins: - #~ return lambda s,l,t: func(t) - #~ limit = 0 - #~ foundArity = False - #~ def wrapper(*args): - #~ nonlocal limit,foundArity - #~ while 1: - #~ try: - #~ ret = func(*args[limit:]) - #~ foundArity = True - #~ return ret - #~ except TypeError: - #~ if limit == maxargs or foundArity: - #~ raise - #~ limit += 1 - #~ continue - #~ return wrapper - -# this version is Python 2.x-3.x cross-compatible -'decorator to trim function calls to match the arity of the target' -def _trim_arity(func, maxargs=2): - if func in singleArgBuiltins: - return lambda s,l,t: func(t) - limit = [0] - foundArity = [False] - - # traceback return data structure changed in Py3.5 - normalize back to plain tuples - if system_version[:2] >= (3,5): - def extract_stack(limit=0): - # special handling for Python 3.5.0 - extra deep call stack by 1 - offset = -3 if system_version == (3,5,0) else -2 - frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] - return [frame_summary[:2]] - def extract_tb(tb, limit=0): - frames = traceback.extract_tb(tb, limit=limit) - frame_summary = frames[-1] - return [frame_summary[:2]] - else: - extract_stack = traceback.extract_stack - extract_tb = traceback.extract_tb - - # 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 - - LINE_DIFF = 6 - # 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!!!! - this_line = extract_stack(limit=2)[-1] - pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) - - def wrapper(*args): - while 1: - try: - ret = func(*args[limit[0]:]) - foundArity[0] = True - return ret - except TypeError: - # re-raise TypeErrors if they did not come from our arity testing - if foundArity[0]: - raise - else: - try: - tb = sys.exc_info()[-1] - if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: - raise - finally: - del tb - - if limit[0] <= maxargs: - limit[0] += 1 - continue - raise - - # copy func name to wrapper for sensible debug output - func_name = "<parse action>" - try: - func_name = getattr(func, '__name__', - getattr(func, '__class__').__name__) - except Exception: - func_name = str(func) - wrapper.__name__ = func_name - - return wrapper - -class ParserElement(object): - """Abstract base level parser element class.""" - DEFAULT_WHITE_CHARS = " \n\t\r" - verbose_stacktrace = False - - @staticmethod - def setDefaultWhitespaceChars( chars ): - r""" - Overrides the default whitespace chars - - Example:: - - # default whitespace chars are space, <TAB> and newline - OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] - - # change to just treat newline as significant - ParserElement.setDefaultWhitespaceChars(" \t") - OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] - """ - ParserElement.DEFAULT_WHITE_CHARS = chars - - @staticmethod - def inlineLiteralsUsing(cls): - """ - 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.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] - - - # change to Suppress - ParserElement.inlineLiteralsUsing(Suppress) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] - """ - ParserElement._literalStringClass = cls - - def __init__( self, savelist=False ): - self.parseAction = list() - self.failAction = None - #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall - self.strRepr = None - self.resultsName = None - self.saveAsList = savelist - self.skipWhitespace = True - self.whiteChars = set(ParserElement.DEFAULT_WHITE_CHARS) - self.copyDefaultWhiteChars = True - self.mayReturnEmpty = False # used when checking for left-recursion - self.keepTabs = False - self.ignoreExprs = list() - self.debug = False - self.streamlined = False - self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index - self.errmsg = "" - self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) - self.debugActions = ( None, None, None ) #custom debug actions - self.re = None - self.callPreparse = True # used to avoid redundant calls to preParse - self.callDuringTry = False - - def copy( self ): - """ - 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).setParseAction(lambda toks: int(toks[0])) - integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") - integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") - - print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) - - prints:: - - [5120, 100, 655360, 268435456] - - Equivalent form of ``expr.copy()`` is just ``expr()``:: - - integerM = integer().addParseAction(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 = ParserElement.DEFAULT_WHITE_CHARS - return cpy - - def setName( self, name ): - """ - Define name for this expression, makes debugging and exception messages clearer. - - Example:: - - Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) - Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) - """ - self.name = name - self.errmsg = "Expected " + self.name - if hasattr(self,"exception"): - self.exception.msg = self.errmsg - return self - - def setResultsName( self, name, listAllMatches=False ): - """ - Define name for referencing matching tokens as a nested attribute - of the returned parse results. - NOTE: this 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.setResultsName("name")`` - - see :class:`__call__`. - - Example:: - - date_str = (integer.setResultsName("year") + '/' - + integer.setResultsName("month") + '/' - + integer.setResultsName("day")) - - # equivalent form: - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - """ - newself = self.copy() - if name.endswith("*"): - name = name[:-1] - listAllMatches=True - newself.resultsName = name - newself.modalResults = not listAllMatches - return newself - - def setBreak(self,breakFlag = True): - """Method to invoke the Python pdb debugger when this element is - about to be parsed. Set ``breakFlag`` to True to enable, False to - disable. - """ - if breakFlag: - _parseMethod = self._parse - def breaker(instring, loc, doActions=True, callPreParse=True): - import pdb - pdb.set_trace() - return _parseMethod( instring, loc, doActions, callPreParse ) - breaker._originalParseMethod = _parseMethod - self._parse = breaker - else: - if hasattr(self._parse,"_originalParseMethod"): - self._parse = self._parse._originalParseMethod - return self - - def setParseAction( self, *fns, **kwargs ): - """ - Define one or more actions to perform when successfully matching parse element definition. - 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 - - If the functions in fns modify the tokens, they can return them as the return - value from fn, and the modified list of tokens will replace the original. - Otherwise, fn does not need to return any value. - - Optional keyword arguments: - - callDuringTry = (default= ``False`` ) indicate if parse action should be run during lookaheads and alternate testing - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See :class:`parseString 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:: - - integer = Word(nums) - date_str = integer + '/' + integer + '/' + integer - - date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] - - # use parse action to convert to ints at parse time - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - date_str = integer + '/' + integer + '/' + integer - - # note that integer fields are now ints, not strings - date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] - """ - self.parseAction = list(map(_trim_arity, list(fns))) - self.callDuringTry = kwargs.get("callDuringTry", False) - return self - - def addParseAction( self, *fns, **kwargs ): - """ - Add one or more parse actions to expression's list of parse actions. See :class:`setParseAction`. - - See examples in :class:`copy`. - """ - self.parseAction += list(map(_trim_arity, list(fns))) - self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) - return self - - def addCondition(self, *fns, **kwargs): - """Add a boolean predicate function to expression's list of parse actions. See - :class:`setParseAction` for function call signatures. Unlike ``setParseAction``, - functions passed to ``addCondition`` 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 - - Example:: - - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - year_int = integer.copy() - year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") - date_str = year_int + '/' + integer + '/' + integer - - result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) - """ - msg = kwargs.get("message", "failed user-defined condition") - exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException - for fn in fns: - fn = _trim_arity(fn) - def pa(s,l,t): - if not bool(fn(s,l,t)): - raise exc_type(s,l,msg) - self.parseAction.append(pa) - self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) - return self - - def setFailAction( self, fn ): - """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, loc ): - exprsFound = True - while exprsFound: - exprsFound = False - for e in self.ignoreExprs: - try: - while 1: - loc,dummy = e._parse( instring, loc ) - exprsFound = True - except ParseException: - pass - return loc - - def preParse( self, instring, loc ): - if self.ignoreExprs: - loc = self._skipIgnorables( instring, loc ) - - if self.skipWhitespace: - wt = self.whiteChars - instrlen = len(instring) - while loc < instrlen and instring[loc] in wt: - 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 ): - debugging = ( self.debug ) #and doActions ) - - if debugging or self.failAction: - #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) - if (self.debugActions[0] ): - self.debugActions[0]( instring, loc, self ) - if callPreParse and self.callPreparse: - preloc = self.preParse( instring, loc ) - else: - preloc = loc - tokensStart = preloc - try: - try: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - except IndexError: - raise ParseException( instring, len(instring), self.errmsg, self ) - except ParseBaseException as err: - #~ print ("Exception raised:", err) - if self.debugActions[2]: - self.debugActions[2]( instring, tokensStart, self, err ) - if self.failAction: - self.failAction( instring, tokensStart, self, err ) - raise - else: - if callPreParse and self.callPreparse: - preloc = self.preParse( instring, loc ) - else: - preloc = loc - tokensStart = preloc - if self.mayIndexError or preloc >= len(instring): - try: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - except IndexError: - raise ParseException( instring, len(instring), self.errmsg, self ) - else: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - - tokens = self.postParse( instring, loc, tokens ) - - retTokens = 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, tokensStart, retTokens ) - except IndexError as parse_action_exc: - exc = ParseException("exception raised in parse action") - exc.__cause__ = parse_action_exc - raise exc - - if tokens is not None and tokens is not retTokens: - retTokens = ParseResults( tokens, - self.resultsName, - asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), - modal=self.modalResults ) - except ParseBaseException as err: - #~ print "Exception raised in user parse action:", err - if (self.debugActions[2] ): - self.debugActions[2]( instring, tokensStart, self, err ) - raise - else: - for fn in self.parseAction: - try: - tokens = fn( instring, tokensStart, retTokens ) - except IndexError as parse_action_exc: - exc = ParseException("exception raised in parse action") - exc.__cause__ = parse_action_exc - raise exc - - if tokens is not None and tokens is not retTokens: - retTokens = ParseResults( tokens, - self.resultsName, - asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), - modal=self.modalResults ) - if debugging: - #~ print ("Matched",self,"->",retTokens.asList()) - if (self.debugActions[1] ): - self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) - - return loc, retTokens - - def tryParse( self, instring, loc ): - try: - return self._parse( instring, loc, doActions=False )[0] - except ParseFatalException: - raise ParseException( instring, loc, self.errmsg, self) - - def canParseNext(self, instring, loc): - try: - self.tryParse(instring, loc) - except (ParseException, IndexError): - return False - else: - return True - - class _UnboundedCache(object): - def __init__(self): - cache = {} - self.not_in_cache = not_in_cache = object() - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - - def clear(self): - cache.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - if _OrderedDict is not None: - class _FifoCache(object): - def __init__(self, size): - self.not_in_cache = not_in_cache = object() - - cache = _OrderedDict() - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - while len(cache) > size: - try: - cache.popitem(False) - except KeyError: - pass - - def clear(self): - cache.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - else: - class _FifoCache(object): - def __init__(self, size): - self.not_in_cache = not_in_cache = object() - - cache = {} - key_fifo = collections.deque([], size) - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - while len(key_fifo) > size: - cache.pop(key_fifo.popleft(), None) - key_fifo.append(key) - - def clear(self): - cache.clear() - key_fifo.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - # argument cache for optimizing repeated calls when backtracking through recursive expressions - packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() 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 ): - HIT, MISS = 0, 1 - 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())) - return value - else: - ParserElement.packrat_cache_stats[HIT] += 1 - if isinstance(value, Exception): - raise value - return (value[0], value[1].copy()) - - _parse = _parseNoCache - - @staticmethod - def resetCache(): - ParserElement.packrat_cache.clear() - ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) - - _packratEnabled = False - @staticmethod - def enablePackrat(cache_size_limit=128): - """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.enablePackrat`. - For best results, call ``enablePackrat()`` immediately after - importing pyparsing. - - Example:: - - from pip._vendor import pyparsing - pyparsing.ParserElement.enablePackrat() - """ - if not ParserElement._packratEnabled: - ParserElement._packratEnabled = True - if cache_size_limit is None: - ParserElement.packrat_cache = ParserElement._UnboundedCache() - else: - ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) - ParserElement._parse = ParserElement._parseCache - - def parseString( self, instring, parseAll=False ): - """ - Execute the parse expression with the given string. - This is the main interface to the client code, once the complete - expression has been built. - - If you want the grammar to require that the entire input string be - successfully parsed, then set ``parseAll`` to True (equivalent to ending - the grammar with ``StringEnd()``). - - Note: ``parseString`` implicitly calls ``expandtabs()`` on the input string, - in order to report proper column numbers in parse actions. - If the input string contains tabs and - the grammar uses parse actions that use the ``loc`` argument to index into the - string being parsed, you can ensure you have a consistent view of the input - string by: - - - calling ``parseWithTabs`` on your grammar before calling ``parseString`` - (see :class:`parseWithTabs`) - - define your parse action using the full ``(s,loc,toks)`` signature, and - reference the input string using the parse action's ``s`` argument - - explictly expand the tabs in your input string before calling - ``parseString`` - - Example:: - - Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] - Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text - """ - ParserElement.resetCache() - if not self.streamlined: - self.streamline() - #~ self.saveAsList = True - 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, clears out pyparsing internal stack trace - raise exc - else: - return tokens - - def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): - """ - Scan the input string for expression matches. Each match will return the - matching tokens, start location, and end location. May be called with optional - ``maxMatches`` 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:`parseString` for more information on parsing - strings with embedded tabs. - - Example:: - - source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" - print(source) - for tokens,start,end in Word(alphas).scanString(source): - print(' '*start + '^'*(end-start)) - print(' '*start + tokens[0]) - - prints:: - - sldjf123lsdjjkf345sldkjf879lkjsfd987 - ^^^^^ - sldjf - ^^^^^^^ - lsdjjkf - ^^^^^^ - sldkjf - ^^^^^^ - lkjsfd - """ - if not self.streamlined: - self.streamline() - for e in self.ignoreExprs: - e.streamline() - - if not self.keepTabs: - instring = _ustr(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 = preparseFn( instring, loc ) - nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) - except ParseException: - loc = preloc+1 - else: - if nextLoc > loc: - matches += 1 - 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 - - def transformString( self, instring ): - """ - Extension to :class:`scanString`, to modify matching text with modified tokens that may - be returned from a parse action. To use ``transformString``, define a grammar and - attach a parse action to it that modifies the returned token list. - Invoking ``transformString()`` on a target string will then scan for matches, - and replace the matched text patterns according to the logic in the parse - action. ``transformString()`` returns the resulting transformed string. - - Example:: - - wd = Word(alphas) - wd.setParseAction(lambda toks: toks[0].title()) - - print(wd.transformString("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 = [] - lastE = 0 - # force preservation of <TAB>s, to minimize unwanted transformation of string, and to - # keep string locs straight between transformString and scanString - self.keepTabs = True - try: - for t,s,e in self.scanString( instring ): - out.append( instring[lastE:s] ) - if t: - if isinstance(t,ParseResults): - out += t.asList() - elif isinstance(t,list): - out += t - else: - out.append(t) - lastE = e - out.append(instring[lastE:]) - out = [o for o in out if o] - return "".join(map(_ustr,_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 - - def searchString( self, instring, maxMatches=_MAX_INT ): - """ - Another extension to :class:`scanString`, simplifying the access to the tokens found - to match the given parse expression. May be called with optional - ``maxMatches`` 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.searchString("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.searchString("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'] - """ - try: - return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) - 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 - - def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): - """ - 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 ``includeSeparators`` argument (default= ``False``), if the separating - matching text should be included in the split results. - - Example:: - - punc = oneOf(list(".,;:/-!?")) - print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) - - prints:: - - ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] - """ - splits = 0 - last = 0 - for t,s,e in self.scanString(instring, maxMatches=maxsplit): - yield instring[last:s] - if includeSeparators: - yield t[0] - last = e - yield instring[last:] - - def __add__(self, other ): - """ - Implementation of + operator - returns :class:`And`. Adding strings to a ParserElement - converts them to :class:`Literal`s by default. - - Example:: - - greet = Word(alphas) + "," + Word(alphas) + "!" - hello = "Hello, World!" - print (hello, "->", greet.parseString(hello)) - - prints:: - - Hello, World! -> ['Hello', ',', 'World', '!'] - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return And( [ self, other ] ) - - def __radd__(self, other ): - """ - Implementation of + operator when left operand is not a :class:`ParserElement` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other + self - - def __sub__(self, other): - """ - Implementation of - operator, returns :class:`And` with error stop - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return self + And._ErrorStop() + other - - def __rsub__(self, other ): - """ - Implementation of - operator when left operand is not a :class:`ParserElement` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other - self - - def __mul__(self,other): - """ - Implementation of * operator, allows use of ``expr * 3`` in place of - ``expr + expr + expr``. Expressions may also me 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 isinstance(other,int): - minElements, optElements = other,0 - elif isinstance(other,tuple): - 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: - raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) - else: - raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) - - 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: - raise ValueError("cannot multiply ParserElement by 0 or (0,0)") - - if (optElements): - def makeOptionalList(n): - if n>1: - return Optional(self + makeOptionalList(n-1)) - else: - return Optional(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): - return self.__mul__(other) - - def __or__(self, other ): - """ - Implementation of | operator - returns :class:`MatchFirst` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return MatchFirst( [ self, other ] ) - - def __ror__(self, other ): - """ - Implementation of | operator when left operand is not a :class:`ParserElement` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other | self - - def __xor__(self, other ): - """ - Implementation of ^ operator - returns :class:`Or` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return Or( [ self, other ] ) - - def __rxor__(self, other ): - """ - Implementation of ^ operator when left operand is not a :class:`ParserElement` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other ^ self - - def __and__(self, other ): - """ - Implementation of & operator - returns :class:`Each` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return Each( [ self, other ] ) - - def __rand__(self, other ): - """ - Implementation of & operator when left operand is not a :class:`ParserElement` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other & self - - def __invert__( self ): - """ - Implementation of ~ operator - returns :class:`NotAny` - """ - return NotAny( self ) - - def __call__(self, name=None): - """ - Shortcut for :class:`setResultsName`, with ``listAllMatches=False``. - - If ``name`` is given with a trailing ``'*'`` character, then ``listAllMatches`` will be - passed as ``True``. - - If ``name` is omitted, same as calling :class:`copy`. - - Example:: - - # these are equivalent - userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") - userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") - """ - if name is not None: - return self.setResultsName(name) - else: - return self.copy() - - def suppress( self ): - """ - Suppresses the output of this :class:`ParserElement`; useful to keep punctuation from - cluttering up returned output. - """ - return Suppress( self ) - - def leaveWhitespace( self ): - """ - 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. - """ - self.skipWhitespace = False - return self - - def setWhitespaceChars( self, chars ): - """ - Overrides the default whitespace chars - """ - self.skipWhitespace = True - self.whiteChars = chars - self.copyDefaultWhiteChars = False - return self - - def parseWithTabs( self ): - """ - Overrides default behavior to expand ``<TAB>``s to spaces before parsing the input string. - Must be called before ``parseString`` when the input grammar contains elements that - match ``<TAB>`` characters. - """ - self.keepTabs = True - return self - - def ignore( self, other ): - """ - 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 = OneOrMore(Word(alphas)) - patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] - - patt.ignore(cStyleComment) - patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] - """ - if isinstance(other, basestring): - 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 setDebugActions( self, startAction, successAction, exceptionAction ): - """ - Enable display of debugging messages while doing pattern matching. - """ - self.debugActions = (startAction or _defaultStartDebugAction, - successAction or _defaultSuccessDebugAction, - exceptionAction or _defaultExceptionDebugAction) - self.debug = True - return self - - def setDebug( self, flag=True ): - """ - Enable display of debugging messages while doing pattern matching. - Set ``flag`` to True to enable, False to disable. - - Example:: - - wd = Word(alphas).setName("alphaword") - integer = Word(nums).setName("numword") - term = wd | integer - - # turn on debugging for wd - wd.setDebug() - - OneOrMore(term).parseString("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:`setDebugActions`. 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:`setName` 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 ``setName`` is ``"W:(ABCD...)"``. - """ - if flag: - self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) - else: - self.debug = False - return self - - def __str__( self ): - return self.name - - def __repr__( self ): - return _ustr(self) - - def streamline( self ): - self.streamlined = True - self.strRepr = None - return self - - def checkRecursion( self, parseElementList ): - pass - - def validate( self, validateTrace=[] ): - """ - Check defined expressions for valid structure, check for infinite recursive definitions. - """ - self.checkRecursion( [] ) - - def parseFile( self, file_or_filename, parseAll=False ): - """ - 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. - """ - try: - file_contents = file_or_filename.read() - except AttributeError: - with open(file_or_filename, "r") as f: - file_contents = f.read() - try: - return self.parseString(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 - - def __eq__(self,other): - if isinstance(other, ParserElement): - return self is other or vars(self) == vars(other) - elif isinstance(other, basestring): - return self.matches(other) - else: - return super(ParserElement,self)==other - - def __ne__(self,other): - return not (self == other) - - def __hash__(self): - return hash(id(self)) - - def __req__(self,other): - return self == other - - def __rne__(self,other): - return not (self == other) - - def matches(self, testString, parseAll=True): - """ - 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: - - testString - to test against this expression for a match - - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests - - Example:: - - expr = Word(nums) - assert expr.matches("100") - """ - try: - self.parseString(_ustr(testString), parseAll=parseAll) - return True - except ParseBaseException: - return False - - def runTests(self, tests, parseAll=True, comment='#', - fullDump=True, printResults=True, failureTests=False, postParse=None): - """ - 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 - - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests - - comment - (default= ``'#'``) - expression for indicating embedded comments in the test - string; pass None to disable comment filtering - - fullDump - (default= ``True``) - dump results as list followed by results names in nested outline; - if False, only dump nested list - - printResults - (default= ``True``) prints test output to stdout - - failureTests - (default= ``False``) indicates if these tests are expected to fail parsing - - postParse - (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 - - Returns: a (success, results) tuple, where success indicates that all tests succeeded - (or failed if ``failureTests`` 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.runTests(''' - # 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.runTests(''' - # stray character - 100Z - # missing leading digit before '.' - -.100 - # too many '.' - 3.14.159 - ''', failureTests=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.runTest(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'.) - """ - if isinstance(tests, basestring): - tests = list(map(str.strip, tests.rstrip().splitlines())) - if isinstance(comment, basestring): - comment = Literal(comment) - allResults = [] - comments = [] - success = True - for t in tests: - if comment is not None and comment.matches(t, False) or comments and not t: - comments.append(t) - continue - if not t: - continue - out = ['\n'.join(comments), t] - comments = [] - try: - # convert newline marks to actual newlines, and strip leading BOM if present - t = t.replace(r'\n','\n').lstrip('\ufeff') - result = self.parseString(t, parseAll=parseAll) - out.append(result.dump(full=fullDump)) - success = success and not failureTests - if postParse is not None: - try: - pp_value = postParse(t, result) - if pp_value is not None: - out.append(str(pp_value)) - except Exception as e: - out.append("{0} failed: {1}: {2}".format(postParse.__name__, type(e).__name__, e)) - except ParseBaseException as pe: - fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" - if '\n' in t: - out.append(line(pe.loc, t)) - out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) - else: - out.append(' '*pe.loc + '^' + fatal) - out.append("FAIL: " + str(pe)) - success = success and failureTests - result = pe - except Exception as exc: - out.append("FAIL-EXCEPTION: " + str(exc)) - success = success and failureTests - result = exc - - if printResults: - if fullDump: - out.append('') - print('\n'.join(out)) - - allResults.append((t, result)) - - return success, allResults - - -class Token(ParserElement): - """Abstract :class:`ParserElement` subclass, for defining atomic - matching patterns. - """ - def __init__( self ): - super(Token,self).__init__( savelist=False ) - - -class Empty(Token): - """An empty token, will always match. - """ - def __init__( self ): - super(Empty,self).__init__() - self.name = "Empty" - self.mayReturnEmpty = True - self.mayIndexError = False - - -class NoMatch(Token): - """A token that will never match. - """ - def __init__( self ): - super(NoMatch,self).__init__() - self.name = "NoMatch" - 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').parseString('blah') # -> ['blah'] - Literal('blah').parseString('blahfooblah') # -> ['blah'] - Literal('blah').parseString('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 __init__( self, matchString ): - super(Literal,self).__init__() - self.match = matchString - self.matchLen = len(matchString) - try: - self.firstMatchChar = matchString[0] - except IndexError: - warnings.warn("null string passed to Literal; use Empty() instead", - SyntaxWarning, stacklevel=2) - self.__class__ = Empty - self.name = '"%s"' % _ustr(self.match) - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = False - self.mayIndexError = False - - # Performance tuning: this routine gets called a *lot* - # if this is a single character match string and the first character matches, - # short-circuit as quickly as possible, and avoid calling startswith - #~ @profile - def parseImpl( self, instring, loc, doActions=True ): - if (instring[loc] == self.firstMatchChar and - (self.matchLen==1 or instring.startswith(self.match,loc)) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) -_L = Literal -ParserElement._literalStringClass = Literal - -class Keyword(Token): - """Token to exactly match a specified string as a keyword, that is, - it must be immediately followed by a non-keyword character. 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: - - - ``identChars`` 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").parseString("start") # -> ['start'] - Keyword("start").parseString("starting") # -> Exception - - For case-insensitive matching, use :class:`CaselessKeyword`. - """ - DEFAULT_KEYWORD_CHARS = alphanums+"_$" - - def __init__( self, matchString, identChars=None, caseless=False ): - super(Keyword,self).__init__() - if identChars is None: - identChars = Keyword.DEFAULT_KEYWORD_CHARS - self.match = matchString - self.matchLen = len(matchString) - try: - self.firstMatchChar = matchString[0] - except IndexError: - warnings.warn("null string passed to Keyword; use Empty() instead", - SyntaxWarning, stacklevel=2) - self.name = '"%s"' % self.match - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = False - self.mayIndexError = False - self.caseless = caseless - if caseless: - self.caselessmatch = matchString.upper() - identChars = identChars.upper() - self.identChars = set(identChars) - - def parseImpl( self, instring, loc, doActions=True ): - if self.caseless: - if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and - (loc == 0 or instring[loc-1].upper() not in self.identChars) ): - return loc+self.matchLen, self.match - else: - if (instring[loc] == self.firstMatchChar and - (self.matchLen==1 or instring.startswith(self.match,loc)) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and - (loc == 0 or instring[loc-1] not in self.identChars) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) - - def copy(self): - c = super(Keyword,self).copy() - c.identChars = Keyword.DEFAULT_KEYWORD_CHARS - return c - - @staticmethod - def setDefaultKeywordChars( chars ): - """Overrides the default Keyword chars - """ - Keyword.DEFAULT_KEYWORD_CHARS = 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:: - - OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] - - (Contrast with example for :class:`CaselessKeyword`.) - """ - def __init__( self, matchString ): - super(CaselessLiteral,self).__init__( matchString.upper() ) - # Preserve the defining literal. - self.returnString = matchString - self.name = "'%s'" % self.returnString - 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:: - - OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] - - (Contrast with example for :class:`CaselessLiteral`.) - """ - def __init__( self, matchString, identChars=None ): - super(CaselessKeyword,self).__init__( matchString, 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 - - ``maxMismatches`` - (``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.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) - patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) - - # exact match - patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) - - # close match allowing up to 2 mismatches - patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) - patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) - """ - def __init__(self, match_string, maxMismatches=1): - super(CloseMatch,self).__init__() - self.name = match_string - self.match_string = match_string - self.maxMismatches = maxMismatches - self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) - self.mayIndexError = False - self.mayReturnEmpty = False - - 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], self.match_string)): - src,mat = s_m - if src != mat: - mismatches.append(match_stringloc) - if len(mismatches) > maxMismatches: - break - else: - loc = match_stringloc + 1 - results = ParseResults([instring[start:loc]]) - results['original'] = self.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. - Defined with string containing all allowed initial characters, an - optional string containing allowed body characters (if omitted, - defaults to the initial character set), 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. An optional ``excludeChars`` parameter can - list characters that might be found in the input ``bodyChars`` - string; useful to define a word of all printables except for one or - two characters, for instance. - - :class:`srange` is useful for defining custom character set strings - for defining ``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) - - 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, excludeChars=",") - """ - def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): - super(Word,self).__init__() - if excludeChars: - initChars = ''.join(c for c in initChars if c not in excludeChars) - if bodyChars: - bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) - self.initCharsOrig = initChars - self.initChars = set(initChars) - if bodyChars : - self.bodyCharsOrig = bodyChars - self.bodyChars = set(bodyChars) - else: - self.bodyCharsOrig = initChars - self.bodyChars = set(initChars) - - self.maxSpecified = max > 0 - - if min < 1: - raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word 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.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.asKeyword = asKeyword - - if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): - if self.bodyCharsOrig == self.initCharsOrig: - self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) - elif len(self.initCharsOrig) == 1: - self.reString = "%s[%s]*" % \ - (re.escape(self.initCharsOrig), - _escapeRegexRangeChars(self.bodyCharsOrig),) - else: - self.reString = "[%s][%s]*" % \ - (_escapeRegexRangeChars(self.initCharsOrig), - _escapeRegexRangeChars(self.bodyCharsOrig),) - if self.asKeyword: - self.reString = r"\b"+self.reString+r"\b" - try: - self.re = re.compile( self.reString ) - except Exception: - self.re = None - - def parseImpl( self, instring, loc, doActions=True ): - if self.re: - result = self.re.match(instring,loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - return loc, result.group() - - if not(instring[ loc ] 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 - if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: - throwException = True - if 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 __str__( self ): - try: - return super(Word,self).__str__() - except Exception: - pass - - - if self.strRepr is None: - - def charsAsStr(s): - if len(s)>4: - return s[:4]+"..." - else: - return s - - if ( self.initCharsOrig != self.bodyCharsOrig ): - self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) - else: - self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) - - return self.strRepr - - -class Char(Word): - """A short-cut class for defining ``Word(characters, exact=1)``, - when defining a match of any single character in a string of - characters. - """ - def __init__(self, charset): - super(Char, self).__init__(charset, exact=1) - self.reString = "[%s]" % _escapeRegexRangeChars(self.initCharsOrig) - self.re = re.compile( self.reString ) - - -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 parse results. - - Example:: - - realnum = Regex(r"[+-]?\d+\.\d*") - date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\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})") - """ - compiledREtype = type(re.compile("[A-Z]")) - def __init__( self, pattern, flags=0, asGroupList=False, asMatch=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(Regex,self).__init__() - - if isinstance(pattern, basestring): - if not pattern: - warnings.warn("null string passed to Regex; use Empty() instead", - SyntaxWarning, stacklevel=2) - - self.pattern = pattern - self.flags = flags - - try: - self.re = re.compile(self.pattern, self.flags) - self.reString = self.pattern - except sre_constants.error: - warnings.warn("invalid pattern (%s) passed to Regex" % pattern, - SyntaxWarning, stacklevel=2) - raise - - elif isinstance(pattern, Regex.compiledREtype): - self.re = pattern - self.pattern = \ - self.reString = str(pattern) - self.flags = flags - - else: - raise ValueError("Regex may only be constructed with a string or a compiled RE object") - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.mayReturnEmpty = True - self.asGroupList = asGroupList - self.asMatch = asMatch - - 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() - if self.asMatch: - ret = result - elif self.asGroupList: - ret = result.groups() - else: - ret = ParseResults(result.group()) - d = result.groupdict() - if d: - for k, v in d.items(): - ret[k] = v - return loc,ret - - def __str__( self ): - try: - return super(Regex,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "Re:(%s)" % repr(self.pattern) - - return self.strRepr - - def sub(self, repl): - """ - Return 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.transformString("h1:main title:")) - # prints "<h1>main title</h1>" - """ - if self.asGroupList: - warnings.warn("cannot use sub() with Regex(asGroupList=True)", - SyntaxWarning, stacklevel=2) - raise SyntaxError() - - if self.asMatch and callable(repl): - warnings.warn("cannot use sub() with a callable with Regex(asMatch=True)", - SyntaxWarning, stacklevel=2) - raise SyntaxError() - - if self.asMatch: - def pa(tokens): - return tokens[0].expand(repl) - else: - def pa(tokens): - return self.re.sub(repl, tokens[0]) - return self.addParseAction(pa) - -class QuotedString(Token): - r""" - Token for matching strings that are delimited by quoting characters. - - Defined with the following parameters: - - - quoteChar - string of one or more characters defining the - quote delimiting string - - escChar - character to escape quotes, typically backslash - (default= ``None`` ) - - escQuote - special quote sequence to escape an embedded quote - string (such as SQL's ``""`` to escape an embedded ``"``) - (default= ``None`` ) - - multiline - boolean indicating whether quotes can span - multiple lines (default= ``False`` ) - - unquoteResults - boolean indicating whether the matched text - should be unquoted (default= ``True`` ) - - endQuoteChar - string of one or more characters defining the - end of the quote delimited string (default= ``None`` => same as - quoteChar) - - convertWhitespaceEscapes - convert escaped whitespace - (``'\t'``, ``'\n'``, etc.) to actual whitespace - (default= ``True`` ) - - Example:: - - qs = QuotedString('"') - print(qs.searchString('lsjdf "This is the quote" sldjf')) - complex_qs = QuotedString('{{', endQuoteChar='}}') - print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) - sql_qs = QuotedString('"', escQuote='""') - print(sql_qs.searchString('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']] - """ - def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): - super(QuotedString,self).__init__() - - # remove white space from quote chars - wont work anyway - quoteChar = quoteChar.strip() - if not quoteChar: - warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) - raise SyntaxError() - - if endQuoteChar is None: - endQuoteChar = quoteChar - else: - endQuoteChar = endQuoteChar.strip() - if not endQuoteChar: - warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) - raise SyntaxError() - - self.quoteChar = quoteChar - self.quoteCharLen = len(quoteChar) - self.firstQuoteChar = quoteChar[0] - self.endQuoteChar = endQuoteChar - self.endQuoteCharLen = len(endQuoteChar) - self.escChar = escChar - self.escQuote = escQuote - self.unquoteResults = unquoteResults - self.convertWhitespaceEscapes = convertWhitespaceEscapes - - if multiline: - self.flags = re.MULTILINE | re.DOTALL - self.pattern = r'%s(?:[^%s%s]' % \ - ( re.escape(self.quoteChar), - _escapeRegexRangeChars(self.endQuoteChar[0]), - (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) - else: - self.flags = 0 - self.pattern = r'%s(?:[^%s\n\r%s]' % \ - ( re.escape(self.quoteChar), - _escapeRegexRangeChars(self.endQuoteChar[0]), - (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) - if len(self.endQuoteChar) > 1: - self.pattern += ( - '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), - _escapeRegexRangeChars(self.endQuoteChar[i])) - for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' - ) - if escQuote: - self.pattern += (r'|(?:%s)' % re.escape(escQuote)) - if escChar: - self.pattern += (r'|(?:%s.)' % re.escape(escChar)) - self.escCharReplacePattern = re.escape(self.escChar)+"(.)" - self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) - - try: - self.re = re.compile(self.pattern, self.flags) - self.reString = self.pattern - except sre_constants.error: - warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, - SyntaxWarning, stacklevel=2) - raise - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.mayReturnEmpty = True - - 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,basestring): - # replace escaped whitespace - if '\\' in ret and self.convertWhitespaceEscapes: - ws_map = { - r'\t' : '\t', - r'\n' : '\n', - r'\f' : '\f', - r'\r' : '\r', - } - for wslit,wschar in ws_map.items(): - ret = ret.replace(wslit, wschar) - - # replace escaped characters - if self.escChar: - ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) - - # replace escaped quotes - if self.escQuote: - ret = ret.replace(self.escQuote, self.endQuoteChar) - - return loc, ret - - def __str__( self ): - try: - return super(QuotedString,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) - - return self.strRepr - - -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).parseString("dkls,lsdkjf,s12 34,@!#,213")) - - prints:: - - ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] - """ - def __init__( self, notChars, min=1, max=0, exact=0 ): - super(CharsNotIn,self).__init__() - self.skipWhitespace = False - self.notChars = notChars - - if min < 1: - raise ValueError( - "cannot specify a minimum length < 1; use " + - "Optional(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.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = ( self.minLen == 0 ) - self.mayIndexError = False - - def parseImpl( self, instring, loc, doActions=True ): - if instring[loc] in self.notChars: - raise ParseException(instring, loc, self.errmsg, self) - - start = loc - loc += 1 - notchars = self.notChars - 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] - - def __str__( self ): - try: - return super(CharsNotIn, self).__str__() - except Exception: - pass - - if self.strRepr is None: - if len(self.notChars) > 4: - self.strRepr = "!W:(%s...)" % self.notChars[:4] - else: - self.strRepr = "!W:(%s)" % self.notChars - - return self.strRepr - -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>', - 'u\00A0': '<NBSP>', - 'u\1680': '<OGHAM_SPACE_MARK>', - 'u\180E': '<MONGOLIAN_VOWEL_SEPARATOR>', - 'u\2000': '<EN_QUAD>', - 'u\2001': '<EM_QUAD>', - 'u\2002': '<EN_SPACE>', - 'u\2003': '<EM_SPACE>', - 'u\2004': '<THREE-PER-EM_SPACE>', - 'u\2005': '<FOUR-PER-EM_SPACE>', - 'u\2006': '<SIX-PER-EM_SPACE>', - 'u\2007': '<FIGURE_SPACE>', - 'u\2008': '<PUNCTUATION_SPACE>', - 'u\2009': '<THIN_SPACE>', - 'u\200A': '<HAIR_SPACE>', - 'u\200B': '<ZERO_WIDTH_SPACE>', - 'u\202F': '<NNBSP>', - 'u\205F': '<MMSP>', - 'u\3000': '<IDEOGRAPHIC_SPACE>', - } - def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): - super(White,self).__init__() - self.matchWhite = ws - self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) - #~ self.leaveWhitespace() - self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) - 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 parseImpl( self, instring, loc, doActions=True ): - if not(instring[ loc ] 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(_PositionToken,self).__init__() - self.name=self.__class__.__name__ - 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 ): - super(GoToColumn,self).__init__() - self.col = colno - - def preParse( self, instring, loc ): - 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): - """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' + restOfLine).searchString(test): - print(t) - - prints:: - - ['AAA', ' this line'] - ['AAA', ' and this line'] - - """ - def __init__( self ): - super(LineStart,self).__init__() - self.errmsg = "Expected start of line" - - 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(LineEnd,self).__init__() - self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) - 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(StringStart,self).__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(StringEnd,self).__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 Word, - and is not preceded by any character in a given set of - ``wordChars`` (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, wordChars = printables): - super(WordStart,self).__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 Word, and is - not followed by any character in a given set of ``wordChars`` - (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, wordChars = printables): - super(WordEnd,self).__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, savelist = False ): - super(ParseExpression,self).__init__(savelist) - if isinstance( exprs, _generatorType ): - exprs = list(exprs) - - if isinstance( exprs, basestring ): - self.exprs = [ ParserElement._literalStringClass( exprs ) ] - elif isinstance( exprs, Iterable ): - exprs = list(exprs) - # if sequence of strings provided, wrap with Literal - if all(isinstance(expr, basestring) for expr in exprs): - exprs = map(ParserElement._literalStringClass, exprs) - self.exprs = list(exprs) - else: - try: - self.exprs = list( exprs ) - except TypeError: - self.exprs = [ exprs ] - self.callPreparse = False - - def __getitem__( self, i ): - return self.exprs[i] - - def append( self, other ): - self.exprs.append( other ) - self.strRepr = None - return self - - def leaveWhitespace( self ): - """Extends ``leaveWhitespace`` defined in base class, and also invokes ``leaveWhitespace`` on - all contained expressions.""" - self.skipWhitespace = False - self.exprs = [ e.copy() for e in self.exprs ] - for e in self.exprs: - e.leaveWhitespace() - return self - - def ignore( self, other ): - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - super( ParseExpression, self).ignore( other ) - for e in self.exprs: - e.ignore( self.ignoreExprs[-1] ) - else: - super( ParseExpression, self).ignore( other ) - for e in self.exprs: - e.ignore( self.ignoreExprs[-1] ) - return self - - def __str__( self ): - try: - return super(ParseExpression,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) - return self.strRepr - - def streamline( self ): - super(ParseExpression,self).streamline() - - for e in self.exprs: - e.streamline() - - # collapse nested 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 Or's and 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.strRepr = 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.strRepr = None - self.mayReturnEmpty |= other.mayReturnEmpty - self.mayIndexError |= other.mayIndexError - - self.errmsg = "Expected " + _ustr(self) - - return self - - def setResultsName( self, name, listAllMatches=False ): - ret = super(ParseExpression,self).setResultsName(name,listAllMatches) - return ret - - def validate( self, validateTrace=[] ): - tmp = validateTrace[:]+[self] - for e in self.exprs: - e.validate(tmp) - self.checkRecursion( [] ) - - def copy(self): - ret = super(ParseExpression,self).copy() - ret.exprs = [e.copy() for e in self.exprs] - return ret - -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 = OneOrMore(Word(alphas)) - - 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(And._ErrorStop,self).__init__(*args, **kwargs) - self.name = '-' - self.leaveWhitespace() - - def __init__( self, exprs, savelist = True ): - super(And,self).__init__(exprs, savelist) - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - self.setWhitespaceChars( self.exprs[0].whiteChars ) - self.skipWhitespace = self.exprs[0].skipWhitespace - self.callPreparse = True - - def streamline(self): - super(And, self).streamline() - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - return self - - def parseImpl( self, instring, loc, doActions=True ): - # pass False as last 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): - 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 ) - if exprtokens or exprtokens.haskeys(): - resultlist += exprtokens - return loc, resultlist - - def __iadd__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - 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 __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - -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.searchString("123 3.1416 789")) - - prints:: - - [['123'], ['3.1416'], ['789']] - """ - def __init__( self, exprs, savelist = False ): - super(Or,self).__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - else: - self.mayReturnEmpty = True - - def streamline(self): - super(Or, self).streamline() - self.saveAsList = any(e.saveAsList for e in self.exprs) - return self - - def parseImpl( self, instring, loc, doActions=True ): - maxExcLoc = -1 - maxException = None - matches = [] - for e in self.exprs: - try: - loc2 = e.tryParse( instring, loc ) - except ParseException as err: - 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: - matches.sort(key=lambda x: -x[0]) - for _,e in matches: - try: - return e._parse( instring, loc, doActions ) - except ParseException as err: - err.__traceback__ = None - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - - if maxException is not None: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException(instring, loc, "no defined alternatives to match", self) - - - def __ixor__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #Or( [ self, other ] ) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class MatchFirst(ParseExpression): - """Requires that at least one :class:`ParseExpression` is found. If - two expressions match, 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.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] - - # put more selective expression first - number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) - print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] - """ - def __init__( self, exprs, savelist = False ): - super(MatchFirst,self).__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - # self.saveAsList = any(e.saveAsList for e in self.exprs) - else: - self.mayReturnEmpty = True - - def streamline(self): - super(MatchFirst, self).streamline() - self.saveAsList = any(e.saveAsList for e in self.exprs) - return self - - def parseImpl( self, instring, loc, doActions=True ): - maxExcLoc = -1 - maxException = None - for e in self.exprs: - try: - ret = e._parse( instring, loc, doActions ) - return ret - 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) - - # only got here if no expression matched, raise exception for match that made it the furthest - else: - if maxException is not None: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException(instring, loc, "no defined alternatives to match", self) - - def __ior__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #MatchFirst( [ self, other ] ) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -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 = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") - shape_type = oneOf("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 & Optional(color_attr) & Optional(size_attr) - - shape_spec.runTests(''' - 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, savelist = True ): - super(Each,self).__init__(exprs, savelist) - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - self.skipWhitespace = True - self.initExprGroups = True - self.saveAsList = True - - def streamline(self): - super(Each, self).streamline() - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - 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,Optional)) - opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] - opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] - self.optionals = opt1 + opt2 - self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] - self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] - self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] - self.required += self.multirequired - self.initExprGroups = False - tmpLoc = loc - tmpReqd = self.required[:] - tmpOpt = self.optionals[:] - matchOrder = [] - - keepMatching = True - while keepMatching: - tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired - failed = [] - for e in tmpExprs: - try: - tmpLoc = e.tryParse( instring, tmpLoc ) - 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 - - if tmpReqd: - missing = ", ".join(_ustr(e) for e in tmpReqd) - raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) - - # add any unmatched Optionals, in case they have default values defined - matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] - - resultlist = [] - for e in matchOrder: - loc,results = e._parse(instring,loc,doActions) - resultlist.append(results) - - finalResults = sum(resultlist, ParseResults([])) - return loc, finalResults - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class ParseElementEnhance(ParserElement): - """Abstract subclass of :class:`ParserElement`, for combining and - post-processing parsed tokens. - """ - def __init__( self, expr, savelist=False ): - super(ParseElementEnhance,self).__init__(savelist) - if isinstance( expr, basestring ): - if issubclass(ParserElement._literalStringClass, Token): - expr = ParserElement._literalStringClass(expr) - else: - expr = ParserElement._literalStringClass(Literal(expr)) - self.expr = expr - self.strRepr = None - if expr is not None: - self.mayIndexError = expr.mayIndexError - self.mayReturnEmpty = expr.mayReturnEmpty - self.setWhitespaceChars( expr.whiteChars ) - self.skipWhitespace = expr.skipWhitespace - self.saveAsList = expr.saveAsList - self.callPreparse = expr.callPreparse - self.ignoreExprs.extend(expr.ignoreExprs) - - def parseImpl( self, instring, loc, doActions=True ): - if self.expr is not None: - return self.expr._parse( instring, loc, doActions, callPreParse=False ) - else: - raise ParseException("",loc,self.errmsg,self) - - def leaveWhitespace( self ): - self.skipWhitespace = False - self.expr = self.expr.copy() - if self.expr is not None: - self.expr.leaveWhitespace() - return self - - def ignore( self, other ): - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - super( ParseElementEnhance, self).ignore( other ) - if self.expr is not None: - self.expr.ignore( self.ignoreExprs[-1] ) - else: - super( ParseElementEnhance, self).ignore( other ) - if self.expr is not None: - self.expr.ignore( self.ignoreExprs[-1] ) - return self - - def streamline( self ): - super(ParseElementEnhance,self).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=[] ): - tmp = validateTrace[:]+[self] - if self.expr is not None: - self.expr.validate(tmp) - self.checkRecursion( [] ) - - def __str__( self ): - try: - return super(ParseElementEnhance,self).__str__() - except Exception: - pass - - if self.strRepr is None and self.expr is not None: - self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) - return self.strRepr - - -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, stopOn=label).setParseAction(' '.join)) - - OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() - - prints:: - - [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] - """ - def __init__( self, expr ): - super(FollowedBy,self).__init__(expr) - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - _, 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, Literal, Keyword, or - a Word or 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, retreat=None): - super(PrecededBy, self).__init__(expr) - self.expr = self.expr().leaveWhitespace() - self.mayReturnEmpty = True - self.mayIndexError = False - self.exact = False - if isinstance(expr, str): - 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 - - 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[:loc] - last_expr = ParseException(instring, loc, self.errmsg) - for offset in range(1, min(loc, self.retreat+1)): - try: - _, ret = test_expr._parse(instring_slice, loc-offset) - except ParseBaseException as pbe: - last_expr = pbe - else: - break - else: - raise last_expr - # return empty list of tokens, but preserve any defined results names - del ret[:] - return loc, ret - - -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 = Optional(NOT) + ident - - # very crude boolean expression - to support parenthesis groups and - # operation hierarchy, use infixNotation - boolean_expr = boolean_term + ZeroOrMore((AND | OR) + boolean_term) - - # integers that are followed by "." are actually floats - integer = Word(nums) + ~Char(".") - """ - def __init__( self, expr ): - super(NotAny,self).__init__(expr) - #~ self.leaveWhitespace() - self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs - self.mayReturnEmpty = True - self.errmsg = "Found unwanted token, "+_ustr(self.expr) - - def parseImpl( self, instring, loc, doActions=True ): - if self.expr.canParseNext(instring, loc): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "~{" + _ustr(self.expr) + "}" - - return self.strRepr - -class _MultipleMatch(ParseElementEnhance): - def __init__( self, expr, stopOn=None): - super(_MultipleMatch, self).__init__(expr) - self.saveAsList = True - ender = stopOn - if isinstance(ender, basestring): - ender = ParserElement._literalStringClass(ender) - self.not_ender = ~ender if ender is not None else None - - 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.tryParse - - # 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, callPreParse=False ) - 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 ) - if tmptokens or tmptokens.haskeys(): - tokens += tmptokens - except (ParseException,IndexError): - pass - - return loc, tokens - -class OneOrMore(_MultipleMatch): - """Repetition of one or more of the given expression. - - Parameters: - - expr - expression that must match one or more times - - stopOn - (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).setParseAction(' '.join)) - - text = "shape: SQUARE posn: upper left color: BLACK" - OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] - - # use stopOn attribute for OneOrMore to avoid reading label string as part of the data - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] - - # could also be written as - (attr_expr * (1,)).parseString(text).pprint() - """ - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + _ustr(self.expr) + "}..." - - return self.strRepr - -class ZeroOrMore(_MultipleMatch): - """Optional repetition of zero or more of the given expression. - - Parameters: - - expr - expression that must match zero or more times - - stopOn - (default= ``None``) - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - - Example: similar to :class:`OneOrMore` - """ - def __init__( self, expr, stopOn=None): - super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - try: - return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) - except (ParseException,IndexError): - return loc, [] - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "[" + _ustr(self.expr) + "]..." - - return self.strRepr - -class _NullToken(object): - def __bool__(self): - return False - __nonzero__ = __bool__ - def __str__(self): - return "" - -_optionalNotMatched = _NullToken() -class Optional(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) + Optional('-' + Word(nums, exact=4))) - zip.runTests(''' - # 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) - """ - def __init__( self, expr, default=_optionalNotMatched ): - super(Optional,self).__init__( expr, savelist=False ) - self.saveAsList = self.expr.saveAsList - self.defaultValue = default - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - try: - loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) - except (ParseException,IndexError): - if self.defaultValue is not _optionalNotMatched: - if self.expr.resultsName: - tokens = ParseResults([ self.defaultValue ]) - tokens[self.expr.resultsName] = self.defaultValue - else: - tokens = [ self.defaultValue ] - else: - tokens = [] - return loc, tokens - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "[" + _ustr(self.expr) + "]" - - return self.strRepr - -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 - (default= ``False``) if True, the target expression is also parsed - (the skipped text and target expression are returned as a 2-element list). - - ignore - (default= ``None``) used to define grammars (typically quoted strings and - comments) that might contain false matches to the target expression - - failOn - (default= ``None``) define expressions that are not allowed to be - included in the skipped test; if found before the target expression is found, - the 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=quotedString) - string_data.setParseAction(tokenMap(str.strip)) - ticket_expr = (integer("issue_num") + SEP - + string_data("sev") + SEP - + string_data("desc") + SEP - + integer("days_open")) - - for tkt in ticket_expr.searchString(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, include=False, ignore=None, failOn=None ): - super( SkipTo, self ).__init__( other ) - self.ignoreExpr = ignore - self.mayReturnEmpty = True - self.mayIndexError = False - self.includeMatch = include - self.saveAsList = False - if isinstance(failOn, basestring): - self.failOn = ParserElement._literalStringClass(failOn) - else: - self.failOn = failOn - self.errmsg = "No match found for "+_ustr(self.expr) - - def parseImpl( self, instring, loc, doActions=True ): - startloc = loc - instrlen = len(instring) - expr = self.expr - expr_parse = self.expr._parse - self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None - self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None 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_ignoreExpr_tryParse is not None: - # advance past ignore expressions - while 1: - try: - tmploc = self_ignoreExpr_tryParse(instring, tmploc) - except ParseBaseException: - break - - try: - 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 = 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:: - - fwdExpr << a | b | c - - will actually be evaluated as:: - - (fwdExpr << 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``:: - - fwdExpr << (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=None ): - super(Forward,self).__init__( other, savelist=False ) - - def __lshift__( self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass(other) - self.expr = other - self.strRepr = None - self.mayIndexError = self.expr.mayIndexError - self.mayReturnEmpty = self.expr.mayReturnEmpty - self.setWhitespaceChars( self.expr.whiteChars ) - self.skipWhitespace = self.expr.skipWhitespace - self.saveAsList = self.expr.saveAsList - self.ignoreExprs.extend(self.expr.ignoreExprs) - return self - - def __ilshift__(self, other): - return self << other - - def leaveWhitespace( self ): - self.skipWhitespace = False - return self - - def streamline( self ): - if not self.streamlined: - self.streamlined = True - if self.expr is not None: - self.expr.streamline() - return self - - def validate( self, validateTrace=[] ): - if self not in validateTrace: - tmp = validateTrace[:]+[self] - if self.expr is not None: - self.expr.validate(tmp) - self.checkRecursion([]) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - return self.__class__.__name__ + ": ..." - - # stubbed out for now - creates awful memory and perf issues - self._revertClass = self.__class__ - self.__class__ = _ForwardNoRecurse - try: - if self.expr is not None: - retString = _ustr(self.expr) - else: - retString = "None" - finally: - self.__class__ = self._revertClass - return self.__class__.__name__ + ": " + retString - - def copy(self): - if self.expr is not None: - return super(Forward,self).copy() - else: - ret = Forward() - ret <<= self - return ret - -class _ForwardNoRecurse(Forward): - def __str__( self ): - return "..." - -class TokenConverter(ParseElementEnhance): - """ - Abstract subclass of :class:`ParseExpression`, for converting parsed results. - """ - def __init__( self, expr, savelist=False ): - super(TokenConverter,self).__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.parseString('3.1416')) # -> ['3', '.', '1416'] - # will also erroneously match the following - print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] - - real = Combine(Word(nums) + '.' + Word(nums)) - print(real.parseString('3.1416')) # -> ['3.1416'] - # no match when there are internal spaces - print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) - """ - def __init__( self, expr, joinString="", adjacent=True ): - super(Combine,self).__init__( expr ) - # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself - if adjacent: - self.leaveWhitespace() - self.adjacent = adjacent - self.skipWhitespace = True - self.joinString = joinString - self.callPreparse = True - - def ignore( self, other ): - if self.adjacent: - ParserElement.ignore(self, other) - else: - super( Combine, self).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. - - Example:: - - ident = Word(alphas) - num = Word(nums) - term = ident | num - func = ident + Optional(delimitedList(term)) - print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] - - func = ident + Group(Optional(delimitedList(term))) - print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] - """ - def __init__( self, expr ): - super(Group,self).__init__( expr ) - self.saveAsList = expr.saveAsList - - def postParse( self, instring, loc, tokenlist ): - 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. - - Example:: - - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) - - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - - # print attributes as plain groups - print(OneOrMore(attr_expr).parseString(text).dump()) - - # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names - result = Dict(OneOrMore(Group(attr_expr))).parseString(text) - print(result.dump()) - - # access named fields as dict entries, or output as dict - print(result['shape']) - print(result.asDict()) - - 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 ): - super(Dict,self).__init__( expr ) - self.saveAsList = True - - 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 = _ustr(tok[0]).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: - dictvalue = tok.copy() #ParseResults(i) - 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.resultsName: - return [ tokenlist ] - else: - return 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 + ZeroOrMore(',' + wd) - print(wd_list1.parseString(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 + ZeroOrMore(Suppress(',') + wd) - print(wd_list2.parseString(source)) - - prints:: - - ['a', ',', 'b', ',', 'c', ',', 'd'] - ['a', 'b', 'c', 'd'] - - (See also :class:`delimitedList`.) - """ - def postParse( self, instring, loc, tokenlist ): - return [] - - def suppress( self ): - return self - - -class OnlyOnce(object): - """Wrapper for parse actions, to ensure they are only called once. - """ - def __init__(self, methodCall): - self.callable = _trim_arity(methodCall) - 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,"") - def reset(self): - self.called = False - -def traceParseAction(f): - """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) - - @traceParseAction - def remove_duplicate_chars(tokens): - return ''.join(sorted(set(''.join(tokens)))) - - wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) - print(wds.parseString("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( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) - try: - ret = f(*paArgs) - except Exception as exc: - sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) - raise - sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) - return ret - try: - z.__name__ = f.__name__ - except AttributeError: - pass - return z - -# -# global helpers -# -def delimitedList( expr, delim=",", combine=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. - - Example:: - - delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] - delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] - """ - dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." - if combine: - return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) - else: - return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) - -def countedArray( expr, intExpr=None ): - """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 ``intExpr`` is specified, it should be a pyparsing expression - that produces an integer value. - - Example:: - - countedArray(Word(alphas)).parseString('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 - binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) - countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] - """ - arrayExpr = Forward() - def countFieldParseAction(s,l,t): - n = t[0] - arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) - return [] - if intExpr is None: - intExpr = Word(nums).setParseAction(lambda t:int(t[0])) - else: - intExpr = intExpr.copy() - intExpr.setName("arrayLen") - intExpr.addParseAction(countFieldParseAction, callDuringTry=True) - return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') - -def _flatten(L): - ret = [] - for i in L: - if isinstance(i,list): - ret.extend(_flatten(i)) - else: - ret.append(i) - return ret - -def matchPreviousLiteral(expr): - """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 = matchPreviousLiteral(first) - matchExpr = 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:`matchPreviousExpr`. Do *not* use with packrat parsing - enabled. - """ - rep = Forward() - def copyTokenToRepeater(s,l,t): - if t: - if len(t) == 1: - rep << t[0] - else: - # flatten t tokens - tflat = _flatten(t.asList()) - rep << And(Literal(tt) for tt in tflat) - else: - rep << Empty() - expr.addParseAction(copyTokenToRepeater, callDuringTry=True) - rep.setName('(prev) ' + _ustr(expr)) - return rep - -def matchPreviousExpr(expr): - """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 = matchPreviousExpr(first) - matchExpr = 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 copyTokenToRepeater(s,l,t): - matchTokens = _flatten(t.asList()) - def mustMatchTheseTokens(s,l,t): - theseTokens = _flatten(t.asList()) - if theseTokens != matchTokens: - raise ParseException("",0,"") - rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) - expr.addParseAction(copyTokenToRepeater, callDuringTry=True) - rep.setName('(prev) ' + _ustr(expr)) - return rep - -def _escapeRegexRangeChars(s): - #~ 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 _ustr(s) - -def oneOf( strs, caseless=False, useRegex=True ): - """Helper to quickly define a set of alternative Literals, 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 - (default= ``False``) - treat all literals as - caseless - - useRegex - (default= ``True``) - as an optimization, will - generate a Regex object; otherwise, will generate - a :class:`MatchFirst` object (if ``caseless=True``, or if - creating a :class:`Regex` raises an exception) - - Example:: - - comp_oper = oneOf("< = > <= >= !=") - var = Word(alphas) - number = Word(nums) - term = var | number - comparison_expr = term + comp_oper + term - print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) - - prints:: - - [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] - """ - if caseless: - isequal = ( lambda a,b: a.upper() == b.upper() ) - masks = ( lambda a,b: b.upper().startswith(a.upper()) ) - parseElementClass = CaselessLiteral - else: - isequal = ( lambda a,b: a == b ) - masks = ( lambda a,b: b.startswith(a) ) - parseElementClass = Literal - - symbols = [] - if isinstance(strs,basestring): - symbols = strs.split() - elif isinstance(strs, Iterable): - symbols = list(strs) - else: - warnings.warn("Invalid argument to oneOf, expected string or iterable", - SyntaxWarning, stacklevel=2) - if not symbols: - return NoMatch() - - 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) - cur = other - break - else: - i += 1 - - if not caseless and useRegex: - #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) - try: - if len(symbols)==len("".join(symbols)): - return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) - else: - return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) - except Exception: - warnings.warn("Exception creating Regex for oneOf, building MatchFirst", - SyntaxWarning, stacklevel=2) - - - # last resort, just use MatchFirst - return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) - -def dictOf( key, value ): - """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, stopOn=label).setParseAction(' '.join)) - print(OneOrMore(attr_expr).parseString(text).dump()) - - attr_label = label - attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) - - # similar to Dict, but simpler call format - result = dictOf(attr_label, attr_value).parseString(text) - print(result.dump()) - print(result['shape']) - print(result.shape) # object attribute access works too - print(result.asDict()) - - 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 originalTextFor(expr, asString=True): - """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 astring containing the original parsed text. - - If the optional ``asString`` 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:`originalTextFor` contains expressions with defined - results names, you must set ``asString`` to ``False`` if you - want to preserve those results name values. - - Example:: - - src = "this is test <b> bold <i>text</i> </b> normal text " - for tag in ("b","i"): - opener,closer = makeHTMLTags(tag) - patt = originalTextFor(opener + SkipTo(closer) + closer) - print(patt.searchString(src)[0]) - - prints:: - - ['<b> bold <i>text</i> </b>'] - ['<i>text</i>'] - """ - locMarker = Empty().setParseAction(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.setParseAction(extractText) - matchExpr.ignoreExprs = expr.ignoreExprs - return matchExpr - -def ungroup(expr): - """Helper to undo pyparsing's default grouping of And expressions, - even if all but one are non-empty. - """ - return TokenConverter(expr).setParseAction(lambda t:t[0]) - -def locatedExpr(expr): - """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.parseWithTabs` - - Example:: - - wd = Word(alphas) - for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): - print(match) - - prints:: - - [[0, 'ljsdf', 5]] - [[8, 'lksdjjf', 15]] - [[18, 'lkkjj', 23]] - """ - locator = Empty().setParseAction(lambda s,l,t: l) - return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) - - -# convenience constants for positional expressions -empty = Empty().setName("empty") -lineStart = LineStart().setName("lineStart") -lineEnd = LineEnd().setName("lineEnd") -stringStart = StringStart().setName("stringStart") -stringEnd = StringEnd().setName("stringEnd") - -_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) -_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) -_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) -_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1) -_charRange = Group(_singleChar + Suppress("-") + _singleChar) -_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" - -def srange(s): - r"""Helper to easily define string ranges for use in 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(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) - try: - return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) - except Exception: - return "" - -def matchOnlyAtCol(n): - """Helper method for defining parse actions that require matching at - a specific column in the input text. - """ - def verifyCol(strg,locn,toks): - if col(locn,strg) != n: - raise ParseException(strg,locn,"matched token not at column %d" % n) - return verifyCol - -def replaceWith(replStr): - """Helper method for common parse actions that simply return - a literal value. Especially useful when used with - :class:`transformString<ParserElement.transformString>` (). - - Example:: - - num = Word(nums).setParseAction(lambda toks: int(toks[0])) - na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) - term = na | num - - OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] - """ - return lambda s,l,t: [replStr] - -def removeQuotes(s,l,t): - """Helper parse action for removing quotation marks from parsed - quoted strings. - - Example:: - - # by default, quotation marks are included in parsed results - quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] - - # use removeQuotes to strip quotation marks from parsed results - quotedString.setParseAction(removeQuotes) - quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] - """ - return t[0][1:-1] - -def tokenMap(func, *args): - """Helper to define a parse action by mapping a function to all - elements of a 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).setParseAction(tokenMap(int, 16))``, - which will convert the parsed data to an integer using base 16. - - Example (compare the last to example in :class:`ParserElement.transformString`:: - - hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) - hex_ints.runTests(''' - 00 11 22 aa FF 0a 0d 1a - ''') - - upperword = Word(alphas).setParseAction(tokenMap(str.upper)) - OneOrMore(upperword).runTests(''' - my kingdom for a horse - ''') - - wd = Word(alphas).setParseAction(tokenMap(str.title)) - OneOrMore(wd).setParseAction(' '.join).runTests(''' - 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] - - try: - func_name = getattr(func, '__name__', - getattr(func, '__class__').__name__) - except Exception: - func_name = str(func) - pa.__name__ = func_name - - return pa - -upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) -"""(Deprecated) Helper parse action to convert tokens to upper case. -Deprecated in favor of :class:`pyparsing_common.upcaseTokens`""" - -downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) -"""(Deprecated) Helper parse action to convert tokens to lower case. -Deprecated in favor of :class:`pyparsing_common.downcaseTokens`""" - -def _makeTags(tagStr, xml): - """Internal helper to construct opening and closing tag expressions, given a tag name""" - if isinstance(tagStr,basestring): - resname = tagStr - tagStr = Keyword(tagStr, caseless=not xml) - else: - resname = tagStr.name - - tagAttrName = Word(alphas,alphanums+"_-:") - if (xml): - tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) - openTag = Suppress("<") + tagStr("tag") + \ - Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ - Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") - else: - printablesLessRAbrack = "".join(c for c in printables if c not in ">") - tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) - openTag = Suppress("<") + tagStr("tag") + \ - Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ - Optional( Suppress("=") + tagAttrValue ) ))) + \ - Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") - closeTag = Combine(_L("</") + tagStr + ">") - - openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) - closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) - openTag.tag = resname - closeTag.tag = resname - return openTag, closeTag - -def makeHTMLTags(tagStr): - """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>' - # makeHTMLTags returns pyparsing expressions for the opening and - # closing tags as a 2-tuple - a,a_end = makeHTMLTags("A") - link_expr = a + SkipTo(a_end)("link_text") + a_end - - for link in link_expr.searchString(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( tagStr, False ) - -def makeXMLTags(tagStr): - """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:`makeHTMLTags` - """ - return _makeTags( tagStr, True ) - -def withAttribute(*args,**attrDict): - """Helper to create a validating parse action to be used with start - tags created with :class:`makeXMLTags` or - :class:`makeHTMLTags`. Use ``withAttribute`` to qualify - a starting tag with a required attribute value, to avoid false - matches on common tags such as ``<TD>`` or ``<DIV>``. - - Call ``withAttribute`` 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:`withClass`. - - To verify that the attribute exists, but without specifying a value, - pass ``withAttribute.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 = makeHTMLTags("div") - - # only match div tag having a type attribute with value "grid" - div_grid = div().setParseAction(withAttribute(type="grid")) - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.searchString(html): - print(grid_header.body) - - # construct a match with any div tag having a type attribute, regardless of the value - div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.searchString(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 = attrDict.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 != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: - raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % - (attrName, tokens[attrName], attrValue)) - return pa -withAttribute.ANY_VALUE = object() - -def withClass(classname, namespace=''): - """Simplified version of :class:`withAttribute` 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 <div> has no class</div> - </div> - - ''' - div,div_end = makeHTMLTags("div") - div_grid = div().setParseAction(withClass("grid")) - - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.searchString(html): - print(grid_header.body) - - div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.searchString(html): - print(div_header.body) - - prints:: - - 1 4 0 1 0 - - 1 4 0 1 0 - 1,3 2,3 1,1 - """ - classattr = "%s:class" % namespace if namespace else "class" - return withAttribute(**{classattr : classname}) - -opAssoc = SimpleNamespace() -opAssoc.LEFT = object() -opAssoc.RIGHT = object() - -def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): - """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 infixNotation. See - :class:`ParserElement.enablePackrat` for a mechanism to potentially - improve your parser performance. - - Parameters: - - baseExpr - expression representing the most basic element for the - nested - - opList - list of tuples, one for each operator precedence level - in the expression grammar; each tuple is of the form ``(opExpr, - numTerms, rightLeftAssoc, parseAction)``, where: - - - opExpr is the pyparsing expression for the operator; may also - be a string, which will be converted to a Literal; if numTerms - is 3, opExpr is a tuple of two expressions, for the two - operators separating the 3 terms - - numTerms is the number of terms for this operator (must be 1, - 2, or 3) - - rightLeftAssoc is the indicator whether the operator is right - or left associative, using the pyparsing-defined constants - ``opAssoc.RIGHT`` and ``opAssoc.LEFT``. - - parseAction 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 - ``setParseAction(*fn)`` - (:class:`ParserElement.setParseAction`) - - lpar - expression for matching left-parentheses - (default= ``Suppress('(')``) - - rpar - expression for matching right-parentheses - (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 = infixNotation(integer | varname, - [ - ('-', 1, opAssoc.RIGHT), - (oneOf('* /'), 2, opAssoc.LEFT), - (oneOf('+ -'), 2, opAssoc.LEFT), - ]) - - arith_expr.runTests(''' - 5+3*6 - (5+3)*6 - -2--11 - ''', fullDump=False) - - prints:: - - 5+3*6 - [[5, '+', [3, '*', 6]]] - - (5+3)*6 - [[[5, '+', 3], '*', 6]] - - -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.tryParse(instring, loc) - return loc, [] - - ret = Forward() - lastExpr = baseExpr | ( lpar + ret + rpar ) - for i,operDef in enumerate(opList): - opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] - termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr - if arity == 3: - if opExpr is None or len(opExpr) != 2: - raise ValueError( - "if numterms=3, opExpr must be a tuple or list of two expressions") - opExpr1, opExpr2 = opExpr - thisExpr = Forward().setName(termName) - if rightLeftAssoc == opAssoc.LEFT: - if arity == 1: - matchExpr = _FB(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) - elif arity == 2: - if opExpr is not None: - matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) - else: - matchExpr = _FB(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) - elif arity == 3: - matchExpr = _FB(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ - Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) - else: - raise ValueError("operator must be unary (1), binary (2), or ternary (3)") - elif rightLeftAssoc == opAssoc.RIGHT: - if arity == 1: - # try to avoid LR with this extra test - if not isinstance(opExpr, Optional): - opExpr = Optional(opExpr) - matchExpr = _FB(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) - elif arity == 2: - if opExpr is not None: - matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) - else: - matchExpr = _FB(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) - elif arity == 3: - matchExpr = _FB(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ - Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) - else: - raise ValueError("operator must be unary (1), binary (2), or ternary (3)") - else: - raise ValueError("operator must indicate right or left associativity") - if pa: - if isinstance(pa, (tuple, list)): - matchExpr.setParseAction(*pa) - else: - matchExpr.setParseAction(pa) - thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) - lastExpr = thisExpr - ret <<= lastExpr - return ret - -operatorPrecedence = infixNotation -"""(Deprecated) Former name of :class:`infixNotation`, will be -dropped in a future release.""" - -dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") -sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") -quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| - Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") -unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") - -def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): - """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``) - - ignoreExpr - expression for ignoring opening and closing - delimiters (default= :class:`quotedString`) - - 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 ``ignoreExpr`` 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 quotedString or - a comment expression. Specify multiple expressions using an - :class:`Or` or :class:`MatchFirst`. The default is - :class:`quotedString`, but if no expressions are to be ignored, then - pass ``None`` for this argument. - - Example:: - - data_type = oneOf("void int short long char float double") - decl_data_type = Combine(data_type + Optional(Word('*'))) - ident = Word(alphas+'_', alphanums+'_') - number = pyparsing_common.number - arg = Group(decl_data_type + ident) - LPAR,RPAR = map(Suppress, "()") - - code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) - - c_function = (decl_data_type("type") - + ident("name") - + LPAR + Optional(delimitedList(arg), [])("args") + RPAR - + code_body("body")) - c_function.ignore(cStyleComment) - - 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.searchString(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 opener == closer: - raise ValueError("opening and closing strings cannot be the same") - if content is None: - if isinstance(opener,basestring) and isinstance(closer,basestring): - 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)) - ).setParseAction(lambda t:t[0].strip())) - else: - content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS - ).setParseAction(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)) - ).setParseAction(lambda t:t[0].strip())) - else: - content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + - CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(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.setName('nested %s%s expression' % (opener,closer)) - return ret - -def indentedBlock(blockStatementExpr, indentStack, indent=True): - """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 the current level; set to False for block of left-most - statements (default= ``True``) - - A valid block must contain at least one ``blockStatement``. - - 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( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") - func_body = indentedBlock(stmt, indentStack) - funcDef = Group( funcDecl + func_body ) - - rvalue = Forward() - funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") - rvalue << (funcCall | identifier | Word(nums)) - assignment = Group(identifier + "=" + rvalue) - stmt << ( funcDef | assignment | identifier ) - - module_body = OneOrMore(stmt) - - 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']]]]]]] - """ - def checkPeerIndent(s,l,t): - if l >= len(s): return - curCol = col(l,s) - if curCol != indentStack[-1]: - if curCol > indentStack[-1]: - raise ParseFatalException(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 < indentStack[-1] and curCol <= indentStack[-2]): - raise ParseException(s,l,"not an unindent") - indentStack.pop() - - NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) - INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') - PEER = Empty().setParseAction(checkPeerIndent).setName('') - UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') - if indent: - smExpr = Group( Optional(NL) + - #~ FollowedBy(blockStatementExpr) + - INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) - else: - smExpr = Group( Optional(NL) + - (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) - blockStatementExpr.ignore(_bslash + LineEnd()) - return smExpr.setName('indented block') - -alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") -punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") - -anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) -_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) -commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") -def replaceHTMLEntity(t): - """Helper parser action to replace common HTML entities with their special characters""" - return _htmlEntityMap.get(t.entity) - -# it's easy to get these comment structures wrong - they're very common, so may as well make them available -cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") -"Comment of the form ``/* ... */``" - -htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") -"Comment of the form ``<!-- ... -->``" - -restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") -dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") -"Comment of the form ``// ... (to end of line)``" - -cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") -"Comment of either form :class:`cStyleComment` or :class:`dblSlashComment`" - -javaStyleComment = cppStyleComment -"Same as :class:`cppStyleComment`" - -pythonStyleComment = Regex(r"#.*").setName("Python style comment") -"Comment of the form ``# ... (to end of line)``" - -_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + - Optional( Word(" \t") + - ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") -commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") -"""(Deprecated) Predefined expression of 1 or more printable words or -quoted strings, separated by commas. - -This expression is deprecated in favor of :class:`pyparsing_common.comma_separated_list`. -""" - -# 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>` - - Parse actions: - - - :class:`convertToInteger` - - :class:`convertToFloat` - - :class:`convertToDate` - - :class:`convertToDatetime` - - :class:`stripHTMLTags` - - :class:`upcaseTokens` - - :class:`downcaseTokens` - - Example:: - - pyparsing_common.number.runTests(''' - # any int or real number, returned as the appropriate type - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.fnumber.runTests(''' - # any int or real number, returned as float - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.hex_integer.runTests(''' - # hex numbers - 100 - FF - ''') - - pyparsing_common.fraction.runTests(''' - # fractions - 1/2 - -3/4 - ''') - - pyparsing_common.mixed_integer.runTests(''' - # mixed fractions - 1 - 1/2 - -3/4 - 1-3/4 - ''') - - import uuid - pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) - pyparsing_common.uuid.runTests(''' - # 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')] - """ - - convertToInteger = tokenMap(int) - """ - Parse action for converting parsed integers to Python int - """ - - convertToFloat = tokenMap(float) - """ - Parse action for converting parsed numbers to Python float - """ - - integer = Word(nums).setName("integer").setParseAction(convertToInteger) - """expression that parses an unsigned integer, returns an int""" - - hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) - """expression that parses a hexadecimal integer, returns an int""" - - signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) - """expression that parses an integer with optional leading sign, returns an int""" - - fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") - """fractional expression of an integer divided by an integer, returns a float""" - fraction.addParseAction(lambda t: t[0]/t[-1]) - - mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") - """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" - mixed_integer.addParseAction(sum) - - real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) - """expression that parses a floating point number and returns a float""" - - sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) - """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).streamline() - """any numeric expression, returns the corresponding Python type""" - - fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) - """any int or real number, returned as float""" - - identifier = Word(alphas+'_', alphanums+'_').setName("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}').setName("IPv4 address") - "IPv4 address (``0.0.0.0 - 255.255.255.255``)" - - _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") - _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") - _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") - _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) - _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") - ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("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}').setName("MAC address") - "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" - - @staticmethod - def convertToDate(fmt="%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.setParseAction(pyparsing_common.convertToDate()) - print(date_expr.parseString("1999-12-31")) - - prints:: - - [datetime.date(1999, 12, 31)] - """ - def cvt_fn(s,l,t): - try: - return datetime.strptime(t[0], fmt).date() - except ValueError as ve: - raise ParseException(s, l, str(ve)) - return cvt_fn - - @staticmethod - def convertToDatetime(fmt="%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.setParseAction(pyparsing_common.convertToDatetime()) - print(dt_expr.parseString("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))?)?').setName("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)?').setName("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}').setName("UUID") - "UUID (``xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx``)" - - _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() - @staticmethod - def stripHTMLTags(s, l, tokens): - """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 = makeHTMLTags("TD") - table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end - print(table_text.parseString(text).body) - - Prints:: - - More info at the pyparsing wiki page - """ - return pyparsing_common._html_stripper.transformString(tokens[0]) - - _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') - + Optional( White(" \t") ) ) ).streamline().setName("commaItem") - comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") - """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" - - upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) - """Parse action to convert tokens to upper case.""" - - downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) - """Parse action to convert tokens to lower case.""" - - -class _lazyclassproperty(object): - 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] - - -class unicode_set(object): - """ - 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``, such as:: - - _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] - - A unicode set can also be defined using multiple inheritance of other unicode sets:: - - class CJK(Chinese, Japanese, Korean): - pass - """ - _ranges = [] - - @classmethod - def _get_chars_for_ranges(cls): - ret = [] - for cc in cls.__mro__: - if cc is unicode_set: - break - for rr in cc._ranges: - ret.extend(range(rr[0], rr[-1]+1)) - return [unichr(c) for c in sorted(set(ret))] - - @_lazyclassproperty - def printables(cls): - "all non-whitespace characters in this range" - return u''.join(filterfalse(unicode.isspace, cls._get_chars_for_ranges())) - - @_lazyclassproperty - def alphas(cls): - "all alphabetic characters in this range" - return u''.join(filter(unicode.isalpha, cls._get_chars_for_ranges())) - - @_lazyclassproperty - def nums(cls): - "all numeric digit characters in this range" - return u''.join(filter(unicode.isdigit, cls._get_chars_for_ranges())) - - @_lazyclassproperty - def alphanums(cls): - "all alphanumeric characters in this range" - return cls.alphas + cls.nums - - -class pyparsing_unicode(unicode_set): - """ - A namespace class for defining common language unicode_sets. - """ - _ranges = [(32, sys.maxunicode)] - - class Latin1(unicode_set): - "Unicode set for Latin-1 Unicode Character Range" - _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] - - class LatinA(unicode_set): - "Unicode set for Latin-A Unicode Character Range" - _ranges = [(0x0100, 0x017f),] - - class LatinB(unicode_set): - "Unicode set for Latin-B Unicode Character Range" - _ranges = [(0x0180, 0x024f),] - - class Greek(unicode_set): - "Unicode set for Greek Unicode Character Ranges" - _ranges = [ - (0x0370, 0x03ff), (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), - ] - - class Cyrillic(unicode_set): - "Unicode set for Cyrillic Unicode Character Range" - _ranges = [(0x0400, 0x04ff)] - - class Chinese(unicode_set): - "Unicode set for Chinese Unicode Character Range" - _ranges = [(0x4e00, 0x9fff), (0x3000, 0x303f), ] - - class Japanese(unicode_set): - "Unicode set for Japanese Unicode Character Range, combining Kanji, Hiragana, and Katakana ranges" - _ranges = [ ] - - class Kanji(unicode_set): - "Unicode set for Kanji Unicode Character Range" - _ranges = [(0x4E00, 0x9Fbf), (0x3000, 0x303f), ] - - class Hiragana(unicode_set): - "Unicode set for Hiragana Unicode Character Range" - _ranges = [(0x3040, 0x309f), ] - - class Katakana(unicode_set): - "Unicode set for Katakana Unicode Character Range" - _ranges = [(0x30a0, 0x30ff), ] - - class Korean(unicode_set): - "Unicode set for Korean Unicode Character Range" - _ranges = [(0xac00, 0xd7af), (0x1100, 0x11ff), (0x3130, 0x318f), (0xa960, 0xa97f), (0xd7b0, 0xd7ff), (0x3000, 0x303f), ] - - class CJK(Chinese, Japanese, Korean): - "Unicode set for combined Chinese, Japanese, and Korean (CJK) Unicode Character Range" - pass - - class Thai(unicode_set): - "Unicode set for Thai Unicode Character Range" - _ranges = [(0x0e01, 0x0e3a), (0x0e3f, 0x0e5b), ] - - class Arabic(unicode_set): - "Unicode set for Arabic Unicode Character Range" - _ranges = [(0x0600, 0x061b), (0x061e, 0x06ff), (0x0700, 0x077f), ] - - class Hebrew(unicode_set): - "Unicode set for Hebrew Unicode Character Range" - _ranges = [(0x0590, 0x05ff), ] - - class Devanagari(unicode_set): - "Unicode set for Devanagari Unicode Character Range" - _ranges = [(0x0900, 0x097f), (0xa8e0, 0xa8ff)] - -pyparsing_unicode.Japanese._ranges = (pyparsing_unicode.Japanese.Kanji._ranges - + pyparsing_unicode.Japanese.Hiragana._ranges - + pyparsing_unicode.Japanese.Katakana._ranges) - -# define ranges in language character sets -if PY_3: - setattr(pyparsing_unicode, "العربية", pyparsing_unicode.Arabic) - setattr(pyparsing_unicode, "中文", pyparsing_unicode.Chinese) - setattr(pyparsing_unicode, "кириллица", pyparsing_unicode.Cyrillic) - setattr(pyparsing_unicode, "Ελληνικά", pyparsing_unicode.Greek) - setattr(pyparsing_unicode, "עִברִית", pyparsing_unicode.Hebrew) - setattr(pyparsing_unicode, "日本語", pyparsing_unicode.Japanese) - setattr(pyparsing_unicode.Japanese, "漢字", pyparsing_unicode.Japanese.Kanji) - setattr(pyparsing_unicode.Japanese, "カタカナ", pyparsing_unicode.Japanese.Katakana) - setattr(pyparsing_unicode.Japanese, "ひらがな", pyparsing_unicode.Japanese.Hiragana) - setattr(pyparsing_unicode, "한국어", pyparsing_unicode.Korean) - setattr(pyparsing_unicode, "ไทย", pyparsing_unicode.Thai) - setattr(pyparsing_unicode, "देवनागरी", pyparsing_unicode.Devanagari) - - -if __name__ == "__main__": - - selectToken = CaselessLiteral("select") - fromToken = CaselessLiteral("from") - - ident = Word(alphas, alphanums + "_$") - - columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) - columnNameList = Group(delimitedList(columnName)).setName("columns") - columnSpec = ('*' | columnNameList) - - tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) - tableNameList = Group(delimitedList(tableName)).setName("tables") - - simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") - - # demo runTests method, including embedded comments in test string - simpleSQL.runTests(""" - # '*' as column list and dotted table name - select * from SYS.XYZZY - - # caseless match on "SELECT", and casts back to "select" - SELECT * from XYZZY, ABC - - # list of column names, and mixed case SELECT keyword - Select AA,BB,CC from Sys.dual - - # multiple tables - Select A, B, C from Sys.dual, Table2 - - # invalid SELECT keyword - should fail - Xelect A, B, C from Sys.dual - - # incomplete command - should fail - Select - - # invalid column name - should fail - Select ^^^ frox Sys.dual - - """) - - pyparsing_common.number.runTests(""" - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - """) - - # any int or real number, returned as float - pyparsing_common.fnumber.runTests(""" - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - """) - - pyparsing_common.hex_integer.runTests(""" - 100 - FF - """) - - import uuid - pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) - pyparsing_common.uuid.runTests(""" - 12345678-1234-5678-1234-567812345678 - """) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__init__.py deleted file mode 100644 index 8ed060f..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .core import TomlError -from .parser import load, loads -from .test import translate_to_test -from .writer import dump, dumps \ No newline at end of file diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 5087db7ac1bd8e3b5ee4d1507d9efb0c376b992b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395 zcmYjNJ5Izf5RLQOk9H+EMvBCsZ9rNf8Yn6FG%2vm#$+Sx*czKfTX7z4!WrCBaRnNf z*@}_;X5Ku{)7THo<vhXo{H-3}F@F*HA1RVcJbsPPB^}d=VJ%}+r#dxRo0+`L4?NR_ zDckZ;=XzqM?bOWL8S>&TsmgDL78Q%Ldu#L+fQ2fJxwf*41))dnIDj0zmO+VNMNmG_ zo$l4RSP=S~Y98~A1qHNOES&_e05T+yQzxe(C=TKq3<1TG#0kPj0t>1Mes+9ojpDFX zL5&vpwH}<i<<FF$?j>qFHSV|`p19kGtsPg*8TaT|JGpt0z4F`*u0B0)PMTHi_9!>1 o@2SZJj&^8@gZNl3#4rv)h{o;XbZu<+s?`O3ho{{Z?1(McA5jWwM*si- diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/core.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/core.cpython-38.pyc deleted file mode 100644 index ddb8edf9161864151a657029b2ad4bf5f5db6a23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 972 zcmbVK&2AGh5VrRx*_Nad6$g$~;?R}I8q^CQgeoE6mP3I{4p?FBBpddR@upIe&51rp zd+eL=4147fxFI2!ag-=QoS4<j*dEW!x8L|fw|mG?zWokA{^E>%r_HW-xH(5P_t3m$ ziYb1Ds@Yd}z?Jikg>H<IJ#lb%j%psF(G2ggfur#D6&tw9RUUdz`KpE9S8c2jGzagC zEPV}7K<s1IMrhqeeT8ZwG!?t%HLH2;)NbwF_?*^EI=E-j#WN<o+C%FrhJ|@QY&D&W zSzaZXw&j~Z$|O%JDVuhtjTw%0<E2Ti8#gY}CKx5D&WD)}{l+so9RV=_gacY+2+b{n z19U$@Oo~hknCMF91&B9kQkEBDL=JjmtRgOTeks!AlPKraq{z>rr@|za?v=y%GqyIO zOv>JqXVK&6tXIx49O?0x4u!;2g+(zDsS$AjIx6SjVq+rM*tzjz-m>4~cuQck`N0?m zx)oZ}4_GGe<3jOkR<kLxH%0EI$lTPs@sKm8zc^a1PM51k50<O&IT^ocjS9$ymHqu4 zHi(>C4goq#$=VRKrY)tZKuTiD5Mss`cXvVB=>KCp+15H;o&bUU%Z8y3cd+fhCI}r0 z5VRe{_%cA32$_N#$a}o5!}O-`F1-?bMTb&mg_@<b?nwD%HcZzMJ1Xc>kE3m){gyye kAvH9bfCufswP*d%0piSVc5vEsOK<RE-Ss7<|3GDb06&b<2><{9 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/parser.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/parser.cpython-38.pyc deleted file mode 100644 index 37b3662b2b7804176d5310c07d5fb2af5a92b65a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10169 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/test.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/test.cpython-38.pyc deleted file mode 100644 index 5c668e1ed584e5833631917be4627918b4b2320b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1274 zcmah|zi$&U6t;aol3bGhQdJ35M3G>~(7RR{pjA~NQ5ZUOXhA>(MAx&E9=+Thwo^4} zvNWC85GzB=*8hP&fRWiFO#K&-5IkR6nw9~d{OtEWzvs`Neb35e2SNM#yYl9jfzS`_ zjJ7;D521@qFceW7p&Fuu8WC=h8o{VL%?xHXNX=q4%fXm`j^bGpvBIvy*D%r_Gc;Pu zzeF*4fv8EXBUE!J-a-}o4C<ndGYqzZ)mS6pEnn7oBdAuZOMwnwGy)S7`XlJ#I~a+2 zNa6wEvlLTu1l}<@L2GCLg)__m>?t*<sWBbz;~wJc8l%>YVeWblR#Ur&Y3>s_&okee zkQvjww0e*=g4hs$PYY1xkUBA;#SttA*k@Xj`D-}^h<~AFI(F>z(8*}EA|T)BIItP+ zU7{1iH3NKzDFS&WH?BwkH-s$cTUvsfU_v;`>#0|ykNc#D;b3HdKazLm7CJ?zSWQaq z$0G72tIMP=nUEDj5qCl1U4{3!Rx>j{xwn(Fn8$aRWO2g1CsCNDn_fc?e7@-ew#VW< zFABH4v?F(txavOeL@3#O>Ib`ilL;>k)A_|EcfqaBryYP@)@<saSBF#zMIkY1MV_YN zrXA(1&@hle(n?p$`aCum8$N=%_x|DSu0%=TM`G2z%(^1Y#p}qVnTAqLElsJfMZp97 zArobIVy$3>@Ei;Z?_a9G^{)W5qEHNJje{?=NdG7GH;3ydt1O>$zf&Q~l%13*YtN6` zOyw!ugbZ6uncGPc0mvb0HQ-!K<-%C9Cgb2oi7&hM!Lqw}zprc|c^EglGwqn|r!0_+ z&SmA6=ML`hex<COP=v9NejGqyt*Nr$Vp>9(niZb}LR`NbKBcKSb=at`X$fTj%x84e z9{zZ$Tpw<CzM!<(jy2)OoF^PKE9kY@zor@2S675C?t($s!Bf!3z?#ItC74}A96SMY z2WJ_TV#ZBbZ5c*lNbwfrt6Vz{gM>1ETYCoZg`*^Klh10uumR68Ba~Gc;gY@Q>=N@U Zt%SBCwyJMKOn}Mb5+N8YuraYi{s6tFJZAs^ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/utils.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/utils.cpython-38.pyc deleted file mode 100644 index 69cfc4d9a0cc726ebc2feef89b0f45df10157c93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2184 zcmZ`)UvC>l5Z~GR<FnJGZX42qid2;v<p{R(rvhqKGy)0o(g>0AfC-$8_ncf}-<iEl z)i`$#D22~qKjs_o5%>)I%2U2VUtnghu9K9WwX?f3yE8j8zZw59KVM<^{r#{1%kM5@ z|Ip^*XX9oQN4kYXFadqmE@o&$2xBhz1lpFcg#D7WZQ%$PXGfHThqL=F6J=3($wVb& z2c=W1?Fran{@gigW80(emUqR;!`!daygr+sz23L3%*(rtU9sXnS$@)LXUjjW)PFAS zP0#sVAjPjgj<bd1YaHn^62-=lu?ggmfxMg1>tTYNLrdNhY=<c;gHw7R-<G7vw{=DK zx*HoCj{+HLXV6jIeeLYY<Y=g?!;VbDU?%suhUXdvXH0r{`BmE7PX=LA?uROj6WRQx z9}S1!H+wY6`d$ZR&%^k6vmgE193HFvB;IIz(M%&1)`y+$VP`K)o5N^WUwhP8ZEVzs z$0%-udwaxe26$DVQoNW9`pqL1_0z`iSkGU26=syB^cV&exCu5$%J!uo5n~RA3DRG< zP)uP+#(ZMZ{0D!ZopKBq8(WlWxvK2x`V?{=+rrAZ;n*mBVeTRrCLo+sF5JaJn<YvG z=QhhN<tTSt5>{rBe8N$W9apDZVHKPVcHP{`S?=bg+{?>&$IYCKWo}l=ysV6txbPO) zDP;D<!=#nB&&l8O5)zZXbMpM096Wzaq>Lom{OUUMJ#7s-Lv2N|(ymEoDhcV@>GhM2 z(&gY;Gzi;C9BNN=RH$&L%S1)kR~^41$%qDtn25SE(Xgkv8fiGzAT(@gc&cH?z@Q*x zS~^Is;Yb&eFj&HzRJqM7@Bo&0l~=)>xRf1&FF9qh^CvDa(rm&Az=9o?<vol7!gzvF z5byzuu^f$zA9A@)nTZ>Ck{{Y~Q`oqx2nVwTbErYMV=Kco-6OihCMJ^ywp3^ZOBhRo z-^Q{qJ8!z9Lcv(e>-ZWIW)1CEu<{D(qw2|OezMkDUC&!5>okoPYd_X&gL+Lot8KMv zPg}K}My)rx@fO#2b@@njlU^?kmAr|n^}I?{ryrzYH;F~6-CiQG{`8y)c)`_Ps$`GS z;#-o!)V4{3cGII?FM4q${(7NMF)i5-@j`kB2?G!Aat~ZHY;Z9hE-Y~Q3Cg;3;NnMJ zWfMpGDUy)2F%fO-BZ6bUduJaMWei$HzK2)3q+t5dnuf_QAvMEF3$XHb*coh}fi49_ zOt87wY1r>+_jQa2+cRuwF9@PIQbDkW{M49$(akq7ZcN2*S*Jc{tW*3lc7T@U3h5^I z&bVygq`6R6f+-&${~?a4ty?o&ZxZ=#V^nP9WMRtqLJz-UL|Y<NpI<OCKQn@oOX{h( zXc%9%a6!I|0lOID8!?ZSameI-tO-Ot;-5N~O=}~!u@Y<ni|h_cgfr%ul_76pVcOga zSeGB6W_cgUXyGJ3X*Ce!1w{nbNme8BF%sV~v6Jh>Fzv#UVX9&Os*|o7#rS8?!gFaA z34;X$qzxX&0oPzuoq1gx-S$hAaJm%)x)KC~L>%>LeJu!nJL>cciCiVqlqk7D<TD~O z+?bVVOax0hYyK)c@GSZnu=-`WgaXa+@2}KN2E(WyN<x?UBQgETREb6>q8RIoRQ;a~ Y?L96Y`6U4^r8bC$c!hhecf-5&9}z6sTmS$7 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/writer.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__pycache__/writer.cpython-38.pyc deleted file mode 100644 index 74b7fb15d74332f93b89551e29a53ebe69692e2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3615 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 Hdh`DUnQJMT diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/core.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/core.py deleted file mode 100644 index c182734..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/core.py +++ /dev/null @@ -1,13 +0,0 @@ -class TomlError(RuntimeError): - def __init__(self, message, line, col, filename): - RuntimeError.__init__(self, message, line, col, filename) - self.message = message - self.line = line - self.col = col - self.filename = filename - - def __str__(self): - return '{}({}, {}): {}'.format(self.filename, self.line, self.col, self.message) - - def __repr__(self): - return 'TomlError({!r}, {!r}, {!r}, {!r})'.format(self.message, self.line, self.col, self.filename) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/parser.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/parser.py deleted file mode 100644 index 3493aa6..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/parser.py +++ /dev/null @@ -1,341 +0,0 @@ -import string, re, sys, datetime -from .core import TomlError -from .utils import rfc3339_re, parse_rfc3339_re - -if sys.version_info[0] == 2: - _chr = unichr -else: - _chr = chr - -def load(fin, translate=lambda t, x, v: v, object_pairs_hook=dict): - return loads(fin.read(), translate=translate, object_pairs_hook=object_pairs_hook, filename=getattr(fin, 'name', repr(fin))) - -def loads(s, filename='<string>', translate=lambda t, x, v: v, object_pairs_hook=dict): - if isinstance(s, bytes): - s = s.decode('utf-8') - - s = s.replace('\r\n', '\n') - - root = object_pairs_hook() - tables = object_pairs_hook() - scope = root - - src = _Source(s, filename=filename) - ast = _p_toml(src, object_pairs_hook=object_pairs_hook) - - def error(msg): - raise TomlError(msg, pos[0], pos[1], filename) - - def process_value(v, object_pairs_hook): - kind, text, value, pos = v - if kind == 'str' and value.startswith('\n'): - value = value[1:] - if kind == 'array': - if value and any(k != value[0][0] for k, t, v, p in value[1:]): - error('array-type-mismatch') - value = [process_value(item, object_pairs_hook=object_pairs_hook) for item in value] - elif kind == 'table': - value = object_pairs_hook([(k, process_value(value[k], object_pairs_hook=object_pairs_hook)) for k in value]) - return translate(kind, text, value) - - for kind, value, pos in ast: - if kind == 'kv': - k, v = value - if k in scope: - error('duplicate_keys. Key "{0}" was used more than once.'.format(k)) - scope[k] = process_value(v, object_pairs_hook=object_pairs_hook) - else: - is_table_array = (kind == 'table_array') - cur = tables - for name in value[:-1]: - if isinstance(cur.get(name), list): - d, cur = cur[name][-1] - else: - d, cur = cur.setdefault(name, (None, object_pairs_hook())) - - scope = object_pairs_hook() - name = value[-1] - if name not in cur: - if is_table_array: - cur[name] = [(scope, object_pairs_hook())] - else: - cur[name] = (scope, object_pairs_hook()) - elif isinstance(cur[name], list): - if not is_table_array: - error('table_type_mismatch') - cur[name].append((scope, object_pairs_hook())) - else: - if is_table_array: - error('table_type_mismatch') - old_scope, next_table = cur[name] - if old_scope is not None: - error('duplicate_tables') - cur[name] = (scope, next_table) - - def merge_tables(scope, tables): - if scope is None: - scope = object_pairs_hook() - for k in tables: - if k in scope: - error('key_table_conflict') - v = tables[k] - if isinstance(v, list): - scope[k] = [merge_tables(sc, tbl) for sc, tbl in v] - else: - scope[k] = merge_tables(v[0], v[1]) - return scope - - return merge_tables(root, tables) - -class _Source: - def __init__(self, s, filename=None): - self.s = s - self._pos = (1, 1) - self._last = None - self._filename = filename - self.backtrack_stack = [] - - def last(self): - return self._last - - def pos(self): - return self._pos - - def fail(self): - return self._expect(None) - - def consume_dot(self): - if self.s: - self._last = self.s[0] - self.s = self[1:] - self._advance(self._last) - return self._last - return None - - def expect_dot(self): - return self._expect(self.consume_dot()) - - def consume_eof(self): - if not self.s: - self._last = '' - return True - return False - - def expect_eof(self): - return self._expect(self.consume_eof()) - - def consume(self, s): - if self.s.startswith(s): - self.s = self.s[len(s):] - self._last = s - self._advance(s) - return True - return False - - def expect(self, s): - return self._expect(self.consume(s)) - - def consume_re(self, re): - m = re.match(self.s) - if m: - self.s = self.s[len(m.group(0)):] - self._last = m - self._advance(m.group(0)) - return m - return None - - def expect_re(self, re): - return self._expect(self.consume_re(re)) - - def __enter__(self): - self.backtrack_stack.append((self.s, self._pos)) - - def __exit__(self, type, value, traceback): - if type is None: - self.backtrack_stack.pop() - else: - self.s, self._pos = self.backtrack_stack.pop() - return type == TomlError - - def commit(self): - self.backtrack_stack[-1] = (self.s, self._pos) - - def _expect(self, r): - if not r: - raise TomlError('msg', self._pos[0], self._pos[1], self._filename) - return r - - def _advance(self, s): - suffix_pos = s.rfind('\n') - if suffix_pos == -1: - self._pos = (self._pos[0], self._pos[1] + len(s)) - else: - self._pos = (self._pos[0] + s.count('\n'), len(s) - suffix_pos) - -_ews_re = re.compile(r'(?:[ \t]|#[^\n]*\n|#[^\n]*\Z|\n)*') -def _p_ews(s): - s.expect_re(_ews_re) - -_ws_re = re.compile(r'[ \t]*') -def _p_ws(s): - s.expect_re(_ws_re) - -_escapes = { 'b': '\b', 'n': '\n', 'r': '\r', 't': '\t', '"': '"', - '\\': '\\', 'f': '\f' } - -_basicstr_re = re.compile(r'[^"\\\000-\037]*') -_short_uni_re = re.compile(r'u([0-9a-fA-F]{4})') -_long_uni_re = re.compile(r'U([0-9a-fA-F]{8})') -_escapes_re = re.compile(r'[btnfr\"\\]') -_newline_esc_re = re.compile('\n[ \t\n]*') -def _p_basicstr_content(s, content=_basicstr_re): - res = [] - while True: - res.append(s.expect_re(content).group(0)) - if not s.consume('\\'): - break - if s.consume_re(_newline_esc_re): - pass - elif s.consume_re(_short_uni_re) or s.consume_re(_long_uni_re): - v = int(s.last().group(1), 16) - if 0xd800 <= v < 0xe000: - s.fail() - res.append(_chr(v)) - else: - s.expect_re(_escapes_re) - res.append(_escapes[s.last().group(0)]) - return ''.join(res) - -_key_re = re.compile(r'[0-9a-zA-Z-_]+') -def _p_key(s): - with s: - s.expect('"') - r = _p_basicstr_content(s, _basicstr_re) - s.expect('"') - return r - if s.consume('\''): - if s.consume('\'\''): - r = s.expect_re(_litstr_ml_re).group(0) - s.expect('\'\'\'') - else: - r = s.expect_re(_litstr_re).group(0) - s.expect('\'') - return r - return s.expect_re(_key_re).group(0) - -_float_re = re.compile(r'[+-]?(?:0|[1-9](?:_?\d)*)(?:\.\d(?:_?\d)*)?(?:[eE][+-]?(?:\d(?:_?\d)*))?') - -_basicstr_ml_re = re.compile(r'(?:""?(?!")|[^"\\\000-\011\013-\037])*') -_litstr_re = re.compile(r"[^'\000\010\012-\037]*") -_litstr_ml_re = re.compile(r"(?:(?:|'|'')(?:[^'\000-\010\013-\037]))*") -def _p_value(s, object_pairs_hook): - pos = s.pos() - - if s.consume('true'): - return 'bool', s.last(), True, pos - if s.consume('false'): - return 'bool', s.last(), False, pos - - if s.consume('"'): - if s.consume('""'): - r = _p_basicstr_content(s, _basicstr_ml_re) - s.expect('"""') - else: - r = _p_basicstr_content(s, _basicstr_re) - s.expect('"') - return 'str', r, r, pos - - if s.consume('\''): - if s.consume('\'\''): - r = s.expect_re(_litstr_ml_re).group(0) - s.expect('\'\'\'') - else: - r = s.expect_re(_litstr_re).group(0) - s.expect('\'') - return 'str', r, r, pos - - if s.consume_re(rfc3339_re): - m = s.last() - return 'datetime', m.group(0), parse_rfc3339_re(m), pos - - if s.consume_re(_float_re): - m = s.last().group(0) - r = m.replace('_','') - if '.' in m or 'e' in m or 'E' in m: - return 'float', m, float(r), pos - else: - return 'int', m, int(r, 10), pos - - if s.consume('['): - items = [] - with s: - while True: - _p_ews(s) - items.append(_p_value(s, object_pairs_hook=object_pairs_hook)) - s.commit() - _p_ews(s) - s.expect(',') - s.commit() - _p_ews(s) - s.expect(']') - return 'array', None, items, pos - - if s.consume('{'): - _p_ws(s) - items = object_pairs_hook() - if not s.consume('}'): - k = _p_key(s) - _p_ws(s) - s.expect('=') - _p_ws(s) - items[k] = _p_value(s, object_pairs_hook=object_pairs_hook) - _p_ws(s) - while s.consume(','): - _p_ws(s) - k = _p_key(s) - _p_ws(s) - s.expect('=') - _p_ws(s) - items[k] = _p_value(s, object_pairs_hook=object_pairs_hook) - _p_ws(s) - s.expect('}') - return 'table', None, items, pos - - s.fail() - -def _p_stmt(s, object_pairs_hook): - pos = s.pos() - if s.consume( '['): - is_array = s.consume('[') - _p_ws(s) - keys = [_p_key(s)] - _p_ws(s) - while s.consume('.'): - _p_ws(s) - keys.append(_p_key(s)) - _p_ws(s) - s.expect(']') - if is_array: - s.expect(']') - return 'table_array' if is_array else 'table', keys, pos - - key = _p_key(s) - _p_ws(s) - s.expect('=') - _p_ws(s) - value = _p_value(s, object_pairs_hook=object_pairs_hook) - return 'kv', (key, value), pos - -_stmtsep_re = re.compile(r'(?:[ \t]*(?:#[^\n]*)?\n)+[ \t]*') -def _p_toml(s, object_pairs_hook): - stmts = [] - _p_ews(s) - with s: - stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook)) - while True: - s.commit() - s.expect_re(_stmtsep_re) - stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook)) - _p_ews(s) - s.expect_eof() - return stmts diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/test.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/test.py deleted file mode 100644 index ec8abfc..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/test.py +++ /dev/null @@ -1,30 +0,0 @@ -import datetime -from .utils import format_rfc3339 - -try: - _string_types = (str, unicode) - _int_types = (int, long) -except NameError: - _string_types = str - _int_types = int - -def translate_to_test(v): - if isinstance(v, dict): - return { k: translate_to_test(v) for k, v in v.items() } - if isinstance(v, list): - a = [translate_to_test(x) for x in v] - if v and isinstance(v[0], dict): - return a - else: - return {'type': 'array', 'value': a} - if isinstance(v, datetime.datetime): - return {'type': 'datetime', 'value': format_rfc3339(v)} - if isinstance(v, bool): - return {'type': 'bool', 'value': 'true' if v else 'false'} - if isinstance(v, _int_types): - return {'type': 'integer', 'value': str(v)} - if isinstance(v, float): - return {'type': 'float', 'value': '{:.17}'.format(v)} - if isinstance(v, _string_types): - return {'type': 'string', 'value': v} - raise RuntimeError('unexpected value: {!r}'.format(v)) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/utils.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/utils.py deleted file mode 100644 index 636a680..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/utils.py +++ /dev/null @@ -1,67 +0,0 @@ -import datetime -import re - -rfc3339_re = re.compile(r'(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(\.\d+)?(?:Z|([+-]\d{2}):(\d{2}))') - -def parse_rfc3339(v): - m = rfc3339_re.match(v) - if not m or m.group(0) != v: - return None - return parse_rfc3339_re(m) - -def parse_rfc3339_re(m): - r = map(int, m.groups()[:6]) - if m.group(7): - micro = float(m.group(7)) - else: - micro = 0 - - if m.group(8): - g = int(m.group(8), 10) * 60 + int(m.group(9), 10) - tz = _TimeZone(datetime.timedelta(0, g * 60)) - else: - tz = _TimeZone(datetime.timedelta(0, 0)) - - y, m, d, H, M, S = r - return datetime.datetime(y, m, d, H, M, S, int(micro * 1000000), tz) - - -def format_rfc3339(v): - offs = v.utcoffset() - offs = int(offs.total_seconds()) // 60 if offs is not None else 0 - - if offs == 0: - suffix = 'Z' - else: - if offs > 0: - suffix = '+' - else: - suffix = '-' - offs = -offs - suffix = '{0}{1:02}:{2:02}'.format(suffix, offs // 60, offs % 60) - - if v.microsecond: - return v.strftime('%Y-%m-%dT%H:%M:%S.%f') + suffix - else: - return v.strftime('%Y-%m-%dT%H:%M:%S') + suffix - -class _TimeZone(datetime.tzinfo): - def __init__(self, offset): - self._offset = offset - - def utcoffset(self, dt): - return self._offset - - def dst(self, dt): - return None - - def tzname(self, dt): - m = self._offset.total_seconds() // 60 - if m < 0: - res = '-' - m = -m - else: - res = '+' - h = m // 60 - m = m - h * 60 - return '{}{:.02}{:.02}'.format(res, h, m) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/writer.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/writer.py deleted file mode 100644 index 73b5089..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/writer.py +++ /dev/null @@ -1,106 +0,0 @@ -from __future__ import unicode_literals -import io, datetime, math, string, sys - -from .utils import format_rfc3339 - -if sys.version_info[0] == 3: - long = int - unicode = str - - -def dumps(obj, sort_keys=False): - fout = io.StringIO() - dump(obj, fout, sort_keys=sort_keys) - return fout.getvalue() - - -_escapes = {'\n': 'n', '\r': 'r', '\\': '\\', '\t': 't', '\b': 'b', '\f': 'f', '"': '"'} - - -def _escape_string(s): - res = [] - start = 0 - - def flush(): - if start != i: - res.append(s[start:i]) - return i + 1 - - i = 0 - while i < len(s): - c = s[i] - if c in '"\\\n\r\t\b\f': - start = flush() - res.append('\\' + _escapes[c]) - elif ord(c) < 0x20: - start = flush() - res.append('\\u%04x' % ord(c)) - i += 1 - - flush() - return '"' + ''.join(res) + '"' - - -_key_chars = string.digits + string.ascii_letters + '-_' -def _escape_id(s): - if any(c not in _key_chars for c in s): - return _escape_string(s) - return s - - -def _format_value(v): - if isinstance(v, bool): - return 'true' if v else 'false' - if isinstance(v, int) or isinstance(v, long): - return unicode(v) - if isinstance(v, float): - if math.isnan(v) or math.isinf(v): - raise ValueError("{0} is not a valid TOML value".format(v)) - else: - return repr(v) - elif isinstance(v, unicode) or isinstance(v, bytes): - return _escape_string(v) - elif isinstance(v, datetime.datetime): - return format_rfc3339(v) - elif isinstance(v, list): - return '[{0}]'.format(', '.join(_format_value(obj) for obj in v)) - elif isinstance(v, dict): - return '{{{0}}}'.format(', '.join('{} = {}'.format(_escape_id(k), _format_value(obj)) for k, obj in v.items())) - else: - raise RuntimeError(v) - - -def dump(obj, fout, sort_keys=False): - tables = [((), obj, False)] - - while tables: - name, table, is_array = tables.pop() - if name: - section_name = '.'.join(_escape_id(c) for c in name) - if is_array: - fout.write('[[{0}]]\n'.format(section_name)) - else: - fout.write('[{0}]\n'.format(section_name)) - - table_keys = sorted(table.keys()) if sort_keys else table.keys() - new_tables = [] - has_kv = False - for k in table_keys: - v = table[k] - if isinstance(v, dict): - new_tables.append((name + (k,), v, False)) - elif isinstance(v, list) and v and all(isinstance(o, dict) for o in v): - new_tables.extend((name + (k,), d, True) for d in v) - elif v is None: - # based on mojombo's comment: https://github.com/toml-lang/toml/issues/146#issuecomment-25019344 - fout.write( - '#{} = null # To use: uncomment and replace null with value\n'.format(_escape_id(k))) - has_kv = True - else: - fout.write('{0} = {1}\n'.format(_escape_id(k), _format_value(v))) - has_kv = True - - tables.extend(reversed(new_tables)) - - if (name or has_kv) and tables: - fout.write('\n') diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__init__.py deleted file mode 100644 index 80c4ce1..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__init__.py +++ /dev/null @@ -1,133 +0,0 @@ -# -*- coding: utf-8 -*- - -# __ -# /__) _ _ _ _ _/ _ -# / ( (- (/ (/ (- _) / _) -# / - -""" -Requests HTTP Library -~~~~~~~~~~~~~~~~~~~~~ - -Requests is an HTTP library, written in Python, for human beings. Basic GET -usage: - - >>> import requests - >>> r = requests.get('https://www.python.org') - >>> r.status_code - 200 - >>> 'Python is a programming language' in r.content - True - -... or POST: - - >>> payload = dict(key1='value1', key2='value2') - >>> r = requests.post('https://httpbin.org/post', data=payload) - >>> print(r.text) - { - ... - "form": { - "key2": "value2", - "key1": "value1" - }, - ... - } - -The other HTTP methods are supported - see `requests.api`. Full documentation -is at <http://python-requests.org>. - -:copyright: (c) 2017 by Kenneth Reitz. -:license: Apache 2.0, see LICENSE for more details. -""" - -from pip._vendor import urllib3 -from pip._vendor import chardet -import warnings -from .exceptions import RequestsDependencyWarning - - -def check_compatibility(urllib3_version, chardet_version): - urllib3_version = urllib3_version.split('.') - assert urllib3_version != ['dev'] # Verify urllib3 isn't installed from git. - - # Sometimes, urllib3 only reports its version as 16.1. - if len(urllib3_version) == 2: - urllib3_version.append('0') - - # Check urllib3 for compatibility. - major, minor, patch = urllib3_version # noqa: F811 - major, minor, patch = int(major), int(minor), int(patch) - # urllib3 >= 1.21.1, <= 1.24 - assert major == 1 - assert minor >= 21 - assert minor <= 24 - - # Check chardet for compatibility. - major, minor, patch = chardet_version.split('.')[:3] - major, minor, patch = int(major), int(minor), int(patch) - # chardet >= 3.0.2, < 3.1.0 - assert major == 3 - assert minor < 1 - assert patch >= 2 - - -def _check_cryptography(cryptography_version): - # cryptography < 1.3.4 - try: - cryptography_version = list(map(int, cryptography_version.split('.'))) - except ValueError: - return - - if cryptography_version < [1, 3, 4]: - warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version) - warnings.warn(warning, RequestsDependencyWarning) - -# Check imported dependencies for compatibility. -try: - check_compatibility(urllib3.__version__, chardet.__version__) -except (AssertionError, ValueError): - warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported " - "version!".format(urllib3.__version__, chardet.__version__), - RequestsDependencyWarning) - -# Attempt to enable urllib3's SNI support, if possible -from pip._internal.utils.compat import WINDOWS -if not WINDOWS: - try: - from pip._vendor.urllib3.contrib import pyopenssl - pyopenssl.inject_into_urllib3() - - # Check cryptography version - from cryptography import __version__ as cryptography_version - _check_cryptography(cryptography_version) - except ImportError: - pass - -# urllib3's DependencyWarnings should be silenced. -from pip._vendor.urllib3.exceptions import DependencyWarning -warnings.simplefilter('ignore', DependencyWarning) - -from .__version__ import __title__, __description__, __url__, __version__ -from .__version__ import __build__, __author__, __author_email__, __license__ -from .__version__ import __copyright__, __cake__ - -from . import utils -from . import packages -from .models import Request, Response, PreparedRequest -from .api import request, get, head, post, patch, put, delete, options -from .sessions import session, Session -from .status_codes import codes -from .exceptions import ( - RequestException, Timeout, URLRequired, - TooManyRedirects, HTTPError, ConnectionError, - FileModeWarning, ConnectTimeout, ReadTimeout -) - -# Set default logging handler to avoid "No handler found" warnings. -import logging -from logging import NullHandler - -logging.getLogger(__name__).addHandler(NullHandler()) - -# FileModeWarnings go off per the default. -warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index da21a9cc1e538eb2409e3f507be044ed26703e55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3522 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/__version__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/__version__.cpython-38.pyc deleted file mode 100644 index be6989116a77f23f69020fcb16367656a3906e36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 569 zcmZ8e&2AGh5O&i1Y_>#H<$#1Zm}4Z?PSQ)M5Nd^lDj}h&l#35o+jzQbW!G!G-bh)V zp>I&BSGaNDA$W!y;RQHzf!VY{g|R%I`96K4nen^fFeGT-evjUNZ4vULN$whA<PdN9 z6rCc1sFrA{wrHy@v86hqqq?H2dZMTLqOSrGsDT)$@GTi_uL1`jDkyzfKRj9bv@rDe z?CgYI6pkKOd2C8nKT5r~2b|kAA8iDza7o>pvgw44HF?q|_3$+q13smvpnY9G$l-8) zgSZA*3&JBC&r+aMHm)DPEbP+hB=vMUp6t_q<kdYK=KIwr`t$no3&r5gC|nJs^x9`2 z<?6na3d)(&*6YF`(3i4u83x-@F2I#HC@Rh?ohigaDdP%9bQtgajUkWqtt!(qFlAGG zDCKO^8>RuK@f?ZI#5HZL-LH>4Epp&41rMfh{8gr{J>?h8<Dw)+ZUJV&Gkt!$yFIqg zOYI@T9n9kdN^Z4{CePTI?L~HpG=n5*K#n6Ag+({p=68l-cDV|k=Y^^=c+qV>eivP* H_5b+;b~&_$ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/_internal_utils.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/_internal_utils.cpython-38.pyc deleted file mode 100644 index ca826cf7d06e07cc1669a0def6460be9d417495f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1339 zcmZ8hPp{lG5Vw=;AJV?nE9$8S<RdHfCD3w!RfVWZ3q4R(eXW2!kb2|Ujd_V3Z09}p zX#olPLCTQ}Cq4uc-yl~`d<8Brc6L$etnBrS$1~&K{G4Y;M=3%1{h#?)pC*L->6KR{ zM&%<MHp5AfB@t9aHEp70)WplUNtOvE;ti3A(F?j9iLscxAj`3so|1Wb`D<$6n+~kA zSs|4Jqj+6(PS!U4{(q9DkBvT;0xa{}(rwwgQ>BwyS>`J47&pL5)Vc-)JH)EDY_(-i z_BqmvN|qH9(1H?7D+b>>0}Y_p8ZNvR3Sbq~Ef~w*wjH{2i*cKlyLtK-#Y@iPek^U# zZg2HhR-LS!RE2e>kNq^_wv@7r(C;7~AwTZn2q-zSBaZ$Qnd2S#E>bsKWY~_pjCb^B zih7FcWLWPaM2TMh@rgVK#W=$ZQf-)CeGR3%$qa0`5j9xL^qRSC3*P2BgP3q!wFWFG z$305ukusEk)jp0?r~*^ya1MvyLl{t{7Csk8qy+4hiwX>cFbYac%gr`pPb-P(tOwq* zyQlXaK4hH=MLAs~%$UMlNDEmwI3M+?v{G5eRSCueV?0{@IHZJr9I}B&c__1=9*XH> z-ML?gxr+XO|BzR@f!tK!KxvadsAbze$=CkRoNPGmA!z4$EmwKFb(L1Pv-fi=9h|hh zJmVX%c`MtKcR$G9$!?#tTiniIv+>5fz@q|#9@v?`#?GwW_Qy^a19ZOqh}FzD*w;oz zDIG@%y&9#F@z&Dw<{*AO#S!?hz{P<NcIKiV=_Rt_Wh{^jlzdJEG9V!?IZMrZl=$D5 zM8v1$3nCKa#_005kMaJdkqVexBk&Si^<OWwLTclqa2x^O_ol44;U%82SsFUBXwlI4 z_Oot(lf~<SoMvSO<ypo)>#SodI5>m|o>!hHN;~#AK+SHk=NRz$(DQ}yq*}0*)^#{w zMtJR~4<5}&W{fL?9~RQj?ph1RbM?M4+L(zqzWHpp(S6TH2pe;{oE{1dR2Zfs?|!@o zpuh(jUgBG59eOgE(THMS=!}|cXni!Np^W*YpA?1AWl{9w;h_gY4%GCOg%*Z0ucY&R ZHX-NqPNPLv!-t;B*54<YUXRn`e*y0xfM5Us diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/adapters.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/adapters.cpython-38.pyc deleted file mode 100644 index 4e1b1554acf016168ad6935d6a20d6cb2fb68946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17002 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/api.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/api.cpython-38.pyc deleted file mode 100644 index b2eb08c9c2eefc524952c8a4c01b92e1aee54a61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6508 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/auth.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/auth.cpython-38.pyc deleted file mode 100644 index 98e7cd2c2c45d42b8ef0b5892d1ffb3461f1ffc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8348 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/certs.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/certs.cpython-38.pyc deleted file mode 100644 index af9bd47656026ea408c33217d0f4ad678c1f4c19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 652 zcmY*Xv5wR*5Os39+{$njKQN*|th8%`t^o-l5YkCVh~hY!EwH@tB(W~BjqNO?K}h!t z`~-hOOS|P=#V^o+lMND#lyPS4dGp@b?@mrAN%sBs^8JsDkeea+*YXrRPhYs7oFW^d zGL<)3n{V=r;E_7I%>6x_VSYufvW%$NTe6&YX9<dW{Lo>DffeXupr8LUN-t_1ptY)N z5In}tn*gy!a2`wa9u+7oW!FS_`2q$AUFt$cgl%V3gA6We^awgoYnmRcLAd_%b%YrH zOK;mTm`cIP;!;+~D1B8zZ#$5w`jFJ7g7b;(3XoN71*P>M;k7p1Cr~;>ueV*)*1(u= zrAb(dqS<M0O^YV3M$keUC~9dc9GfQz+UP@F2_FZ>50((^q&Rg5=%i1wnx0M!)gX8h zNq?rXlV!G_kG1=S5Utckh&Rjm{#XcQ3n4alopwy@&?xK2X{S;7;pT?(Mz$!#e(t<B z@f-2SDL=Yj9j|SR+}9Y<SkKQI?c6yphsCd}RL2wMjyHPCT_0;}PT6A~bj0;UHSpAV v{pbmM$WGU;PumQuYDn^l4*&ZK`1lH#>-USNhg*L(OH9J8<Yu?;<csVN#{tlN diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/compat.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/compat.cpython-38.pyc deleted file mode 100644 index 8538a8c8b19974abada5db28591b3432d7ee9cca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1631 zcmZuxPjllm6u0BVaU3V<|9`ZscgwP5Y3**i2bf_PW_E`e4rLjZz38wW$5s-xlI2QD zAsqM&T=)=h;LJzhGw8~xSB_lZ$xfHB)EPhh-jnq5`$_NlRj=n;@cjPw@byn^%lgAO z%Z~%jXYk5jZOh6nWaW0=pf+ouhHbDz9pqr=qKR6#mD{^k-n?uecY#}g+tn%$dDs<y z0(NPK`N(Ho)MWt*SP%7BANAP)4cH1=VXJ7Bt)aCldz-Gab+pbl&<5K?n`{ehv2C<n z&3SZ(?V{ZUi#@alxjXb7wvYC!m`@Mb0XnE~m%hvHp?fSuA-j+6vj^ybZQ(=o9=s3n z`{)oqLXYqVc!(d59rU3=;|4k^e#7k_ZSf0a4(Rd!m>AY?E4gLYqmf~Er>Z`U*$LXK zn04rrCB~<37!QDP#S;E|g`O?5f5ZF`KLqw*fvaKv7)Ibew$V}UytIa^-(UFxU(K*o zGRinBQ|15g-^cgAnGzW?p3f)_r)iN>EJMOdE>u`=AtOSGnukP6$P|vS`WE9N{A#YI zya-Q2*yAspv&g?O#WS>ZJDa8=$Lh<Q1_W+Q84WwSbv5G(>-MaufnN<tNoP_Ai(u__ zW`g1(<2ly;1glc;?+AuP2F#PuyiBFkJIh{zi)$iy!EmAU*1vm}<HMHrAaR)r33&m{ ziW;{8UvN@X)3OA?+AzrRSfmq>GpLp&Q>Ds;5~(2Mo^!}T0eLT#AjRa17sICZo~4wg zBMKtV)3SuH?w`+;iQM|#7jQ5F=g&!|hQ8>-(TIUDE5@uE(=n!HjB5-urX@UM*1!x~ zV%=cVxT0%JU`!7Tkm+QcUlM$gilHrbP0SHnW`5h49TRw}+ewo1EJ<{?BxRIb<09um zn48j$oWn6+V<8DI5>kvgYQh4cT_Tfme!3XXbn`;;Lc4HEl#K2qTdBB%<(-m^GAN8H z+i4~6Rtluo?z2jj*f1hC&C+hhDaDxrmhvrum242Agzk=Jgep=b#%Yb_3Tg<dkJN=V zN+tA$xjXF;sG26_09#|qQ-ylPjA22tM9oXs)q@3ig2loOYNk<D7pTAR7Tu<srclHl z@I--u(0%4oq;3$d2TRPObd>#UiKj-EF@IghQ_gTKrdZ*Ei}-U&%JS=YYzA>WNns9d z>pF%*iOZ@5&!UfFNfbUV)9f;xU>U=m9zXdwI*HDX%Q;L(crr1;cyZD3?MET5J3K1q z+WVyb27GEdRXzvP^n!-hcAdZpI-c9KkDPrwuswJKd&g<o_0PBchHIbLX0HBiH0l`- G*8T&EQ_KPY diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/cookies.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/cookies.cpython-38.pyc deleted file mode 100644 index 2ea5ecb03f9e0e4814eb2d50063986144dab9c0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18853 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/exceptions.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/exceptions.cpython-38.pyc deleted file mode 100644 index b871a17cf2a38a051c866f4bd4beda64f439f44c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5263 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/hooks.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/hooks.cpython-38.pyc deleted file mode 100644 index 71cbfe1fadc568ac608cf8434a5a3385980884fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1011 zcmY*Y&2G~`5Z?7)QbQ3SBrXUo7o=2*4XT8oswxl_s#MfUO}RuW?$*1pS8=lL?j|Ue z!=*iQ;RWExk+<L(eB~LqaDiDjRnxI%cKyxlXU{kGht<^(f&Kc|`S`~{=(oLDHo(wp zaQzqpLw&?>hWnT~%)LN;hk4A0)n!2sby{aXL&Z-gTpJzbQVw<a`G$qzVJ<WoNj51s zDV3ZG#x*fHCn+uIi712-01TvRz=H)DX~>A4X~RcR7`~ZOQP30MXc8M?czmq5F6CJB z<KvBxfE@zq6-F{X=8785$Uw;vp=7}vg?0O?D1`=Zm~H(nxV{5{LCY7&plx)Hp;dP; z#Y@Gu)C2E<>-!J{s?bq5#}&@dSLf90p&v-us*Y1T(X-m;Q$98g(uBX0IF}<HtDGA? zmMVT%h_XD02X;~2j6x1hOyfeF#O2K7a=aeBjI}VlTheq$Gp^%Ol-=jAqG!>1x12#b z;#p?FIDw-KNUw$i&w}AZ<*W`jnMh44N9C4%Z5==ekOSA*6UGO0Qkdkjc(afxE%a7& zeWHVFe`kMxw|Cvg<<19|diBQndzRe_fUs&qOkKNQn0>01Zx>v@hfv`%5Xj2+4TSuT z?N03&hzy@Q>M6+DVB6^E(cG)N${FCw{etIy<uhlvqSh*Z?wqbwj-A!ni*2DxYSJ9O zE!uoD#I`Nun5r3(V*oP&8j(`)loL51j2ar%?IeMoizL~DvAG#Hbt|Wu8lyTv?GE{@ z_8W2fD|Sijp*k3TqAJt1XQ6)BsMlncL|W*xc&Vo3p>6#E1mv`Fh&}KCxAAT80IR!z p?{&Pol_X52NupW+G&(k^C2A|NYWUlmm;c$8Rk|6hcPnt)!GG0C2Mz!L diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/models.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/models.cpython-38.pyc deleted file mode 100644 index 3a8a81a058b9608102169e3ae668549dd85a7fbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23947 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 I$vFAH0Ske1MgRZ+ diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/packages.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/packages.cpython-38.pyc deleted file mode 100644 index 9afebd0025ec0e1d1f5af21a04d310e5591ddbbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 521 zcmYjMv2NQi5Ist^rK*XWsYaIW9!xs$k^n}~A;^%SLyIl~T0u20786>cN!p3C8vT!E z>=*PG`VCw=^%uIdr^W_y0PlG3?vd|(JUq;R;^*Jt=N}QkueNy}J!;<4acfEvB-4<C zj4t4l%$bal4Iqy&#%Rm1vjt>Rz%If~Z_8-sJWnve=r(d!n0!kylAQrOGCL;pg^agM zvaiuG<XOwW<QUp2yO<4N3d`~GK(Y@o?ER*{;oUF}$;xW2zDz<#$+`^5tSYTU|8QWG z;l&zj*;pPJe|Ym8u(({I^NyQxc3aNT@!`u5yNwIU4#|(6xG0Mq60)LD3)5I%6rrb^ zS*cy<XytrJ7L8nKbRnio$eb^&cX!HHA=X&u{Z(x&UaNb0j26CweMRd3r$6_iY8EJL zg&yn1ic77Gc`vTpVn_3mW+Y@S$fGbDUp4iFp9-fuj`rFGIUAjv@iCu_%!bAs=kpd6 jJO5&DSL`X=Y(hGHQhm-yjO$ZMyD3XqKkl>F?1=pXai*FB diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/sessions.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/sessions.cpython-38.pyc deleted file mode 100644 index 1afe9be25b143b335376803f49df011bf765ba67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19561 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/status_codes.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/status_codes.cpython-38.pyc deleted file mode 100644 index 21feb442d599d6571f3081508319a054a6dde1d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4207 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/structures.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/structures.cpython-38.pyc deleted file mode 100644 index c041dfc00e0c5cc083f9b802d360028c71a44031..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4449 zcma)9TXWmS6~=`(QI|NeqF7GbVA`e>TZwe)nNH(T+-U41O`9m0*llN+Iv|8yQLsP& z-UX$KL-$3V$y<Me{Llyelm3D};I&Wv3!Ukt-#H+7v8c9?u)uQ9p6hqc9{g@~wQk`0 z+jq@x{<>@!|Deh2Rl?*$+<F&-Fgk`Xg%z58t7G-;j@>VHN~ZCNA#724VTh6}o!gx< z=4DaAydo=@S4H)a(X0)>s4MwwAa$x+I#mNd9Vn^mf4+Lv>kqxubEZU2dgP@}5}!)t zd{ywM|I>s{O*>ouLJ6s)co_I;R{h*dk|643Yo8BN?;w=pxewa8%f{?O-1-26G&&}% zvxM2P#anER*(v2#bjqSCYA=jVMJ$Oro>j3dR`9HeRk4QWl6Xzrz_Tu17jNLXEN+T* zJXge<Vgt`rVZr`e+06%@mY+siMmk7?6G{4de}^7>j*pd{V7laVy8^4-?oJpSOD8^f zD*d!ouRFLt?I)q^%P7^37luw>rbn^BdnBAVk;+ShIMPmh$i&_5yc@b*$J5TK#6~<x zMnglGA17zsZp+yVb<Fz`6`uq`(ppGvcY{>+HAr$D_OSn0o<XXTj{H*s?WAzh*g23C zHuzt+oX1Bz$ph^u=-fY$N+Xz(WsuR(ljct7>6ADYJY>4f7InK2thV5q)Qf!C>~^=u zc9HlknnOiaZf2sUi{zG^$%Kd*oCYw#kE7HJqTKzHxUgj{=hv|NM5=8Em{n&mi4_`e z(aa<Tm}w!<%)*(8;Jtgfrzm26Ae;}J1<~JXGMh2Y*Nr{jmr2@q0_p}}90oo|v;9=Z zQDdIed+^|+FCP=>B3j4!k@Hv$az7LMFwp51^k@?OjG%&!nSUHB1k)pYkynqThrH5X zH^^q-ZAV6aEMRZr31GwyR1!%XO(J^Yg#!+$hwY6A<82=m+pr56p8%fH$(e8Chn}ZI zD0S{pz~Lx9Wk}={PUQ8aa|*D=D(D3fAb$pk#mM&}A94gi$-H312pNDnNQ9S4!UtLP zY~Y1KdWMMi6Hf*3CtEy|FofhDvNFnn%@ya!I|00DFLC5VAe8CtiNyyJGyx<40)t4% z!yqEX$mRRKh00P~RBq`0EpGi245@K$j11Qtq3|5n)Ouh%H%G=(Yh)gpBkM1wiE{hM zxHR{hwjxGZ#bvXzN^ThnUrEdGFe|}MFRL7%da9={4YdN|e+}D5abLF8kwoNT)&4jP zlH{xQAwASi4?b<f)RT4?9JG@&RFLRy>z8fRCApJ${;}7Sx}5~c&U^2-?zHaiBxhJ| z$zG3sY`fShz_cjm?P;ZMC1+X9b%Q8KU3ZIYtzj_C8vaV=@OulApjD9j<e%cAcRG9? z;MN-$M)1m^1rOov!hC7$vVT+sOP7|a;*pg(Lh#oT&1@8btjv&PpX9?TEiJpQmMIkk z*KOek&5^Q)?<`htLOT~x+Cy5hhHv0ys@o=x$xTGBY3(aIq||E|pe5<0UZ;VAG_O#v zQ0Oj}a)r$66q?Xpuh0!}nJV<b)LE>HTA#>gO$x6Fi7X+n{NjHrF`@Oz#Nwj&iC0Jp zH4HCU6^hzJ<J^Q_?ESe-w1I9-HwW8zvi3*ox%nLF@O#5Fo>`O(9BlR)z;CtgbZT^j z2*kOw+(*5XVqvtGc6&0yA*Jr$BmRV{l2I{+?ZwfC0~BDf8^*pD>iez9?&cU~6_%ne z%{-p3gp$zD9Ns5k46N&M&xCWXApg-OMiupDDf!MMud(?}E3-oxG2qp0tiKASs_SCi zb*W)1#J|1RQl`5i{r`yGu=N?WC1fYT1?TX#b1+D8CZtE)lyD+aaPqTsP6qL(7;vzE zfR~Z+WTOc72!Y--4y|#}2`d(-(Ed2?>MiW()K~xozJdYqc*P6q7O3_}2uIthd^i00 zA|EiDytnx;0WY(W3%$KO!{JvXkLr<ORqWco7bouw{gvdM)Vn+2fw-Hgd2Xro6iIMy zJ~yLMYCkg4(#W_dzeFD4&CK79(O~B2sATm(7u}K~SF19HY;8YICyk>NI5g1usdumh z|8lu3$LPb<D}KbG<H~2Q`w0lgmAr1&t&%moy~v$8@m#d$>cJY=<aoZY$bv#^o0ZHl zy$PCyt}aoN`XwncPO4jrR3M@&3QQbJRWUVE9JILtGb&^@PBHaEl1`vpr~-0Z$pqEm z(Tp0`oM|~>6X*9Doru)NxNcT=-F_?vA-%7-F0~fp738gmeFz{Yshc#sNduKb^)?OP zr-4GIeoVu=G&E?KR-j2SXNOW%=W>d(_jbKfE7$DtU#+%O%bo6nX6_<i(ZyeUbKgbF z-x`M|e;X|=_%>SMuOqWl{TA8XsUdM!v-)Rod^||#Lua^2BR)+$b>@WpbMaX--zZUV z3Ac1>N@E=ShKraX4UBW^!hVVKU~(EXOIe8=n3eSaA3tgv8`y(mSgRfUaA{^suIu9) zL&LvQACad!xVcCeX2l%doGLtRO9;Znb)`HDYTAsA{IDOc;?y9EoyNPmaldJ@_(f3S zz<mR*1(@e0=is@%K#=An_k!EUmqq$tS_CypZNSS$m$2xZXIOa?(e`j-&gf}xK@lh} zdY@#`tn`sJk*?kY(YX8KE+?y^A@&AgI)hNcq`HgY5O-nx+KdK}Pf3ISB}EOSYSQpi z8h%Ctrw7BH(}P%LtK;bU_^vG?%wcZR4i-tk_ycZDXDaf+S}P$J$_$wOW{r7g75+R( nx!=x<C)u1AC$0<(FXlWQh<#Su&C~im!<G(#Qgz+F@tgku&3i6% diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/utils.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__pycache__/utils.cpython-38.pyc deleted file mode 100644 index fea73b3d7ccc24e5991b08f8d89438f7c409d6b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22218 zcmch9e{dYvec$fh-VYo=5Tr<oq-A+ci2^}^2mTUGK@=ta04+)sM1deBohTg-_ZGkb z_ls{A6mdEzj;SP0Yq{>!&2(JX1?`N-?xY=0<9gCx{v(M!X(si!GmYDBI-O24osQD! zG>tpcDceT<e7<k@fICr+Gn1C!?Y@2c-rKj|_x=6-zP-9-OWwl2-}zwd&GL$6{UI+l z|4ZTGS^R>pIhLiYqNQx*)a;@yXQ$}MIaN%_*)6(qP8ZX1&J;6p&K9$B&J}ZV9w-jT zIbY1nd9XOBQp&9j)rX2hwuN%KwxvE?9F}sXwzWP|9FcOiwynOs_<)piDDNolsP8Q9 ztnVuBsy|qKu)e#vyS}Hmr@ptixBju>$LbFiAF6-6`0@I~#fR&kD1M^u6}|c=i=V9T zEAEpq25OJgA1yvA<$P^_{juU>QXZ_0)(;d9)W?cr^@GKO^~Z~kqkgD3?hmgYx@#2+ zYKt0HTfgEIC;Z&fVKuVse9_iN)i$;LU8{IRJ)m~r{4upt?ZWw}dQk1g`IuT%d)3F@ zwTs8qL+azGc|tv`K7sQI<*85N{3*3hJ%aN|^{Cp9^ONc^HH!13s;UEO3_YJx2i4=K zIi<$cA)KF91vP>5X?0i~!TA|=R2{?lS#?}Jf%6%4LVXJ7v+AUJ66bUNc{O>*E>5YZ z)G1tFP*1DVIDc9_qn^e2Idw*z#rdK-r_SU2yqZ!MaDKsemM*DJtLNUe(ECMoQ9X~^ zX|<$YP?s>Tm(+`D8a0>IvbwBZM$OA=MqNS8jG9$falWFit<S1g?%Ktx{#Etr4y$+# z=htw4MHSWSXz{ALuHL};HT9+{;av37>#wUD=y6?2Wt84fbE<-SZz`pHoJ(q6E#Q1Z zIajQ)TKh|R?cZGSgD@zpgw<M*f2ZePK0muy4ZM0&t<-$4rJJ{^$`3p?t%j@K{7Rz| zR-28$3m40wSJu9_68Oq{s~Rp=8{SMjbiRAHTnn0PGQU#u=9}8{Z->5alxtoEgRInB z9ITLkpENc7zK!Fz>}ar5y5;KtcS@x(J4#o49R?_jgw0Z;99D1nr6APR#sccLw#qv2 zON(LHD%Gk%IJPxP-&|>iew16$HMtq3=T<{Mh*Ibj4Zft6uYGmCS_z}<O2f3xFZdze z^>!7_hFDlF&8@b|K@jCJ%1XnGlb<UG034qjZK*awf5F$KaJ7X_nQBmKtsaYZZ|+?3 z8@H;u*{J)CFxs{8h@SfFi{(}eBjUXus5G0)Re!0hOY^!}FDc9sulT?@JoaKE@Ebvu zFVCruxl#UN<5sy=Raa*&MO)(XbAB0b7j3;zt@$rDmH$dvH#pm!R~y=YtJ+ZIxtf2r zsaB`7Zt5|oohdZ@P*<W%NzU(I#tKybG1g(siCh9TO7j>*Y4kpJw89li{$)_e;dc(d z;J@S0-Wyta1RTq%*=u%#yv(XOYxXNvW0z}%spY&rY+L+$%_26wYPC;v>~*(eFQrxL zuCwNZ8C+*Oj&kpUbM65pt)=3cw5eHh<I!>$?VaAyIw}3RjvIWQV|U#30hPIHuelxf zy!FQHTDp@~*=0w6N98)!a#nu_{AvL0((8GZQ+YfcEl?g*L*4Qgm18*^Tp#MBJ61Tj zwB>F}f7$fB`DLM~;b~2vTxdUar8ytI1&X--Vzr{10j{pU0+2V~3a+19(Hcl_&0zKQ zi@+TXfO}W`FvR)<#lg!&x~T@&r?^EfUIGnh5Z^ufsdn~MtywA8PDgfOw(VRmME1e9 zQ#g3fer9Y~KY+(a8LW@?7ouz_E(~6*x0*VXg^sc>wfx2l{%W-CxfiBhE1kPKGcz?k zTe^B>Y9>knlcS-RSA4yCtz292r*5P971J*rv_SSzR{O15x#CBT_M>#Y999-1`{Gyz zDAEKyjA8=C5fTJnYU7=R7Ls?8i{zam7X%r8%hD&%_1?<FVzcf~=tV#D8%;fNp;m3R zW+vu&(uWqxxOWSrG*PS0O|(|S#b)DJ;p7B}!9Ub0SC-2QelXFhwhkS6vT(R?>=5X% zaI)YpEU<C{tORSIClanVAzZJ}T8(zflwv|J0eD~^dUXOb3NGMa*^cend1uHTwsVeS z=WOQ#H^rlaUnZ4_OF0Mk@#m)V4$nC|V-LyS2+H~-M(QCOVhfZ7LpFO+2(3Go9uDme z(EW-PI_9iU27!Kg#t&C?!<*GB{<v422jBHQLfs1%n=3Wt&H0{TRlX|Z^IrV#+@fDu z4#>Z6uX;g@W!^#=y}|rEvKJX?6Ni$~gO*>Z&R2ak-W>`|o6k((Q|R899!u$+n7`h^ z1K)GZ*2h`qs+z;6SlWuiHT(i{3@eiXIHm4GV4*f8++-IDq1Aylb;r@$JJz~=*IL81 zfMmjeB=E`&&mbMdNkGZdsQ4b4CL~8$uX-yjRSx|^lm@2M18}tLVmT;>q1I1gd~jA< z^-VPzVfPZ`OfudaTAF#M@|^c6T=&e|Ma2MqGVkM9TxG36`vWiI{2k2yA+xmLh;vex zLS3O_Es;lFmKql|@3e>To(|qKmGH|Y7d)<*@VLgKuUcVxJ=00uwU@GZ1~}4E4xH?r zZ~%NO6As>WYy-9I9co*<WyB$j=wQT0!GX7g!}AWt{6}WY4*2u(fc|a=vwh8KyovES z=bY&+cXKk%W0=`iaPt8^0cDN}bY0)taaw<(?7OyY;Rz3KJORCSnP&hJHpX^dwYuXy z#<~!4qGNZQ-PRrIC3(X|!M;j0A7VdB;S^=&A;%ic$et_j2V@iN!oxCp3d};+s|{c? z(G%(fm`8XB?H9sDQ8l2E1VCF+cA$cQ&q~X=svt*DZTnu+&=Vgs395R_2hSasR;-fe z%=v!9Yl3~^LC|nQC@|EHeD6TD;1@*kX|9CQXLN4Vo3E7@q#fqOW@81<C{*QDuLkMt zg-wIEl_o?&CG4Ac!MnJjMR~^xhsV8OrA0=LC)H}CcJ0@jw@AYvOwKasnO1?UwN{JV z!1tHmC!ZPHrYCXIr+Ih=hsdcmqa9bFe#yYTf^g7KtD23-X+qM^2VogJKL|^NQRMP9 zq8ua}Rf!;SS<(-2v@<*uIAr$XOCmA!Sze{;<=fCu>}E6+Hp6m_Yl>AVj#P{sEVY_c zWtt6{Pd^O~U}8|L&}SKg1su@=Cw84YxG{+^56(PfkJuS!$j#%9lX3p1n;(+e?dcp^ z?Q$IO?VP*a-XVQlM^m%8P$58)e?usADHmpq^+mgF>@%wlnyEwgpslm!h7L4{=hxEh zU14g;T~8|)RG7XCykE-z@Am@lv!JTW38j)6REqkIw9j>*hv<honKjq8ZZ6(@sN<^C za!%het-=8^{I#q~ujRr#wG42BU+Lu5heUtLb+Sua)`vT}yWlE&thIsmWXI{acWhAK z0A`Ty<n_Pnz)sv_=^rS&;i&A|U?<-h++(3Ox5t_X^}hnniJ9(mtxhT&ArAnBf|mK$ zvA<~PKm9CpGE!;$KHI|WaVsx*E8gW>jSaM)N;ohnuS=ETN((eoUWv)C>@7f9ZFo?i zjl2;Jvmn|McyU@Tqpj1_KQB{>7X+GayYEcAz4j9<hcy|c%R!}D)m$}A20QkEewpPN z9HPPLso9xxr3)7?O<mEH*pb_UfQ$0}?N+&=V0373kfw&d66K)$7?mdD--etIG*>># zSHTv5?hqV$kQEu_SBUNz%nmA-rZ!L<<~xD8R4e7MsRMlpm3oZLhtEKoROePgGx@Qh zD23N84(W0gMu|@)JJ^_UF)#02l3CjG;Bn1L(b3gnPSh-DA4YsW%!g)c&4p^CRPCpZ zVb~EySub%~-$dJhve!zv_K4#`1##?M_OLqy0&wjN6qbyWbD_xKZv<-0FbHYH-fi!I z0yC7_Ve2{c?U87NHl><Kw6iFPRDfUOP6}M#)~6xQ?2wY}G<bSykEPt@l$6sbXIM6L z(gB5B5lw$A+de$2VO^2^Ex`Ju{pbt(YCye9_^?5k=G+n(BN!QP8M$!JKK1?w_;=4f z4XrZ^5QrFm9h1}Bc;NDD>KIXuMjCqp$5I$dS9q&eBZ-D(4kZyUX!-|e5{RP*K-+8Q zKX4qqgt{KEWKogEPr&kB6hesbb!clK?h&dca-HJ!br?Ns4nPI*E^Ppaz?5Om#P{J6 zg6Wg$I13KQ*tzM6aA(UmWwbO5AzZ<L0lBZ|?$T(vEq5U9A%N2yd&%vj=OISdG1^`G ztIij!wM_g>FrDD<cig2x^iM12J!dV`$$)%Q?cbg;>b%!zHiR00+a8fJw(4szL%mvc z+2<myLg38%&;cR0yt-eXLm6VT?6s>cQ3cDovIs&KNhqsIQ-#c3nl)(g>vAQ8#Hut~ ztI1M_WsOxF_vjL+1-^{5v;wtO8-17P0qvFE2PJd!;CWaqHx{VoQpvq%Pe9$|l8+5- zEWa+ILZ~)!mzvc^l*Kf;%p~<vQqC5utqZKo5mD$ih;mR7<A#_QFH}`W*?96}S%X~J z_+_Jvfkc#P0Xo&&#T<qfbc#}8y;U6UzO)c~Kl<&6Z*xK|UrC$b4>9w=!@)`qIj%bb z0f#>bI|@F~GAMaB&clwrjW#`~NoGmiT2Pbnn3^*r%n*$TQf~-)4O5{zPfhc&5a@8n z{;UmaTTG6zRQX33Vz!JGhfZzi4<#rou+q5lP$p=5RH3e*fhZw(anKo;70OsymSjWq zE_hcP&`hA3m>!L0c%NRuN@a08S@3d0#@OVZ8Tb6cLSft(HItJY#?9%|r$wTami^Td zd?4cZIq>>{QCyFXd!wit9eZO;#v`h18uO>Ly8o!7#@{o#F`6-w$=W9g4Za!-4{C%4 zaGP9Xym$1F$i<*LoBKcKZJGR}nf%(u(|-EgWzb1YAJpXL*OdC{dyoG)<_8oPc1kg* z$qOTQuGy^VaTfC%FRiII!C93Cl;JbzW31c6akY6}phLyHbp$rDvz<oNI~d}l5%^i$ z{TUIMsGR{ypM)`z1y8g>ICp481EoLz7md;vHxa-F+JaGnMrcS-{Rw_5(!#FX44R*U zjQz;mgFXGjd=&2dxd!<QL-g1SkzggkW6)8rVqwPy`p`_bQ7c%c-)3nS546uCmtA#- z*L_&FwGRRh5yytn(At{dm>BDyK}`>yrBKn8;jiLi0fsCY<Q*F-{sqWvhXI#gaG*Rp z2(#EMxmL=8<M24t97jLbfD+#rfePd(wBUUx?~wJ-1R%$u;16|(f9bM=hlyS*7y=$i zn>DCFT?EgZTlHoxob!$zK5-IGK=D|3M`Osr0))RA+U82F3~N+;&ybz<dihY`;|e|v z6_5EA-8mw3{hCiVa{x>fXj6U)X4YYNRvVSt3K*0)yVW7X(t?8Lo$0N@Q{YmP{<Npd zuy@Pm$<h|;!XYz+XNEBCVJ1WT%MD|TE*f!OuPRl8iR`^he>?zysV2rNRM#f-a%j}G z+NxKchb=EJ3JWuV0whK`h#S1s)bM7BN;1h1#N-Wu3cNI7X;FOMH$2fEB<>*Y9(fDC zJlyMkS$p-BT3Drl5?1S+45V8Hnj%D-ajP@B0e^vrH4XbZp2jTT7^@`0@Ytq|*GK=d zR^DW#hA6@04TAbcETYKZ&Gc9s&+ou!*j)A-<KDg)f->5^SgyQo?oxPdzCHSe5qh&t zucCddJ05Lbcf*6%GXt-@fJGZ;z=c>LFo*%B5NzqfDhcBxv`Vb1dora-c|FEBj7C>B zXk;F1RIf<`kjdV+HxG+t5#L-Yrj7CDgVyfZ`^Hkyc4#|{*ldDLv?Gqg#Pg#}Ux5wA zm1`(?8Q0J|%0S`38b&Ucx1S?y`_P~#$rC86tOs4FO$VS%4cYpaaNWZZXy|k~0u`(3 zW{xnw27b_Spn308pz)4#iuCQQGrWs{1@!zB-I56>K*=@SBjy>`R2n>EDdril6~I&6 zm}j6LMoh_w<QSRqo3Okt6F35LlClSJF>clcC{@)z3l|}33+O?@aA%2Ysty()3cPWj zi<5K{wkq%G7-Pl#Y1aC{=zO#J^ghA&`D(DZZyW@vpWX*P_7*%$3F;Etsed5)O4{H6 z@^m_^rN9OO99TXAv;`r}17k+NfqcS<MEZEl(Xnw)9?QD!gQ3eAGJpUEQiF@&R-+k% zg>JAi;Y3|C@sZt_hGp|%dhB^SN@9jB;k`2m7t^9h)4n^C9tT|e*{P9Fy7B*n8aZ;z z1U`Zq<=F!IL<X})D(=}&Zz4$j^T2nI*Jp7On@Qhcg)8)?e}T2X$U}vPJ`o%f97m3+ z_Ei!bLjl$<5*z~|4v3C~m$&sVqrS)c23+6pGF-<+$I`D-?StqAL3PEh2Va?^UlkHM zzCmChJ6oT}by{UeP>AiN*nb@*M(uDOAc-Qv$EZQR{hzLySTEUk%tM9EKt3Iqq2D(^ z6af?$vrA#aJ^bj#n1Q#rb5#>EgzA0FX(1!f-LNsTPPl};w-_Ox(}@3JaFKp6gI6f< zWG#$Gn&``CZ3w=}9%f8AzInQ|#$s-nEWgqIA(3TR@vmv}TUlOVztiG8L*VfGJ^MON z`(QaAMvE~=mby3y+c@!s^ewcY#M@k2@sH#lO%G*vz^f|tJ)AVPc|qyIA}8%w(5ptM zS1pm-IZHP9T~0J4yZxEOjVSaxA<MBjej`z;vUg6R;?I|Lue7QxO>W#uj8;G=wymL? zFqj^Qr0fM%mmK2v7X*iBaw<#Fpy?*D_hQCe^noOLK(Jmc9n)Z`tiMDMF&b`V>4Srn z{vOI7!gvDd9DV{#D4q=ZG5%q<e{%yE=aLsTQvUwX`Dwra6yVk*?>F<KS{62AAQ<#A zH{>-Zz4PQLM%tKF5I<c!gh-C=lzJiAtv0ClAl?ix{mVG%&-2j7G<KGil1DPaW@Z4; zeVw2qJFs&43pn;*73Fi+899rK5WzqNcg9@?yWoyjaBMJr0RAmouHEi6?yS2Cj(SNV zfV1N+Fc7YLoF9ZEJSkE3wrdIa#g+#(8pMfx*l~0zR(tzEZz4~V(CO(e5zT268upH7 zz}Nm&==e!M+C+Ki)$KMl=^x2M6QLIC&IRuRct*WRIoL4nZ8+OtCm_5e`m8YsR5hrq z1Wcmw@V^=aE57&0(W56$6ubk%!s38V5=U+}sE8X~xe0%GVXXbhQ*}663kRQp;|*F# z`1I@hu8+QP@Ic}5XU14O{RU#FX-2$)_T$~Q1{`tQr@DPN^=d!*=Bew?+^*L!bn?#k z89S?=$9n4*aEP{__o0~^zv3$<5~YvuMiz!q3$8qUOs?jc<5H_3_=Fo05iI88*(1VV z9BAqCLcPpl2G7U2A4T_m^g{eS;^}TY#!4gRlyd&Jo1u$NqW<t0=l)cG3HN%imprqp zU49uCBB1Eig$tcRj)84D(T!H<Andf30^bDIA{`|K-g$#wTejj^AMRvS2CcGd2r8{3 z)Ps=*Is+;P;rA}?xt#$D!*!eCskLk;gL|n5p_Oi`&2@4ex078@-L=4r57WCmPZl)L z{zgIr3Fc9<h@~Vvg8|nbsxWfNC`GZ<GF6i?p$J##S_>vV#Ia$cP)L60G32X2SjO&S zGnVc<s-|$$^67@nJOV%(F-NX3-A?TrMSjHRSWCGF1%_dpC{1E)MJ{n7O4ktG)noZ6 zW2P8o#2!PsS3C<z<bpq!&q6+qIU6xBELy8%1;~hLxf!LPK^pnF6;JSQmzwh>M4OTE z_93K-ZJy1Kigk<MBvLV$YUT0>Juu8E$s`i5$=TZ(%dz!WalZ$#C`Y=o<UB4mBUZ4T znMsV&+=)XG3Soxjj6P1M2GE1~RWLb_L13fyS%t8G<T7R3YY7S@blJ1u&&|$W_MQ`a zTVzHrBQ$^wCO3=l`!K@$2;@X}X(x+uh?qAG8a9ll?TqeYT>Ey|&R@Lp(xH<lpLp`n z5lHM5s8xWY|2klRiflXyO=8o3lZQSTv}ZGc8%7)V`2#M+2)bC=yu*bU5<!j}p0A^> zN0igqPN`JEFId6>DQw2&{;+5~d1^e@5L~@EEG~F@htL8cTr9wQlt<Kyb|bcvT2FPb z7)(CH@}#BD@lI+99D%AWq#Ezcn>&&dlx^?55<=aq!<|I8GZk7ODBMC#U6>ZV4({2E z2|oS=bF*fJO(X4rd@+}-Yy|BFBLvY-Km;Blh!;4J$~7~p*3`)nY|ABMN46GoAj-xq zkeIo+(pW}P*sXpbKa3T{3`?dZ*lf^3x~E@SX;k^pKkjnU6#R7f6TdJ}-bEP!N?U&$ z5AT6Ek-ZD?=WwCK>!zILT(AQi)Lur2-FWiATP6ACj=gNrL;!~a^dGdy0|{SVeF~iR z=0k$?skV1fzy}9D%m6Q_RVx50)S+@B?}gb+Luo!un53c%IZI=qI3#W3?1m_XtcHF- z3=(=JGo%A<WjqqVF6M>}fxPvv^GyMd?mxaM70Gk>1@x3})_BBU3G7)y0swJLUuqAB zOa#hw5Rhe<-!;hy&nLnC^_=lbn(%&md(v7k5vfMfV*u$3x8oidD`UNedW8F3$c1$K zKO{_n#z?HTzy+DG?>Xe)K^1{nB8%J06c8ktiC2G<jt-1Vns<kxJ{|X+MW|TC{)r<6 zFXjS98;+kU974pw(SkP*kq_qtra`w}oUG`vGM<wR!5}0=NGz0kt)}+Z@2io;-3^;a zu(<1G`2Vet32p0N1xieh<u{Zg{YBIWkJ4XbNg_CZ4W(%4s#y}re9-T*YG4+eRjy(9 z{~BtFTY<}nK_+Y=(BI@B_v4!Pg~kxEn&zH0lxRh6iu{wQ2E+D9$^n)`gnbt++Go$4 zJ$HWU!l$3R`1}i(UYvgE^2;+<X0Kj*<<-}U<++OT=NA^MOUt!-quIKtgK*{6Tenx+ zhmRaRcKnGGpE~*Ep+f1M9$KMp)lK2~ZCq@K!4SL_xs(urcO3BAb^7Q#-~frPwU)x& z)E!&A`rjlUzH8}kf<9bO2sT*UL5Nh6jXh9Q2J`_Yz`ro7kb<`hUjNS~iEVC}gBbl4 zXjSG3uF8_vz{bEebgbVnscxHUcHgHaw?1GJCZLIZ^J?P|Vg+SUzg9h@Lsh_=ld2>) zQM~PC@9NA&_{EZJd}IN`@`D3g@SLP$@IKB%gOPBHA_KIMG(_TOt>!Ple?jV@lmE<> za~CffdnS%;ChqXWqm)SOd-i_g;3WqWFT?wkpzZx}Li$Hd9f8jM!RT}Z&rGbWX~y=2 z!A99Cd@+rcdX%ax>P?}cy%;$fzB)ZKg}mi!Q|C)pre<{wm1Ak<-BcqgW?>N7)yPJI za-|=Mw<m7ql`fE;Aog-xE0YJFj=-~F@O3+6|6XT1;+6WhaJL8RdN}m6xC>bXY+G}H zJyg4Z8`SCFOZYKUE+=E`0ftfud(Y|PvA;Iso7f6noUzr3g-sYDQyCMdJ@nxK`w)5? z;z~DH78bFFiGOH9d{|y(wZf=JQ}6-7junX*0bSrPl~E-E!*B>hG~D(;G+2Tr43Y5i z*sGtcdV9wwA9-~DW1|Pg4n96UG5OTf&piA38}GCqKy7~|R1Y^O&-+Xkrc@JXYC;?p z-@~c6jkm?$T8i<!xT9M|=WJZtznX)TL<lUEu<|c<MQaX<o9!U+Z`jq}$M8K$1XFmr zqLqk~h*l_JP|mQ!0Ax!>0k;9NY{k9rZnO#0$e4iOy#oU-Zi^%w<Bq@x=wWI*>1S!K zA?@Z_3nmzj%QUdu_J0+_ySt7cLO2J#)#eJldKIQ@Gs^-ic=0mQC2CE2A#kVcA#aQ! zFyw;Hp=d<d)a`N|Hvc5(m>J@Mq=-wFMhouzBTpVJ9652aaHMd=kToRk=Gwy(M~@3e zh=s*NGRy@SFecmMXBg-3;ew3RBUG6;AQf%r=}X2?TL!SlvZ6SxVB<}OTWTuHxNcUK z{V*Cp9&cEJ2HP;)U|2PggQJ+|Rxbz3!UNFVfjO5#T`^N_!Ih+oSzNGyT!ktKpO<Ve z1p=%eXSTC3@={93tV3HiA%eudO`2K{!wAzqBI0b;$<Ssa!R9esFiH%g%Gzz6hUv81 zIwMh|b@-*$p}B*PBNi;W)6btXQ5bBg!o-XUGjaPivv(2y<m%qOeY>#f*SEO92k8h( zJ$ihD1tg1g^ob`5$?x#}Rht^w)dxTK!Ox{EVb$+@xNbYAFTzg#9Ta2W!$DZqKj1a8 zC@agzo^u8C{~T3)VAQ|MI>L<_xdnf))bv1%(Cd=gI4+>4(k}rrlVtJTkgC=aIU_P} z`S%)NDmo`gCDq<_e~h{?3%0>o>wktrlol&z%q|WXjl5KC_02Wf3g33Mb?bO3Ui!7} zdb`w6WRJ#=F;>s)x!&E`e;yZ!UIBZ<(eEM=7;geI8jOG}1De9-O-?bd#~Vo!Fl2$V zYz3Eac9&g!nYHcRArgtZV<2(Tz~$!W02g<O`o?FvaFJ0OU`a63nZcKBUlZtD!<HQ{ zsFDlB+yh1n#Yd&8kQ;6=42pT9Suz_zZk2VFJB<3+dY4``$yAW!g8mmQausJmcxfaC zG(sba>02?W8r^l!zmK{xr#Kw1LQGovU$SYRCb<Rc0Z)Hbl{m}KaW#zm9fss31?G^R z>LO8fxA@jz3;t`2(!<7yb=3MQ_yzO{1G4t=fY?L(;_OGjlU`q5b>Qb}BSD(B-z(M= zkiU8w8Xgnm&YSyBTa7#tqvN))dq}%Z`-j-dB=Fp{O9oL#14C~Vwb+hW_eV*^OgdZf zM-2&HVL}A_mA9(RmB7R)$Gz36UsL14jIl=a{|2zwA(^pYy=`H3;s&=H$TG9RpD}}Y zK@lL0=RwKNkmb0inv7FnbLIj?@C85%S&e32qP~l(F}DbpfO!++&DtWbQiAHpY|Ch% zSyLuJ+P{>8OuvZ7TIWLUz<5>;<~&SWCh5}*U^>2Lf^E+da{1^SJ%?X#5NJk*`mV@c zE}P`XKLkaIW^SCI!<~Ff=FU--MqJO<KUNu)eHSH=Vvf60z<l#}k;)^zr2QRRf2qUd zp2J9(g)0TupP>{7T0q6uUqpsK#=3dK)PT5eBsGn*tb-hPm$LfXaIOx*lt%e3od?*b zh%r65SkVTGJ8FX;!X+yu*;~j_zZ2#m46xtlubi;S00-F`bIT#io@T{RxMfLp<RBY= z#E`ohTFWJw_)l0bTQe}jJKTly80V>mfS6m_mjo{os~kx{KoO0oeB#SD8^V}B%N?!E zu>}fz6w&uEJ`z01>k8L}ZpjUDYGHS$NqDBIMDg}5dm1u?D5d`m4@9RZja?;hv|@AB zhoo=rRIOZ}Q{~g&1G4CEpmlrH>|#qc;l(p9nC*_iX%tM4X{74LTx_;y!sOKa1^n&8 zp<}%<ENSXc<HVchD7=mSx40$v3&G|T4(sE|wLxm`Q;P;pEnu6^?Up|MLt=9Vb*}9I z9_<5v)-;oj_iRu9L-f06kGE5kZ?9b#+iG?i<hW;#+`<^~!bB-{gu98t0lAAT3C*lD zI_Xrv<OHD{*(|630b7&hMmZ$;7{NE7ORW9(I1~ry*c3ir97<qSLYB4ow6RCKn3J0j zhQ(n{CRVxmOah~rF<8@2<U8;C>fa@Ro<%p1J2n^4hlhPRj_bJCRxt8G2K#bY$25RE zya5^Pi5!7NwJVi_SCw*im%RhE*q8H17^8<Za5ag7!Wt+V=+z^Kf6vh)Rjg%b-@!5V z-JRJ)3SL=U&ve~w=9dXl^{Pi3L10_pH;uq0=c1WMh;kRO{Q!BuIFMy$x4;`D_LBr( ztPC=>9sQp%M$bzTm-v&H3Q_3Tt;|NM5k(hx8%0vVq!KQ1-!tqH+7#e*4jjS=<gk?- zsbor7IScL@gc)7Q;7GgaE*7u;H8>xjR>+>C*3D}j<I4NHSCA-(U~gHN1NQTSH&DJ{ z*NW`_L;w)(&&@i5#5#C?5*yj1AxslSZ<4ODLr~TsjsnFHpY+abjs;*@0vI{WzQa?K zB7F`-N3nDSL*dZ4WFkG&Q3^H^2x(%Xok0m_FdWJb{U3P{hLbTPjb&uXqHO%|V!Z!9 z42pRfmZ`Vc-6mxQ0=dbb5u85#WGD~_8A|$q>nhHz4AD7{T{Cn~BeMm;zZmVYzefKt zW^-?=Nv=AS1a^D)6d7v@KS6*Y6yN~@X3smjfXmP|Uh2hTqewwVkbFdJJp#bFPH>Tx zkp#!I6Qn(X>-4kru8E%BA582IG@l8_bp@yXH{Bi&R^nhK8Eg-ln^1g4{|UOVThG5P z4jaNGDPkLo;3*wzD*Y8mY`jpW{iH#N*mID;q=5Os0E7=BDBS0>2GXbPjC(Xc7O*>l z!3G4FL%*FmIB~F@U-tdhA!v`ce3;YutC;wqGlW8W>zPW$Z-s}Zn2HZ*MHy2O<zav| zOolD=pFMaRc{A}FZGwnkfk=U^30UH=&_2S1D`vr9khRC^>;Hl4o(1mFXnu&hbk&0{ z9hwew!81`X*vr(HP#^|V$N|NEZ7tQ_0rw-!NkrwCQs}Owp&xKJEx(v>-RK2$Nh0uz zdqz8e6VhEruG3w+N*yK5{?vSs#GGw!M|c++k$5n2YssEIj`oejs6c4yduF6$e(+S} z%uM03yhR@f_bsB`W0I~j(EcYz;qc;&P>?ft13&&zt2UP7Bqg)u92_y$He`?NCETC% zPVqw$lM{tPVFIpxAnsDjUpV~~aJ=@kR6HelgvdCo0~aTFci(v2NqW)2zqu2ypQ0PT zr%NxF@8+SlQ{L#lwma?}Jf$DO>KLyjMYXVvcKXz5G>{<jSX!cql3yV12xINMi?+yK zmt52|UpXjli9-$4l{G#v0>#<L4F(>Wzus8ZU*RME77u-lX1hQyNimZF3q-ZY(ALU9 zl5*=0gvkgL=^eCGond@wz<4Kzu)}r8(f<oA@7b1~<?!clcpn4wq9rT3(v*G;q|8Cp zrhl4R5>-0<9BlT?Xr$Uvt;T)H7eGBz?@kzH8?};Xhg!JAmeSH=MrGM!Jrgn$0YVI! z2##Kq4{JEs3h3ys$aw6Fz%%^hj{ZfJm!}NMh)L~NsM=EDM~mOvG=~9P|AyL<^x(Wh z*8QFuh7Lehv$egmht(t;aQc0|cRRBZ&L28<RR14d4DjOQp`f~8GUDXskrQI)w$pOc zv^jF(5H`9|73p5rd{aDj6t}v?nhy{5x6m#cI{VU#rK__SjvXysn%aDIb}Gun_fB@} zkDS=t3Rh>R^uOXT=~80_`?v8y7Mza8=VJ&uy7-tu86Gq7`V|Lw+gRm&copw$Tng~{ z9K6wM#HoWA*~)Uyv<ok{3)`9-LTRWm#X#zyo$)ShZ#@8M)uX=97eePLaZGlb8lCKp zb3Mb16|$wZ42+>v@F=1nDKIK-n@02l`x~)C5v(OUpAo@exBt$kWm_=g7MCE?-~?lq zJ~RTJm{KX*3Cgj8fV?IU8Ps7Be`bTI5%?yR>U@%j*^T<K19zsy10Y(54at<9Fo&u2 zm@S3KIEJ4U>hTJr-hH-Ff<jOOMcH6TV=O16%{{ztmCOwEe?h%|gNJK82-T<Yy#c)% z<>r}bgrWP%9$yHO_ld_SRp;S}^s&ovl?z2cTbW%*FoM;LPknuum^mR?hO;On0dKgI zK+H=BS;-k;t$BnaAVnUcJ1Hcw=Jl!A!UUnloS&{Xr~P)aAl#`f(Bj5oOr86knLox9 zD*z9>OR&4i?B*muyGi9Hu_w;hp)x@`XPi+AI9U55M+X4har{gQI3O%Mm<MQZ0_`m* z<LgcFI8iPcNWY02Vg^Bwi+cV(Te_TWKa{soN#_j{y2YFQC4yJPc!pnd*$uo0h+%bG z!B!0O=JhMDzj<9>Z@h8v(axKXwzu|G^vHTLmhL*t<Dz4kEx%X~2Rf0XcZVR022v3r z-S<MeLtBT3;5c?(Vx3Iz5UX<#t3y{Gd=C8MzD$M;Lwo@VE7%icBx{Ds^ZW4m@%t={ z{(y3fiV|nS!{r02k<0|-9#<=i@csBfW7K?O0y$U0CixKxYLjSzbVay&K^QuA{%;DC z$KgUCEB5e1IY;c5>2$zT86|#jwZX00z>$Q2jJ06yPMR%ouq*J{4A5WfkUSvRVdfmC zRJT8sgbR&ddt)A)TQXxaSqzp8zdvZ7zDBp3*dp<i-rkQ4r2WAfHvC{;9=58|C(1lF zK!&49mgcxHn*G5vsQPuRpV{!ZyL9f-)S2nhb5m!|PtBBOranFOYU%82vs2N7_q%gt zc19m%=a2C~^Bg%!coIyMzrmUc527xlu(`S)Lw8ENClUY99I6Uikp4EYbQd~WS$^jt z<G=v{PCWwo52xA(dS^dNAXn~k<_owmECGBOWS(&5juY(TPIHrAh#XkTcx2Er84Mq) z5u`JmTDdWwPPbo?h2G2?OumCz%b2?*?o9dY!zPviJoqT4de45=C|^EiE7T8iCN*J) zk9-F~3%ku462A|N)p-Cx5Ax6_`nG`1p}k{nB>nFYmUJ>&nH?!I)Dh5SKl~`-yQF*r z7la>8@#J#{@ZAsSS$>si2^*+E+OzFp5Gk(iNF?Ltbr3NEgTi7j$Ap|!xXb*2o7Z2p z8ad<)z%2SK#sm?k+w(6X(MUdi;I*(v9a$+Rc?E7{M6p1N_%;l;y<?XdwgG}xlh38d zir{;CoA+VklQMW+Pz4w@oW@mtRK|!#`4-D``>8Y7gU{{CUb7<KU%}V<jQ<&53KLck z8)x1eJ`5+M)E%e&_*MBN89m(Q19CW-59)llF=%N40OY=5wJKy)94@iE@wu1nxNkn6 zQDEugI3R2=LXn8wfeMLYGI%r~-S`Qc{v}4#m(!MUzt07xyT)>dC2&8?5PnL342wKw zUy%RI+WK#NOqt&nQq4-KWYo31Bof^Y@li2-9u15ilR3pEzVri>@X5f{K;LBD^E}jf zAoDjuD~(cdD`JUQK_u5f+rsx0bq2M}t*evhNt$MV4JEsgZ$wFxq(gC}DelDSWZZm2 ze)CNW0oDV&+`+?69>^MsNNtv_4VuZw#XJ~WY*LGP%kQ7i6b4rgB+zd76P>vNaD5de ze9w<NsfxRhjdSMerP<QCGo`avr_W!SDqTJ^`&@BLQh)iSnb|9l!LY%}zvVMu@)0cg zppJYzL_U=vA0?2D-TE_p(l7Dw%RJoS;XNL{z{8h#_$m)y=i%Et{5lWc#UUDiCD=xi z0@6DFDJy@Ahwt<7BOZR2hadC6pind%uVKC1fXS$hv-FR6n+`bf${1sx*1A|r$cvP{ z`Wm}<EuH2e!vi&5(YHh+(0`Tfx3O+J59GSSIs~;gq2vj+6R$z;6h4!LPiCG5PFexq z)I}iVK7aVa2tUm-WS@6=+?_(guai#=rE;UWq1-_3>HM)=F6ZU;<Q~HDk^G+A*4$uj z2d;PKw&(J>{rviz>*jXncFCQ=+-~r;o#;1|+nXQ27>|kXHHF^Wa@+9PmlS$#`@bZ` B9h(3E diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__version__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__version__.py deleted file mode 100644 index f5b5d03..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__version__.py +++ /dev/null @@ -1,14 +0,0 @@ -# .-. .-. .-. . . .-. .-. .-. .-. -# |( |- |.| | | |- `-. | `-. -# ' ' `-' `-`.`-' `-' `-' ' `-' - -__title__ = 'requests' -__description__ = 'Python HTTP for Humans.' -__url__ = 'http://python-requests.org' -__version__ = '2.21.0' -__build__ = 0x022100 -__author__ = 'Kenneth Reitz' -__author_email__ = 'me@kennethreitz.org' -__license__ = 'Apache 2.0' -__copyright__ = 'Copyright 2018 Kenneth Reitz' -__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/_internal_utils.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/_internal_utils.py deleted file mode 100644 index 759d9a5..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/_internal_utils.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests._internal_utils -~~~~~~~~~~~~~~ - -Provides utility functions that are consumed internally by Requests -which depend on extremely few external helpers (such as compat) -""" - -from .compat import is_py2, builtin_str, str - - -def to_native_string(string, encoding='ascii'): - """Given a string object, regardless of type, returns a representation of - that string in the native string type, encoding and decoding where - necessary. This assumes ASCII unless told otherwise. - """ - if isinstance(string, builtin_str): - out = string - else: - if is_py2: - out = string.encode(encoding) - else: - out = string.decode(encoding) - - return out - - -def unicode_is_ascii(u_string): - """Determine if unicode string only contains ASCII characters. - - :param str u_string: unicode string to check. Must be unicode - and not Python 2 `str`. - :rtype: bool - """ - assert isinstance(u_string, str) - try: - u_string.encode('ascii') - return True - except UnicodeEncodeError: - return False diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/adapters.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/adapters.py deleted file mode 100644 index c30e7c9..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/adapters.py +++ /dev/null @@ -1,533 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.adapters -~~~~~~~~~~~~~~~~~ - -This module contains the transport adapters that Requests uses to define -and maintain connections. -""" - -import os.path -import socket - -from pip._vendor.urllib3.poolmanager import PoolManager, proxy_from_url -from pip._vendor.urllib3.response import HTTPResponse -from pip._vendor.urllib3.util import parse_url -from pip._vendor.urllib3.util import Timeout as TimeoutSauce -from pip._vendor.urllib3.util.retry import Retry -from pip._vendor.urllib3.exceptions import ClosedPoolError -from pip._vendor.urllib3.exceptions import ConnectTimeoutError -from pip._vendor.urllib3.exceptions import HTTPError as _HTTPError -from pip._vendor.urllib3.exceptions import MaxRetryError -from pip._vendor.urllib3.exceptions import NewConnectionError -from pip._vendor.urllib3.exceptions import ProxyError as _ProxyError -from pip._vendor.urllib3.exceptions import ProtocolError -from pip._vendor.urllib3.exceptions import ReadTimeoutError -from pip._vendor.urllib3.exceptions import SSLError as _SSLError -from pip._vendor.urllib3.exceptions import ResponseError -from pip._vendor.urllib3.exceptions import LocationValueError - -from .models import Response -from .compat import urlparse, basestring -from .utils import (DEFAULT_CA_BUNDLE_PATH, extract_zipped_paths, - get_encoding_from_headers, prepend_scheme_if_needed, - get_auth_from_url, urldefragauth, select_proxy) -from .structures import CaseInsensitiveDict -from .cookies import extract_cookies_to_jar -from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, - ProxyError, RetryError, InvalidSchema, InvalidProxyURL, - InvalidURL) -from .auth import _basic_auth_str - -try: - from pip._vendor.urllib3.contrib.socks import SOCKSProxyManager -except ImportError: - def SOCKSProxyManager(*args, **kwargs): - raise InvalidSchema("Missing dependencies for SOCKS support.") - -DEFAULT_POOLBLOCK = False -DEFAULT_POOLSIZE = 10 -DEFAULT_RETRIES = 0 -DEFAULT_POOL_TIMEOUT = None - - -class BaseAdapter(object): - """The Base Transport Adapter""" - - def __init__(self): - super(BaseAdapter, self).__init__() - - def send(self, request, stream=False, timeout=None, verify=True, - cert=None, proxies=None): - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) <timeouts>` tuple. - :type timeout: float or tuple - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - """ - raise NotImplementedError - - def close(self): - """Cleans up adapter specific items.""" - raise NotImplementedError - - -class HTTPAdapter(BaseAdapter): - """The built-in HTTP Adapter for urllib3. - - Provides a general-case interface for Requests sessions to contact HTTP and - HTTPS urls by implementing the Transport Adapter interface. This class will - usually be created by the :class:`Session <Session>` class under the - covers. - - :param pool_connections: The number of urllib3 connection pools to cache. - :param pool_maxsize: The maximum number of connections to save in the pool. - :param max_retries: The maximum number of retries each connection - should attempt. Note, this applies only to failed DNS lookups, socket - connections and connection timeouts, never to requests where data has - made it to the server. By default, Requests does not retry failed - connections. If you need granular control over the conditions under - which we retry a request, import urllib3's ``Retry`` class and pass - that instead. - :param pool_block: Whether the connection pool should block for connections. - - Usage:: - - >>> import requests - >>> s = requests.Session() - >>> a = requests.adapters.HTTPAdapter(max_retries=3) - >>> s.mount('http://', a) - """ - __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', - '_pool_block'] - - def __init__(self, pool_connections=DEFAULT_POOLSIZE, - pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, - pool_block=DEFAULT_POOLBLOCK): - if max_retries == DEFAULT_RETRIES: - self.max_retries = Retry(0, read=False) - else: - self.max_retries = Retry.from_int(max_retries) - self.config = {} - self.proxy_manager = {} - - super(HTTPAdapter, self).__init__() - - self._pool_connections = pool_connections - self._pool_maxsize = pool_maxsize - self._pool_block = pool_block - - self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) - - def __getstate__(self): - return {attr: getattr(self, attr, None) for attr in self.__attrs__} - - def __setstate__(self, state): - # Can't handle by adding 'proxy_manager' to self.__attrs__ because - # self.poolmanager uses a lambda function, which isn't pickleable. - self.proxy_manager = {} - self.config = {} - - for attr, value in state.items(): - setattr(self, attr, value) - - self.init_poolmanager(self._pool_connections, self._pool_maxsize, - block=self._pool_block) - - def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): - """Initializes a urllib3 PoolManager. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param connections: The number of urllib3 connection pools to cache. - :param maxsize: The maximum number of connections to save in the pool. - :param block: Block when no free connections are available. - :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. - """ - # save these values for pickling - self._pool_connections = connections - self._pool_maxsize = maxsize - self._pool_block = block - - self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, - block=block, strict=True, **pool_kwargs) - - def proxy_manager_for(self, proxy, **proxy_kwargs): - """Return urllib3 ProxyManager for the given proxy. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param proxy: The proxy to return a urllib3 ProxyManager for. - :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. - :returns: ProxyManager - :rtype: urllib3.ProxyManager - """ - if proxy in self.proxy_manager: - manager = self.proxy_manager[proxy] - elif proxy.lower().startswith('socks'): - username, password = get_auth_from_url(proxy) - manager = self.proxy_manager[proxy] = SOCKSProxyManager( - proxy, - username=username, - password=password, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs - ) - else: - proxy_headers = self.proxy_headers(proxy) - manager = self.proxy_manager[proxy] = proxy_from_url( - proxy, - proxy_headers=proxy_headers, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs) - - return manager - - def cert_verify(self, conn, url, verify, cert): - """Verify a SSL certificate. This method should not be called from user - code, and is only exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param conn: The urllib3 connection object associated with the cert. - :param url: The requested URL. - :param verify: Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: The SSL certificate to verify. - """ - if url.lower().startswith('https') and verify: - - cert_loc = None - - # Allow self-specified cert location. - if verify is not True: - cert_loc = verify - - if not cert_loc: - cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) - - if not cert_loc or not os.path.exists(cert_loc): - raise IOError("Could not find a suitable TLS CA certificate bundle, " - "invalid path: {}".format(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 - else: - conn.cert_reqs = 'CERT_NONE' - conn.ca_certs = None - conn.ca_cert_dir = None - - if cert: - if not isinstance(cert, basestring): - conn.cert_file = cert[0] - conn.key_file = cert[1] - else: - conn.cert_file = cert - conn.key_file = None - if conn.cert_file and not os.path.exists(conn.cert_file): - raise IOError("Could not find the TLS certificate file, " - "invalid path: {}".format(conn.cert_file)) - if conn.key_file and not os.path.exists(conn.key_file): - raise IOError("Could not find the TLS key file, " - "invalid path: {}".format(conn.key_file)) - - def build_response(self, req, resp): - """Builds a :class:`Response <requests.Response>` object from a urllib3 - response. This should not be called from user code, and is only exposed - for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>` - - :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response. - :param resp: The urllib3 response object. - :rtype: requests.Response - """ - response = Response() - - # Fallback to None if there's no status_code, for whatever reason. - response.status_code = getattr(resp, 'status', None) - - # Make headers case-insensitive. - response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) - - # Set encoding. - response.encoding = get_encoding_from_headers(response.headers) - response.raw = resp - response.reason = response.raw.reason - - if isinstance(req.url, bytes): - response.url = req.url.decode('utf-8') - else: - response.url = req.url - - # Add new cookies from the server. - extract_cookies_to_jar(response.cookies, req, resp) - - # Give the Response some context. - response.request = req - response.connection = self - - return response - - 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 - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param url: The URL to connect to. - :param proxies: (optional) A Requests-style dictionary of proxies used on this request. - :rtype: urllib3.ConnectionPool - """ - proxy = select_proxy(url, proxies) - - 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_url(url) - else: - # Only scheme should be lower case - parsed = urlparse(url) - url = parsed.geturl() - conn = self.poolmanager.connection_from_url(url) - - return conn - - def close(self): - """Disposes of any internal state. - - Currently, this closes the PoolManager and any active ProxyManager, - which closes any pooled connections. - """ - self.poolmanager.clear() - for proxy in self.proxy_manager.values(): - proxy.clear() - - def request_url(self, request, proxies): - """Obtain the url to use when making the final request. - - If the message is being sent through a HTTP proxy, the full URL has to - be used. Otherwise, we should only use the path portion of the URL. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. - :rtype: str - """ - proxy = select_proxy(request.url, proxies) - scheme = urlparse(request.url).scheme - - is_proxied_http_request = (proxy and scheme != 'https') - using_socks_proxy = False - if proxy: - proxy_scheme = urlparse(proxy).scheme.lower() - using_socks_proxy = proxy_scheme.startswith('socks') - - url = request.path_url - if is_proxied_http_request and not using_socks_proxy: - url = urldefragauth(request.url) - - return url - - def add_headers(self, request, **kwargs): - """Add any headers needed by the connection. As of v2.0 this does - nothing by default, but is left for overriding by users that subclass - the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to. - :param kwargs: The keyword arguments from the call to send(). - """ - pass - - def proxy_headers(self, proxy): - """Returns a dictionary of the headers to add to any request sent - through a proxy. This works with urllib3 magic to ensure that they are - correctly sent to the proxy, rather than in a tunnelled request if - CONNECT is being used. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param proxy: The url of the proxy being used for this request. - :rtype: dict - """ - headers = {} - username, password = get_auth_from_url(proxy) - - if username: - headers['Proxy-Authorization'] = _basic_auth_str(username, - password) - - return headers - - def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) <timeouts>` tuple. - :type timeout: float or tuple or urllib3 Timeout object - :param verify: (optional) Either a boolean, in which case it controls whether - we verify the server's TLS certificate, or a string, in which case it - must be a path to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - :rtype: requests.Response - """ - - try: - conn = self.get_connection(request.url, proxies) - except LocationValueError as e: - raise InvalidURL(e, request=request) - - self.cert_verify(conn, request.url, verify, cert) - url = self.request_url(request, proxies) - self.add_headers(request, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) - - chunked = not (request.body is None or 'Content-Length' in request.headers) - - if isinstance(timeout, tuple): - try: - connect, read = timeout - timeout = TimeoutSauce(connect=connect, read=read) - except ValueError as e: - # this may raise a string formatting error. - err = ("Invalid timeout {}. Pass a (connect, read) " - "timeout tuple, or a single float to set " - "both timeouts to the same value".format(timeout)) - raise ValueError(err) - elif isinstance(timeout, TimeoutSauce): - pass - else: - timeout = TimeoutSauce(connect=timeout, read=timeout) - - try: - if not chunked: - resp = conn.urlopen( - method=request.method, - url=url, - body=request.body, - headers=request.headers, - redirect=False, - assert_same_host=False, - preload_content=False, - decode_content=False, - retries=self.max_retries, - timeout=timeout - ) - - # Send the request. - else: - if hasattr(conn, 'proxy_pool'): - conn = conn.proxy_pool - - low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT) - - try: - low_conn.putrequest(request.method, - url, - skip_accept_encoding=True) - - for header, value in request.headers.items(): - low_conn.putheader(header, value) - - low_conn.endheaders() - - for i in request.body: - low_conn.send(hex(len(i))[2:].encode('utf-8')) - low_conn.send(b'\r\n') - low_conn.send(i) - low_conn.send(b'\r\n') - low_conn.send(b'0\r\n\r\n') - - # Receive the response from the server - try: - # For Python 2.7, use buffering of HTTP responses - r = low_conn.getresponse(buffering=True) - except TypeError: - # For compatibility with Python 3.3+ - r = low_conn.getresponse() - - resp = HTTPResponse.from_httplib( - r, - pool=conn, - connection=low_conn, - preload_content=False, - decode_content=False - ) - except: - # If we hit any problems here, clean up the connection. - # Then, reraise so that we can handle the actual exception. - low_conn.close() - raise - - except (ProtocolError, socket.error) as err: - raise ConnectionError(err, request=request) - - except MaxRetryError as e: - if isinstance(e.reason, ConnectTimeoutError): - # TODO: Remove this in 3.0.0: see #2811 - if not isinstance(e.reason, NewConnectionError): - raise ConnectTimeout(e, request=request) - - if isinstance(e.reason, ResponseError): - raise RetryError(e, request=request) - - if isinstance(e.reason, _ProxyError): - raise ProxyError(e, request=request) - - if isinstance(e.reason, _SSLError): - # This branch is for urllib3 v1.22 and later. - raise SSLError(e, request=request) - - raise ConnectionError(e, request=request) - - except ClosedPoolError as e: - raise ConnectionError(e, request=request) - - except _ProxyError as e: - raise ProxyError(e) - - except (_SSLError, _HTTPError) as e: - if isinstance(e, _SSLError): - # This branch is for urllib3 versions earlier than v1.22 - raise SSLError(e, request=request) - elif isinstance(e, ReadTimeoutError): - raise ReadTimeout(e, request=request) - else: - raise - - return self.build_response(request, resp) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/api.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/api.py deleted file mode 100644 index abada96..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/api.py +++ /dev/null @@ -1,158 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.api -~~~~~~~~~~~~ - -This module implements the Requests API. - -:copyright: (c) 2012 by Kenneth Reitz. -:license: Apache2, see LICENSE for more details. -""" - -from . import sessions - - -def request(method, url, **kwargs): - """Constructs and sends a :class:`Request <Request>`. - - :param method: method for the new :class:`Request` object. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary, list of tuples or bytes to send - in the body of the :class:`Request`. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. - :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 - 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. - :param timeout: (optional) How many seconds to wait for the server to send data - before giving up, as a float, or a :ref:`(connect timeout, read - timeout) <timeouts>` tuple. - :type timeout: float or tuple - :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. - :type allow_redirects: bool - :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use. Defaults to ``True``. - :param stream: (optional) if ``False``, the response content will be immediately downloaded. - :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. - :return: :class:`Response <Response>` object - :rtype: requests.Response - - Usage:: - - >>> import requests - >>> req = requests.request('GET', 'https://httpbin.org/get') - <Response [200]> - """ - - # By using the 'with' statement we are sure the session is closed, thus we - # avoid leaving sockets open which can trigger a ResourceWarning in some - # cases, and look like a memory leak in others. - with sessions.Session() as session: - return session.request(method=method, url=url, **kwargs) - - -def get(url, params=None, **kwargs): - r"""Sends a GET request. - - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary, list of tuples or bytes to send - in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return request('get', url, params=params, **kwargs) - - -def options(url, **kwargs): - r"""Sends an OPTIONS request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return request('options', url, **kwargs) - - -def head(url, **kwargs): - r"""Sends a HEAD request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', False) - return request('head', url, **kwargs) - - -def post(url, data=None, json=None, **kwargs): - r"""Sends a POST request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json data to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request('post', url, data=data, json=json, **kwargs) - - -def put(url, data=None, **kwargs): - r"""Sends a PUT request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json data to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request('put', url, data=data, **kwargs) - - -def patch(url, data=None, **kwargs): - r"""Sends a PATCH request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json data to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request('patch', url, data=data, **kwargs) - - -def delete(url, **kwargs): - r"""Sends a DELETE request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request('delete', url, **kwargs) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/auth.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/auth.py deleted file mode 100644 index bdde51c..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/auth.py +++ /dev/null @@ -1,305 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.auth -~~~~~~~~~~~~~ - -This module contains the authentication handlers for Requests. -""" - -import os -import re -import time -import hashlib -import threading -import warnings - -from base64 import b64encode - -from .compat import urlparse, str, basestring -from .cookies import extract_cookies_to_jar -from ._internal_utils import to_native_string -from .utils import parse_dict_header - -CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' -CONTENT_TYPE_MULTI_PART = 'multipart/form-data' - - -def _basic_auth_str(username, password): - """Returns a Basic Auth string.""" - - # "I want us to put a big-ol' comment on top of it that - # says that this behaviour is dumb but we need to preserve - # it because people are relying on it." - # - Lukasa - # - # These are here solely to maintain backwards compatibility - # for things like ints. This will be removed in 3.0.0. - if not isinstance(username, basestring): - warnings.warn( - "Non-string usernames will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({!r}) to " - "a string or bytes object in the near future to avoid " - "problems.".format(username), - category=DeprecationWarning, - ) - username = str(username) - - if not isinstance(password, basestring): - warnings.warn( - "Non-string passwords will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({!r}) to " - "a string or bytes object in the near future to avoid " - "problems.".format(password), - category=DeprecationWarning, - ) - password = str(password) - # -- End Removal -- - - if isinstance(username, str): - username = username.encode('latin1') - - if isinstance(password, str): - password = password.encode('latin1') - - authstr = 'Basic ' + to_native_string( - b64encode(b':'.join((username, password))).strip() - ) - - return authstr - - -class AuthBase(object): - """Base class that all auth implementations derive from""" - - def __call__(self, r): - raise NotImplementedError('Auth hooks must be callable.') - - -class HTTPBasicAuth(AuthBase): - """Attaches HTTP Basic Authentication to the given Request object.""" - - def __init__(self, username, password): - self.username = username - self.password = password - - def __eq__(self, other): - return all([ - self.username == getattr(other, 'username', None), - self.password == getattr(other, 'password', None) - ]) - - def __ne__(self, other): - return not self == other - - def __call__(self, r): - r.headers['Authorization'] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPProxyAuth(HTTPBasicAuth): - """Attaches HTTP Proxy Authentication to a given Request object.""" - - def __call__(self, r): - r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPDigestAuth(AuthBase): - """Attaches HTTP Digest Authentication to the given Request object.""" - - def __init__(self, username, password): - self.username = username - self.password = password - # Keep state in per-thread local storage - self._thread_local = threading.local() - - def init_per_thread_state(self): - # Ensure state is initialized just once per-thread - if not hasattr(self._thread_local, 'init'): - self._thread_local.init = True - self._thread_local.last_nonce = '' - self._thread_local.nonce_count = 0 - self._thread_local.chal = {} - self._thread_local.pos = None - self._thread_local.num_401_calls = None - - def build_digest_header(self, method, url): - """ - :rtype: str - """ - - realm = self._thread_local.chal['realm'] - nonce = self._thread_local.chal['nonce'] - qop = self._thread_local.chal.get('qop') - algorithm = self._thread_local.chal.get('algorithm') - opaque = self._thread_local.chal.get('opaque') - hash_utf8 = None - - if algorithm is None: - _algorithm = 'MD5' - else: - _algorithm = algorithm.upper() - # lambdas assume digest modules are imported at the top level - if _algorithm == 'MD5' or _algorithm == 'MD5-SESS': - def md5_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.md5(x).hexdigest() - hash_utf8 = md5_utf8 - elif _algorithm == 'SHA': - def sha_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.sha1(x).hexdigest() - hash_utf8 = sha_utf8 - elif _algorithm == 'SHA-256': - def sha256_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.sha256(x).hexdigest() - hash_utf8 = sha256_utf8 - elif _algorithm == 'SHA-512': - def sha512_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.sha512(x).hexdigest() - hash_utf8 = sha512_utf8 - - KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) - - if hash_utf8 is None: - return None - - # XXX not implemented yet - entdig = None - p_parsed = urlparse(url) - #: path is request-uri defined in RFC 2616 which should not be empty - path = p_parsed.path or "/" - if p_parsed.query: - path += '?' + p_parsed.query - - A1 = '%s:%s:%s' % (self.username, realm, self.password) - A2 = '%s:%s' % (method, path) - - HA1 = hash_utf8(A1) - HA2 = hash_utf8(A2) - - if nonce == self._thread_local.last_nonce: - self._thread_local.nonce_count += 1 - else: - self._thread_local.nonce_count = 1 - ncvalue = '%08x' % self._thread_local.nonce_count - s = str(self._thread_local.nonce_count).encode('utf-8') - s += nonce.encode('utf-8') - s += time.ctime().encode('utf-8') - s += os.urandom(8) - - cnonce = (hashlib.sha1(s).hexdigest()[:16]) - if _algorithm == 'MD5-SESS': - HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) - - if not qop: - respdig = KD(HA1, "%s:%s" % (nonce, HA2)) - elif qop == 'auth' or 'auth' in qop.split(','): - noncebit = "%s:%s:%s:%s:%s" % ( - nonce, ncvalue, cnonce, 'auth', HA2 - ) - respdig = KD(HA1, noncebit) - else: - # XXX handle auth-int. - return None - - self._thread_local.last_nonce = nonce - - # XXX should the partial digests be encoded too? - base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ - 'response="%s"' % (self.username, realm, nonce, path, respdig) - if opaque: - base += ', opaque="%s"' % opaque - if algorithm: - base += ', algorithm="%s"' % algorithm - if entdig: - base += ', digest="%s"' % entdig - if qop: - base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) - - return 'Digest %s' % (base) - - def handle_redirect(self, r, **kwargs): - """Reset num_401_calls counter on redirects.""" - if r.is_redirect: - self._thread_local.num_401_calls = 1 - - def handle_401(self, r, **kwargs): - """ - Takes the given response and tries digest-auth, if needed. - - :rtype: requests.Response - """ - - # If response is not 4xx, do not auth - # See https://github.com/requests/requests/issues/3772 - if not 400 <= r.status_code < 500: - self._thread_local.num_401_calls = 1 - return r - - if self._thread_local.pos is not None: - # Rewind the file position indicator of the body to where - # it was to resend the request. - r.request.body.seek(self._thread_local.pos) - 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)) - - # Consume content and release the original connection - # to allow our new request to reuse the same one. - r.content - r.close() - prep = r.request.copy() - extract_cookies_to_jar(prep._cookies, r.request, r.raw) - prep.prepare_cookies(prep._cookies) - - prep.headers['Authorization'] = self.build_digest_header( - prep.method, prep.url) - _r = r.connection.send(prep, **kwargs) - _r.history.append(r) - _r.request = prep - - return _r - - self._thread_local.num_401_calls = 1 - return r - - def __call__(self, r): - # Initialize per-thread state, if needed - self.init_per_thread_state() - # If we have a saved nonce, skip the 401 - if self._thread_local.last_nonce: - r.headers['Authorization'] = self.build_digest_header(r.method, r.url) - try: - self._thread_local.pos = r.body.tell() - except AttributeError: - # In the case of HTTPDigestAuth being reused and the body of - # the previous request was a file-like object, pos has the - # file position of the previous body. Ensure it's set to - # None. - self._thread_local.pos = None - r.register_hook('response', self.handle_401) - r.register_hook('response', self.handle_redirect) - self._thread_local.num_401_calls = 1 - - return r - - def __eq__(self, other): - return all([ - self.username == getattr(other, 'username', None), - self.password == getattr(other, 'password', None) - ]) - - def __ne__(self, other): - return not self == other diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/certs.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/certs.py deleted file mode 100644 index 06a594e..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/certs.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -requests.certs -~~~~~~~~~~~~~~ - -This module returns the preferred default CA certificate bundle. There is -only one — the one from the certifi package. - -If you are packaging Requests, e.g., for a Linux distribution or a managed -environment, you can change the definition of where() to return a separately -packaged CA bundle. -""" -from pip._vendor.certifi import where - -if __name__ == '__main__': - print(where()) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/compat.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/compat.py deleted file mode 100644 index 6a86893..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/compat.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.compat -~~~~~~~~~~~~~~~ - -This module handles import compatibility issues between Python 2 and -Python 3. -""" - -from pip._vendor import chardet - -import sys - -# ------- -# Pythons -# ------- - -# Syntax sugar. -_ver = sys.version_info - -#: Python 2.x? -is_py2 = (_ver[0] == 2) - -#: Python 3.x? -is_py3 = (_ver[0] == 3) - -# Note: We've patched out simplejson support in pip because it prevents -# upgrading simplejson on Windows. -# try: -# import simplejson as json -# except (ImportError, SyntaxError): -# # simplejson does not support Python 3.2, it throws a SyntaxError -# # because of u'...' Unicode literals. -import json - -# --------- -# Specifics -# --------- - -if is_py2: - from urllib import ( - quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, - proxy_bypass, proxy_bypass_environment, getproxies_environment) - from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag - from urllib2 import parse_http_list - import cookielib - from Cookie import Morsel - from StringIO import StringIO - from collections import Callable, Mapping, MutableMapping, OrderedDict - - - builtin_str = str - bytes = str - str = unicode - basestring = basestring - numeric_types = (int, long, float) - integer_types = (int, long) - -elif is_py3: - from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag - from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment - from http import cookiejar as cookielib - from http.cookies import Morsel - from io import StringIO - from collections import OrderedDict - from collections.abc import Callable, Mapping, MutableMapping - - builtin_str = str - str = str - bytes = bytes - basestring = (str, bytes) - numeric_types = (int, float) - integer_types = (int,) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/cookies.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/cookies.py deleted file mode 100644 index 56fccd9..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/cookies.py +++ /dev/null @@ -1,549 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.cookies -~~~~~~~~~~~~~~~~ - -Compatibility code to be able to use `cookielib.CookieJar` with requests. - -requests.utils imports from here, so be careful with imports. -""" - -import copy -import time -import calendar - -from ._internal_utils import to_native_string -from .compat import cookielib, urlparse, urlunparse, Morsel, MutableMapping - -try: - import threading -except ImportError: - import dummy_threading as threading - - -class MockRequest(object): - """Wraps a `requests.Request` to mimic a `urllib2.Request`. - - The code in `cookielib.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. - - The original request object is read-only. The client is responsible for collecting - the new headers via `get_new_headers()` and interpreting them appropriately. You - probably want `get_cookie_header`, defined below. - """ - - def __init__(self, request): - self._r = request - self._new_headers = {} - self.type = urlparse(self._r.url).scheme - - def get_type(self): - return self.type - - def get_host(self): - return urlparse(self._r.url).netloc - - def get_origin_req_host(self): - return self.get_host() - - def get_full_url(self): - # Only return the response's URL if the user hadn't set the Host - # header - if not self._r.headers.get('Host'): - return self._r.url - # If they did set it, retrieve it and reconstruct the expected domain - host = to_native_string(self._r.headers['Host'], encoding='utf-8') - parsed = urlparse(self._r.url) - # Reconstruct the URL as we expect it - return urlunparse([ - parsed.scheme, host, parsed.path, parsed.params, parsed.query, - parsed.fragment - ]) - - def is_unverifiable(self): - return True - - def has_header(self, name): - return name in self._r.headers or name in self._new_headers - - def get_header(self, name, default=None): - 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.""" - raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") - - def add_unredirected_header(self, name, value): - self._new_headers[name] = value - - def get_new_headers(self): - return self._new_headers - - @property - def unverifiable(self): - return self.is_unverifiable() - - @property - def origin_req_host(self): - return self.get_origin_req_host() - - @property - def host(self): - return self.get_host() - - -class MockResponse(object): - """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. - """ - - def __init__(self, headers): - """Make a MockResponse for `cookielib` to read. - - :param headers: a httplib.HTTPMessage or analogous carrying the headers - """ - self._headers = headers - - def info(self): - return self._headers - - def getheaders(self, name): - self._headers.getheaders(name) - - -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 request: our own requests.Request object - :param response: urllib3.HTTPResponse object - """ - if not (hasattr(response, '_original_response') and - response._original_response): - return - # the _original_response field is the wrapped httplib.HTTPResponse object, - req = MockRequest(request) - # pull out the HTTPMessage with the headers and put it in the mock: - res = MockResponse(response._original_response.msg) - jar.extract_cookies(res, req) - - -def get_cookie_header(jar, request): - """ - Produce an appropriate Cookie header string to be sent with `request`, or None. - - :rtype: str - """ - r = MockRequest(request) - jar.add_cookie_header(r) - return r.get_new_headers().get('Cookie') - - -def remove_cookie_by_name(cookiejar, name, domain=None, path=None): - """Unsets a cookie by name, by default over all domains and paths. - - Wraps CookieJar.clear(), is O(n). - """ - clearables = [] - for cookie in cookiejar: - if cookie.name != name: - continue - if domain is not None and domain != cookie.domain: - continue - if path is not None and path != cookie.path: - continue - clearables.append((cookie.domain, cookie.path, cookie.name)) - - for domain, path, name in clearables: - cookiejar.clear(domain, path, name) - - -class CookieConflictError(RuntimeError): - """There are two cookies that meet the criteria specified in the cookie jar. - Use .get and .set and include domain and path args in order to be more specific. - """ - - -class RequestsCookieJar(cookielib.CookieJar, MutableMapping): - """Compatibility class; is a cookielib.CookieJar, but exposes a dict - interface. - - This is the CookieJar we create by default for requests and sessions that - don't specify one, since some clients may expect response.cookies and - session.cookies to support dict operations. - - Requests does not use the dict interface internally; it's just for - compatibility with external client code. All requests code should work - out of the box with externally provided instances of ``CookieJar``, e.g. - ``LWPCookieJar`` and ``FileCookieJar``. - - Unlike a regular CookieJar, this class is pickleable. - - .. warning:: dictionary operations that are normally O(1) may be O(n). - """ - - def get(self, name, default=None, domain=None, path=None): - """Dict-like get() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. - - .. warning:: operation is O(n), not O(1). - """ - try: - return self._find_no_duplicates(name, domain, path) - except KeyError: - return default - - def set(self, name, value, **kwargs): - """Dict-like set() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. - """ - # support client code that unsets cookies by assignment of a None value: - if value is None: - remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) - return - - if isinstance(value, Morsel): - c = morsel_to_cookie(value) - else: - c = create_cookie(name, value, **kwargs) - self.set_cookie(c) - return c - - def iterkeys(self): - """Dict-like iterkeys() that returns an iterator of names of cookies - from the jar. - - .. seealso:: itervalues() and iteritems(). - """ - for cookie in iter(self): - yield cookie.name - - def keys(self): - """Dict-like keys() that returns a list of names of cookies from the - jar. - - .. seealso:: values() and items(). - """ - return list(self.iterkeys()) - - def itervalues(self): - """Dict-like itervalues() that returns an iterator of values of cookies - from the jar. - - .. seealso:: iterkeys() and iteritems(). - """ - for cookie in iter(self): - yield cookie.value - - def values(self): - """Dict-like values() that returns a list of values of cookies from the - jar. - - .. seealso:: keys() and items(). - """ - return list(self.itervalues()) - - def iteritems(self): - """Dict-like iteritems() that returns an iterator of name-value tuples - from the jar. - - .. seealso:: iterkeys() and itervalues(). - """ - for cookie in iter(self): - yield cookie.name, cookie.value - - def items(self): - """Dict-like items() that returns a list of name-value tuples from the - jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a - vanilla python dict of key value pairs. - - .. seealso:: keys() and values(). - """ - return list(self.iteritems()) - - def list_domains(self): - """Utility method to list all the domains in the jar.""" - domains = [] - for cookie in iter(self): - if cookie.domain not in domains: - domains.append(cookie.domain) - return domains - - def list_paths(self): - """Utility method to list all the paths in the jar.""" - paths = [] - for cookie in iter(self): - if cookie.path not in paths: - paths.append(cookie.path) - return paths - - def multiple_domains(self): - """Returns True if there are multiple domains in the jar. - Returns False otherwise. - - :rtype: bool - """ - domains = [] - for cookie in iter(self): - if cookie.domain is not None and cookie.domain in domains: - return True - domains.append(cookie.domain) - return False # there is only one domain in jar - - def get_dict(self, domain=None, path=None): - """Takes as an argument an optional domain and path and returns a plain - old Python dict of name-value pairs of cookies that meet the - requirements. - - :rtype: dict - """ - dictionary = {} - for cookie in iter(self): - if ( - (domain is None or cookie.domain == domain) and - (path is None or cookie.path == path) - ): - dictionary[cookie.name] = cookie.value - return dictionary - - def __contains__(self, name): - try: - return super(RequestsCookieJar, self).__contains__(name) - except CookieConflictError: - return True - - def __getitem__(self, name): - """Dict-like __getitem__() for compatibility with client code. Throws - exception if there are more than one cookie with name. In that case, - use the more explicit get() method instead. - - .. warning:: operation is O(n), not O(1). - """ - return self._find_no_duplicates(name) - - def __setitem__(self, name, value): - """Dict-like __setitem__ for compatibility with client code. Throws - exception if there is already a cookie of that name in the jar. In that - case, use the more explicit set() method instead. - """ - self.set(name, value) - - def __delitem__(self, name): - """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s - ``remove_cookie_by_name()``. - """ - remove_cookie_by_name(self, name) - - def set_cookie(self, cookie, *args, **kwargs): - if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'): - cookie.value = cookie.value.replace('\\"', '') - return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs) - - def update(self, other): - """Updates this jar with cookies from another CookieJar or dict-like""" - if isinstance(other, cookielib.CookieJar): - for cookie in other: - self.set_cookie(copy.copy(cookie)) - else: - super(RequestsCookieJar, self).update(other) - - def _find(self, name, domain=None, path=None): - """Requests uses this method internally to get cookie values. - - If there are conflicting cookies, _find arbitrarily chooses one. - See _find_no_duplicates if you want an exception thrown if there are - conflicting cookies. - - :param name: a string containing name of cookie - :param domain: (optional) string containing domain of cookie - :param path: (optional) string containing path of cookie - :return: cookie.value - """ - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - return cookie.value - - raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) - - def _find_no_duplicates(self, name, domain=None, path=None): - """Both ``__get_item__`` and ``get`` call this function: it's never - used elsewhere in Requests. - - :param name: a string containing name of cookie - :param domain: (optional) string containing domain of cookie - :param path: (optional) string containing path of cookie - :raises KeyError: if cookie is not found - :raises CookieConflictError: if there are multiple cookies - that match name and optionally domain and path - :return: cookie.value - """ - toReturn = None - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - if toReturn is not None: # if there are multiple cookies that meet passed in criteria - raise CookieConflictError('There are multiple cookies with name, %r' % (name)) - toReturn = cookie.value # we will eventually return this as long as no cookie conflict - - if toReturn: - return toReturn - raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) - - def __getstate__(self): - """Unlike a normal CookieJar, this class is pickleable.""" - state = self.__dict__.copy() - # remove the unpickleable RLock object - state.pop('_cookies_lock') - return state - - def __setstate__(self, state): - """Unlike a normal CookieJar, this class is pickleable.""" - self.__dict__.update(state) - if '_cookies_lock' not in self.__dict__: - self._cookies_lock = threading.RLock() - - def copy(self): - """Return a copy of this RequestsCookieJar.""" - new_cj = RequestsCookieJar() - new_cj.set_policy(self.get_policy()) - new_cj.update(self) - return new_cj - - def get_policy(self): - """Return the CookiePolicy instance used.""" - return self._policy - - -def _copy_cookie_jar(jar): - if jar is None: - return None - - if hasattr(jar, 'copy'): - # We're dealing with an instance of RequestsCookieJar - return jar.copy() - # We're dealing with a generic CookieJar instance - new_jar = copy.copy(jar) - new_jar.clear() - for cookie in jar: - new_jar.set_cookie(copy.copy(cookie)) - return new_jar - - -def create_cookie(name, value, **kwargs): - """Make a cookie from underspecified parameters. - - By default, the pair of `name` and `value` will be set for the domain '' - and sent on every request (this is sometimes called a "supercookie"). - """ - result = { - 'version': 0, - 'name': name, - 'value': value, - 'port': None, - 'domain': '', - 'path': '/', - 'secure': False, - 'expires': None, - 'discard': True, - 'comment': None, - 'comment_url': None, - 'rest': {'HttpOnly': None}, - 'rfc2109': False, - } - - badargs = set(kwargs) - set(result) - if badargs: - err = 'create_cookie() got unexpected keyword arguments: %s' - raise TypeError(err % list(badargs)) - - result.update(kwargs) - result['port_specified'] = bool(result['port']) - result['domain_specified'] = bool(result['domain']) - result['domain_initial_dot'] = result['domain'].startswith('.') - result['path_specified'] = bool(result['path']) - - return cookielib.Cookie(**result) - - -def morsel_to_cookie(morsel): - """Convert a Morsel object into a Cookie containing the one k/v pair.""" - - expires = None - if morsel['max-age']: - try: - expires = int(time.time() + int(morsel['max-age'])) - except ValueError: - raise TypeError('max-age: %s must be integer' % morsel['max-age']) - elif morsel['expires']: - time_template = '%a, %d-%b-%Y %H:%M:%S GMT' - expires = calendar.timegm( - time.strptime(morsel['expires'], time_template) - ) - return create_cookie( - comment=morsel['comment'], - comment_url=bool(morsel['comment']), - discard=False, - domain=morsel['domain'], - expires=expires, - name=morsel.key, - path=morsel['path'], - port=None, - rest={'HttpOnly': morsel['httponly']}, - rfc2109=False, - secure=bool(morsel['secure']), - value=morsel.value, - version=morsel['version'] or 0, - ) - - -def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): - """Returns a CookieJar from a key/value dictionary. - - :param cookie_dict: Dict of key/values to insert into CookieJar. - :param cookiejar: (optional) A cookiejar to add the cookies to. - :param overwrite: (optional) If False, will not replace cookies - already in the jar with new ones. - :rtype: CookieJar - """ - if cookiejar is None: - cookiejar = RequestsCookieJar() - - if cookie_dict is not None: - names_from_jar = [cookie.name for cookie in cookiejar] - for name in cookie_dict: - if overwrite or (name not in names_from_jar): - cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) - - return cookiejar - - -def merge_cookies(cookiejar, cookies): - """Add cookies to cookiejar and returns a merged CookieJar. - - :param cookiejar: CookieJar object to add the cookies to. - :param cookies: Dictionary or CookieJar object to be added. - :rtype: CookieJar - """ - if not isinstance(cookiejar, cookielib.CookieJar): - raise ValueError('You can only merge into CookieJar') - - if isinstance(cookies, dict): - cookiejar = cookiejar_from_dict( - cookies, cookiejar=cookiejar, overwrite=False) - elif isinstance(cookies, cookielib.CookieJar): - try: - cookiejar.update(cookies) - except AttributeError: - for cookie_in_jar in cookies: - cookiejar.set_cookie(cookie_in_jar) - - return cookiejar diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/exceptions.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/exceptions.py deleted file mode 100644 index a91e1fd..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/exceptions.py +++ /dev/null @@ -1,126 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.exceptions -~~~~~~~~~~~~~~~~~~~ - -This module contains the set of Requests' exceptions. -""" -from pip._vendor.urllib3.exceptions import HTTPError as BaseHTTPError - - -class RequestException(IOError): - """There was an ambiguous exception that occurred while handling your - request. - """ - - def __init__(self, *args, **kwargs): - """Initialize RequestException with `request` and `response` objects.""" - response = kwargs.pop('response', None) - self.response = response - self.request = kwargs.pop('request', None) - if (response is not None and not self.request and - hasattr(response, 'request')): - self.request = self.response.request - super(RequestException, self).__init__(*args, **kwargs) - - -class HTTPError(RequestException): - """An HTTP error occurred.""" - - -class ConnectionError(RequestException): - """A Connection error occurred.""" - - -class ProxyError(ConnectionError): - """A proxy error occurred.""" - - -class SSLError(ConnectionError): - """An SSL error occurred.""" - - -class Timeout(RequestException): - """The request timed out. - - Catching this error will catch both - :exc:`~requests.exceptions.ConnectTimeout` and - :exc:`~requests.exceptions.ReadTimeout` errors. - """ - - -class ConnectTimeout(ConnectionError, Timeout): - """The request timed out while trying to connect to the remote server. - - Requests that produced this error are safe to retry. - """ - - -class ReadTimeout(Timeout): - """The server did not send any data in the allotted amount of time.""" - - -class URLRequired(RequestException): - """A valid URL is required to make a request.""" - - -class TooManyRedirects(RequestException): - """Too many redirects.""" - - -class MissingSchema(RequestException, ValueError): - """The URL schema (e.g. http or https) is missing.""" - - -class InvalidSchema(RequestException, ValueError): - """See defaults.py for valid schemas.""" - - -class InvalidURL(RequestException, ValueError): - """The URL provided was somehow invalid.""" - - -class InvalidHeader(RequestException, ValueError): - """The header value provided was somehow invalid.""" - - -class InvalidProxyURL(InvalidURL): - """The proxy URL provided is invalid.""" - - -class ChunkedEncodingError(RequestException): - """The server declared chunked encoding but sent an invalid chunk.""" - - -class ContentDecodingError(RequestException, BaseHTTPError): - """Failed to decode response content""" - - -class StreamConsumedError(RequestException, TypeError): - """The content for this response was already consumed""" - - -class RetryError(RequestException): - """Custom retries logic failed""" - - -class UnrewindableBodyError(RequestException): - """Requests encountered an error when trying to rewind a body""" - -# Warnings - - -class RequestsWarning(Warning): - """Base warning for Requests.""" - pass - - -class FileModeWarning(RequestsWarning, DeprecationWarning): - """A file was opened in text mode, but Requests determined its binary length.""" - pass - - -class RequestsDependencyWarning(RequestsWarning): - """An imported dependency doesn't match the expected version range.""" - pass diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/help.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/help.py deleted file mode 100644 index 3c3072b..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/help.py +++ /dev/null @@ -1,119 +0,0 @@ -"""Module containing bug report helper(s).""" -from __future__ import print_function - -import json -import platform -import sys -import ssl - -from pip._vendor import idna -from pip._vendor import urllib3 -from pip._vendor import chardet - -from . import __version__ as requests_version - -try: - from pip._vendor.urllib3.contrib import pyopenssl -except ImportError: - pyopenssl = None - OpenSSL = None - cryptography = None -else: - import OpenSSL - import cryptography - - -def _implementation(): - """Return a dict with the Python implementation and version. - - Provide both the name and the version of the Python implementation - currently running. For example, on CPython 2.7.5 it will return - {'name': 'CPython', 'version': '2.7.5'}. - - This function works best on CPython and PyPy: in particular, it probably - doesn't work for Jython or IronPython. Future investigation should be done - to work out the correct shape of the code for those platforms. - """ - implementation = platform.python_implementation() - - if implementation == 'CPython': - implementation_version = platform.python_version() - elif implementation == 'PyPy': - implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, - sys.pypy_version_info.minor, - sys.pypy_version_info.micro) - if sys.pypy_version_info.releaselevel != 'final': - implementation_version = ''.join([ - implementation_version, sys.pypy_version_info.releaselevel - ]) - elif implementation == 'Jython': - implementation_version = platform.python_version() # Complete Guess - elif implementation == 'IronPython': - implementation_version = platform.python_version() # Complete Guess - else: - implementation_version = 'Unknown' - - return {'name': implementation, 'version': implementation_version} - - -def info(): - """Generate information for a bug report.""" - try: - platform_info = { - 'system': platform.system(), - 'release': platform.release(), - } - except IOError: - platform_info = { - 'system': 'Unknown', - 'release': 'Unknown', - } - - implementation_info = _implementation() - urllib3_info = {'version': urllib3.__version__} - chardet_info = {'version': chardet.__version__} - - pyopenssl_info = { - 'version': None, - 'openssl_version': '', - } - if OpenSSL: - pyopenssl_info = { - 'version': OpenSSL.__version__, - 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, - } - cryptography_info = { - 'version': getattr(cryptography, '__version__', ''), - } - idna_info = { - 'version': getattr(idna, '__version__', ''), - } - - system_ssl = ssl.OPENSSL_VERSION_NUMBER - system_ssl_info = { - 'version': '%x' % system_ssl if system_ssl is not None else '' - } - - return { - 'platform': platform_info, - 'implementation': implementation_info, - 'system_ssl': system_ssl_info, - 'using_pyopenssl': pyopenssl is not None, - 'pyOpenSSL': pyopenssl_info, - 'urllib3': urllib3_info, - 'chardet': chardet_info, - 'cryptography': cryptography_info, - 'idna': idna_info, - 'requests': { - 'version': requests_version, - }, - } - - -def main(): - """Pretty-print the bug information as JSON.""" - print(json.dumps(info(), sort_keys=True, indent=2)) - - -if __name__ == '__main__': - main() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/hooks.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/hooks.py deleted file mode 100644 index 7a51f21..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/hooks.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.hooks -~~~~~~~~~~~~~~ - -This module provides the capabilities for the Requests hooks system. - -Available hooks: - -``response``: - The response generated from a Request. -""" -HOOKS = ['response'] - - -def default_hooks(): - return {event: [] for event in HOOKS} - -# TODO: response is the only one - - -def dispatch_hook(key, hooks, hook_data, **kwargs): - """Dispatches a hook dictionary on a given piece of data.""" - hooks = hooks or {} - hooks = hooks.get(key) - if hooks: - if hasattr(hooks, '__call__'): - hooks = [hooks] - for hook in hooks: - _hook_data = hook(hook_data, **kwargs) - if _hook_data is not None: - hook_data = _hook_data - return hook_data diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/models.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/models.py deleted file mode 100644 index 0839957..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/models.py +++ /dev/null @@ -1,953 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.models -~~~~~~~~~~~~~~~ - -This module contains the primary objects that power Requests. -""" - -import datetime -import sys - -# Import encoding now, to avoid implicit import later. -# Implicit import within threads may cause LookupError when standard library is in a ZIP, -# such as in Embedded Python. See https://github.com/requests/requests/issues/3578. -import encodings.idna - -from pip._vendor.urllib3.fields import RequestField -from pip._vendor.urllib3.filepost import encode_multipart_formdata -from pip._vendor.urllib3.util import parse_url -from pip._vendor.urllib3.exceptions import ( - DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) - -from io import UnsupportedOperation -from .hooks import default_hooks -from .structures import CaseInsensitiveDict - -from .auth import HTTPBasicAuth -from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar -from .exceptions import ( - HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, - ContentDecodingError, ConnectionError, StreamConsumedError) -from ._internal_utils import to_native_string, unicode_is_ascii -from .utils import ( - guess_filename, get_auth_from_url, requote_uri, - stream_decode_response_unicode, to_key_val_list, parse_header_links, - iter_slices, guess_json_utf, super_len, check_header_validity) -from .compat import ( - Callable, Mapping, - cookielib, urlunparse, urlsplit, urlencode, str, bytes, - is_py2, chardet, builtin_str, basestring) -from .compat import json as complexjson -from .status_codes import codes - -#: The set of HTTP status codes that indicate an automatically -#: processable redirect. -REDIRECT_STATI = ( - codes.moved, # 301 - codes.found, # 302 - codes.other, # 303 - codes.temporary_redirect, # 307 - codes.permanent_redirect, # 308 -) - -DEFAULT_REDIRECT_LIMIT = 30 -CONTENT_CHUNK_SIZE = 10 * 1024 -ITER_CHUNK_SIZE = 512 - - -class RequestEncodingMixin(object): - @property - def path_url(self): - """Build the path URL to use.""" - - url = [] - - p = urlsplit(self.url) - - path = p.path - if not path: - path = '/' - - url.append(path) - - query = p.query - if query: - url.append('?') - url.append(query) - - return ''.join(url) - - @staticmethod - def _encode_params(data): - """Encode parameters in a piece of data. - - Will successfully encode parameters when passed as a dict or a list of - 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary - if parameters are supplied as a dict. - """ - - if isinstance(data, (str, bytes)): - return data - elif hasattr(data, 'read'): - return data - elif hasattr(data, '__iter__'): - result = [] - for k, vs in to_key_val_list(data): - if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): - vs = [vs] - for v in vs: - if v is not None: - result.append( - (k.encode('utf-8') if isinstance(k, str) else k, - v.encode('utf-8') if isinstance(v, str) else v)) - return urlencode(result, doseq=True) - else: - return data - - @staticmethod - def _encode_files(files, data): - """Build the body for a multipart/form-data request. - - Will successfully encode files when passed as a dict or a list of - tuples. Order is retained if data is a list of tuples but arbitrary - if parameters are supplied as a dict. - The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) - or 4-tuples (filename, fileobj, contentype, custom_headers). - """ - if (not files): - raise ValueError("Files must be provided.") - elif isinstance(data, basestring): - raise ValueError("Data must not be a string.") - - new_fields = [] - fields = to_key_val_list(data or {}) - files = to_key_val_list(files or {}) - - for field, val in fields: - if isinstance(val, basestring) or not hasattr(val, '__iter__'): - val = [val] - for v in val: - if v is not None: - # Don't call str() on bytestrings: in Py3 it all goes wrong. - if not isinstance(v, bytes): - v = str(v) - - new_fields.append( - (field.decode('utf-8') if isinstance(field, bytes) else field, - v.encode('utf-8') if isinstance(v, str) else v)) - - for (k, v) in files: - # support for explicit filename - ft = None - fh = None - if isinstance(v, (tuple, list)): - if len(v) == 2: - fn, fp = v - elif len(v) == 3: - fn, fp, ft = v - else: - fn, fp, ft, fh = v - else: - fn = guess_filename(v) or k - fp = v - - if isinstance(fp, (str, bytes, bytearray)): - fdata = fp - elif hasattr(fp, 'read'): - fdata = fp.read() - elif fp is None: - continue - else: - fdata = fp - - rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) - rf.make_multipart(content_type=ft) - new_fields.append(rf) - - body, content_type = encode_multipart_formdata(new_fields) - - return body, content_type - - -class RequestHooksMixin(object): - def register_hook(self, event, hook): - """Properly register a hook.""" - - if event not in self.hooks: - raise ValueError('Unsupported event specified, with event name "%s"' % (event)) - - if isinstance(hook, Callable): - self.hooks[event].append(hook) - elif hasattr(hook, '__iter__'): - self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) - - def deregister_hook(self, event, hook): - """Deregister a previously registered hook. - Returns True if the hook existed, False if not. - """ - - try: - self.hooks[event].remove(hook) - return True - except ValueError: - return False - - -class Request(RequestHooksMixin): - """A user-created :class:`Request <Request>` object. - - Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server. - - :param method: HTTP method to use. - :param url: URL to send. - :param headers: dictionary of headers to send. - :param files: dictionary of {filename: fileobject} files to multipart upload. - :param data: the body to attach to the request. If a dictionary or - list of tuples ``[(key, value)]`` is provided, form-encoding will - take place. - :param json: json for the body to attach to the request (if files or data is not specified). - :param params: URL parameters to append to the URL. If a dictionary or - list of tuples ``[(key, value)]`` is provided, form-encoding will - take place. - :param auth: Auth handler or (user, pass) tuple. - :param cookies: dictionary or CookieJar of cookies to attach to this request. - :param hooks: dictionary of callback hooks, for internal usage. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'https://httpbin.org/get') - >>> req.prepare() - <PreparedRequest [GET]> - """ - - def __init__(self, - method=None, url=None, headers=None, files=None, data=None, - params=None, auth=None, cookies=None, hooks=None, json=None): - - # Default empty dicts for dict params. - data = [] if data is None else data - files = [] if files is None else files - headers = {} if headers is None else headers - params = {} if params is None else params - hooks = {} if hooks is None else hooks - - self.hooks = default_hooks() - for (k, v) in list(hooks.items()): - self.register_hook(event=k, hook=v) - - self.method = method - self.url = url - self.headers = headers - self.files = files - self.data = data - self.json = json - self.params = params - self.auth = auth - self.cookies = cookies - - def __repr__(self): - return '<Request [%s]>' % (self.method) - - def prepare(self): - """Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it.""" - p = PreparedRequest() - p.prepare( - method=self.method, - url=self.url, - headers=self.headers, - files=self.files, - data=self.data, - json=self.json, - params=self.params, - auth=self.auth, - cookies=self.cookies, - hooks=self.hooks, - ) - return p - - -class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): - """The fully mutable :class:`PreparedRequest <PreparedRequest>` object, - containing the exact bytes that will be sent to the server. - - Generated from either a :class:`Request <Request>` object or manually. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'https://httpbin.org/get') - >>> r = req.prepare() - <PreparedRequest [GET]> - - >>> s = requests.Session() - >>> s.send(r) - <Response [200]> - """ - - def __init__(self): - #: HTTP verb to send to the server. - self.method = None - #: HTTP URL to send the request to. - self.url = None - #: dictionary of HTTP headers. - self.headers = None - # The `CookieJar` used to create the Cookie header will be stored here - # after prepare_cookies is called - self._cookies = None - #: request body to send to the server. - self.body = None - #: dictionary of callback hooks, for internal usage. - self.hooks = default_hooks() - #: integer denoting starting position of a readable file-like body. - self._body_position = None - - def prepare(self, - method=None, url=None, headers=None, files=None, data=None, - params=None, auth=None, cookies=None, hooks=None, json=None): - """Prepares the entire request with the given parameters.""" - - self.prepare_method(method) - self.prepare_url(url, params) - self.prepare_headers(headers) - self.prepare_cookies(cookies) - self.prepare_body(data, files, json) - self.prepare_auth(auth, url) - - # Note that prepare_auth must be last to enable authentication schemes - # such as OAuth to work on a fully prepared request. - - # This MUST go after prepare_auth. Authenticators could add a hook - self.prepare_hooks(hooks) - - def __repr__(self): - return '<PreparedRequest [%s]>' % (self.method) - - def copy(self): - p = PreparedRequest() - p.method = self.method - p.url = self.url - p.headers = self.headers.copy() if self.headers is not None else None - p._cookies = _copy_cookie_jar(self._cookies) - p.body = self.body - p.hooks = self.hooks - p._body_position = self._body_position - return p - - def prepare_method(self, method): - """Prepares the given HTTP method.""" - self.method = method - if self.method is not None: - self.method = to_native_string(self.method.upper()) - - @staticmethod - def _get_idna_encoded_host(host): - from pip._vendor import idna - - try: - host = idna.encode(host, uts46=True).decode('utf-8') - except idna.IDNAError: - raise UnicodeError - return host - - def prepare_url(self, url, params): - """Prepares the given HTTP URL.""" - #: Accept objects that have string representations. - #: We're unable to blindly call unicode/str functions - #: as this will include the bytestring indicator (b'') - #: on python 3.x. - #: https://github.com/requests/requests/pull/2238 - if isinstance(url, bytes): - url = url.decode('utf8') - else: - url = unicode(url) if is_py2 else str(url) - - # Remove leading whitespaces from url - url = url.lstrip() - - # Don't do any URL preparation for non-HTTP schemes like `mailto`, - # `data` etc to work around exceptions from `url_parse`, which - # handles RFC 3986 only. - if ':' in url and not url.lower().startswith('http'): - self.url = url - return - - # Support for unicode domain names and paths. - try: - scheme, auth, host, port, path, query, fragment = parse_url(url) - except LocationParseError as e: - raise InvalidURL(*e.args) - - if not scheme: - error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?") - error = error.format(to_native_string(url, 'utf8')) - - raise MissingSchema(error) - - if not host: - raise InvalidURL("Invalid URL %r: No host supplied" % url) - - # In general, we want to try IDNA encoding the hostname if the string contains - # non-ASCII characters. This allows users to automatically get the correct IDNA - # behaviour. For strings containing only ASCII characters, we need to also verify - # it doesn't start with a wildcard (*), before allowing the unencoded hostname. - if not unicode_is_ascii(host): - try: - host = self._get_idna_encoded_host(host) - except UnicodeError: - raise InvalidURL('URL has an invalid label.') - elif host.startswith(u'*'): - raise InvalidURL('URL has an invalid label.') - - # Carefully reconstruct the network location - netloc = auth or '' - if netloc: - netloc += '@' - netloc += host - if port: - netloc += ':' + str(port) - - # Bare domains aren't valid URLs. - if not path: - path = '/' - - if is_py2: - if isinstance(scheme, str): - scheme = scheme.encode('utf-8') - if isinstance(netloc, str): - netloc = netloc.encode('utf-8') - if isinstance(path, str): - path = path.encode('utf-8') - if isinstance(query, str): - query = query.encode('utf-8') - if isinstance(fragment, str): - fragment = fragment.encode('utf-8') - - if isinstance(params, (str, bytes)): - params = to_native_string(params) - - enc_params = self._encode_params(params) - if enc_params: - if query: - query = '%s&%s' % (query, enc_params) - else: - query = enc_params - - url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) - self.url = url - - def prepare_headers(self, headers): - """Prepares the given HTTP headers.""" - - self.headers = CaseInsensitiveDict() - if headers: - for header in headers.items(): - # Raise exception on invalid header value. - check_header_validity(header) - name, value = header - self.headers[to_native_string(name)] = value - - def prepare_body(self, data, files, json=None): - """Prepares the given HTTP body data.""" - - # Check if file, fo, generator, iterator. - # If not, run through normal process. - - # Nottin' on you. - body = None - content_type = None - - if not data and json is not None: - # urllib3 requires a bytes-like body. Python 2's json.dumps - # provides this natively, but Python 3 gives a Unicode string. - content_type = 'application/json' - body = complexjson.dumps(json) - if not isinstance(body, bytes): - body = body.encode('utf-8') - - is_stream = all([ - hasattr(data, '__iter__'), - not isinstance(data, (basestring, list, tuple, Mapping)) - ]) - - try: - length = super_len(data) - except (TypeError, AttributeError, UnsupportedOperation): - length = None - - if is_stream: - body = data - - if getattr(body, 'tell', None) is not None: - # Record the current file position before reading. - # This will allow us to rewind a file in the event - # of a redirect. - try: - self._body_position = body.tell() - except (IOError, OSError): - # This differentiates from None, allowing us to catch - # a failed `tell()` later when trying to rewind the body - self._body_position = object() - - if files: - raise NotImplementedError('Streamed bodies and files are mutually exclusive.') - - if length: - self.headers['Content-Length'] = builtin_str(length) - else: - self.headers['Transfer-Encoding'] = 'chunked' - else: - # Multi-part file uploads. - if files: - (body, content_type) = self._encode_files(files, data) - else: - if data: - body = self._encode_params(data) - if isinstance(data, basestring) or hasattr(data, 'read'): - content_type = None - else: - content_type = 'application/x-www-form-urlencoded' - - self.prepare_content_length(body) - - # Add content-type if it wasn't explicitly provided. - if content_type and ('content-type' not in self.headers): - self.headers['Content-Type'] = content_type - - self.body = body - - def prepare_content_length(self, body): - """Prepare Content-Length header based on request method and body""" - if body is not None: - length = super_len(body) - if length: - # If length exists, set it. Otherwise, we fallback - # to Transfer-Encoding: chunked. - self.headers['Content-Length'] = builtin_str(length) - elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None: - # Set Content-Length to 0 for methods that can have a body - # but don't provide one. (i.e. not GET or HEAD) - self.headers['Content-Length'] = '0' - - def prepare_auth(self, auth, url=''): - """Prepares the given HTTP auth data.""" - - # If no Auth is explicitly provided, extract it from the URL first. - if auth is None: - url_auth = get_auth_from_url(self.url) - auth = url_auth if any(url_auth) else None - - if auth: - if isinstance(auth, tuple) and len(auth) == 2: - # special-case basic HTTP auth - auth = HTTPBasicAuth(*auth) - - # Allow auth to make its changes. - r = auth(self) - - # Update self to reflect the auth changes. - self.__dict__.update(r.__dict__) - - # Recompute Content-Length - self.prepare_content_length(self.body) - - def prepare_cookies(self, cookies): - """Prepares the given HTTP cookie data. - - This function eventually generates a ``Cookie`` header from the - given cookies using cookielib. Due to cookielib's design, the header - will not be regenerated if it already exists, meaning this function - can only be called once for the life of the - :class:`PreparedRequest <PreparedRequest>` object. Any subsequent calls - to ``prepare_cookies`` will have no actual effect, unless the "Cookie" - header is removed beforehand. - """ - if isinstance(cookies, cookielib.CookieJar): - self._cookies = cookies - else: - self._cookies = cookiejar_from_dict(cookies) - - cookie_header = get_cookie_header(self._cookies, self) - if cookie_header is not None: - self.headers['Cookie'] = cookie_header - - def prepare_hooks(self, hooks): - """Prepares the given hooks.""" - # hooks can be passed as None to the prepare method and to this - # method. To prevent iterating over None, simply use an empty list - # if hooks is False-y - hooks = hooks or [] - for event in hooks: - self.register_hook(event, hooks[event]) - - -class Response(object): - """The :class:`Response <Response>` object, which contains a - server's response to an HTTP request. - """ - - __attrs__ = [ - '_content', 'status_code', 'headers', 'url', 'history', - 'encoding', 'reason', 'cookies', 'elapsed', 'request' - ] - - def __init__(self): - self._content = False - self._content_consumed = False - self._next = None - - #: Integer Code of responded HTTP Status, e.g. 404 or 200. - self.status_code = None - - #: Case-insensitive Dictionary of Response Headers. - #: For example, ``headers['content-encoding']`` will return the - #: value of a ``'Content-Encoding'`` response header. - self.headers = CaseInsensitiveDict() - - #: File-like object representation of response (for advanced usage). - #: Use of ``raw`` requires that ``stream=True`` be set on the request. - # This requirement does not apply for use internally to Requests. - self.raw = None - - #: Final URL location of Response. - self.url = None - - #: Encoding to decode with when accessing r.text. - self.encoding = None - - #: A list of :class:`Response <Response>` objects from - #: the history of the Request. Any redirect responses will end - #: up here. The list is sorted from the oldest to the most recent request. - self.history = [] - - #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". - self.reason = None - - #: A CookieJar of Cookies the server sent back. - self.cookies = cookiejar_from_dict({}) - - #: The amount of time elapsed between sending the request - #: and the arrival of the response (as a timedelta). - #: This property specifically measures the time taken between sending - #: the first byte of the request and finishing parsing the headers. It - #: is therefore unaffected by consuming the response content or the - #: value of the ``stream`` keyword argument. - self.elapsed = datetime.timedelta(0) - - #: The :class:`PreparedRequest <PreparedRequest>` object to which this - #: is a response. - self.request = None - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def __getstate__(self): - # Consume everything; accessing the content attribute makes - # sure the content has been fully read. - if not self._content_consumed: - self.content - - return {attr: getattr(self, attr, None) for attr in self.__attrs__} - - def __setstate__(self, state): - for name, value in state.items(): - setattr(self, name, value) - - # pickled objects do not have .raw - setattr(self, '_content_consumed', True) - setattr(self, 'raw', None) - - def __repr__(self): - return '<Response [%s]>' % (self.status_code) - - def __bool__(self): - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __nonzero__(self): - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __iter__(self): - """Allows you to use a response as an iterator.""" - return self.iter_content(128) - - @property - def ok(self): - """Returns True if :attr:`status_code` is less than 400, False if not. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - try: - self.raise_for_status() - except HTTPError: - return False - return True - - @property - def is_redirect(self): - """True if this Response is a well-formed HTTP redirect that could have - been processed automatically (by :meth:`Session.resolve_redirects`). - """ - return ('location' in self.headers and self.status_code in REDIRECT_STATI) - - @property - def is_permanent_redirect(self): - """True if this Response one of the permanent versions of redirect.""" - return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) - - @property - def next(self): - """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" - return self._next - - @property - def apparent_encoding(self): - """The apparent encoding, provided by the chardet library.""" - return chardet.detect(self.content)['encoding'] - - def iter_content(self, chunk_size=1, decode_unicode=False): - """Iterates over the response data. When stream=True is set on the - request, this avoids reading the content at once into memory for - large responses. The chunk size is the number of bytes it should - read into memory. This is not necessarily the length of each item - returned as decoding can take place. - - chunk_size must be of type int or None. A value of None will - function differently depending on the value of `stream`. - stream=True will read data as it arrives in whatever size the - chunks are received. If stream=False, data is returned as - a single chunk. - - If decode_unicode is True, content will be decoded using the best - available encoding based on the response. - """ - - def generate(): - # Special case for urllib3. - if hasattr(self.raw, 'stream'): - try: - for chunk in self.raw.stream(chunk_size, decode_content=True): - yield chunk - except ProtocolError as e: - raise ChunkedEncodingError(e) - except DecodeError as e: - raise ContentDecodingError(e) - except ReadTimeoutError as e: - raise ConnectionError(e) - else: - # Standard file-like object. - while True: - chunk = self.raw.read(chunk_size) - if not chunk: - break - yield chunk - - self._content_consumed = True - - if self._content_consumed and isinstance(self._content, bool): - raise StreamConsumedError() - elif chunk_size is not None and not isinstance(chunk_size, int): - raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size)) - # simulate reading small chunks of the content - reused_chunks = iter_slices(self._content, chunk_size) - - stream_chunks = generate() - - chunks = reused_chunks if self._content_consumed else stream_chunks - - if decode_unicode: - chunks = stream_decode_response_unicode(chunks, self) - - return chunks - - def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None): - """Iterates over the response data, one line at a time. When - stream=True is set on the request, this avoids reading the - content at once into memory for large responses. - - .. note:: This method is not reentrant safe. - """ - - pending = None - - for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): - - if pending is not None: - chunk = pending + chunk - - if delimiter: - lines = chunk.split(delimiter) - else: - lines = chunk.splitlines() - - if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: - pending = lines.pop() - else: - pending = None - - for line in lines: - yield line - - if pending is not None: - yield pending - - @property - def content(self): - """Content of the response, in bytes.""" - - if self._content is False: - # Read the contents. - if self._content_consumed: - raise RuntimeError( - 'The content for this response was already consumed') - - if self.status_code == 0 or self.raw is None: - self._content = None - else: - self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b'' - - self._content_consumed = True - # don't need to release the connection; that's been handled by urllib3 - # since we exhausted the data. - return self._content - - @property - def text(self): - """Content of the response, in unicode. - - If Response.encoding is None, encoding will be guessed using - ``chardet``. - - The encoding of the response content is determined based solely on HTTP - headers, following RFC 2616 to the letter. If you can take advantage of - non-HTTP knowledge to make a better guess at the encoding, you should - set ``r.encoding`` appropriately before accessing this property. - """ - - # Try charset from content-type - content = None - encoding = self.encoding - - if not self.content: - return str('') - - # Fallback to auto-detected encoding. - if self.encoding is None: - encoding = self.apparent_encoding - - # Decode unicode from given encoding. - try: - content = str(self.content, encoding, errors='replace') - except (LookupError, TypeError): - # A LookupError is raised if the encoding was not found which could - # indicate a misspelling or similar mistake. - # - # A TypeError can be raised if encoding is None - # - # So we try blindly encoding. - content = str(self.content, errors='replace') - - return content - - def json(self, **kwargs): - r"""Returns the json-encoded content of a response, if any. - - :param \*\*kwargs: Optional arguments that ``json.loads`` takes. - :raises ValueError: If the response body does not contain valid json. - """ - - if not self.encoding and self.content and len(self.content) > 3: - # No encoding set. JSON RFC 4627 section 3 states we should expect - # UTF-8, -16 or -32. Detect which one to use; If the detection or - # decoding fails, fall back to `self.text` (using chardet to make - # a best guess). - encoding = guess_json_utf(self.content) - if encoding is not None: - try: - return complexjson.loads( - self.content.decode(encoding), **kwargs - ) - except UnicodeDecodeError: - # Wrong UTF codec detected; usually because it's not UTF-8 - # but some other 8-bit codec. This is an RFC violation, - # and the server didn't bother to tell us what codec *was* - # used. - pass - return complexjson.loads(self.text, **kwargs) - - @property - def links(self): - """Returns the parsed header links of the response, if any.""" - - header = self.headers.get('link') - - # l = MultiDict() - l = {} - - if header: - links = parse_header_links(header) - - for link in links: - key = link.get('rel') or link.get('url') - l[key] = link - - return l - - def raise_for_status(self): - """Raises stored :class:`HTTPError`, if one occurred.""" - - http_error_msg = '' - if isinstance(self.reason, bytes): - # We attempt to decode utf-8 first because some servers - # choose to localize their reason strings. If the string - # isn't utf-8, we fall back to iso-8859-1 for all other - # encodings. (See PR #3538) - try: - reason = self.reason.decode('utf-8') - except UnicodeDecodeError: - reason = self.reason.decode('iso-8859-1') - else: - reason = self.reason - - if 400 <= self.status_code < 500: - http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url) - - elif 500 <= self.status_code < 600: - http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url) - - if http_error_msg: - raise HTTPError(http_error_msg, response=self) - - def close(self): - """Releases the connection back to the pool. Once this method has been - called the underlying ``raw`` object must not be accessed again. - - *Note: Should not normally need to be called explicitly.* - """ - if not self._content_consumed: - self.raw.close() - - release_conn = getattr(self.raw, 'release_conn', None) - if release_conn is not None: - release_conn() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/packages.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/packages.py deleted file mode 100644 index 9582fa7..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/packages.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys - -# This code exists for backwards compatibility reasons. -# I don't like it either. Just look the other way. :) - -for package in ('urllib3', 'idna', 'chardet'): - vendored_package = "pip._vendor." + package - locals()[package] = __import__(vendored_package) - # This traversal is apparently necessary such that the identities are - # preserved (requests.packages.urllib3.* is urllib3.*) - for mod in list(sys.modules): - if mod == vendored_package or mod.startswith(vendored_package + '.'): - unprefixed_mod = mod[len("pip._vendor."):] - sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod] - -# Kinda cool, though, right? diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/sessions.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/sessions.py deleted file mode 100644 index d73d700..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/sessions.py +++ /dev/null @@ -1,770 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.session -~~~~~~~~~~~~~~~~ - -This module provides a Session object to manage and persist settings across -requests (cookies, auth, proxies). -""" -import os -import sys -import time -from datetime import timedelta - -from .auth import _basic_auth_str -from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse, Mapping -from .cookies import ( - cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) -from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT -from .hooks import default_hooks, dispatch_hook -from ._internal_utils import to_native_string -from .utils import to_key_val_list, default_headers, DEFAULT_PORTS -from .exceptions import ( - TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) - -from .structures import CaseInsensitiveDict -from .adapters import HTTPAdapter - -from .utils import ( - requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, - get_auth_from_url, rewind_body -) - -from .status_codes import codes - -# formerly defined here, reexposed here for backward compatibility -from .models import REDIRECT_STATI - -# Preferred clock, based on which one is more accurate on a given system. -if sys.platform == 'win32': - try: # Python 3.4+ - preferred_clock = time.perf_counter - except AttributeError: # Earlier than Python 3. - preferred_clock = time.clock -else: - preferred_clock = time.time - - -def merge_setting(request_setting, session_setting, dict_class=OrderedDict): - """Determines appropriate setting for a given request, taking into account - the explicit setting on that request, and the setting in the session. If a - setting is a dictionary, they will be merged together using `dict_class` - """ - - if session_setting is None: - return request_setting - - if request_setting is None: - return session_setting - - # Bypass if not a dictionary (e.g. verify) - if not ( - isinstance(session_setting, Mapping) and - isinstance(request_setting, Mapping) - ): - return request_setting - - merged_setting = dict_class(to_key_val_list(session_setting)) - merged_setting.update(to_key_val_list(request_setting)) - - # Remove keys that are set to None. Extract keys first to avoid altering - # the dictionary during iteration. - none_keys = [k for (k, v) in merged_setting.items() if v is None] - for key in none_keys: - del merged_setting[key] - - return merged_setting - - -def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): - """Properly merges both requests and session hooks. - - This is necessary because when request_hooks == {'response': []}, the - merge breaks Session hooks entirely. - """ - if session_hooks is None or session_hooks.get('response') == []: - return request_hooks - - if request_hooks is None or request_hooks.get('response') == []: - return session_hooks - - return merge_setting(request_hooks, session_hooks, dict_class) - - -class SessionRedirectMixin(object): - - def get_redirect_target(self, resp): - """Receives a Response. Returns a redirect URI or ``None``""" - # Due to the nature of how requests processes redirects this method will - # be called at least once upon the original response and at least twice - # on each subsequent redirect response (if any). - # If a custom mixin is used to handle this logic, it may be advantageous - # to cache the redirect location onto the response object as a private - # attribute. - if resp.is_redirect: - location = resp.headers['location'] - # Currently the underlying http module on py3 decode headers - # in latin1, but empirical evidence suggests that latin1 is very - # rarely used with non-ASCII characters in HTTP headers. - # It is more likely to get UTF8 header rather than latin1. - # This causes incorrect handling of UTF8 encoded location headers. - # To solve this, we re-encode the location in latin1. - if is_py3: - location = location.encode('latin1') - return to_native_string(location, 'utf8') - return None - - def should_strip_auth(self, old_url, new_url): - """Decide whether Authorization header should be removed when redirecting""" - old_parsed = urlparse(old_url) - new_parsed = urlparse(new_url) - if old_parsed.hostname != new_parsed.hostname: - return True - # Special case: allow http -> https redirect when using the standard - # ports. This isn't specified by RFC 7235, but is kept to avoid - # breaking backwards compatibility with older versions of requests - # that allowed any redirects on the same host. - if (old_parsed.scheme == 'http' and old_parsed.port in (80, None) - and new_parsed.scheme == 'https' and new_parsed.port in (443, None)): - return False - - # Handle default port usage corresponding to scheme. - changed_port = old_parsed.port != new_parsed.port - changed_scheme = old_parsed.scheme != new_parsed.scheme - default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) - if (not changed_scheme and old_parsed.port in default_port - and new_parsed.port in default_port): - return False - - # Standard case: root URI must match - return changed_port or changed_scheme - - def resolve_redirects(self, resp, req, stream=False, timeout=None, - verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): - """Receives a Response. Returns a generator of Responses or Requests.""" - - hist = [] # keep track of history - - url = self.get_redirect_target(resp) - previous_fragment = urlparse(req.url).fragment - while url: - prepared_request = req.copy() - - # Update history and keep track of redirects. - # resp.history must ignore the original request in this loop - hist.append(resp) - resp.history = hist[1:] - - try: - resp.content # Consume socket so it can be released - except (ChunkedEncodingError, ContentDecodingError, RuntimeError): - resp.raw.read(decode_content=False) - - if len(resp.history) >= self.max_redirects: - raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) - - # Release the connection back into the pool. - resp.close() - - # Handle redirection without scheme (see: RFC 1808 Section 4) - if url.startswith('//'): - parsed_rurl = urlparse(resp.url) - url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url) - - # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) - parsed = urlparse(url) - if parsed.fragment == '' and previous_fragment: - parsed = parsed._replace(fragment=previous_fragment) - elif parsed.fragment: - previous_fragment = parsed.fragment - url = parsed.geturl() - - # Facilitate relative 'location' headers, as allowed by RFC 7231. - # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') - # Compliant with RFC3986, we percent encode the url. - if not parsed.netloc: - url = urljoin(resp.url, requote_uri(url)) - else: - url = requote_uri(url) - - prepared_request.url = to_native_string(url) - - self.rebuild_method(prepared_request, resp) - - # https://github.com/requests/requests/issues/1084 - if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): - # https://github.com/requests/requests/issues/3490 - purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') - for header in purged_headers: - prepared_request.headers.pop(header, None) - prepared_request.body = None - - headers = prepared_request.headers - try: - del headers['Cookie'] - except KeyError: - pass - - # Extract any cookies sent on the response to the cookiejar - # in the new request. Because we've mutated our copied prepared - # request, use the old one that we haven't yet touched. - extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) - merge_cookies(prepared_request._cookies, self.cookies) - prepared_request.prepare_cookies(prepared_request._cookies) - - # Rebuild auth and proxy information. - proxies = self.rebuild_proxies(prepared_request, proxies) - self.rebuild_auth(prepared_request, resp) - - # A failed tell() sets `_body_position` to `object()`. This non-None - # value ensures `rewindable` will be True, allowing us to raise an - # UnrewindableBodyError, instead of hanging the connection. - rewindable = ( - prepared_request._body_position is not None and - ('Content-Length' in headers or 'Transfer-Encoding' in headers) - ) - - # Attempt to rewind consumed file-like object. - if rewindable: - rewind_body(prepared_request) - - # Override the original request. - req = prepared_request - - if yield_requests: - yield req - else: - - resp = self.send( - req, - stream=stream, - timeout=timeout, - verify=verify, - cert=cert, - proxies=proxies, - allow_redirects=False, - **adapter_kwargs - ) - - extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) - - # extract redirect url, if any, for the next loop - url = self.get_redirect_target(resp) - yield resp - - def rebuild_auth(self, prepared_request, response): - """When being redirected we may want to strip authentication from the - request to avoid leaking credentials. This method intelligently removes - and reapplies authentication where possible to avoid credential loss. - """ - headers = prepared_request.headers - url = prepared_request.url - - if 'Authorization' in headers and self.should_strip_auth(response.request.url, url): - # If we get redirected to a new host, we should strip out any - # authentication headers. - del headers['Authorization'] - - # .netrc might have more auth for us on our new host. - new_auth = get_netrc_auth(url) if self.trust_env else None - if new_auth is not None: - prepared_request.prepare_auth(new_auth) - - return - - def rebuild_proxies(self, prepared_request, proxies): - """This method re-evaluates the proxy configuration by considering the - environment variables. If we are redirected to a URL covered by - NO_PROXY, we strip the proxy configuration. Otherwise, we set missing - proxy keys for this URL (in case they were stripped by a previous - redirect). - - This method also replaces the Proxy-Authorization header where - necessary. - - :rtype: dict - """ - proxies = proxies if proxies is not None else {} - headers = prepared_request.headers - url = prepared_request.url - scheme = urlparse(url).scheme - new_proxies = proxies.copy() - no_proxy = proxies.get('no_proxy') - - bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy) - if self.trust_env and not bypass_proxy: - environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) - - proxy = environ_proxies.get(scheme, environ_proxies.get('all')) - - if proxy: - new_proxies.setdefault(scheme, proxy) - - if 'Proxy-Authorization' in headers: - del headers['Proxy-Authorization'] - - try: - username, password = get_auth_from_url(new_proxies[scheme]) - except KeyError: - username, password = None, None - - if username and password: - headers['Proxy-Authorization'] = _basic_auth_str(username, password) - - return new_proxies - - def rebuild_method(self, prepared_request, response): - """When being redirected we may want to change the method of the request - based on certain specs or browser behavior. - """ - method = prepared_request.method - - # https://tools.ietf.org/html/rfc7231#section-6.4.4 - if response.status_code == codes.see_other and method != 'HEAD': - method = 'GET' - - # Do what the browsers do, despite standards... - # First, turn 302s into GETs. - if response.status_code == codes.found and method != 'HEAD': - method = 'GET' - - # Second, if a POST is responded to with a 301, turn it into a GET. - # This bizarre behaviour is explained in Issue 1704. - if response.status_code == codes.moved and method == 'POST': - method = 'GET' - - prepared_request.method = method - - -class Session(SessionRedirectMixin): - """A Requests session. - - Provides cookie persistence, connection-pooling, and configuration. - - Basic Usage:: - - >>> import requests - >>> s = requests.Session() - >>> s.get('https://httpbin.org/get') - <Response [200]> - - Or as a context manager:: - - >>> with requests.Session() as s: - >>> s.get('https://httpbin.org/get') - <Response [200]> - """ - - __attrs__ = [ - 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', - 'cert', 'prefetch', 'adapters', 'stream', 'trust_env', - 'max_redirects', - ] - - def __init__(self): - - #: A case-insensitive dictionary of headers to be sent on each - #: :class:`Request <Request>` sent from this - #: :class:`Session <Session>`. - self.headers = default_headers() - - #: Default Authentication tuple or object to attach to - #: :class:`Request <Request>`. - self.auth = None - - #: Dictionary mapping protocol or protocol and host to the URL of the proxy - #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to - #: be used on each :class:`Request <Request>`. - self.proxies = {} - - #: Event-handling hooks. - self.hooks = default_hooks() - - #: Dictionary of querystring data to attach to each - #: :class:`Request <Request>`. The dictionary values may be lists for - #: representing multivalued query parameters. - self.params = {} - - #: Stream response content default. - self.stream = False - - #: SSL Verification default. - self.verify = True - - #: SSL client certificate default, if String, path to ssl client - #: cert file (.pem). If Tuple, ('cert', 'key') pair. - self.cert = None - - #: Maximum number of redirects allowed. If the request exceeds this - #: limit, a :class:`TooManyRedirects` exception is raised. - #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is - #: 30. - self.max_redirects = DEFAULT_REDIRECT_LIMIT - - #: Trust environment settings for proxy configuration, default - #: authentication and similar. - self.trust_env = True - - #: A CookieJar containing all currently outstanding cookies set on this - #: session. By default it is a - #: :class:`RequestsCookieJar <requests.cookies.RequestsCookieJar>`, but - #: may be any other ``cookielib.CookieJar`` compatible object. - self.cookies = cookiejar_from_dict({}) - - # Default connection adapters. - self.adapters = OrderedDict() - self.mount('https://', HTTPAdapter()) - self.mount('http://', HTTPAdapter()) - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def prepare_request(self, request): - """Constructs a :class:`PreparedRequest <PreparedRequest>` for - transmission and returns it. The :class:`PreparedRequest` has settings - merged from the :class:`Request <Request>` instance and those of the - :class:`Session`. - - :param request: :class:`Request` instance to prepare with this - session's settings. - :rtype: requests.PreparedRequest - """ - cookies = request.cookies or {} - - # Bootstrap CookieJar. - if not isinstance(cookies, cookielib.CookieJar): - cookies = cookiejar_from_dict(cookies) - - # Merge with session cookies - merged_cookies = merge_cookies( - merge_cookies(RequestsCookieJar(), self.cookies), cookies) - - # Set environment's basic authentication if not explicitly set. - auth = request.auth - if self.trust_env and not auth and not self.auth: - auth = get_netrc_auth(request.url) - - p = PreparedRequest() - p.prepare( - method=request.method.upper(), - url=request.url, - files=request.files, - data=request.data, - json=request.json, - headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), - params=merge_setting(request.params, self.params), - auth=merge_setting(auth, self.auth), - cookies=merged_cookies, - hooks=merge_hooks(request.hooks, self.hooks), - ) - return p - - def request(self, method, url, - params=None, data=None, headers=None, cookies=None, files=None, - auth=None, timeout=None, allow_redirects=True, proxies=None, - hooks=None, stream=None, verify=None, cert=None, json=None): - """Constructs a :class:`Request <Request>`, prepares it and sends it. - Returns :class:`Response <Response>` object. - - :param method: method for the new :class:`Request` object. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query - string for the :class:`Request`. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json to send in the body of the - :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the - :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the - :class:`Request`. - :param files: (optional) Dictionary of ``'filename': file-like-objects`` - for multipart encoding upload. - :param auth: (optional) Auth tuple or callable to enable - Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) <timeouts>` tuple. - :type timeout: float or tuple - :param allow_redirects: (optional) Set to True by default. - :type allow_redirects: bool - :param proxies: (optional) Dictionary mapping protocol or protocol and - hostname to the URL of the proxy. - :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 - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use. Defaults to ``True``. - :param cert: (optional) if String, path to ssl client cert file (.pem). - If Tuple, ('cert', 'key') pair. - :rtype: requests.Response - """ - # Create the Request. - req = Request( - method=method.upper(), - url=url, - headers=headers, - files=files, - data=data or {}, - json=json, - params=params or {}, - auth=auth, - cookies=cookies, - hooks=hooks, - ) - prep = self.prepare_request(req) - - proxies = proxies or {} - - settings = self.merge_environment_settings( - prep.url, proxies, stream, verify, cert - ) - - # Send the request. - send_kwargs = { - 'timeout': timeout, - 'allow_redirects': allow_redirects, - } - send_kwargs.update(settings) - resp = self.send(prep, **send_kwargs) - - return resp - - def get(self, url, **kwargs): - r"""Sends a GET request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return self.request('GET', url, **kwargs) - - def options(self, url, **kwargs): - r"""Sends a OPTIONS request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return self.request('OPTIONS', url, **kwargs) - - def head(self, url, **kwargs): - r"""Sends a HEAD request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', False) - return self.request('HEAD', url, **kwargs) - - def post(self, url, data=None, json=None, **kwargs): - r"""Sends a POST request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('POST', url, data=data, json=json, **kwargs) - - def put(self, url, data=None, **kwargs): - r"""Sends a PUT request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('PUT', url, data=data, **kwargs) - - def patch(self, url, data=None, **kwargs): - r"""Sends a PATCH request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('PATCH', url, data=data, **kwargs) - - def delete(self, url, **kwargs): - r"""Sends a DELETE request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('DELETE', url, **kwargs) - - def send(self, request, **kwargs): - """Send a given PreparedRequest. - - :rtype: requests.Response - """ - # Set defaults that the hooks can utilize to ensure they always have - # the correct parameters to reproduce the previous request. - kwargs.setdefault('stream', self.stream) - kwargs.setdefault('verify', self.verify) - kwargs.setdefault('cert', self.cert) - kwargs.setdefault('proxies', self.proxies) - - # It's possible that users might accidentally send a Request object. - # Guard against that specific failure case. - if isinstance(request, Request): - raise ValueError('You can only send PreparedRequests.') - - # Set up variables needed for resolve_redirects and dispatching of hooks - allow_redirects = kwargs.pop('allow_redirects', True) - stream = kwargs.get('stream') - hooks = request.hooks - - # Get the appropriate adapter to use - adapter = self.get_adapter(url=request.url) - - # Start time (approximately) of the request - start = preferred_clock() - - # Send the request - r = adapter.send(request, **kwargs) - - # Total elapsed time of the request (approximately) - elapsed = preferred_clock() - start - r.elapsed = timedelta(seconds=elapsed) - - # Response manipulation hooks - r = dispatch_hook('response', hooks, r, **kwargs) - - # 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) - - extract_cookies_to_jar(self.cookies, request, r.raw) - - # Redirect resolving generator. - gen = self.resolve_redirects(r, request, **kwargs) - - # Resolve redirects if allowed. - history = [resp for resp in gen] if allow_redirects else [] - - # Shuffle things around if there's history. - if history: - # Insert the first (original) request at the start - history.insert(0, r) - # Get the last request made - r = history.pop() - r.history = history - - # If redirects aren't being followed, store the response on the Request for Response.next(). - if not allow_redirects: - try: - r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs)) - except StopIteration: - pass - - if not stream: - r.content - - return r - - def merge_environment_settings(self, url, proxies, stream, verify, cert): - """ - Check the environment and merge it with some settings. - - :rtype: dict - """ - # Gather clues from the surrounding environment. - if self.trust_env: - # 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(): - proxies.setdefault(k, v) - - # Look for requests environment configuration and be compatible - # with cURL. - if verify is True or verify is None: - verify = (os.environ.get('REQUESTS_CA_BUNDLE') or - os.environ.get('CURL_CA_BUNDLE')) - - # Merge all the kwargs. - proxies = merge_setting(proxies, self.proxies) - stream = merge_setting(stream, self.stream) - verify = merge_setting(verify, self.verify) - cert = merge_setting(cert, self.cert) - - return {'verify': verify, 'proxies': proxies, 'stream': stream, - 'cert': cert} - - def get_adapter(self, url): - """ - Returns the appropriate connection adapter for the given URL. - - :rtype: requests.adapters.BaseAdapter - """ - for (prefix, adapter) in self.adapters.items(): - - if url.lower().startswith(prefix.lower()): - return adapter - - # Nothing matches :-/ - raise InvalidSchema("No connection adapters were found for '%s'" % url) - - def close(self): - """Closes all adapters and as such the session""" - for v in self.adapters.values(): - v.close() - - def mount(self, prefix, adapter): - """Registers a connection adapter to a prefix. - - Adapters are sorted in descending order by prefix length. - """ - self.adapters[prefix] = adapter - keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] - - for key in keys_to_move: - self.adapters[key] = self.adapters.pop(key) - - def __getstate__(self): - state = {attr: getattr(self, attr, None) for attr in self.__attrs__} - return state - - def __setstate__(self, state): - for attr, value in state.items(): - setattr(self, attr, value) - - -def session(): - """ - Returns a :class:`Session` for context-management. - - .. deprecated:: 1.0.0 - - This method has been deprecated since version 1.0.0 and is only kept for - backwards compatibility. New code should use :class:`~requests.sessions.Session` - to create a session. This may be removed at a future date. - - :rtype: Session - """ - return Session() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/status_codes.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/status_codes.py deleted file mode 100644 index 813e8c4..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/status_codes.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- - -r""" -The ``codes`` object defines a mapping from common names for HTTP statuses -to their numerical codes, accessible either as attributes or as dictionary -items. - ->>> requests.codes['temporary_redirect'] -307 ->>> requests.codes.teapot -418 ->>> requests.codes['\o/'] -200 - -Some codes have multiple names, and both upper- and lower-case versions of -the names are allowed. For example, ``codes.ok``, ``codes.OK``, and -``codes.okay`` all correspond to the HTTP status code 200. -""" - -from .structures import LookupDict - -_codes = { - - # Informational. - 100: ('continue',), - 101: ('switching_protocols',), - 102: ('processing',), - 103: ('checkpoint',), - 122: ('uri_too_long', 'request_uri_too_long'), - 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), - 201: ('created',), - 202: ('accepted',), - 203: ('non_authoritative_info', 'non_authoritative_information'), - 204: ('no_content',), - 205: ('reset_content', 'reset'), - 206: ('partial_content', 'partial'), - 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), - 208: ('already_reported',), - 226: ('im_used',), - - # Redirection. - 300: ('multiple_choices',), - 301: ('moved_permanently', 'moved', '\\o-'), - 302: ('found',), - 303: ('see_other', 'other'), - 304: ('not_modified',), - 305: ('use_proxy',), - 306: ('switch_proxy',), - 307: ('temporary_redirect', 'temporary_moved', 'temporary'), - 308: ('permanent_redirect', - 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 - - # Client Error. - 400: ('bad_request', 'bad'), - 401: ('unauthorized',), - 402: ('payment_required', 'payment'), - 403: ('forbidden',), - 404: ('not_found', '-o-'), - 405: ('method_not_allowed', 'not_allowed'), - 406: ('not_acceptable',), - 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), - 408: ('request_timeout', 'timeout'), - 409: ('conflict',), - 410: ('gone',), - 411: ('length_required',), - 412: ('precondition_failed', 'precondition'), - 413: ('request_entity_too_large',), - 414: ('request_uri_too_large',), - 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), - 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), - 417: ('expectation_failed',), - 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), - 421: ('misdirected_request',), - 422: ('unprocessable_entity', 'unprocessable'), - 423: ('locked',), - 424: ('failed_dependency', 'dependency'), - 425: ('unordered_collection', 'unordered'), - 426: ('upgrade_required', 'upgrade'), - 428: ('precondition_required', 'precondition'), - 429: ('too_many_requests', 'too_many'), - 431: ('header_fields_too_large', 'fields_too_large'), - 444: ('no_response', 'none'), - 449: ('retry_with', 'retry'), - 450: ('blocked_by_windows_parental_controls', 'parental_controls'), - 451: ('unavailable_for_legal_reasons', 'legal_reasons'), - 499: ('client_closed_request',), - - # Server Error. - 500: ('internal_server_error', 'server_error', '/o\\', '✗'), - 501: ('not_implemented',), - 502: ('bad_gateway',), - 503: ('service_unavailable', 'unavailable'), - 504: ('gateway_timeout',), - 505: ('http_version_not_supported', 'http_version'), - 506: ('variant_also_negotiates',), - 507: ('insufficient_storage',), - 509: ('bandwidth_limit_exceeded', 'bandwidth'), - 510: ('not_extended',), - 511: ('network_authentication_required', 'network_auth', 'network_authentication'), -} - -codes = LookupDict(name='status_codes') - -def _init(): - for code, titles in _codes.items(): - for title in titles: - setattr(codes, title, code) - if not title.startswith(('\\', '/')): - setattr(codes, title.upper(), code) - - def doc(code): - names = ', '.join('``%s``' % n for n in _codes[code]) - return '* %d: %s' % (code, names) - - global __doc__ - __doc__ = (__doc__ + '\n' + - '\n'.join(doc(code) for code in sorted(_codes)) - if __doc__ is not None else None) - -_init() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/structures.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/structures.py deleted file mode 100644 index da930e2..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/structures.py +++ /dev/null @@ -1,103 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.structures -~~~~~~~~~~~~~~~~~~~ - -Data structures that power Requests. -""" - -from .compat import OrderedDict, Mapping, MutableMapping - - -class CaseInsensitiveDict(MutableMapping): - """A case-insensitive ``dict``-like object. - - Implements all methods and operations of - ``MutableMapping`` as well as dict's ``copy``. Also - provides ``lower_items``. - - All keys are expected to be strings. The structure remembers the - case of the last key to be set, and ``iter(instance)``, - ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` - will contain case-sensitive keys. However, querying and contains - testing is case insensitive:: - - cid = CaseInsensitiveDict() - cid['Accept'] = 'application/json' - cid['aCCEPT'] == 'application/json' # True - list(cid) == ['Accept'] # True - - For example, ``headers['content-encoding']`` will return the - value of a ``'Content-Encoding'`` response header, regardless - of how the header name was originally stored. - - If the constructor, ``.update``, or equality comparison - operations are given keys that have equal ``.lower()``s, the - behavior is undefined. - """ - - def __init__(self, data=None, **kwargs): - self._store = OrderedDict() - if data is None: - data = {} - self.update(data, **kwargs) - - def __setitem__(self, key, value): - # Use the lowercased key for lookups, but store the actual - # key alongside the value. - self._store[key.lower()] = (key, value) - - def __getitem__(self, key): - return self._store[key.lower()][1] - - def __delitem__(self, key): - del self._store[key.lower()] - - def __iter__(self): - return (casedkey for casedkey, mappedvalue in self._store.values()) - - def __len__(self): - return len(self._store) - - def lower_items(self): - """Like iteritems(), but with all lowercase keys.""" - return ( - (lowerkey, keyval[1]) - for (lowerkey, keyval) - in self._store.items() - ) - - def __eq__(self, other): - if isinstance(other, Mapping): - other = CaseInsensitiveDict(other) - else: - return NotImplemented - # Compare insensitively - return dict(self.lower_items()) == dict(other.lower_items()) - - # Copy is required - def copy(self): - return CaseInsensitiveDict(self._store.values()) - - def __repr__(self): - return str(dict(self.items())) - - -class LookupDict(dict): - """Dictionary lookup object.""" - - def __init__(self, name=None): - self.name = name - super(LookupDict, self).__init__() - - def __repr__(self): - return '<lookup \'%s\'>' % (self.name) - - def __getitem__(self, key): - # We allow fall-through here, so values default to None - - return self.__dict__.get(key, None) - - def get(self, key, default=None): - return self.__dict__.get(key, default) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/utils.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/utils.py deleted file mode 100644 index 8170a8d..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/utils.py +++ /dev/null @@ -1,977 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.utils -~~~~~~~~~~~~~~ - -This module provides utility functions that are used within Requests -that are also useful for external consumption. -""" - -import codecs -import contextlib -import io -import os -import re -import socket -import struct -import sys -import tempfile -import warnings -import zipfile - -from .__version__ import __version__ -from . import certs -# to_native_string is unused here, but imported here for backwards compatibility -from ._internal_utils import to_native_string -from .compat import parse_http_list as _parse_list_header -from .compat import ( - quote, urlparse, bytes, str, OrderedDict, unquote, getproxies, - proxy_bypass, urlunparse, basestring, integer_types, is_py3, - proxy_bypass_environment, getproxies_environment, Mapping) -from .cookies import cookiejar_from_dict -from .structures import CaseInsensitiveDict -from .exceptions import ( - InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError) - -NETRC_FILES = ('.netrc', '_netrc') - -DEFAULT_CA_BUNDLE_PATH = certs.where() - -DEFAULT_PORTS = {'http': 80, 'https': 443} - - -if sys.platform == 'win32': - # provide a proxy_bypass version on Windows without DNS lookups - - def proxy_bypass_registry(host): - try: - if is_py3: - import winreg - else: - import _winreg as winreg - except ImportError: - return False - - try: - internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, - r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') - # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it - proxyEnable = int(winreg.QueryValueEx(internetSettings, - 'ProxyEnable')[0]) - # ProxyOverride is almost always a string - proxyOverride = winreg.QueryValueEx(internetSettings, - 'ProxyOverride')[0] - except OSError: - return False - if not proxyEnable or not proxyOverride: - return False - - # make a check value list from the registry entry: replace the - # '<local>' string by the localhost entry and the corresponding - # canonical entry. - proxyOverride = proxyOverride.split(';') - # now check if we match one of the registry values. - for test in proxyOverride: - if test == '<local>': - if '.' not in host: - return True - test = test.replace(".", r"\.") # mask dots - test = test.replace("*", r".*") # change glob sequence - test = test.replace("?", r".") # change glob char - if re.match(test, host, re.I): - return True - return False - - def proxy_bypass(host): # noqa - """Return True, if the host should be bypassed. - - Checks proxy settings gathered from the environment, if specified, - or the registry. - """ - if getproxies_environment(): - return proxy_bypass_environment(host) - else: - return proxy_bypass_registry(host) - - -def dict_to_sequence(d): - """Returns an internal sequence dictionary update.""" - - if hasattr(d, 'items'): - d = d.items() - - return d - - -def super_len(o): - total_length = None - current_position = 0 - - if hasattr(o, '__len__'): - total_length = len(o) - - elif hasattr(o, 'len'): - total_length = o.len - - elif hasattr(o, 'fileno'): - try: - fileno = o.fileno() - except io.UnsupportedOperation: - pass - else: - total_length = os.fstat(fileno).st_size - - # Having used fstat to determine the file length, we need to - # confirm that this file was opened up in binary mode. - if 'b' not in o.mode: - warnings.warn(( - "Requests has determined the content-length for this " - "request using the binary size of the file: however, the " - "file has been opened in text mode (i.e. without the 'b' " - "flag in the mode). This may lead to an incorrect " - "content-length. In Requests 3.0, support will be removed " - "for files in text mode."), - FileModeWarning - ) - - if hasattr(o, 'tell'): - try: - current_position = o.tell() - except (OSError, IOError): - # This can happen in some weird situations, such as when the file - # is actually a special file descriptor like stdin. In this - # instance, we don't know what the length is, so set it to zero and - # let requests chunk it instead. - if total_length is not None: - current_position = total_length - else: - if hasattr(o, 'seek') and total_length is None: - # StringIO and BytesIO have seek but no useable fileno - try: - # seek to end of file - o.seek(0, 2) - total_length = o.tell() - - # seek back to current position to support - # partially read file-like objects - o.seek(current_position or 0) - except (OSError, IOError): - total_length = 0 - - if total_length is None: - total_length = 0 - - return max(0, total_length - current_position) - - -def get_netrc_auth(url, raise_errors=False): - """Returns the Requests tuple auth for a given url from netrc.""" - - try: - from netrc import netrc, NetrcParseError - - netrc_path = None - - for f in NETRC_FILES: - try: - loc = os.path.expanduser('~/{}'.format(f)) - except KeyError: - # os.path.expanduser can fail when $HOME is undefined and - # getpwuid fails. See https://bugs.python.org/issue20164 & - # https://github.com/requests/requests/issues/1846 - return - - if os.path.exists(loc): - netrc_path = loc - break - - # Abort early if there isn't one. - if netrc_path is None: - return - - ri = urlparse(url) - - # Strip port numbers from netloc. This weird `if...encode`` dance is - # used for Python 3.2, which doesn't support unicode literals. - splitstr = b':' - if isinstance(url, str): - splitstr = splitstr.decode('ascii') - host = ri.netloc.split(splitstr)[0] - - try: - _netrc = netrc(netrc_path).authenticators(host) - if _netrc: - # Return with login / password - login_i = (0 if _netrc[0] else 1) - return (_netrc[login_i], _netrc[2]) - except (NetrcParseError, IOError): - # If there was a parsing error or a permissions issue reading the file, - # we'll just skip netrc auth unless explicitly asked to raise errors. - if raise_errors: - raise - - # AppEngine hackiness. - except (ImportError, AttributeError): - pass - - -def guess_filename(obj): - """Tries to guess the filename of the given object.""" - name = getattr(obj, 'name', None) - if (name and isinstance(name, basestring) and name[0] != '<' and - name[-1] != '>'): - return os.path.basename(name) - - -def extract_zipped_paths(path): - """Replace nonexistent paths that look like they refer to a member of a zip - archive with the location of an extracted copy of the target, or else - just return the provided path unchanged. - """ - if os.path.exists(path): - # this is already a valid path, no need to do anything further - return path - - # find the first valid part of the provided path and treat that as a zip archive - # assume the rest of the path is the name of a member in the archive - archive, member = os.path.split(path) - while archive and not os.path.exists(archive): - archive, prefix = os.path.split(archive) - member = '/'.join([prefix, member]) - - if not zipfile.is_zipfile(archive): - return path - - zip_file = zipfile.ZipFile(archive) - if member not in zip_file.namelist(): - return path - - # we have a valid zip archive and a valid member of that archive - tmp = tempfile.gettempdir() - extracted_path = os.path.join(tmp, *member.split('/')) - if not os.path.exists(extracted_path): - extracted_path = zip_file.extract(member, path=tmp) - - return extracted_path - - -def from_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. Unless it can not be represented as such, return an - OrderedDict, e.g., - - :: - - >>> from_key_val_list([('key', 'val')]) - OrderedDict([('key', 'val')]) - >>> from_key_val_list('string') - ValueError: cannot encode objects that are not 2-tuples - >>> from_key_val_list({'key': 'val'}) - OrderedDict([('key', 'val')]) - - :rtype: OrderedDict - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError('cannot encode objects that are not 2-tuples') - - return OrderedDict(value) - - -def to_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. If it can be, return a list of tuples, e.g., - - :: - - >>> to_key_val_list([('key', 'val')]) - [('key', 'val')] - >>> to_key_val_list({'key': 'val'}) - [('key', 'val')] - >>> to_key_val_list('string') - ValueError: cannot encode objects that are not 2-tuples. - - :rtype: list - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError('cannot encode objects that are not 2-tuples') - - if isinstance(value, Mapping): - value = value.items() - - return list(value) - - -# From mitsuhiko/werkzeug (used with permission). -def parse_list_header(value): - """Parse lists as described by RFC 2068 Section 2. - - In particular, parse comma-separated lists where the elements of - the list may include quoted-strings. A quoted-string could - contain a comma. A non-quoted string could have quotes in the - middle. Quotes are removed automatically after parsing. - - It basically works like :func:`parse_set_header` just that items - may appear multiple times and case sensitivity is preserved. - - The return value is a standard :class:`list`: - - >>> parse_list_header('token, "quoted value"') - ['token', 'quoted value'] - - To create a header from the :class:`list` again, use the - :func:`dump_header` function. - - :param value: a string with a list header. - :return: :class:`list` - :rtype: list - """ - result = [] - for item in _parse_list_header(value): - if item[:1] == item[-1:] == '"': - item = unquote_header_value(item[1:-1]) - result.append(item) - return result - - -# From mitsuhiko/werkzeug (used with permission). -def parse_dict_header(value): - """Parse lists of key, value pairs as described by RFC 2068 Section 2 and - convert them into a python dict: - - >>> d = parse_dict_header('foo="is a fish", bar="as well"') - >>> type(d) is dict - True - >>> sorted(d.items()) - [('bar', 'as well'), ('foo', 'is a fish')] - - If there is no value for a key it will be `None`: - - >>> parse_dict_header('key_without_value') - {'key_without_value': None} - - To create a header from the :class:`dict` again, use the - :func:`dump_header` function. - - :param value: a string with a dict header. - :return: :class:`dict` - :rtype: dict - """ - result = {} - for item in _parse_list_header(value): - if '=' not in item: - result[item] = None - continue - name, value = item.split('=', 1) - if value[:1] == value[-1:] == '"': - value = unquote_header_value(value[1:-1]) - result[name] = value - return result - - -# From mitsuhiko/werkzeug (used with permission). -def unquote_header_value(value, is_filename=False): - r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). - This does not use the real unquoting but what browsers are actually - using for quoting. - - :param value: the header value to unquote. - :rtype: str - """ - if value and value[0] == value[-1] == '"': - # this is not the real unquoting, but fixing this so that the - # RFC is met will result in bugs with internet explorer and - # probably some other browsers as well. IE for example is - # uploading files with "C:\foo\bar.txt" as filename - value = value[1:-1] - - # if this is a filename and the starting characters look like - # a UNC path, then just return the value without quotes. Using the - # replace sequence below on a UNC path has the effect of turning - # the leading double slash into a single slash and then - # _fix_ie_filename() doesn't work correctly. See #458. - if not is_filename or value[:2] != '\\\\': - return value.replace('\\\\', '\\').replace('\\"', '"') - return value - - -def dict_from_cookiejar(cj): - """Returns a key/value dictionary from a CookieJar. - - :param cj: CookieJar object to extract cookies from. - :rtype: dict - """ - - cookie_dict = {} - - for cookie in cj: - cookie_dict[cookie.name] = cookie.value - - return cookie_dict - - -def add_dict_to_cookiejar(cj, cookie_dict): - """Returns a CookieJar from a key/value dictionary. - - :param cj: CookieJar to insert cookies into. - :param cookie_dict: Dict of key/values to insert into CookieJar. - :rtype: CookieJar - """ - - return cookiejar_from_dict(cookie_dict, cj) - - -def get_encodings_from_content(content): - """Returns encodings from given content string. - - :param content: bytestring to extract encodings from. - """ - warnings.warn(( - 'In requests 3.0, get_encodings_from_content will be removed. For ' - 'more information, please see the discussion on issue #2266. (This' - ' warning should only appear once.)'), - DeprecationWarning) - - charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I) - pragma_re = re.compile(r'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I) - xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') - - return (charset_re.findall(content) + - pragma_re.findall(content) + - xml_re.findall(content)) - - -def _parse_content_type_header(header): - """Returns content type and parameters from given header - - :param header: string - :return: tuple containing content type and dictionary of - parameters - """ - - tokens = header.split(';') - content_type, params = tokens[0].strip(), tokens[1:] - params_dict = {} - items_to_strip = "\"' " - - for param in params: - param = param.strip() - if param: - key, value = param, True - index_of_equals = param.find("=") - if index_of_equals != -1: - key = param[:index_of_equals].strip(items_to_strip) - value = param[index_of_equals + 1:].strip(items_to_strip) - params_dict[key.lower()] = value - return content_type, params_dict - - -def get_encoding_from_headers(headers): - """Returns encodings from given HTTP Header Dict. - - :param headers: dictionary to extract encoding from. - :rtype: str - """ - - content_type = headers.get('content-type') - - if not content_type: - return None - - content_type, params = _parse_content_type_header(content_type) - - if 'charset' in params: - return params['charset'].strip("'\"") - - if 'text' in content_type: - return 'ISO-8859-1' - - -def stream_decode_response_unicode(iterator, r): - """Stream decodes a iterator.""" - - if r.encoding is None: - for item in iterator: - yield item - return - - decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') - for chunk in iterator: - rv = decoder.decode(chunk) - if rv: - yield rv - rv = decoder.decode(b'', final=True) - if rv: - yield rv - - -def iter_slices(string, slice_length): - """Iterate over slices of a string.""" - pos = 0 - if slice_length is None or slice_length <= 0: - slice_length = len(string) - while pos < len(string): - yield string[pos:pos + slice_length] - pos += slice_length - - -def get_unicode_from_response(r): - """Returns the requested content back in unicode. - - :param r: Response object to get unicode content from. - - Tried: - - 1. charset from content-type - 2. fall back and replace all unicode characters - - :rtype: str - """ - warnings.warn(( - 'In requests 3.0, get_unicode_from_response will be removed. For ' - 'more information, please see the discussion on issue #2266. (This' - ' warning should only appear once.)'), - DeprecationWarning) - - tried_encodings = [] - - # Try charset from content-type - encoding = get_encoding_from_headers(r.headers) - - if encoding: - try: - return str(r.content, encoding) - except UnicodeError: - tried_encodings.append(encoding) - - # Fall back: - try: - return str(r.content, encoding, errors='replace') - except TypeError: - return r.content - - -# The unreserved URI characters (RFC 3986) -UNRESERVED_SET = frozenset( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") - - -def unquote_unreserved(uri): - """Un-escape any percent-escape sequences in a URI that are unreserved - characters. This leaves all reserved, illegal and non-ASCII bytes encoded. - - :rtype: str - """ - parts = uri.split('%') - for i in range(1, len(parts)): - h = parts[i][0:2] - if len(h) == 2 and h.isalnum(): - try: - c = chr(int(h, 16)) - except ValueError: - raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) - - if c in UNRESERVED_SET: - parts[i] = c + parts[i][2:] - else: - parts[i] = '%' + parts[i] - else: - parts[i] = '%' + parts[i] - return ''.join(parts) - - -def requote_uri(uri): - """Re-quote the given URI. - - This function passes the given URI through an unquote/quote cycle to - ensure that it is fully and consistently quoted. - - :rtype: str - """ - safe_with_percent = "!#$%&'()*+,/:;=?@[]~" - safe_without_percent = "!#$&'()*+,/:;=?@[]~" - try: - # Unquote only the unreserved characters - # Then quote only illegal characters (do not quote reserved, - # unreserved, or '%') - return quote(unquote_unreserved(uri), safe=safe_with_percent) - except InvalidURL: - # We couldn't unquote the given URI, so let's try quoting it, but - # there may be unquoted '%'s in the URI. We need to make sure they're - # properly quoted so they do not cause issues elsewhere. - return quote(uri, safe=safe_without_percent) - - -def address_in_network(ip, net): - """This function allows you to check if an IP belongs to a network subnet - - Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 - returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 - - :rtype: bool - """ - ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] - netaddr, bits = net.split('/') - netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0] - network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask - return (ipaddr & netmask) == (network & netmask) - - -def dotted_netmask(mask): - """Converts mask from /xx format to xxx.xxx.xxx.xxx - - Example: if mask is 24 function returns 255.255.255.0 - - :rtype: str - """ - bits = 0xffffffff ^ (1 << 32 - mask) - 1 - return socket.inet_ntoa(struct.pack('>I', bits)) - - -def is_ipv4_address(string_ip): - """ - :rtype: bool - """ - try: - socket.inet_aton(string_ip) - except socket.error: - return False - return True - - -def is_valid_cidr(string_network): - """ - Very simple check of the cidr format in no_proxy variable. - - :rtype: bool - """ - if string_network.count('/') == 1: - try: - mask = int(string_network.split('/')[1]) - except ValueError: - return False - - if mask < 1 or mask > 32: - return False - - try: - socket.inet_aton(string_network.split('/')[0]) - except socket.error: - return False - else: - return False - return True - - -@contextlib.contextmanager -def set_environ(env_name, value): - """Set the environment variable 'env_name' to 'value' - - Save previous value, yield, and then restore the previous value stored in - the environment variable 'env_name'. - - If 'value' is None, do nothing""" - value_changed = value is not None - if value_changed: - old_value = os.environ.get(env_name) - os.environ[env_name] = value - try: - yield - finally: - if value_changed: - if old_value is None: - del os.environ[env_name] - else: - os.environ[env_name] = old_value - - -def should_bypass_proxies(url, no_proxy): - """ - Returns whether we should bypass proxies or not. - - :rtype: bool - """ - # Prioritize lowercase environment variables over uppercase - # to keep a consistent behaviour with other http projects (curl, wget). - get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) - - # First check whether no_proxy is defined. If it is, check that the URL - # we're getting isn't in the no_proxy list. - no_proxy_arg = no_proxy - if no_proxy is None: - no_proxy = get_proxy('no_proxy') - parsed = urlparse(url) - - if parsed.hostname is None: - # URLs don't always have hostnames, e.g. file:/// urls. - return True - - if no_proxy: - # We need to check whether we match here. We need to see if we match - # the end of the hostname, both with and without the port. - no_proxy = ( - host for host in no_proxy.replace(' ', '').split(',') if host - ) - - if is_ipv4_address(parsed.hostname): - for proxy_ip in no_proxy: - if is_valid_cidr(proxy_ip): - if address_in_network(parsed.hostname, proxy_ip): - return True - elif parsed.hostname == proxy_ip: - # If no_proxy ip was defined in plain IP notation instead of cidr notation & - # matches the IP of the index - return True - else: - host_with_port = parsed.hostname - if parsed.port: - host_with_port += ':{}'.format(parsed.port) - - for host in no_proxy: - if parsed.hostname.endswith(host) or host_with_port.endswith(host): - # The URL does match something in no_proxy, so we don't want - # to apply the proxies on this URL. - return True - - with set_environ('no_proxy', no_proxy_arg): - # parsed.hostname can be `None` in cases such as a file URI. - try: - bypass = proxy_bypass(parsed.hostname) - except (TypeError, socket.gaierror): - bypass = False - - if bypass: - return True - - return False - - -def get_environ_proxies(url, no_proxy=None): - """ - Return a dict of environment proxies. - - :rtype: dict - """ - if should_bypass_proxies(url, no_proxy=no_proxy): - return {} - else: - return getproxies() - - -def select_proxy(url, proxies): - """Select a proxy for the url, if applicable. - - :param url: The url being for the request - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs - """ - proxies = proxies or {} - urlparts = urlparse(url) - if urlparts.hostname is None: - return proxies.get(urlparts.scheme, proxies.get('all')) - - proxy_keys = [ - urlparts.scheme + '://' + urlparts.hostname, - urlparts.scheme, - 'all://' + urlparts.hostname, - 'all', - ] - proxy = None - for proxy_key in proxy_keys: - if proxy_key in proxies: - proxy = proxies[proxy_key] - break - - return proxy - - -def default_user_agent(name="python-requests"): - """ - Return a string representing the default user agent. - - :rtype: str - """ - return '%s/%s' % (name, __version__) - - -def default_headers(): - """ - :rtype: requests.structures.CaseInsensitiveDict - """ - return CaseInsensitiveDict({ - 'User-Agent': default_user_agent(), - 'Accept-Encoding': ', '.join(('gzip', 'deflate')), - 'Accept': '*/*', - 'Connection': 'keep-alive', - }) - - -def parse_header_links(value): - """Return a list of parsed link headers proxies. - - i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg" - - :rtype: list - """ - - links = [] - - replace_chars = ' \'"' - - value = value.strip(replace_chars) - if not value: - return links - - for val in re.split(', *<', value): - try: - url, params = val.split(';', 1) - except ValueError: - url, params = val, '' - - link = {'url': url.strip('<> \'"')} - - for param in params.split(';'): - try: - key, value = param.split('=') - except ValueError: - break - - link[key.strip(replace_chars)] = value.strip(replace_chars) - - links.append(link) - - return links - - -# Null bytes; no need to recreate these on each call to guess_json_utf -_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 -_null2 = _null * 2 -_null3 = _null * 3 - - -def guess_json_utf(data): - """ - :rtype: str - """ - # JSON always starts with two ASCII characters, so detection is as - # easy as counting the nulls and from their location and count - # determine the encoding. Also detect a BOM, if present. - sample = data[:4] - if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): - return 'utf-32' # BOM included - if sample[:3] == codecs.BOM_UTF8: - return 'utf-8-sig' # BOM included, MS style (discouraged) - if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): - return 'utf-16' # BOM included - nullcount = sample.count(_null) - if nullcount == 0: - return 'utf-8' - if nullcount == 2: - if sample[::2] == _null2: # 1st and 3rd are null - return 'utf-16-be' - if sample[1::2] == _null2: # 2nd and 4th are null - return 'utf-16-le' - # Did not detect 2 valid UTF-16 ascii-range characters - if nullcount == 3: - if sample[:3] == _null3: - return 'utf-32-be' - if sample[1:] == _null3: - return 'utf-32-le' - # Did not detect a valid UTF-32 ascii-range character - return None - - -def prepend_scheme_if_needed(url, new_scheme): - """Given a URL that may or may not have a scheme, prepend the given scheme. - Does not replace a present scheme with the one provided as an argument. - - :rtype: str - """ - scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) - - # urlparse is a finicky beast, and sometimes decides that there isn't a - # netloc present. Assume that it's being over-cautious, and switch netloc - # and path if urlparse decided there was no netloc. - if not netloc: - netloc, path = path, netloc - - return urlunparse((scheme, netloc, path, params, query, fragment)) - - -def get_auth_from_url(url): - """Given a url with authentication components, extract them into a tuple of - username,password. - - :rtype: (str,str) - """ - parsed = urlparse(url) - - try: - auth = (unquote(parsed.username), unquote(parsed.password)) - except (AttributeError, TypeError): - auth = ('', '') - - return auth - - -# Moved outside of function to avoid recompile every call -_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') -_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') - - -def check_header_validity(header): - """Verifies that header value is a string which doesn't contain - leading whitespace or return characters. This prevents unintended - header injection. - - :param header: tuple, in the format (name, value). - """ - name, value = header - - if isinstance(value, bytes): - pat = _CLEAN_HEADER_REGEX_BYTE - else: - pat = _CLEAN_HEADER_REGEX_STR - try: - if not pat.match(value): - raise InvalidHeader("Invalid return character or leading space in header: %s" % name) - except TypeError: - raise InvalidHeader("Value for header {%s: %s} must be of type str or " - "bytes, not %s" % (name, value, type(value))) - - -def urldefragauth(url): - """ - Given a url remove the fragment and the authentication part. - - :rtype: str - """ - scheme, netloc, path, params, query, fragment = urlparse(url) - - # see func:`prepend_scheme_if_needed` - if not netloc: - netloc, path = path, netloc - - netloc = netloc.rsplit('@', 1)[-1] - - return urlunparse((scheme, netloc, path, params, query, '')) - - -def rewind_body(prepared_request): - """Move file pointer back to its recorded starting position - so it can be read again on redirect. - """ - body_seek = getattr(prepared_request.body, 'seek', None) - if body_seek is not None and isinstance(prepared_request._body_position, integer_types): - try: - body_seek(prepared_request._body_position) - except (IOError, OSError): - raise UnrewindableBodyError("An error occurred when rewinding request " - "body for redirect.") - else: - raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/retrying.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/retrying.py deleted file mode 100644 index 6d1e627..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/retrying.py +++ /dev/null @@ -1,267 +0,0 @@ -## Copyright 2013-2014 Ray Holder -## -## Licensed under the Apache License, Version 2.0 (the "License"); -## you may not use this file except in compliance with the License. -## You may obtain a copy of the License at -## -## http://www.apache.org/licenses/LICENSE-2.0 -## -## Unless required by applicable law or agreed to in writing, software -## distributed under the License is distributed on an "AS IS" BASIS, -## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -## See the License for the specific language governing permissions and -## limitations under the License. - -import random -from pip._vendor import six -import sys -import time -import traceback - - -# sys.maxint / 2, since Python 3.2 doesn't have a sys.maxint... -MAX_WAIT = 1073741823 - - -def retry(*dargs, **dkw): - """ - Decorator function that instantiates the Retrying object - @param *dargs: positional arguments passed to Retrying object - @param **dkw: keyword arguments passed to the Retrying object - """ - # support both @retry and @retry() as valid syntax - if len(dargs) == 1 and callable(dargs[0]): - def wrap_simple(f): - - @six.wraps(f) - def wrapped_f(*args, **kw): - return Retrying().call(f, *args, **kw) - - return wrapped_f - - return wrap_simple(dargs[0]) - - else: - def wrap(f): - - @six.wraps(f) - def wrapped_f(*args, **kw): - return Retrying(*dargs, **dkw).call(f, *args, **kw) - - return wrapped_f - - return wrap - - -class Retrying(object): - - def __init__(self, - stop=None, wait=None, - stop_max_attempt_number=None, - stop_max_delay=None, - wait_fixed=None, - wait_random_min=None, wait_random_max=None, - wait_incrementing_start=None, wait_incrementing_increment=None, - wait_exponential_multiplier=None, wait_exponential_max=None, - retry_on_exception=None, - retry_on_result=None, - wrap_exception=False, - stop_func=None, - wait_func=None, - wait_jitter_max=None): - - self._stop_max_attempt_number = 5 if stop_max_attempt_number is None else stop_max_attempt_number - self._stop_max_delay = 100 if stop_max_delay is None else stop_max_delay - self._wait_fixed = 1000 if wait_fixed is None else wait_fixed - self._wait_random_min = 0 if wait_random_min is None else wait_random_min - self._wait_random_max = 1000 if wait_random_max is None else wait_random_max - self._wait_incrementing_start = 0 if wait_incrementing_start is None else wait_incrementing_start - self._wait_incrementing_increment = 100 if wait_incrementing_increment is None else wait_incrementing_increment - self._wait_exponential_multiplier = 1 if wait_exponential_multiplier is None else wait_exponential_multiplier - self._wait_exponential_max = MAX_WAIT if wait_exponential_max is None else wait_exponential_max - self._wait_jitter_max = 0 if wait_jitter_max is None else wait_jitter_max - - # TODO add chaining of stop behaviors - # stop behavior - stop_funcs = [] - if stop_max_attempt_number is not None: - stop_funcs.append(self.stop_after_attempt) - - if stop_max_delay is not None: - stop_funcs.append(self.stop_after_delay) - - if stop_func is not None: - self.stop = stop_func - - elif stop is None: - self.stop = lambda attempts, delay: any(f(attempts, delay) for f in stop_funcs) - - else: - self.stop = getattr(self, stop) - - # TODO add chaining of wait behaviors - # wait behavior - wait_funcs = [lambda *args, **kwargs: 0] - if wait_fixed is not None: - wait_funcs.append(self.fixed_sleep) - - if wait_random_min is not None or wait_random_max is not None: - wait_funcs.append(self.random_sleep) - - if wait_incrementing_start is not None or wait_incrementing_increment is not None: - wait_funcs.append(self.incrementing_sleep) - - if wait_exponential_multiplier is not None or wait_exponential_max is not None: - wait_funcs.append(self.exponential_sleep) - - if wait_func is not None: - self.wait = wait_func - - elif wait is None: - self.wait = lambda attempts, delay: max(f(attempts, delay) for f in wait_funcs) - - else: - self.wait = getattr(self, wait) - - # retry on exception filter - if retry_on_exception is None: - self._retry_on_exception = self.always_reject - else: - self._retry_on_exception = retry_on_exception - - # TODO simplify retrying by Exception types - # retry on result filter - if retry_on_result is None: - self._retry_on_result = self.never_reject - else: - self._retry_on_result = retry_on_result - - self._wrap_exception = wrap_exception - - def stop_after_attempt(self, previous_attempt_number, delay_since_first_attempt_ms): - """Stop after the previous attempt >= stop_max_attempt_number.""" - return previous_attempt_number >= self._stop_max_attempt_number - - def stop_after_delay(self, previous_attempt_number, delay_since_first_attempt_ms): - """Stop after the time from the first attempt >= stop_max_delay.""" - return delay_since_first_attempt_ms >= self._stop_max_delay - - def no_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): - """Don't sleep at all before retrying.""" - return 0 - - def fixed_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): - """Sleep a fixed amount of time between each retry.""" - return self._wait_fixed - - def random_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): - """Sleep a random amount of time between wait_random_min and wait_random_max""" - return random.randint(self._wait_random_min, self._wait_random_max) - - def incrementing_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): - """ - Sleep an incremental amount of time after each attempt, starting at - wait_incrementing_start and incrementing by wait_incrementing_increment - """ - result = self._wait_incrementing_start + (self._wait_incrementing_increment * (previous_attempt_number - 1)) - if result < 0: - result = 0 - return result - - def exponential_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): - exp = 2 ** previous_attempt_number - result = self._wait_exponential_multiplier * exp - if result > self._wait_exponential_max: - result = self._wait_exponential_max - if result < 0: - result = 0 - return result - - def never_reject(self, result): - return False - - def always_reject(self, result): - return True - - def should_reject(self, attempt): - reject = False - if attempt.has_exception: - reject |= self._retry_on_exception(attempt.value[1]) - else: - reject |= self._retry_on_result(attempt.value) - - return reject - - def call(self, fn, *args, **kwargs): - start_time = int(round(time.time() * 1000)) - attempt_number = 1 - while True: - try: - attempt = Attempt(fn(*args, **kwargs), attempt_number, False) - except: - tb = sys.exc_info() - attempt = Attempt(tb, attempt_number, True) - - if not self.should_reject(attempt): - return attempt.get(self._wrap_exception) - - delay_since_first_attempt_ms = int(round(time.time() * 1000)) - start_time - if self.stop(attempt_number, delay_since_first_attempt_ms): - if not self._wrap_exception and attempt.has_exception: - # get() on an attempt with an exception should cause it to be raised, but raise just in case - raise attempt.get() - else: - raise RetryError(attempt) - else: - sleep = self.wait(attempt_number, delay_since_first_attempt_ms) - if self._wait_jitter_max: - jitter = random.random() * self._wait_jitter_max - sleep = sleep + max(0, jitter) - time.sleep(sleep / 1000.0) - - attempt_number += 1 - - -class Attempt(object): - """ - An Attempt encapsulates a call to a target function that may end as a - normal return value from the function or an Exception depending on what - occurred during the execution. - """ - - def __init__(self, value, attempt_number, has_exception): - self.value = value - self.attempt_number = attempt_number - self.has_exception = has_exception - - def get(self, wrap_exception=False): - """ - Return the return value of this Attempt instance or raise an Exception. - If wrap_exception is true, this Attempt is wrapped inside of a - RetryError before being raised. - """ - if self.has_exception: - if wrap_exception: - raise RetryError(self) - else: - six.reraise(self.value[0], self.value[1], self.value[2]) - else: - return self.value - - def __repr__(self): - if self.has_exception: - return "Attempts: {0}, Error:\n{1}".format(self.attempt_number, "".join(traceback.format_tb(self.value[2]))) - else: - return "Attempts: {0}, Value: {1}".format(self.attempt_number, self.value) - - -class RetryError(Exception): - """ - A RetryError encapsulates the last Attempt instance right before giving up. - """ - - def __init__(self, last_attempt): - self.last_attempt = last_attempt - - def __str__(self): - return "RetryError[{0}]".format(self.last_attempt) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/six.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/six.py deleted file mode 100644 index 89b2188..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/six.py +++ /dev/null @@ -1,952 +0,0 @@ -# Copyright (c) 2010-2018 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.12.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 - - -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 __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 - -_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("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_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 - _assertCountEqual = "assertCountEqual" - if sys.version_info[1] <= 1: - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" -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" -_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) - - -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, 2): - exec_("""def raise_from(value, from_value): - try: - if from_value is None: - raise value - raise value from from_value - finally: - value = None -""") -elif sys.version_info[:2] > (3, 2): - 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): - def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - def wrapper(f): - f = functools.wraps(wrapped, assigned, updated)(f) - f.__wrapped__ = wrapped - return f - return wrapper -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): - return meta(name, 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, text_type): - return s.encode(encoding, errors) - elif isinstance(s, binary_type): - return s - else: - 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` - """ - if not isinstance(s, (text_type, binary_type)): - raise TypeError("not expecting type '%s'" % type(s)) - if PY2 and isinstance(s, text_type): - s = s.encode(encoding, errors) - elif PY3 and isinstance(s, binary_type): - s = s.decode(encoding, errors) - 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 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/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__init__.py deleted file mode 100644 index 148a9c3..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__init__.py +++ /dev/null @@ -1,92 +0,0 @@ -""" -urllib3 - Thread-safe connection pooling and re-using. -""" - -from __future__ import absolute_import -import warnings - -from .connectionpool import ( - HTTPConnectionPool, - HTTPSConnectionPool, - connection_from_url -) - -from . import exceptions -from .filepost import encode_multipart_formdata -from .poolmanager import PoolManager, ProxyManager, proxy_from_url -from .response import HTTPResponse -from .util.request import make_headers -from .util.url import get_host -from .util.timeout import Timeout -from .util.retry import Retry - - -# Set default logging handler to avoid "No handler found" warnings. -import logging -from logging import NullHandler - -__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' -__license__ = 'MIT' -__version__ = '1.24.1' - -__all__ = ( - 'HTTPConnectionPool', - 'HTTPSConnectionPool', - 'PoolManager', - 'ProxyManager', - 'HTTPResponse', - 'Retry', - 'Timeout', - 'add_stderr_logger', - 'connection_from_url', - 'disable_warnings', - 'encode_multipart_formdata', - 'get_host', - 'make_headers', - 'proxy_from_url', -) - -logging.getLogger(__name__).addHandler(NullHandler()) - - -def add_stderr_logger(level=logging.DEBUG): - """ - Helper for quickly adding a StreamHandler to the logger. Useful for - debugging. - - Returns the handler after adding it. - """ - # This method needs to be in this __init__.py to get the __name__ correct - # even if urllib3 is vendored within another package. - logger = logging.getLogger(__name__) - handler = logging.StreamHandler() - handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) - logger.addHandler(handler) - logger.setLevel(level) - logger.debug('Added a stderr logging handler to logger: %s', __name__) - return handler - - -# ... Clean up. -del NullHandler - - -# All warning filters *must* be appended unless you're really certain that they -# shouldn't be: otherwise, it's very hard for users to use most Python -# mechanisms to silence them. -# SecurityWarning's always go off by default. -warnings.simplefilter('always', exceptions.SecurityWarning, append=True) -# SubjectAltNameWarning's should go off once per host -warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True) -# InsecurePlatformWarning's don't vary between requests, so we keep it default. -warnings.simplefilter('default', exceptions.InsecurePlatformWarning, - append=True) -# SNIMissingWarnings should go off only once. -warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True) - - -def disable_warnings(category=exceptions.HTTPWarning): - """ - Helper for quickly disabling all urllib3 warnings. - """ - warnings.simplefilter('ignore', category) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 17608e6a57045dd1572a82d634abc1f7bb822cab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2144 zcmZ`)+iu%N5GAP_b+skiaV+=3v~^;&k<>InkrqLb^pYk(Vi>W57F(bMtzAiUmX|D- zb|g4YE&A4fu>00O={NATPx*zuq-R%B;xs4;j%H?OXJ=>5j2_qP6$8&-FFQZ~0q$=l zoPP=sZsSXCn1(?OVo;M>+zc#YnTpTx9Ldo<E%1C$Acdevib08#u$HGqZU<#j)_jRq zf-0$M-sZKSPU=B}G=e3vq;+M!95hK&^A+9-R>+Fxt9&(BBWs$k@e9E^S=W4>Uko<L z26z=io3!!U;O$_OY(lq0-l5CnUD_n?(H421wND*(>C8O+fNlO_oSCM<+J_$wO}au? ze>KTRKW(zy;TBzE<-^PL0$u+-2MeXS2+ftZG}~`!I<GY4!;j&2gSO%K6PnvII-Ap* zl~i!<A6$33&i+_1k9HGp$eckGhHN1HD0Jc|;(j=CypTGAb<+ewuku1wqGM)D-a!)a zR5I5O;z-Dy7bu3&$z`p3`}@1!ymGS(FWHLH?fqBz`Yd-SqQFH&a9m-}1}s()B#<^( zIEW~7gOp1@_JnkYkqD?KJsee4&L4WAH)0~I?TYBxWFa+TC7t(MQ!zYZNessfo@;^k zgt=qfoC$T3Jz~-wM~MVq+V=w%rHU;)Vp2@NRCiL&?;#nSiRt#8kP0?&cCi>8IonV} z?8REVos7L{bleM>?2z2U`}@=4wcckpde=G)kw=n*0<b76qJS=HiYzO#1d=s9O5H>v zEaCEKgu98N(l1j#@eVk1k3A8h7KyOco`xcIMXDeJRfWZq1EbFR248X)L>i~2w9d@u zCb-<0@!UGGPV?Xk)I7s$8Ykvy@dOr{E1hUyLT6J8`_Nt|7T}Yc{#J4D++#du!a+rx zr>Q@9!Y2-5*O+nkBtR9+^X16Mkz?k}uG4cKCv2E<wNd+_>>wSDG`zHol&2z0^p^1~ z<Bm6!IBM?RmpyGb-P+pr62LWJoy6JN=In^^(3?vEOA<h%lT5GPp_Ea_b7pDPai}mC z&Jo@$v@e~lq*KmHN`gUF1}Glr8f3QXD$lN))!(>VR!f+?3s8Cz5oYDrYz5KI6Oh?3 zdZ41q3i`G{Z$U?!6=x@BrFk%a8p1)T{yFZCqk#3rm`N5!qJNkBar~%1R6n9SLMZ(s z79RD{#Qk_8$5D8_ce9`Pl67Nm@B|l6`mrB(uYJ+`w0FH5Pq5r$qmfefU2LUrIv)ak z*Y!hRx^6F?h!#%2fiF?WGRhUxHkZu`-kPb`vZBY2y-Bi<rYL%G3{P2!vZ03-eFJ_9 ziVE)<ehS|Te$)i0)SR9H>DK=NX$E$UCC;72uv$QWR{pH$kB}O+)3Gvpv4nbHB5^kK zIqHEJ?SUuRC=wH$*BQBlXv7N0kN6S`#K>#8b2TfuE{z7LbH#OsDUgVo3uPiMgOJAS zv85*DxsKLdYKW4uvT;0%F->%nlBzNdW|Qh%=c|s*Y%w27dJvFWDt+D)>}krdTQxSZ zwF)`V%|5qKpvQ>PGlNv-n=q<olVlb9L{quPExZ))5V%p*b-6!a7=Sb32%`^!76LBq zagK|wsf`yDX{+6ZZ@>Hc@%Os!;tCXGX^#z3;mgSnvnfQ@_R@nx{AJwXatEMXsMqh~ z6j-ud?nyLyuvlpB?c9IpC+gp1p{lCUJQs8o&Q;1$p{R0Y_N^eIDQ90PTqU1_<nuMt nwpNQZKyww}{LR~D&B~j2t$eeUYphtMmesN<ruDLzYvuk0$;4az diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/_collections.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/_collections.cpython-38.pyc deleted file mode 100644 index 2da5129d5563156586409eb5696dbffdb9ccd448..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10794 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 a83dpUu*k=7p2vA1KSRI=$z<*MpZ+f%L)2RU diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/connection.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/connection.cpython-38.pyc deleted file mode 100644 index 8dce67232b03bf5f8ce078f2692dd35656e39514..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10268 zcmb7K+ix7#d7s-}d8Z`mYIz(>mNurAvMtB5>^PDs$`-6rib%!w*zRz+bCx^g?9A%S ztSD}l2@tw18o)sc6lflTmh3}O14W*Spg{kD{s9FF%u7+UFY0q&n$%W*-#4>2S_axB z=j@qtKi~Pj-*-9tU}B=I;PX#UD}OlkJw^F<dKvzd@Nykb^jlR?T*Xy=rKwt~N_oxK zERDZ)OXqLHGWa`Z<?yZhxn|xfG>cX#YhSj?uHokVvF5lnjxxi|`xDJcYl`y)<fpA^ zRq4#~C^OcKnAx1Qj(n&D^M)dhieq(ct1SOURp`&vteN)|x9FBWSKN}A+taNhA1i_O zk<uxO<JNKXI)`2-(Bq%e9%x;5$IyCAoJ8y6X=|)v+&|SkZJlnOvCcG~vz}|7wa)U2 zCj94{re!u?uwLNzN&h>|7p)hY=d5$h^Va$1OV&%x3)Tg$oANI<D^`W`)BbmxFIz9G ziqQAx#iaw)s=71otb63wnzbOb{mbrA_n13(pj)qCO~>66SknpdD%SKG-cP!x@P0~6 zp~SEzQF7WngOW315-qOa{W<q6-p`6Fcz@k}-Zej0tnZ1LU#jvq;)?Z#c-^`Z7~(bS zimR<Cl^34SiB{BP%2|&>za0zPYqmleFITiAC!`EzQi#2#2;1=!95Xf5BkwW3Cf{FO zy|)+!fvCk^7@%Z=N|qkiM2iY)H1hC=x?jf=jUy3?rMe1uM8zt!Wc*zx5-TfrmT1Q1 zFZHBo+kw**ww;u1yBWG|pYr3j{jlx$Y0a04oWw|+{BCEV5jMqwY=~F{p<KA-d#%>} zg*tu7OB)z!;gJX)E%@I0LTe{(gu!dos|%4Ai%Tu1w&iSyXrbk`F1_+*^>X#KORXJL zSH;E#6)xE5>SEBg^wIydg<5~t)z*$AIhdt=X-JAHzyH5BKQ*9Yx_?Q6H`rX7o1(I5 zB&YE7=A!qCk<2cO?L&hkN3w#|^z?Y-<k(7keG><E!;hCilMfvkc)><8v$7M#qDf7& zBAm%&(}`;hyAeh)5j>e*6f*YeUd@RGk5<VgGg5$U9tpdKI$Mf|QF5eL6h%G=CnNAe zGV4SUwWwn@AzRW5;$*HS1%|RSs@kAxEFQ<n6m{H|PRowM+LnmHS!L7>_>4L4ec`x5 z-t=nmlY1b7_m5yNEZS(qaVyDD8hQU#P?RTm)IK?j<lE1Ls5oFq02Yaco=n|rH=8>H zx^^x-h=gm#q3MFlYO(2<b;t8jG-$KvM`kKP)#ZvI$1t)aewPzSl7el!Va>LmdA2X2 z#SJ`>fuyJ!s-%){tXfCmbv#iE$?&R$;c6!pD<|@s1w2Jpuj?DCRdNkLYtGFB2*$*? zTX2h?D|@OnAtp8_-BRx@g+FV`9d{?ta@w7Ar|>=F9wB)8T(xH1X;9^;1WgqO=&6)V zd`NCxGYm|kIE14*iVEg>J2qP~eB`+zGM&K00ZYfkaYnIh*Wys}DC-cxZAZG%rCQi* zIkC6y`ChzZ`p%A!=DLWtg$T^h$BAPQ*9^oqa`#w{qiUJQxZ%1U;f~{*TViKBl&;xw zBp5da51Nh?W;;7Q%wG34+9+}2SbA6@))v;yxFKj|8KYIxQELQe*y7MwUQqMfuDF)Y zYnqqLwKZ%9thlyz&0G<JN5Vn3n<9v@8;}S8*J?hb;M!Wo@72LntuXWt5$+y})_4Wk z_+eYtgzdO4#4AeYiFuxgYs{?1tcNn)NLxzG{*4Xwh9k+cLq_WUa8XOtNWjgkoK{Ul zX$K&@zXRDdQ<1Eix9esQ#%9(-xbxI7$QEouK<ZB0k5jt)Aw<<R>oRPDQlkt~&01!% zK3I{t-SBD+Goy86x?be0`&dGMj%8=V7Z)&vzY$6=ZZyq{k-(Izi}&p1yEm8a-1wMe z^_2?N?}KP5S^DQ|dJ#CQ;enkTV$sJt86y!}-vSlIW2f2j#k}d&&7H7qZhKLK1{47n zB4`@(10h=G4c~htuuwVz=0IvhWa|-OzQ1G|rs-`oAQQw2eGZ~2P4oXm8S`cHlm2*V zKNA~gq^z#oy<@N3UHo8ab-s5}D|hV=mX_|_xO4kQOY<PcU@_GBvmOtd=3U9VY&tvU zwgbi?m}8n}?A$xi^&MV3F$2kSvqf_1MX`BNR5z;gIN?t|TU)E7;v=62TF4xdTQ$=E zy$^vH!Q5Ru(M=?=vZ>11uC@=0z*P=3RY4v=e4us}+u(A&t8C^DG`#2I!e+6n)YY!~ zms(f*g$m0`0XP}UNj??CWHJ?tp1{!iFvnL)lJr8N-~0HrL~n(yMBfmxe2L2Dp3Rc- z0##1gqo+iMiWhjXZ9`!gk?`w@;mD0B(YCgSP@a|dB@D2ECt|x=&8y@3xG}ADj*kvm z?Tt7>F`^z(ZIK2bjRI;Y`>LxRum$D(6)O9D@t%l*dM2>15wgOPq8WloonXfV{sLTa zdTt0|i5pG~-gQ~4GuQU?J;?_S_|^|^E)NOD?ZDg+fsl?rZ^B+PN$+Pi0c11`F3@NU zk387$WW8yabNWlIw|#%-5?OT^1}Nc%O$V|>7RNkeecWhAj4nIb_>a)kh2cO#+ag>7 zR185+ts!vI5b6z#1GaRAhwSZ_SC}FK$N)GSNH0lFQ}ovdvxSTpljMRBPdo-lvUEsM z6D0X0>LdH4<@A)EJ4Czp!)<}Fcr#|7%-evj(f%NO4S<Ft@kt7AF0YtuQ?*HxyoK$I zQqT{>t#%9WMB{v8EuQZW2o(mPR%V}ZTL;#02y=|cNhdu(2W$f78Cbv^8XsN&3Pv|e z6GXz10Bf2(VoMURoRy{L*(WC<Mb%v8GxcILOO2%raJC3fX%qnZhDWNL$OPpbLItsE zgARvQ!Y;glvH_E$v<6EgB36K2=aGl^cG0T}U=yEAN<X4%wll)?C?@Sf0N)s#y;F<9 zmyGlSWo<e&8A6++`e|ESz<e8gBp4@xqrf;0DnD#v)F=Z&0^3Bb!a^<CZV<6mo#Z8< zRjZ=PDg^ovT)>pY-eVGXax9dY&XGenLG?ARqk4QOPtPJA2AM9QCp>fVu{!_KKZKPO z9(tz28V$6TaY;O^20sL3L=nswkOerwgwM<uvZhi2>hEV@PQBGL2XPXFiT#<=5vXT6 zX)59#3<)8c5s2nQu;56&rW4{cB(%%Abfkw)_0adjZ8K_najIX4tjnO^tJrZxV=^W= z07P3HqNcop7Jou?VS*J$u$43sVKUS0H^_L(E-1ID$fJ~YfwFHC-m3B(rFhrgRyt>6 zZIg78fhSjoUfRqfRez!GYKSk?4J9rhzR*#XT^(_YQ!zA_OYKW(%Q<CF`<eQo@;YK2 zyZTS`j}*ilE~8f&z5X`qH5-qiSFWo+vo+!wU2;|OotC-O=U^vO{X?c711XFnAebv) zRD;}c3>1Oc8{mkBFzT8Vaa#u0On8*v9A`juR+X$0JC_#+HWftRJh%dWB%FdaB>iG0 zI9!I3@1Kt<%bkn2Qom_L@*FbjhZcPeLsiBH6Uj3;nPevO8V3T&ho2Y}wUBg@$;1ll z`pof_<eT&HCu3;^JFjvE#qiKb@~k4eCHB^KV$isWdYFA6wOAavsKKA1Lqz<h<P7NW zvPO>vcde`#Pc>D0TGXdid@Gt-eyTk^YNT)Zr*nGe#32dp5Blw5OrC2h#$X#&p6V+5 z+5v^QNVE}JBhg-#WE~(5V33uAC`sIg7vrZOQ^?+ulGBbu7}z5CGL;m04ZRM@Nit!# zq=2&nmmZt_JG6+3NEB=}uNAe<nZsKcZayMaBxpJwmZ~{quyo~sC2Jotbf9Kdn~GSI zd>i%hT}sFWKD?+xcG`cBI(Cm0wWxOH4lN~Xv|J;5v-crWiA+6SMG<t0m9F8cTO~Q! zH3H3pE4&NGxod3YcXN<W`py%nL3FK~>*ihK3j@}uL1e$Fe0KCxZMU!sS>D&Xg>I27 z)rapuLXEA0Y*4A2cMEL4D*FZ<R9ENOei!F9VYk-R<H~LcSfF=Hdz$?7u3lGn^{$SQ z*LKU@a`e{^e}&p|T-ej1-*(IUaL^Cb-Ev$85|sDUJrypy`bTi|cYzH1<J~c|C?7C2 z>D?V8x^fLl(_C8i@K;<v&U7b@FwxoT<1*qwLI!YE$(~8Q7kJ`LphKp|GFy^VD7j^% z=NSF_Bdmum3^B4nYK?Y42ABwHq06QUdF(KqU`>R9FxP!BX}{lcXUbt8`%<qx%PJJ* z(P+zS*=eQSt4vB<N*b#(14AT;>O%Irc4k(4MN8T2Ng-QLVzlG>)hEQ2ogA{4uCgka zC`ZIDmnX^-<;sM74*8_qYRB2WlN>^X%_u3MsKFtpq>R0%*(h})#z~6@8+N?Y5>b*{ z-$6VfDSHu_pH5H{NuF0P61^cFC%P{J@)QCW;6~_^<WoC6(V<!sg9w=vdJ~XuB$v2V zS|ne`i#3%_34^6KEAP@OU~n6ChXrUV+m4+P;~y|cMB=aHjzW|u+62g=zyHbSr`1W6 zjH^YB(lR7JtuG^gRGmgzhU?Nfdr15aO#xV1t{gcO0h8x2Wim-vZLjax5sY<27RP%Y z7nQ?>WB5+SZr{6i|L*Et8=iJDHssaImuZkOFQV`wdkvCYtE8AZ1o2La_IXlrLJmO- zVSuzKnH){nJ)^+ZEj$qgSh3^dMPphwwBiJSd=~ItDxNMDiv|b4YG^X@q0ZOwFj0F^ zIRVi}L=NzROAjsmqv#yv>IGMK4aC)oS!}MvQO80uMPyxB?CVr%V%X&xMVWgavQ>y_ zKfn{cgM_^2E~yEvt}|w-zt*~?zhKW8NTb-mH&PcsEb^v-UN#nlG|vh|Cj>r^aae!y zgp~sCGb1blY6#u>A}Mj4m$PFOrUm3?F<W+%`oUtW1T_-IVJ-A4<<z<*15Ca_iA#x~ zWH4u)UdcI@mnj*XPv3L?50pnoktoI_v@96*X<mm?qCX?mtV2|Lwi8XlPbbC7;65^d z#6v0x(2t9&t)hH2)?-{*?Wr*?tN^>}7ep{E&XYFY1R*H|u}NkhPVS2w>dF~0ztj>Y zPA~YK5)I-JRdVwCm^CSYpiIOf(UWqrPk_qU5XW*U@uNIJ$#F_fQ!=0-6OBfFmgbbS z)BnN~k?}-Yv#gaN=AhZv#T*H|k^cQYjY14lFjJ>EztJeR`~)M(Pbu*z`3y;N+<x!Q z-FI)?v2QNjy7A!7s=a#q50>seSY-y{RScaepDrIP$<e>!iO5I;4rvC=DNVuQD%#iO zX-W0;jC}gChFi&z2sq>{lQk=kJmd`0)swSQCTC@qvtn}mM;Uk=lDAG8UVCO>dx$(7 z*``~H)Co#4ixnWNw$a!K{PxszUaqk*m2HReI-W&5QGkSPg`&LJHKOTmLC(3_t{%*S z#bEBiV!24UO|lor_(S9iDQpL%2BaP`-G$|1=etI@N)fXCQrF=4S-D#X>sd*GOUBqI z)H@&b_3&x~VTUYW6g9%OPf>mN+3Vz4`*g{HD?Nl{)&<-~a?gfi<rFKT==#7vSWYGu zm+r6H_m_V7;P(Bco6vQ{%gGo+_6}X?i6JK5q`Il>l8BT$#ed{UD%HXW#=R3apm-m* z5dFtQGAY&^zH^F_u`Fl1o~#s8tQklL4J_M~Jfwt1l#eJGMVO=rWx)f^!bFTn*pxBS zi!koNl^M+7ZC34=-@-W6-Vh^JFfl7(H=psR7<>RZI7xyJ7~_1NILFjtWYZq!xv8NZ z9Dp2f8t4Bm<#zS-BoD|_RCbN7A?xuNEI)03B8JTuPaaV8RN0(j82foV9naux7C?3c z-$wyuIz!nMwb{+}O1nAxSUktzb{sV)@SMbR3jCFW4NRJYR&rV<@o9YPn`cO%z929> zy@weCx0~BM7C*Onc1y=?^E>hL=!eUuJ-kKlpq1$sw@Oq)z4y<+6UcY-`!B$rEgxuT zGtavi+n?wn>KlKDb`ifw9KC7&Qf*!9>NHC>$GI)^Xsy!RL>a8@JcI9e>I!u}OfNLq z>m=sfhR++;>*mFbeSds;w?bhks>&i{>j*m_k_{V=EMSsfW>pG|(gh9-iBLwefun?O zWW3!%Uiy?UgE3n%8WX3l;@Wa-9Wg8k)fviWGRc9-zJ|Poko3r1EOTV%KNkl9RStMz zrDg+`a}b(qqaD`fas7x3X@qj={)|@5Q*bxOTuTjjy5?Quq9EMPwp_=(D_wtK_v?cC zr{Q7OL~Ot5Y~t=?U548bGl~EsBrD+K(XB5xxPNQWeD&%pSK-^!RTtm1URzk$fa%{} z$E8+tA!<0CaJzq7?jeGN+x07NzQN1D-6@>^s9LGKlqxzl49JQ}srm!TU8jU-nG`A1 zO96$%pj?uRL)Y0!#_lgIE-kOxH*c&iB}LpF(mghSf^tco2=2s^tc6su4pb<sEY_n8 z4RncmSfdV3lL2T9Hv=spaQz13REO1*lo;BU?=CMT1ys^4VhS(crO}SivZw6P+jALG z)fy6TPnGi5kR-)E*3o7yvT13rHh2||OJ-adH1i?AVwL(bVHN2O1(tfAP)Y|@>3I#- zD&8kE<*q%|H0>*+NQxhr2E~u72ju(8pYs1*EahSM8&9cU`6=w)uZ?_}N>oGFzJg-@ zy-}Fe;Te40dH&lFuxBz9meUVxnM1b2IV@HVK$&HRkA#tVn`#Luhjz<A&Bg-lv_M-X zTLuQYk=ZV)p~26Fb;HkB<&%<Hj)YW5%a-vl3g1DdGl@6=EM~$KMC-01?xrH{b_;Pg zlptD1w@(xUP!15iLrcvzeukEa)}h5u5P8dfA(RGSI@gEg*7Z_{msudYF@W&&&YA*S zRdc8VN4j$I7}h1{kibU_HzcjuD%-?*teGmh{8K8LN!6rq`&c61qMl5s0k!@ZWie5U zZDt(tBwROk^I%#T`MfHrMdd2}z^2|NJizY~$Uv4qMv@e;1ccx>q@*IU@pwV<P0AUR zT&3ivNZ@#7KcQiN*gD&Lt>TwLRl0bJsss~u&G&F6ojMlt)SC<-xyM8Fe*D8fpMmek zze3_jT{3y2cTJzZPmpca|D6&4CMGEn&ZX6*eic~^*{_izj`yXpKoU^KhUD~MrEq2r zNo@Z(tP*Zs{3`i7sRhoqI5RBc3K`@SUGV%gL^%$(2o@9nEGkMP3MIhA9S{^+gazW~ zv;?-JyOjG0jgSxdr#bwq4>o+6jro+UlMjMa8wvN2xjJ<0{j*PsZ>K+*dWS?JT1EnI zKKq--_c;9_XbE=!7LB3J85$5|Qk^qS<fpYWrEzUsE9*douk)ozeL6S$Q{~k3#pz~o JlCUMO{VzSRp|k)1 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-38.pyc deleted file mode 100644 index 94d74086427211dd028046fe9b8fef7d0d1d066f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23730 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 A@&Et; diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/exceptions.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/exceptions.cpython-38.pyc deleted file mode 100644 index a4ed30c679a251de234dd1423fd0e991760edd50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10087 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 Pj)ONoH;WMyvtxe)RgK=j diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/fields.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/fields.cpython-38.pyc deleted file mode 100644 index 210af9f017ee9ff8729f25ea497b4024ec3ee2a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5890 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 JK3DzS{{Y5?F#7-i diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/filepost.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/filepost.cpython-38.pyc deleted file mode 100644 index 2b88be26f43221753e7e52872b4d52940ab94c86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2789 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-38.pyc deleted file mode 100644 index feb77ce73685d4f8832279d9d92e57e526a97c31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12829 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/request.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/request.cpython-38.pyc deleted file mode 100644 index e03c5f20fae9233999fec999b4037f5f9791fe6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5643 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 PMAXi&I;-|-sZ#nUp-^<5 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/response.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__pycache__/response.cpython-38.pyc deleted file mode 100644 index d1567a45c9c4cf32d7424eb42de430286e8a0607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18934 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 K*|}rc-2VpI3}w&& diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/_collections.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/_collections.py deleted file mode 100644 index 34f2381..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/_collections.py +++ /dev/null @@ -1,329 +0,0 @@ -from __future__ import absolute_import -try: - from collections.abc import Mapping, MutableMapping -except ImportError: - from collections import Mapping, MutableMapping -try: - from threading import RLock -except ImportError: # Platform-specific: No threads available - class RLock: - def __enter__(self): - pass - - def __exit__(self, exc_type, exc_value, traceback): - pass - - -from collections import OrderedDict -from .exceptions import InvalidHeader -from .packages.six import iterkeys, itervalues, PY3 - - -__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict'] - - -_Null = object() - - -class RecentlyUsedContainer(MutableMapping): - """ - Provides a thread-safe dict-like container which maintains up to - ``maxsize`` keys while throwing away the least-recently-used keys beyond - ``maxsize``. - - :param maxsize: - Maximum number of recent elements to retain. - - :param dispose_func: - Every time an item is evicted from the container, - ``dispose_func(value)`` is called. Callback which will get called - """ - - ContainerCls = OrderedDict - - def __init__(self, maxsize=10, dispose_func=None): - self._maxsize = maxsize - self.dispose_func = dispose_func - - self._container = self.ContainerCls() - self.lock = RLock() - - def __getitem__(self, key): - # Re-insert the item, moving it to the end of the eviction line. - with self.lock: - item = self._container.pop(key) - self._container[key] = item - return item - - def __setitem__(self, key, value): - evicted_value = _Null - with self.lock: - # Possibly evict the existing value of 'key' - evicted_value = self._container.get(key, _Null) - self._container[key] = value - - # If we didn't evict an existing value, we might have to evict the - # least recently used item from the beginning of the container. - if len(self._container) > self._maxsize: - _key, evicted_value = self._container.popitem(last=False) - - if self.dispose_func and evicted_value is not _Null: - self.dispose_func(evicted_value) - - def __delitem__(self, key): - with self.lock: - value = self._container.pop(key) - - if self.dispose_func: - self.dispose_func(value) - - def __len__(self): - with self.lock: - return len(self._container) - - def __iter__(self): - raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') - - def clear(self): - with self.lock: - # Copy pointers to all values, then wipe the mapping - values = list(itervalues(self._container)) - self._container.clear() - - if self.dispose_func: - for value in values: - self.dispose_func(value) - - def keys(self): - with self.lock: - return list(iterkeys(self._container)) - - -class HTTPHeaderDict(MutableMapping): - """ - :param headers: - An iterable of field-value pairs. Must not contain multiple field names - when compared case-insensitively. - - :param kwargs: - Additional field-value pairs to pass in to ``dict.update``. - - A ``dict`` like container for storing HTTP Headers. - - Field names are stored and compared case-insensitively in compliance with - RFC 7230. Iteration provides the first case-sensitive key seen for each - case-insensitive pair. - - Using ``__setitem__`` syntax overwrites fields that compare equal - case-insensitively in order to maintain ``dict``'s api. For fields that - compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` - in a loop. - - If multiple fields that are equal case-insensitively are passed to the - constructor or ``.update``, the behavior is undefined and some will be - lost. - - >>> headers = HTTPHeaderDict() - >>> headers.add('Set-Cookie', 'foo=bar') - >>> headers.add('set-cookie', 'baz=quxx') - >>> headers['content-length'] = '7' - >>> headers['SET-cookie'] - 'foo=bar, baz=quxx' - >>> headers['Content-Length'] - '7' - """ - - def __init__(self, headers=None, **kwargs): - super(HTTPHeaderDict, self).__init__() - self._container = OrderedDict() - if headers is not None: - if isinstance(headers, HTTPHeaderDict): - self._copy_from(headers) - else: - self.extend(headers) - if kwargs: - self.extend(kwargs) - - def __setitem__(self, key, val): - self._container[key.lower()] = [key, val] - return self._container[key.lower()] - - def __getitem__(self, key): - val = self._container[key.lower()] - return ', '.join(val[1:]) - - def __delitem__(self, key): - del self._container[key.lower()] - - def __contains__(self, key): - return key.lower() in self._container - - def __eq__(self, other): - if not isinstance(other, Mapping) and not hasattr(other, 'keys'): - return False - if not isinstance(other, type(self)): - other = type(self)(other) - return (dict((k.lower(), v) for k, v in self.itermerged()) == - dict((k.lower(), v) for k, v in other.itermerged())) - - def __ne__(self, other): - return not self.__eq__(other) - - if not PY3: # Python 2 - iterkeys = MutableMapping.iterkeys - itervalues = MutableMapping.itervalues - - __marker = object() - - def __len__(self): - return len(self._container) - - def __iter__(self): - # Only provide the originally cased names - for vals in self._container.values(): - yield vals[0] - - def pop(self, key, default=__marker): - '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. - If key is not found, d is returned if given, otherwise KeyError is raised. - ''' - # Using the MutableMapping function directly fails due to the private marker. - # Using ordinary dict.pop would expose the internal structures. - # So let's reinvent the wheel. - try: - value = self[key] - except KeyError: - if default is self.__marker: - raise - return default - else: - del self[key] - return value - - def discard(self, key): - try: - del self[key] - except KeyError: - pass - - def add(self, key, val): - """Adds a (name, value) pair, doesn't overwrite the value if it already - exists. - - >>> headers = HTTPHeaderDict(foo='bar') - >>> headers.add('Foo', 'baz') - >>> headers['foo'] - 'bar, baz' - """ - key_lower = key.lower() - new_vals = [key, val] - # Keep the common case aka no item present as fast as possible - vals = self._container.setdefault(key_lower, new_vals) - if new_vals is not vals: - vals.append(val) - - def extend(self, *args, **kwargs): - """Generic import function for any type of header-like object. - Adapted version of MutableMapping.update in order to insert items - with self.add instead of self.__setitem__ - """ - if len(args) > 1: - raise TypeError("extend() takes at most 1 positional " - "arguments ({0} given)".format(len(args))) - other = args[0] if len(args) >= 1 else () - - if isinstance(other, HTTPHeaderDict): - for key, val in other.iteritems(): - self.add(key, val) - elif isinstance(other, Mapping): - for key in other: - self.add(key, other[key]) - elif hasattr(other, "keys"): - for key in other.keys(): - self.add(key, other[key]) - else: - for key, value in other: - self.add(key, value) - - for key, value in kwargs.items(): - self.add(key, value) - - def getlist(self, key, default=__marker): - """Returns a list of all the values for the named field. Returns an - empty list if the key doesn't exist.""" - try: - vals = self._container[key.lower()] - except KeyError: - if default is self.__marker: - return [] - return default - else: - return vals[1:] - - # Backwards compatibility for httplib - getheaders = getlist - getallmatchingheaders = getlist - iget = getlist - - # Backwards compatibility for http.cookiejar - get_all = getlist - - def __repr__(self): - return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) - - def _copy_from(self, other): - for key in other: - val = other.getlist(key) - if isinstance(val, list): - # Don't need to convert tuples - val = list(val) - self._container[key.lower()] = [key] + val - - def copy(self): - clone = type(self)() - clone._copy_from(self) - return clone - - def iteritems(self): - """Iterate over all header lines, including duplicate ones.""" - for key in self: - vals = self._container[key.lower()] - for val in vals[1:]: - yield vals[0], val - - def itermerged(self): - """Iterate over all headers, merging duplicate ones together.""" - for key in self: - val = self._container[key.lower()] - yield val[0], ', '.join(val[1:]) - - def items(self): - return list(self.iteritems()) - - @classmethod - def from_httplib(cls, message): # Python 2 - """Read headers from a Python 2 httplib message object.""" - # python2.7 does not expose a proper API for exporting multiheaders - # efficiently. This function re-reads raw lines from the message - # object and extracts the multiheaders properly. - obs_fold_continued_leaders = (' ', '\t') - headers = [] - - for line in message.headers: - if line.startswith(obs_fold_continued_leaders): - if not headers: - # We received a header line that starts with OWS as described - # in RFC-7230 S3.2.4. This indicates a multiline header, but - # there exists no previous header to which we can attach it. - raise InvalidHeader( - 'Header continuation with no previous header: %s' % line - ) - else: - key, value = headers[-1] - headers[-1] = (key, value + ' ' + line.strip()) - continue - - key, value = line.split(':', 1) - headers.append((key, value.strip())) - - return cls(headers) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connection.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connection.py deleted file mode 100644 index 02b3665..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connection.py +++ /dev/null @@ -1,391 +0,0 @@ -from __future__ import absolute_import -import datetime -import logging -import os -import socket -from socket import error as SocketError, timeout as SocketTimeout -import warnings -from .packages import six -from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection -from .packages.six.moves.http_client import HTTPException # noqa: F401 - -try: # Compiled with SSL? - import ssl - BaseSSLError = ssl.SSLError -except (ImportError, AttributeError): # Platform-specific: No SSL. - ssl = None - - class BaseSSLError(BaseException): - pass - - -try: # Python 3: - # Not a no-op, we're adding this to the namespace so it can be imported. - ConnectionError = ConnectionError -except NameError: # Python 2: - class ConnectionError(Exception): - pass - - -from .exceptions import ( - NewConnectionError, - ConnectTimeoutError, - SubjectAltNameWarning, - SystemTimeWarning, -) -from .packages.ssl_match_hostname import match_hostname, CertificateError - -from .util.ssl_ import ( - resolve_cert_reqs, - resolve_ssl_version, - assert_fingerprint, - create_urllib3_context, - ssl_wrap_socket -) - - -from .util import connection - -from ._collections import HTTPHeaderDict - -log = logging.getLogger(__name__) - -port_by_scheme = { - 'http': 80, - 'https': 443, -} - -# When updating RECENT_DATE, move it to within two years of the current date, -# and not less than 6 months ago. -# Example: if Today is 2018-01-01, then RECENT_DATE should be any date on or -# after 2016-01-01 (today - 2 years) AND before 2017-07-01 (today - 6 months) -RECENT_DATE = datetime.date(2017, 6, 30) - - -class DummyConnection(object): - """Used to detect a failed ConnectionCls import.""" - pass - - -class HTTPConnection(_HTTPConnection, object): - """ - Based on httplib.HTTPConnection but provides an extra constructor - backwards-compatibility layer between older and newer Pythons. - - Additional keyword parameters are used to configure attributes of the connection. - Accepted parameters include: - - - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` - - ``source_address``: Set the source address for the current connection. - - ``socket_options``: Set specific options on the underlying socket. If not specified, then - defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling - Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. - - For example, if you wish to enable TCP Keep Alive in addition to the defaults, - you might pass:: - - HTTPConnection.default_socket_options + [ - (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), - ] - - Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). - """ - - default_port = port_by_scheme['http'] - - #: Disable Nagle's algorithm by default. - #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` - default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] - - #: Whether this connection verifies the host's certificate. - is_verified = False - - def __init__(self, *args, **kw): - if six.PY3: # Python 3 - kw.pop('strict', None) - - # Pre-set source_address. - self.source_address = kw.get('source_address') - - #: The socket options provided by the user. If no options are - #: provided, we use the default options. - self.socket_options = kw.pop('socket_options', self.default_socket_options) - - _HTTPConnection.__init__(self, *args, **kw) - - @property - def host(self): - """ - Getter method to remove any trailing dots that indicate the hostname is an FQDN. - - In general, SSL certificates don't include the trailing dot indicating a - fully-qualified domain name, and thus, they don't validate properly when - checked against a domain name that includes the dot. In addition, some - servers may not expect to receive the trailing dot when provided. - - However, the hostname with trailing dot is critical to DNS resolution; doing a - lookup with the trailing dot will properly only resolve the appropriate FQDN, - whereas a lookup without a trailing dot will search the system's search domain - list. Thus, it's important to keep the original host around for use only in - those cases where it's appropriate (i.e., when doing DNS lookup to establish the - actual TCP connection across which we're going to send HTTP requests). - """ - return self._dns_host.rstrip('.') - - @host.setter - def host(self, value): - """ - Setter for the `host` property. - - We assume that only urllib3 uses the _dns_host attribute; httplib itself - only uses `host`, and it seems reasonable that other libraries follow suit. - """ - self._dns_host = value - - def _new_conn(self): - """ Establish a socket connection and set nodelay settings on it. - - :return: New socket connection. - """ - extra_kw = {} - if self.source_address: - extra_kw['source_address'] = self.source_address - - if self.socket_options: - extra_kw['socket_options'] = self.socket_options - - try: - conn = connection.create_connection( - (self._dns_host, self.port), self.timeout, **extra_kw) - - except SocketTimeout as e: - raise ConnectTimeoutError( - self, "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout)) - - except SocketError as e: - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % e) - - return conn - - def _prepare_conn(self, conn): - self.sock = conn - if self._tunnel_host: - # TODO: Fix tunnel so it doesn't depend on self.sock state. - self._tunnel() - # Mark this connection as not reusable - self.auto_open = 0 - - def connect(self): - conn = self._new_conn() - self._prepare_conn(conn) - - def request_chunked(self, method, url, body=None, headers=None): - """ - Alternative to the common request method, which sends the - body with chunked encoding and not as one block - """ - headers = HTTPHeaderDict(headers if headers is not None else {}) - skip_accept_encoding = 'accept-encoding' in headers - skip_host = 'host' in headers - self.putrequest( - method, - url, - skip_accept_encoding=skip_accept_encoding, - skip_host=skip_host - ) - for header, value in headers.items(): - self.putheader(header, value) - if 'transfer-encoding' not in headers: - self.putheader('Transfer-Encoding', 'chunked') - self.endheaders() - - if body is not None: - stringish_types = six.string_types + (bytes,) - if isinstance(body, stringish_types): - body = (body,) - for chunk in body: - if not chunk: - continue - if not isinstance(chunk, bytes): - chunk = chunk.encode('utf8') - len_str = hex(len(chunk))[2:] - self.send(len_str.encode('utf-8')) - self.send(b'\r\n') - self.send(chunk) - self.send(b'\r\n') - - # After the if clause, to always have a closed body - self.send(b'0\r\n\r\n') - - -class HTTPSConnection(HTTPConnection): - default_port = port_by_scheme['https'] - - ssl_version = None - - def __init__(self, host, port=None, key_file=None, cert_file=None, - strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - ssl_context=None, server_hostname=None, **kw): - - HTTPConnection.__init__(self, host, port, strict=strict, - timeout=timeout, **kw) - - self.key_file = key_file - self.cert_file = cert_file - self.ssl_context = ssl_context - self.server_hostname = server_hostname - - # Required property for Google AppEngine 1.9.0 which otherwise causes - # HTTPS requests to go out as HTTP. (See Issue #356) - self._protocol = 'https' - - def connect(self): - conn = self._new_conn() - self._prepare_conn(conn) - - if self.ssl_context is None: - self.ssl_context = create_urllib3_context( - ssl_version=resolve_ssl_version(None), - cert_reqs=resolve_cert_reqs(None), - ) - - self.sock = ssl_wrap_socket( - sock=conn, - keyfile=self.key_file, - certfile=self.cert_file, - ssl_context=self.ssl_context, - server_hostname=self.server_hostname - ) - - -class VerifiedHTTPSConnection(HTTPSConnection): - """ - Based on httplib.HTTPSConnection but wraps the socket with - SSL certification. - """ - cert_reqs = None - ca_certs = None - ca_cert_dir = None - ssl_version = None - assert_fingerprint = None - - def set_cert(self, key_file=None, cert_file=None, - cert_reqs=None, ca_certs=None, - assert_hostname=None, assert_fingerprint=None, - ca_cert_dir=None): - """ - This method should only be called once, before the connection is used. - """ - # If cert_reqs is not provided, we can try to guess. If the user gave - # us a cert database, we assume they want to use it: otherwise, if - # they gave us an SSL Context object we should use whatever is set for - # it. - if cert_reqs is None: - if ca_certs or ca_cert_dir: - cert_reqs = 'CERT_REQUIRED' - elif self.ssl_context is not None: - cert_reqs = self.ssl_context.verify_mode - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - self.ca_certs = ca_certs and os.path.expanduser(ca_certs) - self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) - - def connect(self): - # Add certificate verification - conn = self._new_conn() - hostname = self.host - - if self._tunnel_host: - self.sock = conn - # Calls self._set_hostport(), so self.host is - # self._tunnel_host below. - self._tunnel() - # Mark this connection as not reusable - self.auto_open = 0 - - # Override the host with the one we're requesting data from. - hostname = self._tunnel_host - - server_hostname = hostname - if self.server_hostname is not None: - server_hostname = self.server_hostname - - is_time_off = datetime.date.today() < RECENT_DATE - if is_time_off: - warnings.warn(( - 'System time is way off (before {0}). This will probably ' - 'lead to SSL verification errors').format(RECENT_DATE), - SystemTimeWarning - ) - - # Wrap socket using verification with the root certs in - # trusted_root_certs - if self.ssl_context is None: - self.ssl_context = create_urllib3_context( - ssl_version=resolve_ssl_version(self.ssl_version), - cert_reqs=resolve_cert_reqs(self.cert_reqs), - ) - - context = self.ssl_context - context.verify_mode = resolve_cert_reqs(self.cert_reqs) - self.sock = ssl_wrap_socket( - sock=conn, - keyfile=self.key_file, - certfile=self.cert_file, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - server_hostname=server_hostname, - ssl_context=context) - - if self.assert_fingerprint: - assert_fingerprint(self.sock.getpeercert(binary_form=True), - self.assert_fingerprint) - elif context.verify_mode != ssl.CERT_NONE \ - and not getattr(context, 'check_hostname', False) \ - and self.assert_hostname is not False: - # While urllib3 attempts to always turn off hostname matching from - # the TLS library, this cannot always be done. So we check whether - # the TLS Library still thinks it's matching hostnames. - cert = self.sock.getpeercert() - if not cert.get('subjectAltName', ()): - warnings.warn(( - 'Certificate for {0} has no `subjectAltName`, falling back to check for a ' - '`commonName` for now. This feature is being removed by major browsers and ' - 'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 ' - 'for details.)'.format(hostname)), - SubjectAltNameWarning - ) - _match_hostname(cert, self.assert_hostname or server_hostname) - - self.is_verified = ( - context.verify_mode == ssl.CERT_REQUIRED or - self.assert_fingerprint is not None - ) - - -def _match_hostname(cert, asserted_hostname): - try: - match_hostname(cert, asserted_hostname) - except CertificateError as e: - log.error( - 'Certificate did not match expected hostname: %s. ' - 'Certificate: %s', asserted_hostname, cert - ) - # Add cert to exception and reraise so client code can inspect - # the cert when catching the exception, if they want to - e._peer_cert = cert - raise - - -if ssl: - # Make a copy for testing. - UnverifiedHTTPSConnection = HTTPSConnection - HTTPSConnection = VerifiedHTTPSConnection -else: - HTTPSConnection = DummyConnection diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connectionpool.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connectionpool.py deleted file mode 100644 index f7a8f19..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connectionpool.py +++ /dev/null @@ -1,896 +0,0 @@ -from __future__ import absolute_import -import errno -import logging -import sys -import warnings - -from socket import error as SocketError, timeout as SocketTimeout -import socket - - -from .exceptions import ( - ClosedPoolError, - ProtocolError, - EmptyPoolError, - HeaderParsingError, - HostChangedError, - LocationValueError, - MaxRetryError, - ProxyError, - ReadTimeoutError, - SSLError, - TimeoutError, - InsecureRequestWarning, - NewConnectionError, -) -from .packages.ssl_match_hostname import CertificateError -from .packages import six -from .packages.six.moves import queue -from .connection import ( - port_by_scheme, - DummyConnection, - HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, - HTTPException, BaseSSLError, -) -from .request import RequestMethods -from .response import HTTPResponse - -from .util.connection import is_connection_dropped -from .util.request import set_file_position -from .util.response import assert_header_parsing -from .util.retry import Retry -from .util.timeout import Timeout -from .util.url import get_host, Url, NORMALIZABLE_SCHEMES -from .util.queue import LifoQueue - - -xrange = six.moves.xrange - -log = logging.getLogger(__name__) - -_Default = object() - - -# Pool objects -class ConnectionPool(object): - """ - Base class for all connection pools, such as - :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. - """ - - scheme = None - QueueCls = LifoQueue - - def __init__(self, host, port=None): - if not host: - raise LocationValueError("No host specified.") - - self.host = _ipv6_host(host, self.scheme) - self._proxy_host = host.lower() - self.port = port - - def __str__(self): - return '%s(host=%r, port=%r)' % (type(self).__name__, - self.host, self.port) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.close() - # Return False to re-raise any potential exceptions - return False - - def close(self): - """ - Close all pooled connections and disable the pool. - """ - pass - - -# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 -_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} - - -class HTTPConnectionPool(ConnectionPool, RequestMethods): - """ - Thread-safe connection pool for one host. - - :param host: - Host used for this HTTP Connection (e.g. "localhost"), passed into - :class:`httplib.HTTPConnection`. - - :param port: - Port used for this HTTP Connection (None is equivalent to 80), passed - into :class:`httplib.HTTPConnection`. - - :param strict: - Causes BadStatusLine to be raised if the status line can't be parsed - as a valid HTTP/1.0 or 1.1 status line, passed into - :class:`httplib.HTTPConnection`. - - .. note:: - Only works in Python 2. This parameter is ignored in Python 3. - - :param timeout: - Socket timeout in seconds for each individual connection. This can - be a float or integer, which sets the timeout for the HTTP request, - or an instance of :class:`urllib3.util.Timeout` which gives you more - fine-grained control over request timeouts. After the constructor has - been parsed, this is always a `urllib3.util.Timeout` object. - - :param maxsize: - Number of connections to save that can be reused. More than 1 is useful - in multithreaded situations. If ``block`` is set to False, more - connections will be created but they will not be saved once they've - been used. - - :param block: - If set to True, no more than ``maxsize`` connections will be used at - a time. When no free connections are available, the call will block - until a connection has been released. This is a useful side effect for - particular multithreaded situations where one does not want to use more - than maxsize connections per host to prevent flooding. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param retries: - Retry configuration to use by default with requests in this pool. - - :param _proxy: - Parsed proxy URL, should not be used directly, instead, see - :class:`urllib3.connectionpool.ProxyManager`" - - :param _proxy_headers: - A dictionary with proxy headers, should not be used directly, - instead, see :class:`urllib3.connectionpool.ProxyManager`" - - :param \\**conn_kw: - Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, - :class:`urllib3.connection.HTTPSConnection` instances. - """ - - scheme = 'http' - ConnectionCls = HTTPConnection - ResponseCls = HTTPResponse - - def __init__(self, host, port=None, strict=False, - timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, - headers=None, retries=None, - _proxy=None, _proxy_headers=None, - **conn_kw): - ConnectionPool.__init__(self, host, port) - RequestMethods.__init__(self, headers) - - self.strict = strict - - if not isinstance(timeout, Timeout): - timeout = Timeout.from_float(timeout) - - if retries is None: - retries = Retry.DEFAULT - - self.timeout = timeout - self.retries = retries - - self.pool = self.QueueCls(maxsize) - self.block = block - - self.proxy = _proxy - self.proxy_headers = _proxy_headers or {} - - # Fill the queue up so that doing get() on it will block properly - for _ in xrange(maxsize): - self.pool.put(None) - - # These are mostly for testing and debugging purposes. - self.num_connections = 0 - self.num_requests = 0 - self.conn_kw = conn_kw - - if self.proxy: - # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. - # We cannot know if the user has added default socket options, so we cannot replace the - # list. - self.conn_kw.setdefault('socket_options', []) - - def _new_conn(self): - """ - Return a fresh :class:`HTTPConnection`. - """ - self.num_connections += 1 - log.debug("Starting new HTTP connection (%d): %s:%s", - self.num_connections, self.host, self.port or "80") - - conn = self.ConnectionCls(host=self.host, port=self.port, - timeout=self.timeout.connect_timeout, - strict=self.strict, **self.conn_kw) - return conn - - def _get_conn(self, timeout=None): - """ - Get a connection. Will return a pooled connection if one is available. - - If no connections are available and :prop:`.block` is ``False``, then a - fresh connection is returned. - - :param timeout: - Seconds to wait before giving up and raising - :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and - :prop:`.block` is ``True``. - """ - conn = None - try: - conn = self.pool.get(block=self.block, timeout=timeout) - - except AttributeError: # self.pool is None - raise ClosedPoolError(self, "Pool is closed.") - - except queue.Empty: - if self.block: - raise EmptyPoolError(self, - "Pool reached maximum size and no more " - "connections are allowed.") - pass # Oh well, we'll create a new connection then - - # If this is a persistent connection, check if it got disconnected - if conn and is_connection_dropped(conn): - log.debug("Resetting dropped connection: %s", self.host) - conn.close() - if getattr(conn, 'auto_open', 1) == 0: - # This is a proxied connection that has been mutated by - # httplib._tunnel() and cannot be reused (since it would - # attempt to bypass the proxy) - conn = None - - return conn or self._new_conn() - - def _put_conn(self, conn): - """ - Put a connection back into the pool. - - :param conn: - Connection object for the current host and port as returned by - :meth:`._new_conn` or :meth:`._get_conn`. - - If the pool is already full, the connection is closed and discarded - because we exceeded maxsize. If connections are discarded frequently, - then maxsize should be increased. - - If the pool is closed, then the connection will be closed and discarded. - """ - try: - self.pool.put(conn, block=False) - return # Everything is dandy, done. - except AttributeError: - # self.pool is None. - pass - except queue.Full: - # This should never happen if self.block == True - log.warning( - "Connection pool is full, discarding connection: %s", - self.host) - - # Connection never got put back into the pool, close it. - if conn: - conn.close() - - def _validate_conn(self, conn): - """ - Called right before a request is made, after the socket is created. - """ - pass - - def _prepare_proxy(self, conn): - # Nothing to do for HTTP connections. - pass - - def _get_timeout(self, timeout): - """ Helper that always returns a :class:`urllib3.util.Timeout` """ - if timeout is _Default: - return self.timeout.clone() - - if isinstance(timeout, Timeout): - return timeout.clone() - else: - # User passed us an int/float. This is for backwards compatibility, - # can be removed later - return Timeout.from_float(timeout) - - def _raise_timeout(self, err, url, timeout_value): - """Is the error actually a timeout? Will raise a ReadTimeout or pass""" - - if isinstance(err, SocketTimeout): - raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) - - # See the above comment about EAGAIN in Python 3. In Python 2 we have - # to specifically catch it and throw the timeout error - if hasattr(err, 'errno') and err.errno in _blocking_errnos: - raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) - - # Catch possible read timeouts thrown as SSL errors. If not the - # case, rethrow the original. We need to do this because of: - # http://bugs.python.org/issue10272 - if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python < 2.7.4 - raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) - - def _make_request(self, conn, method, url, timeout=_Default, chunked=False, - **httplib_request_kw): - """ - Perform a request on a given urllib connection object taken from our - pool. - - :param conn: - a connection from one of our connection pools - - :param timeout: - Socket timeout in seconds for the request. This can be a - float or integer, which will set the same timeout value for - the socket connect and the socket read, or an instance of - :class:`urllib3.util.Timeout`, which gives you more fine-grained - control over your timeouts. - """ - self.num_requests += 1 - - timeout_obj = self._get_timeout(timeout) - timeout_obj.start_connect() - conn.timeout = timeout_obj.connect_timeout - - # Trigger any extra validation we need to do. - try: - self._validate_conn(conn) - except (SocketTimeout, BaseSSLError) as e: - # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. - self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) - raise - - # conn.request() calls httplib.*.request, not the method in - # urllib3.request. It also calls makefile (recv) on the socket. - if chunked: - conn.request_chunked(method, url, **httplib_request_kw) - else: - conn.request(method, url, **httplib_request_kw) - - # Reset the timeout for the recv() on the socket - read_timeout = timeout_obj.read_timeout - - # App Engine doesn't have a sock attr - if getattr(conn, 'sock', None): - # In Python 3 socket.py will catch EAGAIN and return None when you - # try and read into the file pointer created by http.client, which - # instead raises a BadStatusLine exception. Instead of catching - # the exception and assuming all BadStatusLine exceptions are read - # timeouts, check for a zero timeout before making the request. - if read_timeout == 0: - raise ReadTimeoutError( - self, url, "Read timed out. (read timeout=%s)" % read_timeout) - if read_timeout is Timeout.DEFAULT_TIMEOUT: - conn.sock.settimeout(socket.getdefaulttimeout()) - else: # None or a value - conn.sock.settimeout(read_timeout) - - # Receive the response from the server - try: - try: # Python 2.7, use buffering of HTTP responses - httplib_response = conn.getresponse(buffering=True) - except TypeError: # Python 3 - try: - httplib_response = conn.getresponse() - except Exception as e: - # Remove the TypeError from the exception chain in Python 3; - # otherwise it looks like a programming error was the cause. - six.raise_from(e, None) - except (SocketTimeout, BaseSSLError, SocketError) as e: - self._raise_timeout(err=e, url=url, timeout_value=read_timeout) - raise - - # AppEngine doesn't have a version attr. - http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') - log.debug("%s://%s:%s \"%s %s %s\" %s %s", self.scheme, self.host, self.port, - method, url, http_version, httplib_response.status, - httplib_response.length) - - try: - assert_header_parsing(httplib_response.msg) - except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 - log.warning( - 'Failed to parse headers (url=%s): %s', - self._absolute_url(url), hpe, exc_info=True) - - return httplib_response - - def _absolute_url(self, path): - return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url - - def close(self): - """ - Close all pooled connections and disable the pool. - """ - if self.pool is None: - return - # Disable access to the pool - old_pool, self.pool = self.pool, None - - try: - while True: - conn = old_pool.get(block=False) - if conn: - conn.close() - - except queue.Empty: - pass # Done. - - def is_same_host(self, url): - """ - Check if the given ``url`` is a member of the same host as this - connection pool. - """ - if url.startswith('/'): - return True - - # TODO: Add optional support for socket.gethostbyname checking. - scheme, host, port = get_host(url) - - host = _ipv6_host(host, self.scheme) - - # Use explicit default port for comparison when none is given - if self.port and not port: - port = port_by_scheme.get(scheme) - elif not self.port and port == port_by_scheme.get(scheme): - port = None - - return (scheme, host, port) == (self.scheme, self.host, self.port) - - def urlopen(self, method, url, body=None, headers=None, retries=None, - redirect=True, assert_same_host=True, timeout=_Default, - pool_timeout=None, release_conn=None, chunked=False, - body_pos=None, **response_kw): - """ - Get a connection from the pool and perform an HTTP request. This is the - lowest level call for making a request, so you'll need to specify all - the raw details. - - .. note:: - - More commonly, it's appropriate to use a convenience method provided - by :class:`.RequestMethods`, such as :meth:`request`. - - .. note:: - - `release_conn` will only behave as expected if - `preload_content=False` because we want to make - `preload_content=False` the default behaviour someday soon without - breaking backwards compatibility. - - :param method: - HTTP request method (such as GET, POST, PUT, etc.) - - :param body: - Data to send in the request body (useful for creating - POST requests, see HTTPConnectionPool.post_url for - more convenience). - - :param headers: - Dictionary of custom headers to send, such as User-Agent, - If-None-Match, etc. If None, pool headers are used. If provided, - these headers completely replace any pool-specific headers. - - :param retries: - Configure the number of retries to allow before raising a - :class:`~urllib3.exceptions.MaxRetryError` exception. - - Pass ``None`` to retry until you receive a response. Pass a - :class:`~urllib3.util.retry.Retry` object for fine-grained control - over different types of retries. - Pass an integer number to retry connection errors that many times, - but no other types of errors. Pass zero to never retry. - - If ``False``, then retries are disabled and any exception is raised - immediately. Also, instead of raising a MaxRetryError on redirects, - the redirect response will be returned. - - :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. - - :param redirect: - If True, automatically handle redirects (status codes 301, 302, - 303, 307, 308). Each redirect counts as a retry. Disabling retries - will disable redirect, too. - - :param assert_same_host: - If ``True``, will make sure that the host of the pool requests is - consistent else will raise HostChangedError. When False, you can - use the pool on an HTTP proxy and request foreign hosts. - - :param timeout: - If specified, overrides the default timeout for this one - request. It may be a float (in seconds) or an instance of - :class:`urllib3.util.Timeout`. - - :param pool_timeout: - If set and the pool is set to block=True, then this method will - block for ``pool_timeout`` seconds and raise EmptyPoolError if no - connection is available within the time period. - - :param release_conn: - If False, then the urlopen call will not release the connection - back into the pool once a response is received (but will release if - you read the entire contents of the response such as when - `preload_content=True`). This is useful if you're not preloading - the response's content immediately. You will need to call - ``r.release_conn()`` on the response ``r`` to return the connection - back into the pool. If None, it takes the value of - ``response_kw.get('preload_content', True)``. - - :param chunked: - If True, urllib3 will send the body using chunked transfer - encoding. Otherwise, urllib3 will send the body using the standard - content-length form. Defaults to False. - - :param int body_pos: - Position to seek to in file-like body in the event of a retry or - redirect. Typically this won't need to be set because urllib3 will - auto-populate the value when needed. - - :param \\**response_kw: - Additional parameters are passed to - :meth:`urllib3.response.HTTPResponse.from_httplib` - """ - if headers is None: - headers = self.headers - - if not isinstance(retries, Retry): - retries = Retry.from_int(retries, redirect=redirect, default=self.retries) - - if release_conn is None: - release_conn = response_kw.get('preload_content', True) - - # Check host - if assert_same_host and not self.is_same_host(url): - raise HostChangedError(self, url, retries) - - conn = None - - # Track whether `conn` needs to be released before - # returning/raising/recursing. Update this variable if necessary, and - # leave `release_conn` constant throughout the function. That way, if - # the function recurses, the original value of `release_conn` will be - # passed down into the recursive call, and its value will be respected. - # - # See issue #651 [1] for details. - # - # [1] <https://github.com/shazow/urllib3/issues/651> - release_this_conn = release_conn - - # Merge the proxy headers. Only do this in HTTP. We have to copy the - # headers dict so we can safely change it without those changes being - # reflected in anyone else's copy. - if self.scheme == 'http': - headers = headers.copy() - headers.update(self.proxy_headers) - - # Must keep the exception bound to a separate variable or else Python 3 - # complains about UnboundLocalError. - err = None - - # Keep track of whether we cleanly exited the except block. This - # ensures we do proper cleanup in finally. - clean_exit = False - - # Rewind body position, if needed. Record current position - # for future rewinds in the event of a redirect/retry. - body_pos = set_file_position(body, body_pos) - - try: - # Request a connection from the queue. - timeout_obj = self._get_timeout(timeout) - conn = self._get_conn(timeout=pool_timeout) - - conn.timeout = timeout_obj.connect_timeout - - is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None) - if is_new_proxy_conn: - self._prepare_proxy(conn) - - # Make the request on the httplib connection object. - httplib_response = self._make_request(conn, method, url, - timeout=timeout_obj, - body=body, headers=headers, - chunked=chunked) - - # If we're going to release the connection in ``finally:``, then - # the response doesn't need to know about the connection. Otherwise - # it will also try to release it and we'll have a double-release - # mess. - response_conn = conn if not release_conn else None - - # Pass method to Response for length checking - response_kw['request_method'] = method - - # Import httplib's response into our own wrapper object - response = self.ResponseCls.from_httplib(httplib_response, - pool=self, - connection=response_conn, - retries=retries, - **response_kw) - - # Everything went great! - clean_exit = True - - except queue.Empty: - # Timed out by queue. - raise EmptyPoolError(self, "No pool connections are available.") - - except (TimeoutError, HTTPException, SocketError, ProtocolError, - BaseSSLError, SSLError, CertificateError) as e: - # Discard the connection for these exceptions. It will be - # replaced during the next _get_conn() call. - clean_exit = False - if isinstance(e, (BaseSSLError, CertificateError)): - e = SSLError(e) - elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: - e = ProxyError('Cannot connect to proxy.', e) - elif isinstance(e, (SocketError, HTTPException)): - e = ProtocolError('Connection aborted.', e) - - retries = retries.increment(method, url, error=e, _pool=self, - _stacktrace=sys.exc_info()[2]) - retries.sleep() - - # Keep track of the error for the retry warning. - err = e - - finally: - if not clean_exit: - # We hit some kind of exception, handled or otherwise. We need - # to throw the connection away unless explicitly told not to. - # Close the connection, set the variable to None, and make sure - # we put the None back in the pool to avoid leaking it. - conn = conn and conn.close() - release_this_conn = True - - if release_this_conn: - # Put the connection back to be reused. If the connection is - # expired then it will be None, which will get replaced with a - # fresh connection during _get_conn. - self._put_conn(conn) - - if not conn: - # Try again - log.warning("Retrying (%r) after connection " - "broken by '%r': %s", retries, err, url) - return self.urlopen(method, url, body, headers, retries, - redirect, assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, body_pos=body_pos, - **response_kw) - - def drain_and_release_conn(response): - try: - # discard any remaining response body, the connection will be - # released back to the pool once the entire response is read - response.read() - except (TimeoutError, HTTPException, SocketError, ProtocolError, - BaseSSLError, SSLError) as e: - pass - - # Handle redirect? - redirect_location = redirect and response.get_redirect_location() - if redirect_location: - if response.status == 303: - method = 'GET' - - try: - retries = retries.increment(method, url, response=response, _pool=self) - except MaxRetryError: - if retries.raise_on_redirect: - # Drain and release the connection for this response, since - # we're not returning it to be released manually. - drain_and_release_conn(response) - raise - return response - - # drain and return the connection to the pool before recursing - drain_and_release_conn(response) - - retries.sleep_for_retry(response) - log.debug("Redirecting %s -> %s", url, redirect_location) - return self.urlopen( - method, redirect_location, body, headers, - retries=retries, redirect=redirect, - assert_same_host=assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, body_pos=body_pos, - **response_kw) - - # Check if we should retry the HTTP response. - has_retry_after = bool(response.getheader('Retry-After')) - if retries.is_retry(method, response.status, has_retry_after): - try: - retries = retries.increment(method, url, response=response, _pool=self) - except MaxRetryError: - if retries.raise_on_status: - # Drain and release the connection for this response, since - # we're not returning it to be released manually. - drain_and_release_conn(response) - raise - return response - - # drain and return the connection to the pool before recursing - drain_and_release_conn(response) - - retries.sleep(response) - log.debug("Retry: %s", url) - return self.urlopen( - method, url, body, headers, - retries=retries, redirect=redirect, - assert_same_host=assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, - body_pos=body_pos, **response_kw) - - return response - - -class HTTPSConnectionPool(HTTPConnectionPool): - """ - Same as :class:`.HTTPConnectionPool`, but HTTPS. - - When Python is compiled with the :mod:`ssl` module, then - :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, - instead of :class:`.HTTPSConnection`. - - :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, - ``assert_hostname`` and ``host`` in this order to verify connections. - If ``assert_hostname`` is False, no verification is done. - - The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, - ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is - available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade - the connection socket into an SSL socket. - """ - - scheme = 'https' - ConnectionCls = HTTPSConnection - - def __init__(self, host, port=None, - strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, - block=False, headers=None, retries=None, - _proxy=None, _proxy_headers=None, - key_file=None, cert_file=None, cert_reqs=None, - ca_certs=None, ssl_version=None, - assert_hostname=None, assert_fingerprint=None, - ca_cert_dir=None, **conn_kw): - - HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, - block, headers, retries, _proxy, _proxy_headers, - **conn_kw) - - if ca_certs and cert_reqs is None: - cert_reqs = 'CERT_REQUIRED' - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.ca_certs = ca_certs - self.ca_cert_dir = ca_cert_dir - self.ssl_version = ssl_version - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - - def _prepare_conn(self, conn): - """ - Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` - and establish the tunnel if proxy is used. - """ - - if isinstance(conn, VerifiedHTTPSConnection): - conn.set_cert(key_file=self.key_file, - cert_file=self.cert_file, - cert_reqs=self.cert_reqs, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - assert_hostname=self.assert_hostname, - assert_fingerprint=self.assert_fingerprint) - conn.ssl_version = self.ssl_version - return conn - - def _prepare_proxy(self, conn): - """ - Establish tunnel connection early, because otherwise httplib - would improperly set Host: header to proxy's IP:port. - """ - conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers) - conn.connect() - - def _new_conn(self): - """ - Return a fresh :class:`httplib.HTTPSConnection`. - """ - self.num_connections += 1 - log.debug("Starting new HTTPS connection (%d): %s:%s", - self.num_connections, self.host, self.port or "443") - - if not self.ConnectionCls or self.ConnectionCls is DummyConnection: - raise SSLError("Can't connect to HTTPS URL because the SSL " - "module is not available.") - - actual_host = self.host - actual_port = self.port - if self.proxy is not None: - actual_host = self.proxy.host - actual_port = self.proxy.port - - conn = self.ConnectionCls(host=actual_host, port=actual_port, - timeout=self.timeout.connect_timeout, - strict=self.strict, **self.conn_kw) - - return self._prepare_conn(conn) - - def _validate_conn(self, conn): - """ - Called right before a request is made, after the socket is created. - """ - super(HTTPSConnectionPool, self)._validate_conn(conn) - - # Force connect early to allow us to validate the connection. - if not getattr(conn, 'sock', None): # AppEngine might not have `.sock` - conn.connect() - - if not conn.is_verified: - warnings.warn(( - 'Unverified HTTPS request is being made. ' - 'Adding certificate verification is strongly advised. See: ' - 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' - '#ssl-warnings'), - InsecureRequestWarning) - - -def connection_from_url(url, **kw): - """ - Given a url, return an :class:`.ConnectionPool` instance of its host. - - This is a shortcut for not having to parse out the scheme, host, and port - of the url before creating an :class:`.ConnectionPool` instance. - - :param url: - Absolute URL string that must include the scheme. Port is optional. - - :param \\**kw: - Passes additional parameters to the constructor of the appropriate - :class:`.ConnectionPool`. Useful for specifying things like - timeout, maxsize, headers, etc. - - Example:: - - >>> conn = connection_from_url('http://google.com/') - >>> r = conn.request('GET', '/') - """ - scheme, host, port = get_host(url) - port = port or port_by_scheme.get(scheme, 80) - if scheme == 'https': - return HTTPSConnectionPool(host, port=port, **kw) - else: - return HTTPConnectionPool(host, port=port, **kw) - - -def _ipv6_host(host, scheme): - """ - Process IPv6 address literals - """ - - # httplib doesn't like it when we include brackets in IPv6 addresses - # Specifically, if we include brackets but also pass the port then - # httplib crazily doubles up the square brackets on the Host header. - # Instead, we need to make sure we never pass ``None`` as the port. - # However, for backward compatibility reasons we can't actually - # *assert* that. See http://bugs.python.org/issue28539 - # - # Also if an IPv6 address literal has a zone identifier, the - # percent sign might be URIencoded, convert it back into ASCII - if host.startswith('[') and host.endswith(']'): - host = host.replace('%25', '%').strip('[]') - if scheme in NORMALIZABLE_SCHEMES: - host = host.lower() - return host diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 270fc1984dd51a463cccce838a136adef696f1a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 zcmWIL<>g`kf)oEW<3RLd5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;x`0enx(7s(w*M zYDsEdev!UgPG&(tkbWA7D$-3)1j?1A=9TH^WG3ksRF-7q=Nao+=oe>}r0NzVCTAz6 zrxxoMWESWeTIw0-8S55Q0;Tm*)6+qM`td-mDL_L@i*kVajrEiB^Gb?<2F1r`=4F<| Z$LkeT-r}&y%}*)KNwotx>@yHE003rtJ5m4u diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-38.pyc deleted file mode 100644 index 90d47ba3327883c287d6005679453b83bb6656e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1146 zcmZ`&L2uJA6t<l-&AJrWga#a#a?PO)XqO=&M1gGDVPR^wA@x9%)h5lF#+Kt%Y}aw& zU%+wygbRNlS5Eu|4lB=TwN=_`$?w^p?dQ+mdp>G58wlF3srUIeLFkX3EH=Q<Tj<3$ z7>fFcVoEaH$JC(aH`FJzMlJ9Lty3GkNmpnCe2uPB2fRf|4|&atca6hgTDW6Q&obr; z$tNjgFlTXIxQe@!DK=298Zx&dgd5~ZnlqQ>lT`A2%yQLk`~?Om9B8}PFihS<FV?{* zbcw_xg)2)gQ4d|=&@;;Qw1_f3h_fgbf>puGHNb!fU4S<3K+$+IF0PQYAb4f|efNia z%zQZn#yOY%PL>MM^}lE*TS*LS6X5M<>4`7S)sW{~?QOqE6>EujFp3ja_#zdpm#^9{ z+FLDg4$EzpBpUQ1I7%Vtnatq)mOtRRk`U;YV>H*KEzU~^=-#}?)*4jF#1=NEgqYV- zW6K45Fc*wFS}+I1k~-ZUsm{q7jBnpP8`S|TA1_`T6>&~a_*WgQ(8m#$D`4+jYXDf~ z=_w2-R_GLuEWSaB9#P{N8d*>&W>~Iu4i18FcP|X0?ooKSw;x<MAJ~LtT<AjZ%ZI(7 zdmMD5-p8H8Pn~Yyk&^JDtk0FXkF(Ub>jEisA`xz2XIf#)X}YlQhUVrXO}?q1w6tD8 zS8B;G)^|Bips;Ui*O#lX;2F{ZC!5+V6I7b8`ULtseVQC0)^&y7A*eT3I?n3-6#pRl zPyQs-80o)ehJ9<d6GX@RJEf`Q8C&E~8VOVP3Z%(B*Bs_K)N`+1)}x5>K@`oNq3fy2 gZlzttZ|SQ_`}OR%ztKOm&@z~&ZP=D=+BMty4>d*dF8}}l diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-38.pyc deleted file mode 100644 index 6375c405cca01ab1b0aadd592851a07702ec1289..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14672 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-38.pyc deleted file mode 100644 index 5fdbb737548b698dcef88fa7389c09696a4e181e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4994 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 A&Hw-a diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_appengine_environ.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_appengine_environ.py deleted file mode 100644 index f3e0094..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_appengine_environ.py +++ /dev/null @@ -1,30 +0,0 @@ -""" -This module provides means to detect the App Engine environment. -""" - -import os - - -def is_appengine(): - return (is_local_appengine() or - is_prod_appengine() or - is_prod_appengine_mvms()) - - -def is_appengine_sandbox(): - return is_appengine() and not is_prod_appengine_mvms() - - -def is_local_appengine(): - return ('APPENGINE_RUNTIME' in os.environ and - 'Development/' in os.environ['SERVER_SOFTWARE']) - - -def is_prod_appengine(): - return ('APPENGINE_RUNTIME' in os.environ and - 'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and - not is_prod_appengine_mvms()) - - -def is_prod_appengine_mvms(): - return os.environ.get('GAE_VM', False) == 'true' diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/bindings.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/bindings.py deleted file mode 100644 index bcf41c0..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +++ /dev/null @@ -1,593 +0,0 @@ -""" -This module uses ctypes to bind a whole bunch of functions and constants from -SecureTransport. The goal here is to provide the low-level API to -SecureTransport. These are essentially the C-level functions and constants, and -they're pretty gross to work with. - -This code is a bastardised version of the code found in Will Bond's oscrypto -library. An enormous debt is owed to him for blazing this trail for us. For -that reason, this code should be considered to be covered both by urllib3's -license and by oscrypto's: - - Copyright (c) 2015-2016 Will Bond <will@wbond.net> - - 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. -""" -from __future__ import absolute_import - -import platform -from ctypes.util import find_library -from ctypes import ( - c_void_p, c_int32, c_char_p, c_size_t, c_byte, c_uint32, c_ulong, c_long, - c_bool -) -from ctypes import CDLL, POINTER, CFUNCTYPE - - -security_path = find_library('Security') -if not security_path: - raise ImportError('The library Security could not be found') - - -core_foundation_path = find_library('CoreFoundation') -if not core_foundation_path: - raise ImportError('The library CoreFoundation could not be found') - - -version = platform.mac_ver()[0] -version_info = tuple(map(int, version.split('.'))) -if version_info < (10, 8): - raise OSError( - 'Only OS X 10.8 and newer are supported, not %s.%s' % ( - version_info[0], version_info[1] - ) - ) - -Security = CDLL(security_path, use_errno=True) -CoreFoundation = CDLL(core_foundation_path, use_errno=True) - -Boolean = c_bool -CFIndex = c_long -CFStringEncoding = c_uint32 -CFData = c_void_p -CFString = c_void_p -CFArray = c_void_p -CFMutableArray = c_void_p -CFDictionary = c_void_p -CFError = c_void_p -CFType = c_void_p -CFTypeID = c_ulong - -CFTypeRef = POINTER(CFType) -CFAllocatorRef = c_void_p - -OSStatus = c_int32 - -CFDataRef = POINTER(CFData) -CFStringRef = POINTER(CFString) -CFArrayRef = POINTER(CFArray) -CFMutableArrayRef = POINTER(CFMutableArray) -CFDictionaryRef = POINTER(CFDictionary) -CFArrayCallBacks = c_void_p -CFDictionaryKeyCallBacks = c_void_p -CFDictionaryValueCallBacks = c_void_p - -SecCertificateRef = POINTER(c_void_p) -SecExternalFormat = c_uint32 -SecExternalItemType = c_uint32 -SecIdentityRef = POINTER(c_void_p) -SecItemImportExportFlags = c_uint32 -SecItemImportExportKeyParameters = c_void_p -SecKeychainRef = POINTER(c_void_p) -SSLProtocol = c_uint32 -SSLCipherSuite = c_uint32 -SSLContextRef = POINTER(c_void_p) -SecTrustRef = POINTER(c_void_p) -SSLConnectionRef = c_uint32 -SecTrustResultType = c_uint32 -SecTrustOptionFlags = c_uint32 -SSLProtocolSide = c_uint32 -SSLConnectionType = c_uint32 -SSLSessionOption = c_uint32 - - -try: - Security.SecItemImport.argtypes = [ - CFDataRef, - CFStringRef, - POINTER(SecExternalFormat), - POINTER(SecExternalItemType), - SecItemImportExportFlags, - POINTER(SecItemImportExportKeyParameters), - SecKeychainRef, - POINTER(CFArrayRef), - ] - Security.SecItemImport.restype = OSStatus - - Security.SecCertificateGetTypeID.argtypes = [] - Security.SecCertificateGetTypeID.restype = CFTypeID - - Security.SecIdentityGetTypeID.argtypes = [] - Security.SecIdentityGetTypeID.restype = CFTypeID - - Security.SecKeyGetTypeID.argtypes = [] - Security.SecKeyGetTypeID.restype = CFTypeID - - Security.SecCertificateCreateWithData.argtypes = [ - CFAllocatorRef, - CFDataRef - ] - Security.SecCertificateCreateWithData.restype = SecCertificateRef - - Security.SecCertificateCopyData.argtypes = [ - SecCertificateRef - ] - Security.SecCertificateCopyData.restype = CFDataRef - - Security.SecCopyErrorMessageString.argtypes = [ - OSStatus, - c_void_p - ] - Security.SecCopyErrorMessageString.restype = CFStringRef - - Security.SecIdentityCreateWithCertificate.argtypes = [ - CFTypeRef, - SecCertificateRef, - POINTER(SecIdentityRef) - ] - Security.SecIdentityCreateWithCertificate.restype = OSStatus - - Security.SecKeychainCreate.argtypes = [ - c_char_p, - c_uint32, - c_void_p, - Boolean, - c_void_p, - POINTER(SecKeychainRef) - ] - Security.SecKeychainCreate.restype = OSStatus - - Security.SecKeychainDelete.argtypes = [ - SecKeychainRef - ] - Security.SecKeychainDelete.restype = OSStatus - - Security.SecPKCS12Import.argtypes = [ - CFDataRef, - CFDictionaryRef, - POINTER(CFArrayRef) - ] - Security.SecPKCS12Import.restype = OSStatus - - SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) - SSLWriteFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t)) - - Security.SSLSetIOFuncs.argtypes = [ - SSLContextRef, - SSLReadFunc, - SSLWriteFunc - ] - Security.SSLSetIOFuncs.restype = OSStatus - - Security.SSLSetPeerID.argtypes = [ - SSLContextRef, - c_char_p, - c_size_t - ] - Security.SSLSetPeerID.restype = OSStatus - - Security.SSLSetCertificate.argtypes = [ - SSLContextRef, - CFArrayRef - ] - Security.SSLSetCertificate.restype = OSStatus - - Security.SSLSetCertificateAuthorities.argtypes = [ - SSLContextRef, - CFTypeRef, - Boolean - ] - Security.SSLSetCertificateAuthorities.restype = OSStatus - - Security.SSLSetConnection.argtypes = [ - SSLContextRef, - SSLConnectionRef - ] - Security.SSLSetConnection.restype = OSStatus - - Security.SSLSetPeerDomainName.argtypes = [ - SSLContextRef, - c_char_p, - c_size_t - ] - Security.SSLSetPeerDomainName.restype = OSStatus - - Security.SSLHandshake.argtypes = [ - SSLContextRef - ] - Security.SSLHandshake.restype = OSStatus - - Security.SSLRead.argtypes = [ - SSLContextRef, - c_char_p, - c_size_t, - POINTER(c_size_t) - ] - Security.SSLRead.restype = OSStatus - - Security.SSLWrite.argtypes = [ - SSLContextRef, - c_char_p, - c_size_t, - POINTER(c_size_t) - ] - Security.SSLWrite.restype = OSStatus - - Security.SSLClose.argtypes = [ - SSLContextRef - ] - Security.SSLClose.restype = OSStatus - - Security.SSLGetNumberSupportedCiphers.argtypes = [ - SSLContextRef, - POINTER(c_size_t) - ] - Security.SSLGetNumberSupportedCiphers.restype = OSStatus - - Security.SSLGetSupportedCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - POINTER(c_size_t) - ] - Security.SSLGetSupportedCiphers.restype = OSStatus - - Security.SSLSetEnabledCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - c_size_t - ] - Security.SSLSetEnabledCiphers.restype = OSStatus - - Security.SSLGetNumberEnabledCiphers.argtype = [ - SSLContextRef, - POINTER(c_size_t) - ] - Security.SSLGetNumberEnabledCiphers.restype = OSStatus - - Security.SSLGetEnabledCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - POINTER(c_size_t) - ] - Security.SSLGetEnabledCiphers.restype = OSStatus - - Security.SSLGetNegotiatedCipher.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite) - ] - Security.SSLGetNegotiatedCipher.restype = OSStatus - - Security.SSLGetNegotiatedProtocolVersion.argtypes = [ - SSLContextRef, - POINTER(SSLProtocol) - ] - Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus - - Security.SSLCopyPeerTrust.argtypes = [ - SSLContextRef, - POINTER(SecTrustRef) - ] - Security.SSLCopyPeerTrust.restype = OSStatus - - Security.SecTrustSetAnchorCertificates.argtypes = [ - SecTrustRef, - CFArrayRef - ] - Security.SecTrustSetAnchorCertificates.restype = OSStatus - - Security.SecTrustSetAnchorCertificatesOnly.argstypes = [ - SecTrustRef, - Boolean - ] - Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus - - Security.SecTrustEvaluate.argtypes = [ - SecTrustRef, - POINTER(SecTrustResultType) - ] - Security.SecTrustEvaluate.restype = OSStatus - - Security.SecTrustGetCertificateCount.argtypes = [ - SecTrustRef - ] - Security.SecTrustGetCertificateCount.restype = CFIndex - - Security.SecTrustGetCertificateAtIndex.argtypes = [ - SecTrustRef, - CFIndex - ] - Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef - - Security.SSLCreateContext.argtypes = [ - CFAllocatorRef, - SSLProtocolSide, - SSLConnectionType - ] - Security.SSLCreateContext.restype = SSLContextRef - - Security.SSLSetSessionOption.argtypes = [ - SSLContextRef, - SSLSessionOption, - Boolean - ] - Security.SSLSetSessionOption.restype = OSStatus - - Security.SSLSetProtocolVersionMin.argtypes = [ - SSLContextRef, - SSLProtocol - ] - Security.SSLSetProtocolVersionMin.restype = OSStatus - - Security.SSLSetProtocolVersionMax.argtypes = [ - SSLContextRef, - SSLProtocol - ] - Security.SSLSetProtocolVersionMax.restype = OSStatus - - Security.SecCopyErrorMessageString.argtypes = [ - OSStatus, - c_void_p - ] - Security.SecCopyErrorMessageString.restype = CFStringRef - - Security.SSLReadFunc = SSLReadFunc - Security.SSLWriteFunc = SSLWriteFunc - Security.SSLContextRef = SSLContextRef - Security.SSLProtocol = SSLProtocol - Security.SSLCipherSuite = SSLCipherSuite - Security.SecIdentityRef = SecIdentityRef - Security.SecKeychainRef = SecKeychainRef - Security.SecTrustRef = SecTrustRef - Security.SecTrustResultType = SecTrustResultType - Security.SecExternalFormat = SecExternalFormat - Security.OSStatus = OSStatus - - Security.kSecImportExportPassphrase = CFStringRef.in_dll( - Security, 'kSecImportExportPassphrase' - ) - Security.kSecImportItemIdentity = CFStringRef.in_dll( - Security, 'kSecImportItemIdentity' - ) - - # CoreFoundation time! - CoreFoundation.CFRetain.argtypes = [ - CFTypeRef - ] - CoreFoundation.CFRetain.restype = CFTypeRef - - CoreFoundation.CFRelease.argtypes = [ - CFTypeRef - ] - CoreFoundation.CFRelease.restype = None - - CoreFoundation.CFGetTypeID.argtypes = [ - CFTypeRef - ] - CoreFoundation.CFGetTypeID.restype = CFTypeID - - CoreFoundation.CFStringCreateWithCString.argtypes = [ - CFAllocatorRef, - c_char_p, - CFStringEncoding - ] - CoreFoundation.CFStringCreateWithCString.restype = CFStringRef - - CoreFoundation.CFStringGetCStringPtr.argtypes = [ - CFStringRef, - CFStringEncoding - ] - CoreFoundation.CFStringGetCStringPtr.restype = c_char_p - - CoreFoundation.CFStringGetCString.argtypes = [ - CFStringRef, - c_char_p, - CFIndex, - CFStringEncoding - ] - CoreFoundation.CFStringGetCString.restype = c_bool - - CoreFoundation.CFDataCreate.argtypes = [ - CFAllocatorRef, - c_char_p, - CFIndex - ] - CoreFoundation.CFDataCreate.restype = CFDataRef - - CoreFoundation.CFDataGetLength.argtypes = [ - CFDataRef - ] - CoreFoundation.CFDataGetLength.restype = CFIndex - - CoreFoundation.CFDataGetBytePtr.argtypes = [ - CFDataRef - ] - CoreFoundation.CFDataGetBytePtr.restype = c_void_p - - CoreFoundation.CFDictionaryCreate.argtypes = [ - CFAllocatorRef, - POINTER(CFTypeRef), - POINTER(CFTypeRef), - CFIndex, - CFDictionaryKeyCallBacks, - CFDictionaryValueCallBacks - ] - CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef - - CoreFoundation.CFDictionaryGetValue.argtypes = [ - CFDictionaryRef, - CFTypeRef - ] - CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef - - CoreFoundation.CFArrayCreate.argtypes = [ - CFAllocatorRef, - POINTER(CFTypeRef), - CFIndex, - CFArrayCallBacks, - ] - CoreFoundation.CFArrayCreate.restype = CFArrayRef - - CoreFoundation.CFArrayCreateMutable.argtypes = [ - CFAllocatorRef, - CFIndex, - CFArrayCallBacks - ] - CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef - - CoreFoundation.CFArrayAppendValue.argtypes = [ - CFMutableArrayRef, - c_void_p - ] - CoreFoundation.CFArrayAppendValue.restype = None - - CoreFoundation.CFArrayGetCount.argtypes = [ - CFArrayRef - ] - CoreFoundation.CFArrayGetCount.restype = CFIndex - - CoreFoundation.CFArrayGetValueAtIndex.argtypes = [ - CFArrayRef, - CFIndex - ] - CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p - - CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( - CoreFoundation, 'kCFAllocatorDefault' - ) - CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(CoreFoundation, 'kCFTypeArrayCallBacks') - CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( - CoreFoundation, 'kCFTypeDictionaryKeyCallBacks' - ) - CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( - CoreFoundation, 'kCFTypeDictionaryValueCallBacks' - ) - - CoreFoundation.CFTypeRef = CFTypeRef - CoreFoundation.CFArrayRef = CFArrayRef - CoreFoundation.CFStringRef = CFStringRef - CoreFoundation.CFDictionaryRef = CFDictionaryRef - -except (AttributeError): - raise ImportError('Error initializing ctypes') - - -class CFConst(object): - """ - A class object that acts as essentially a namespace for CoreFoundation - constants. - """ - kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) - - -class SecurityConst(object): - """ - A class object that acts as essentially a namespace for Security constants. - """ - kSSLSessionOptionBreakOnServerAuth = 0 - - kSSLProtocol2 = 1 - kSSLProtocol3 = 2 - kTLSProtocol1 = 4 - kTLSProtocol11 = 7 - kTLSProtocol12 = 8 - - kSSLClientSide = 1 - kSSLStreamType = 0 - - kSecFormatPEMSequence = 10 - - kSecTrustResultInvalid = 0 - kSecTrustResultProceed = 1 - # This gap is present on purpose: this was kSecTrustResultConfirm, which - # is deprecated. - kSecTrustResultDeny = 3 - kSecTrustResultUnspecified = 4 - kSecTrustResultRecoverableTrustFailure = 5 - kSecTrustResultFatalTrustFailure = 6 - kSecTrustResultOtherError = 7 - - errSSLProtocol = -9800 - errSSLWouldBlock = -9803 - errSSLClosedGraceful = -9805 - errSSLClosedNoNotify = -9816 - errSSLClosedAbort = -9806 - - errSSLXCertChainInvalid = -9807 - errSSLCrypto = -9809 - errSSLInternal = -9810 - errSSLCertExpired = -9814 - errSSLCertNotYetValid = -9815 - errSSLUnknownRootCert = -9812 - errSSLNoRootCert = -9813 - errSSLHostNameMismatch = -9843 - errSSLPeerHandshakeFail = -9824 - errSSLPeerUserCancelled = -9839 - errSSLWeakPeerEphemeralDHKey = -9850 - errSSLServerAuthCompleted = -9841 - errSSLRecordOverflow = -9847 - - errSecVerifyFailed = -67808 - errSecNoTrustSettings = -25263 - errSecItemNotFound = -25300 - errSecInvalidTrustSettings = -25262 - - # Cipher suites. We only pick the ones our default cipher string allows. - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F - TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3 - TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F - TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2 - TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 - TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A - TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 - TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B - TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A - TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 - TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038 - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 - TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 - TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040 - TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 - TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032 - TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D - TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C - TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D - TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C - TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 - TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F - TLS_AES_128_GCM_SHA256 = 0x1301 - TLS_AES_256_GCM_SHA384 = 0x1302 - TLS_CHACHA20_POLY1305_SHA256 = 0x1303 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/low_level.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/low_level.py deleted file mode 100644 index b13cd9e..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +++ /dev/null @@ -1,346 +0,0 @@ -""" -Low-level helpers for the SecureTransport bindings. - -These are Python functions that are not directly related to the high-level APIs -but are necessary to get them to work. They include a whole bunch of low-level -CoreFoundation messing about and memory management. The concerns in this module -are almost entirely about trying to avoid memory leaks and providing -appropriate and useful assistance to the higher-level code. -""" -import base64 -import ctypes -import itertools -import re -import os -import ssl -import tempfile - -from .bindings import Security, CoreFoundation, CFConst - - -# This regular expression is used to grab PEM data out of a PEM bundle. -_PEM_CERTS_RE = re.compile( - b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL -) - - -def _cf_data_from_bytes(bytestring): - """ - Given a bytestring, create a CFData object from it. This CFData object must - be CFReleased by the caller. - """ - return CoreFoundation.CFDataCreate( - CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring) - ) - - -def _cf_dictionary_from_tuples(tuples): - """ - Given a list of Python tuples, create an associated CFDictionary. - """ - dictionary_size = len(tuples) - - # We need to get the dictionary keys and values out in the same order. - keys = (t[0] for t in tuples) - values = (t[1] for t in tuples) - cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys) - cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values) - - return CoreFoundation.CFDictionaryCreate( - CoreFoundation.kCFAllocatorDefault, - cf_keys, - cf_values, - dictionary_size, - CoreFoundation.kCFTypeDictionaryKeyCallBacks, - CoreFoundation.kCFTypeDictionaryValueCallBacks, - ) - - -def _cf_string_to_unicode(value): - """ - Creates a Unicode string from a CFString object. Used entirely for error - reporting. - - Yes, it annoys me quite a lot that this function is this complex. - """ - value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p)) - - string = CoreFoundation.CFStringGetCStringPtr( - value_as_void_p, - CFConst.kCFStringEncodingUTF8 - ) - if string is None: - buffer = ctypes.create_string_buffer(1024) - result = CoreFoundation.CFStringGetCString( - value_as_void_p, - buffer, - 1024, - CFConst.kCFStringEncodingUTF8 - ) - if not result: - raise OSError('Error copying C string from CFStringRef') - string = buffer.value - if string is not None: - string = string.decode('utf-8') - return string - - -def _assert_no_error(error, exception_class=None): - """ - Checks the return code and throws an exception if there is an error to - report - """ - if error == 0: - return - - cf_error_string = Security.SecCopyErrorMessageString(error, None) - output = _cf_string_to_unicode(cf_error_string) - CoreFoundation.CFRelease(cf_error_string) - - if output is None or output == u'': - output = u'OSStatus %s' % error - - if exception_class is None: - exception_class = ssl.SSLError - - raise exception_class(output) - - -def _cert_array_from_pem(pem_bundle): - """ - Given a bundle of certs in PEM format, turns them into a CFArray of certs - that can be used to validate a cert chain. - """ - # Normalize the PEM bundle's line endings. - pem_bundle = pem_bundle.replace(b"\r\n", b"\n") - - der_certs = [ - base64.b64decode(match.group(1)) - for match in _PEM_CERTS_RE.finditer(pem_bundle) - ] - if not der_certs: - raise ssl.SSLError("No root certificates specified") - - cert_array = CoreFoundation.CFArrayCreateMutable( - CoreFoundation.kCFAllocatorDefault, - 0, - ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks) - ) - if not cert_array: - raise ssl.SSLError("Unable to allocate memory!") - - try: - for der_bytes in der_certs: - certdata = _cf_data_from_bytes(der_bytes) - if not certdata: - raise ssl.SSLError("Unable to allocate memory!") - cert = Security.SecCertificateCreateWithData( - CoreFoundation.kCFAllocatorDefault, certdata - ) - CoreFoundation.CFRelease(certdata) - if not cert: - raise ssl.SSLError("Unable to build cert object!") - - CoreFoundation.CFArrayAppendValue(cert_array, cert) - CoreFoundation.CFRelease(cert) - except Exception: - # We need to free the array before the exception bubbles further. - # We only want to do that if an error occurs: otherwise, the caller - # should free. - CoreFoundation.CFRelease(cert_array) - - return cert_array - - -def _is_cert(item): - """ - Returns True if a given CFTypeRef is a certificate. - """ - expected = Security.SecCertificateGetTypeID() - return CoreFoundation.CFGetTypeID(item) == expected - - -def _is_identity(item): - """ - Returns True if a given CFTypeRef is an identity. - """ - expected = Security.SecIdentityGetTypeID() - return CoreFoundation.CFGetTypeID(item) == expected - - -def _temporary_keychain(): - """ - This function creates a temporary Mac keychain that we can use to work with - credentials. This keychain uses a one-time password and a temporary file to - store the data. We expect to have one keychain per socket. The returned - SecKeychainRef must be freed by the caller, including calling - SecKeychainDelete. - - Returns a tuple of the SecKeychainRef and the path to the temporary - directory that contains it. - """ - # Unfortunately, SecKeychainCreate requires a path to a keychain. This - # means we cannot use mkstemp to use a generic temporary file. Instead, - # we're going to create a temporary directory and a filename to use there. - # This filename will be 8 random bytes expanded into base64. We also need - # some random bytes to password-protect the keychain we're creating, so we - # ask for 40 random bytes. - random_bytes = os.urandom(40) - filename = base64.b16encode(random_bytes[:8]).decode('utf-8') - password = base64.b16encode(random_bytes[8:]) # Must be valid UTF-8 - tempdirectory = tempfile.mkdtemp() - - keychain_path = os.path.join(tempdirectory, filename).encode('utf-8') - - # We now want to create the keychain itself. - keychain = Security.SecKeychainRef() - status = Security.SecKeychainCreate( - keychain_path, - len(password), - password, - False, - None, - ctypes.byref(keychain) - ) - _assert_no_error(status) - - # Having created the keychain, we want to pass it off to the caller. - return keychain, tempdirectory - - -def _load_items_from_file(keychain, path): - """ - Given a single file, loads all the trust objects from it into arrays and - the keychain. - Returns a tuple of lists: the first list is a list of identities, the - second a list of certs. - """ - certificates = [] - identities = [] - result_array = None - - with open(path, 'rb') as f: - raw_filedata = f.read() - - try: - filedata = CoreFoundation.CFDataCreate( - CoreFoundation.kCFAllocatorDefault, - raw_filedata, - len(raw_filedata) - ) - result_array = CoreFoundation.CFArrayRef() - result = Security.SecItemImport( - filedata, # cert data - None, # Filename, leaving it out for now - None, # What the type of the file is, we don't care - None, # what's in the file, we don't care - 0, # import flags - None, # key params, can include passphrase in the future - keychain, # The keychain to insert into - ctypes.byref(result_array) # Results - ) - _assert_no_error(result) - - # A CFArray is not very useful to us as an intermediary - # representation, so we are going to extract the objects we want - # and then free the array. We don't need to keep hold of keys: the - # keychain already has them! - result_count = CoreFoundation.CFArrayGetCount(result_array) - for index in range(result_count): - item = CoreFoundation.CFArrayGetValueAtIndex( - result_array, index - ) - item = ctypes.cast(item, CoreFoundation.CFTypeRef) - - if _is_cert(item): - CoreFoundation.CFRetain(item) - certificates.append(item) - elif _is_identity(item): - CoreFoundation.CFRetain(item) - identities.append(item) - finally: - if result_array: - CoreFoundation.CFRelease(result_array) - - CoreFoundation.CFRelease(filedata) - - return (identities, certificates) - - -def _load_client_cert_chain(keychain, *paths): - """ - Load certificates and maybe keys from a number of files. Has the end goal - of returning a CFArray containing one SecIdentityRef, and then zero or more - SecCertificateRef objects, suitable for use as a client certificate trust - chain. - """ - # Ok, the strategy. - # - # This relies on knowing that macOS will not give you a SecIdentityRef - # unless you have imported a key into a keychain. This is a somewhat - # artificial limitation of macOS (for example, it doesn't necessarily - # affect iOS), but there is nothing inside Security.framework that lets you - # get a SecIdentityRef without having a key in a keychain. - # - # So the policy here is we take all the files and iterate them in order. - # Each one will use SecItemImport to have one or more objects loaded from - # it. We will also point at a keychain that macOS can use to work with the - # private key. - # - # Once we have all the objects, we'll check what we actually have. If we - # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, - # we'll take the first certificate (which we assume to be our leaf) and - # ask the keychain to give us a SecIdentityRef with that cert's associated - # key. - # - # We'll then return a CFArray containing the trust chain: one - # SecIdentityRef and then zero-or-more SecCertificateRef objects. The - # responsibility for freeing this CFArray will be with the caller. This - # CFArray must remain alive for the entire connection, so in practice it - # will be stored with a single SSLSocket, along with the reference to the - # keychain. - certificates = [] - identities = [] - - # Filter out bad paths. - paths = (path for path in paths if path) - - try: - for file_path in paths: - new_identities, new_certs = _load_items_from_file( - keychain, file_path - ) - identities.extend(new_identities) - certificates.extend(new_certs) - - # Ok, we have everything. The question is: do we have an identity? If - # not, we want to grab one from the first cert we have. - if not identities: - new_identity = Security.SecIdentityRef() - status = Security.SecIdentityCreateWithCertificate( - keychain, - certificates[0], - ctypes.byref(new_identity) - ) - _assert_no_error(status) - identities.append(new_identity) - - # We now want to release the original certificate, as we no longer - # need it. - CoreFoundation.CFRelease(certificates.pop(0)) - - # We now need to build a new CFArray that holds the trust chain. - trust_chain = CoreFoundation.CFArrayCreateMutable( - CoreFoundation.kCFAllocatorDefault, - 0, - ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), - ) - for item in itertools.chain(identities, certificates): - # ArrayAppendValue does a CFRetain on the item. That's fine, - # because the finally block will release our other refs to them. - CoreFoundation.CFArrayAppendValue(trust_chain, item) - - return trust_chain - finally: - for obj in itertools.chain(identities, certificates): - CoreFoundation.CFRelease(obj) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/appengine.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/appengine.py deleted file mode 100644 index 9b42952..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/appengine.py +++ /dev/null @@ -1,289 +0,0 @@ -""" -This module provides a pool manager that uses Google App Engine's -`URLFetch Service <https://cloud.google.com/appengine/docs/python/urlfetch>`_. - -Example usage:: - - from pip._vendor.urllib3 import PoolManager - from pip._vendor.urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox - - if is_appengine_sandbox(): - # AppEngineManager uses AppEngine's URLFetch API behind the scenes - http = AppEngineManager() - else: - # PoolManager uses a socket-level API behind the scenes - http = PoolManager() - - r = http.request('GET', 'https://google.com/') - -There are `limitations <https://cloud.google.com/appengine/docs/python/\ -urlfetch/#Python_Quotas_and_limits>`_ to the URLFetch service and it may not be -the best choice for your application. There are three options for using -urllib3 on Google App Engine: - -1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is - cost-effective in many circumstances as long as your usage is within the - limitations. -2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets. - Sockets also have `limitations and restrictions - <https://cloud.google.com/appengine/docs/python/sockets/\ - #limitations-and-restrictions>`_ and have a lower free quota than URLFetch. - To use sockets, be sure to specify the following in your ``app.yaml``:: - - env_variables: - GAE_USE_SOCKETS_HTTPLIB : 'true' - -3. If you are using `App Engine Flexible -<https://cloud.google.com/appengine/docs/flexible/>`_, you can use the standard -:class:`PoolManager` without any configuration or special environment variables. -""" - -from __future__ import absolute_import -import io -import logging -import warnings -from ..packages.six.moves.urllib.parse import urljoin - -from ..exceptions import ( - HTTPError, - HTTPWarning, - MaxRetryError, - ProtocolError, - TimeoutError, - SSLError -) - -from ..request import RequestMethods -from ..response import HTTPResponse -from ..util.timeout import Timeout -from ..util.retry import Retry -from . import _appengine_environ - -try: - from google.appengine.api import urlfetch -except ImportError: - urlfetch = None - - -log = logging.getLogger(__name__) - - -class AppEnginePlatformWarning(HTTPWarning): - pass - - -class AppEnginePlatformError(HTTPError): - pass - - -class AppEngineManager(RequestMethods): - """ - Connection manager for Google App Engine sandbox applications. - - This manager uses the URLFetch service directly instead of using the - emulated httplib, and is subject to URLFetch limitations as described in - the App Engine documentation `here - <https://cloud.google.com/appengine/docs/python/urlfetch>`_. - - Notably it will raise an :class:`AppEnginePlatformError` if: - * URLFetch is not available. - * If you attempt to use this on App Engine Flexible, as full socket - support is available. - * If a request size is more than 10 megabytes. - * If a response size is more than 32 megabtyes. - * If you use an unsupported request method such as OPTIONS. - - Beyond those cases, it will raise normal urllib3 errors. - """ - - def __init__(self, headers=None, retries=None, validate_certificate=True, - urlfetch_retries=True): - if not urlfetch: - raise AppEnginePlatformError( - "URLFetch is not available in this environment.") - - if is_prod_appengine_mvms(): - raise AppEnginePlatformError( - "Use normal urllib3.PoolManager instead of AppEngineManager" - "on Managed VMs, as using URLFetch is not necessary in " - "this environment.") - - warnings.warn( - "urllib3 is using URLFetch on Google App Engine sandbox instead " - "of sockets. To use sockets directly instead of URLFetch see " - "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.", - AppEnginePlatformWarning) - - RequestMethods.__init__(self, headers) - self.validate_certificate = validate_certificate - self.urlfetch_retries = urlfetch_retries - - self.retries = retries or Retry.DEFAULT - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - # Return False to re-raise any potential exceptions - return False - - def urlopen(self, method, url, body=None, headers=None, - retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT, - **response_kw): - - retries = self._get_retries(retries, redirect) - - try: - follow_redirects = ( - redirect and - retries.redirect != 0 and - retries.total) - response = urlfetch.fetch( - url, - payload=body, - method=method, - headers=headers or {}, - allow_truncated=False, - follow_redirects=self.urlfetch_retries and follow_redirects, - deadline=self._get_absolute_timeout(timeout), - validate_certificate=self.validate_certificate, - ) - except urlfetch.DeadlineExceededError as e: - raise TimeoutError(self, e) - - except urlfetch.InvalidURLError as e: - if 'too large' in str(e): - raise AppEnginePlatformError( - "URLFetch request too large, URLFetch only " - "supports requests up to 10mb in size.", e) - raise ProtocolError(e) - - except urlfetch.DownloadError as e: - if 'Too many redirects' in str(e): - raise MaxRetryError(self, url, reason=e) - raise ProtocolError(e) - - except urlfetch.ResponseTooLargeError as e: - raise AppEnginePlatformError( - "URLFetch response too large, URLFetch only supports" - "responses up to 32mb in size.", e) - - except urlfetch.SSLCertificateError as e: - raise SSLError(e) - - except urlfetch.InvalidMethodError as e: - raise AppEnginePlatformError( - "URLFetch does not support method: %s" % method, e) - - http_response = self._urlfetch_response_to_http_response( - response, retries=retries, **response_kw) - - # Handle redirect? - redirect_location = redirect and http_response.get_redirect_location() - if redirect_location: - # Check for redirect response - if (self.urlfetch_retries and retries.raise_on_redirect): - raise MaxRetryError(self, url, "too many redirects") - else: - if http_response.status == 303: - method = 'GET' - - try: - retries = retries.increment(method, url, response=http_response, _pool=self) - except MaxRetryError: - if retries.raise_on_redirect: - raise MaxRetryError(self, url, "too many redirects") - return http_response - - retries.sleep_for_retry(http_response) - log.debug("Redirecting %s -> %s", url, redirect_location) - redirect_url = urljoin(url, redirect_location) - return self.urlopen( - method, redirect_url, body, headers, - retries=retries, redirect=redirect, - timeout=timeout, **response_kw) - - # Check if we should retry the HTTP response. - has_retry_after = bool(http_response.getheader('Retry-After')) - if retries.is_retry(method, http_response.status, has_retry_after): - retries = retries.increment( - method, url, response=http_response, _pool=self) - log.debug("Retry: %s", url) - retries.sleep(http_response) - return self.urlopen( - method, url, - body=body, headers=headers, - retries=retries, redirect=redirect, - timeout=timeout, **response_kw) - - return http_response - - def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): - - if is_prod_appengine(): - # Production GAE handles deflate encoding automatically, but does - # not remove the encoding header. - content_encoding = urlfetch_resp.headers.get('content-encoding') - - if content_encoding == 'deflate': - del urlfetch_resp.headers['content-encoding'] - - transfer_encoding = urlfetch_resp.headers.get('transfer-encoding') - # We have a full response's content, - # so let's make sure we don't report ourselves as chunked data. - if transfer_encoding == 'chunked': - encodings = transfer_encoding.split(",") - encodings.remove('chunked') - urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings) - - original_response = HTTPResponse( - # In order for decoding to work, we must present the content as - # a file-like object. - body=io.BytesIO(urlfetch_resp.content), - msg=urlfetch_resp.header_msg, - headers=urlfetch_resp.headers, - status=urlfetch_resp.status_code, - **response_kw - ) - - return HTTPResponse( - body=io.BytesIO(urlfetch_resp.content), - headers=urlfetch_resp.headers, - status=urlfetch_resp.status_code, - original_response=original_response, - **response_kw - ) - - def _get_absolute_timeout(self, timeout): - if timeout is Timeout.DEFAULT_TIMEOUT: - return None # Defer to URLFetch's default. - if isinstance(timeout, Timeout): - if timeout._read is not None or timeout._connect is not None: - warnings.warn( - "URLFetch does not support granular timeout settings, " - "reverting to total or default URLFetch timeout.", - AppEnginePlatformWarning) - return timeout.total - return timeout - - def _get_retries(self, retries, redirect): - if not isinstance(retries, Retry): - retries = Retry.from_int( - retries, redirect=redirect, default=self.retries) - - if retries.connect or retries.read or retries.redirect: - warnings.warn( - "URLFetch only supports total retries and does not " - "recognize connect, read, or redirect retry parameters.", - AppEnginePlatformWarning) - - return retries - - -# Alias methods from _appengine_environ to maintain public API interface. - -is_appengine = _appengine_environ.is_appengine -is_appengine_sandbox = _appengine_environ.is_appengine_sandbox -is_local_appengine = _appengine_environ.is_local_appengine -is_prod_appengine = _appengine_environ.is_prod_appengine -is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/ntlmpool.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/ntlmpool.py deleted file mode 100644 index 8ea127c..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/ntlmpool.py +++ /dev/null @@ -1,111 +0,0 @@ -""" -NTLM authenticating pool, contributed by erikcederstran - -Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 -""" -from __future__ import absolute_import - -from logging import getLogger -from ntlm import ntlm - -from .. import HTTPSConnectionPool -from ..packages.six.moves.http_client import HTTPSConnection - - -log = getLogger(__name__) - - -class NTLMConnectionPool(HTTPSConnectionPool): - """ - Implements an NTLM authentication version of an urllib3 connection pool - """ - - scheme = 'https' - - def __init__(self, user, pw, authurl, *args, **kwargs): - """ - authurl is a random URL on the server that is protected by NTLM. - user is the Windows user, probably in the DOMAIN\\username format. - pw is the password for the user. - """ - super(NTLMConnectionPool, self).__init__(*args, **kwargs) - self.authurl = authurl - self.rawuser = user - user_parts = user.split('\\', 1) - self.domain = user_parts[0].upper() - self.user = user_parts[1] - self.pw = pw - - def _new_conn(self): - # Performs the NTLM handshake that secures the connection. The socket - # must be kept open while requests are performed. - self.num_connections += 1 - log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s', - self.num_connections, self.host, self.authurl) - - headers = {'Connection': 'Keep-Alive'} - req_header = 'Authorization' - resp_header = 'www-authenticate' - - conn = HTTPSConnection(host=self.host, port=self.port) - - # Send negotiation message - headers[req_header] = ( - 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) - log.debug('Request headers: %s', headers) - conn.request('GET', self.authurl, None, headers) - res = conn.getresponse() - reshdr = dict(res.getheaders()) - log.debug('Response status: %s %s', res.status, res.reason) - log.debug('Response headers: %s', reshdr) - log.debug('Response data: %s [...]', res.read(100)) - - # Remove the reference to the socket, so that it can not be closed by - # the response object (we want to keep the socket open) - res.fp = None - - # Server should respond with a challenge message - auth_header_values = reshdr[resp_header].split(', ') - auth_header_value = None - for s in auth_header_values: - if s[:5] == 'NTLM ': - auth_header_value = s[5:] - if auth_header_value is None: - raise Exception('Unexpected %s response header: %s' % - (resp_header, reshdr[resp_header])) - - # Send authentication message - ServerChallenge, NegotiateFlags = \ - ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) - auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, - self.user, - self.domain, - self.pw, - NegotiateFlags) - headers[req_header] = 'NTLM %s' % auth_msg - log.debug('Request headers: %s', headers) - conn.request('GET', self.authurl, None, headers) - res = conn.getresponse() - log.debug('Response status: %s %s', res.status, res.reason) - log.debug('Response headers: %s', dict(res.getheaders())) - log.debug('Response data: %s [...]', res.read()[:100]) - if res.status != 200: - if res.status == 401: - raise Exception('Server rejected request: wrong ' - 'username or password') - raise Exception('Wrong server response: %s %s' % - (res.status, res.reason)) - - res.fp = None - log.debug('Connection established') - return conn - - def urlopen(self, method, url, body=None, headers=None, retries=3, - redirect=True, assert_same_host=True): - if headers is None: - headers = {} - headers['Connection'] = 'Keep-Alive' - return super(NTLMConnectionPool, self).urlopen(method, url, body, - headers, retries, - redirect, - assert_same_host) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/pyopenssl.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/pyopenssl.py deleted file mode 100644 index 363667c..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/pyopenssl.py +++ /dev/null @@ -1,466 +0,0 @@ -""" -SSL with SNI_-support for Python 2. Follow these instructions if you would -like to verify SSL certificates in Python 2. Note, the default libraries do -*not* do certificate checking; you need to do additional work to validate -certificates yourself. - -This needs the following packages installed: - -* pyOpenSSL (tested with 16.0.0) -* cryptography (minimum 1.3.4, from pyopenssl) -* idna (minimum 2.0, from cryptography) - -However, pyopenssl depends on cryptography, which depends on idna, so while we -use all three directly here we end up having relatively few packages required. - -You can install them with the following command: - - pip install pyopenssl cryptography idna - -To activate certificate checking, call -:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code -before you begin making HTTP requests. This can be done in a ``sitecustomize`` -module, or at any other time before your application begins using ``urllib3``, -like this:: - - try: - import urllib3.contrib.pyopenssl - urllib3.contrib.pyopenssl.inject_into_urllib3() - except ImportError: - pass - -Now you can use :mod:`urllib3` as you normally would, and it will support SNI -when the required modules are installed. - -Activating this module also has the positive side effect of disabling SSL/TLS -compression in Python 2 (see `CRIME attack`_). - -If you want to configure the default list of supported cipher suites, you can -set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. - -.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication -.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) -""" -from __future__ import absolute_import - -import OpenSSL.SSL -from cryptography import x509 -from cryptography.hazmat.backends.openssl import backend as openssl_backend -from cryptography.hazmat.backends.openssl.x509 import _Certificate -try: - from cryptography.x509 import UnsupportedExtension -except ImportError: - # UnsupportedExtension is gone in cryptography >= 2.1.0 - class UnsupportedExtension(Exception): - pass - -from socket import timeout, error as SocketError -from io import BytesIO - -try: # Platform-specific: Python 2 - from socket import _fileobject -except ImportError: # Platform-specific: Python 3 - _fileobject = None - from ..packages.backports.makefile import backport_makefile - -import logging -import ssl -from ..packages import six -import sys - -from .. import util - -__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] - -# SNI always works. -HAS_SNI = True - -# Map from urllib3 to PyOpenSSL compatible parameter-values. -_openssl_versions = { - ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, - ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, -} - -if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'): - _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD - -if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): - _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD - -try: - _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD}) -except AttributeError: - pass - -_stdlib_to_openssl_verify = { - ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, - ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, - ssl.CERT_REQUIRED: - OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, -} -_openssl_to_stdlib_verify = dict( - (v, k) for k, v in _stdlib_to_openssl_verify.items() -) - -# OpenSSL will only write 16K at a time -SSL_WRITE_BLOCKSIZE = 16384 - -orig_util_HAS_SNI = util.HAS_SNI -orig_util_SSLContext = util.ssl_.SSLContext - - -log = logging.getLogger(__name__) - - -def inject_into_urllib3(): - 'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.' - - _validate_dependencies_met() - - util.ssl_.SSLContext = PyOpenSSLContext - util.HAS_SNI = HAS_SNI - util.ssl_.HAS_SNI = HAS_SNI - util.IS_PYOPENSSL = True - util.ssl_.IS_PYOPENSSL = True - - -def extract_from_urllib3(): - 'Undo monkey-patching by :func:`inject_into_urllib3`.' - - util.ssl_.SSLContext = orig_util_SSLContext - util.HAS_SNI = orig_util_HAS_SNI - util.ssl_.HAS_SNI = orig_util_HAS_SNI - util.IS_PYOPENSSL = False - util.ssl_.IS_PYOPENSSL = False - - -def _validate_dependencies_met(): - """ - Verifies that PyOpenSSL's package-level dependencies have been met. - Throws `ImportError` if they are not met. - """ - # Method added in `cryptography==1.1`; not available in older versions - from cryptography.x509.extensions import Extensions - if getattr(Extensions, "get_extension_for_class", None) is None: - raise ImportError("'cryptography' module missing required functionality. " - "Try upgrading to v1.3.4 or newer.") - - # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 - # attribute is only present on those versions. - from OpenSSL.crypto import X509 - x509 = X509() - if getattr(x509, "_x509", None) is None: - raise ImportError("'pyOpenSSL' module missing required functionality. " - "Try upgrading to v0.14 or newer.") - - -def _dnsname_to_stdlib(name): - """ - Converts a dNSName SubjectAlternativeName field to the form used by the - standard library on the given Python version. - - Cryptography produces a dNSName as a unicode string that was idna-decoded - from ASCII bytes. We need to idna-encode that string to get it back, and - then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib - uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). - - If the name cannot be idna-encoded then we return None signalling that - the name given should be skipped. - """ - def idna_encode(name): - """ - Borrowed wholesale from the Python Cryptography Project. It turns out - that we can't just safely call `idna.encode`: it can explode for - wildcard names. This avoids that problem. - """ - from pip._vendor import idna - - try: - for prefix in [u'*.', u'.']: - if name.startswith(prefix): - name = name[len(prefix):] - return prefix.encode('ascii') + idna.encode(name) - return idna.encode(name) - except idna.core.IDNAError: - return None - - name = idna_encode(name) - if name is None: - return None - elif sys.version_info >= (3, 0): - name = name.decode('utf-8') - return name - - -def get_subj_alt_name(peer_cert): - """ - Given an PyOpenSSL certificate, provides all the subject alternative names. - """ - # Pass the cert to cryptography, which has much better APIs for this. - if hasattr(peer_cert, "to_cryptography"): - cert = peer_cert.to_cryptography() - else: - # This is technically using private APIs, but should work across all - # relevant versions before PyOpenSSL got a proper API for this. - cert = _Certificate(openssl_backend, peer_cert._x509) - - # We want to find the SAN extension. Ask Cryptography to locate it (it's - # faster than looping in Python) - try: - ext = cert.extensions.get_extension_for_class( - x509.SubjectAlternativeName - ).value - except x509.ExtensionNotFound: - # No such extension, return the empty list. - return [] - except (x509.DuplicateExtension, UnsupportedExtension, - x509.UnsupportedGeneralNameType, UnicodeError) as e: - # A problem has been found with the quality of the certificate. Assume - # no SAN field is present. - log.warning( - "A problem was encountered with the certificate that prevented " - "urllib3 from finding the SubjectAlternativeName field. This can " - "affect certificate validation. The error was %s", - e, - ) - return [] - - # We want to return dNSName and iPAddress fields. We need to cast the IPs - # back to strings because the match_hostname function wants them as - # strings. - # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 - # decoded. This is pretty frustrating, but that's what the standard library - # does with certificates, and so we need to attempt to do the same. - # We also want to skip over names which cannot be idna encoded. - names = [ - ('DNS', name) for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) - if name is not None - ] - names.extend( - ('IP Address', str(name)) - for name in ext.get_values_for_type(x509.IPAddress) - ) - - return names - - -class WrappedSocket(object): - '''API-compatibility wrapper for Python OpenSSL's Connection-class. - - Note: _makefile_refs, _drop() and _reuse() are needed for the garbage - collector of pypy. - ''' - - def __init__(self, connection, socket, suppress_ragged_eofs=True): - self.connection = connection - self.socket = socket - self.suppress_ragged_eofs = suppress_ragged_eofs - self._makefile_refs = 0 - self._closed = False - - def fileno(self): - return self.socket.fileno() - - # Copy-pasted from Python 3.5 source code - def _decref_socketios(self): - if self._makefile_refs > 0: - self._makefile_refs -= 1 - if self._closed: - self.close() - - def recv(self, *args, **kwargs): - try: - data = self.connection.recv(*args, **kwargs) - except OpenSSL.SSL.SysCallError as e: - if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): - return b'' - else: - raise SocketError(str(e)) - except OpenSSL.SSL.ZeroReturnError as e: - if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: - return b'' - else: - raise - except OpenSSL.SSL.WantReadError: - if not util.wait_for_read(self.socket, self.socket.gettimeout()): - raise timeout('The read operation timed out') - else: - return self.recv(*args, **kwargs) - else: - return data - - def recv_into(self, *args, **kwargs): - try: - return self.connection.recv_into(*args, **kwargs) - except OpenSSL.SSL.SysCallError as e: - if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): - return 0 - else: - raise SocketError(str(e)) - except OpenSSL.SSL.ZeroReturnError as e: - if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: - return 0 - else: - raise - except OpenSSL.SSL.WantReadError: - if not util.wait_for_read(self.socket, self.socket.gettimeout()): - raise timeout('The read operation timed out') - else: - return self.recv_into(*args, **kwargs) - - def settimeout(self, timeout): - return self.socket.settimeout(timeout) - - def _send_until_done(self, data): - while True: - try: - return self.connection.send(data) - except OpenSSL.SSL.WantWriteError: - if not util.wait_for_write(self.socket, self.socket.gettimeout()): - raise timeout() - continue - except OpenSSL.SSL.SysCallError as e: - raise SocketError(str(e)) - - def sendall(self, data): - total_sent = 0 - while total_sent < len(data): - sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) - total_sent += sent - - def shutdown(self): - # FIXME rethrow compatible exceptions should we ever use this - self.connection.shutdown() - - def close(self): - if self._makefile_refs < 1: - try: - self._closed = True - return self.connection.close() - except OpenSSL.SSL.Error: - return - else: - self._makefile_refs -= 1 - - def getpeercert(self, binary_form=False): - x509 = self.connection.get_peer_certificate() - - if not x509: - return x509 - - if binary_form: - return OpenSSL.crypto.dump_certificate( - OpenSSL.crypto.FILETYPE_ASN1, - x509) - - return { - 'subject': ( - (('commonName', x509.get_subject().CN),), - ), - 'subjectAltName': get_subj_alt_name(x509) - } - - def _reuse(self): - self._makefile_refs += 1 - - def _drop(self): - if self._makefile_refs < 1: - self.close() - else: - self._makefile_refs -= 1 - - -if _fileobject: # Platform-specific: Python 2 - def makefile(self, mode, bufsize=-1): - self._makefile_refs += 1 - return _fileobject(self, mode, bufsize, close=True) -else: # Platform-specific: Python 3 - makefile = backport_makefile - -WrappedSocket.makefile = makefile - - -class PyOpenSSLContext(object): - """ - I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible - for translating the interface of the standard library ``SSLContext`` object - to calls into PyOpenSSL. - """ - def __init__(self, protocol): - self.protocol = _openssl_versions[protocol] - self._ctx = OpenSSL.SSL.Context(self.protocol) - self._options = 0 - self.check_hostname = False - - @property - def options(self): - return self._options - - @options.setter - def options(self, value): - self._options = value - self._ctx.set_options(value) - - @property - def verify_mode(self): - return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] - - @verify_mode.setter - def verify_mode(self, value): - self._ctx.set_verify( - _stdlib_to_openssl_verify[value], - _verify_callback - ) - - def set_default_verify_paths(self): - self._ctx.set_default_verify_paths() - - def set_ciphers(self, ciphers): - if isinstance(ciphers, six.text_type): - ciphers = ciphers.encode('utf-8') - self._ctx.set_cipher_list(ciphers) - - def load_verify_locations(self, cafile=None, capath=None, cadata=None): - if cafile is not None: - cafile = cafile.encode('utf-8') - if capath is not None: - capath = capath.encode('utf-8') - self._ctx.load_verify_locations(cafile, capath) - if cadata is not None: - self._ctx.load_verify_locations(BytesIO(cadata)) - - def load_cert_chain(self, certfile, keyfile=None, password=None): - self._ctx.use_certificate_chain_file(certfile) - if password is not None: - self._ctx.set_passwd_cb(lambda max_length, prompt_twice, userdata: password) - self._ctx.use_privatekey_file(keyfile or certfile) - - def wrap_socket(self, sock, server_side=False, - do_handshake_on_connect=True, suppress_ragged_eofs=True, - server_hostname=None): - cnx = OpenSSL.SSL.Connection(self._ctx, sock) - - if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 - server_hostname = server_hostname.encode('utf-8') - - if server_hostname is not None: - cnx.set_tlsext_host_name(server_hostname) - - cnx.set_connect_state() - - while True: - try: - cnx.do_handshake() - except OpenSSL.SSL.WantReadError: - if not util.wait_for_read(sock, sock.gettimeout()): - raise timeout('select timed out') - continue - except OpenSSL.SSL.Error as e: - raise ssl.SSLError('bad handshake: %r' % e) - break - - return WrappedSocket(cnx, sock) - - -def _verify_callback(cnx, x509, err_no, err_depth, return_code): - return err_no == 0 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/securetransport.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/securetransport.py deleted file mode 100644 index 77cb59e..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/securetransport.py +++ /dev/null @@ -1,804 +0,0 @@ -""" -SecureTranport support for urllib3 via ctypes. - -This makes platform-native TLS available to urllib3 users on macOS without the -use of a compiler. This is an important feature because the Python Package -Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL -that ships with macOS is not capable of doing TLSv1.2. The only way to resolve -this is to give macOS users an alternative solution to the problem, and that -solution is to use SecureTransport. - -We use ctypes here because this solution must not require a compiler. That's -because pip is not allowed to require a compiler either. - -This is not intended to be a seriously long-term solution to this problem. -The hope is that PEP 543 will eventually solve this issue for us, at which -point we can retire this contrib module. But in the short term, we need to -solve the impending tire fire that is Python on Mac without this kind of -contrib module. So...here we are. - -To use this module, simply import and inject it:: - - import urllib3.contrib.securetransport - urllib3.contrib.securetransport.inject_into_urllib3() - -Happy TLSing! -""" -from __future__ import absolute_import - -import contextlib -import ctypes -import errno -import os.path -import shutil -import socket -import ssl -import threading -import weakref - -from .. import util -from ._securetransport.bindings import ( - Security, SecurityConst, CoreFoundation -) -from ._securetransport.low_level import ( - _assert_no_error, _cert_array_from_pem, _temporary_keychain, - _load_client_cert_chain -) - -try: # Platform-specific: Python 2 - from socket import _fileobject -except ImportError: # Platform-specific: Python 3 - _fileobject = None - from ..packages.backports.makefile import backport_makefile - -__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] - -# SNI always works -HAS_SNI = True - -orig_util_HAS_SNI = util.HAS_SNI -orig_util_SSLContext = util.ssl_.SSLContext - -# This dictionary is used by the read callback to obtain a handle to the -# calling wrapped socket. This is a pretty silly approach, but for now it'll -# do. I feel like I should be able to smuggle a handle to the wrapped socket -# directly in the SSLConnectionRef, but for now this approach will work I -# guess. -# -# We need to lock around this structure for inserts, but we don't do it for -# reads/writes in the callbacks. The reasoning here goes as follows: -# -# 1. It is not possible to call into the callbacks before the dictionary is -# populated, so once in the callback the id must be in the dictionary. -# 2. The callbacks don't mutate the dictionary, they only read from it, and -# so cannot conflict with any of the insertions. -# -# This is good: if we had to lock in the callbacks we'd drastically slow down -# the performance of this code. -_connection_refs = weakref.WeakValueDictionary() -_connection_ref_lock = threading.Lock() - -# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over -# for no better reason than we need *a* limit, and this one is right there. -SSL_WRITE_BLOCKSIZE = 16384 - -# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to -# individual cipher suites. We need to do this because this is how -# SecureTransport wants them. -CIPHER_SUITES = [ - SecurityConst.TLS_AES_256_GCM_SHA384, - SecurityConst.TLS_CHACHA20_POLY1305_SHA256, - SecurityConst.TLS_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, - SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256, - SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA, -] - -# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of -# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version. -_protocol_to_min_max = { - ssl.PROTOCOL_SSLv23: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), -} - -if hasattr(ssl, "PROTOCOL_SSLv2"): - _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = ( - SecurityConst.kSSLProtocol2, SecurityConst.kSSLProtocol2 - ) -if hasattr(ssl, "PROTOCOL_SSLv3"): - _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = ( - SecurityConst.kSSLProtocol3, SecurityConst.kSSLProtocol3 - ) -if hasattr(ssl, "PROTOCOL_TLSv1"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = ( - SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol1 - ) -if hasattr(ssl, "PROTOCOL_TLSv1_1"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = ( - SecurityConst.kTLSProtocol11, SecurityConst.kTLSProtocol11 - ) -if hasattr(ssl, "PROTOCOL_TLSv1_2"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = ( - SecurityConst.kTLSProtocol12, SecurityConst.kTLSProtocol12 - ) -if hasattr(ssl, "PROTOCOL_TLS"): - _protocol_to_min_max[ssl.PROTOCOL_TLS] = _protocol_to_min_max[ssl.PROTOCOL_SSLv23] - - -def inject_into_urllib3(): - """ - Monkey-patch urllib3 with SecureTransport-backed SSL-support. - """ - util.ssl_.SSLContext = SecureTransportContext - util.HAS_SNI = HAS_SNI - util.ssl_.HAS_SNI = HAS_SNI - util.IS_SECURETRANSPORT = True - util.ssl_.IS_SECURETRANSPORT = True - - -def extract_from_urllib3(): - """ - Undo monkey-patching by :func:`inject_into_urllib3`. - """ - util.ssl_.SSLContext = orig_util_SSLContext - util.HAS_SNI = orig_util_HAS_SNI - util.ssl_.HAS_SNI = orig_util_HAS_SNI - util.IS_SECURETRANSPORT = False - util.ssl_.IS_SECURETRANSPORT = False - - -def _read_callback(connection_id, data_buffer, data_length_pointer): - """ - SecureTransport read callback. This is called by ST to request that data - be returned from the socket. - """ - wrapped_socket = None - try: - wrapped_socket = _connection_refs.get(connection_id) - if wrapped_socket is None: - return SecurityConst.errSSLInternal - base_socket = wrapped_socket.socket - - requested_length = data_length_pointer[0] - - timeout = wrapped_socket.gettimeout() - error = None - read_count = 0 - - try: - while read_count < requested_length: - if timeout is None or timeout >= 0: - if not util.wait_for_read(base_socket, timeout): - raise socket.error(errno.EAGAIN, 'timed out') - - remaining = requested_length - read_count - buffer = (ctypes.c_char * remaining).from_address( - data_buffer + read_count - ) - chunk_size = base_socket.recv_into(buffer, remaining) - read_count += chunk_size - if not chunk_size: - if not read_count: - return SecurityConst.errSSLClosedGraceful - break - except (socket.error) as e: - error = e.errno - - if error is not None and error != errno.EAGAIN: - data_length_pointer[0] = read_count - if error == errno.ECONNRESET or error == errno.EPIPE: - return SecurityConst.errSSLClosedAbort - raise - - data_length_pointer[0] = read_count - - if read_count != requested_length: - return SecurityConst.errSSLWouldBlock - - return 0 - except Exception as e: - if wrapped_socket is not None: - wrapped_socket._exception = e - return SecurityConst.errSSLInternal - - -def _write_callback(connection_id, data_buffer, data_length_pointer): - """ - SecureTransport write callback. This is called by ST to request that data - actually be sent on the network. - """ - wrapped_socket = None - try: - wrapped_socket = _connection_refs.get(connection_id) - if wrapped_socket is None: - return SecurityConst.errSSLInternal - base_socket = wrapped_socket.socket - - bytes_to_write = data_length_pointer[0] - data = ctypes.string_at(data_buffer, bytes_to_write) - - timeout = wrapped_socket.gettimeout() - error = None - sent = 0 - - try: - while sent < bytes_to_write: - if timeout is None or timeout >= 0: - if not util.wait_for_write(base_socket, timeout): - raise socket.error(errno.EAGAIN, 'timed out') - chunk_sent = base_socket.send(data) - sent += chunk_sent - - # This has some needless copying here, but I'm not sure there's - # much value in optimising this data path. - data = data[chunk_sent:] - except (socket.error) as e: - error = e.errno - - if error is not None and error != errno.EAGAIN: - data_length_pointer[0] = sent - if error == errno.ECONNRESET or error == errno.EPIPE: - return SecurityConst.errSSLClosedAbort - raise - - data_length_pointer[0] = sent - - if sent != bytes_to_write: - return SecurityConst.errSSLWouldBlock - - return 0 - except Exception as e: - if wrapped_socket is not None: - wrapped_socket._exception = e - return SecurityConst.errSSLInternal - - -# We need to keep these two objects references alive: if they get GC'd while -# in use then SecureTransport could attempt to call a function that is in freed -# memory. That would be...uh...bad. Yeah, that's the word. Bad. -_read_callback_pointer = Security.SSLReadFunc(_read_callback) -_write_callback_pointer = Security.SSLWriteFunc(_write_callback) - - -class WrappedSocket(object): - """ - API-compatibility wrapper for Python's OpenSSL wrapped socket object. - - Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage - collector of PyPy. - """ - def __init__(self, socket): - self.socket = socket - self.context = None - self._makefile_refs = 0 - self._closed = False - self._exception = None - self._keychain = None - self._keychain_dir = None - self._client_cert_chain = None - - # We save off the previously-configured timeout and then set it to - # zero. This is done because we use select and friends to handle the - # timeouts, but if we leave the timeout set on the lower socket then - # Python will "kindly" call select on that socket again for us. Avoid - # that by forcing the timeout to zero. - self._timeout = self.socket.gettimeout() - self.socket.settimeout(0) - - @contextlib.contextmanager - def _raise_on_error(self): - """ - A context manager that can be used to wrap calls that do I/O from - SecureTransport. If any of the I/O callbacks hit an exception, this - context manager will correctly propagate the exception after the fact. - This avoids silently swallowing those exceptions. - - It also correctly forces the socket closed. - """ - self._exception = None - - # We explicitly don't catch around this yield because in the unlikely - # event that an exception was hit in the block we don't want to swallow - # it. - yield - if self._exception is not None: - exception, self._exception = self._exception, None - self.close() - raise exception - - def _set_ciphers(self): - """ - Sets up the allowed ciphers. By default this matches the set in - util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done - custom and doesn't allow changing at this time, mostly because parsing - OpenSSL cipher strings is going to be a freaking nightmare. - """ - ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES) - result = Security.SSLSetEnabledCiphers( - self.context, ciphers, len(CIPHER_SUITES) - ) - _assert_no_error(result) - - def _custom_validate(self, verify, trust_bundle): - """ - Called when we have set custom validation. We do this in two cases: - first, when cert validation is entirely disabled; and second, when - using a custom trust DB. - """ - # If we disabled cert validation, just say: cool. - if not verify: - return - - # We want data in memory, so load it up. - if os.path.isfile(trust_bundle): - with open(trust_bundle, 'rb') as f: - trust_bundle = f.read() - - cert_array = None - trust = Security.SecTrustRef() - - try: - # Get a CFArray that contains the certs we want. - cert_array = _cert_array_from_pem(trust_bundle) - - # Ok, now the hard part. We want to get the SecTrustRef that ST has - # created for this connection, shove our CAs into it, tell ST to - # ignore everything else it knows, and then ask if it can build a - # chain. This is a buuuunch of code. - result = Security.SSLCopyPeerTrust( - self.context, ctypes.byref(trust) - ) - _assert_no_error(result) - if not trust: - raise ssl.SSLError("Failed to copy trust reference") - - result = Security.SecTrustSetAnchorCertificates(trust, cert_array) - _assert_no_error(result) - - result = Security.SecTrustSetAnchorCertificatesOnly(trust, True) - _assert_no_error(result) - - trust_result = Security.SecTrustResultType() - result = Security.SecTrustEvaluate( - trust, ctypes.byref(trust_result) - ) - _assert_no_error(result) - finally: - if trust: - CoreFoundation.CFRelease(trust) - - if cert_array is not None: - CoreFoundation.CFRelease(cert_array) - - # Ok, now we can look at what the result was. - successes = ( - SecurityConst.kSecTrustResultUnspecified, - SecurityConst.kSecTrustResultProceed - ) - if trust_result.value not in successes: - raise ssl.SSLError( - "certificate verify failed, error code: %d" % - trust_result.value - ) - - def handshake(self, - server_hostname, - verify, - trust_bundle, - min_version, - max_version, - client_cert, - client_key, - client_key_passphrase): - """ - Actually performs the TLS handshake. This is run automatically by - wrapped socket, and shouldn't be needed in user code. - """ - # First, we do the initial bits of connection setup. We need to create - # a context, set its I/O funcs, and set the connection reference. - self.context = Security.SSLCreateContext( - None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType - ) - result = Security.SSLSetIOFuncs( - self.context, _read_callback_pointer, _write_callback_pointer - ) - _assert_no_error(result) - - # Here we need to compute the handle to use. We do this by taking the - # id of self modulo 2**31 - 1. If this is already in the dictionary, we - # just keep incrementing by one until we find a free space. - with _connection_ref_lock: - handle = id(self) % 2147483647 - while handle in _connection_refs: - handle = (handle + 1) % 2147483647 - _connection_refs[handle] = self - - result = Security.SSLSetConnection(self.context, handle) - _assert_no_error(result) - - # If we have a server hostname, we should set that too. - if server_hostname: - if not isinstance(server_hostname, bytes): - server_hostname = server_hostname.encode('utf-8') - - result = Security.SSLSetPeerDomainName( - self.context, server_hostname, len(server_hostname) - ) - _assert_no_error(result) - - # Setup the ciphers. - self._set_ciphers() - - # Set the minimum and maximum TLS versions. - result = Security.SSLSetProtocolVersionMin(self.context, min_version) - _assert_no_error(result) - result = Security.SSLSetProtocolVersionMax(self.context, max_version) - _assert_no_error(result) - - # If there's a trust DB, we need to use it. We do that by telling - # SecureTransport to break on server auth. We also do that if we don't - # want to validate the certs at all: we just won't actually do any - # authing in that case. - if not verify or trust_bundle is not None: - result = Security.SSLSetSessionOption( - self.context, - SecurityConst.kSSLSessionOptionBreakOnServerAuth, - True - ) - _assert_no_error(result) - - # If there's a client cert, we need to use it. - if client_cert: - self._keychain, self._keychain_dir = _temporary_keychain() - self._client_cert_chain = _load_client_cert_chain( - self._keychain, client_cert, client_key - ) - result = Security.SSLSetCertificate( - self.context, self._client_cert_chain - ) - _assert_no_error(result) - - while True: - with self._raise_on_error(): - result = Security.SSLHandshake(self.context) - - if result == SecurityConst.errSSLWouldBlock: - raise socket.timeout("handshake timed out") - elif result == SecurityConst.errSSLServerAuthCompleted: - self._custom_validate(verify, trust_bundle) - continue - else: - _assert_no_error(result) - break - - def fileno(self): - return self.socket.fileno() - - # Copy-pasted from Python 3.5 source code - def _decref_socketios(self): - if self._makefile_refs > 0: - self._makefile_refs -= 1 - if self._closed: - self.close() - - def recv(self, bufsiz): - buffer = ctypes.create_string_buffer(bufsiz) - bytes_read = self.recv_into(buffer, bufsiz) - data = buffer[:bytes_read] - return data - - def recv_into(self, buffer, nbytes=None): - # Read short on EOF. - if self._closed: - return 0 - - if nbytes is None: - nbytes = len(buffer) - - buffer = (ctypes.c_char * nbytes).from_buffer(buffer) - processed_bytes = ctypes.c_size_t(0) - - with self._raise_on_error(): - result = Security.SSLRead( - self.context, buffer, nbytes, ctypes.byref(processed_bytes) - ) - - # There are some result codes that we want to treat as "not always - # errors". Specifically, those are errSSLWouldBlock, - # errSSLClosedGraceful, and errSSLClosedNoNotify. - if (result == SecurityConst.errSSLWouldBlock): - # If we didn't process any bytes, then this was just a time out. - # However, we can get errSSLWouldBlock in situations when we *did* - # read some data, and in those cases we should just read "short" - # and return. - if processed_bytes.value == 0: - # Timed out, no data read. - raise socket.timeout("recv timed out") - elif result in (SecurityConst.errSSLClosedGraceful, SecurityConst.errSSLClosedNoNotify): - # The remote peer has closed this connection. We should do so as - # well. Note that we don't actually return here because in - # principle this could actually be fired along with return data. - # It's unlikely though. - self.close() - else: - _assert_no_error(result) - - # Ok, we read and probably succeeded. We should return whatever data - # was actually read. - return processed_bytes.value - - def settimeout(self, timeout): - self._timeout = timeout - - def gettimeout(self): - return self._timeout - - def send(self, data): - processed_bytes = ctypes.c_size_t(0) - - with self._raise_on_error(): - result = Security.SSLWrite( - self.context, data, len(data), ctypes.byref(processed_bytes) - ) - - if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: - # Timed out - raise socket.timeout("send timed out") - else: - _assert_no_error(result) - - # We sent, and probably succeeded. Tell them how much we sent. - return processed_bytes.value - - def sendall(self, data): - total_sent = 0 - while total_sent < len(data): - sent = self.send(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) - total_sent += sent - - def shutdown(self): - with self._raise_on_error(): - Security.SSLClose(self.context) - - def close(self): - # TODO: should I do clean shutdown here? Do I have to? - if self._makefile_refs < 1: - self._closed = True - if self.context: - CoreFoundation.CFRelease(self.context) - self.context = None - if self._client_cert_chain: - CoreFoundation.CFRelease(self._client_cert_chain) - self._client_cert_chain = None - if self._keychain: - Security.SecKeychainDelete(self._keychain) - CoreFoundation.CFRelease(self._keychain) - shutil.rmtree(self._keychain_dir) - self._keychain = self._keychain_dir = None - return self.socket.close() - else: - self._makefile_refs -= 1 - - def getpeercert(self, binary_form=False): - # Urgh, annoying. - # - # Here's how we do this: - # - # 1. Call SSLCopyPeerTrust to get hold of the trust object for this - # connection. - # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. - # 3. To get the CN, call SecCertificateCopyCommonName and process that - # string so that it's of the appropriate type. - # 4. To get the SAN, we need to do something a bit more complex: - # a. Call SecCertificateCopyValues to get the data, requesting - # kSecOIDSubjectAltName. - # b. Mess about with this dictionary to try to get the SANs out. - # - # This is gross. Really gross. It's going to be a few hundred LoC extra - # just to repeat something that SecureTransport can *already do*. So my - # operating assumption at this time is that what we want to do is - # instead to just flag to urllib3 that it shouldn't do its own hostname - # validation when using SecureTransport. - if not binary_form: - raise ValueError( - "SecureTransport only supports dumping binary certs" - ) - trust = Security.SecTrustRef() - certdata = None - der_bytes = None - - try: - # Grab the trust store. - result = Security.SSLCopyPeerTrust( - self.context, ctypes.byref(trust) - ) - _assert_no_error(result) - if not trust: - # Probably we haven't done the handshake yet. No biggie. - return None - - cert_count = Security.SecTrustGetCertificateCount(trust) - if not cert_count: - # Also a case that might happen if we haven't handshaked. - # Handshook? Handshaken? - return None - - leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) - assert leaf - - # Ok, now we want the DER bytes. - certdata = Security.SecCertificateCopyData(leaf) - assert certdata - - data_length = CoreFoundation.CFDataGetLength(certdata) - data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) - der_bytes = ctypes.string_at(data_buffer, data_length) - finally: - if certdata: - CoreFoundation.CFRelease(certdata) - if trust: - CoreFoundation.CFRelease(trust) - - return der_bytes - - def _reuse(self): - self._makefile_refs += 1 - - def _drop(self): - if self._makefile_refs < 1: - self.close() - else: - self._makefile_refs -= 1 - - -if _fileobject: # Platform-specific: Python 2 - def makefile(self, mode, bufsize=-1): - self._makefile_refs += 1 - return _fileobject(self, mode, bufsize, close=True) -else: # Platform-specific: Python 3 - def makefile(self, mode="r", buffering=None, *args, **kwargs): - # We disable buffering with SecureTransport because it conflicts with - # the buffering that ST does internally (see issue #1153 for more). - buffering = 0 - return backport_makefile(self, mode, buffering, *args, **kwargs) - -WrappedSocket.makefile = makefile - - -class SecureTransportContext(object): - """ - I am a wrapper class for the SecureTransport library, to translate the - interface of the standard library ``SSLContext`` object to calls into - SecureTransport. - """ - def __init__(self, protocol): - self._min_version, self._max_version = _protocol_to_min_max[protocol] - self._options = 0 - self._verify = False - self._trust_bundle = None - self._client_cert = None - self._client_key = None - self._client_key_passphrase = None - - @property - def check_hostname(self): - """ - SecureTransport cannot have its hostname checking disabled. For more, - see the comment on getpeercert() in this file. - """ - return True - - @check_hostname.setter - def check_hostname(self, value): - """ - SecureTransport cannot have its hostname checking disabled. For more, - see the comment on getpeercert() in this file. - """ - pass - - @property - def options(self): - # TODO: Well, crap. - # - # So this is the bit of the code that is the most likely to cause us - # trouble. Essentially we need to enumerate all of the SSL options that - # users might want to use and try to see if we can sensibly translate - # them, or whether we should just ignore them. - return self._options - - @options.setter - def options(self, value): - # TODO: Update in line with above. - self._options = value - - @property - def verify_mode(self): - return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE - - @verify_mode.setter - def verify_mode(self, value): - self._verify = True if value == ssl.CERT_REQUIRED else False - - def set_default_verify_paths(self): - # So, this has to do something a bit weird. Specifically, what it does - # is nothing. - # - # This means that, if we had previously had load_verify_locations - # called, this does not undo that. We need to do that because it turns - # out that the rest of the urllib3 code will attempt to load the - # default verify paths if it hasn't been told about any paths, even if - # the context itself was sometime earlier. We resolve that by just - # ignoring it. - pass - - def load_default_certs(self): - return self.set_default_verify_paths() - - def set_ciphers(self, ciphers): - # For now, we just require the default cipher string. - if ciphers != util.ssl_.DEFAULT_CIPHERS: - raise ValueError( - "SecureTransport doesn't support custom cipher strings" - ) - - def load_verify_locations(self, cafile=None, capath=None, cadata=None): - # OK, we only really support cadata and cafile. - if capath is not None: - raise ValueError( - "SecureTransport does not support cert directories" - ) - - self._trust_bundle = cafile or cadata - - def load_cert_chain(self, certfile, keyfile=None, password=None): - self._client_cert = certfile - self._client_key = keyfile - self._client_cert_passphrase = password - - def wrap_socket(self, sock, server_side=False, - do_handshake_on_connect=True, suppress_ragged_eofs=True, - server_hostname=None): - # So, what do we do here? Firstly, we assert some properties. This is a - # stripped down shim, so there is some functionality we don't support. - # See PEP 543 for the real deal. - assert not server_side - assert do_handshake_on_connect - assert suppress_ragged_eofs - - # Ok, we're good to go. Now we want to create the wrapped socket object - # and store it in the appropriate place. - wrapped_socket = WrappedSocket(sock) - - # Now we can handshake - wrapped_socket.handshake( - server_hostname, self._verify, self._trust_bundle, - self._min_version, self._max_version, self._client_cert, - self._client_key, self._client_key_passphrase - ) - return wrapped_socket diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/socks.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/socks.py deleted file mode 100644 index 811e312..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/socks.py +++ /dev/null @@ -1,192 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module contains provisional support for SOCKS proxies from within -urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and -SOCKS5. To enable its functionality, either install PySocks or install this -module with the ``socks`` extra. - -The SOCKS implementation supports the full range of urllib3 features. It also -supports the following SOCKS features: - -- SOCKS4 -- SOCKS4a -- SOCKS5 -- Usernames and passwords for the SOCKS proxy - -Known Limitations: - -- Currently PySocks does not support contacting remote websites via literal - IPv6 addresses. Any such connection attempt will fail. You must use a domain - name. -- Currently PySocks does not support IPv6 connections to the SOCKS proxy. Any - such connection attempt will fail. -""" -from __future__ import absolute_import - -try: - import socks -except ImportError: - import warnings - from ..exceptions import DependencyWarning - - warnings.warn(( - 'SOCKS support in urllib3 requires the installation of optional ' - 'dependencies: specifically, PySocks. For more information, see ' - 'https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies' - ), - DependencyWarning - ) - raise - -from socket import error as SocketError, timeout as SocketTimeout - -from ..connection import ( - HTTPConnection, HTTPSConnection -) -from ..connectionpool import ( - HTTPConnectionPool, HTTPSConnectionPool -) -from ..exceptions import ConnectTimeoutError, NewConnectionError -from ..poolmanager import PoolManager -from ..util.url import parse_url - -try: - import ssl -except ImportError: - ssl = None - - -class SOCKSConnection(HTTPConnection): - """ - A plain-text HTTP connection that connects via a SOCKS proxy. - """ - def __init__(self, *args, **kwargs): - self._socks_options = kwargs.pop('_socks_options') - super(SOCKSConnection, self).__init__(*args, **kwargs) - - def _new_conn(self): - """ - Establish a new connection via the SOCKS proxy. - """ - extra_kw = {} - if self.source_address: - extra_kw['source_address'] = self.source_address - - if self.socket_options: - extra_kw['socket_options'] = self.socket_options - - try: - conn = socks.create_connection( - (self.host, self.port), - proxy_type=self._socks_options['socks_version'], - proxy_addr=self._socks_options['proxy_host'], - proxy_port=self._socks_options['proxy_port'], - proxy_username=self._socks_options['username'], - proxy_password=self._socks_options['password'], - proxy_rdns=self._socks_options['rdns'], - timeout=self.timeout, - **extra_kw - ) - - except SocketTimeout as e: - raise ConnectTimeoutError( - self, "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout)) - - except socks.ProxyError as e: - # This is fragile as hell, but it seems to be the only way to raise - # useful errors here. - if e.socket_err: - error = e.socket_err - if isinstance(error, SocketTimeout): - raise ConnectTimeoutError( - self, - "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout) - ) - else: - raise NewConnectionError( - self, - "Failed to establish a new connection: %s" % error - ) - else: - raise NewConnectionError( - self, - "Failed to establish a new connection: %s" % e - ) - - except SocketError as e: # Defensive: PySocks should catch all these. - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % e) - - return conn - - -# We don't need to duplicate the Verified/Unverified distinction from -# urllib3/connection.py here because the HTTPSConnection will already have been -# correctly set to either the Verified or Unverified form by that module. This -# means the SOCKSHTTPSConnection will automatically be the correct type. -class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): - pass - - -class SOCKSHTTPConnectionPool(HTTPConnectionPool): - ConnectionCls = SOCKSConnection - - -class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): - ConnectionCls = SOCKSHTTPSConnection - - -class SOCKSProxyManager(PoolManager): - """ - A version of the urllib3 ProxyManager that routes connections via the - defined SOCKS proxy. - """ - pool_classes_by_scheme = { - 'http': SOCKSHTTPConnectionPool, - 'https': SOCKSHTTPSConnectionPool, - } - - def __init__(self, proxy_url, username=None, password=None, - num_pools=10, headers=None, **connection_pool_kw): - parsed = parse_url(proxy_url) - - if username is None and password is None and parsed.auth is not None: - split = parsed.auth.split(':') - if len(split) == 2: - username, password = split - if parsed.scheme == 'socks5': - socks_version = socks.PROXY_TYPE_SOCKS5 - rdns = False - elif parsed.scheme == 'socks5h': - socks_version = socks.PROXY_TYPE_SOCKS5 - rdns = True - elif parsed.scheme == 'socks4': - socks_version = socks.PROXY_TYPE_SOCKS4 - rdns = False - elif parsed.scheme == 'socks4a': - socks_version = socks.PROXY_TYPE_SOCKS4 - rdns = True - else: - raise ValueError( - "Unable to determine SOCKS version from %s" % proxy_url - ) - - self.proxy_url = proxy_url - - socks_options = { - 'socks_version': socks_version, - 'proxy_host': parsed.host, - 'proxy_port': parsed.port, - 'username': username, - 'password': password, - 'rdns': rdns - } - connection_pool_kw['_socks_options'] = socks_options - - super(SOCKSProxyManager, self).__init__( - num_pools, headers, **connection_pool_kw - ) - - self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/exceptions.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/exceptions.py deleted file mode 100644 index 7bbaa98..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/exceptions.py +++ /dev/null @@ -1,246 +0,0 @@ -from __future__ import absolute_import -from .packages.six.moves.http_client import ( - IncompleteRead as httplib_IncompleteRead -) -# Base Exceptions - - -class HTTPError(Exception): - "Base exception used by this module." - pass - - -class HTTPWarning(Warning): - "Base warning used by this module." - pass - - -class PoolError(HTTPError): - "Base exception for errors caused within a pool." - def __init__(self, pool, message): - self.pool = pool - HTTPError.__init__(self, "%s: %s" % (pool, message)) - - def __reduce__(self): - # For pickling purposes. - return self.__class__, (None, None) - - -class RequestError(PoolError): - "Base exception for PoolErrors that have associated URLs." - def __init__(self, pool, url, message): - self.url = url - PoolError.__init__(self, pool, message) - - def __reduce__(self): - # For pickling purposes. - return self.__class__, (None, self.url, None) - - -class SSLError(HTTPError): - "Raised when SSL certificate fails in an HTTPS connection." - pass - - -class ProxyError(HTTPError): - "Raised when the connection to a proxy fails." - pass - - -class DecodeError(HTTPError): - "Raised when automatic decoding based on Content-Type fails." - pass - - -class ProtocolError(HTTPError): - "Raised when something unexpected happens mid-request/response." - pass - - -#: Renamed to ProtocolError but aliased for backwards compatibility. -ConnectionError = ProtocolError - - -# Leaf Exceptions - -class MaxRetryError(RequestError): - """Raised when the maximum number of retries is exceeded. - - :param pool: The connection pool - :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` - :param string url: The requested Url - :param exceptions.Exception reason: The underlying error - - """ - - def __init__(self, pool, url, reason=None): - self.reason = reason - - message = "Max retries exceeded with url: %s (Caused by %r)" % ( - url, reason) - - RequestError.__init__(self, pool, url, message) - - -class HostChangedError(RequestError): - "Raised when an existing pool gets a request for a foreign host." - - def __init__(self, pool, url, retries=3): - message = "Tried to open a foreign host with url: %s" % url - RequestError.__init__(self, pool, url, message) - self.retries = retries - - -class TimeoutStateError(HTTPError): - """ Raised when passing an invalid state to a timeout """ - pass - - -class TimeoutError(HTTPError): - """ Raised when a socket timeout error occurs. - - Catching this error will catch both :exc:`ReadTimeoutErrors - <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`. - """ - pass - - -class ReadTimeoutError(TimeoutError, RequestError): - "Raised when a socket timeout occurs while receiving data from a server" - pass - - -# This timeout error does not have a URL attached and needs to inherit from the -# base HTTPError -class ConnectTimeoutError(TimeoutError): - "Raised when a socket timeout occurs while connecting to a server" - pass - - -class NewConnectionError(ConnectTimeoutError, PoolError): - "Raised when we fail to establish a new connection. Usually ECONNREFUSED." - pass - - -class EmptyPoolError(PoolError): - "Raised when a pool runs out of connections and no more are allowed." - pass - - -class ClosedPoolError(PoolError): - "Raised when a request enters a pool after the pool has been closed." - pass - - -class LocationValueError(ValueError, HTTPError): - "Raised when there is something wrong with a given URL input." - pass - - -class LocationParseError(LocationValueError): - "Raised when get_host or similar fails to parse the URL input." - - def __init__(self, location): - message = "Failed to parse: %s" % location - HTTPError.__init__(self, message) - - self.location = location - - -class ResponseError(HTTPError): - "Used as a container for an error reason supplied in a MaxRetryError." - GENERIC_ERROR = 'too many error responses' - SPECIFIC_ERROR = 'too many {status_code} error responses' - - -class SecurityWarning(HTTPWarning): - "Warned when performing security reducing actions" - pass - - -class SubjectAltNameWarning(SecurityWarning): - "Warned when connecting to a host with a certificate missing a SAN." - pass - - -class InsecureRequestWarning(SecurityWarning): - "Warned when making an unverified HTTPS request." - pass - - -class SystemTimeWarning(SecurityWarning): - "Warned when system time is suspected to be wrong" - pass - - -class InsecurePlatformWarning(SecurityWarning): - "Warned when certain SSL configuration is not available on a platform." - pass - - -class SNIMissingWarning(HTTPWarning): - "Warned when making a HTTPS request without SNI available." - pass - - -class DependencyWarning(HTTPWarning): - """ - Warned when an attempt is made to import a module with missing optional - dependencies. - """ - pass - - -class ResponseNotChunked(ProtocolError, ValueError): - "Response needs to be chunked in order to read it as chunks." - pass - - -class BodyNotHttplibCompatible(HTTPError): - """ - Body should be httplib.HTTPResponse like (have an fp attribute which - returns raw chunks) for read_chunked(). - """ - pass - - -class IncompleteRead(HTTPError, httplib_IncompleteRead): - """ - Response length doesn't match expected Content-Length - - Subclass of http_client.IncompleteRead to allow int value - for `partial` to avoid creating large objects on streamed - reads. - """ - def __init__(self, partial, expected): - super(IncompleteRead, self).__init__(partial, expected) - - def __repr__(self): - return ('IncompleteRead(%i bytes read, ' - '%i more expected)' % (self.partial, self.expected)) - - -class InvalidHeader(HTTPError): - "The header provided was somehow invalid." - pass - - -class ProxySchemeUnknown(AssertionError, ValueError): - "ProxyManager does not support the supplied scheme" - # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. - - def __init__(self, scheme): - message = "Not supported proxy scheme %s" % scheme - super(ProxySchemeUnknown, self).__init__(message) - - -class HeaderParsingError(HTTPError): - "Raised by assert_header_parsing, but we convert it to a log.warning statement." - def __init__(self, defects, unparsed_data): - message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data) - super(HeaderParsingError, self).__init__(message) - - -class UnrewindableBodyError(HTTPError): - "urllib3 encountered an error when trying to rewind a body" - pass diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/fields.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/fields.py deleted file mode 100644 index 37fe64a..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/fields.py +++ /dev/null @@ -1,178 +0,0 @@ -from __future__ import absolute_import -import email.utils -import mimetypes - -from .packages import six - - -def guess_content_type(filename, default='application/octet-stream'): - """ - Guess the "Content-Type" of a file. - - :param filename: - The filename to guess the "Content-Type" of using :mod:`mimetypes`. - :param default: - If no "Content-Type" can be guessed, default to `default`. - """ - if filename: - return mimetypes.guess_type(filename)[0] or default - return default - - -def format_header_param(name, value): - """ - Helper function to format and quote a single header parameter. - - Particularly useful for header parameters which might contain - non-ASCII values, like file names. This follows RFC 2231, as - suggested by RFC 2388 Section 4.4. - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as a unicode string. - """ - if not any(ch in value for ch in '"\\\r\n'): - result = '%s="%s"' % (name, value) - try: - result.encode('ascii') - except (UnicodeEncodeError, UnicodeDecodeError): - pass - else: - return result - if not six.PY3 and isinstance(value, six.text_type): # Python 2: - value = value.encode('utf-8') - value = email.utils.encode_rfc2231(value, 'utf-8') - value = '%s*=%s' % (name, value) - return value - - -class RequestField(object): - """ - A data container for request body parameters. - - :param name: - The name of this request field. - :param data: - The data/value body. - :param filename: - An optional filename of the request field. - :param headers: - An optional dict-like object of headers to initially use for the field. - """ - def __init__(self, name, data, filename=None, headers=None): - self._name = name - self._filename = filename - self.data = data - self.headers = {} - if headers: - self.headers = dict(headers) - - @classmethod - def from_tuples(cls, fieldname, value): - """ - A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. - - Supports constructing :class:`~urllib3.fields.RequestField` from - parameter of key/value strings AND key/filetuple. A filetuple is a - (filename, data, MIME type) tuple where the MIME type is optional. - For example:: - - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - - Field names and filenames must be unicode. - """ - if isinstance(value, tuple): - if len(value) == 3: - filename, data, content_type = value - else: - filename, data = value - content_type = guess_content_type(filename) - else: - filename = None - content_type = None - data = value - - request_param = cls(fieldname, data, filename=filename) - request_param.make_multipart(content_type=content_type) - - return request_param - - def _render_part(self, name, value): - """ - Overridable helper function to format a single header parameter. - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as a unicode string. - """ - return format_header_param(name, value) - - def _render_parts(self, header_parts): - """ - Helper function to format and quote a single header. - - Useful for single headers that are composed of multiple items. E.g., - 'Content-Disposition' fields. - - :param header_parts: - A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format - as `k1="v1"; k2="v2"; ...`. - """ - parts = [] - iterable = header_parts - if isinstance(header_parts, dict): - iterable = header_parts.items() - - for name, value in iterable: - if value is not None: - parts.append(self._render_part(name, value)) - - return '; '.join(parts) - - def render_headers(self): - """ - Renders the headers for this request field. - """ - lines = [] - - sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location'] - for sort_key in sort_keys: - if self.headers.get(sort_key, False): - lines.append('%s: %s' % (sort_key, self.headers[sort_key])) - - for header_name, header_value in self.headers.items(): - if header_name not in sort_keys: - if header_value: - lines.append('%s: %s' % (header_name, header_value)) - - lines.append('\r\n') - return '\r\n'.join(lines) - - def make_multipart(self, content_disposition=None, content_type=None, - content_location=None): - """ - Makes this request field into a multipart request field. - - This method overrides "Content-Disposition", "Content-Type" and - "Content-Location" headers to the request parameter. - - :param content_type: - The 'Content-Type' of the request body. - :param content_location: - The 'Content-Location' of the request body. - - """ - self.headers['Content-Disposition'] = content_disposition or 'form-data' - self.headers['Content-Disposition'] += '; '.join([ - '', self._render_parts( - (('name', self._name), ('filename', self._filename)) - ) - ]) - self.headers['Content-Type'] = content_type - self.headers['Content-Location'] = content_location diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/filepost.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/filepost.py deleted file mode 100644 index 78f1e19..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/filepost.py +++ /dev/null @@ -1,98 +0,0 @@ -from __future__ import absolute_import -import binascii -import codecs -import os - -from io import BytesIO - -from .packages import six -from .packages.six import b -from .fields import RequestField - -writer = codecs.lookup('utf-8')[3] - - -def choose_boundary(): - """ - Our embarrassingly-simple replacement for mimetools.choose_boundary. - """ - boundary = binascii.hexlify(os.urandom(16)) - if six.PY3: - boundary = boundary.decode('ascii') - return boundary - - -def iter_field_objects(fields): - """ - Iterate over fields. - - Supports list of (k, v) tuples and dicts, and lists of - :class:`~urllib3.fields.RequestField`. - - """ - if isinstance(fields, dict): - i = six.iteritems(fields) - else: - i = iter(fields) - - for field in i: - if isinstance(field, RequestField): - yield field - else: - yield RequestField.from_tuples(*field) - - -def iter_fields(fields): - """ - .. deprecated:: 1.6 - - Iterate over fields. - - The addition of :class:`~urllib3.fields.RequestField` makes this function - obsolete. Instead, use :func:`iter_field_objects`, which returns - :class:`~urllib3.fields.RequestField` objects. - - Supports list of (k, v) tuples and dicts. - """ - if isinstance(fields, dict): - return ((k, v) for k, v in six.iteritems(fields)) - - return ((k, v) for k, v in fields) - - -def encode_multipart_formdata(fields, boundary=None): - """ - Encode a dictionary of ``fields`` using the multipart/form-data MIME format. - - :param fields: - Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). - - :param boundary: - If not specified, then a random boundary will be generated using - :func:`urllib3.filepost.choose_boundary`. - """ - body = BytesIO() - if boundary is None: - boundary = choose_boundary() - - for field in iter_field_objects(fields): - body.write(b('--%s\r\n' % (boundary))) - - writer(body).write(field.render_headers()) - data = field.data - - if isinstance(data, int): - data = str(data) # Backwards compatibility - - if isinstance(data, six.text_type): - writer(body).write(data) - else: - body.write(data) - - body.write(b'\r\n') - - body.write(b('--%s--\r\n' % (boundary))) - - content_type = str('multipart/form-data; boundary=%s' % boundary) - - return body.getvalue(), content_type diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/__init__.py deleted file mode 100644 index 170e974..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import absolute_import - -from . import ssl_match_hostname - -__all__ = ('ssl_match_hostname', ) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 3ac4b0a16212eb9092acfe3a85968ff657853a50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmYjMu};G<5Vez3R8=b^zJN7DVo(;45Mp9v0I_7?<koItVaJy3RO-g>@F#pjR;K;} z3q6B`c#`k=-T9sGo>!{{L416dF9!KDiT}t@+~Eo57z7bi6GK}{iO58*Gn2PD-t)E) z#S<xK2Yf|JI-T-$uzHLVlyTO_1O3gPg`mOkxapy{Ar9QghjKP80JdWsy#(;-$BFnN z(Fp+88sMGyIqIMA^~QQ@B=fzDa<HD=YvtS{+a~f=hb`Go4m+mRnz?=K?a<U$ET||e z$2YIMlYu$qs>|#8qHZd;$8s&ZE+rYDRbbQ6YxFnl&jFwY6#;6upXN8lic!nkv{gux IF0*BJ1b(+%j{pDw diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/__pycache__/six.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/__pycache__/six.cpython-38.pyc deleted file mode 100644 index d9fb09657674762e2ad617450f8b5b9bd0f6a663..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24492 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/makefile.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/makefile.py deleted file mode 100644 index 740db37..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/makefile.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -""" -backports.makefile -~~~~~~~~~~~~~~~~~~ - -Backports the Python 3 ``socket.makefile`` method for use with anything that -wants to create a "fake" socket object. -""" -import io - -from socket import SocketIO - - -def backport_makefile(self, mode="r", buffering=None, encoding=None, - errors=None, newline=None): - """ - Backport of ``socket.makefile`` from Python 3.5. - """ - if not set(mode) <= {"r", "w", "b"}: - raise ValueError( - "invalid mode %r (only r, w, b allowed)" % (mode,) - ) - writing = "w" in mode - reading = "r" in mode or not writing - assert reading or writing - binary = "b" in mode - rawmode = "" - if reading: - rawmode += "r" - if writing: - rawmode += "w" - raw = SocketIO(self, rawmode) - self._makefile_refs += 1 - if buffering is None: - buffering = -1 - if buffering < 0: - buffering = io.DEFAULT_BUFFER_SIZE - if buffering == 0: - if not binary: - raise ValueError("unbuffered streams must be binary") - return raw - if reading and writing: - buffer = io.BufferedRWPair(raw, raw, buffering) - elif reading: - buffer = io.BufferedReader(raw, buffering) - else: - assert writing - buffer = io.BufferedWriter(raw, buffering) - if binary: - return buffer - text = io.TextIOWrapper(buffer, encoding, errors, newline) - text.mode = mode - return text diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/six.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/six.py deleted file mode 100644 index 190c023..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/six.py +++ /dev/null @@ -1,868 +0,0 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -# Copyright (c) 2010-2015 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. - -from __future__ import absolute_import - -import functools -import itertools -import operator -import sys -import types - -__author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.10.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 - - -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 __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 - -_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("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("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_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_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("email_mime_base", "email.MIMEBase", "email.mime.base"), - 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("urlencode", "urllib", "urllib.parse"), - MovedAttribute("splitquery", "urllib", "urllib.parse"), - MovedAttribute("splittag", "urllib", "urllib.parse"), - MovedAttribute("splituser", "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"), -] -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 - _assertCountEqual = "assertCountEqual" - if sys.version_info[1] <= 1: - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" -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" -_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) - - -if PY3: - exec_ = getattr(moves.builtins, "exec") - - def reraise(tp, value, tb=None): - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - -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): - raise tp, value, tb -""") - - -if sys.version_info[:2] == (3, 2): - exec_("""def raise_from(value, from_value): - if from_value is None: - raise value - raise value from from_value -""") -elif sys.version_info[:2] > (3, 2): - exec_("""def raise_from(value, from_value): - raise value from from_value -""") -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): - def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - def wrapper(f): - f = functools.wraps(wrapped, assigned, updated)(f) - f.__wrapped__ = wrapped - return f - return wrapper -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(meta): - - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - 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) - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper - - -def python_2_unicode_compatible(klass): - """ - A 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/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py deleted file mode 100644 index d6594eb..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -import sys - -try: - # Our match_hostname function is the same as 3.5's, so we only want to - # import the match_hostname function if it's at least that good. - if sys.version_info < (3, 5): - raise ImportError("Fallback to vendored code") - - from ssl import CertificateError, match_hostname -except ImportError: - try: - # Backport of the function from a pypi module - from backports.ssl_match_hostname import CertificateError, match_hostname - except ImportError: - # Our vendored copy - from ._implementation import CertificateError, match_hostname - -# Not needed, but documenting what we provide. -__all__ = ('CertificateError', 'match_hostname') diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 2b559bef7c076fe7fa391d5e727da1ff1bd31e60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 573 zcmZWly^a$x5VpOWyO8^VA`McC6bNaHtU+l&LI?@nN!MHfLckVSd+{V|Vy`XR7by`H zNcRFf1>HRc&#*03UV#S21OX?;@;4gKH{Xos)zQ&_pnd&Oyt`(Ed`rQ<c7VY%yx|H# z5=k|w$mTwf_f)ba@gra|`$Rud%;h>Wd6k=9)uZG!Y0q;4Y&q~BC`o5C{KeV3!MXRF zv)XZF4^{U6GTxGwy&*f4dDWNnB`Nl{I14#1*fvAI?ICRLp4M7l)U)L{+VKinX+6mC z%t|O&cjr0ysOD-`M>z4``tI1&an^{&hS=5ywiGprTU{2`p*viG56ZSewR77YoEc|* z+?8b^XrCk3r>4~?HB8x1VnW>1tZoZsoCX7JtRw1m`$FK5LVO|qFli+C{+Tz{0QU_< zXszd`S~>TE&y(|$1rEpYJ1ef$1$XP%*mhbz;z322IP6|8AaJML<l*D;K{=hcHKt2g zEYc$vyG`&*ud#m0|5W@xE*JP;6@@6>y6ZnNR$gj&n)VWg2z|z~0qwIPJ*F%n8)ZKM DS0|rr diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py deleted file mode 100644 index 970cf65..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py +++ /dev/null @@ -1,156 +0,0 @@ -"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" - -# Note: This file is under the PSF license as the code comes from the python -# stdlib. http://docs.python.org/3/license.html - -import re -import sys - -# ipaddress has been backported to 2.6+ in pypi. If it is installed on the -# system, use it to handle IPAddress ServerAltnames (this was added in -# python-3.5) otherwise only do DNS matching. This allows -# backports.ssl_match_hostname to continue to be used in Python 2.7. -try: - from pip._vendor import ipaddress -except ImportError: - ipaddress = None - -__version__ = '3.5.0.1' - - -class CertificateError(ValueError): - pass - - -def _dnsname_match(dn, hostname, max_wildcards=1): - """Matching according to RFC 6125, section 6.4.3 - - http://tools.ietf.org/html/rfc6125#section-6.4.3 - """ - pats = [] - if not dn: - return False - - # Ported from python3-syntax: - # leftmost, *remainder = dn.split(r'.') - parts = dn.split(r'.') - leftmost = parts[0] - remainder = parts[1:] - - wildcards = leftmost.count('*') - if wildcards > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survey of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn)) - - # speed up common case w/o wildcards - if not wildcards: - return dn.lower() == hostname.lower() - - # RFC 6125, section 6.4.3, subitem 1. - # The client SHOULD NOT attempt to match a presented identifier in which - # the wildcard character comprises a label other than the left-most label. - if leftmost == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - elif leftmost.startswith('xn--') or hostname.startswith('xn--'): - # RFC 6125, section 6.4.3, subitem 3. - # The client SHOULD NOT attempt to match a presented identifier - # where the wildcard character is embedded within an A-label or - # U-label of an internationalized domain name. - pats.append(re.escape(leftmost)) - else: - # Otherwise, '*' matches any dotless string, e.g. www* - pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) - - # add the remaining fragments, ignore any wildcards - for frag in remainder: - pats.append(re.escape(frag)) - - pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - return pat.match(hostname) - - -def _to_unicode(obj): - if isinstance(obj, str) and sys.version_info < (3,): - obj = unicode(obj, encoding='ascii', errors='strict') - return obj - -def _ipaddress_match(ipname, host_ip): - """Exact matching of IP addresses. - - RFC 6125 explicitly doesn't define an algorithm for this - (section 1.7.2 - "Out of Scope"). - """ - # OpenSSL may add a trailing newline to a subjectAltName's IP address - # Divergence from upstream: ipaddress can't handle byte str - ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) - return ip == host_ip - - -def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 - rules are followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError("empty or no certificate, match_hostname needs a " - "SSL socket or SSL context with either " - "CERT_OPTIONAL or CERT_REQUIRED") - try: - # Divergence from upstream: ipaddress can't handle byte str - host_ip = ipaddress.ip_address(_to_unicode(hostname)) - except ValueError: - # Not an IP address (common case) - host_ip = None - except UnicodeError: - # Divergence from upstream: Have to deal with ipaddress not taking - # byte strings. addresses should be all ascii, so we consider it not - # an ipaddress in this case - host_ip = None - except AttributeError: - # Divergence from upstream: Make ipaddress library optional - if ipaddress is None: - host_ip = None - else: - raise - dnsnames = [] - san = cert.get('subjectAltName', ()) - for key, value in san: - if key == 'DNS': - if host_ip is None and _dnsname_match(value, hostname): - return - dnsnames.append(value) - elif key == 'IP Address': - if host_ip is not None and _ipaddress_match(value, host_ip): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get('subject', ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == 'commonName': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise CertificateError("hostname %r " - "doesn't match either of %s" - % (hostname, ', '.join(map(repr, dnsnames)))) - elif len(dnsnames) == 1: - raise CertificateError("hostname %r " - "doesn't match %r" - % (hostname, dnsnames[0])) - else: - raise CertificateError("no appropriate commonName or " - "subjectAltName fields were found") diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/poolmanager.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/poolmanager.py deleted file mode 100644 index fe5491c..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/poolmanager.py +++ /dev/null @@ -1,450 +0,0 @@ -from __future__ import absolute_import -import collections -import functools -import logging - -from ._collections import RecentlyUsedContainer -from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool -from .connectionpool import port_by_scheme -from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown -from .packages.six.moves.urllib.parse import urljoin -from .request import RequestMethods -from .util.url import parse_url -from .util.retry import Retry - - -__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] - - -log = logging.getLogger(__name__) - -SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', - 'ssl_version', 'ca_cert_dir', 'ssl_context') - -# All known keyword arguments that could be provided to the pool manager, its -# pools, or the underlying connections. This is used to construct a pool key. -_key_fields = ( - 'key_scheme', # str - 'key_host', # str - 'key_port', # int - 'key_timeout', # int or float or Timeout - 'key_retries', # int or Retry - 'key_strict', # bool - 'key_block', # bool - 'key_source_address', # str - 'key_key_file', # str - 'key_cert_file', # str - 'key_cert_reqs', # str - 'key_ca_certs', # str - 'key_ssl_version', # str - 'key_ca_cert_dir', # str - 'key_ssl_context', # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext - 'key_maxsize', # int - 'key_headers', # dict - 'key__proxy', # parsed proxy url - 'key__proxy_headers', # dict - 'key_socket_options', # list of (level (int), optname (int), value (int or str)) tuples - 'key__socks_options', # dict - 'key_assert_hostname', # bool or string - 'key_assert_fingerprint', # str - 'key_server_hostname', #str -) - -#: The namedtuple class used to construct keys for the connection pool. -#: All custom key schemes should include the fields in this key at a minimum. -PoolKey = collections.namedtuple('PoolKey', _key_fields) - - -def _default_key_normalizer(key_class, request_context): - """ - Create a pool key out of a request context dictionary. - - According to RFC 3986, both the scheme and host are case-insensitive. - Therefore, this function normalizes both before constructing the pool - key for an HTTPS request. If you wish to change this behaviour, provide - alternate callables to ``key_fn_by_scheme``. - - :param key_class: - The class to use when constructing the key. This should be a namedtuple - with the ``scheme`` and ``host`` keys at a minimum. - :type key_class: namedtuple - :param request_context: - A dictionary-like object that contain the context for a request. - :type request_context: dict - - :return: A namedtuple that can be used as a connection pool key. - :rtype: PoolKey - """ - # Since we mutate the dictionary, make a copy first - context = request_context.copy() - context['scheme'] = context['scheme'].lower() - context['host'] = context['host'].lower() - - # These are both dictionaries and need to be transformed into frozensets - for key in ('headers', '_proxy_headers', '_socks_options'): - if key in context and context[key] is not None: - context[key] = frozenset(context[key].items()) - - # The socket_options key may be a list and needs to be transformed into a - # tuple. - socket_opts = context.get('socket_options') - if socket_opts is not None: - context['socket_options'] = tuple(socket_opts) - - # Map the kwargs to the names in the namedtuple - this is necessary since - # namedtuples can't have fields starting with '_'. - for key in list(context.keys()): - context['key_' + key] = context.pop(key) - - # Default to ``None`` for keys missing from the context - for field in key_class._fields: - if field not in context: - context[field] = None - - return key_class(**context) - - -#: A dictionary that maps a scheme to a callable that creates a pool key. -#: This can be used to alter the way pool keys are constructed, if desired. -#: Each PoolManager makes a copy of this dictionary so they can be configured -#: globally here, or individually on the instance. -key_fn_by_scheme = { - 'http': functools.partial(_default_key_normalizer, PoolKey), - 'https': functools.partial(_default_key_normalizer, PoolKey), -} - -pool_classes_by_scheme = { - 'http': HTTPConnectionPool, - 'https': HTTPSConnectionPool, -} - - -class PoolManager(RequestMethods): - """ - Allows for arbitrary requests while transparently keeping track of - necessary connection pools for you. - - :param num_pools: - Number of connection pools to cache before discarding the least - recently used pool. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param \\**connection_pool_kw: - Additional parameters are used to create fresh - :class:`urllib3.connectionpool.ConnectionPool` instances. - - Example:: - - >>> manager = PoolManager(num_pools=2) - >>> r = manager.request('GET', 'http://google.com/') - >>> r = manager.request('GET', 'http://google.com/mail') - >>> r = manager.request('GET', 'http://yahoo.com/') - >>> len(manager.pools) - 2 - - """ - - proxy = None - - def __init__(self, num_pools=10, headers=None, **connection_pool_kw): - RequestMethods.__init__(self, headers) - self.connection_pool_kw = connection_pool_kw - self.pools = RecentlyUsedContainer(num_pools, - dispose_func=lambda p: p.close()) - - # Locally set the pool classes and keys so other PoolManagers can - # override them. - self.pool_classes_by_scheme = pool_classes_by_scheme - self.key_fn_by_scheme = key_fn_by_scheme.copy() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.clear() - # Return False to re-raise any potential exceptions - return False - - def _new_pool(self, scheme, host, port, request_context=None): - """ - Create a new :class:`ConnectionPool` based on host, port, scheme, and - any additional pool keyword arguments. - - If ``request_context`` is provided, it is provided as keyword arguments - to the pool class used. This method is used to actually create the - connection pools handed out by :meth:`connection_from_url` and - companion methods. It is intended to be overridden for customization. - """ - pool_cls = self.pool_classes_by_scheme[scheme] - if request_context is None: - request_context = self.connection_pool_kw.copy() - - # Although the context has everything necessary to create the pool, - # this function has historically only used the scheme, host, and port - # in the positional args. When an API change is acceptable these can - # be removed. - for key in ('scheme', 'host', 'port'): - request_context.pop(key, None) - - if scheme == 'http': - for kw in SSL_KEYWORDS: - request_context.pop(kw, None) - - return pool_cls(host, port, **request_context) - - def clear(self): - """ - Empty our store of pools and direct them all to close. - - This will not affect in-flight connections, but they will not be - re-used after completion. - """ - self.pools.clear() - - def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): - """ - Get a :class:`ConnectionPool` based on the host, port, and scheme. - - If ``port`` isn't given, it will be derived from the ``scheme`` using - ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is - provided, it is merged with the instance's ``connection_pool_kw`` - variable and used to create the new connection pool, if one is - needed. - """ - - if not host: - raise LocationValueError("No host specified.") - - request_context = self._merge_pool_kwargs(pool_kwargs) - request_context['scheme'] = scheme or 'http' - if not port: - port = port_by_scheme.get(request_context['scheme'].lower(), 80) - request_context['port'] = port - request_context['host'] = host - - return self.connection_from_context(request_context) - - def connection_from_context(self, request_context): - """ - Get a :class:`ConnectionPool` based on the request context. - - ``request_context`` must at least contain the ``scheme`` key and its - value must be a key in ``key_fn_by_scheme`` instance variable. - """ - scheme = request_context['scheme'].lower() - pool_key_constructor = self.key_fn_by_scheme[scheme] - pool_key = pool_key_constructor(request_context) - - return self.connection_from_pool_key(pool_key, request_context=request_context) - - def connection_from_pool_key(self, pool_key, request_context=None): - """ - Get a :class:`ConnectionPool` based on the provided pool key. - - ``pool_key`` should be a namedtuple that only contains immutable - objects. At a minimum it must have the ``scheme``, ``host``, and - ``port`` fields. - """ - with self.pools.lock: - # If the scheme, host, or port doesn't match existing open - # connections, open a new ConnectionPool. - pool = self.pools.get(pool_key) - if pool: - return pool - - # Make a fresh ConnectionPool of the desired type - scheme = request_context['scheme'] - host = request_context['host'] - port = request_context['port'] - pool = self._new_pool(scheme, host, port, request_context=request_context) - self.pools[pool_key] = pool - - return pool - - def connection_from_url(self, url, pool_kwargs=None): - """ - Similar to :func:`urllib3.connectionpool.connection_from_url`. - - If ``pool_kwargs`` is not provided and a new pool needs to be - constructed, ``self.connection_pool_kw`` is used to initialize - the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` - is provided, it is used instead. Note that if a new pool does not - need to be created for the request, the provided ``pool_kwargs`` are - not used. - """ - u = parse_url(url) - return self.connection_from_host(u.host, port=u.port, scheme=u.scheme, - pool_kwargs=pool_kwargs) - - def _merge_pool_kwargs(self, override): - """ - Merge a dictionary of override values for self.connection_pool_kw. - - This does not modify self.connection_pool_kw and returns a new dict. - Any keys in the override dictionary with a value of ``None`` are - removed from the merged dictionary. - """ - base_pool_kwargs = self.connection_pool_kw.copy() - if override: - for key, value in override.items(): - if value is None: - try: - del base_pool_kwargs[key] - except KeyError: - pass - else: - base_pool_kwargs[key] = value - return base_pool_kwargs - - def urlopen(self, method, url, redirect=True, **kw): - """ - Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` - with custom cross-host redirect logic and only sends the request-uri - portion of the ``url``. - - The given ``url`` parameter must be absolute, such that an appropriate - :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. - """ - u = parse_url(url) - conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) - - kw['assert_same_host'] = False - kw['redirect'] = False - - if 'headers' not in kw: - kw['headers'] = self.headers.copy() - - if self.proxy is not None and u.scheme == "http": - response = conn.urlopen(method, url, **kw) - else: - response = conn.urlopen(method, u.request_uri, **kw) - - redirect_location = redirect and response.get_redirect_location() - if not redirect_location: - return response - - # Support relative URLs for redirecting. - redirect_location = urljoin(url, redirect_location) - - # RFC 7231, Section 6.4.4 - if response.status == 303: - method = 'GET' - - retries = kw.get('retries') - if not isinstance(retries, Retry): - retries = Retry.from_int(retries, redirect=redirect) - - # Strip headers marked as unsafe to forward to the redirected location. - # Check remove_headers_on_redirect to avoid a potential network call within - # conn.is_same_host() which may use socket.gethostbyname() in the future. - if (retries.remove_headers_on_redirect - and not conn.is_same_host(redirect_location)): - for header in retries.remove_headers_on_redirect: - kw['headers'].pop(header, None) - - try: - retries = retries.increment(method, url, response=response, _pool=conn) - except MaxRetryError: - if retries.raise_on_redirect: - raise - return response - - kw['retries'] = retries - kw['redirect'] = redirect - - log.info("Redirecting %s -> %s", url, redirect_location) - return self.urlopen(method, redirect_location, **kw) - - -class ProxyManager(PoolManager): - """ - Behaves just like :class:`PoolManager`, but sends all requests through - the defined proxy, using the CONNECT method for HTTPS URLs. - - :param proxy_url: - The URL of the proxy to be used. - - :param proxy_headers: - A dictionary containing headers that will be sent to the proxy. In case - of HTTP they are being sent with each request, while in the - HTTPS/CONNECT case they are sent only once. Could be used for proxy - authentication. - - Example: - >>> proxy = urllib3.ProxyManager('http://localhost:3128/') - >>> r1 = proxy.request('GET', 'http://google.com/') - >>> r2 = proxy.request('GET', 'http://httpbin.org/') - >>> len(proxy.pools) - 1 - >>> r3 = proxy.request('GET', 'https://httpbin.org/') - >>> r4 = proxy.request('GET', 'https://twitter.com/') - >>> len(proxy.pools) - 3 - - """ - - def __init__(self, proxy_url, num_pools=10, headers=None, - proxy_headers=None, **connection_pool_kw): - - if isinstance(proxy_url, HTTPConnectionPool): - proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host, - proxy_url.port) - proxy = parse_url(proxy_url) - if not proxy.port: - port = port_by_scheme.get(proxy.scheme, 80) - proxy = proxy._replace(port=port) - - if proxy.scheme not in ("http", "https"): - raise ProxySchemeUnknown(proxy.scheme) - - self.proxy = proxy - self.proxy_headers = proxy_headers or {} - - connection_pool_kw['_proxy'] = self.proxy - connection_pool_kw['_proxy_headers'] = self.proxy_headers - - super(ProxyManager, self).__init__( - num_pools, headers, **connection_pool_kw) - - def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): - if scheme == "https": - return super(ProxyManager, self).connection_from_host( - host, port, scheme, pool_kwargs=pool_kwargs) - - return super(ProxyManager, self).connection_from_host( - self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs) - - def _set_proxy_headers(self, url, headers=None): - """ - Sets headers needed by proxies: specifically, the Accept and Host - headers. Only sets headers not provided by the user. - """ - headers_ = {'Accept': '*/*'} - - netloc = parse_url(url).netloc - if netloc: - headers_['Host'] = netloc - - if headers: - headers_.update(headers) - return headers_ - - def urlopen(self, method, url, redirect=True, **kw): - "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." - u = parse_url(url) - - if u.scheme == "http": - # For proxied HTTPS requests, httplib sets the necessary headers - # on the CONNECT to the proxy. For HTTP, we'll definitely - # need to set 'Host' at the very least. - headers = kw.get('headers', self.headers) - kw['headers'] = self._set_proxy_headers(url, headers) - - return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) - - -def proxy_from_url(url, **kw): - return ProxyManager(proxy_url=url, **kw) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/request.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/request.py deleted file mode 100644 index 8f2f44b..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/request.py +++ /dev/null @@ -1,150 +0,0 @@ -from __future__ import absolute_import - -from .filepost import encode_multipart_formdata -from .packages.six.moves.urllib.parse import urlencode - - -__all__ = ['RequestMethods'] - - -class RequestMethods(object): - """ - Convenience mixin for classes who implement a :meth:`urlopen` method, such - as :class:`~urllib3.connectionpool.HTTPConnectionPool` and - :class:`~urllib3.poolmanager.PoolManager`. - - Provides behavior for making common types of HTTP request methods and - decides which type of request field encoding to use. - - Specifically, - - :meth:`.request_encode_url` is for sending requests whose fields are - encoded in the URL (such as GET, HEAD, DELETE). - - :meth:`.request_encode_body` is for sending requests whose fields are - encoded in the *body* of the request using multipart or www-form-urlencoded - (such as for POST, PUT, PATCH). - - :meth:`.request` is for making any kind of request, it will look up the - appropriate encoding format and use one of the above two methods to make - the request. - - Initializer parameters: - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - """ - - _encode_url_methods = {'DELETE', 'GET', 'HEAD', 'OPTIONS'} - - def __init__(self, headers=None): - self.headers = headers or {} - - def urlopen(self, method, url, body=None, headers=None, - encode_multipart=True, multipart_boundary=None, - **kw): # Abstract - raise NotImplementedError("Classes extending RequestMethods must implement " - "their own ``urlopen`` method.") - - def request(self, method, url, fields=None, headers=None, **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the appropriate encoding of - ``fields`` based on the ``method`` used. - - This is a convenience method that requires the least amount of manual - effort. It can be used in most situations, while still having the - option to drop down to more specific methods when necessary, such as - :meth:`request_encode_url`, :meth:`request_encode_body`, - or even the lowest level :meth:`urlopen`. - """ - method = method.upper() - - urlopen_kw['request_url'] = url - - if method in self._encode_url_methods: - return self.request_encode_url(method, url, fields=fields, - headers=headers, - **urlopen_kw) - else: - return self.request_encode_body(method, url, fields=fields, - headers=headers, - **urlopen_kw) - - def request_encode_url(self, method, url, fields=None, headers=None, - **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the url. This is useful for request methods like GET, HEAD, DELETE, etc. - """ - if headers is None: - headers = self.headers - - extra_kw = {'headers': headers} - extra_kw.update(urlopen_kw) - - if fields: - url += '?' + urlencode(fields) - - return self.urlopen(method, url, **extra_kw) - - def request_encode_body(self, method, url, fields=None, headers=None, - encode_multipart=True, multipart_boundary=None, - **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the body. This is useful for request methods like POST, PUT, PATCH, etc. - - When ``encode_multipart=True`` (default), then - :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode - the payload with the appropriate content type. Otherwise - :meth:`urllib.urlencode` is used with the - 'application/x-www-form-urlencoded' content type. - - Multipart encoding must be used when posting files, and it's reasonably - safe to use it in other times too. However, it may break request - signing, such as with OAuth. - - Supports an optional ``fields`` parameter of key/value strings AND - key/filetuple. A filetuple is a (filename, data, MIME type) tuple where - the MIME type is optional. For example:: - - fields = { - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), - 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - } - - When uploading a file, providing a filename (the first parameter of the - tuple) is optional but recommended to best mimic behavior of browsers. - - Note that if ``headers`` are supplied, the 'Content-Type' header will - be overwritten because it depends on the dynamic random boundary string - which is used to compose the body of the request. The random boundary - string can be explicitly set with the ``multipart_boundary`` parameter. - """ - if headers is None: - headers = self.headers - - extra_kw = {'headers': {}} - - if fields: - if 'body' in urlopen_kw: - raise TypeError( - "request got values for both 'fields' and 'body', can only specify one.") - - if encode_multipart: - body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary) - else: - body, content_type = urlencode(fields), 'application/x-www-form-urlencoded' - - extra_kw['body'] = body - extra_kw['headers'] = {'Content-Type': content_type} - - extra_kw['headers'].update(headers) - extra_kw.update(urlopen_kw) - - return self.urlopen(method, url, **extra_kw) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/response.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/response.py deleted file mode 100644 index c112690..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/response.py +++ /dev/null @@ -1,705 +0,0 @@ -from __future__ import absolute_import -from contextlib import contextmanager -import zlib -import io -import logging -from socket import timeout as SocketTimeout -from socket import error as SocketError - -from ._collections import HTTPHeaderDict -from .exceptions import ( - BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError, - ResponseNotChunked, IncompleteRead, InvalidHeader -) -from .packages.six import string_types as basestring, PY3 -from .packages.six.moves import http_client as httplib -from .connection import HTTPException, BaseSSLError -from .util.response import is_fp_closed, is_response_to_head - -log = logging.getLogger(__name__) - - -class DeflateDecoder(object): - - def __init__(self): - self._first_try = True - self._data = b'' - self._obj = zlib.decompressobj() - - def __getattr__(self, name): - return getattr(self._obj, name) - - def decompress(self, data): - if not data: - return data - - if not self._first_try: - return self._obj.decompress(data) - - self._data += data - try: - decompressed = self._obj.decompress(data) - if decompressed: - self._first_try = False - self._data = None - return decompressed - except zlib.error: - self._first_try = False - self._obj = zlib.decompressobj(-zlib.MAX_WBITS) - try: - return self.decompress(self._data) - finally: - self._data = None - - -class GzipDecoderState(object): - - FIRST_MEMBER = 0 - OTHER_MEMBERS = 1 - SWALLOW_DATA = 2 - - -class GzipDecoder(object): - - def __init__(self): - self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) - self._state = GzipDecoderState.FIRST_MEMBER - - def __getattr__(self, name): - return getattr(self._obj, name) - - def decompress(self, data): - ret = bytearray() - if self._state == GzipDecoderState.SWALLOW_DATA or not data: - return bytes(ret) - while True: - try: - ret += self._obj.decompress(data) - except zlib.error: - previous_state = self._state - # Ignore data after the first error - self._state = GzipDecoderState.SWALLOW_DATA - if previous_state == GzipDecoderState.OTHER_MEMBERS: - # Allow trailing garbage acceptable in other gzip clients - return bytes(ret) - raise - data = self._obj.unused_data - if not data: - return bytes(ret) - self._state = GzipDecoderState.OTHER_MEMBERS - self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) - - -class MultiDecoder(object): - """ - From RFC7231: - If one or more encodings have been applied to a representation, the - sender that applied the encodings MUST generate a Content-Encoding - header field that lists the content codings in the order in which - they were applied. - """ - - def __init__(self, modes): - self._decoders = [_get_decoder(m.strip()) for m in modes.split(',')] - - def flush(self): - return self._decoders[0].flush() - - def decompress(self, data): - for d in reversed(self._decoders): - data = d.decompress(data) - return data - - -def _get_decoder(mode): - if ',' in mode: - return MultiDecoder(mode) - - if mode == 'gzip': - return GzipDecoder() - - return DeflateDecoder() - - -class HTTPResponse(io.IOBase): - """ - HTTP Response container. - - Backwards-compatible to httplib's HTTPResponse but the response ``body`` is - loaded and decoded on-demand when the ``data`` property is accessed. This - class is also compatible with the Python standard library's :mod:`io` - module, and can hence be treated as a readable object in the context of that - framework. - - Extra parameters for behaviour not present in httplib.HTTPResponse: - - :param preload_content: - If True, the response's body will be preloaded during construction. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param original_response: - When this HTTPResponse wrapper is generated from an httplib.HTTPResponse - object, it's convenient to include the original for debug purposes. It's - otherwise unused. - - :param retries: - The retries contains the last :class:`~urllib3.util.retry.Retry` that - was used during the request. - - :param enforce_content_length: - Enforce content length checking. Body returned by server must match - value of Content-Length header, if present. Otherwise, raise error. - """ - - CONTENT_DECODERS = ['gzip', 'deflate'] - REDIRECT_STATUSES = [301, 302, 303, 307, 308] - - def __init__(self, body='', headers=None, status=0, version=0, reason=None, - strict=0, preload_content=True, decode_content=True, - original_response=None, pool=None, connection=None, msg=None, - retries=None, enforce_content_length=False, - request_method=None, request_url=None): - - if isinstance(headers, HTTPHeaderDict): - self.headers = headers - else: - self.headers = HTTPHeaderDict(headers) - self.status = status - self.version = version - self.reason = reason - self.strict = strict - self.decode_content = decode_content - self.retries = retries - self.enforce_content_length = enforce_content_length - - self._decoder = None - self._body = None - self._fp = None - self._original_response = original_response - self._fp_bytes_read = 0 - self.msg = msg - self._request_url = request_url - - if body and isinstance(body, (basestring, bytes)): - self._body = body - - self._pool = pool - self._connection = connection - - if hasattr(body, 'read'): - self._fp = body - - # Are we using the chunked-style of transfer encoding? - self.chunked = False - self.chunk_left = None - tr_enc = self.headers.get('transfer-encoding', '').lower() - # Don't incur the penalty of creating a list and then discarding it - encodings = (enc.strip() for enc in tr_enc.split(",")) - if "chunked" in encodings: - self.chunked = True - - # Determine length of response - self.length_remaining = self._init_length(request_method) - - # If requested, preload the body. - if preload_content and not self._body: - self._body = self.read(decode_content=decode_content) - - def get_redirect_location(self): - """ - Should we redirect and where to? - - :returns: Truthy redirect location string if we got a redirect status - code and valid location. ``None`` if redirect status and no - location. ``False`` if not a redirect status code. - """ - if self.status in self.REDIRECT_STATUSES: - return self.headers.get('location') - - return False - - def release_conn(self): - if not self._pool or not self._connection: - return - - self._pool._put_conn(self._connection) - self._connection = None - - @property - def data(self): - # For backwords-compat with earlier urllib3 0.4 and earlier. - if self._body: - return self._body - - if self._fp: - return self.read(cache_content=True) - - @property - def connection(self): - return self._connection - - def isclosed(self): - return is_fp_closed(self._fp) - - def tell(self): - """ - Obtain the number of bytes pulled over the wire so far. May differ from - the amount of content returned by :meth:``HTTPResponse.read`` if bytes - are encoded on the wire (e.g, compressed). - """ - return self._fp_bytes_read - - def _init_length(self, request_method): - """ - Set initial length value for Response content if available. - """ - length = self.headers.get('content-length') - - if length is not None: - if self.chunked: - # This Response will fail with an IncompleteRead if it can't be - # received as chunked. This method falls back to attempt reading - # the response before raising an exception. - log.warning("Received response with both Content-Length and " - "Transfer-Encoding set. This is expressly forbidden " - "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " - "attempting to process response as Transfer-Encoding: " - "chunked.") - return None - - try: - # RFC 7230 section 3.3.2 specifies multiple content lengths can - # be sent in a single Content-Length header - # (e.g. Content-Length: 42, 42). This line ensures the values - # are all valid ints and that as long as the `set` length is 1, - # all values are the same. Otherwise, the header is invalid. - lengths = set([int(val) for val in length.split(',')]) - if len(lengths) > 1: - raise InvalidHeader("Content-Length contained multiple " - "unmatching values (%s)" % length) - length = lengths.pop() - except ValueError: - length = None - else: - if length < 0: - length = None - - # Convert status to int for comparison - # In some cases, httplib returns a status of "_UNKNOWN" - try: - status = int(self.status) - except ValueError: - status = 0 - - # Check for responses that shouldn't include a body - if status in (204, 304) or 100 <= status < 200 or request_method == 'HEAD': - length = 0 - - return length - - def _init_decoder(self): - """ - Set-up the _decoder attribute if necessary. - """ - # Note: content-encoding value should be case-insensitive, per RFC 7230 - # Section 3.2 - content_encoding = self.headers.get('content-encoding', '').lower() - if self._decoder is None: - if content_encoding in self.CONTENT_DECODERS: - self._decoder = _get_decoder(content_encoding) - elif ',' in content_encoding: - encodings = [e.strip() for e in content_encoding.split(',') if e.strip() in self.CONTENT_DECODERS] - if len(encodings): - self._decoder = _get_decoder(content_encoding) - - def _decode(self, data, decode_content, flush_decoder): - """ - Decode the data passed in and potentially flush the decoder. - """ - try: - if decode_content and self._decoder: - data = self._decoder.decompress(data) - except (IOError, zlib.error) as e: - content_encoding = self.headers.get('content-encoding', '').lower() - raise DecodeError( - "Received response with content-encoding: %s, but " - "failed to decode it." % content_encoding, e) - - if flush_decoder and decode_content: - data += self._flush_decoder() - - return data - - def _flush_decoder(self): - """ - Flushes the decoder. Should only be called if the decoder is actually - being used. - """ - if self._decoder: - buf = self._decoder.decompress(b'') - return buf + self._decoder.flush() - - return b'' - - @contextmanager - def _error_catcher(self): - """ - Catch low-level python exceptions, instead re-raising urllib3 - variants, so that low-level exceptions are not leaked in the - high-level api. - - On exit, release the connection back to the pool. - """ - clean_exit = False - - try: - try: - yield - - except SocketTimeout: - # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but - # there is yet no clean way to get at it from this context. - raise ReadTimeoutError(self._pool, None, 'Read timed out.') - - except BaseSSLError as e: - # FIXME: Is there a better way to differentiate between SSLErrors? - if 'read operation timed out' not in str(e): # Defensive: - # This shouldn't happen but just in case we're missing an edge - # case, let's avoid swallowing SSL errors. - raise - - raise ReadTimeoutError(self._pool, None, 'Read timed out.') - - except (HTTPException, SocketError) as e: - # This includes IncompleteRead. - raise ProtocolError('Connection broken: %r' % e, e) - - # If no exception is thrown, we should avoid cleaning up - # unnecessarily. - clean_exit = True - finally: - # If we didn't terminate cleanly, we need to throw away our - # connection. - if not clean_exit: - # The response may not be closed but we're not going to use it - # anymore so close it now to ensure that the connection is - # released back to the pool. - if self._original_response: - self._original_response.close() - - # Closing the response may not actually be sufficient to close - # everything, so if we have a hold of the connection close that - # too. - if self._connection: - self._connection.close() - - # If we hold the original response but it's closed now, we should - # return the connection back to the pool. - if self._original_response and self._original_response.isclosed(): - self.release_conn() - - def read(self, amt=None, decode_content=None, cache_content=False): - """ - Similar to :meth:`httplib.HTTPResponse.read`, but with two additional - parameters: ``decode_content`` and ``cache_content``. - - :param amt: - How much of the content to read. If specified, caching is skipped - because it doesn't make sense to cache partial content as the full - response. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param cache_content: - If True, will save the returned data such that the same result is - returned despite of the state of the underlying file object. This - is useful if you want the ``.data`` property to continue working - after having ``.read()`` the file object. (Overridden if ``amt`` is - set.) - """ - self._init_decoder() - if decode_content is None: - decode_content = self.decode_content - - if self._fp is None: - return - - flush_decoder = False - data = None - - with self._error_catcher(): - if amt is None: - # cStringIO doesn't like amt=None - data = self._fp.read() - flush_decoder = True - else: - cache_content = False - data = self._fp.read(amt) - if amt != 0 and not data: # Platform-specific: Buggy versions of Python. - # Close the connection when no data is returned - # - # This is redundant to what httplib/http.client _should_ - # already do. However, versions of python released before - # December 15, 2012 (http://bugs.python.org/issue16298) do - # not properly close the connection in all cases. There is - # no harm in redundantly calling close. - self._fp.close() - flush_decoder = True - if self.enforce_content_length and self.length_remaining not in (0, None): - # This is an edge case that httplib failed to cover due - # to concerns of backward compatibility. We're - # addressing it here to make sure IncompleteRead is - # raised during streaming, so all calls with incorrect - # Content-Length are caught. - raise IncompleteRead(self._fp_bytes_read, self.length_remaining) - - if data: - self._fp_bytes_read += len(data) - if self.length_remaining is not None: - self.length_remaining -= len(data) - - data = self._decode(data, decode_content, flush_decoder) - - if cache_content: - self._body = data - - return data - - def stream(self, amt=2**16, decode_content=None): - """ - A generator wrapper for the read() method. A call will block until - ``amt`` bytes have been read from the connection or until the - connection is closed. - - :param amt: - How much of the content to read. The generator will return up to - much data per iteration, but may return less. This is particularly - likely when using compressed data. However, the empty string will - never be returned. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - if self.chunked and self.supports_chunked_reads(): - for line in self.read_chunked(amt, decode_content=decode_content): - yield line - else: - while not is_fp_closed(self._fp): - data = self.read(amt=amt, decode_content=decode_content) - - if data: - yield data - - @classmethod - def from_httplib(ResponseCls, r, **response_kw): - """ - Given an :class:`httplib.HTTPResponse` instance ``r``, return a - corresponding :class:`urllib3.response.HTTPResponse` object. - - Remaining parameters are passed to the HTTPResponse constructor, along - with ``original_response=r``. - """ - headers = r.msg - - if not isinstance(headers, HTTPHeaderDict): - if PY3: # Python 3 - headers = HTTPHeaderDict(headers.items()) - else: # Python 2 - headers = HTTPHeaderDict.from_httplib(headers) - - # HTTPResponse objects in Python 3 don't have a .strict attribute - strict = getattr(r, 'strict', 0) - resp = ResponseCls(body=r, - headers=headers, - status=r.status, - version=r.version, - reason=r.reason, - strict=strict, - original_response=r, - **response_kw) - return resp - - # Backwards-compatibility methods for httplib.HTTPResponse - def getheaders(self): - return self.headers - - def getheader(self, name, default=None): - return self.headers.get(name, default) - - # Backwards compatibility for http.cookiejar - def info(self): - return self.headers - - # Overrides from io.IOBase - def close(self): - if not self.closed: - self._fp.close() - - if self._connection: - self._connection.close() - - @property - def closed(self): - if self._fp is None: - return True - elif hasattr(self._fp, 'isclosed'): - return self._fp.isclosed() - elif hasattr(self._fp, 'closed'): - return self._fp.closed - else: - return True - - def fileno(self): - if self._fp is None: - raise IOError("HTTPResponse has no file to get a fileno from") - elif hasattr(self._fp, "fileno"): - return self._fp.fileno() - else: - raise IOError("The file-like object this HTTPResponse is wrapped " - "around has no file descriptor") - - def flush(self): - if self._fp is not None and hasattr(self._fp, 'flush'): - return self._fp.flush() - - def readable(self): - # This method is required for `io` module compatibility. - return True - - def readinto(self, b): - # This method is required for `io` module compatibility. - temp = self.read(len(b)) - if len(temp) == 0: - return 0 - else: - b[:len(temp)] = temp - return len(temp) - - def supports_chunked_reads(self): - """ - Checks if the underlying file-like object looks like a - httplib.HTTPResponse object. We do this by testing for the fp - attribute. If it is present we assume it returns raw chunks as - processed by read_chunked(). - """ - return hasattr(self._fp, 'fp') - - def _update_chunk_length(self): - # First, we'll figure out length of a chunk and then - # we'll try to read it from socket. - if self.chunk_left is not None: - return - line = self._fp.fp.readline() - line = line.split(b';', 1)[0] - try: - self.chunk_left = int(line, 16) - except ValueError: - # Invalid chunked protocol response, abort. - self.close() - raise httplib.IncompleteRead(line) - - def _handle_chunk(self, amt): - returned_chunk = None - if amt is None: - chunk = self._fp._safe_read(self.chunk_left) - returned_chunk = chunk - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - elif amt < self.chunk_left: - value = self._fp._safe_read(amt) - self.chunk_left = self.chunk_left - amt - returned_chunk = value - elif amt == self.chunk_left: - value = self._fp._safe_read(amt) - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - returned_chunk = value - else: # amt > self.chunk_left - returned_chunk = self._fp._safe_read(self.chunk_left) - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - return returned_chunk - - def read_chunked(self, amt=None, decode_content=None): - """ - Similar to :meth:`HTTPResponse.read`, but with an additional - parameter: ``decode_content``. - - :param amt: - How much of the content to read. If specified, caching is skipped - because it doesn't make sense to cache partial content as the full - response. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - self._init_decoder() - # FIXME: Rewrite this method and make it a class with a better structured logic. - if not self.chunked: - raise ResponseNotChunked( - "Response is not chunked. " - "Header 'transfer-encoding: chunked' is missing.") - if not self.supports_chunked_reads(): - raise BodyNotHttplibCompatible( - "Body should be httplib.HTTPResponse like. " - "It should have have an fp attribute which returns raw chunks.") - - with self._error_catcher(): - # Don't bother reading the body of a HEAD request. - if self._original_response and is_response_to_head(self._original_response): - self._original_response.close() - return - - # If a response is already read and closed - # then return immediately. - if self._fp.fp is None: - return - - while True: - self._update_chunk_length() - if self.chunk_left == 0: - break - chunk = self._handle_chunk(amt) - decoded = self._decode(chunk, decode_content=decode_content, - flush_decoder=False) - if decoded: - yield decoded - - if decode_content: - # On CPython and PyPy, we should never need to flush the - # decoder. However, on Jython we *might* need to, so - # lets defensively do it anyway. - decoded = self._flush_decoder() - if decoded: # Platform-specific: Jython. - yield decoded - - # Chunk content ends with \r\n: discard it. - while True: - line = self._fp.fp.readline() - if not line: - # Some sites may not end with '\r\n'. - break - if line == b'\r\n': - break - - # We read everything; close the "file". - if self._original_response: - self._original_response.close() - - def geturl(self): - """ - Returns the URL that was the source of this response. - If the request that generated this response redirected, this method - will return the final redirect location. - """ - if self.retries is not None and len(self.retries.history): - return self.retries.history[-1].redirect_location - else: - return self._request_url diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__init__.py deleted file mode 100644 index 2f2770b..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__init__.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import absolute_import -# For backwards compatibility, provide imports that used to be here. -from .connection import is_connection_dropped -from .request import make_headers -from .response import is_fp_closed -from .ssl_ import ( - SSLContext, - HAS_SNI, - IS_PYOPENSSL, - IS_SECURETRANSPORT, - assert_fingerprint, - resolve_cert_reqs, - resolve_ssl_version, - ssl_wrap_socket, -) -from .timeout import ( - current_time, - Timeout, -) - -from .retry import Retry -from .url import ( - get_host, - parse_url, - split_first, - Url, -) -from .wait import ( - wait_for_read, - wait_for_write -) - -__all__ = ( - 'HAS_SNI', - 'IS_PYOPENSSL', - 'IS_SECURETRANSPORT', - 'SSLContext', - 'Retry', - 'Timeout', - 'Url', - 'assert_fingerprint', - 'current_time', - 'is_connection_dropped', - 'is_fp_closed', - 'get_host', - 'parse_url', - 'make_headers', - 'resolve_cert_reqs', - 'resolve_ssl_version', - 'split_first', - 'ssl_wrap_socket', - 'wait_for_read', - 'wait_for_write' -) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 138e46d917101638dd4d9c43d1bd95abfca8ec75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1010 zcmZ9K%Wl&^6o&0w>Rg;lbLov1Sdv9zP&XhUL{$}038huiE|>))H=ZO`XY65SoDzx0 zVZ)p746|j`S6~C@xPn&L^5;3{*fan9b1oZ=ngiF5--A!RlH>fu;New(;4M7*8z6Eb zmpj5GuIogFsK^VVNQ(Km#7m+~%K5m=H-tyLe7wOcqDrcwMrxu?>cS_!Xpn|zlBQ^p zmS~f9{+-7+MTc}mmvr;E!h51m`uVuZx5PHt7CU4|?2=uvNA~i3jXx6mWM3SR1BmP7 zapX^(LE{#bIs@0X!YiHf%rF`YnJRPZ-sStTrn59j*v!OfLL-$*$s+i{7vVLdOBO~< zX^i2+xui3mYN%IiZ94sMoF;~SG1hy3G^Nw=sr65%^!(%5`N<fnwgb`h<oI%Oaxpm? zPtVUL7q$~>&6J_@I9V_yRh$^RsTgQmF*?JFVxP6`{!MAk=?WBpINQSDMun2<bau_m zpkV!3rW8vIHL+mUy8xz{0lDP~Gip63*~)?$x=gjPRT(PHXr{QWYsq62p&(zpR2-&i z+=Q4)6(|TJ+x!>asMxSUPgTG%RYhQzC=aoTXe0WFI--Su_Hon(qJ!un$_O9PK=cqz z#1>*3FdjUyHA?51$rPhhVZ+(l{rTk6S`RGBm^S%@wgOhkGyzv}IZ{HC?!^5kI2U)n zJg#g#^bH)l6O9`oWrfb=JF`VF>%j(c#kf&hLU-<UTaVI^b4tHE>M7K7{Q4R!Q^5kY zWQHZF3f}Qp%1JQCml`fYsI6GC3V3`K$hBFf$>Hc_puz2-3}@Hjg6TlUa`@ua==tby zDA!OPvBd(D0dz$Y!K9!N{yz*d6Z3%5IDtc?Be}Mf*CLHF&fZ|BYdi(N;JbJ~tF_C% JyR*?Q{{ezp5N7}Y diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/connection.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/connection.cpython-38.pyc deleted file mode 100644 index d078ac5c27b03e17e42889f4b8791a3d6a201dec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3211 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/queue.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/queue.cpython-38.pyc deleted file mode 100644 index fbf469f42af9e4a117ae65337ad7daf7728dabd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1083 zcmZ`&!EV$r5VhkZo3>k8pnOCQn-qEh386|LxS$HCIFJL@vi5FMyoqZk6<h7C{gC$9 zKj9mE<<uirE->R&s;Cts`NcDn_|3d=K5uTW6R@9u)33iNA-~Y+TL{iREc*sP5J43w zhzJBzbRHA|#eJyQJS;*=WN;jr%)b>EgLgzkBEBFZmf>-H&Wc3PLy`_|;3RTz69A^v zF<bt)rY<^ZWh*C`>Kg-RAC}z(kffl36oH^3xF7|S;gkv{!V6kNE2<(E1Cc;(Al86t z-L1VZr}amFH1c(Zdt9$!*#`g(xujQQNq8X0A-SdpDRUc>S}8ec%DS>H5)vvj5xkoQ zF0@ij9p%@=3?cGokssA_nVTco$f`E^TUBcPDWBrQjAmoVoyzJoSLL@{FPfve+RL8j zwru1`k0;;9Gih^O>e15|*>1Ks(hEpuayG+Y&f!x5hqgw+_j`HUlq&afWqRQvURGtZ zfsObM>Dkt8&za9n{@Xc@eo2?)n4H68%m7@215X2kDaVwoe1j|4#8}KvY<VV8w2pAQ zN9dFH7;%hV>uuN|-z8nrD+;#<)b_kUiQ2k&tTnXTRS<$i^SdR4T(`}`UI7n!1wd*7 z7x~t3e>-a5u&2MeOU!hwQ|kM^&o`6J4xH09+~<STL7KRP^9shyxm)LaUW-=Ye#rSr zJ65ZVLCwq-0?J?>BRoOCJJbWz*~9=?u1x?Eny?{Dn2)Aw24gPiu8u)@-J{OU;E&4Y z^{KQgN!f=l&s^kxf?|iaRcoc_O7u~GYLDNS<A<HRT($BFRkT=6LWgu1#6iOT0iBiT AW&i*H diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/request.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/request.cpython-38.pyc deleted file mode 100644 index b5f0f1215e234cf90830573925220fe0d1f54d8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3264 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 F{s-CUr(^&C diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/response.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/response.cpython-38.pyc deleted file mode 100644 index a6aa06f04c8612edf45c2b52993be2e2f6134f1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2008 zcmZXV&u`>36vyo(Gn1y%?$Q+!TA^YgKpKf=7WD$76{1>-iV&sRc46tEsV8=3(&pFN zPPbFi3+2lH&>p$*XYe=V%BlYXm*v^X&?%cy635Sew%_}F-@I5^@eo{py%`)mhSuNu zWAU=!<14tOelWyvf>L~lF=7_86Dze39n*G_PTD=}Lc7DdzoEk(>oFJJE?Z(AyqDPW zJ{t6I!3!GT`T-rwJSi0q;<U(xy4CAI|MFC+A_$Y1X9_;ob~t5R>`@`(Y_csxE<&tb zw3lwXa6f}vCh)lMDs+u*&`)R|IY{ACPpo64e?OzldWkOF3Y}OB)~ENZeX!aLpSlYp zjuuBKhgnznSIjV+#=cM<f$Q0nho_Rfo^mzif>1Jv&v-_nIN=*fe9B2aKH;Gvu_R%V zOU``H%o`O{&{SJT=3DzZnDVzLs+@#+4c`pgy%@a6=s4j7`WaVTq;baoTRtil78-PF zH<rz+_3D;VA|6B3O(g4X+iyih?fpoTvgwDo+pwoUkmy51|EY%4Jmo_Hr{h^JhTkM{ zQ9K_;`Xx3d6l`$XvtbgChs8`y^K8@qd?;hZHwqe_(g~NtA}%&Q`@(<XZ*CMbF#CKm z(VfEprZR9^iUj6w4oej$L&0T{XOjEHtnSA$h%^y8Zatmm$M8U|WqWuPcP-0uo44IJ zZ?Ov2dyI6TL*IsxGiWGO0U0OOl_l2|Wc%7toeEvy8>};{x|L!3%D!yc4zr;Rv|rkl zC60iv-VKsRm34(K9q{ESS1m>04QvjK!7{3BA(U6)%4VJ4Euh5)TDo)(a5Wj+l9CIx zKunU5sUcmGDLvz4%z+<Sh9Q?SDwAYJ02Kp{W@P(Z2^zwDo`rdt0RWs4uEilqB=VF1 zh6I9GCW_>dnF{Keuh7ExLk3=7=K{dZGqPtAM>g-1+3smX8W~Cr+!+^fG;2s4sae72 zen;e3ix<-9?;ITLeGglQ+#k<93K~l;Nt<Y&pNG6qF{IglTjO_f`1Wr5?E$F(fxxLj zL^>81AM*18#03$UuimcwDVgMo{PN_|uX~I~Fh=gy%M-4Gg3gkhvVkQY01ov^nKjW3 z7*%wzTzfH88>wg(^19c0t(O-LRWBXD!CMhUxk#z19UY6h2mUFj%y64R0%CBj>dttk zxU6ldgwQO4EPHKm%^t)<=oIhh-Spbs8Syob72W?XHP8gjG&qAPiJyQ;z7G%du#daA z`=$#z=vxkUY!}qAiXG60SO@z(P3UTC!)-M25j3FgA>bWXSZR{qtDwT2TKlNN*Y*wQ zLARma{b^$Uzk1iu_NwI4;6^oiM!&$aY*40TXM5}G4Z+Q*CUZM9V+jzUr@ty=17bwB ziefvPKs}pt0|$i~8Rl8mP|+}FzR4&|AS$DK+&ym>KQ>#v)u*f-z52kZdqD~%I%i@{ z_u6p=nJJ5ci-A?U^Ig~7c95=q3ki4xm1sUDP`OFOcQ8ciKOnT!#U6%G>xAqMyxI$b zs8prkK_GOr>$Q0?^ksbRr}-I|!U2PLq^;ha9t<F+jG4R{j|(uET^S<Wr)kd0gnz03 R1*QHQ*QxK@?g#G2{{o1%E%E>W diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/retry.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/retry.cpython-38.pyc deleted file mode 100644 index 92c011a26d985443eebc7c6fefbf05464e5605e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12787 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 K{*^|5#(x8+=nowL diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-38.pyc deleted file mode 100644 index 203bcf311e4f1f1939390f85ade3d32377ffc5fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9642 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 NoAS74Q2tO@{2xp`Kdt}( diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-38.pyc deleted file mode 100644 index c1a1a9e33f9dabe48bb1d42a7470f40d49133582..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8839 zcmdT~OK%(36`lu0QM4@CuHz&?THHEzB%(6u#Bm;M93-_JCx9axwVb8`T5>pZNscv~ zVeSkilNGwKjIP>$&;rRaXjetiKhQ3^F3=6PUF9znZQSqN#|%ZwPSa*n3LIX}+<Wf1 z=kc8fb@%x3s)g5I9@T#O?UyX;@APH%Rl=8d@J_dI39P`5tbx64+cb6}XW(wTa_mN> z?NU$*7NUhgdAn>|eDT2AuJ9#Z3d+26uXNyUS8rIsVo-T#1r<DXw~qzx9jmtV1t?oJ zd%Eg%(j*#XycG_HiO6v4+18Dlw|?;M&DOQ+@4b8X=2mO#gAcFYy1TXcg`?J-+zJOg z8D)1eFXPvRNW^q$ki<!r#G&sK;n|mqFYn-;X1H)`+YYR4C$P6&UfNy=9A4(-t{b>P z>7l*77%T+khw=!D=>vPa%9nzrp!(3l_*if(SjO|^;CQft&*Q;rZ~~tzd^I>3oRV`+ zVEnD%v>cxd931wU>7wS?`|B~wV)_g7leio9M#9U&B(7Jh3@`mGWxf})4rc-HhA|JA zmoksOc%vv|-9+HqFiE0jQ!S&VnUV^-Vu-9`gP8l-l~?K)H<;jFaOL&-#hToQ7WA`h zh}pM6=R+^{dR(k)8dvmZF<0<(n8Yc^d|Fl){F4z+v-Pzb*SFR-*c#nzHX8iCHyB2| z?k9uBT21kGORymq7xW6YzSj@^K1+7F5MjVmmi6T^^OMncI$Le_aR1Hz8%88ov{ct$ zzF5;t={tp-!_@0U5OinEQl4dD++$u8N#=&0@CH2N0=y=y-QG-M-fquw7bh((u_L5U z)3x|%_&>?CI8w1CP9#;@lzf84%!``2lDGOH4w(!(Fe4>vZ57Om18EdSN+}CtoDVF1 zUmlwb#yrc(?S&8u>=H5}VUVuq<SgRdj8w|HA{ofr`8HX`2g9t+K8WdlPKodG7&Q7` z#yUyXhe4YaMwG;$r_RGXfjx)Z54#}`Hkfn(VlXH7A1oqf(>_23Y?|rjJl=2^fwJ~O z@{ViD*`&@%Z~9R)8xL`2DP$5DhudthZj^YLWQ(RA(uY3PtVTE+c=yA>Xu!NdGJ+J6 zu96}oy61()!Szaj1M`#+N#q`6FCgjS<OxehzR$ruyEO=v?Mf#ycFW``4SLX{c~NIc zL5`#}PN6h|Hydmyk`CNs%-XcL7vWoEp5~$qW0ofV4$tbtaZc?m4GjGr?q+@9Tq1f6 zUyU2xFyf8ZE?(-q8eD$!((9MsXxt1tjhxDh(dA2*-)^_+IXRN9It>{hATk7m#$l$c z5HUew<Ku!$4{6V+<Ui6MS=rZ8UWaFUoW~^Nl>4JB+%1e=`cwiql$f7tB+tPucOIqU zLZ7(+zCy3FK5P6_DKn>_&EWq@sfUy&_3?Dg)$0t|0G~x@1h_HldVZDw#VNLW-7Z3- zL@Mdb^R7rSb|j)G>|7#23Z9KboC^^I-rw4~joT_L&fvy-Sg6C`2D>e7el2C!Ht*2n zBqEFq5<oFHWJ!mQ6$?6c=Mb0g1m`E6YoB1Z@C6{N4<gZX_A~@b*hj`@1u0?dN28#y zz<${4v#Yo7G9VU!RDMnOydfeBwt=Jf5bT&3#jy;5a5Bu?!-FspVKxTP@A7D)U{5fB zH(2WMzPF1x#?uHwf%sk!gp}SW^3psB)|JRL2&afSz?K2`(h*>u_@E~sDIF=_Yu<Sd ziN-)0aZMC_z&VgrZbtHxm|5^m(w7@aiOs<<>7E|uf;9S<L5dQbtPp5!0*o|2NYc!# zOVy!Gs6iYSUYJsj!F_LpT#ELX1M@x-J>o4@!I86WC_u3@2E+ki<q8u9rIhMSMtBgX zWnQ%BjniCWG~M@71oW_*2M(5IkmP`*4jB_+s8ql^!fr;m1<*?30L&xyDznV#Ax^z= z(M(V{ECngTo(zK&)4^jhf{o1zP{yCk+bN`$(w?x@K^P<Xmq8Xuij?e(FMZHu<76aQ zFTqqC5snBzMYzOi;Lk=s9vG*LSjL1rqV7@t=0^xgIsbH?4GGN1JOv|*r94lch@IW@ zG9Si#7R*ayo86D4@PnL^-daVbO`j?z^P(}mui~A)ip#$BskM)i<1=U9YT5Fe8#wYC z?%<gnxbmADU~a1vSST7wo6|)dr=}%hX1XAqrnWFW+1mA@FhKERvd(FxW#%rlXtJOJ zZ@SV-Gf!mZS*<iJr9A4&hoXWRVhNYeEpY-L|M*#>pA2|I^kLm`A{y^S;c)oFMwdRs zg&tDi2GqOT03<e4{JvCwqmd%`UKo1*4(f-rF${+nUVgKFv3}{oaE!-w-s{oLMhi;= z5Y>>{Kv;|#+Psh%-~cU(<E_?Dz)DKIS@w$jo1EBER#-Pve48HY7mXM2mePI!gTT%p z#RK~uBz+I^z31Xx>Xy!sRGrPqch9GJVRRm;8;R=*4WxK6szJmh%JPV*7{_k4#4-qr z<8&dxer}6Z8k5-6<s?Sa#TMi(S}h-6Qd(izj$MH*;P267wK#^F<<boOqA}@0p5pfy z?Bf(W6|n-|?K@;4_D&^b`*bFZ#JPRk%^b{f4;=AYRtlU0`++@K&KCCV1KYNKWX0<x zD=TNEuCr4W_iT&)Fwfn`s;+Ye5_(|&*ovKxt;q|ZU)r(7FYtU}_Bp7WBPyWqyQfhg zZfa%k4^RfX+UNcb90+-R4j`1jim(GuCoh)PJLBcLaKY^nZvxH~{8KU~Z;{s<gU|g> zuOaoQB{Y(G^vv>N*BKHyVCJ+aQ~{1DD(M<yOjwKhlmMNlDVcVWgEmzzptd!Pp;AFu z1J-7s187SrYp1jx?DUWU#_BAyR45jt>?1n0Y+^JS;10<@B;>JpG~goiwFDwCK_Uf7 zBp08IfQB;}JMll^B9Zk6Z753=6A>s!KC((Fc-fp>)5b}u5g|G%JP&1A5^?M)wSf99 zV}lXJB0Q5sb=gBa$pUHewxJ?du=6RZnG_!z463K2J$=0(U!DZ-s#-_u18F|!WC{XE zLx!9@sJ>lrt?N?nX@X-H>$OEVx32J}t8<N}X*Ep47|<E}d|DzYOsj>OrVFyzn=Wku zBBbJK?$q_8bh;pqJuQ(b&S8T<-^c3Voo?V_9jn-7=agM?s&>V3>}4BcyZmU`1zzB8 z`OB)iqVG(e&v66f523zK{V?;QaUOLDe1L*B;l{711?71El)eeDgAc;I_@3z!sfrz0 z9`AWRvQaHkd6pR`ecUaj%b;CC6&_*&P@DoV*(tIb@<u~S<!QOQ=}5I+Lxv$+5dQ9Z zO((b}q^H_TeaSF6MAMJFG;OxEG}<}2q;pRt@&KHC|1b{1-7t`jq7EdJ2V$+=)_k?w z%1ClbLu{a|E~BPNcNF_GojLL{(_&F16#^VBH=0c^-7YW-=3SA}JTzvCVp^T1=p-mA zpp%1+){mN)^WGHX^vx%WspiOFFT;M#7K^YD-1-hari)r2b2dAzQaRd^*8WS(OQpH3 zOipPP)QiVYj>xB#B_e7ea>-~6i=+;)<2`@KBK-vRqXAR%gYt+}TXZ<}##E)Cgw8_1 zr|b)%sDs|9$w+-e2{znAkJ03ZF?u6pLtW(R{aj>*nlYe+@mLlhaxEptl#GY4=wuIB zF=bMXG)sn*Kgz!Cp>|QOAnId1@hF8lze-(hk)X+(qgIkSo6AJRGm!7R-WHJb#{Ac$ zvNA5#a@9uuaong)K7CAMq};2tgy8~RA&=Tw5~ng-WfqxpK)I=W0`0kzKQpx7g)XAB zP0D0@L&efyBvfvlySr&(75Z$-dMGt@cAek%`H);Lt!rknhi>sVsf0l>kW(?Dq)!Um zk{gwAQ1u2hAoX=*MMKYEAznnu-gq|ftr;uGa0aRfU?*zUp{4cDU9kee2ud}l%l=3R zc&<#pk5s{N$&N|9e~U#br!52U@i%$KDC5w)Co6^gR4b)2uatY%bClY;-U2z)4Fkb+ zAjTtaNSKCr<^zxcf4=N$C#;E%cE8y^w10aB?{j;;u1OHRLUIOgBs%0S^-U_YhsX~j zl8rLmCsR5yx{cQ;7ombxskdNmbJD!((PN^a?e8$H!<1CTt*MA}r01jj>NLn1m9`9P ze<a;XH>*%EpS-Z8oS}Zy<i`~3Vzu<T=B$EGP?nFZA6J?8zeFRv9c2C+_=LJMs%q$- zb)e$=S*?7jWEs54E2zt`*Ox`T{!PQkgYr|70@Camt;=3Q-V?{qFevYky{i5;C3<-P zBU@72$d0%1#`TyAdqWu^9&2c-X+G=D^5Z+__I6eMXk|zgS~VsI7V?IBlT!RVDX7mS za&42E<_5Y67^MnM!RT`sO<lAgj#T%mwj5Jr{|U2G`NL_oiuCOa-jipIw&&(Prf9Md zsc4F%q&5k!AJd2w38<wpngnJvbJry!5O2|QC?2IAiafdQ)ADEVeY$^uKWQ+E?gRB) z(tSWHX6Ngfm>*Et=6b&Y_7iT*m`>3FD}Do-Hxpz_C{j{nZaUYK=xGo~H><Q<W~_~p zzFZ&F^HKdD*a(5MQ9HvAGKlgb1pY@r?0f}kB<f+*RR<Ai8gjmw=At$%Dxv~DM9+cx zXu46DclmN+G@DUh3ct0gMy%%7uz{*a)o^p?kVjR85|49o_(2rEl7wlWexgFkig?y+ z|6I2`o*LcSs+ra)8f2<fICJpaK|Z32(Kz?fiZb5#O}Nb0!*q!2$jFk*h*&dC&M|CG zA~*#lL@B8!XijBhh39X|%CNSmT$j97^<pR@!+*W|Vx8`-(d8)MUM9;jZu~dQN-3UN zC#!b#k>gapblmE{oCP>F)nSjwwNE>f)5f)D7uQY+%4nz6R%?(1qX@mB>2j+@6}jpZ zQ4=Uge6);Q%oCE=XK8ebE@x=%F<Hq__)P*?7mBm=>_xiZzcJJ~rWKv!jzx{`eUC0h zze$d$=_HdvqAibv;_>~GbD~@+Id=6N-m8_>%CX9Ej7~Z_>0c)1yCeLZL5(d+`=({} z>w;t%tuHvmv|8k1D(5LHr3gCAbP>UgkXM{HEF8t#wDOh`(%Xnlsw1}SE+a@Tm&&CT F_unhJ9ryqM diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/url.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/url.cpython-38.pyc deleted file mode 100644 index 5c63b361354053f3f2ffef7f6b757f89053f930d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5245 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/wait.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__pycache__/wait.cpython-38.pyc deleted file mode 100644 index 93362bf22b1c4700a642d274dfc41d923943d41a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3132 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 D8wIu% diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/connection.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/connection.py deleted file mode 100644 index 5ad70b2..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/connection.py +++ /dev/null @@ -1,134 +0,0 @@ -from __future__ import absolute_import -import socket -from .wait import NoWayToWaitForSocketError, wait_for_read -from ..contrib import _appengine_environ - - -def is_connection_dropped(conn): # Platform-specific - """ - Returns True if the connection is dropped and should be closed. - - :param conn: - :class:`httplib.HTTPConnection` object. - - Note: For platforms like AppEngine, this will always return ``False`` to - let the platform handle connection recycling transparently for us. - """ - sock = getattr(conn, 'sock', False) - if sock is False: # Platform-specific: AppEngine - return False - if sock is None: # Connection already closed (such as by httplib). - return True - try: - # Returns True if readable, which here means it's been dropped - return wait_for_read(sock, timeout=0.0) - except NoWayToWaitForSocketError: # Platform-specific: AppEngine - return False - - -# This function is copied from socket.py in the Python 2.7 standard -# library test suite. Added to its signature is only `socket_options`. -# One additional modification is that we avoid binding to IPv6 servers -# discovered in DNS if the system doesn't have IPv6 functionality. -def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - source_address=None, socket_options=None): - """Connect to *address* and return the socket object. - - Convenience function. Connect to *address* (a 2-tuple ``(host, - port)``) and return the socket object. Passing the optional - *timeout* parameter will set the timeout on the socket instance - before attempting to connect. If no *timeout* is supplied, the - global default timeout setting returned by :func:`getdefaulttimeout` - is used. If *source_address* is set it must be a tuple of (host, port) - for the socket to bind as a source address before making the connection. - An host of '' or port 0 tells the OS to use the default. - """ - - host, port = address - if host.startswith('['): - host = host.strip('[]') - err = None - - # Using the value from allowed_gai_family() in the context of getaddrinfo lets - # us select whether to work with IPv4 DNS records, IPv6 records, or both. - # The original create_connection function always returns all records. - family = allowed_gai_family() - - for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): - af, socktype, proto, canonname, sa = res - sock = None - try: - sock = socket.socket(af, socktype, proto) - - # If provided, set socket level options before connecting. - _set_socket_options(sock, socket_options) - - if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: - sock.settimeout(timeout) - if source_address: - sock.bind(source_address) - sock.connect(sa) - return sock - - except socket.error as e: - err = e - if sock is not None: - sock.close() - sock = None - - if err is not None: - raise err - - raise socket.error("getaddrinfo returns an empty list") - - -def _set_socket_options(sock, options): - if options is None: - return - - for opt in options: - sock.setsockopt(*opt) - - -def allowed_gai_family(): - """This function is designed to work in the context of - getaddrinfo, where family=socket.AF_UNSPEC is the default and - will perform a DNS search for both IPv6 and IPv4 records.""" - - family = socket.AF_INET - if HAS_IPV6: - family = socket.AF_UNSPEC - return family - - -def _has_ipv6(host): - """ Returns True if the system can bind an IPv6 address. """ - sock = None - has_ipv6 = False - - # App Engine doesn't support IPV6 sockets and actually has a quota on the - # number of sockets that can be used, so just early out here instead of - # creating a socket needlessly. - # See https://github.com/urllib3/urllib3/issues/1446 - if _appengine_environ.is_appengine_sandbox(): - return False - - if socket.has_ipv6: - # has_ipv6 returns true if cPython was compiled with IPv6 support. - # It does not tell us if the system has IPv6 support enabled. To - # determine that we must bind to an IPv6 address. - # https://github.com/shazow/urllib3/pull/611 - # https://bugs.python.org/issue658327 - try: - sock = socket.socket(socket.AF_INET6) - sock.bind((host, 0)) - has_ipv6 = True - except Exception: - pass - - if sock: - sock.close() - return has_ipv6 - - -HAS_IPV6 = _has_ipv6('::1') diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/queue.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/queue.py deleted file mode 100644 index d3d379a..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/queue.py +++ /dev/null @@ -1,21 +0,0 @@ -import collections -from ..packages import six -from ..packages.six.moves import queue - -if six.PY2: - # Queue is imported for side effects on MS Windows. See issue #229. - import Queue as _unused_module_Queue # noqa: F401 - - -class LifoQueue(queue.Queue): - def _init(self, _): - self.queue = collections.deque() - - def _qsize(self, len=len): - return len(self.queue) - - def _put(self, item): - self.queue.append(item) - - def _get(self): - return self.queue.pop() diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/request.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/request.py deleted file mode 100644 index 3ddfcd5..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/request.py +++ /dev/null @@ -1,118 +0,0 @@ -from __future__ import absolute_import -from base64 import b64encode - -from ..packages.six import b, integer_types -from ..exceptions import UnrewindableBodyError - -ACCEPT_ENCODING = 'gzip,deflate' -_FAILEDTELL = object() - - -def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, - basic_auth=None, proxy_basic_auth=None, disable_cache=None): - """ - Shortcuts for generating request headers. - - :param keep_alive: - If ``True``, adds 'connection: keep-alive' header. - - :param accept_encoding: - Can be a boolean, list, or string. - ``True`` translates to 'gzip,deflate'. - List will get joined by comma. - String will be used as provided. - - :param user_agent: - String representing the user-agent you want, such as - "python-urllib3/0.6" - - :param basic_auth: - Colon-separated username:password string for 'authorization: basic ...' - auth header. - - :param proxy_basic_auth: - Colon-separated username:password string for 'proxy-authorization: basic ...' - auth header. - - :param disable_cache: - If ``True``, adds 'cache-control: no-cache' header. - - Example:: - - >>> make_headers(keep_alive=True, user_agent="Batman/1.0") - {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} - >>> make_headers(accept_encoding=True) - {'accept-encoding': 'gzip,deflate'} - """ - headers = {} - if accept_encoding: - if isinstance(accept_encoding, str): - pass - elif isinstance(accept_encoding, list): - accept_encoding = ','.join(accept_encoding) - else: - accept_encoding = ACCEPT_ENCODING - headers['accept-encoding'] = accept_encoding - - if user_agent: - headers['user-agent'] = user_agent - - if keep_alive: - headers['connection'] = 'keep-alive' - - if basic_auth: - headers['authorization'] = 'Basic ' + \ - b64encode(b(basic_auth)).decode('utf-8') - - if proxy_basic_auth: - headers['proxy-authorization'] = 'Basic ' + \ - b64encode(b(proxy_basic_auth)).decode('utf-8') - - if disable_cache: - headers['cache-control'] = 'no-cache' - - return headers - - -def set_file_position(body, pos): - """ - If a position is provided, move file to that point. - Otherwise, we'll attempt to record a position for future use. - """ - if pos is not None: - rewind_body(body, pos) - elif getattr(body, 'tell', None) is not None: - try: - pos = body.tell() - except (IOError, OSError): - # This differentiates from None, allowing us to catch - # a failed `tell()` later when trying to rewind the body. - pos = _FAILEDTELL - - return pos - - -def rewind_body(body, body_pos): - """ - Attempt to rewind body to a certain position. - Primarily used for request redirects and retries. - - :param body: - File-like object that supports seek. - - :param int pos: - Position to seek to in file. - """ - body_seek = getattr(body, 'seek', None) - if body_seek is not None and isinstance(body_pos, integer_types): - try: - body_seek(body_pos) - except (IOError, OSError): - raise UnrewindableBodyError("An error occurred when rewinding request " - "body for redirect/retry.") - elif body_pos is _FAILEDTELL: - raise UnrewindableBodyError("Unable to record file position for rewinding " - "request body during a redirect/retry.") - else: - raise ValueError("body_pos must be of type integer, " - "instead it was %s." % type(body_pos)) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/response.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/response.py deleted file mode 100644 index 3d54864..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/response.py +++ /dev/null @@ -1,87 +0,0 @@ -from __future__ import absolute_import -from ..packages.six.moves import http_client as httplib - -from ..exceptions import HeaderParsingError - - -def is_fp_closed(obj): - """ - Checks whether a given file-like object is closed. - - :param obj: - The file-like object to check. - """ - - try: - # Check `isclosed()` first, in case Python3 doesn't set `closed`. - # GH Issue #928 - return obj.isclosed() - except AttributeError: - pass - - try: - # Check via the official file-like-object way. - return obj.closed - except AttributeError: - pass - - try: - # Check if the object is a container for another file-like object that - # gets released on exhaustion (e.g. HTTPResponse). - return obj.fp is None - except AttributeError: - pass - - raise ValueError("Unable to determine whether fp is closed.") - - -def assert_header_parsing(headers): - """ - Asserts whether all headers have been successfully parsed. - Extracts encountered errors from the result of parsing headers. - - Only works on Python 3. - - :param headers: Headers to verify. - :type headers: `httplib.HTTPMessage`. - - :raises urllib3.exceptions.HeaderParsingError: - If parsing errors are found. - """ - - # This will fail silently if we pass in the wrong kind of parameter. - # To make debugging easier add an explicit check. - if not isinstance(headers, httplib.HTTPMessage): - raise TypeError('expected httplib.Message, got {0}.'.format( - type(headers))) - - defects = getattr(headers, 'defects', None) - get_payload = getattr(headers, 'get_payload', None) - - unparsed_data = None - if get_payload: - # get_payload is actually email.message.Message.get_payload; - # we're only interested in the result if it's not a multipart message - if not headers.is_multipart(): - payload = get_payload() - - if isinstance(payload, (bytes, str)): - unparsed_data = payload - - if defects or unparsed_data: - raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) - - -def is_response_to_head(response): - """ - Checks whether the request of a response has been a HEAD-request. - Handles the quirks of AppEngine. - - :param conn: - :type conn: :class:`httplib.HTTPResponse` - """ - # FIXME: Can we do this somehow without accessing private httplib _method? - method = response._method - if isinstance(method, int): # Platform-specific: Appengine - return method == 3 - return method.upper() == 'HEAD' diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/retry.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/retry.py deleted file mode 100644 index e7d0abd..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/retry.py +++ /dev/null @@ -1,411 +0,0 @@ -from __future__ import absolute_import -import time -import logging -from collections import namedtuple -from itertools import takewhile -import email -import re - -from ..exceptions import ( - ConnectTimeoutError, - MaxRetryError, - ProtocolError, - ReadTimeoutError, - ResponseError, - InvalidHeader, -) -from ..packages import six - - -log = logging.getLogger(__name__) - - -# Data structure for representing the metadata of requests that result in a retry. -RequestHistory = namedtuple('RequestHistory', ["method", "url", "error", - "status", "redirect_location"]) - - -class Retry(object): - """ Retry configuration. - - Each retry attempt will create a new Retry object with updated values, so - they can be safely reused. - - Retries can be defined as a default for a pool:: - - retries = Retry(connect=5, read=2, redirect=5) - http = PoolManager(retries=retries) - response = http.request('GET', 'http://example.com/') - - Or per-request (which overrides the default for the pool):: - - response = http.request('GET', 'http://example.com/', retries=Retry(10)) - - Retries can be disabled by passing ``False``:: - - response = http.request('GET', 'http://example.com/', retries=False) - - Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless - retries are disabled, in which case the causing exception will be raised. - - :param int total: - Total number of retries to allow. Takes precedence over other counts. - - Set to ``None`` to remove this constraint and fall back on other - counts. It's a good idea to set this to some sensibly-high value to - account for unexpected edge cases and avoid infinite retry loops. - - Set to ``0`` to fail on the first retry. - - Set to ``False`` to disable and imply ``raise_on_redirect=False``. - - :param int connect: - How many connection-related errors to retry on. - - These are errors raised before the request is sent to the remote server, - which we assume has not triggered the server to process the request. - - Set to ``0`` to fail on the first retry of this type. - - :param int read: - How many times to retry on read errors. - - These errors are raised after the request was sent to the server, so the - request may have side-effects. - - Set to ``0`` to fail on the first retry of this type. - - :param int redirect: - How many redirects to perform. Limit this to avoid infinite redirect - loops. - - A redirect is a HTTP response with a status code 301, 302, 303, 307 or - 308. - - Set to ``0`` to fail on the first retry of this type. - - Set to ``False`` to disable and imply ``raise_on_redirect=False``. - - :param int status: - How many times to retry on bad status codes. - - These are retries made on responses, where status code matches - ``status_forcelist``. - - Set to ``0`` to fail on the first retry of this type. - - :param iterable method_whitelist: - Set of uppercased HTTP method verbs that we should retry on. - - By default, we only retry on methods which are considered to be - idempotent (multiple requests with the same parameters end with the - same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`. - - Set to a ``False`` value to retry on any verb. - - :param iterable status_forcelist: - A set of integer HTTP status codes that we should force a retry on. - A retry is initiated if the request method is in ``method_whitelist`` - and the response status code is in ``status_forcelist``. - - By default, this is disabled with ``None``. - - :param float backoff_factor: - A backoff factor to apply between attempts after the second try - (most errors are resolved immediately by a second try without a - delay). urllib3 will sleep for:: - - {backoff factor} * (2 ** ({number of total retries} - 1)) - - seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep - for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer - than :attr:`Retry.BACKOFF_MAX`. - - By default, backoff is disabled (set to 0). - - :param bool raise_on_redirect: Whether, if the number of redirects is - exhausted, to raise a MaxRetryError, or to return a response with a - response code in the 3xx range. - - :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: - whether we should raise an exception, or return a response, - if status falls in ``status_forcelist`` range and retries have - been exhausted. - - :param tuple history: The history of the request encountered during - each call to :meth:`~Retry.increment`. The list is in the order - the requests occurred. Each list item is of class :class:`RequestHistory`. - - :param bool respect_retry_after_header: - Whether to respect Retry-After header on status codes defined as - :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. - - :param iterable remove_headers_on_redirect: - Sequence of headers to remove from the request when a response - indicating a redirect is returned before firing off the redirected - request. - """ - - DEFAULT_METHOD_WHITELIST = frozenset([ - 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) - - RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) - - DEFAULT_REDIRECT_HEADERS_BLACKLIST = frozenset(['Authorization']) - - #: Maximum backoff time. - BACKOFF_MAX = 120 - - def __init__(self, total=10, connect=None, read=None, redirect=None, status=None, - method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, - backoff_factor=0, raise_on_redirect=True, raise_on_status=True, - history=None, respect_retry_after_header=True, - remove_headers_on_redirect=DEFAULT_REDIRECT_HEADERS_BLACKLIST): - - self.total = total - self.connect = connect - self.read = read - self.status = status - - if redirect is False or total is False: - redirect = 0 - raise_on_redirect = False - - self.redirect = redirect - self.status_forcelist = status_forcelist or set() - self.method_whitelist = method_whitelist - self.backoff_factor = backoff_factor - self.raise_on_redirect = raise_on_redirect - self.raise_on_status = raise_on_status - self.history = history or tuple() - self.respect_retry_after_header = respect_retry_after_header - self.remove_headers_on_redirect = remove_headers_on_redirect - - def new(self, **kw): - params = dict( - total=self.total, - connect=self.connect, read=self.read, redirect=self.redirect, status=self.status, - method_whitelist=self.method_whitelist, - status_forcelist=self.status_forcelist, - backoff_factor=self.backoff_factor, - raise_on_redirect=self.raise_on_redirect, - raise_on_status=self.raise_on_status, - history=self.history, - remove_headers_on_redirect=self.remove_headers_on_redirect - ) - params.update(kw) - return type(self)(**params) - - @classmethod - def from_int(cls, retries, redirect=True, default=None): - """ Backwards-compatibility for the old retries format.""" - if retries is None: - retries = default if default is not None else cls.DEFAULT - - if isinstance(retries, Retry): - return retries - - redirect = bool(redirect) and None - new_retries = cls(retries, redirect=redirect) - log.debug("Converted retries value: %r -> %r", retries, new_retries) - return new_retries - - def get_backoff_time(self): - """ Formula for computing the current backoff - - :rtype: float - """ - # We want to consider only the last consecutive errors sequence (Ignore redirects). - consecutive_errors_len = len(list(takewhile(lambda x: x.redirect_location is None, - reversed(self.history)))) - if consecutive_errors_len <= 1: - return 0 - - backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) - return min(self.BACKOFF_MAX, backoff_value) - - def parse_retry_after(self, retry_after): - # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 - if re.match(r"^\s*[0-9]+\s*$", retry_after): - seconds = int(retry_after) - else: - retry_date_tuple = email.utils.parsedate(retry_after) - if retry_date_tuple is None: - raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) - retry_date = time.mktime(retry_date_tuple) - seconds = retry_date - time.time() - - if seconds < 0: - seconds = 0 - - return seconds - - def get_retry_after(self, response): - """ Get the value of Retry-After in seconds. """ - - retry_after = response.getheader("Retry-After") - - if retry_after is None: - return None - - return self.parse_retry_after(retry_after) - - def sleep_for_retry(self, response=None): - retry_after = self.get_retry_after(response) - if retry_after: - time.sleep(retry_after) - return True - - return False - - def _sleep_backoff(self): - backoff = self.get_backoff_time() - if backoff <= 0: - return - time.sleep(backoff) - - def sleep(self, response=None): - """ Sleep between retry attempts. - - This method will respect a server's ``Retry-After`` response header - and sleep the duration of the time requested. If that is not present, it - will use an exponential backoff. By default, the backoff factor is 0 and - this method will return immediately. - """ - - if response: - slept = self.sleep_for_retry(response) - if slept: - return - - self._sleep_backoff() - - def _is_connection_error(self, err): - """ Errors when we're fairly sure that the server did not receive the - request, so it should be safe to retry. - """ - return isinstance(err, ConnectTimeoutError) - - def _is_read_error(self, err): - """ Errors that occur after the request has been started, so we should - assume that the server began processing it. - """ - return isinstance(err, (ReadTimeoutError, ProtocolError)) - - def _is_method_retryable(self, method): - """ Checks if a given HTTP method should be retried upon, depending if - it is included on the method whitelist. - """ - if self.method_whitelist and method.upper() not in self.method_whitelist: - return False - - return True - - def is_retry(self, method, status_code, has_retry_after=False): - """ Is this method/status code retryable? (Based on whitelists and control - variables such as the number of total retries to allow, whether to - respect the Retry-After header, whether this header is present, and - whether the returned status code is on the list of status codes to - be retried upon on the presence of the aforementioned header) - """ - if not self._is_method_retryable(method): - return False - - if self.status_forcelist and status_code in self.status_forcelist: - return True - - return (self.total and self.respect_retry_after_header and - has_retry_after and (status_code in self.RETRY_AFTER_STATUS_CODES)) - - def is_exhausted(self): - """ Are we out of retries? """ - retry_counts = (self.total, self.connect, self.read, self.redirect, self.status) - retry_counts = list(filter(None, retry_counts)) - if not retry_counts: - return False - - return min(retry_counts) < 0 - - def increment(self, method=None, url=None, response=None, error=None, - _pool=None, _stacktrace=None): - """ Return a new Retry object with incremented retry counters. - - :param response: A response object, or None, if the server did not - return a response. - :type response: :class:`~urllib3.response.HTTPResponse` - :param Exception error: An error encountered during the request, or - None if the response was received successfully. - - :return: A new ``Retry`` object. - """ - if self.total is False and error: - # Disabled, indicate to re-raise the error. - raise six.reraise(type(error), error, _stacktrace) - - total = self.total - if total is not None: - total -= 1 - - connect = self.connect - read = self.read - redirect = self.redirect - status_count = self.status - cause = 'unknown' - status = None - redirect_location = None - - if error and self._is_connection_error(error): - # Connect retry? - if connect is False: - raise six.reraise(type(error), error, _stacktrace) - elif connect is not None: - connect -= 1 - - elif error and self._is_read_error(error): - # Read retry? - if read is False or not self._is_method_retryable(method): - raise six.reraise(type(error), error, _stacktrace) - elif read is not None: - read -= 1 - - elif response and response.get_redirect_location(): - # Redirect retry? - if redirect is not None: - redirect -= 1 - cause = 'too many redirects' - redirect_location = response.get_redirect_location() - status = response.status - - else: - # Incrementing because of a server error like a 500 in - # status_forcelist and a the given method is in the whitelist - cause = ResponseError.GENERIC_ERROR - if response and response.status: - if status_count is not None: - status_count -= 1 - cause = ResponseError.SPECIFIC_ERROR.format( - status_code=response.status) - status = response.status - - history = self.history + (RequestHistory(method, url, error, status, redirect_location),) - - new_retry = self.new( - total=total, - connect=connect, read=read, redirect=redirect, status=status_count, - history=history) - - if new_retry.is_exhausted(): - raise MaxRetryError(_pool, url, error or ResponseError(cause)) - - log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) - - return new_retry - - def __repr__(self): - return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' - 'read={self.read}, redirect={self.redirect}, status={self.status})').format( - cls=type(self), self=self) - - -# For backwards compatibility (equivalent to pre-v1.9): -Retry.DEFAULT = Retry(3) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/ssl_.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/ssl_.py deleted file mode 100644 index dfc553f..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/ssl_.py +++ /dev/null @@ -1,381 +0,0 @@ -from __future__ import absolute_import -import errno -import warnings -import hmac -import socket - -from binascii import hexlify, unhexlify -from hashlib import md5, sha1, sha256 - -from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning -from ..packages import six - - -SSLContext = None -HAS_SNI = False -IS_PYOPENSSL = False -IS_SECURETRANSPORT = False - -# Maps the length of a digest to a possible hash function producing this digest -HASHFUNC_MAP = { - 32: md5, - 40: sha1, - 64: sha256, -} - - -def _const_compare_digest_backport(a, b): - """ - Compare two digests of equal length in constant time. - - The digests must be of type str/bytes. - Returns True if the digests match, and False otherwise. - """ - result = abs(len(a) - len(b)) - for l, r in zip(bytearray(a), bytearray(b)): - result |= l ^ r - return result == 0 - - -_const_compare_digest = getattr(hmac, 'compare_digest', - _const_compare_digest_backport) - - -try: # Test for SSL features - import ssl - from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 - from ssl import HAS_SNI # Has SNI? -except ImportError: - pass - - -try: - from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION -except ImportError: - OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 - OP_NO_COMPRESSION = 0x20000 - - -# Python 2.7 doesn't have inet_pton on non-Linux so we fallback on inet_aton in -# those cases. This means that we can only detect IPv4 addresses in this case. -if hasattr(socket, 'inet_pton'): - inet_pton = socket.inet_pton -else: - # Maybe we can use ipaddress if the user has urllib3[secure]? - try: - from pip._vendor import ipaddress - - def inet_pton(_, host): - if isinstance(host, bytes): - host = host.decode('ascii') - return ipaddress.ip_address(host) - - except ImportError: # Platform-specific: Non-Linux - def inet_pton(_, host): - return socket.inet_aton(host) - - -# A secure default. -# Sources for more information on TLS ciphers: -# -# - https://wiki.mozilla.org/Security/Server_Side_TLS -# - https://www.ssllabs.com/projects/best-practices/index.html -# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ -# -# The general intent is: -# - Prefer TLS 1.3 cipher suites -# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), -# - prefer ECDHE over DHE for better performance, -# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and -# security, -# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, -# - disable NULL authentication, MD5 MACs and DSS for security reasons. -DEFAULT_CIPHERS = ':'.join([ - 'TLS13-AES-256-GCM-SHA384', - 'TLS13-CHACHA20-POLY1305-SHA256', - 'TLS13-AES-128-GCM-SHA256', - 'ECDH+AESGCM', - 'ECDH+CHACHA20', - 'DH+AESGCM', - 'DH+CHACHA20', - 'ECDH+AES256', - 'DH+AES256', - 'ECDH+AES128', - 'DH+AES', - 'RSA+AESGCM', - 'RSA+AES', - '!aNULL', - '!eNULL', - '!MD5', -]) - -try: - from ssl import SSLContext # Modern SSL? -except ImportError: - import sys - - class SSLContext(object): # Platform-specific: Python 2 - def __init__(self, protocol_version): - self.protocol = protocol_version - # Use default values from a real SSLContext - self.check_hostname = False - self.verify_mode = ssl.CERT_NONE - self.ca_certs = None - self.options = 0 - self.certfile = None - self.keyfile = None - self.ciphers = None - - def load_cert_chain(self, certfile, keyfile): - self.certfile = certfile - self.keyfile = keyfile - - def load_verify_locations(self, cafile=None, capath=None): - self.ca_certs = cafile - - if capath is not None: - raise SSLError("CA directories not supported in older Pythons") - - def set_ciphers(self, cipher_suite): - self.ciphers = cipher_suite - - def wrap_socket(self, socket, server_hostname=None, server_side=False): - warnings.warn( - 'A true SSLContext object is not available. This prevents ' - 'urllib3 from configuring SSL appropriately and may cause ' - 'certain SSL connections to fail. You can upgrade to a newer ' - 'version of Python to solve this. For more information, see ' - 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' - '#ssl-warnings', - InsecurePlatformWarning - ) - kwargs = { - 'keyfile': self.keyfile, - 'certfile': self.certfile, - 'ca_certs': self.ca_certs, - 'cert_reqs': self.verify_mode, - 'ssl_version': self.protocol, - 'server_side': server_side, - } - return wrap_socket(socket, ciphers=self.ciphers, **kwargs) - - -def assert_fingerprint(cert, fingerprint): - """ - Checks if given fingerprint matches the supplied certificate. - - :param cert: - Certificate as bytes object. - :param fingerprint: - Fingerprint as string of hexdigits, can be interspersed by colons. - """ - - fingerprint = fingerprint.replace(':', '').lower() - digest_length = len(fingerprint) - hashfunc = HASHFUNC_MAP.get(digest_length) - if not hashfunc: - raise SSLError( - 'Fingerprint of invalid length: {0}'.format(fingerprint)) - - # We need encode() here for py32; works on py2 and p33. - fingerprint_bytes = unhexlify(fingerprint.encode()) - - cert_digest = hashfunc(cert).digest() - - if not _const_compare_digest(cert_digest, fingerprint_bytes): - raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' - .format(fingerprint, hexlify(cert_digest))) - - -def resolve_cert_reqs(candidate): - """ - Resolves the argument to a numeric constant, which can be passed to - the wrap_socket function/method from the ssl module. - Defaults to :data:`ssl.CERT_NONE`. - If given a string it is assumed to be the name of the constant in the - :mod:`ssl` module or its abbreviation. - (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. - If it's neither `None` nor a string we assume it is already the numeric - constant which can directly be passed to wrap_socket. - """ - if candidate is None: - return CERT_NONE - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, 'CERT_' + candidate) - return res - - return candidate - - -def resolve_ssl_version(candidate): - """ - like resolve_cert_reqs - """ - if candidate is None: - return PROTOCOL_SSLv23 - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, 'PROTOCOL_' + candidate) - return res - - return candidate - - -def create_urllib3_context(ssl_version=None, cert_reqs=None, - options=None, ciphers=None): - """All arguments have the same meaning as ``ssl_wrap_socket``. - - By default, this function does a lot of the same work that - ``ssl.create_default_context`` does on Python 3.4+. It: - - - Disables SSLv2, SSLv3, and compression - - Sets a restricted set of server ciphers - - If you wish to enable SSLv3, you can do:: - - from pip._vendor.urllib3.util import ssl_ - context = ssl_.create_urllib3_context() - context.options &= ~ssl_.OP_NO_SSLv3 - - You can do the same to enable compression (substituting ``COMPRESSION`` - for ``SSLv3`` in the last line above). - - :param ssl_version: - The desired protocol version to use. This will default to - PROTOCOL_SSLv23 which will negotiate the highest protocol that both - the server and your installation of OpenSSL support. - :param cert_reqs: - Whether to require the certificate verification. This defaults to - ``ssl.CERT_REQUIRED``. - :param options: - Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, - ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. - :param ciphers: - Which cipher suites to allow the server to select. - :returns: - Constructed SSLContext object with specified options - :rtype: SSLContext - """ - context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) - - context.set_ciphers(ciphers or DEFAULT_CIPHERS) - - # Setting the default here, as we may have no ssl module on import - cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs - - if options is None: - options = 0 - # SSLv2 is easily broken and is considered harmful and dangerous - options |= OP_NO_SSLv2 - # SSLv3 has several problems and is now dangerous - options |= OP_NO_SSLv3 - # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ - # (issue #309) - options |= OP_NO_COMPRESSION - - context.options |= options - - context.verify_mode = cert_reqs - if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 - # We do our own verification, including fingerprints and alternative - # hostnames. So disable it here - context.check_hostname = False - return context - - -def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, - ca_certs=None, server_hostname=None, - ssl_version=None, ciphers=None, ssl_context=None, - ca_cert_dir=None): - """ - All arguments except for server_hostname, ssl_context, and ca_cert_dir have - the same meaning as they do when using :func:`ssl.wrap_socket`. - - :param server_hostname: - When SNI is supported, the expected hostname of the certificate - :param ssl_context: - A pre-made :class:`SSLContext` object. If none is provided, one will - be created using :func:`create_urllib3_context`. - :param ciphers: - A string of ciphers we wish the client to support. - :param ca_cert_dir: - A directory containing CA certificates in multiple separate files, as - supported by OpenSSL's -CApath flag or the capath argument to - SSLContext.load_verify_locations(). - """ - context = ssl_context - if context is None: - # Note: This branch of code and all the variables in it are no longer - # used by urllib3 itself. We should consider deprecating and removing - # this code. - context = create_urllib3_context(ssl_version, cert_reqs, - ciphers=ciphers) - - if ca_certs or ca_cert_dir: - try: - context.load_verify_locations(ca_certs, ca_cert_dir) - except IOError as e: # Platform-specific: Python 2.7 - raise SSLError(e) - # Py33 raises FileNotFoundError which subclasses OSError - # These are not equivalent unless we check the errno attribute - except OSError as e: # Platform-specific: Python 3.3 and beyond - if e.errno == errno.ENOENT: - raise SSLError(e) - raise - elif getattr(context, 'load_default_certs', None) is not None: - # try to load OS default certs; works well on Windows (require Python3.4+) - context.load_default_certs() - - if certfile: - context.load_cert_chain(certfile, keyfile) - - # If we detect server_hostname is an IP address then the SNI - # extension should not be used according to RFC3546 Section 3.1 - # We shouldn't warn the user if SNI isn't available but we would - # not be using SNI anyways due to IP address for server_hostname. - if ((server_hostname is not None and not is_ipaddress(server_hostname)) - or IS_SECURETRANSPORT): - if HAS_SNI and server_hostname is not None: - return context.wrap_socket(sock, server_hostname=server_hostname) - - warnings.warn( - 'An HTTPS request has been made, but the SNI (Server Name ' - 'Indication) extension to TLS is not available on this platform. ' - 'This may cause the server to present an incorrect TLS ' - 'certificate, which can cause validation failures. You can upgrade to ' - 'a newer version of Python to solve this. For more information, see ' - 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' - '#ssl-warnings', - SNIMissingWarning - ) - - return context.wrap_socket(sock) - - -def is_ipaddress(hostname): - """Detects whether the hostname given is an IP address. - - :param str hostname: Hostname to examine. - :return: True if the hostname is an IP address, False otherwise. - """ - if six.PY3 and isinstance(hostname, bytes): - # IDN A-label bytes are ASCII compatible. - hostname = hostname.decode('ascii') - - families = [socket.AF_INET] - if hasattr(socket, 'AF_INET6'): - families.append(socket.AF_INET6) - - for af in families: - try: - inet_pton(af, hostname) - except (socket.error, ValueError, OSError): - pass - else: - return True - return False diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/timeout.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/timeout.py deleted file mode 100644 index cec817e..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/timeout.py +++ /dev/null @@ -1,242 +0,0 @@ -from __future__ import absolute_import -# The default socket timeout, used by httplib to indicate that no timeout was -# specified by the user -from socket import _GLOBAL_DEFAULT_TIMEOUT -import time - -from ..exceptions import TimeoutStateError - -# A sentinel value to indicate that no timeout was specified by the user in -# urllib3 -_Default = object() - - -# Use time.monotonic if available. -current_time = getattr(time, "monotonic", time.time) - - -class Timeout(object): - """ Timeout configuration. - - Timeouts can be defined as a default for a pool:: - - timeout = Timeout(connect=2.0, read=7.0) - http = PoolManager(timeout=timeout) - response = http.request('GET', 'http://example.com/') - - Or per-request (which overrides the default for the pool):: - - response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) - - Timeouts can be disabled by setting all the parameters to ``None``:: - - no_timeout = Timeout(connect=None, read=None) - response = http.request('GET', 'http://example.com/, timeout=no_timeout) - - - :param total: - This combines the connect and read timeouts into one; the read timeout - will be set to the time leftover from the connect attempt. In the - event that both a connect timeout and a total are specified, or a read - timeout and a total are specified, the shorter timeout will be applied. - - Defaults to None. - - :type total: integer, float, or None - - :param connect: - The maximum amount of time to wait for a connection attempt to a server - to succeed. Omitting the parameter will default the connect timeout to - the system default, probably `the global default timeout in socket.py - <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. - None will set an infinite timeout for connection attempts. - - :type connect: integer, float, or None - - :param read: - The maximum amount of time to wait between consecutive - read operations for a response from the server. Omitting - the parameter will default the read timeout to the system - default, probably `the global default timeout in socket.py - <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. - None will set an infinite timeout. - - :type read: integer, float, or None - - .. note:: - - Many factors can affect the total amount of time for urllib3 to return - an HTTP response. - - For example, Python's DNS resolver does not obey the timeout specified - on the socket. Other factors that can affect total request time include - high CPU load, high swap, the program running at a low priority level, - or other behaviors. - - In addition, the read and total timeouts only measure the time between - read operations on the socket connecting the client and the server, - not the total amount of time for the request to return a complete - response. For most requests, the timeout is raised because the server - has not sent the first byte in the specified time. This is not always - the case; if a server streams one byte every fifteen seconds, a timeout - of 20 seconds will not trigger, even though the request will take - several minutes to complete. - - If your goal is to cut off any request after a set amount of wall clock - time, consider having a second "watcher" thread to cut off a slow - request. - """ - - #: A sentinel object representing the default timeout value - DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT - - def __init__(self, total=None, connect=_Default, read=_Default): - self._connect = self._validate_timeout(connect, 'connect') - self._read = self._validate_timeout(read, 'read') - self.total = self._validate_timeout(total, 'total') - self._start_connect = None - - def __str__(self): - return '%s(connect=%r, read=%r, total=%r)' % ( - type(self).__name__, self._connect, self._read, self.total) - - @classmethod - def _validate_timeout(cls, value, name): - """ Check that a timeout attribute is valid. - - :param value: The timeout value to validate - :param name: The name of the timeout attribute to validate. This is - used to specify in error messages. - :return: The validated and casted version of the given value. - :raises ValueError: If it is a numeric value less than or equal to - zero, or the type is not an integer, float, or None. - """ - if value is _Default: - return cls.DEFAULT_TIMEOUT - - if value is None or value is cls.DEFAULT_TIMEOUT: - return value - - if isinstance(value, bool): - raise ValueError("Timeout cannot be a boolean value. It must " - "be an int, float or None.") - try: - float(value) - except (TypeError, ValueError): - raise ValueError("Timeout value %s was %s, but it must be an " - "int, float or None." % (name, value)) - - try: - if value <= 0: - raise ValueError("Attempted to set %s timeout to %s, but the " - "timeout cannot be set to a value less " - "than or equal to 0." % (name, value)) - except TypeError: # Python 3 - raise ValueError("Timeout value %s was %s, but it must be an " - "int, float or None." % (name, value)) - - return value - - @classmethod - def from_float(cls, timeout): - """ Create a new Timeout from a legacy timeout value. - - The timeout value used by httplib.py sets the same timeout on the - connect(), and recv() socket requests. This creates a :class:`Timeout` - object that sets the individual timeouts to the ``timeout`` value - passed to this function. - - :param timeout: The legacy timeout value. - :type timeout: integer, float, sentinel default object, or None - :return: Timeout object - :rtype: :class:`Timeout` - """ - return Timeout(read=timeout, connect=timeout) - - def clone(self): - """ Create a copy of the timeout object - - Timeout properties are stored per-pool but each request needs a fresh - Timeout object to ensure each one has its own start/stop configured. - - :return: a copy of the timeout object - :rtype: :class:`Timeout` - """ - # We can't use copy.deepcopy because that will also create a new object - # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to - # detect the user default. - return Timeout(connect=self._connect, read=self._read, - total=self.total) - - def start_connect(self): - """ Start the timeout clock, used during a connect() attempt - - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to start a timer that has been started already. - """ - if self._start_connect is not None: - raise TimeoutStateError("Timeout timer has already been started.") - self._start_connect = current_time() - return self._start_connect - - def get_connect_duration(self): - """ Gets the time elapsed since the call to :meth:`start_connect`. - - :return: Elapsed time. - :rtype: float - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to get duration for a timer that hasn't been started. - """ - if self._start_connect is None: - raise TimeoutStateError("Can't get connect duration for timer " - "that has not started.") - return current_time() - self._start_connect - - @property - def connect_timeout(self): - """ Get the value to use when setting a connection timeout. - - This will be a positive float or integer, the value None - (never timeout), or the default system timeout. - - :return: Connect timeout. - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - """ - if self.total is None: - return self._connect - - if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: - return self.total - - return min(self._connect, self.total) - - @property - def read_timeout(self): - """ Get the value for the read timeout. - - This assumes some time has elapsed in the connection timeout and - computes the read timeout appropriately. - - If self.total is set, the read timeout is dependent on the amount of - time taken by the connect timeout. If the connection time has not been - established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be - raised. - - :return: Value to use for the read timeout. - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` - has not yet been called on this object. - """ - if (self.total is not None and - self.total is not self.DEFAULT_TIMEOUT and - self._read is not None and - self._read is not self.DEFAULT_TIMEOUT): - # In case the connect timeout has not yet been established. - if self._start_connect is None: - return self._read - return max(0, min(self.total - self.get_connect_duration(), - self._read)) - elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: - return max(0, self.total - self.get_connect_duration()) - else: - return self._read diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/url.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/url.py deleted file mode 100644 index 6b6f996..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/url.py +++ /dev/null @@ -1,230 +0,0 @@ -from __future__ import absolute_import -from collections import namedtuple - -from ..exceptions import LocationParseError - - -url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] - -# We only want to normalize urls with an HTTP(S) scheme. -# urllib3 infers URLs without a scheme (None) to be http. -NORMALIZABLE_SCHEMES = ('http', 'https', None) - - -class Url(namedtuple('Url', url_attrs)): - """ - Datastructure for representing an HTTP URL. Used as a return value for - :func:`parse_url`. Both the scheme and host are normalized as they are - both case-insensitive according to RFC 3986. - """ - __slots__ = () - - def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, - query=None, fragment=None): - if path and not path.startswith('/'): - path = '/' + path - if scheme: - scheme = scheme.lower() - if host and scheme in NORMALIZABLE_SCHEMES: - host = host.lower() - return super(Url, cls).__new__(cls, scheme, auth, host, port, path, - query, fragment) - - @property - def hostname(self): - """For backwards-compatibility with urlparse. We're nice like that.""" - return self.host - - @property - def request_uri(self): - """Absolute path including the query string.""" - uri = self.path or '/' - - if self.query is not None: - uri += '?' + self.query - - return uri - - @property - def netloc(self): - """Network location including host and port""" - if self.port: - return '%s:%d' % (self.host, self.port) - return self.host - - @property - def url(self): - """ - Convert self into a url - - This function should more or less round-trip with :func:`.parse_url`. The - returned url may not be exactly the same as the url inputted to - :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls - with a blank port will have : removed). - - Example: :: - - >>> U = parse_url('http://google.com/mail/') - >>> U.url - 'http://google.com/mail/' - >>> Url('http', 'username:password', 'host.com', 80, - ... '/path', 'query', 'fragment').url - 'http://username:password@host.com:80/path?query#fragment' - """ - scheme, auth, host, port, path, query, fragment = self - url = '' - - # We use "is not None" we want things to happen with empty strings (or 0 port) - if scheme is not None: - url += scheme + '://' - if auth is not None: - url += auth + '@' - if host is not None: - url += host - if port is not None: - url += ':' + str(port) - if path is not None: - url += path - if query is not None: - url += '?' + query - if fragment is not None: - url += '#' + fragment - - return url - - def __str__(self): - return self.url - - -def split_first(s, delims): - """ - Given a string and an iterable of delimiters, split on the first found - delimiter. Return two split parts and the matched delimiter. - - If not found, then the first part is the full input string. - - Example:: - - >>> split_first('foo/bar?baz', '?/=') - ('foo', 'bar?baz', '/') - >>> split_first('foo/bar?baz', '123') - ('foo/bar?baz', '', None) - - Scales linearly with number of delims. Not ideal for large number of delims. - """ - min_idx = None - min_delim = None - for d in delims: - idx = s.find(d) - if idx < 0: - continue - - if min_idx is None or idx < min_idx: - min_idx = idx - min_delim = d - - if min_idx is None or min_idx < 0: - return s, '', None - - return s[:min_idx], s[min_idx + 1:], min_delim - - -def parse_url(url): - """ - Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is - performed to parse incomplete urls. Fields not provided will be None. - - Partly backwards-compatible with :mod:`urlparse`. - - Example:: - - >>> parse_url('http://google.com/mail/') - Url(scheme='http', host='google.com', port=None, path='/mail/', ...) - >>> parse_url('google.com:80') - Url(scheme=None, host='google.com', port=80, path=None, ...) - >>> parse_url('/foo?bar') - Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) - """ - - # While this code has overlap with stdlib's urlparse, it is much - # simplified for our needs and less annoying. - # Additionally, this implementations does silly things to be optimal - # on CPython. - - if not url: - # Empty - return Url() - - scheme = None - auth = None - host = None - port = None - path = None - fragment = None - query = None - - # Scheme - if '://' in url: - scheme, url = url.split('://', 1) - - # Find the earliest Authority Terminator - # (http://tools.ietf.org/html/rfc3986#section-3.2) - url, path_, delim = split_first(url, ['/', '?', '#']) - - if delim: - # Reassemble the path - path = delim + path_ - - # Auth - if '@' in url: - # Last '@' denotes end of auth part - auth, url = url.rsplit('@', 1) - - # IPv6 - if url and url[0] == '[': - host, url = url.split(']', 1) - host += ']' - - # Port - if ':' in url: - _host, port = url.split(':', 1) - - if not host: - host = _host - - if port: - # If given, ports must be integers. No whitespace, no plus or - # minus prefixes, no non-integer digits such as ^2 (superscript). - if not port.isdigit(): - raise LocationParseError(url) - try: - port = int(port) - except ValueError: - raise LocationParseError(url) - else: - # Blank ports are cool, too. (rfc3986#section-3.2.3) - port = None - - elif not host and url: - host = url - - if not path: - return Url(scheme, auth, host, port, path, query, fragment) - - # Fragment - if '#' in path: - path, fragment = path.split('#', 1) - - # Query - if '?' in path: - path, query = path.split('?', 1) - - return Url(scheme, auth, host, port, path, query, fragment) - - -def get_host(url): - """ - Deprecated. Use :func:`parse_url` instead. - """ - p = parse_url(url) - return p.scheme or 'http', p.hostname, p.port diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/wait.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/wait.py deleted file mode 100644 index 4db71ba..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/wait.py +++ /dev/null @@ -1,150 +0,0 @@ -import errno -from functools import partial -import select -import sys -try: - from time import monotonic -except ImportError: - from time import time as monotonic - -__all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"] - - -class NoWayToWaitForSocketError(Exception): - pass - - -# How should we wait on sockets? -# -# There are two types of APIs you can use for waiting on sockets: the fancy -# modern stateful APIs like epoll/kqueue, and the older stateless APIs like -# select/poll. The stateful APIs are more efficient when you have a lots of -# sockets to keep track of, because you can set them up once and then use them -# lots of times. But we only ever want to wait on a single socket at a time -# and don't want to keep track of state, so the stateless APIs are actually -# more efficient. So we want to use select() or poll(). -# -# Now, how do we choose between select() and poll()? On traditional Unixes, -# select() has a strange calling convention that makes it slow, or fail -# altogether, for high-numbered file descriptors. The point of poll() is to fix -# that, so on Unixes, we prefer poll(). -# -# On Windows, there is no poll() (or at least Python doesn't provide a wrapper -# for it), but that's OK, because on Windows, select() doesn't have this -# strange calling convention; plain select() works fine. -# -# So: on Windows we use select(), and everywhere else we use poll(). We also -# fall back to select() in case poll() is somehow broken or missing. - -if sys.version_info >= (3, 5): - # Modern Python, that retries syscalls by default - def _retry_on_intr(fn, timeout): - return fn(timeout) -else: - # Old and broken Pythons. - def _retry_on_intr(fn, timeout): - if timeout is None: - deadline = float("inf") - else: - deadline = monotonic() + timeout - - while True: - try: - return fn(timeout) - # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7 - except (OSError, select.error) as e: - # 'e.args[0]' incantation works for both OSError and select.error - if e.args[0] != errno.EINTR: - raise - else: - timeout = deadline - monotonic() - if timeout < 0: - timeout = 0 - if timeout == float("inf"): - timeout = None - continue - - -def select_wait_for_socket(sock, read=False, write=False, timeout=None): - if not read and not write: - raise RuntimeError("must specify at least one of read=True, write=True") - rcheck = [] - wcheck = [] - if read: - rcheck.append(sock) - if write: - wcheck.append(sock) - # When doing a non-blocking connect, most systems signal success by - # marking the socket writable. Windows, though, signals success by marked - # it as "exceptional". We paper over the difference by checking the write - # sockets for both conditions. (The stdlib selectors module does the same - # thing.) - fn = partial(select.select, rcheck, wcheck, wcheck) - rready, wready, xready = _retry_on_intr(fn, timeout) - return bool(rready or wready or xready) - - -def poll_wait_for_socket(sock, read=False, write=False, timeout=None): - if not read and not write: - raise RuntimeError("must specify at least one of read=True, write=True") - mask = 0 - if read: - mask |= select.POLLIN - if write: - mask |= select.POLLOUT - poll_obj = select.poll() - poll_obj.register(sock, mask) - - # For some reason, poll() takes timeout in milliseconds - def do_poll(t): - if t is not None: - t *= 1000 - return poll_obj.poll(t) - - return bool(_retry_on_intr(do_poll, timeout)) - - -def null_wait_for_socket(*args, **kwargs): - raise NoWayToWaitForSocketError("no select-equivalent available") - - -def _have_working_poll(): - # Apparently some systems have a select.poll that fails as soon as you try - # to use it, either due to strange configuration or broken monkeypatching - # from libraries like eventlet/greenlet. - try: - poll_obj = select.poll() - _retry_on_intr(poll_obj.poll, 0) - except (AttributeError, OSError): - return False - else: - return True - - -def wait_for_socket(*args, **kwargs): - # We delay choosing which implementation to use until the first time we're - # called. We could do it at import time, but then we might make the wrong - # decision if someone goes wild with monkeypatching select.poll after - # we're imported. - global wait_for_socket - if _have_working_poll(): - wait_for_socket = poll_wait_for_socket - elif hasattr(select, "select"): - wait_for_socket = select_wait_for_socket - else: # Platform-specific: Appengine. - wait_for_socket = null_wait_for_socket - return wait_for_socket(*args, **kwargs) - - -def wait_for_read(sock, timeout=None): - """ Waits for reading to be available on a given socket. - Returns True if the socket is readable, or False if the timeout expired. - """ - return wait_for_socket(sock, read=True, timeout=timeout) - - -def wait_for_write(sock, timeout=None): - """ Waits for writing to be available on a given socket. - Returns True if the socket is readable, or False if the timeout expired. - """ - return wait_for_socket(sock, write=True, timeout=timeout) diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/__init__.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/__init__.py deleted file mode 100644 index d21d697..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/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/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index fb5864cbbf148f10662edce417b4513c16520191..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9758 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 diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/__pycache__/labels.cpython-38.pyc b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/__pycache__/labels.cpython-38.pyc deleted file mode 100644 index fc7983769d56a048692f536261e0163d6686a52a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3856 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 AUjP6A diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/labels.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/labels.py deleted file mode 100644 index 29cbf91..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/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/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/mklabels.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/mklabels.py deleted file mode 100644 index 295dc92..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/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/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/tests.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/tests.py deleted file mode 100644 index e12c10d..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/tests.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 -""" - - webencodings.tests - ~~~~~~~~~~~~~~~~~~ - - A basic test suite for Encoding. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -from __future__ import unicode_literals - -from . import (lookup, LABELS, decode, encode, iter_decode, iter_encode, - IncrementalDecoder, IncrementalEncoder, UTF8) - - -def assert_raises(exception, function, *args, **kwargs): - try: - function(*args, **kwargs) - except exception: - return - else: # pragma: no cover - raise AssertionError('Did not raise %s.' % exception) - - -def test_labels(): - assert lookup('utf-8').name == 'utf-8' - assert lookup('Utf-8').name == 'utf-8' - assert lookup('UTF-8').name == 'utf-8' - assert lookup('utf8').name == 'utf-8' - assert lookup('utf8').name == 'utf-8' - assert lookup('utf8 ').name == 'utf-8' - assert lookup(' \r\nutf8\t').name == 'utf-8' - assert lookup('u8') is None # Python label. - assert lookup('utf-8 ') is None # Non-ASCII white space. - - assert lookup('US-ASCII').name == 'windows-1252' - assert lookup('iso-8859-1').name == 'windows-1252' - assert lookup('latin1').name == 'windows-1252' - assert lookup('LATIN1').name == 'windows-1252' - assert lookup('latin-1') is None - assert lookup('LATİN1') is None # ASCII-only case insensitivity. - - -def test_all_labels(): - for label in LABELS: - assert decode(b'', label) == ('', lookup(label)) - assert encode('', label) == b'' - for repeat in [0, 1, 12]: - output, _ = iter_decode([b''] * repeat, label) - assert list(output) == [] - assert list(iter_encode([''] * repeat, label)) == [] - decoder = IncrementalDecoder(label) - assert decoder.decode(b'') == '' - assert decoder.decode(b'', final=True) == '' - encoder = IncrementalEncoder(label) - assert encoder.encode('') == b'' - assert encoder.encode('', final=True) == b'' - # All encoding names are valid labels too: - for name in set(LABELS.values()): - assert lookup(name).name == name - - -def test_invalid_label(): - assert_raises(LookupError, decode, b'\xEF\xBB\xBF\xc3\xa9', 'invalid') - assert_raises(LookupError, encode, 'é', 'invalid') - assert_raises(LookupError, iter_decode, [], 'invalid') - assert_raises(LookupError, iter_encode, [], 'invalid') - assert_raises(LookupError, IncrementalDecoder, 'invalid') - assert_raises(LookupError, IncrementalEncoder, 'invalid') - - -def test_decode(): - assert decode(b'\x80', 'latin1') == ('€', lookup('latin1')) - assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1')) - assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8')) - assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8')) - assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii')) - assert decode(b'\xEF\xBB\xBF\xc3\xa9', 'ascii') == ('é', lookup('utf8')) # UTF-8 with BOM - - assert decode(b'\xFE\xFF\x00\xe9', 'ascii') == ('é', lookup('utf-16be')) # UTF-16-BE with BOM - assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le')) # UTF-16-LE with BOM - assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be')) - assert decode(b'\xFF\xFE\x00\xe9', 'ascii') == ('\ue900', lookup('utf-16le')) - - assert decode(b'\x00\xe9', 'UTF-16BE') == ('é', lookup('utf-16be')) - assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le')) - assert decode(b'\xe9\x00', 'UTF-16') == ('é', lookup('utf-16le')) - - assert decode(b'\xe9\x00', 'UTF-16BE') == ('\ue900', lookup('utf-16be')) - assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le')) - assert decode(b'\x00\xe9', 'UTF-16') == ('\ue900', lookup('utf-16le')) - - -def test_encode(): - assert encode('é', 'latin1') == b'\xe9' - assert encode('é', 'utf8') == b'\xc3\xa9' - assert encode('é', 'utf8') == b'\xc3\xa9' - assert encode('é', 'utf-16') == b'\xe9\x00' - assert encode('é', 'utf-16le') == b'\xe9\x00' - assert encode('é', 'utf-16be') == b'\x00\xe9' - - -def test_iter_decode(): - def iter_decode_to_string(input, fallback_encoding): - output, _encoding = iter_decode(input, fallback_encoding) - return ''.join(output) - assert iter_decode_to_string([], 'latin1') == '' - assert iter_decode_to_string([b''], 'latin1') == '' - assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é' - assert iter_decode_to_string([b'hello'], 'latin1') == 'hello' - assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello' - assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello' - assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é' - assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é' - assert iter_decode_to_string([ - b'\xEF\xBB\xBF', b'\xc3', b'\xa9'], 'latin1') == 'é' - assert iter_decode_to_string([ - b'\xEF\xBB\xBF', b'a', b'\xc3'], 'latin1') == 'a\uFFFD' - assert iter_decode_to_string([ - b'', b'\xEF', b'', b'', b'\xBB\xBF\xc3', b'\xa9'], 'latin1') == 'é' - assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == '' - assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»' - assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é' - assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é' - assert iter_decode_to_string([ - b'', b'\xFF', b'', b'', b'\xFE\xe9', b'\x00'], 'latin1') == 'é' - assert iter_decode_to_string([ - b'', b'h\xe9', b'llo'], 'x-user-defined') == 'h\uF7E9llo' - - -def test_iter_encode(): - assert b''.join(iter_encode([], 'latin1')) == b'' - assert b''.join(iter_encode([''], 'latin1')) == b'' - assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9' - assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9' - assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00' - assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00' - assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9' - assert b''.join(iter_encode([ - '', 'h\uF7E9', '', 'llo'], 'x-user-defined')) == b'h\xe9llo' - - -def test_x_user_defined(): - encoded = b'2,\x0c\x0b\x1aO\xd9#\xcb\x0f\xc9\xbbt\xcf\xa8\xca' - decoded = '2,\x0c\x0b\x1aO\uf7d9#\uf7cb\x0f\uf7c9\uf7bbt\uf7cf\uf7a8\uf7ca' - encoded = b'aa' - decoded = 'aa' - assert decode(encoded, 'x-user-defined') == (decoded, lookup('x-user-defined')) - assert encode(decoded, 'x-user-defined') == encoded diff --git a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/x_user_defined.py b/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/x_user_defined.py deleted file mode 100644 index d16e326..0000000 --- a/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg/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/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/INSTALLER b/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/LICENSE b/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/LICENSE deleted file mode 100644 index 841c602..0000000 --- a/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2018 Kenneth Reitz - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/METADATA b/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/METADATA deleted file mode 100644 index 02f2eca..0000000 --- a/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/METADATA +++ /dev/null @@ -1,145 +0,0 @@ -Metadata-Version: 2.1 -Name: requests -Version: 2.22.0 -Summary: Python HTTP for Humans. -Home-page: http://python-requests.org -Author: Kenneth Reitz -Author-email: me@kennethreitz.org -License: Apache 2.0 -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Natural Language :: English -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* -Description-Content-Type: text/markdown -Requires-Dist: chardet (<3.1.0,>=3.0.2) -Requires-Dist: idna (<2.9,>=2.5) -Requires-Dist: urllib3 (!=1.25.0,!=1.25.1,<1.26,>=1.21.1) -Requires-Dist: certifi (>=2017.4.17) -Provides-Extra: security -Requires-Dist: pyOpenSSL (>=0.14) ; extra == 'security' -Requires-Dist: cryptography (>=1.3.4) ; extra == 'security' -Requires-Dist: idna (>=2.0.0) ; extra == 'security' -Provides-Extra: socks -Requires-Dist: PySocks (!=1.5.7,>=1.5.6) ; extra == 'socks' -Requires-Dist: win-inet-pton ; (sys_platform == "win32" and python_version == "2.7") and extra == 'socks' - -Requests: HTTP for Humans™ -========================== - -[![image](https://img.shields.io/pypi/v/requests.svg)](https://pypi.org/project/requests/) -[![image](https://img.shields.io/pypi/l/requests.svg)](https://pypi.org/project/requests/) -[![image](https://img.shields.io/pypi/pyversions/requests.svg)](https://pypi.org/project/requests/) -[![codecov.io](https://codecov.io/github/requests/requests/coverage.svg?branch=master)](https://codecov.io/github/requests/requests) -[![image](https://img.shields.io/github/contributors/requests/requests.svg)](https://github.com/requests/requests/graphs/contributors) -[![image](https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg)](https://saythanks.io/to/kennethreitz) - -Requests is the only *Non-GMO* HTTP library for Python, safe for human -consumption. - -![image](https://farm5.staticflickr.com/4317/35198386374_1939af3de6_k_d.jpg) - -Behold, the power of Requests: - -``` {.sourceCode .python} ->>> import requests ->>> r = requests.get('https://api.github.com/user', auth=('user', 'pass')) ->>> r.status_code -200 ->>> r.headers['content-type'] -'application/json; charset=utf8' ->>> r.encoding -'utf-8' ->>> r.text -u'{"type":"User"...' ->>> r.json() -{u'disk_usage': 368627, u'private_gists': 484, ...} -``` - -See [the similar code, sans Requests](https://gist.github.com/973705). - -[![image](https://raw.githubusercontent.com/requests/requests/master/docs/_static/requests-logo-small.png)](http://docs.python-requests.org/) - -Requests allows you to send *organic, grass-fed* HTTP/1.1 requests, -without the need for manual labor. There's no need to manually add query -strings to your URLs, or to form-encode your POST data. Keep-alive and -HTTP connection pooling are 100% automatic, thanks to -[urllib3](https://github.com/shazow/urllib3). - -Besides, all the cool kids are doing it. Requests is one of the most -downloaded Python packages of all time, pulling in over 11,000,000 -downloads every month. You don't want to be left out! - -Feature Support ---------------- - -Requests is ready for today's web. - -- International Domains and URLs -- Keep-Alive & Connection Pooling -- Sessions with Cookie Persistence -- Browser-style SSL Verification -- Basic/Digest Authentication -- Elegant Key/Value Cookies -- Automatic Decompression -- Automatic Content Decoding -- Unicode Response Bodies -- Multipart File Uploads -- HTTP(S) Proxy Support -- Connection Timeouts -- Streaming Downloads -- `.netrc` Support -- Chunked Requests - -Requests officially supports Python 2.7 & 3.4–3.7, and runs great on -PyPy. - -Installation ------------- - -To install Requests, simply use [pipenv](http://pipenv.org/) (or pip, of -course): - -``` {.sourceCode .bash} -$ pipenv install requests -✨🍰✨ -``` - -Satisfaction guaranteed. - -Documentation -------------- - -Fantastic documentation is available at -<http://docs.python-requests.org/>, for a limited time only. - -How to Contribute ------------------ - -1. Become more familiar with the project by reading our [Contributor's Guide](http://docs.python-requests.org/en/latest/dev/contributing/) and our [development philosophy](http://docs.python-requests.org/en/latest/dev/philosophy/). -2. Check for open issues or open a fresh issue to start a discussion - around a feature idea or a bug. There is a [Contributor - Friendly](https://github.com/requests/requests/issues?direction=desc&labels=Contributor+Friendly&page=1&sort=updated&state=open) - tag for issues that should be ideal for people who are not very - familiar with the codebase yet. -3. Fork [the repository](https://github.com/requests/requests) on - GitHub to start making your changes to the **master** branch (or - branch off of it). -4. Write a test which shows that the bug was fixed or that the feature - works as expected. -5. Send a pull request and bug the maintainer until it gets merged and - published. :) Make sure to add yourself to - [AUTHORS](https://github.com/requests/requests/blob/master/AUTHORS.rst). - - - diff --git a/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/RECORD b/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/RECORD deleted file mode 100644 index c40d8c3..0000000 --- a/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/RECORD +++ /dev/null @@ -1,42 +0,0 @@ -requests-2.22.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -requests-2.22.0.dist-info/LICENSE,sha256=vkGrrCxA-FMDB-jRcsWQtHb0pIi8amj43le3z2R4Zoc,582 -requests-2.22.0.dist-info/METADATA,sha256=sJ1ZdIgF0uoV9U58VVoEZv1QTyMCpmc2MQnbkob3nsE,5523 -requests-2.22.0.dist-info/RECORD,, -requests-2.22.0.dist-info/WHEEL,sha256=h_aVn5OB2IERUjMbi2pucmR_zzWJtk303YXvhh60NJ8,110 -requests-2.22.0.dist-info/top_level.txt,sha256=fMSVmHfb5rbGOo6xv-O_tUX6j-WyixssE-SnwcDRxNQ,9 -requests/__init__.py,sha256=PnKCgjcTq44LaAMzB-7--B2FdewRrE8F_vjZeaG9NhA,3921 -requests/__pycache__/__init__.cpython-38.pyc,, -requests/__pycache__/__version__.cpython-38.pyc,, -requests/__pycache__/_internal_utils.cpython-38.pyc,, -requests/__pycache__/adapters.cpython-38.pyc,, -requests/__pycache__/api.cpython-38.pyc,, -requests/__pycache__/auth.cpython-38.pyc,, -requests/__pycache__/certs.cpython-38.pyc,, -requests/__pycache__/compat.cpython-38.pyc,, -requests/__pycache__/cookies.cpython-38.pyc,, -requests/__pycache__/exceptions.cpython-38.pyc,, -requests/__pycache__/help.cpython-38.pyc,, -requests/__pycache__/hooks.cpython-38.pyc,, -requests/__pycache__/models.cpython-38.pyc,, -requests/__pycache__/packages.cpython-38.pyc,, -requests/__pycache__/sessions.cpython-38.pyc,, -requests/__pycache__/status_codes.cpython-38.pyc,, -requests/__pycache__/structures.cpython-38.pyc,, -requests/__pycache__/utils.cpython-38.pyc,, -requests/__version__.py,sha256=Bm-GFstQaFezsFlnmEMrJDe8JNROz9n2XXYtODdvjjc,436 -requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 -requests/adapters.py,sha256=WelSM1BCQXdbjEuDsBxqKDADeY8BHmxlrwbNnLN2rr4,21344 -requests/api.py,sha256=fbUo11QoLOoNgWU6FfvNz8vMj9bE_cMmICXBa7TZHJs,6271 -requests/auth.py,sha256=QB2-cSUj1jrvWZfPXttsZpyAacQgtKLVk14vQW9TpSE,10206 -requests/certs.py,sha256=dOB5rV2DZ13dEhq9BUa_4hd5kAqg59e_zUZB00faYz8,453 -requests/compat.py,sha256=FVIeTOniQMHQkeE2JdJvar3OZ-b4IFh8aNezIn45zws,1678 -requests/cookies.py,sha256=Y-bKX6TvW3FnYlE6Au0SXtVVWcaNdFvuAwQxw-G0iTI,18430 -requests/exceptions.py,sha256=Q8YeWWxiHHXhkEynLpMgC_6_r_ZTYw2aITs9wCSAZNY,3185 -requests/help.py,sha256=lLcBtKAar8T6T78e9Tc4Zfd_EEJFhntxgib1JHNctEI,3515 -requests/hooks.py,sha256=QReGyy0bRcr5rkwCuObNakbYsc7EkiKeBwG4qHekr2Q,757 -requests/models.py,sha256=bce6oORR26SY-dVPaqMpdBunD1zXzrgMSlH6jhfvuRA,34210 -requests/packages.py,sha256=Q2rF0L5mc3wQAvc6q_lAVtPTDOaOeFgD-7kWSQLkjEQ,542 -requests/sessions.py,sha256=DjbCotDW6xSAaBsjbW-L8l4N0UcwmrxVNgSrZgIjGWM,29332 -requests/status_codes.py,sha256=XWlcpBjbCtq9sSqpH9_KKxgnLTf9Z__wCWolq21ySlg,4129 -requests/structures.py,sha256=zoP8qly2Jak5e89HwpqjN1z2diztI-_gaqts1raJJBc,2981 -requests/utils.py,sha256=LtPJ1db6mJff2TJSJWKi7rBpzjPS3mSOrjC9zRhoD3A,30049 diff --git a/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/WHEEL b/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/WHEEL deleted file mode 100644 index 78e6f69..0000000 --- a/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.33.4) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/top_level.txt b/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/top_level.txt deleted file mode 100644 index f229360..0000000 --- a/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -requests diff --git a/venv/lib/python3.8/site-packages/requests/__init__.py b/venv/lib/python3.8/site-packages/requests/__init__.py deleted file mode 100644 index 9a899df..0000000 --- a/venv/lib/python3.8/site-packages/requests/__init__.py +++ /dev/null @@ -1,131 +0,0 @@ -# -*- coding: utf-8 -*- - -# __ -# /__) _ _ _ _ _/ _ -# / ( (- (/ (/ (- _) / _) -# / - -""" -Requests HTTP Library -~~~~~~~~~~~~~~~~~~~~~ - -Requests is an HTTP library, written in Python, for human beings. Basic GET -usage: - - >>> import requests - >>> r = requests.get('https://www.python.org') - >>> r.status_code - 200 - >>> 'Python is a programming language' in r.content - True - -... or POST: - - >>> payload = dict(key1='value1', key2='value2') - >>> r = requests.post('https://httpbin.org/post', data=payload) - >>> print(r.text) - { - ... - "form": { - "key2": "value2", - "key1": "value1" - }, - ... - } - -The other HTTP methods are supported - see `requests.api`. Full documentation -is at <http://python-requests.org>. - -:copyright: (c) 2017 by Kenneth Reitz. -:license: Apache 2.0, see LICENSE for more details. -""" - -import urllib3 -import chardet -import warnings -from .exceptions import RequestsDependencyWarning - - -def check_compatibility(urllib3_version, chardet_version): - urllib3_version = urllib3_version.split('.') - assert urllib3_version != ['dev'] # Verify urllib3 isn't installed from git. - - # Sometimes, urllib3 only reports its version as 16.1. - if len(urllib3_version) == 2: - urllib3_version.append('0') - - # Check urllib3 for compatibility. - major, minor, patch = urllib3_version # noqa: F811 - major, minor, patch = int(major), int(minor), int(patch) - # urllib3 >= 1.21.1, <= 1.25 - assert major == 1 - assert minor >= 21 - assert minor <= 25 - - # Check chardet for compatibility. - major, minor, patch = chardet_version.split('.')[:3] - major, minor, patch = int(major), int(minor), int(patch) - # chardet >= 3.0.2, < 3.1.0 - assert major == 3 - assert minor < 1 - assert patch >= 2 - - -def _check_cryptography(cryptography_version): - # cryptography < 1.3.4 - try: - cryptography_version = list(map(int, cryptography_version.split('.'))) - except ValueError: - return - - if cryptography_version < [1, 3, 4]: - warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version) - warnings.warn(warning, RequestsDependencyWarning) - -# Check imported dependencies for compatibility. -try: - check_compatibility(urllib3.__version__, chardet.__version__) -except (AssertionError, ValueError): - warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported " - "version!".format(urllib3.__version__, chardet.__version__), - RequestsDependencyWarning) - -# Attempt to enable urllib3's SNI support, if possible -try: - from urllib3.contrib import pyopenssl - pyopenssl.inject_into_urllib3() - - # Check cryptography version - from cryptography import __version__ as cryptography_version - _check_cryptography(cryptography_version) -except ImportError: - pass - -# urllib3's DependencyWarnings should be silenced. -from urllib3.exceptions import DependencyWarning -warnings.simplefilter('ignore', DependencyWarning) - -from .__version__ import __title__, __description__, __url__, __version__ -from .__version__ import __build__, __author__, __author_email__, __license__ -from .__version__ import __copyright__, __cake__ - -from . import utils -from . import packages -from .models import Request, Response, PreparedRequest -from .api import request, get, head, post, patch, put, delete, options -from .sessions import session, Session -from .status_codes import codes -from .exceptions import ( - RequestException, Timeout, URLRequired, - TooManyRedirects, HTTPError, ConnectionError, - FileModeWarning, ConnectTimeout, ReadTimeout -) - -# Set default logging handler to avoid "No handler found" warnings. -import logging -from logging import NullHandler - -logging.getLogger(__name__).addHandler(NullHandler()) - -# FileModeWarnings go off per the default. -warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index c4e16109fb4d2601baa9ebc29e8a12615287b6ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3334 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 diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/__version__.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/__version__.cpython-38.pyc deleted file mode 100644 index 4c06ad054da17ff90cf1feb40951483ef5c89b7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 504 zcmZ8eO-lnY5KX_gTZ^IxK|BO+1-q*S4=pMcF9ku0)=LhCwMo07`w_F*Lia!T4+Qb1 zHxK@r9`z4+_T+49wK^e>H*a{uOmbDNnh4_Y$i9BfAoQLl%K;i{!;N+U7$S&eNQPxe zmgPu}<w>3uNP!hek(Ee^8N^^^QfB5Qs#T_j;<qu6bd+p%C)y1I-0AhYcn~VwiG3%C ztYpj8TDELk&g%7r!3xzdDK@M|!`c&QCySEm84m)kU3|fXPLd6uw?}hDrNYc$o=B(f zatx+q`!tjjC5EoXjlKOQ{$r0<V41i3C;ahn_kw|(*UV{|QZ2N{DV?rT%6QaQLTV8P zAe1PLl?S9k>6oi%u7cwx79IoLq|}LFMFo8AhjZT%-!4z|c@U+|tCaQ^vq5S=>WrZ9 zj8r<-3_e@7_N6U_tcxJhj_1_}<H@M054gQ}qhGQ#lO-op<IoRT?D6A5`fuw1`ON?G E1?0J%a{vGU diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/_internal_utils.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/_internal_utils.cpython-38.pyc deleted file mode 100644 index 5663c3d0611841a85d13c1682a6f7f914b522cc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1274 zcmZ8h&5qne5bm};KbY)j73IVssv{$jSt)`8qYx#^59B};v59~=;CS3MakF-})7{?1 ztAPXLL6RdEPP_$g;43FyffLp3F@*G}t*Ul){e0i&d3JP^GFopwJNfR5gt0%p^Y)6# zxkKBo=popK2`-|F*U=`b<4s&An}jp*o=C*x72iz6RLown%~Z@!*)qNSEj9SEMeFP; zlggn{d6l(JRyO_Ve=AL&7=11UTJW!>>tNTa!bz<xxH5N;8-#+qwnhPCuBwA=2VWg( zq!*<uN)Xtf5}*~}56)nX6t%+(?}Y}S#HvAK;X~U}cy1|g-Q;eW{>5p?W!z7t&6@6J z|Ngd>m6Iy7&h)W=OmbUDSws{!E{~Ak_h<){9NRO;e~HZTp8Xi94_stm&tAuS{)UsE zlAR3pJ|dL(<sYBRb5xK6Rgmfh=<WAdxR1c#i`<9`tp&XU*EQ(RTx$rEoUF#6Mdfmj z5=EpyD`0iVBNe#_iUQ7YOg^MRRcPUB<%E>LgL6@$!H`B_L1lB(t>9@Xshst|Tey3A z@6jV@RcOlTieRP^=0aLrg^SBcpGqs0b-60gcwmf2tDlCF*iS<>^e7K)_VclsKGv=K zm6<CP|M%?^S2rh(Y;J^PRdr)`-kp8wKEabwQ~w$7h-=k!{jt;8Fu7-sMqPM*d}=mH z`7}!Sl_-sjKP^1%<MQ^LcA#@j#z?1KxaenoNu<7x1yRY_*Gv$B33JI=YCh)7|Gs4+ zK4sr9kr1_$%ir%KiLRCkLGB1QNl5=og;u0Y(zMHI!~?WNnVY<zJ9d=@K-Uc&)Sf+P z50k9lP2@BbB^GBZ__DPQwm1fa3|<zVW~CiG>0C)-xe3oH;q!sAwegx*!&d7mTrd+F z`{~2S%ZZtiW$1r_^^3dKqVZCDV2n0q<`1tv8zy?-<%HqIlK1nm(ZJ;JIP&4g2LLkq zzQTueolXZ%W(yv1;)O4`xk{&xmprtwob|IT6S~N<emZ=oK~ICSd}o2eaObUZo@Wzk W&TrLPv=!d=QnY@aWPUA9kN*KnUunz$ diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/adapters.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/adapters.cpython-38.pyc deleted file mode 100644 index a21ef29d5dfb115a8f6c3795575014fedb37a2d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16865 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 DZF;jX diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/api.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/api.cpython-38.pyc deleted file mode 100644 index ab5a9883e828a3da45629a7c238f090c80bded7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6461 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 diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/auth.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/auth.cpython-38.pyc deleted file mode 100644 index ddf3fbee17fd0344ee66db121e720e9f1e95b7db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8283 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 diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/certs.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/certs.cpython-38.pyc deleted file mode 100644 index 882fc14a2c117e8041e840cd07d6af3008e14399..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 575 zcmY*W!EV$r5OvaBx-#@1MjTLA+Ga0sKmr6ps)ST=fcDZuBR8JxTAPf+*lwE(Lh3K{ z2RQaa_=z0pslUJpCmTdNl1DR7e$VqfCwqHR#Q6DkdG;$2;;wHVMjD&<@wgW;X>lra zqSGp=)6+B&xTAMADL=;vrq|*+Nraw!74vC0j8c;ETR`VsRv>#Pzds5okJrXQZFQ&+ z7=2)J;MWKZV~NbDL1U>x<>BK8=p{^P3gr>b1L+DgI9?+o7$+@NEm%VM{o`hk=<AYg zJv1W~8dYr63NtA`mC)J%Dzdkrp%r`?r(FPMt84+KWl(TrC|rRy&a*iW-dKVGuN6ft zEs-t^TdI-#Vh}A9L9te}!r}2~!I0VVO1SJN-k*cFqvQC3!$xtmRkd=QQ1^yMlkz@( zyO<~4bl`TgJg=3ZJpVkOcDs45ZIS2Q?&y*GZS{9Z)fn+<!-o8=;910n^ylT$*Uhpq t&4D53RaG677wzV?e}&6``}$uDi_4m}o4wgC>fIy?xhFAAo<2)w$zS6>wLbs= diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/compat.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/compat.cpython-38.pyc deleted file mode 100644 index 4a299af3f42649b70df099e99633dce2ba399df4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1609 zcmZuw-Etc>6y86t*Xy;NA185|G;G^YYTDQ(Au})o3^Rp`G84*7=@fLq&e|)-N~G0B zk^}AqkHGK>T=E7y0~b7iZn?@UaK+KC)0&di?5FP>NoT*KJ?BNM6<YB8_UZ74Uwq5@ z+ZfAF0LJI=%D-&O$}D7McIHqU+2!mY2Rmmj^01fL+g9eDJE*qc9&rCvRPL*z;H8!C zdKPY+hXUD_8RbfVg72-|`Od<%Uv04lz8Vc#6E#_cBGy7J)<$jCK^?Y&R@f?9Wou}S zt)unwyidEVi@IzBZLm$W$+plI>!Dt`R;SzS7P__g&JNmv*a6*Tx6$p=*PwfB5ABsa zr0=j8#q18c!|tNH>>j#jTX-M63-5jW9@@tb&;#7Z@8gFP7d<j;;-G{45A1{LKOu6H z4*sXasD3+>YjqJF8g(~j)uNBt2WY2M7SO{b#Ye9dw?T2K629G`A1<qZt$ZKf2larU z)u?|6GiaaK=pb{RTm6++7oorxGc1)Hj5#Y(75@C+Ck(%x5*ag|%_xqiX`WFmW5Nn9 zR9qb)BSMLq$3#kq6pyg_5#v1mX0E0@j}K!w6E2LSL3m|~>+35A@X7_~H+1b{#ue7} zSzeK_oRWghq>dKO%4*C6#rc?LScj)r6@vdnFl;hpo{Z*2Dy8l%TM5oDiQqZIxzd|& z&Mf=;H61|UA{7$i0-NO(uLD2hBrlg`0a<FJAj1=pp7w3sDYqq4rHX_Ssler*aEL;I z1<#cr`RUVVeNP8ZQcBYig(OeXq5!vUpUjl;T-(iOBEte_Uy!lthoS{nBiaT!238E1 zRurCrngQrmOVkal0`zNQ&G3c+)6$}8AOZj}jWOrv1fQj%Z;PJsxnjetZyMM#j$>U< zl8ld&MAygD6x1l~$~oNbB^HwKJR$jnYcBy)`$Q(i{BSWJp-@6eP<$qNuDueQPs<wl zQV0&);npY_-6+1y>IT&}UV+IJ3Z;y8SSEa(8id#WlQK)OZj$Pnt<5o~6pt0imv1Fp zUIS#Pgl>*zgesCJ#;A?v3Tg_fkyM2?N+mRi`Ip)yP(>c)Kx-4qQ>9z^jA22>iJBL1 zss$VHDHaPes+10@a%wNEMayZ=6pq+7IwM1&1<g;A+96zbmXr_D(fD^ud}Pux@Xzs3 zv0_+|;(+8*L2VsOF6ZYTt7AO8?&mk8>e4|m*TE-MAAe>VPksg91%VUPeK&F=$FU>3 kZMS{je&p@~58#dLp6l7w2<_1E?Z>uRt47zURsz`jFR*C9*8l(j diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/cookies.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/cookies.cpython-38.pyc deleted file mode 100644 index 9393f251f31665ee6e28ffa1e6b31721b386f35e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18788 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 diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/exceptions.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/exceptions.cpython-38.pyc deleted file mode 100644 index 713ec0276e68d334ead6640cb5e0ce30df59e9eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5186 zcmbW5U31&G6^5yAS+Q(IcI?D<62$p*Hj&fq?8Robt?eY+q?4o>TWLF*PH9?zEXEY6 z08kuh+`VXaX775{AJAN8`j2?KSN#jUY2O1<GBerLmP-#QzK0<3;NSoU@XKnoV&QoI ztIfZ>p0%v+NhFT~#1>BVkBnt;t7Y*F&w80&ww23RzqNRd=fAahUgY29S_S9=FG3eZ z0Xhp^;$`Tv(M9MPUV*NNBA%C^&+u93S)<F)RXztjXUfk&&+{5|O%%n<yL_tx%UNEB zr4F5Ioq=B9i_nYajale(d<lBV=qmIwKM#Fg6vQ09Fb~TGz5>fiY^lMr%GY37i!Eni zxyUcUaw)ddVY$p1EKHn5y$jG+_&W5usb>-TD!&GO4R7R7&pBAG^Bb_-fMp4mWms<V zTd>?R@0^F;;J2Y~8+`%#Gkyp9j#xn*tI&6O1G*tr#TveF5tdDU50-mk6(uh5U+h^M zpO5w{QoJ4rrBy?`ZHvBk17B6X`Shq%nq611Ucd*QVC}%yj_WI?yMig9S<qp-@rQ1* z(=RnD|E7r8$b>VGo6Q%Gqzq)6EXgAm3&n6FtX2lGlI59J?mMf4h~c?!%dPx(R^DnA zz?=_jaZQiLz@uifE2Ln@j$)3_oZf+ZI0y#n6a<_OAlvPMl!CM4u8T%=9iMxyf5?Wx zKvo!z*cS~W+KAf8k;fgK^ElO?a5>5T)5P=p>|b*yxf9FI7)y?4-)Et+C%8MBkvk{W ztE}45D8qB_vPNfKnG!m$3n$jQ?5pAl-u-(fWAQAtZ?yBoceU$y?nsQCI%z69c6FES z$DsRYE+?h>=r*y>f`eD0jlK-aW83qv6c^qog}Hvvm(&bNV>2vu9pz{(!-5+0g_P70 zVcE7_)NkAHbY2Os6XqRxsKVmWG5wm?KcGKtyX`qj+4cwPKVNR@UVpRi_U|GlwBvbq zJ8y<ZU+OQ!W?Z>Cy-7qze<){A=UJSphKrS*%@i|p_$&W6o2_I<7j~ndnzX+$p(_%p z@AQOihZWn70u%SMw*7kGc=3~xZS$aQ+oqnd8bh~*=fOsu8C|M$M+C+Pn9M9iZYpQ; zd1Lt`W+^tds2IJJj9Jr%Ihlodw7l&z3VR0M267U9jprZolG-fmbXlOwB3({-%$?z( z53S);bW_fl52vLG=N|;VkHEm-HbZc<w#`mWpWw-*AEQ~u1BP=<Lpn80<%JC14kM7| zZPq81g5f;syp~`fotmM%xA!z6SVAX3qyV^p3U4I<NT&uUHQk;F272@_%w6M&hiMo& zgSk;LbI=1vx4Se&X_|baFgkWUkG1ImI|y{wl)H~Xb$|bx@nB2L<&C(X<Lb<e@l&tt z3Wrb1n@UwQB|iW0$XJ0B?j)Q-I<-^gK879r?FW4mPv2S&jb{SNMikvl2PPj$(F-)C zCHY3k*pcx(LJ13r03pW*ZFoB2RtE`0IUPY?kpdt8$tJI&iC-j|OgeRw&m^2Z+M@PG z+>E=N`GJPS6z}*$#vSc2*EdbX6dP!b1~|Q7;G6VIq0^YsK{Sbcm7pb^p7!PLQ*xz? zEIPWq&E6nOaRwtpcvAGy1M*<cITFkn$MrO>i{RKwaFI^URci*pGdO8ia1bB^juv16 z1^fo0$Tp4Q5^8;zpdg)^qWa8L3Ng9Y?uwo>+N9nj-zcNmEzvk^u&&m9hHOB;YJ>dN zi{6@scNsX36L_T4<2~_Bf5mv~dqOZSI?lkuilIMb9Z*Fb8Ud?mL<|H^6GWs_6IEg& zIB9f!>@5t=H!epQ(Q-}&J<$!05%-2{8qpOHyhsp{PEAyei5_DL6mrxcsIIvu*9-(r z9Y2e19W>1Z9qH6`^D*5EN}1%eb>agO5-0`Q1P)R4e|YRF7-%g!&gP_3Gc7*o4*Vm* zANlQoBlx4N`Wpfp&tw8CMVc4dQAsA^qU>N`<~L2N_Lw&+G_9X0_y0LTP5Nh0V+SLA z{ZJ&SuYB!bV_+sQP7f$CM@wt7<3af;6YO<x>?gQLr{-GN(^5D+<UuvSQXq2X=j2Qz zIRZAL)TFHmn%VYvc#RLKlzDLq=M8Z21Sjd#oRwWlkrCeNgMrdP55CgU6^ePmq1$F1 z<H{)<H&Jgl!9hAT$GMlj6vwX5odZwo1UyE%KgstLYsiq;9#R$^FQK{ud33UVh`zua ztf%;J3NbDEyaX}n)Wq{+v_Cr1$9Ng7>^O?{u11;e9haCk3N}!;B$hlb*r#M9S<=&d zjeviKNFUSuZku&zb4)=M^o0+%(V9cN)wK5)cg&a_10sFEvpv_8(uy6pz9Was6aJy@ zPNTmK*5i-p$ WyggJ81yDKqdN^*!7MAsHuOCQSCGp8)#si`Jn`n$#Kx+&v@wSf@ z14?1FsIWs~((w<cE~P#L>&Zv-WO=@E*=*xl^?~#}_u!X_Rk+!<g;nb5$^SvZ(v#nt z0c3WVlD1Nk_A-+86Oz`?l2(+G7HX1KMUoaJVdW2$hoTp086X*5DA`HMDe@{^Xik(g z0fjToVLvWS16|T6lN7jNDRz|!oUjfTV&&w}9&!AD`b1LGerRVJmcNSj+`rDDgt~`I ezBrq!)oS_pZ>C;~?&|sIj}+bEw^%FG3;zSH=Y#G5 diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/help.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/help.cpython-38.pyc deleted file mode 100644 index b4e88db50c5dac1ab683a99759063a23b66ea9ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2626 zcmZ`5%WfP+aHi+E<MsNH#1a8Q2S_$6?6s5!i0}|1GRP6JEjxiQLX5`SZSSmSXC^(p zPS&g?B<BiWkVA5WUw{MOzy)cpobm%4IK))-%=#rUvt3<XTV1cNs_6%llb#08i%%B6 z|7}v!{>H`0$A!gbF!DbDFwNJP&Pc5HiBELIjo9!FHJiSvX3MwKZ2PvF9p6#2>$_^M z`88%TEB5*meqGo0rh#h5ll_L@(6w*0gqj+k+VR9wUBj0degnodjG1q>WcFdHbs8wB zea4?*4s)Ms{w%9859V`hg4JO@&o8ja9U^|`=MR*e4XxGKYu-!QAm+4_CNhkYDA}f) zgKa8!mI_I`JkGedmbcn3!CkGT7mZ9ri43*|Nk>L$vhq?d=@UV)%S8^PAON;nHcT^~ z<ayk|jpK&^V#2rsBmWtI)Sl}vw0&&^UVv>EVNGDICq1ALpnS&+Y4psVrJ${#vt`Ty zkHTGM?ik`Jv!2&R6=j>e&_TjAkYIy^<VfZmP#mEActkOoyRVP5k<Mz*2*kq+{{ny3 zxg3auhLlAeNgqeDOJ$eSwV~{$361($%=;X|g#n;p!f54r+w&+qYa-o^7^j<QwJ{0% zT=AilikGHa|1VUD=?sJbE%A_wL4pU<reCCj@+To0Fi%1Eoyw%^?GM_wXoR-LF`ONm zuVnntMBUBXv{|t>=V`OD0I6zYbH6hDemBbL_+;thRP5w*ljriJDs*>kxHh~^ql9Lm zkWpt4hhiSJXCmDUH{+pF%~GBxO)v?>&@C|hZW%tnmPMMBmV-+JFqVU`T~HKlmod$| z=^$pHo3b?FN}NnfN$EhUxOGy94xCQj4KqFtW+#QPqb@k8oYO20C9L{+TZt%~DhP#% z9_+bS^0xXF)>f2+aiJA<X=LFYn^-sxlAR=doU}+`Vl)e<3Si4C+_8${LZ;jcPG<*{ zOG&P_6h=PGi<xYg4UfttO19F%>W95lz!W9r)DdY>7d+-+4q%tZh1p9ZG@@}v#oX!j zSne;HcpVDt-y4gvpDkulwh$$`4C8oVYj?Qwp}fTx1%EVvsOQHB)_Xe}7E@>ZxQO+7 z6@WJ35?A+h7hYSpU)e@oH+7=fhpti5Jz^5^CUBlA{2FeBp$h*`K=$U!(l1Mq>CebM zHoHrvCJktIH>+kx7%BgQR!1Ic(ma5|hn8UV>`31yfH?{?u!S-kq?pnbLb^ShIRI-t zZw}f3(t&qE)|tz!0|WM2YCU<hwq>K|?K{jEInYvS;#cO3oH@|SEZ}yrNsL@Mh5wDr z5g8dHYh;6r=?I&Lhs|T}>X$s>B9xfVn0RG2V?u@}x@sE^(S|&byk9ug5sNy+L^J@b z2#i&Ws6{bVb<y#u?vX1`1a{DtC#G=AYXAzblomj{^`{0o^oro9|N791SD_VeY<yKX z0};p3=8eMXbVI?oEb1LG%w)PP!mK+i%!nmn;g0j7HB;)igo@rmMb7f-k`PdOc);Rq z1Za$SNBvo;@eR~9x4O2p0!Z-n()z~o>PoQk;NIs;>xHw;p>s+h-o=eqaH9cs3k$L7 zvFfqEt(reMuCV}v>YqE4?uuBi94lGsm3QR|N^l%R#XED-<&vd_ek)X51~dGr<9L=- ztRz)V;te#@L_r?`mahZQ2q9Ptp4lKoC$H+34He=Uh})(~Ox=5BTSW5?VWFT+h&Fp@ zTEGFXt)RkzP7cXGVgaO{svlHi!%+2u)hIQo_lPtO)CGhYKN$x)Tn<dgLu;?K2HyZV zTu|R?)h_Xyjz*7jGR*1Sjn$R*{g?PjhJ>u;@VyUqIJ74_N*H{2R$69ZDGAVe@-!(d zHt1)$vaO88*{Jm40`UmM<tS4l;wHet4FaUYtzfQjf`Fx+ASk>5ZV=e`gFqm&xQ;+2 z^ekfUA;8=ya}3i<l|`9t^RR?GFLSw#Hy06YmI*Ym+{cScnWWcnn@Tg4t{BuKo3N9E x@?#eircT%WxUcR+pW@XfM`fm7hpwmIawc^+>1n+Iy$?<oX@+~*ec!cQ{Xbnp)ZzdD diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/hooks.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/hooks.cpython-38.pyc deleted file mode 100644 index 95a968a63d36134d1009c01f08f33a581445d256..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 946 zcmY*Y&u`N(6t?rLnPEsEBrXV<3sNU7<-m}b#sp%ANkf}N$7Rw;z1VH7rcGvhMV(SE z+nEdh06TKz-|>~dfeR;|y-w?1^u9QspI`iaPCl=$5(IJew)5q0fY2ZJupGdlcaZuS z07plN;{iUxJmBFaItqBiW4MPr>7sV){5MhJ^h{`@vtd<@H2HQX2ss=|O~(~KD+R4p zHI-awYKDRqtY#;<u#4uaqZ0Et*l^jOv*-Vw@53e#&IYPN0XM*d(OaQ$p9(M2lW; zlTe65XnMoZftU!zjNr7dsxf7B(K#bFy(ua{;GJ;NKS1gS030M=B7=6&1qP|%eu0;Y zU1<c_h18D#Bx=wxnd1fz(2w9W>Y`srxvF+xgY2b^#Z*j;XFU9S)iL9`Q_Ff?PPAcV zx!#}7MsLi9=-gO(JMgNrdS=NMmxU>+alP%{suO?&1#q1|=c3QfN|Rp~Z<STSO1+)k zu4rQ$?;afNb#J$EJ&K`=UA?pZq3iDUkFZJsi_nc1;oj=h??LL101d7aiJbbM;KLPm zBeiP)Ilc(g3vk7AJLvf7JZhpQ=;J2*j^}X`^I){1)|z-8oUS#2v-<q?j?^_X#SlIX z=8v2@*|M52HKWx8$bkeuX)Q$|Xw|2j8J5{J&p~sU=lkG#I1t9RhD<YKR6DWZNX%^P z&9N))mb*nZ8GU7Hpl#$ROT2r2X33<5KZ{NIk|$33V*nJSnBWL9!708EnPBD4X1^WT lR-W^!$aB>K!u#l_mRdWDmG7T!UH>NA&S`(J(Y+*0lmF>B@a+Hq diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/models.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/models.cpython-38.pyc deleted file mode 100644 index 5217ea6d2d00616bd8bcfd8ed072c7957a6d3225..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23810 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 diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/packages.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/packages.cpython-38.pyc deleted file mode 100644 index a095e75fc317cb8956a9c24deae1e4a54f6232a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 363 zcmYjNJx>Bb5S_U@_AW#yEF?D8P;gfmV@%K(V`*%R4T)S%c9fL`j-5q<Eq_Ex|I)Tr z{sk-d{GMcH-hAY}$y_%Yb?~-1&IWq{z-v|fH{pv@?>z89f<z5{kij|JT=bCw!ZlL3 z2EratMDS2sqo1XHL4t4`@EM8cm{5i-*q~`w8zgq2$}%F+f*#D<^DT*2(5bz74Y=%t zE?yX|)$P8El$;hW9*znl$vRA*whhe}#Fo>t7><j3;<S^vkXP*D?~beIxtf$SWAoez zJsTF9U8EIT7f)t#p^07SfvdAEjOC@WqZcquFa8<c4>LO{vr?5^HT5f6ckdoo<0E@O e*^l}k_&uXsxuo~Se}bNitIsC21e;+KcklzH#AH_h diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/sessions.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/sessions.cpython-38.pyc deleted file mode 100644 index 14215cd9bbb4a6da6b6fe0e651abaa2d0df6b0a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19496 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 TurkFbixZPSsolrLzf=DQ(wLTk diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/status_codes.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/status_codes.cpython-38.pyc deleted file mode 100644 index ee666a5ab8602c4eab66fea9a01afec29c82b7d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4142 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 WLV2h8+wr!_<WWB<KT~xoWB&snH7zdy diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/structures.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/structures.cpython-38.pyc deleted file mode 100644 index daf7a031e97edbe2819b3ada0459d586a3c6b5a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4384 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 diff --git a/venv/lib/python3.8/site-packages/requests/__pycache__/utils.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests/__pycache__/utils.cpython-38.pyc deleted file mode 100644 index c83948b5e3fc2c5c31f96db38a2be9c959c4bc4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22153 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 diff --git a/venv/lib/python3.8/site-packages/requests/__version__.py b/venv/lib/python3.8/site-packages/requests/__version__.py deleted file mode 100644 index 9844f74..0000000 --- a/venv/lib/python3.8/site-packages/requests/__version__.py +++ /dev/null @@ -1,14 +0,0 @@ -# .-. .-. .-. . . .-. .-. .-. .-. -# |( |- |.| | | |- `-. | `-. -# ' ' `-' `-`.`-' `-' `-' ' `-' - -__title__ = 'requests' -__description__ = 'Python HTTP for Humans.' -__url__ = 'http://python-requests.org' -__version__ = '2.22.0' -__build__ = 0x022200 -__author__ = 'Kenneth Reitz' -__author_email__ = 'me@kennethreitz.org' -__license__ = 'Apache 2.0' -__copyright__ = 'Copyright 2019 Kenneth Reitz' -__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/venv/lib/python3.8/site-packages/requests/_internal_utils.py b/venv/lib/python3.8/site-packages/requests/_internal_utils.py deleted file mode 100644 index 759d9a5..0000000 --- a/venv/lib/python3.8/site-packages/requests/_internal_utils.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests._internal_utils -~~~~~~~~~~~~~~ - -Provides utility functions that are consumed internally by Requests -which depend on extremely few external helpers (such as compat) -""" - -from .compat import is_py2, builtin_str, str - - -def to_native_string(string, encoding='ascii'): - """Given a string object, regardless of type, returns a representation of - that string in the native string type, encoding and decoding where - necessary. This assumes ASCII unless told otherwise. - """ - if isinstance(string, builtin_str): - out = string - else: - if is_py2: - out = string.encode(encoding) - else: - out = string.decode(encoding) - - return out - - -def unicode_is_ascii(u_string): - """Determine if unicode string only contains ASCII characters. - - :param str u_string: unicode string to check. Must be unicode - and not Python 2 `str`. - :rtype: bool - """ - assert isinstance(u_string, str) - try: - u_string.encode('ascii') - return True - except UnicodeEncodeError: - return False diff --git a/venv/lib/python3.8/site-packages/requests/adapters.py b/venv/lib/python3.8/site-packages/requests/adapters.py deleted file mode 100644 index fa4d9b3..0000000 --- a/venv/lib/python3.8/site-packages/requests/adapters.py +++ /dev/null @@ -1,533 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.adapters -~~~~~~~~~~~~~~~~~ - -This module contains the transport adapters that Requests uses to define -and maintain connections. -""" - -import os.path -import socket - -from urllib3.poolmanager import PoolManager, proxy_from_url -from urllib3.response import HTTPResponse -from urllib3.util import parse_url -from urllib3.util import Timeout as TimeoutSauce -from urllib3.util.retry import Retry -from urllib3.exceptions import ClosedPoolError -from urllib3.exceptions import ConnectTimeoutError -from urllib3.exceptions import HTTPError as _HTTPError -from urllib3.exceptions import MaxRetryError -from urllib3.exceptions import NewConnectionError -from urllib3.exceptions import ProxyError as _ProxyError -from urllib3.exceptions import ProtocolError -from urllib3.exceptions import ReadTimeoutError -from urllib3.exceptions import SSLError as _SSLError -from urllib3.exceptions import ResponseError -from urllib3.exceptions import LocationValueError - -from .models import Response -from .compat import urlparse, basestring -from .utils import (DEFAULT_CA_BUNDLE_PATH, extract_zipped_paths, - get_encoding_from_headers, prepend_scheme_if_needed, - get_auth_from_url, urldefragauth, select_proxy) -from .structures import CaseInsensitiveDict -from .cookies import extract_cookies_to_jar -from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, - ProxyError, RetryError, InvalidSchema, InvalidProxyURL, - InvalidURL) -from .auth import _basic_auth_str - -try: - from urllib3.contrib.socks import SOCKSProxyManager -except ImportError: - def SOCKSProxyManager(*args, **kwargs): - raise InvalidSchema("Missing dependencies for SOCKS support.") - -DEFAULT_POOLBLOCK = False -DEFAULT_POOLSIZE = 10 -DEFAULT_RETRIES = 0 -DEFAULT_POOL_TIMEOUT = None - - -class BaseAdapter(object): - """The Base Transport Adapter""" - - def __init__(self): - super(BaseAdapter, self).__init__() - - def send(self, request, stream=False, timeout=None, verify=True, - cert=None, proxies=None): - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) <timeouts>` tuple. - :type timeout: float or tuple - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - """ - raise NotImplementedError - - def close(self): - """Cleans up adapter specific items.""" - raise NotImplementedError - - -class HTTPAdapter(BaseAdapter): - """The built-in HTTP Adapter for urllib3. - - Provides a general-case interface for Requests sessions to contact HTTP and - HTTPS urls by implementing the Transport Adapter interface. This class will - usually be created by the :class:`Session <Session>` class under the - covers. - - :param pool_connections: The number of urllib3 connection pools to cache. - :param pool_maxsize: The maximum number of connections to save in the pool. - :param max_retries: The maximum number of retries each connection - should attempt. Note, this applies only to failed DNS lookups, socket - connections and connection timeouts, never to requests where data has - made it to the server. By default, Requests does not retry failed - connections. If you need granular control over the conditions under - which we retry a request, import urllib3's ``Retry`` class and pass - that instead. - :param pool_block: Whether the connection pool should block for connections. - - Usage:: - - >>> import requests - >>> s = requests.Session() - >>> a = requests.adapters.HTTPAdapter(max_retries=3) - >>> s.mount('http://', a) - """ - __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', - '_pool_block'] - - def __init__(self, pool_connections=DEFAULT_POOLSIZE, - pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, - pool_block=DEFAULT_POOLBLOCK): - if max_retries == DEFAULT_RETRIES: - self.max_retries = Retry(0, read=False) - else: - self.max_retries = Retry.from_int(max_retries) - self.config = {} - self.proxy_manager = {} - - super(HTTPAdapter, self).__init__() - - self._pool_connections = pool_connections - self._pool_maxsize = pool_maxsize - self._pool_block = pool_block - - self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) - - def __getstate__(self): - return {attr: getattr(self, attr, None) for attr in self.__attrs__} - - def __setstate__(self, state): - # Can't handle by adding 'proxy_manager' to self.__attrs__ because - # self.poolmanager uses a lambda function, which isn't pickleable. - self.proxy_manager = {} - self.config = {} - - for attr, value in state.items(): - setattr(self, attr, value) - - self.init_poolmanager(self._pool_connections, self._pool_maxsize, - block=self._pool_block) - - def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): - """Initializes a urllib3 PoolManager. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param connections: The number of urllib3 connection pools to cache. - :param maxsize: The maximum number of connections to save in the pool. - :param block: Block when no free connections are available. - :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. - """ - # save these values for pickling - self._pool_connections = connections - self._pool_maxsize = maxsize - self._pool_block = block - - self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, - block=block, strict=True, **pool_kwargs) - - def proxy_manager_for(self, proxy, **proxy_kwargs): - """Return urllib3 ProxyManager for the given proxy. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param proxy: The proxy to return a urllib3 ProxyManager for. - :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. - :returns: ProxyManager - :rtype: urllib3.ProxyManager - """ - if proxy in self.proxy_manager: - manager = self.proxy_manager[proxy] - elif proxy.lower().startswith('socks'): - username, password = get_auth_from_url(proxy) - manager = self.proxy_manager[proxy] = SOCKSProxyManager( - proxy, - username=username, - password=password, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs - ) - else: - proxy_headers = self.proxy_headers(proxy) - manager = self.proxy_manager[proxy] = proxy_from_url( - proxy, - proxy_headers=proxy_headers, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs) - - return manager - - def cert_verify(self, conn, url, verify, cert): - """Verify a SSL certificate. This method should not be called from user - code, and is only exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param conn: The urllib3 connection object associated with the cert. - :param url: The requested URL. - :param verify: Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: The SSL certificate to verify. - """ - if url.lower().startswith('https') and verify: - - cert_loc = None - - # Allow self-specified cert location. - if verify is not True: - cert_loc = verify - - if not cert_loc: - cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) - - if not cert_loc or not os.path.exists(cert_loc): - raise IOError("Could not find a suitable TLS CA certificate bundle, " - "invalid path: {}".format(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 - else: - conn.cert_reqs = 'CERT_NONE' - conn.ca_certs = None - conn.ca_cert_dir = None - - if cert: - if not isinstance(cert, basestring): - conn.cert_file = cert[0] - conn.key_file = cert[1] - else: - conn.cert_file = cert - conn.key_file = None - if conn.cert_file and not os.path.exists(conn.cert_file): - raise IOError("Could not find the TLS certificate file, " - "invalid path: {}".format(conn.cert_file)) - if conn.key_file and not os.path.exists(conn.key_file): - raise IOError("Could not find the TLS key file, " - "invalid path: {}".format(conn.key_file)) - - def build_response(self, req, resp): - """Builds a :class:`Response <requests.Response>` object from a urllib3 - response. This should not be called from user code, and is only exposed - for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>` - - :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response. - :param resp: The urllib3 response object. - :rtype: requests.Response - """ - response = Response() - - # Fallback to None if there's no status_code, for whatever reason. - response.status_code = getattr(resp, 'status', None) - - # Make headers case-insensitive. - response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) - - # Set encoding. - response.encoding = get_encoding_from_headers(response.headers) - response.raw = resp - response.reason = response.raw.reason - - if isinstance(req.url, bytes): - response.url = req.url.decode('utf-8') - else: - response.url = req.url - - # Add new cookies from the server. - extract_cookies_to_jar(response.cookies, req, resp) - - # Give the Response some context. - response.request = req - response.connection = self - - return response - - 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 - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param url: The URL to connect to. - :param proxies: (optional) A Requests-style dictionary of proxies used on this request. - :rtype: urllib3.ConnectionPool - """ - proxy = select_proxy(url, proxies) - - 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_url(url) - else: - # Only scheme should be lower case - parsed = urlparse(url) - url = parsed.geturl() - conn = self.poolmanager.connection_from_url(url) - - return conn - - def close(self): - """Disposes of any internal state. - - Currently, this closes the PoolManager and any active ProxyManager, - which closes any pooled connections. - """ - self.poolmanager.clear() - for proxy in self.proxy_manager.values(): - proxy.clear() - - def request_url(self, request, proxies): - """Obtain the url to use when making the final request. - - If the message is being sent through a HTTP proxy, the full URL has to - be used. Otherwise, we should only use the path portion of the URL. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. - :rtype: str - """ - proxy = select_proxy(request.url, proxies) - scheme = urlparse(request.url).scheme - - is_proxied_http_request = (proxy and scheme != 'https') - using_socks_proxy = False - if proxy: - proxy_scheme = urlparse(proxy).scheme.lower() - using_socks_proxy = proxy_scheme.startswith('socks') - - url = request.path_url - if is_proxied_http_request and not using_socks_proxy: - url = urldefragauth(request.url) - - return url - - def add_headers(self, request, **kwargs): - """Add any headers needed by the connection. As of v2.0 this does - nothing by default, but is left for overriding by users that subclass - the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to. - :param kwargs: The keyword arguments from the call to send(). - """ - pass - - def proxy_headers(self, proxy): - """Returns a dictionary of the headers to add to any request sent - through a proxy. This works with urllib3 magic to ensure that they are - correctly sent to the proxy, rather than in a tunnelled request if - CONNECT is being used. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param proxy: The url of the proxy being used for this request. - :rtype: dict - """ - headers = {} - username, password = get_auth_from_url(proxy) - - if username: - headers['Proxy-Authorization'] = _basic_auth_str(username, - password) - - return headers - - def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) <timeouts>` tuple. - :type timeout: float or tuple or urllib3 Timeout object - :param verify: (optional) Either a boolean, in which case it controls whether - we verify the server's TLS certificate, or a string, in which case it - must be a path to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - :rtype: requests.Response - """ - - try: - conn = self.get_connection(request.url, proxies) - except LocationValueError as e: - raise InvalidURL(e, request=request) - - self.cert_verify(conn, request.url, verify, cert) - url = self.request_url(request, proxies) - self.add_headers(request, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) - - chunked = not (request.body is None or 'Content-Length' in request.headers) - - if isinstance(timeout, tuple): - try: - connect, read = timeout - timeout = TimeoutSauce(connect=connect, read=read) - except ValueError as e: - # this may raise a string formatting error. - err = ("Invalid timeout {}. Pass a (connect, read) " - "timeout tuple, or a single float to set " - "both timeouts to the same value".format(timeout)) - raise ValueError(err) - elif isinstance(timeout, TimeoutSauce): - pass - else: - timeout = TimeoutSauce(connect=timeout, read=timeout) - - try: - if not chunked: - resp = conn.urlopen( - method=request.method, - url=url, - body=request.body, - headers=request.headers, - redirect=False, - assert_same_host=False, - preload_content=False, - decode_content=False, - retries=self.max_retries, - timeout=timeout - ) - - # Send the request. - else: - if hasattr(conn, 'proxy_pool'): - conn = conn.proxy_pool - - low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT) - - try: - low_conn.putrequest(request.method, - url, - skip_accept_encoding=True) - - for header, value in request.headers.items(): - low_conn.putheader(header, value) - - low_conn.endheaders() - - for i in request.body: - low_conn.send(hex(len(i))[2:].encode('utf-8')) - low_conn.send(b'\r\n') - low_conn.send(i) - low_conn.send(b'\r\n') - low_conn.send(b'0\r\n\r\n') - - # Receive the response from the server - try: - # For Python 2.7, use buffering of HTTP responses - r = low_conn.getresponse(buffering=True) - except TypeError: - # For compatibility with Python 3.3+ - r = low_conn.getresponse() - - resp = HTTPResponse.from_httplib( - r, - pool=conn, - connection=low_conn, - preload_content=False, - decode_content=False - ) - except: - # If we hit any problems here, clean up the connection. - # Then, reraise so that we can handle the actual exception. - low_conn.close() - raise - - except (ProtocolError, socket.error) as err: - raise ConnectionError(err, request=request) - - except MaxRetryError as e: - if isinstance(e.reason, ConnectTimeoutError): - # TODO: Remove this in 3.0.0: see #2811 - if not isinstance(e.reason, NewConnectionError): - raise ConnectTimeout(e, request=request) - - if isinstance(e.reason, ResponseError): - raise RetryError(e, request=request) - - if isinstance(e.reason, _ProxyError): - raise ProxyError(e, request=request) - - if isinstance(e.reason, _SSLError): - # This branch is for urllib3 v1.22 and later. - raise SSLError(e, request=request) - - raise ConnectionError(e, request=request) - - except ClosedPoolError as e: - raise ConnectionError(e, request=request) - - except _ProxyError as e: - raise ProxyError(e) - - except (_SSLError, _HTTPError) as e: - if isinstance(e, _SSLError): - # This branch is for urllib3 versions earlier than v1.22 - raise SSLError(e, request=request) - elif isinstance(e, ReadTimeoutError): - raise ReadTimeout(e, request=request) - else: - raise - - return self.build_response(request, resp) diff --git a/venv/lib/python3.8/site-packages/requests/api.py b/venv/lib/python3.8/site-packages/requests/api.py deleted file mode 100644 index ef71d07..0000000 --- a/venv/lib/python3.8/site-packages/requests/api.py +++ /dev/null @@ -1,158 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.api -~~~~~~~~~~~~ - -This module implements the Requests API. - -:copyright: (c) 2012 by Kenneth Reitz. -:license: Apache2, see LICENSE for more details. -""" - -from . import sessions - - -def request(method, url, **kwargs): - """Constructs and sends a :class:`Request <Request>`. - - :param method: method for the new :class:`Request` object. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary, list of tuples or bytes to send - in the query string for the :class:`Request`. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. - :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 - 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. - :param timeout: (optional) How many seconds to wait for the server to send data - before giving up, as a float, or a :ref:`(connect timeout, read - timeout) <timeouts>` tuple. - :type timeout: float or tuple - :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. - :type allow_redirects: bool - :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use. Defaults to ``True``. - :param stream: (optional) if ``False``, the response content will be immediately downloaded. - :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. - :return: :class:`Response <Response>` object - :rtype: requests.Response - - Usage:: - - >>> import requests - >>> req = requests.request('GET', 'https://httpbin.org/get') - <Response [200]> - """ - - # By using the 'with' statement we are sure the session is closed, thus we - # avoid leaving sockets open which can trigger a ResourceWarning in some - # cases, and look like a memory leak in others. - with sessions.Session() as session: - return session.request(method=method, url=url, **kwargs) - - -def get(url, params=None, **kwargs): - r"""Sends a GET request. - - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary, list of tuples or bytes to send - in the query string for the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return request('get', url, params=params, **kwargs) - - -def options(url, **kwargs): - r"""Sends an OPTIONS request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return request('options', url, **kwargs) - - -def head(url, **kwargs): - r"""Sends a HEAD request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', False) - return request('head', url, **kwargs) - - -def post(url, data=None, json=None, **kwargs): - r"""Sends a POST request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json data to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request('post', url, data=data, json=json, **kwargs) - - -def put(url, data=None, **kwargs): - r"""Sends a PUT request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json data to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request('put', url, data=data, **kwargs) - - -def patch(url, data=None, **kwargs): - r"""Sends a PATCH request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json data to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request('patch', url, data=data, **kwargs) - - -def delete(url, **kwargs): - r"""Sends a DELETE request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request('delete', url, **kwargs) diff --git a/venv/lib/python3.8/site-packages/requests/auth.py b/venv/lib/python3.8/site-packages/requests/auth.py deleted file mode 100644 index bdde51c..0000000 --- a/venv/lib/python3.8/site-packages/requests/auth.py +++ /dev/null @@ -1,305 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.auth -~~~~~~~~~~~~~ - -This module contains the authentication handlers for Requests. -""" - -import os -import re -import time -import hashlib -import threading -import warnings - -from base64 import b64encode - -from .compat import urlparse, str, basestring -from .cookies import extract_cookies_to_jar -from ._internal_utils import to_native_string -from .utils import parse_dict_header - -CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' -CONTENT_TYPE_MULTI_PART = 'multipart/form-data' - - -def _basic_auth_str(username, password): - """Returns a Basic Auth string.""" - - # "I want us to put a big-ol' comment on top of it that - # says that this behaviour is dumb but we need to preserve - # it because people are relying on it." - # - Lukasa - # - # These are here solely to maintain backwards compatibility - # for things like ints. This will be removed in 3.0.0. - if not isinstance(username, basestring): - warnings.warn( - "Non-string usernames will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({!r}) to " - "a string or bytes object in the near future to avoid " - "problems.".format(username), - category=DeprecationWarning, - ) - username = str(username) - - if not isinstance(password, basestring): - warnings.warn( - "Non-string passwords will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({!r}) to " - "a string or bytes object in the near future to avoid " - "problems.".format(password), - category=DeprecationWarning, - ) - password = str(password) - # -- End Removal -- - - if isinstance(username, str): - username = username.encode('latin1') - - if isinstance(password, str): - password = password.encode('latin1') - - authstr = 'Basic ' + to_native_string( - b64encode(b':'.join((username, password))).strip() - ) - - return authstr - - -class AuthBase(object): - """Base class that all auth implementations derive from""" - - def __call__(self, r): - raise NotImplementedError('Auth hooks must be callable.') - - -class HTTPBasicAuth(AuthBase): - """Attaches HTTP Basic Authentication to the given Request object.""" - - def __init__(self, username, password): - self.username = username - self.password = password - - def __eq__(self, other): - return all([ - self.username == getattr(other, 'username', None), - self.password == getattr(other, 'password', None) - ]) - - def __ne__(self, other): - return not self == other - - def __call__(self, r): - r.headers['Authorization'] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPProxyAuth(HTTPBasicAuth): - """Attaches HTTP Proxy Authentication to a given Request object.""" - - def __call__(self, r): - r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPDigestAuth(AuthBase): - """Attaches HTTP Digest Authentication to the given Request object.""" - - def __init__(self, username, password): - self.username = username - self.password = password - # Keep state in per-thread local storage - self._thread_local = threading.local() - - def init_per_thread_state(self): - # Ensure state is initialized just once per-thread - if not hasattr(self._thread_local, 'init'): - self._thread_local.init = True - self._thread_local.last_nonce = '' - self._thread_local.nonce_count = 0 - self._thread_local.chal = {} - self._thread_local.pos = None - self._thread_local.num_401_calls = None - - def build_digest_header(self, method, url): - """ - :rtype: str - """ - - realm = self._thread_local.chal['realm'] - nonce = self._thread_local.chal['nonce'] - qop = self._thread_local.chal.get('qop') - algorithm = self._thread_local.chal.get('algorithm') - opaque = self._thread_local.chal.get('opaque') - hash_utf8 = None - - if algorithm is None: - _algorithm = 'MD5' - else: - _algorithm = algorithm.upper() - # lambdas assume digest modules are imported at the top level - if _algorithm == 'MD5' or _algorithm == 'MD5-SESS': - def md5_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.md5(x).hexdigest() - hash_utf8 = md5_utf8 - elif _algorithm == 'SHA': - def sha_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.sha1(x).hexdigest() - hash_utf8 = sha_utf8 - elif _algorithm == 'SHA-256': - def sha256_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.sha256(x).hexdigest() - hash_utf8 = sha256_utf8 - elif _algorithm == 'SHA-512': - def sha512_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.sha512(x).hexdigest() - hash_utf8 = sha512_utf8 - - KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) - - if hash_utf8 is None: - return None - - # XXX not implemented yet - entdig = None - p_parsed = urlparse(url) - #: path is request-uri defined in RFC 2616 which should not be empty - path = p_parsed.path or "/" - if p_parsed.query: - path += '?' + p_parsed.query - - A1 = '%s:%s:%s' % (self.username, realm, self.password) - A2 = '%s:%s' % (method, path) - - HA1 = hash_utf8(A1) - HA2 = hash_utf8(A2) - - if nonce == self._thread_local.last_nonce: - self._thread_local.nonce_count += 1 - else: - self._thread_local.nonce_count = 1 - ncvalue = '%08x' % self._thread_local.nonce_count - s = str(self._thread_local.nonce_count).encode('utf-8') - s += nonce.encode('utf-8') - s += time.ctime().encode('utf-8') - s += os.urandom(8) - - cnonce = (hashlib.sha1(s).hexdigest()[:16]) - if _algorithm == 'MD5-SESS': - HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) - - if not qop: - respdig = KD(HA1, "%s:%s" % (nonce, HA2)) - elif qop == 'auth' or 'auth' in qop.split(','): - noncebit = "%s:%s:%s:%s:%s" % ( - nonce, ncvalue, cnonce, 'auth', HA2 - ) - respdig = KD(HA1, noncebit) - else: - # XXX handle auth-int. - return None - - self._thread_local.last_nonce = nonce - - # XXX should the partial digests be encoded too? - base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ - 'response="%s"' % (self.username, realm, nonce, path, respdig) - if opaque: - base += ', opaque="%s"' % opaque - if algorithm: - base += ', algorithm="%s"' % algorithm - if entdig: - base += ', digest="%s"' % entdig - if qop: - base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) - - return 'Digest %s' % (base) - - def handle_redirect(self, r, **kwargs): - """Reset num_401_calls counter on redirects.""" - if r.is_redirect: - self._thread_local.num_401_calls = 1 - - def handle_401(self, r, **kwargs): - """ - Takes the given response and tries digest-auth, if needed. - - :rtype: requests.Response - """ - - # If response is not 4xx, do not auth - # See https://github.com/requests/requests/issues/3772 - if not 400 <= r.status_code < 500: - self._thread_local.num_401_calls = 1 - return r - - if self._thread_local.pos is not None: - # Rewind the file position indicator of the body to where - # it was to resend the request. - r.request.body.seek(self._thread_local.pos) - 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)) - - # Consume content and release the original connection - # to allow our new request to reuse the same one. - r.content - r.close() - prep = r.request.copy() - extract_cookies_to_jar(prep._cookies, r.request, r.raw) - prep.prepare_cookies(prep._cookies) - - prep.headers['Authorization'] = self.build_digest_header( - prep.method, prep.url) - _r = r.connection.send(prep, **kwargs) - _r.history.append(r) - _r.request = prep - - return _r - - self._thread_local.num_401_calls = 1 - return r - - def __call__(self, r): - # Initialize per-thread state, if needed - self.init_per_thread_state() - # If we have a saved nonce, skip the 401 - if self._thread_local.last_nonce: - r.headers['Authorization'] = self.build_digest_header(r.method, r.url) - try: - self._thread_local.pos = r.body.tell() - except AttributeError: - # In the case of HTTPDigestAuth being reused and the body of - # the previous request was a file-like object, pos has the - # file position of the previous body. Ensure it's set to - # None. - self._thread_local.pos = None - r.register_hook('response', self.handle_401) - r.register_hook('response', self.handle_redirect) - self._thread_local.num_401_calls = 1 - - return r - - def __eq__(self, other): - return all([ - self.username == getattr(other, 'username', None), - self.password == getattr(other, 'password', None) - ]) - - def __ne__(self, other): - return not self == other diff --git a/venv/lib/python3.8/site-packages/requests/certs.py b/venv/lib/python3.8/site-packages/requests/certs.py deleted file mode 100644 index d1a378d..0000000 --- a/venv/lib/python3.8/site-packages/requests/certs.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -requests.certs -~~~~~~~~~~~~~~ - -This module returns the preferred default CA certificate bundle. There is -only one — the one from the certifi package. - -If you are packaging Requests, e.g., for a Linux distribution or a managed -environment, you can change the definition of where() to return a separately -packaged CA bundle. -""" -from certifi import where - -if __name__ == '__main__': - print(where()) diff --git a/venv/lib/python3.8/site-packages/requests/compat.py b/venv/lib/python3.8/site-packages/requests/compat.py deleted file mode 100644 index c44b35e..0000000 --- a/venv/lib/python3.8/site-packages/requests/compat.py +++ /dev/null @@ -1,70 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.compat -~~~~~~~~~~~~~~~ - -This module handles import compatibility issues between Python 2 and -Python 3. -""" - -import chardet - -import sys - -# ------- -# Pythons -# ------- - -# Syntax sugar. -_ver = sys.version_info - -#: Python 2.x? -is_py2 = (_ver[0] == 2) - -#: Python 3.x? -is_py3 = (_ver[0] == 3) - -try: - import simplejson as json -except ImportError: - import json - -# --------- -# Specifics -# --------- - -if is_py2: - from urllib import ( - quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, - proxy_bypass, proxy_bypass_environment, getproxies_environment) - from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag - from urllib2 import parse_http_list - import cookielib - from Cookie import Morsel - from StringIO import StringIO - from collections import Callable, Mapping, MutableMapping, OrderedDict - - - builtin_str = str - bytes = str - str = unicode - basestring = basestring - numeric_types = (int, long, float) - integer_types = (int, long) - -elif is_py3: - from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag - from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment - from http import cookiejar as cookielib - from http.cookies import Morsel - from io import StringIO - from collections import OrderedDict - from collections.abc import Callable, Mapping, MutableMapping - - builtin_str = str - str = str - bytes = bytes - basestring = (str, bytes) - numeric_types = (int, float) - integer_types = (int,) diff --git a/venv/lib/python3.8/site-packages/requests/cookies.py b/venv/lib/python3.8/site-packages/requests/cookies.py deleted file mode 100644 index 56fccd9..0000000 --- a/venv/lib/python3.8/site-packages/requests/cookies.py +++ /dev/null @@ -1,549 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.cookies -~~~~~~~~~~~~~~~~ - -Compatibility code to be able to use `cookielib.CookieJar` with requests. - -requests.utils imports from here, so be careful with imports. -""" - -import copy -import time -import calendar - -from ._internal_utils import to_native_string -from .compat import cookielib, urlparse, urlunparse, Morsel, MutableMapping - -try: - import threading -except ImportError: - import dummy_threading as threading - - -class MockRequest(object): - """Wraps a `requests.Request` to mimic a `urllib2.Request`. - - The code in `cookielib.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. - - The original request object is read-only. The client is responsible for collecting - the new headers via `get_new_headers()` and interpreting them appropriately. You - probably want `get_cookie_header`, defined below. - """ - - def __init__(self, request): - self._r = request - self._new_headers = {} - self.type = urlparse(self._r.url).scheme - - def get_type(self): - return self.type - - def get_host(self): - return urlparse(self._r.url).netloc - - def get_origin_req_host(self): - return self.get_host() - - def get_full_url(self): - # Only return the response's URL if the user hadn't set the Host - # header - if not self._r.headers.get('Host'): - return self._r.url - # If they did set it, retrieve it and reconstruct the expected domain - host = to_native_string(self._r.headers['Host'], encoding='utf-8') - parsed = urlparse(self._r.url) - # Reconstruct the URL as we expect it - return urlunparse([ - parsed.scheme, host, parsed.path, parsed.params, parsed.query, - parsed.fragment - ]) - - def is_unverifiable(self): - return True - - def has_header(self, name): - return name in self._r.headers or name in self._new_headers - - def get_header(self, name, default=None): - 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.""" - raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") - - def add_unredirected_header(self, name, value): - self._new_headers[name] = value - - def get_new_headers(self): - return self._new_headers - - @property - def unverifiable(self): - return self.is_unverifiable() - - @property - def origin_req_host(self): - return self.get_origin_req_host() - - @property - def host(self): - return self.get_host() - - -class MockResponse(object): - """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. - """ - - def __init__(self, headers): - """Make a MockResponse for `cookielib` to read. - - :param headers: a httplib.HTTPMessage or analogous carrying the headers - """ - self._headers = headers - - def info(self): - return self._headers - - def getheaders(self, name): - self._headers.getheaders(name) - - -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 request: our own requests.Request object - :param response: urllib3.HTTPResponse object - """ - if not (hasattr(response, '_original_response') and - response._original_response): - return - # the _original_response field is the wrapped httplib.HTTPResponse object, - req = MockRequest(request) - # pull out the HTTPMessage with the headers and put it in the mock: - res = MockResponse(response._original_response.msg) - jar.extract_cookies(res, req) - - -def get_cookie_header(jar, request): - """ - Produce an appropriate Cookie header string to be sent with `request`, or None. - - :rtype: str - """ - r = MockRequest(request) - jar.add_cookie_header(r) - return r.get_new_headers().get('Cookie') - - -def remove_cookie_by_name(cookiejar, name, domain=None, path=None): - """Unsets a cookie by name, by default over all domains and paths. - - Wraps CookieJar.clear(), is O(n). - """ - clearables = [] - for cookie in cookiejar: - if cookie.name != name: - continue - if domain is not None and domain != cookie.domain: - continue - if path is not None and path != cookie.path: - continue - clearables.append((cookie.domain, cookie.path, cookie.name)) - - for domain, path, name in clearables: - cookiejar.clear(domain, path, name) - - -class CookieConflictError(RuntimeError): - """There are two cookies that meet the criteria specified in the cookie jar. - Use .get and .set and include domain and path args in order to be more specific. - """ - - -class RequestsCookieJar(cookielib.CookieJar, MutableMapping): - """Compatibility class; is a cookielib.CookieJar, but exposes a dict - interface. - - This is the CookieJar we create by default for requests and sessions that - don't specify one, since some clients may expect response.cookies and - session.cookies to support dict operations. - - Requests does not use the dict interface internally; it's just for - compatibility with external client code. All requests code should work - out of the box with externally provided instances of ``CookieJar``, e.g. - ``LWPCookieJar`` and ``FileCookieJar``. - - Unlike a regular CookieJar, this class is pickleable. - - .. warning:: dictionary operations that are normally O(1) may be O(n). - """ - - def get(self, name, default=None, domain=None, path=None): - """Dict-like get() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. - - .. warning:: operation is O(n), not O(1). - """ - try: - return self._find_no_duplicates(name, domain, path) - except KeyError: - return default - - def set(self, name, value, **kwargs): - """Dict-like set() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. - """ - # support client code that unsets cookies by assignment of a None value: - if value is None: - remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) - return - - if isinstance(value, Morsel): - c = morsel_to_cookie(value) - else: - c = create_cookie(name, value, **kwargs) - self.set_cookie(c) - return c - - def iterkeys(self): - """Dict-like iterkeys() that returns an iterator of names of cookies - from the jar. - - .. seealso:: itervalues() and iteritems(). - """ - for cookie in iter(self): - yield cookie.name - - def keys(self): - """Dict-like keys() that returns a list of names of cookies from the - jar. - - .. seealso:: values() and items(). - """ - return list(self.iterkeys()) - - def itervalues(self): - """Dict-like itervalues() that returns an iterator of values of cookies - from the jar. - - .. seealso:: iterkeys() and iteritems(). - """ - for cookie in iter(self): - yield cookie.value - - def values(self): - """Dict-like values() that returns a list of values of cookies from the - jar. - - .. seealso:: keys() and items(). - """ - return list(self.itervalues()) - - def iteritems(self): - """Dict-like iteritems() that returns an iterator of name-value tuples - from the jar. - - .. seealso:: iterkeys() and itervalues(). - """ - for cookie in iter(self): - yield cookie.name, cookie.value - - def items(self): - """Dict-like items() that returns a list of name-value tuples from the - jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a - vanilla python dict of key value pairs. - - .. seealso:: keys() and values(). - """ - return list(self.iteritems()) - - def list_domains(self): - """Utility method to list all the domains in the jar.""" - domains = [] - for cookie in iter(self): - if cookie.domain not in domains: - domains.append(cookie.domain) - return domains - - def list_paths(self): - """Utility method to list all the paths in the jar.""" - paths = [] - for cookie in iter(self): - if cookie.path not in paths: - paths.append(cookie.path) - return paths - - def multiple_domains(self): - """Returns True if there are multiple domains in the jar. - Returns False otherwise. - - :rtype: bool - """ - domains = [] - for cookie in iter(self): - if cookie.domain is not None and cookie.domain in domains: - return True - domains.append(cookie.domain) - return False # there is only one domain in jar - - def get_dict(self, domain=None, path=None): - """Takes as an argument an optional domain and path and returns a plain - old Python dict of name-value pairs of cookies that meet the - requirements. - - :rtype: dict - """ - dictionary = {} - for cookie in iter(self): - if ( - (domain is None or cookie.domain == domain) and - (path is None or cookie.path == path) - ): - dictionary[cookie.name] = cookie.value - return dictionary - - def __contains__(self, name): - try: - return super(RequestsCookieJar, self).__contains__(name) - except CookieConflictError: - return True - - def __getitem__(self, name): - """Dict-like __getitem__() for compatibility with client code. Throws - exception if there are more than one cookie with name. In that case, - use the more explicit get() method instead. - - .. warning:: operation is O(n), not O(1). - """ - return self._find_no_duplicates(name) - - def __setitem__(self, name, value): - """Dict-like __setitem__ for compatibility with client code. Throws - exception if there is already a cookie of that name in the jar. In that - case, use the more explicit set() method instead. - """ - self.set(name, value) - - def __delitem__(self, name): - """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s - ``remove_cookie_by_name()``. - """ - remove_cookie_by_name(self, name) - - def set_cookie(self, cookie, *args, **kwargs): - if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'): - cookie.value = cookie.value.replace('\\"', '') - return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs) - - def update(self, other): - """Updates this jar with cookies from another CookieJar or dict-like""" - if isinstance(other, cookielib.CookieJar): - for cookie in other: - self.set_cookie(copy.copy(cookie)) - else: - super(RequestsCookieJar, self).update(other) - - def _find(self, name, domain=None, path=None): - """Requests uses this method internally to get cookie values. - - If there are conflicting cookies, _find arbitrarily chooses one. - See _find_no_duplicates if you want an exception thrown if there are - conflicting cookies. - - :param name: a string containing name of cookie - :param domain: (optional) string containing domain of cookie - :param path: (optional) string containing path of cookie - :return: cookie.value - """ - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - return cookie.value - - raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) - - def _find_no_duplicates(self, name, domain=None, path=None): - """Both ``__get_item__`` and ``get`` call this function: it's never - used elsewhere in Requests. - - :param name: a string containing name of cookie - :param domain: (optional) string containing domain of cookie - :param path: (optional) string containing path of cookie - :raises KeyError: if cookie is not found - :raises CookieConflictError: if there are multiple cookies - that match name and optionally domain and path - :return: cookie.value - """ - toReturn = None - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - if toReturn is not None: # if there are multiple cookies that meet passed in criteria - raise CookieConflictError('There are multiple cookies with name, %r' % (name)) - toReturn = cookie.value # we will eventually return this as long as no cookie conflict - - if toReturn: - return toReturn - raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) - - def __getstate__(self): - """Unlike a normal CookieJar, this class is pickleable.""" - state = self.__dict__.copy() - # remove the unpickleable RLock object - state.pop('_cookies_lock') - return state - - def __setstate__(self, state): - """Unlike a normal CookieJar, this class is pickleable.""" - self.__dict__.update(state) - if '_cookies_lock' not in self.__dict__: - self._cookies_lock = threading.RLock() - - def copy(self): - """Return a copy of this RequestsCookieJar.""" - new_cj = RequestsCookieJar() - new_cj.set_policy(self.get_policy()) - new_cj.update(self) - return new_cj - - def get_policy(self): - """Return the CookiePolicy instance used.""" - return self._policy - - -def _copy_cookie_jar(jar): - if jar is None: - return None - - if hasattr(jar, 'copy'): - # We're dealing with an instance of RequestsCookieJar - return jar.copy() - # We're dealing with a generic CookieJar instance - new_jar = copy.copy(jar) - new_jar.clear() - for cookie in jar: - new_jar.set_cookie(copy.copy(cookie)) - return new_jar - - -def create_cookie(name, value, **kwargs): - """Make a cookie from underspecified parameters. - - By default, the pair of `name` and `value` will be set for the domain '' - and sent on every request (this is sometimes called a "supercookie"). - """ - result = { - 'version': 0, - 'name': name, - 'value': value, - 'port': None, - 'domain': '', - 'path': '/', - 'secure': False, - 'expires': None, - 'discard': True, - 'comment': None, - 'comment_url': None, - 'rest': {'HttpOnly': None}, - 'rfc2109': False, - } - - badargs = set(kwargs) - set(result) - if badargs: - err = 'create_cookie() got unexpected keyword arguments: %s' - raise TypeError(err % list(badargs)) - - result.update(kwargs) - result['port_specified'] = bool(result['port']) - result['domain_specified'] = bool(result['domain']) - result['domain_initial_dot'] = result['domain'].startswith('.') - result['path_specified'] = bool(result['path']) - - return cookielib.Cookie(**result) - - -def morsel_to_cookie(morsel): - """Convert a Morsel object into a Cookie containing the one k/v pair.""" - - expires = None - if morsel['max-age']: - try: - expires = int(time.time() + int(morsel['max-age'])) - except ValueError: - raise TypeError('max-age: %s must be integer' % morsel['max-age']) - elif morsel['expires']: - time_template = '%a, %d-%b-%Y %H:%M:%S GMT' - expires = calendar.timegm( - time.strptime(morsel['expires'], time_template) - ) - return create_cookie( - comment=morsel['comment'], - comment_url=bool(morsel['comment']), - discard=False, - domain=morsel['domain'], - expires=expires, - name=morsel.key, - path=morsel['path'], - port=None, - rest={'HttpOnly': morsel['httponly']}, - rfc2109=False, - secure=bool(morsel['secure']), - value=morsel.value, - version=morsel['version'] or 0, - ) - - -def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): - """Returns a CookieJar from a key/value dictionary. - - :param cookie_dict: Dict of key/values to insert into CookieJar. - :param cookiejar: (optional) A cookiejar to add the cookies to. - :param overwrite: (optional) If False, will not replace cookies - already in the jar with new ones. - :rtype: CookieJar - """ - if cookiejar is None: - cookiejar = RequestsCookieJar() - - if cookie_dict is not None: - names_from_jar = [cookie.name for cookie in cookiejar] - for name in cookie_dict: - if overwrite or (name not in names_from_jar): - cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) - - return cookiejar - - -def merge_cookies(cookiejar, cookies): - """Add cookies to cookiejar and returns a merged CookieJar. - - :param cookiejar: CookieJar object to add the cookies to. - :param cookies: Dictionary or CookieJar object to be added. - :rtype: CookieJar - """ - if not isinstance(cookiejar, cookielib.CookieJar): - raise ValueError('You can only merge into CookieJar') - - if isinstance(cookies, dict): - cookiejar = cookiejar_from_dict( - cookies, cookiejar=cookiejar, overwrite=False) - elif isinstance(cookies, cookielib.CookieJar): - try: - cookiejar.update(cookies) - except AttributeError: - for cookie_in_jar in cookies: - cookiejar.set_cookie(cookie_in_jar) - - return cookiejar diff --git a/venv/lib/python3.8/site-packages/requests/exceptions.py b/venv/lib/python3.8/site-packages/requests/exceptions.py deleted file mode 100644 index a80cad8..0000000 --- a/venv/lib/python3.8/site-packages/requests/exceptions.py +++ /dev/null @@ -1,126 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.exceptions -~~~~~~~~~~~~~~~~~~~ - -This module contains the set of Requests' exceptions. -""" -from urllib3.exceptions import HTTPError as BaseHTTPError - - -class RequestException(IOError): - """There was an ambiguous exception that occurred while handling your - request. - """ - - def __init__(self, *args, **kwargs): - """Initialize RequestException with `request` and `response` objects.""" - response = kwargs.pop('response', None) - self.response = response - self.request = kwargs.pop('request', None) - if (response is not None and not self.request and - hasattr(response, 'request')): - self.request = self.response.request - super(RequestException, self).__init__(*args, **kwargs) - - -class HTTPError(RequestException): - """An HTTP error occurred.""" - - -class ConnectionError(RequestException): - """A Connection error occurred.""" - - -class ProxyError(ConnectionError): - """A proxy error occurred.""" - - -class SSLError(ConnectionError): - """An SSL error occurred.""" - - -class Timeout(RequestException): - """The request timed out. - - Catching this error will catch both - :exc:`~requests.exceptions.ConnectTimeout` and - :exc:`~requests.exceptions.ReadTimeout` errors. - """ - - -class ConnectTimeout(ConnectionError, Timeout): - """The request timed out while trying to connect to the remote server. - - Requests that produced this error are safe to retry. - """ - - -class ReadTimeout(Timeout): - """The server did not send any data in the allotted amount of time.""" - - -class URLRequired(RequestException): - """A valid URL is required to make a request.""" - - -class TooManyRedirects(RequestException): - """Too many redirects.""" - - -class MissingSchema(RequestException, ValueError): - """The URL schema (e.g. http or https) is missing.""" - - -class InvalidSchema(RequestException, ValueError): - """See defaults.py for valid schemas.""" - - -class InvalidURL(RequestException, ValueError): - """The URL provided was somehow invalid.""" - - -class InvalidHeader(RequestException, ValueError): - """The header value provided was somehow invalid.""" - - -class InvalidProxyURL(InvalidURL): - """The proxy URL provided is invalid.""" - - -class ChunkedEncodingError(RequestException): - """The server declared chunked encoding but sent an invalid chunk.""" - - -class ContentDecodingError(RequestException, BaseHTTPError): - """Failed to decode response content""" - - -class StreamConsumedError(RequestException, TypeError): - """The content for this response was already consumed""" - - -class RetryError(RequestException): - """Custom retries logic failed""" - - -class UnrewindableBodyError(RequestException): - """Requests encountered an error when trying to rewind a body""" - -# Warnings - - -class RequestsWarning(Warning): - """Base warning for Requests.""" - pass - - -class FileModeWarning(RequestsWarning, DeprecationWarning): - """A file was opened in text mode, but Requests determined its binary length.""" - pass - - -class RequestsDependencyWarning(RequestsWarning): - """An imported dependency doesn't match the expected version range.""" - pass diff --git a/venv/lib/python3.8/site-packages/requests/help.py b/venv/lib/python3.8/site-packages/requests/help.py deleted file mode 100644 index e53d35e..0000000 --- a/venv/lib/python3.8/site-packages/requests/help.py +++ /dev/null @@ -1,119 +0,0 @@ -"""Module containing bug report helper(s).""" -from __future__ import print_function - -import json -import platform -import sys -import ssl - -import idna -import urllib3 -import chardet - -from . import __version__ as requests_version - -try: - from urllib3.contrib import pyopenssl -except ImportError: - pyopenssl = None - OpenSSL = None - cryptography = None -else: - import OpenSSL - import cryptography - - -def _implementation(): - """Return a dict with the Python implementation and version. - - Provide both the name and the version of the Python implementation - currently running. For example, on CPython 2.7.5 it will return - {'name': 'CPython', 'version': '2.7.5'}. - - This function works best on CPython and PyPy: in particular, it probably - doesn't work for Jython or IronPython. Future investigation should be done - to work out the correct shape of the code for those platforms. - """ - implementation = platform.python_implementation() - - if implementation == 'CPython': - implementation_version = platform.python_version() - elif implementation == 'PyPy': - implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, - sys.pypy_version_info.minor, - sys.pypy_version_info.micro) - if sys.pypy_version_info.releaselevel != 'final': - implementation_version = ''.join([ - implementation_version, sys.pypy_version_info.releaselevel - ]) - elif implementation == 'Jython': - implementation_version = platform.python_version() # Complete Guess - elif implementation == 'IronPython': - implementation_version = platform.python_version() # Complete Guess - else: - implementation_version = 'Unknown' - - return {'name': implementation, 'version': implementation_version} - - -def info(): - """Generate information for a bug report.""" - try: - platform_info = { - 'system': platform.system(), - 'release': platform.release(), - } - except IOError: - platform_info = { - 'system': 'Unknown', - 'release': 'Unknown', - } - - implementation_info = _implementation() - urllib3_info = {'version': urllib3.__version__} - chardet_info = {'version': chardet.__version__} - - pyopenssl_info = { - 'version': None, - 'openssl_version': '', - } - if OpenSSL: - pyopenssl_info = { - 'version': OpenSSL.__version__, - 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, - } - cryptography_info = { - 'version': getattr(cryptography, '__version__', ''), - } - idna_info = { - 'version': getattr(idna, '__version__', ''), - } - - system_ssl = ssl.OPENSSL_VERSION_NUMBER - system_ssl_info = { - 'version': '%x' % system_ssl if system_ssl is not None else '' - } - - return { - 'platform': platform_info, - 'implementation': implementation_info, - 'system_ssl': system_ssl_info, - 'using_pyopenssl': pyopenssl is not None, - 'pyOpenSSL': pyopenssl_info, - 'urllib3': urllib3_info, - 'chardet': chardet_info, - 'cryptography': cryptography_info, - 'idna': idna_info, - 'requests': { - 'version': requests_version, - }, - } - - -def main(): - """Pretty-print the bug information as JSON.""" - print(json.dumps(info(), sort_keys=True, indent=2)) - - -if __name__ == '__main__': - main() diff --git a/venv/lib/python3.8/site-packages/requests/hooks.py b/venv/lib/python3.8/site-packages/requests/hooks.py deleted file mode 100644 index 7a51f21..0000000 --- a/venv/lib/python3.8/site-packages/requests/hooks.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.hooks -~~~~~~~~~~~~~~ - -This module provides the capabilities for the Requests hooks system. - -Available hooks: - -``response``: - The response generated from a Request. -""" -HOOKS = ['response'] - - -def default_hooks(): - return {event: [] for event in HOOKS} - -# TODO: response is the only one - - -def dispatch_hook(key, hooks, hook_data, **kwargs): - """Dispatches a hook dictionary on a given piece of data.""" - hooks = hooks or {} - hooks = hooks.get(key) - if hooks: - if hasattr(hooks, '__call__'): - hooks = [hooks] - for hook in hooks: - _hook_data = hook(hook_data, **kwargs) - if _hook_data is not None: - hook_data = _hook_data - return hook_data diff --git a/venv/lib/python3.8/site-packages/requests/models.py b/venv/lib/python3.8/site-packages/requests/models.py deleted file mode 100644 index 62dcd0b..0000000 --- a/venv/lib/python3.8/site-packages/requests/models.py +++ /dev/null @@ -1,953 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.models -~~~~~~~~~~~~~~~ - -This module contains the primary objects that power Requests. -""" - -import datetime -import sys - -# Import encoding now, to avoid implicit import later. -# Implicit import within threads may cause LookupError when standard library is in a ZIP, -# such as in Embedded Python. See https://github.com/requests/requests/issues/3578. -import encodings.idna - -from urllib3.fields import RequestField -from urllib3.filepost import encode_multipart_formdata -from urllib3.util import parse_url -from urllib3.exceptions import ( - DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) - -from io import UnsupportedOperation -from .hooks import default_hooks -from .structures import CaseInsensitiveDict - -from .auth import HTTPBasicAuth -from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar -from .exceptions import ( - HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, - ContentDecodingError, ConnectionError, StreamConsumedError) -from ._internal_utils import to_native_string, unicode_is_ascii -from .utils import ( - guess_filename, get_auth_from_url, requote_uri, - stream_decode_response_unicode, to_key_val_list, parse_header_links, - iter_slices, guess_json_utf, super_len, check_header_validity) -from .compat import ( - Callable, Mapping, - cookielib, urlunparse, urlsplit, urlencode, str, bytes, - is_py2, chardet, builtin_str, basestring) -from .compat import json as complexjson -from .status_codes import codes - -#: The set of HTTP status codes that indicate an automatically -#: processable redirect. -REDIRECT_STATI = ( - codes.moved, # 301 - codes.found, # 302 - codes.other, # 303 - codes.temporary_redirect, # 307 - codes.permanent_redirect, # 308 -) - -DEFAULT_REDIRECT_LIMIT = 30 -CONTENT_CHUNK_SIZE = 10 * 1024 -ITER_CHUNK_SIZE = 512 - - -class RequestEncodingMixin(object): - @property - def path_url(self): - """Build the path URL to use.""" - - url = [] - - p = urlsplit(self.url) - - path = p.path - if not path: - path = '/' - - url.append(path) - - query = p.query - if query: - url.append('?') - url.append(query) - - return ''.join(url) - - @staticmethod - def _encode_params(data): - """Encode parameters in a piece of data. - - Will successfully encode parameters when passed as a dict or a list of - 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary - if parameters are supplied as a dict. - """ - - if isinstance(data, (str, bytes)): - return data - elif hasattr(data, 'read'): - return data - elif hasattr(data, '__iter__'): - result = [] - for k, vs in to_key_val_list(data): - if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): - vs = [vs] - for v in vs: - if v is not None: - result.append( - (k.encode('utf-8') if isinstance(k, str) else k, - v.encode('utf-8') if isinstance(v, str) else v)) - return urlencode(result, doseq=True) - else: - return data - - @staticmethod - def _encode_files(files, data): - """Build the body for a multipart/form-data request. - - Will successfully encode files when passed as a dict or a list of - tuples. Order is retained if data is a list of tuples but arbitrary - if parameters are supplied as a dict. - The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) - or 4-tuples (filename, fileobj, contentype, custom_headers). - """ - if (not files): - raise ValueError("Files must be provided.") - elif isinstance(data, basestring): - raise ValueError("Data must not be a string.") - - new_fields = [] - fields = to_key_val_list(data or {}) - files = to_key_val_list(files or {}) - - for field, val in fields: - if isinstance(val, basestring) or not hasattr(val, '__iter__'): - val = [val] - for v in val: - if v is not None: - # Don't call str() on bytestrings: in Py3 it all goes wrong. - if not isinstance(v, bytes): - v = str(v) - - new_fields.append( - (field.decode('utf-8') if isinstance(field, bytes) else field, - v.encode('utf-8') if isinstance(v, str) else v)) - - for (k, v) in files: - # support for explicit filename - ft = None - fh = None - if isinstance(v, (tuple, list)): - if len(v) == 2: - fn, fp = v - elif len(v) == 3: - fn, fp, ft = v - else: - fn, fp, ft, fh = v - else: - fn = guess_filename(v) or k - fp = v - - if isinstance(fp, (str, bytes, bytearray)): - fdata = fp - elif hasattr(fp, 'read'): - fdata = fp.read() - elif fp is None: - continue - else: - fdata = fp - - rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) - rf.make_multipart(content_type=ft) - new_fields.append(rf) - - body, content_type = encode_multipart_formdata(new_fields) - - return body, content_type - - -class RequestHooksMixin(object): - def register_hook(self, event, hook): - """Properly register a hook.""" - - if event not in self.hooks: - raise ValueError('Unsupported event specified, with event name "%s"' % (event)) - - if isinstance(hook, Callable): - self.hooks[event].append(hook) - elif hasattr(hook, '__iter__'): - self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) - - def deregister_hook(self, event, hook): - """Deregister a previously registered hook. - Returns True if the hook existed, False if not. - """ - - try: - self.hooks[event].remove(hook) - return True - except ValueError: - return False - - -class Request(RequestHooksMixin): - """A user-created :class:`Request <Request>` object. - - Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server. - - :param method: HTTP method to use. - :param url: URL to send. - :param headers: dictionary of headers to send. - :param files: dictionary of {filename: fileobject} files to multipart upload. - :param data: the body to attach to the request. If a dictionary or - list of tuples ``[(key, value)]`` is provided, form-encoding will - take place. - :param json: json for the body to attach to the request (if files or data is not specified). - :param params: URL parameters to append to the URL. If a dictionary or - list of tuples ``[(key, value)]`` is provided, form-encoding will - take place. - :param auth: Auth handler or (user, pass) tuple. - :param cookies: dictionary or CookieJar of cookies to attach to this request. - :param hooks: dictionary of callback hooks, for internal usage. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'https://httpbin.org/get') - >>> req.prepare() - <PreparedRequest [GET]> - """ - - def __init__(self, - method=None, url=None, headers=None, files=None, data=None, - params=None, auth=None, cookies=None, hooks=None, json=None): - - # Default empty dicts for dict params. - data = [] if data is None else data - files = [] if files is None else files - headers = {} if headers is None else headers - params = {} if params is None else params - hooks = {} if hooks is None else hooks - - self.hooks = default_hooks() - for (k, v) in list(hooks.items()): - self.register_hook(event=k, hook=v) - - self.method = method - self.url = url - self.headers = headers - self.files = files - self.data = data - self.json = json - self.params = params - self.auth = auth - self.cookies = cookies - - def __repr__(self): - return '<Request [%s]>' % (self.method) - - def prepare(self): - """Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it.""" - p = PreparedRequest() - p.prepare( - method=self.method, - url=self.url, - headers=self.headers, - files=self.files, - data=self.data, - json=self.json, - params=self.params, - auth=self.auth, - cookies=self.cookies, - hooks=self.hooks, - ) - return p - - -class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): - """The fully mutable :class:`PreparedRequest <PreparedRequest>` object, - containing the exact bytes that will be sent to the server. - - Generated from either a :class:`Request <Request>` object or manually. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'https://httpbin.org/get') - >>> r = req.prepare() - <PreparedRequest [GET]> - - >>> s = requests.Session() - >>> s.send(r) - <Response [200]> - """ - - def __init__(self): - #: HTTP verb to send to the server. - self.method = None - #: HTTP URL to send the request to. - self.url = None - #: dictionary of HTTP headers. - self.headers = None - # The `CookieJar` used to create the Cookie header will be stored here - # after prepare_cookies is called - self._cookies = None - #: request body to send to the server. - self.body = None - #: dictionary of callback hooks, for internal usage. - self.hooks = default_hooks() - #: integer denoting starting position of a readable file-like body. - self._body_position = None - - def prepare(self, - method=None, url=None, headers=None, files=None, data=None, - params=None, auth=None, cookies=None, hooks=None, json=None): - """Prepares the entire request with the given parameters.""" - - self.prepare_method(method) - self.prepare_url(url, params) - self.prepare_headers(headers) - self.prepare_cookies(cookies) - self.prepare_body(data, files, json) - self.prepare_auth(auth, url) - - # Note that prepare_auth must be last to enable authentication schemes - # such as OAuth to work on a fully prepared request. - - # This MUST go after prepare_auth. Authenticators could add a hook - self.prepare_hooks(hooks) - - def __repr__(self): - return '<PreparedRequest [%s]>' % (self.method) - - def copy(self): - p = PreparedRequest() - p.method = self.method - p.url = self.url - p.headers = self.headers.copy() if self.headers is not None else None - p._cookies = _copy_cookie_jar(self._cookies) - p.body = self.body - p.hooks = self.hooks - p._body_position = self._body_position - return p - - def prepare_method(self, method): - """Prepares the given HTTP method.""" - self.method = method - if self.method is not None: - self.method = to_native_string(self.method.upper()) - - @staticmethod - def _get_idna_encoded_host(host): - import idna - - try: - host = idna.encode(host, uts46=True).decode('utf-8') - except idna.IDNAError: - raise UnicodeError - return host - - def prepare_url(self, url, params): - """Prepares the given HTTP URL.""" - #: Accept objects that have string representations. - #: We're unable to blindly call unicode/str functions - #: as this will include the bytestring indicator (b'') - #: on python 3.x. - #: https://github.com/requests/requests/pull/2238 - if isinstance(url, bytes): - url = url.decode('utf8') - else: - url = unicode(url) if is_py2 else str(url) - - # Remove leading whitespaces from url - url = url.lstrip() - - # Don't do any URL preparation for non-HTTP schemes like `mailto`, - # `data` etc to work around exceptions from `url_parse`, which - # handles RFC 3986 only. - if ':' in url and not url.lower().startswith('http'): - self.url = url - return - - # Support for unicode domain names and paths. - try: - scheme, auth, host, port, path, query, fragment = parse_url(url) - except LocationParseError as e: - raise InvalidURL(*e.args) - - if not scheme: - error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?") - error = error.format(to_native_string(url, 'utf8')) - - raise MissingSchema(error) - - if not host: - raise InvalidURL("Invalid URL %r: No host supplied" % url) - - # In general, we want to try IDNA encoding the hostname if the string contains - # non-ASCII characters. This allows users to automatically get the correct IDNA - # behaviour. For strings containing only ASCII characters, we need to also verify - # it doesn't start with a wildcard (*), before allowing the unencoded hostname. - if not unicode_is_ascii(host): - try: - host = self._get_idna_encoded_host(host) - except UnicodeError: - raise InvalidURL('URL has an invalid label.') - elif host.startswith(u'*'): - raise InvalidURL('URL has an invalid label.') - - # Carefully reconstruct the network location - netloc = auth or '' - if netloc: - netloc += '@' - netloc += host - if port: - netloc += ':' + str(port) - - # Bare domains aren't valid URLs. - if not path: - path = '/' - - if is_py2: - if isinstance(scheme, str): - scheme = scheme.encode('utf-8') - if isinstance(netloc, str): - netloc = netloc.encode('utf-8') - if isinstance(path, str): - path = path.encode('utf-8') - if isinstance(query, str): - query = query.encode('utf-8') - if isinstance(fragment, str): - fragment = fragment.encode('utf-8') - - if isinstance(params, (str, bytes)): - params = to_native_string(params) - - enc_params = self._encode_params(params) - if enc_params: - if query: - query = '%s&%s' % (query, enc_params) - else: - query = enc_params - - url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) - self.url = url - - def prepare_headers(self, headers): - """Prepares the given HTTP headers.""" - - self.headers = CaseInsensitiveDict() - if headers: - for header in headers.items(): - # Raise exception on invalid header value. - check_header_validity(header) - name, value = header - self.headers[to_native_string(name)] = value - - def prepare_body(self, data, files, json=None): - """Prepares the given HTTP body data.""" - - # Check if file, fo, generator, iterator. - # If not, run through normal process. - - # Nottin' on you. - body = None - content_type = None - - if not data and json is not None: - # urllib3 requires a bytes-like body. Python 2's json.dumps - # provides this natively, but Python 3 gives a Unicode string. - content_type = 'application/json' - body = complexjson.dumps(json) - if not isinstance(body, bytes): - body = body.encode('utf-8') - - is_stream = all([ - hasattr(data, '__iter__'), - not isinstance(data, (basestring, list, tuple, Mapping)) - ]) - - try: - length = super_len(data) - except (TypeError, AttributeError, UnsupportedOperation): - length = None - - if is_stream: - body = data - - if getattr(body, 'tell', None) is not None: - # Record the current file position before reading. - # This will allow us to rewind a file in the event - # of a redirect. - try: - self._body_position = body.tell() - except (IOError, OSError): - # This differentiates from None, allowing us to catch - # a failed `tell()` later when trying to rewind the body - self._body_position = object() - - if files: - raise NotImplementedError('Streamed bodies and files are mutually exclusive.') - - if length: - self.headers['Content-Length'] = builtin_str(length) - else: - self.headers['Transfer-Encoding'] = 'chunked' - else: - # Multi-part file uploads. - if files: - (body, content_type) = self._encode_files(files, data) - else: - if data: - body = self._encode_params(data) - if isinstance(data, basestring) or hasattr(data, 'read'): - content_type = None - else: - content_type = 'application/x-www-form-urlencoded' - - self.prepare_content_length(body) - - # Add content-type if it wasn't explicitly provided. - if content_type and ('content-type' not in self.headers): - self.headers['Content-Type'] = content_type - - self.body = body - - def prepare_content_length(self, body): - """Prepare Content-Length header based on request method and body""" - if body is not None: - length = super_len(body) - if length: - # If length exists, set it. Otherwise, we fallback - # to Transfer-Encoding: chunked. - self.headers['Content-Length'] = builtin_str(length) - elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None: - # Set Content-Length to 0 for methods that can have a body - # but don't provide one. (i.e. not GET or HEAD) - self.headers['Content-Length'] = '0' - - def prepare_auth(self, auth, url=''): - """Prepares the given HTTP auth data.""" - - # If no Auth is explicitly provided, extract it from the URL first. - if auth is None: - url_auth = get_auth_from_url(self.url) - auth = url_auth if any(url_auth) else None - - if auth: - if isinstance(auth, tuple) and len(auth) == 2: - # special-case basic HTTP auth - auth = HTTPBasicAuth(*auth) - - # Allow auth to make its changes. - r = auth(self) - - # Update self to reflect the auth changes. - self.__dict__.update(r.__dict__) - - # Recompute Content-Length - self.prepare_content_length(self.body) - - def prepare_cookies(self, cookies): - """Prepares the given HTTP cookie data. - - This function eventually generates a ``Cookie`` header from the - given cookies using cookielib. Due to cookielib's design, the header - will not be regenerated if it already exists, meaning this function - can only be called once for the life of the - :class:`PreparedRequest <PreparedRequest>` object. Any subsequent calls - to ``prepare_cookies`` will have no actual effect, unless the "Cookie" - header is removed beforehand. - """ - if isinstance(cookies, cookielib.CookieJar): - self._cookies = cookies - else: - self._cookies = cookiejar_from_dict(cookies) - - cookie_header = get_cookie_header(self._cookies, self) - if cookie_header is not None: - self.headers['Cookie'] = cookie_header - - def prepare_hooks(self, hooks): - """Prepares the given hooks.""" - # hooks can be passed as None to the prepare method and to this - # method. To prevent iterating over None, simply use an empty list - # if hooks is False-y - hooks = hooks or [] - for event in hooks: - self.register_hook(event, hooks[event]) - - -class Response(object): - """The :class:`Response <Response>` object, which contains a - server's response to an HTTP request. - """ - - __attrs__ = [ - '_content', 'status_code', 'headers', 'url', 'history', - 'encoding', 'reason', 'cookies', 'elapsed', 'request' - ] - - def __init__(self): - self._content = False - self._content_consumed = False - self._next = None - - #: Integer Code of responded HTTP Status, e.g. 404 or 200. - self.status_code = None - - #: Case-insensitive Dictionary of Response Headers. - #: For example, ``headers['content-encoding']`` will return the - #: value of a ``'Content-Encoding'`` response header. - self.headers = CaseInsensitiveDict() - - #: File-like object representation of response (for advanced usage). - #: Use of ``raw`` requires that ``stream=True`` be set on the request. - # This requirement does not apply for use internally to Requests. - self.raw = None - - #: Final URL location of Response. - self.url = None - - #: Encoding to decode with when accessing r.text. - self.encoding = None - - #: A list of :class:`Response <Response>` objects from - #: the history of the Request. Any redirect responses will end - #: up here. The list is sorted from the oldest to the most recent request. - self.history = [] - - #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". - self.reason = None - - #: A CookieJar of Cookies the server sent back. - self.cookies = cookiejar_from_dict({}) - - #: The amount of time elapsed between sending the request - #: and the arrival of the response (as a timedelta). - #: This property specifically measures the time taken between sending - #: the first byte of the request and finishing parsing the headers. It - #: is therefore unaffected by consuming the response content or the - #: value of the ``stream`` keyword argument. - self.elapsed = datetime.timedelta(0) - - #: The :class:`PreparedRequest <PreparedRequest>` object to which this - #: is a response. - self.request = None - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def __getstate__(self): - # Consume everything; accessing the content attribute makes - # sure the content has been fully read. - if not self._content_consumed: - self.content - - return {attr: getattr(self, attr, None) for attr in self.__attrs__} - - def __setstate__(self, state): - for name, value in state.items(): - setattr(self, name, value) - - # pickled objects do not have .raw - setattr(self, '_content_consumed', True) - setattr(self, 'raw', None) - - def __repr__(self): - return '<Response [%s]>' % (self.status_code) - - def __bool__(self): - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __nonzero__(self): - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __iter__(self): - """Allows you to use a response as an iterator.""" - return self.iter_content(128) - - @property - def ok(self): - """Returns True if :attr:`status_code` is less than 400, False if not. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - try: - self.raise_for_status() - except HTTPError: - return False - return True - - @property - def is_redirect(self): - """True if this Response is a well-formed HTTP redirect that could have - been processed automatically (by :meth:`Session.resolve_redirects`). - """ - return ('location' in self.headers and self.status_code in REDIRECT_STATI) - - @property - def is_permanent_redirect(self): - """True if this Response one of the permanent versions of redirect.""" - return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) - - @property - def next(self): - """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" - return self._next - - @property - def apparent_encoding(self): - """The apparent encoding, provided by the chardet library.""" - return chardet.detect(self.content)['encoding'] - - def iter_content(self, chunk_size=1, decode_unicode=False): - """Iterates over the response data. When stream=True is set on the - request, this avoids reading the content at once into memory for - large responses. The chunk size is the number of bytes it should - read into memory. This is not necessarily the length of each item - returned as decoding can take place. - - chunk_size must be of type int or None. A value of None will - function differently depending on the value of `stream`. - stream=True will read data as it arrives in whatever size the - chunks are received. If stream=False, data is returned as - a single chunk. - - If decode_unicode is True, content will be decoded using the best - available encoding based on the response. - """ - - def generate(): - # Special case for urllib3. - if hasattr(self.raw, 'stream'): - try: - for chunk in self.raw.stream(chunk_size, decode_content=True): - yield chunk - except ProtocolError as e: - raise ChunkedEncodingError(e) - except DecodeError as e: - raise ContentDecodingError(e) - except ReadTimeoutError as e: - raise ConnectionError(e) - else: - # Standard file-like object. - while True: - chunk = self.raw.read(chunk_size) - if not chunk: - break - yield chunk - - self._content_consumed = True - - if self._content_consumed and isinstance(self._content, bool): - raise StreamConsumedError() - elif chunk_size is not None and not isinstance(chunk_size, int): - raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size)) - # simulate reading small chunks of the content - reused_chunks = iter_slices(self._content, chunk_size) - - stream_chunks = generate() - - chunks = reused_chunks if self._content_consumed else stream_chunks - - if decode_unicode: - chunks = stream_decode_response_unicode(chunks, self) - - return chunks - - def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None): - """Iterates over the response data, one line at a time. When - stream=True is set on the request, this avoids reading the - content at once into memory for large responses. - - .. note:: This method is not reentrant safe. - """ - - pending = None - - for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): - - if pending is not None: - chunk = pending + chunk - - if delimiter: - lines = chunk.split(delimiter) - else: - lines = chunk.splitlines() - - if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: - pending = lines.pop() - else: - pending = None - - for line in lines: - yield line - - if pending is not None: - yield pending - - @property - def content(self): - """Content of the response, in bytes.""" - - if self._content is False: - # Read the contents. - if self._content_consumed: - raise RuntimeError( - 'The content for this response was already consumed') - - if self.status_code == 0 or self.raw is None: - self._content = None - else: - self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b'' - - self._content_consumed = True - # don't need to release the connection; that's been handled by urllib3 - # since we exhausted the data. - return self._content - - @property - def text(self): - """Content of the response, in unicode. - - If Response.encoding is None, encoding will be guessed using - ``chardet``. - - The encoding of the response content is determined based solely on HTTP - headers, following RFC 2616 to the letter. If you can take advantage of - non-HTTP knowledge to make a better guess at the encoding, you should - set ``r.encoding`` appropriately before accessing this property. - """ - - # Try charset from content-type - content = None - encoding = self.encoding - - if not self.content: - return str('') - - # Fallback to auto-detected encoding. - if self.encoding is None: - encoding = self.apparent_encoding - - # Decode unicode from given encoding. - try: - content = str(self.content, encoding, errors='replace') - except (LookupError, TypeError): - # A LookupError is raised if the encoding was not found which could - # indicate a misspelling or similar mistake. - # - # A TypeError can be raised if encoding is None - # - # So we try blindly encoding. - content = str(self.content, errors='replace') - - return content - - def json(self, **kwargs): - r"""Returns the json-encoded content of a response, if any. - - :param \*\*kwargs: Optional arguments that ``json.loads`` takes. - :raises ValueError: If the response body does not contain valid json. - """ - - if not self.encoding and self.content and len(self.content) > 3: - # No encoding set. JSON RFC 4627 section 3 states we should expect - # UTF-8, -16 or -32. Detect which one to use; If the detection or - # decoding fails, fall back to `self.text` (using chardet to make - # a best guess). - encoding = guess_json_utf(self.content) - if encoding is not None: - try: - return complexjson.loads( - self.content.decode(encoding), **kwargs - ) - except UnicodeDecodeError: - # Wrong UTF codec detected; usually because it's not UTF-8 - # but some other 8-bit codec. This is an RFC violation, - # and the server didn't bother to tell us what codec *was* - # used. - pass - return complexjson.loads(self.text, **kwargs) - - @property - def links(self): - """Returns the parsed header links of the response, if any.""" - - header = self.headers.get('link') - - # l = MultiDict() - l = {} - - if header: - links = parse_header_links(header) - - for link in links: - key = link.get('rel') or link.get('url') - l[key] = link - - return l - - def raise_for_status(self): - """Raises stored :class:`HTTPError`, if one occurred.""" - - http_error_msg = '' - if isinstance(self.reason, bytes): - # We attempt to decode utf-8 first because some servers - # choose to localize their reason strings. If the string - # isn't utf-8, we fall back to iso-8859-1 for all other - # encodings. (See PR #3538) - try: - reason = self.reason.decode('utf-8') - except UnicodeDecodeError: - reason = self.reason.decode('iso-8859-1') - else: - reason = self.reason - - if 400 <= self.status_code < 500: - http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url) - - elif 500 <= self.status_code < 600: - http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url) - - if http_error_msg: - raise HTTPError(http_error_msg, response=self) - - def close(self): - """Releases the connection back to the pool. Once this method has been - called the underlying ``raw`` object must not be accessed again. - - *Note: Should not normally need to be called explicitly.* - """ - if not self._content_consumed: - self.raw.close() - - release_conn = getattr(self.raw, 'release_conn', None) - if release_conn is not None: - release_conn() diff --git a/venv/lib/python3.8/site-packages/requests/packages.py b/venv/lib/python3.8/site-packages/requests/packages.py deleted file mode 100644 index 7232fe0..0000000 --- a/venv/lib/python3.8/site-packages/requests/packages.py +++ /dev/null @@ -1,14 +0,0 @@ -import sys - -# This code exists for backwards compatibility reasons. -# I don't like it either. Just look the other way. :) - -for package in ('urllib3', 'idna', 'chardet'): - locals()[package] = __import__(package) - # This traversal is apparently necessary such that the identities are - # preserved (requests.packages.urllib3.* is urllib3.*) - for mod in list(sys.modules): - if mod == package or mod.startswith(package + '.'): - sys.modules['requests.packages.' + mod] = sys.modules[mod] - -# Kinda cool, though, right? diff --git a/venv/lib/python3.8/site-packages/requests/sessions.py b/venv/lib/python3.8/site-packages/requests/sessions.py deleted file mode 100644 index d73d700..0000000 --- a/venv/lib/python3.8/site-packages/requests/sessions.py +++ /dev/null @@ -1,770 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.session -~~~~~~~~~~~~~~~~ - -This module provides a Session object to manage and persist settings across -requests (cookies, auth, proxies). -""" -import os -import sys -import time -from datetime import timedelta - -from .auth import _basic_auth_str -from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse, Mapping -from .cookies import ( - cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) -from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT -from .hooks import default_hooks, dispatch_hook -from ._internal_utils import to_native_string -from .utils import to_key_val_list, default_headers, DEFAULT_PORTS -from .exceptions import ( - TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) - -from .structures import CaseInsensitiveDict -from .adapters import HTTPAdapter - -from .utils import ( - requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, - get_auth_from_url, rewind_body -) - -from .status_codes import codes - -# formerly defined here, reexposed here for backward compatibility -from .models import REDIRECT_STATI - -# Preferred clock, based on which one is more accurate on a given system. -if sys.platform == 'win32': - try: # Python 3.4+ - preferred_clock = time.perf_counter - except AttributeError: # Earlier than Python 3. - preferred_clock = time.clock -else: - preferred_clock = time.time - - -def merge_setting(request_setting, session_setting, dict_class=OrderedDict): - """Determines appropriate setting for a given request, taking into account - the explicit setting on that request, and the setting in the session. If a - setting is a dictionary, they will be merged together using `dict_class` - """ - - if session_setting is None: - return request_setting - - if request_setting is None: - return session_setting - - # Bypass if not a dictionary (e.g. verify) - if not ( - isinstance(session_setting, Mapping) and - isinstance(request_setting, Mapping) - ): - return request_setting - - merged_setting = dict_class(to_key_val_list(session_setting)) - merged_setting.update(to_key_val_list(request_setting)) - - # Remove keys that are set to None. Extract keys first to avoid altering - # the dictionary during iteration. - none_keys = [k for (k, v) in merged_setting.items() if v is None] - for key in none_keys: - del merged_setting[key] - - return merged_setting - - -def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): - """Properly merges both requests and session hooks. - - This is necessary because when request_hooks == {'response': []}, the - merge breaks Session hooks entirely. - """ - if session_hooks is None or session_hooks.get('response') == []: - return request_hooks - - if request_hooks is None or request_hooks.get('response') == []: - return session_hooks - - return merge_setting(request_hooks, session_hooks, dict_class) - - -class SessionRedirectMixin(object): - - def get_redirect_target(self, resp): - """Receives a Response. Returns a redirect URI or ``None``""" - # Due to the nature of how requests processes redirects this method will - # be called at least once upon the original response and at least twice - # on each subsequent redirect response (if any). - # If a custom mixin is used to handle this logic, it may be advantageous - # to cache the redirect location onto the response object as a private - # attribute. - if resp.is_redirect: - location = resp.headers['location'] - # Currently the underlying http module on py3 decode headers - # in latin1, but empirical evidence suggests that latin1 is very - # rarely used with non-ASCII characters in HTTP headers. - # It is more likely to get UTF8 header rather than latin1. - # This causes incorrect handling of UTF8 encoded location headers. - # To solve this, we re-encode the location in latin1. - if is_py3: - location = location.encode('latin1') - return to_native_string(location, 'utf8') - return None - - def should_strip_auth(self, old_url, new_url): - """Decide whether Authorization header should be removed when redirecting""" - old_parsed = urlparse(old_url) - new_parsed = urlparse(new_url) - if old_parsed.hostname != new_parsed.hostname: - return True - # Special case: allow http -> https redirect when using the standard - # ports. This isn't specified by RFC 7235, but is kept to avoid - # breaking backwards compatibility with older versions of requests - # that allowed any redirects on the same host. - if (old_parsed.scheme == 'http' and old_parsed.port in (80, None) - and new_parsed.scheme == 'https' and new_parsed.port in (443, None)): - return False - - # Handle default port usage corresponding to scheme. - changed_port = old_parsed.port != new_parsed.port - changed_scheme = old_parsed.scheme != new_parsed.scheme - default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) - if (not changed_scheme and old_parsed.port in default_port - and new_parsed.port in default_port): - return False - - # Standard case: root URI must match - return changed_port or changed_scheme - - def resolve_redirects(self, resp, req, stream=False, timeout=None, - verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): - """Receives a Response. Returns a generator of Responses or Requests.""" - - hist = [] # keep track of history - - url = self.get_redirect_target(resp) - previous_fragment = urlparse(req.url).fragment - while url: - prepared_request = req.copy() - - # Update history and keep track of redirects. - # resp.history must ignore the original request in this loop - hist.append(resp) - resp.history = hist[1:] - - try: - resp.content # Consume socket so it can be released - except (ChunkedEncodingError, ContentDecodingError, RuntimeError): - resp.raw.read(decode_content=False) - - if len(resp.history) >= self.max_redirects: - raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) - - # Release the connection back into the pool. - resp.close() - - # Handle redirection without scheme (see: RFC 1808 Section 4) - if url.startswith('//'): - parsed_rurl = urlparse(resp.url) - url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url) - - # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) - parsed = urlparse(url) - if parsed.fragment == '' and previous_fragment: - parsed = parsed._replace(fragment=previous_fragment) - elif parsed.fragment: - previous_fragment = parsed.fragment - url = parsed.geturl() - - # Facilitate relative 'location' headers, as allowed by RFC 7231. - # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') - # Compliant with RFC3986, we percent encode the url. - if not parsed.netloc: - url = urljoin(resp.url, requote_uri(url)) - else: - url = requote_uri(url) - - prepared_request.url = to_native_string(url) - - self.rebuild_method(prepared_request, resp) - - # https://github.com/requests/requests/issues/1084 - if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): - # https://github.com/requests/requests/issues/3490 - purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') - for header in purged_headers: - prepared_request.headers.pop(header, None) - prepared_request.body = None - - headers = prepared_request.headers - try: - del headers['Cookie'] - except KeyError: - pass - - # Extract any cookies sent on the response to the cookiejar - # in the new request. Because we've mutated our copied prepared - # request, use the old one that we haven't yet touched. - extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) - merge_cookies(prepared_request._cookies, self.cookies) - prepared_request.prepare_cookies(prepared_request._cookies) - - # Rebuild auth and proxy information. - proxies = self.rebuild_proxies(prepared_request, proxies) - self.rebuild_auth(prepared_request, resp) - - # A failed tell() sets `_body_position` to `object()`. This non-None - # value ensures `rewindable` will be True, allowing us to raise an - # UnrewindableBodyError, instead of hanging the connection. - rewindable = ( - prepared_request._body_position is not None and - ('Content-Length' in headers or 'Transfer-Encoding' in headers) - ) - - # Attempt to rewind consumed file-like object. - if rewindable: - rewind_body(prepared_request) - - # Override the original request. - req = prepared_request - - if yield_requests: - yield req - else: - - resp = self.send( - req, - stream=stream, - timeout=timeout, - verify=verify, - cert=cert, - proxies=proxies, - allow_redirects=False, - **adapter_kwargs - ) - - extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) - - # extract redirect url, if any, for the next loop - url = self.get_redirect_target(resp) - yield resp - - def rebuild_auth(self, prepared_request, response): - """When being redirected we may want to strip authentication from the - request to avoid leaking credentials. This method intelligently removes - and reapplies authentication where possible to avoid credential loss. - """ - headers = prepared_request.headers - url = prepared_request.url - - if 'Authorization' in headers and self.should_strip_auth(response.request.url, url): - # If we get redirected to a new host, we should strip out any - # authentication headers. - del headers['Authorization'] - - # .netrc might have more auth for us on our new host. - new_auth = get_netrc_auth(url) if self.trust_env else None - if new_auth is not None: - prepared_request.prepare_auth(new_auth) - - return - - def rebuild_proxies(self, prepared_request, proxies): - """This method re-evaluates the proxy configuration by considering the - environment variables. If we are redirected to a URL covered by - NO_PROXY, we strip the proxy configuration. Otherwise, we set missing - proxy keys for this URL (in case they were stripped by a previous - redirect). - - This method also replaces the Proxy-Authorization header where - necessary. - - :rtype: dict - """ - proxies = proxies if proxies is not None else {} - headers = prepared_request.headers - url = prepared_request.url - scheme = urlparse(url).scheme - new_proxies = proxies.copy() - no_proxy = proxies.get('no_proxy') - - bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy) - if self.trust_env and not bypass_proxy: - environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) - - proxy = environ_proxies.get(scheme, environ_proxies.get('all')) - - if proxy: - new_proxies.setdefault(scheme, proxy) - - if 'Proxy-Authorization' in headers: - del headers['Proxy-Authorization'] - - try: - username, password = get_auth_from_url(new_proxies[scheme]) - except KeyError: - username, password = None, None - - if username and password: - headers['Proxy-Authorization'] = _basic_auth_str(username, password) - - return new_proxies - - def rebuild_method(self, prepared_request, response): - """When being redirected we may want to change the method of the request - based on certain specs or browser behavior. - """ - method = prepared_request.method - - # https://tools.ietf.org/html/rfc7231#section-6.4.4 - if response.status_code == codes.see_other and method != 'HEAD': - method = 'GET' - - # Do what the browsers do, despite standards... - # First, turn 302s into GETs. - if response.status_code == codes.found and method != 'HEAD': - method = 'GET' - - # Second, if a POST is responded to with a 301, turn it into a GET. - # This bizarre behaviour is explained in Issue 1704. - if response.status_code == codes.moved and method == 'POST': - method = 'GET' - - prepared_request.method = method - - -class Session(SessionRedirectMixin): - """A Requests session. - - Provides cookie persistence, connection-pooling, and configuration. - - Basic Usage:: - - >>> import requests - >>> s = requests.Session() - >>> s.get('https://httpbin.org/get') - <Response [200]> - - Or as a context manager:: - - >>> with requests.Session() as s: - >>> s.get('https://httpbin.org/get') - <Response [200]> - """ - - __attrs__ = [ - 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', - 'cert', 'prefetch', 'adapters', 'stream', 'trust_env', - 'max_redirects', - ] - - def __init__(self): - - #: A case-insensitive dictionary of headers to be sent on each - #: :class:`Request <Request>` sent from this - #: :class:`Session <Session>`. - self.headers = default_headers() - - #: Default Authentication tuple or object to attach to - #: :class:`Request <Request>`. - self.auth = None - - #: Dictionary mapping protocol or protocol and host to the URL of the proxy - #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to - #: be used on each :class:`Request <Request>`. - self.proxies = {} - - #: Event-handling hooks. - self.hooks = default_hooks() - - #: Dictionary of querystring data to attach to each - #: :class:`Request <Request>`. The dictionary values may be lists for - #: representing multivalued query parameters. - self.params = {} - - #: Stream response content default. - self.stream = False - - #: SSL Verification default. - self.verify = True - - #: SSL client certificate default, if String, path to ssl client - #: cert file (.pem). If Tuple, ('cert', 'key') pair. - self.cert = None - - #: Maximum number of redirects allowed. If the request exceeds this - #: limit, a :class:`TooManyRedirects` exception is raised. - #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is - #: 30. - self.max_redirects = DEFAULT_REDIRECT_LIMIT - - #: Trust environment settings for proxy configuration, default - #: authentication and similar. - self.trust_env = True - - #: A CookieJar containing all currently outstanding cookies set on this - #: session. By default it is a - #: :class:`RequestsCookieJar <requests.cookies.RequestsCookieJar>`, but - #: may be any other ``cookielib.CookieJar`` compatible object. - self.cookies = cookiejar_from_dict({}) - - # Default connection adapters. - self.adapters = OrderedDict() - self.mount('https://', HTTPAdapter()) - self.mount('http://', HTTPAdapter()) - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def prepare_request(self, request): - """Constructs a :class:`PreparedRequest <PreparedRequest>` for - transmission and returns it. The :class:`PreparedRequest` has settings - merged from the :class:`Request <Request>` instance and those of the - :class:`Session`. - - :param request: :class:`Request` instance to prepare with this - session's settings. - :rtype: requests.PreparedRequest - """ - cookies = request.cookies or {} - - # Bootstrap CookieJar. - if not isinstance(cookies, cookielib.CookieJar): - cookies = cookiejar_from_dict(cookies) - - # Merge with session cookies - merged_cookies = merge_cookies( - merge_cookies(RequestsCookieJar(), self.cookies), cookies) - - # Set environment's basic authentication if not explicitly set. - auth = request.auth - if self.trust_env and not auth and not self.auth: - auth = get_netrc_auth(request.url) - - p = PreparedRequest() - p.prepare( - method=request.method.upper(), - url=request.url, - files=request.files, - data=request.data, - json=request.json, - headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), - params=merge_setting(request.params, self.params), - auth=merge_setting(auth, self.auth), - cookies=merged_cookies, - hooks=merge_hooks(request.hooks, self.hooks), - ) - return p - - def request(self, method, url, - params=None, data=None, headers=None, cookies=None, files=None, - auth=None, timeout=None, allow_redirects=True, proxies=None, - hooks=None, stream=None, verify=None, cert=None, json=None): - """Constructs a :class:`Request <Request>`, prepares it and sends it. - Returns :class:`Response <Response>` object. - - :param method: method for the new :class:`Request` object. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query - string for the :class:`Request`. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json to send in the body of the - :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the - :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the - :class:`Request`. - :param files: (optional) Dictionary of ``'filename': file-like-objects`` - for multipart encoding upload. - :param auth: (optional) Auth tuple or callable to enable - Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) <timeouts>` tuple. - :type timeout: float or tuple - :param allow_redirects: (optional) Set to True by default. - :type allow_redirects: bool - :param proxies: (optional) Dictionary mapping protocol or protocol and - hostname to the URL of the proxy. - :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 - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use. Defaults to ``True``. - :param cert: (optional) if String, path to ssl client cert file (.pem). - If Tuple, ('cert', 'key') pair. - :rtype: requests.Response - """ - # Create the Request. - req = Request( - method=method.upper(), - url=url, - headers=headers, - files=files, - data=data or {}, - json=json, - params=params or {}, - auth=auth, - cookies=cookies, - hooks=hooks, - ) - prep = self.prepare_request(req) - - proxies = proxies or {} - - settings = self.merge_environment_settings( - prep.url, proxies, stream, verify, cert - ) - - # Send the request. - send_kwargs = { - 'timeout': timeout, - 'allow_redirects': allow_redirects, - } - send_kwargs.update(settings) - resp = self.send(prep, **send_kwargs) - - return resp - - def get(self, url, **kwargs): - r"""Sends a GET request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return self.request('GET', url, **kwargs) - - def options(self, url, **kwargs): - r"""Sends a OPTIONS request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return self.request('OPTIONS', url, **kwargs) - - def head(self, url, **kwargs): - r"""Sends a HEAD request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', False) - return self.request('HEAD', url, **kwargs) - - def post(self, url, data=None, json=None, **kwargs): - r"""Sends a POST request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('POST', url, data=data, json=json, **kwargs) - - def put(self, url, data=None, **kwargs): - r"""Sends a PUT request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('PUT', url, data=data, **kwargs) - - def patch(self, url, data=None, **kwargs): - r"""Sends a PATCH request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('PATCH', url, data=data, **kwargs) - - def delete(self, url, **kwargs): - r"""Sends a DELETE request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('DELETE', url, **kwargs) - - def send(self, request, **kwargs): - """Send a given PreparedRequest. - - :rtype: requests.Response - """ - # Set defaults that the hooks can utilize to ensure they always have - # the correct parameters to reproduce the previous request. - kwargs.setdefault('stream', self.stream) - kwargs.setdefault('verify', self.verify) - kwargs.setdefault('cert', self.cert) - kwargs.setdefault('proxies', self.proxies) - - # It's possible that users might accidentally send a Request object. - # Guard against that specific failure case. - if isinstance(request, Request): - raise ValueError('You can only send PreparedRequests.') - - # Set up variables needed for resolve_redirects and dispatching of hooks - allow_redirects = kwargs.pop('allow_redirects', True) - stream = kwargs.get('stream') - hooks = request.hooks - - # Get the appropriate adapter to use - adapter = self.get_adapter(url=request.url) - - # Start time (approximately) of the request - start = preferred_clock() - - # Send the request - r = adapter.send(request, **kwargs) - - # Total elapsed time of the request (approximately) - elapsed = preferred_clock() - start - r.elapsed = timedelta(seconds=elapsed) - - # Response manipulation hooks - r = dispatch_hook('response', hooks, r, **kwargs) - - # 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) - - extract_cookies_to_jar(self.cookies, request, r.raw) - - # Redirect resolving generator. - gen = self.resolve_redirects(r, request, **kwargs) - - # Resolve redirects if allowed. - history = [resp for resp in gen] if allow_redirects else [] - - # Shuffle things around if there's history. - if history: - # Insert the first (original) request at the start - history.insert(0, r) - # Get the last request made - r = history.pop() - r.history = history - - # If redirects aren't being followed, store the response on the Request for Response.next(). - if not allow_redirects: - try: - r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs)) - except StopIteration: - pass - - if not stream: - r.content - - return r - - def merge_environment_settings(self, url, proxies, stream, verify, cert): - """ - Check the environment and merge it with some settings. - - :rtype: dict - """ - # Gather clues from the surrounding environment. - if self.trust_env: - # 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(): - proxies.setdefault(k, v) - - # Look for requests environment configuration and be compatible - # with cURL. - if verify is True or verify is None: - verify = (os.environ.get('REQUESTS_CA_BUNDLE') or - os.environ.get('CURL_CA_BUNDLE')) - - # Merge all the kwargs. - proxies = merge_setting(proxies, self.proxies) - stream = merge_setting(stream, self.stream) - verify = merge_setting(verify, self.verify) - cert = merge_setting(cert, self.cert) - - return {'verify': verify, 'proxies': proxies, 'stream': stream, - 'cert': cert} - - def get_adapter(self, url): - """ - Returns the appropriate connection adapter for the given URL. - - :rtype: requests.adapters.BaseAdapter - """ - for (prefix, adapter) in self.adapters.items(): - - if url.lower().startswith(prefix.lower()): - return adapter - - # Nothing matches :-/ - raise InvalidSchema("No connection adapters were found for '%s'" % url) - - def close(self): - """Closes all adapters and as such the session""" - for v in self.adapters.values(): - v.close() - - def mount(self, prefix, adapter): - """Registers a connection adapter to a prefix. - - Adapters are sorted in descending order by prefix length. - """ - self.adapters[prefix] = adapter - keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] - - for key in keys_to_move: - self.adapters[key] = self.adapters.pop(key) - - def __getstate__(self): - state = {attr: getattr(self, attr, None) for attr in self.__attrs__} - return state - - def __setstate__(self, state): - for attr, value in state.items(): - setattr(self, attr, value) - - -def session(): - """ - Returns a :class:`Session` for context-management. - - .. deprecated:: 1.0.0 - - This method has been deprecated since version 1.0.0 and is only kept for - backwards compatibility. New code should use :class:`~requests.sessions.Session` - to create a session. This may be removed at a future date. - - :rtype: Session - """ - return Session() diff --git a/venv/lib/python3.8/site-packages/requests/status_codes.py b/venv/lib/python3.8/site-packages/requests/status_codes.py deleted file mode 100644 index 813e8c4..0000000 --- a/venv/lib/python3.8/site-packages/requests/status_codes.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- - -r""" -The ``codes`` object defines a mapping from common names for HTTP statuses -to their numerical codes, accessible either as attributes or as dictionary -items. - ->>> requests.codes['temporary_redirect'] -307 ->>> requests.codes.teapot -418 ->>> requests.codes['\o/'] -200 - -Some codes have multiple names, and both upper- and lower-case versions of -the names are allowed. For example, ``codes.ok``, ``codes.OK``, and -``codes.okay`` all correspond to the HTTP status code 200. -""" - -from .structures import LookupDict - -_codes = { - - # Informational. - 100: ('continue',), - 101: ('switching_protocols',), - 102: ('processing',), - 103: ('checkpoint',), - 122: ('uri_too_long', 'request_uri_too_long'), - 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), - 201: ('created',), - 202: ('accepted',), - 203: ('non_authoritative_info', 'non_authoritative_information'), - 204: ('no_content',), - 205: ('reset_content', 'reset'), - 206: ('partial_content', 'partial'), - 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), - 208: ('already_reported',), - 226: ('im_used',), - - # Redirection. - 300: ('multiple_choices',), - 301: ('moved_permanently', 'moved', '\\o-'), - 302: ('found',), - 303: ('see_other', 'other'), - 304: ('not_modified',), - 305: ('use_proxy',), - 306: ('switch_proxy',), - 307: ('temporary_redirect', 'temporary_moved', 'temporary'), - 308: ('permanent_redirect', - 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 - - # Client Error. - 400: ('bad_request', 'bad'), - 401: ('unauthorized',), - 402: ('payment_required', 'payment'), - 403: ('forbidden',), - 404: ('not_found', '-o-'), - 405: ('method_not_allowed', 'not_allowed'), - 406: ('not_acceptable',), - 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), - 408: ('request_timeout', 'timeout'), - 409: ('conflict',), - 410: ('gone',), - 411: ('length_required',), - 412: ('precondition_failed', 'precondition'), - 413: ('request_entity_too_large',), - 414: ('request_uri_too_large',), - 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), - 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), - 417: ('expectation_failed',), - 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), - 421: ('misdirected_request',), - 422: ('unprocessable_entity', 'unprocessable'), - 423: ('locked',), - 424: ('failed_dependency', 'dependency'), - 425: ('unordered_collection', 'unordered'), - 426: ('upgrade_required', 'upgrade'), - 428: ('precondition_required', 'precondition'), - 429: ('too_many_requests', 'too_many'), - 431: ('header_fields_too_large', 'fields_too_large'), - 444: ('no_response', 'none'), - 449: ('retry_with', 'retry'), - 450: ('blocked_by_windows_parental_controls', 'parental_controls'), - 451: ('unavailable_for_legal_reasons', 'legal_reasons'), - 499: ('client_closed_request',), - - # Server Error. - 500: ('internal_server_error', 'server_error', '/o\\', '✗'), - 501: ('not_implemented',), - 502: ('bad_gateway',), - 503: ('service_unavailable', 'unavailable'), - 504: ('gateway_timeout',), - 505: ('http_version_not_supported', 'http_version'), - 506: ('variant_also_negotiates',), - 507: ('insufficient_storage',), - 509: ('bandwidth_limit_exceeded', 'bandwidth'), - 510: ('not_extended',), - 511: ('network_authentication_required', 'network_auth', 'network_authentication'), -} - -codes = LookupDict(name='status_codes') - -def _init(): - for code, titles in _codes.items(): - for title in titles: - setattr(codes, title, code) - if not title.startswith(('\\', '/')): - setattr(codes, title.upper(), code) - - def doc(code): - names = ', '.join('``%s``' % n for n in _codes[code]) - return '* %d: %s' % (code, names) - - global __doc__ - __doc__ = (__doc__ + '\n' + - '\n'.join(doc(code) for code in sorted(_codes)) - if __doc__ is not None else None) - -_init() diff --git a/venv/lib/python3.8/site-packages/requests/structures.py b/venv/lib/python3.8/site-packages/requests/structures.py deleted file mode 100644 index da930e2..0000000 --- a/venv/lib/python3.8/site-packages/requests/structures.py +++ /dev/null @@ -1,103 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.structures -~~~~~~~~~~~~~~~~~~~ - -Data structures that power Requests. -""" - -from .compat import OrderedDict, Mapping, MutableMapping - - -class CaseInsensitiveDict(MutableMapping): - """A case-insensitive ``dict``-like object. - - Implements all methods and operations of - ``MutableMapping`` as well as dict's ``copy``. Also - provides ``lower_items``. - - All keys are expected to be strings. The structure remembers the - case of the last key to be set, and ``iter(instance)``, - ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` - will contain case-sensitive keys. However, querying and contains - testing is case insensitive:: - - cid = CaseInsensitiveDict() - cid['Accept'] = 'application/json' - cid['aCCEPT'] == 'application/json' # True - list(cid) == ['Accept'] # True - - For example, ``headers['content-encoding']`` will return the - value of a ``'Content-Encoding'`` response header, regardless - of how the header name was originally stored. - - If the constructor, ``.update``, or equality comparison - operations are given keys that have equal ``.lower()``s, the - behavior is undefined. - """ - - def __init__(self, data=None, **kwargs): - self._store = OrderedDict() - if data is None: - data = {} - self.update(data, **kwargs) - - def __setitem__(self, key, value): - # Use the lowercased key for lookups, but store the actual - # key alongside the value. - self._store[key.lower()] = (key, value) - - def __getitem__(self, key): - return self._store[key.lower()][1] - - def __delitem__(self, key): - del self._store[key.lower()] - - def __iter__(self): - return (casedkey for casedkey, mappedvalue in self._store.values()) - - def __len__(self): - return len(self._store) - - def lower_items(self): - """Like iteritems(), but with all lowercase keys.""" - return ( - (lowerkey, keyval[1]) - for (lowerkey, keyval) - in self._store.items() - ) - - def __eq__(self, other): - if isinstance(other, Mapping): - other = CaseInsensitiveDict(other) - else: - return NotImplemented - # Compare insensitively - return dict(self.lower_items()) == dict(other.lower_items()) - - # Copy is required - def copy(self): - return CaseInsensitiveDict(self._store.values()) - - def __repr__(self): - return str(dict(self.items())) - - -class LookupDict(dict): - """Dictionary lookup object.""" - - def __init__(self, name=None): - self.name = name - super(LookupDict, self).__init__() - - def __repr__(self): - return '<lookup \'%s\'>' % (self.name) - - def __getitem__(self, key): - # We allow fall-through here, so values default to None - - return self.__dict__.get(key, None) - - def get(self, key, default=None): - return self.__dict__.get(key, default) diff --git a/venv/lib/python3.8/site-packages/requests/utils.py b/venv/lib/python3.8/site-packages/requests/utils.py deleted file mode 100644 index 8170a8d..0000000 --- a/venv/lib/python3.8/site-packages/requests/utils.py +++ /dev/null @@ -1,977 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.utils -~~~~~~~~~~~~~~ - -This module provides utility functions that are used within Requests -that are also useful for external consumption. -""" - -import codecs -import contextlib -import io -import os -import re -import socket -import struct -import sys -import tempfile -import warnings -import zipfile - -from .__version__ import __version__ -from . import certs -# to_native_string is unused here, but imported here for backwards compatibility -from ._internal_utils import to_native_string -from .compat import parse_http_list as _parse_list_header -from .compat import ( - quote, urlparse, bytes, str, OrderedDict, unquote, getproxies, - proxy_bypass, urlunparse, basestring, integer_types, is_py3, - proxy_bypass_environment, getproxies_environment, Mapping) -from .cookies import cookiejar_from_dict -from .structures import CaseInsensitiveDict -from .exceptions import ( - InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError) - -NETRC_FILES = ('.netrc', '_netrc') - -DEFAULT_CA_BUNDLE_PATH = certs.where() - -DEFAULT_PORTS = {'http': 80, 'https': 443} - - -if sys.platform == 'win32': - # provide a proxy_bypass version on Windows without DNS lookups - - def proxy_bypass_registry(host): - try: - if is_py3: - import winreg - else: - import _winreg as winreg - except ImportError: - return False - - try: - internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, - r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') - # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it - proxyEnable = int(winreg.QueryValueEx(internetSettings, - 'ProxyEnable')[0]) - # ProxyOverride is almost always a string - proxyOverride = winreg.QueryValueEx(internetSettings, - 'ProxyOverride')[0] - except OSError: - return False - if not proxyEnable or not proxyOverride: - return False - - # make a check value list from the registry entry: replace the - # '<local>' string by the localhost entry and the corresponding - # canonical entry. - proxyOverride = proxyOverride.split(';') - # now check if we match one of the registry values. - for test in proxyOverride: - if test == '<local>': - if '.' not in host: - return True - test = test.replace(".", r"\.") # mask dots - test = test.replace("*", r".*") # change glob sequence - test = test.replace("?", r".") # change glob char - if re.match(test, host, re.I): - return True - return False - - def proxy_bypass(host): # noqa - """Return True, if the host should be bypassed. - - Checks proxy settings gathered from the environment, if specified, - or the registry. - """ - if getproxies_environment(): - return proxy_bypass_environment(host) - else: - return proxy_bypass_registry(host) - - -def dict_to_sequence(d): - """Returns an internal sequence dictionary update.""" - - if hasattr(d, 'items'): - d = d.items() - - return d - - -def super_len(o): - total_length = None - current_position = 0 - - if hasattr(o, '__len__'): - total_length = len(o) - - elif hasattr(o, 'len'): - total_length = o.len - - elif hasattr(o, 'fileno'): - try: - fileno = o.fileno() - except io.UnsupportedOperation: - pass - else: - total_length = os.fstat(fileno).st_size - - # Having used fstat to determine the file length, we need to - # confirm that this file was opened up in binary mode. - if 'b' not in o.mode: - warnings.warn(( - "Requests has determined the content-length for this " - "request using the binary size of the file: however, the " - "file has been opened in text mode (i.e. without the 'b' " - "flag in the mode). This may lead to an incorrect " - "content-length. In Requests 3.0, support will be removed " - "for files in text mode."), - FileModeWarning - ) - - if hasattr(o, 'tell'): - try: - current_position = o.tell() - except (OSError, IOError): - # This can happen in some weird situations, such as when the file - # is actually a special file descriptor like stdin. In this - # instance, we don't know what the length is, so set it to zero and - # let requests chunk it instead. - if total_length is not None: - current_position = total_length - else: - if hasattr(o, 'seek') and total_length is None: - # StringIO and BytesIO have seek but no useable fileno - try: - # seek to end of file - o.seek(0, 2) - total_length = o.tell() - - # seek back to current position to support - # partially read file-like objects - o.seek(current_position or 0) - except (OSError, IOError): - total_length = 0 - - if total_length is None: - total_length = 0 - - return max(0, total_length - current_position) - - -def get_netrc_auth(url, raise_errors=False): - """Returns the Requests tuple auth for a given url from netrc.""" - - try: - from netrc import netrc, NetrcParseError - - netrc_path = None - - for f in NETRC_FILES: - try: - loc = os.path.expanduser('~/{}'.format(f)) - except KeyError: - # os.path.expanduser can fail when $HOME is undefined and - # getpwuid fails. See https://bugs.python.org/issue20164 & - # https://github.com/requests/requests/issues/1846 - return - - if os.path.exists(loc): - netrc_path = loc - break - - # Abort early if there isn't one. - if netrc_path is None: - return - - ri = urlparse(url) - - # Strip port numbers from netloc. This weird `if...encode`` dance is - # used for Python 3.2, which doesn't support unicode literals. - splitstr = b':' - if isinstance(url, str): - splitstr = splitstr.decode('ascii') - host = ri.netloc.split(splitstr)[0] - - try: - _netrc = netrc(netrc_path).authenticators(host) - if _netrc: - # Return with login / password - login_i = (0 if _netrc[0] else 1) - return (_netrc[login_i], _netrc[2]) - except (NetrcParseError, IOError): - # If there was a parsing error or a permissions issue reading the file, - # we'll just skip netrc auth unless explicitly asked to raise errors. - if raise_errors: - raise - - # AppEngine hackiness. - except (ImportError, AttributeError): - pass - - -def guess_filename(obj): - """Tries to guess the filename of the given object.""" - name = getattr(obj, 'name', None) - if (name and isinstance(name, basestring) and name[0] != '<' and - name[-1] != '>'): - return os.path.basename(name) - - -def extract_zipped_paths(path): - """Replace nonexistent paths that look like they refer to a member of a zip - archive with the location of an extracted copy of the target, or else - just return the provided path unchanged. - """ - if os.path.exists(path): - # this is already a valid path, no need to do anything further - return path - - # find the first valid part of the provided path and treat that as a zip archive - # assume the rest of the path is the name of a member in the archive - archive, member = os.path.split(path) - while archive and not os.path.exists(archive): - archive, prefix = os.path.split(archive) - member = '/'.join([prefix, member]) - - if not zipfile.is_zipfile(archive): - return path - - zip_file = zipfile.ZipFile(archive) - if member not in zip_file.namelist(): - return path - - # we have a valid zip archive and a valid member of that archive - tmp = tempfile.gettempdir() - extracted_path = os.path.join(tmp, *member.split('/')) - if not os.path.exists(extracted_path): - extracted_path = zip_file.extract(member, path=tmp) - - return extracted_path - - -def from_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. Unless it can not be represented as such, return an - OrderedDict, e.g., - - :: - - >>> from_key_val_list([('key', 'val')]) - OrderedDict([('key', 'val')]) - >>> from_key_val_list('string') - ValueError: cannot encode objects that are not 2-tuples - >>> from_key_val_list({'key': 'val'}) - OrderedDict([('key', 'val')]) - - :rtype: OrderedDict - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError('cannot encode objects that are not 2-tuples') - - return OrderedDict(value) - - -def to_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. If it can be, return a list of tuples, e.g., - - :: - - >>> to_key_val_list([('key', 'val')]) - [('key', 'val')] - >>> to_key_val_list({'key': 'val'}) - [('key', 'val')] - >>> to_key_val_list('string') - ValueError: cannot encode objects that are not 2-tuples. - - :rtype: list - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError('cannot encode objects that are not 2-tuples') - - if isinstance(value, Mapping): - value = value.items() - - return list(value) - - -# From mitsuhiko/werkzeug (used with permission). -def parse_list_header(value): - """Parse lists as described by RFC 2068 Section 2. - - In particular, parse comma-separated lists where the elements of - the list may include quoted-strings. A quoted-string could - contain a comma. A non-quoted string could have quotes in the - middle. Quotes are removed automatically after parsing. - - It basically works like :func:`parse_set_header` just that items - may appear multiple times and case sensitivity is preserved. - - The return value is a standard :class:`list`: - - >>> parse_list_header('token, "quoted value"') - ['token', 'quoted value'] - - To create a header from the :class:`list` again, use the - :func:`dump_header` function. - - :param value: a string with a list header. - :return: :class:`list` - :rtype: list - """ - result = [] - for item in _parse_list_header(value): - if item[:1] == item[-1:] == '"': - item = unquote_header_value(item[1:-1]) - result.append(item) - return result - - -# From mitsuhiko/werkzeug (used with permission). -def parse_dict_header(value): - """Parse lists of key, value pairs as described by RFC 2068 Section 2 and - convert them into a python dict: - - >>> d = parse_dict_header('foo="is a fish", bar="as well"') - >>> type(d) is dict - True - >>> sorted(d.items()) - [('bar', 'as well'), ('foo', 'is a fish')] - - If there is no value for a key it will be `None`: - - >>> parse_dict_header('key_without_value') - {'key_without_value': None} - - To create a header from the :class:`dict` again, use the - :func:`dump_header` function. - - :param value: a string with a dict header. - :return: :class:`dict` - :rtype: dict - """ - result = {} - for item in _parse_list_header(value): - if '=' not in item: - result[item] = None - continue - name, value = item.split('=', 1) - if value[:1] == value[-1:] == '"': - value = unquote_header_value(value[1:-1]) - result[name] = value - return result - - -# From mitsuhiko/werkzeug (used with permission). -def unquote_header_value(value, is_filename=False): - r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). - This does not use the real unquoting but what browsers are actually - using for quoting. - - :param value: the header value to unquote. - :rtype: str - """ - if value and value[0] == value[-1] == '"': - # this is not the real unquoting, but fixing this so that the - # RFC is met will result in bugs with internet explorer and - # probably some other browsers as well. IE for example is - # uploading files with "C:\foo\bar.txt" as filename - value = value[1:-1] - - # if this is a filename and the starting characters look like - # a UNC path, then just return the value without quotes. Using the - # replace sequence below on a UNC path has the effect of turning - # the leading double slash into a single slash and then - # _fix_ie_filename() doesn't work correctly. See #458. - if not is_filename or value[:2] != '\\\\': - return value.replace('\\\\', '\\').replace('\\"', '"') - return value - - -def dict_from_cookiejar(cj): - """Returns a key/value dictionary from a CookieJar. - - :param cj: CookieJar object to extract cookies from. - :rtype: dict - """ - - cookie_dict = {} - - for cookie in cj: - cookie_dict[cookie.name] = cookie.value - - return cookie_dict - - -def add_dict_to_cookiejar(cj, cookie_dict): - """Returns a CookieJar from a key/value dictionary. - - :param cj: CookieJar to insert cookies into. - :param cookie_dict: Dict of key/values to insert into CookieJar. - :rtype: CookieJar - """ - - return cookiejar_from_dict(cookie_dict, cj) - - -def get_encodings_from_content(content): - """Returns encodings from given content string. - - :param content: bytestring to extract encodings from. - """ - warnings.warn(( - 'In requests 3.0, get_encodings_from_content will be removed. For ' - 'more information, please see the discussion on issue #2266. (This' - ' warning should only appear once.)'), - DeprecationWarning) - - charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I) - pragma_re = re.compile(r'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I) - xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') - - return (charset_re.findall(content) + - pragma_re.findall(content) + - xml_re.findall(content)) - - -def _parse_content_type_header(header): - """Returns content type and parameters from given header - - :param header: string - :return: tuple containing content type and dictionary of - parameters - """ - - tokens = header.split(';') - content_type, params = tokens[0].strip(), tokens[1:] - params_dict = {} - items_to_strip = "\"' " - - for param in params: - param = param.strip() - if param: - key, value = param, True - index_of_equals = param.find("=") - if index_of_equals != -1: - key = param[:index_of_equals].strip(items_to_strip) - value = param[index_of_equals + 1:].strip(items_to_strip) - params_dict[key.lower()] = value - return content_type, params_dict - - -def get_encoding_from_headers(headers): - """Returns encodings from given HTTP Header Dict. - - :param headers: dictionary to extract encoding from. - :rtype: str - """ - - content_type = headers.get('content-type') - - if not content_type: - return None - - content_type, params = _parse_content_type_header(content_type) - - if 'charset' in params: - return params['charset'].strip("'\"") - - if 'text' in content_type: - return 'ISO-8859-1' - - -def stream_decode_response_unicode(iterator, r): - """Stream decodes a iterator.""" - - if r.encoding is None: - for item in iterator: - yield item - return - - decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') - for chunk in iterator: - rv = decoder.decode(chunk) - if rv: - yield rv - rv = decoder.decode(b'', final=True) - if rv: - yield rv - - -def iter_slices(string, slice_length): - """Iterate over slices of a string.""" - pos = 0 - if slice_length is None or slice_length <= 0: - slice_length = len(string) - while pos < len(string): - yield string[pos:pos + slice_length] - pos += slice_length - - -def get_unicode_from_response(r): - """Returns the requested content back in unicode. - - :param r: Response object to get unicode content from. - - Tried: - - 1. charset from content-type - 2. fall back and replace all unicode characters - - :rtype: str - """ - warnings.warn(( - 'In requests 3.0, get_unicode_from_response will be removed. For ' - 'more information, please see the discussion on issue #2266. (This' - ' warning should only appear once.)'), - DeprecationWarning) - - tried_encodings = [] - - # Try charset from content-type - encoding = get_encoding_from_headers(r.headers) - - if encoding: - try: - return str(r.content, encoding) - except UnicodeError: - tried_encodings.append(encoding) - - # Fall back: - try: - return str(r.content, encoding, errors='replace') - except TypeError: - return r.content - - -# The unreserved URI characters (RFC 3986) -UNRESERVED_SET = frozenset( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") - - -def unquote_unreserved(uri): - """Un-escape any percent-escape sequences in a URI that are unreserved - characters. This leaves all reserved, illegal and non-ASCII bytes encoded. - - :rtype: str - """ - parts = uri.split('%') - for i in range(1, len(parts)): - h = parts[i][0:2] - if len(h) == 2 and h.isalnum(): - try: - c = chr(int(h, 16)) - except ValueError: - raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) - - if c in UNRESERVED_SET: - parts[i] = c + parts[i][2:] - else: - parts[i] = '%' + parts[i] - else: - parts[i] = '%' + parts[i] - return ''.join(parts) - - -def requote_uri(uri): - """Re-quote the given URI. - - This function passes the given URI through an unquote/quote cycle to - ensure that it is fully and consistently quoted. - - :rtype: str - """ - safe_with_percent = "!#$%&'()*+,/:;=?@[]~" - safe_without_percent = "!#$&'()*+,/:;=?@[]~" - try: - # Unquote only the unreserved characters - # Then quote only illegal characters (do not quote reserved, - # unreserved, or '%') - return quote(unquote_unreserved(uri), safe=safe_with_percent) - except InvalidURL: - # We couldn't unquote the given URI, so let's try quoting it, but - # there may be unquoted '%'s in the URI. We need to make sure they're - # properly quoted so they do not cause issues elsewhere. - return quote(uri, safe=safe_without_percent) - - -def address_in_network(ip, net): - """This function allows you to check if an IP belongs to a network subnet - - Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 - returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 - - :rtype: bool - """ - ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] - netaddr, bits = net.split('/') - netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0] - network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask - return (ipaddr & netmask) == (network & netmask) - - -def dotted_netmask(mask): - """Converts mask from /xx format to xxx.xxx.xxx.xxx - - Example: if mask is 24 function returns 255.255.255.0 - - :rtype: str - """ - bits = 0xffffffff ^ (1 << 32 - mask) - 1 - return socket.inet_ntoa(struct.pack('>I', bits)) - - -def is_ipv4_address(string_ip): - """ - :rtype: bool - """ - try: - socket.inet_aton(string_ip) - except socket.error: - return False - return True - - -def is_valid_cidr(string_network): - """ - Very simple check of the cidr format in no_proxy variable. - - :rtype: bool - """ - if string_network.count('/') == 1: - try: - mask = int(string_network.split('/')[1]) - except ValueError: - return False - - if mask < 1 or mask > 32: - return False - - try: - socket.inet_aton(string_network.split('/')[0]) - except socket.error: - return False - else: - return False - return True - - -@contextlib.contextmanager -def set_environ(env_name, value): - """Set the environment variable 'env_name' to 'value' - - Save previous value, yield, and then restore the previous value stored in - the environment variable 'env_name'. - - If 'value' is None, do nothing""" - value_changed = value is not None - if value_changed: - old_value = os.environ.get(env_name) - os.environ[env_name] = value - try: - yield - finally: - if value_changed: - if old_value is None: - del os.environ[env_name] - else: - os.environ[env_name] = old_value - - -def should_bypass_proxies(url, no_proxy): - """ - Returns whether we should bypass proxies or not. - - :rtype: bool - """ - # Prioritize lowercase environment variables over uppercase - # to keep a consistent behaviour with other http projects (curl, wget). - get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) - - # First check whether no_proxy is defined. If it is, check that the URL - # we're getting isn't in the no_proxy list. - no_proxy_arg = no_proxy - if no_proxy is None: - no_proxy = get_proxy('no_proxy') - parsed = urlparse(url) - - if parsed.hostname is None: - # URLs don't always have hostnames, e.g. file:/// urls. - return True - - if no_proxy: - # We need to check whether we match here. We need to see if we match - # the end of the hostname, both with and without the port. - no_proxy = ( - host for host in no_proxy.replace(' ', '').split(',') if host - ) - - if is_ipv4_address(parsed.hostname): - for proxy_ip in no_proxy: - if is_valid_cidr(proxy_ip): - if address_in_network(parsed.hostname, proxy_ip): - return True - elif parsed.hostname == proxy_ip: - # If no_proxy ip was defined in plain IP notation instead of cidr notation & - # matches the IP of the index - return True - else: - host_with_port = parsed.hostname - if parsed.port: - host_with_port += ':{}'.format(parsed.port) - - for host in no_proxy: - if parsed.hostname.endswith(host) or host_with_port.endswith(host): - # The URL does match something in no_proxy, so we don't want - # to apply the proxies on this URL. - return True - - with set_environ('no_proxy', no_proxy_arg): - # parsed.hostname can be `None` in cases such as a file URI. - try: - bypass = proxy_bypass(parsed.hostname) - except (TypeError, socket.gaierror): - bypass = False - - if bypass: - return True - - return False - - -def get_environ_proxies(url, no_proxy=None): - """ - Return a dict of environment proxies. - - :rtype: dict - """ - if should_bypass_proxies(url, no_proxy=no_proxy): - return {} - else: - return getproxies() - - -def select_proxy(url, proxies): - """Select a proxy for the url, if applicable. - - :param url: The url being for the request - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs - """ - proxies = proxies or {} - urlparts = urlparse(url) - if urlparts.hostname is None: - return proxies.get(urlparts.scheme, proxies.get('all')) - - proxy_keys = [ - urlparts.scheme + '://' + urlparts.hostname, - urlparts.scheme, - 'all://' + urlparts.hostname, - 'all', - ] - proxy = None - for proxy_key in proxy_keys: - if proxy_key in proxies: - proxy = proxies[proxy_key] - break - - return proxy - - -def default_user_agent(name="python-requests"): - """ - Return a string representing the default user agent. - - :rtype: str - """ - return '%s/%s' % (name, __version__) - - -def default_headers(): - """ - :rtype: requests.structures.CaseInsensitiveDict - """ - return CaseInsensitiveDict({ - 'User-Agent': default_user_agent(), - 'Accept-Encoding': ', '.join(('gzip', 'deflate')), - 'Accept': '*/*', - 'Connection': 'keep-alive', - }) - - -def parse_header_links(value): - """Return a list of parsed link headers proxies. - - i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg" - - :rtype: list - """ - - links = [] - - replace_chars = ' \'"' - - value = value.strip(replace_chars) - if not value: - return links - - for val in re.split(', *<', value): - try: - url, params = val.split(';', 1) - except ValueError: - url, params = val, '' - - link = {'url': url.strip('<> \'"')} - - for param in params.split(';'): - try: - key, value = param.split('=') - except ValueError: - break - - link[key.strip(replace_chars)] = value.strip(replace_chars) - - links.append(link) - - return links - - -# Null bytes; no need to recreate these on each call to guess_json_utf -_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 -_null2 = _null * 2 -_null3 = _null * 3 - - -def guess_json_utf(data): - """ - :rtype: str - """ - # JSON always starts with two ASCII characters, so detection is as - # easy as counting the nulls and from their location and count - # determine the encoding. Also detect a BOM, if present. - sample = data[:4] - if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): - return 'utf-32' # BOM included - if sample[:3] == codecs.BOM_UTF8: - return 'utf-8-sig' # BOM included, MS style (discouraged) - if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): - return 'utf-16' # BOM included - nullcount = sample.count(_null) - if nullcount == 0: - return 'utf-8' - if nullcount == 2: - if sample[::2] == _null2: # 1st and 3rd are null - return 'utf-16-be' - if sample[1::2] == _null2: # 2nd and 4th are null - return 'utf-16-le' - # Did not detect 2 valid UTF-16 ascii-range characters - if nullcount == 3: - if sample[:3] == _null3: - return 'utf-32-be' - if sample[1:] == _null3: - return 'utf-32-le' - # Did not detect a valid UTF-32 ascii-range character - return None - - -def prepend_scheme_if_needed(url, new_scheme): - """Given a URL that may or may not have a scheme, prepend the given scheme. - Does not replace a present scheme with the one provided as an argument. - - :rtype: str - """ - scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) - - # urlparse is a finicky beast, and sometimes decides that there isn't a - # netloc present. Assume that it's being over-cautious, and switch netloc - # and path if urlparse decided there was no netloc. - if not netloc: - netloc, path = path, netloc - - return urlunparse((scheme, netloc, path, params, query, fragment)) - - -def get_auth_from_url(url): - """Given a url with authentication components, extract them into a tuple of - username,password. - - :rtype: (str,str) - """ - parsed = urlparse(url) - - try: - auth = (unquote(parsed.username), unquote(parsed.password)) - except (AttributeError, TypeError): - auth = ('', '') - - return auth - - -# Moved outside of function to avoid recompile every call -_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') -_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') - - -def check_header_validity(header): - """Verifies that header value is a string which doesn't contain - leading whitespace or return characters. This prevents unintended - header injection. - - :param header: tuple, in the format (name, value). - """ - name, value = header - - if isinstance(value, bytes): - pat = _CLEAN_HEADER_REGEX_BYTE - else: - pat = _CLEAN_HEADER_REGEX_STR - try: - if not pat.match(value): - raise InvalidHeader("Invalid return character or leading space in header: %s" % name) - except TypeError: - raise InvalidHeader("Value for header {%s: %s} must be of type str or " - "bytes, not %s" % (name, value, type(value))) - - -def urldefragauth(url): - """ - Given a url remove the fragment and the authentication part. - - :rtype: str - """ - scheme, netloc, path, params, query, fragment = urlparse(url) - - # see func:`prepend_scheme_if_needed` - if not netloc: - netloc, path = path, netloc - - netloc = netloc.rsplit('@', 1)[-1] - - return urlunparse((scheme, netloc, path, params, query, '')) - - -def rewind_body(prepared_request): - """Move file pointer back to its recorded starting position - so it can be read again on redirect. - """ - body_seek = getattr(prepared_request.body, 'seek', None) - if body_seek is not None and isinstance(prepared_request._body_position, integer_types): - try: - body_seek(prepared_request._body_position) - except (IOError, OSError): - raise UnrewindableBodyError("An error occurred when rewinding request " - "body for redirect.") - else: - raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/AUTHORS b/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/AUTHORS deleted file mode 100644 index 37da4b9..0000000 --- a/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/AUTHORS +++ /dev/null @@ -1,11 +0,0 @@ -Aaron Gallagher <_@habnab.it> -Ben Jackson <puremourning@gmail.com> -David Preece <davep@zedkep.com> -Esben Haabendal <esben@haabendal.dk> -Marc Abramowitz <abramowi@adobe.com> -Marc Abramowitz <marc@marc-abramowitz.com> -Marc Abramowitz <msabramo@gmail.com> -Ondřej Kobližel <koblizeko@gmail.com> -Tomaz Solc <tomaz.solc@tablix.org> -Will Rouesnel <w.rouesnel@gmail.com> -William Rouesnel <William.Rouesnel@netregistry.com.au> diff --git a/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/INSTALLER b/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/LICENSE b/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/LICENSE deleted file mode 100644 index e06d208..0000000 --- a/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff --git a/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/METADATA b/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/METADATA deleted file mode 100644 index 54234d6..0000000 --- a/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/METADATA +++ /dev/null @@ -1,117 +0,0 @@ -Metadata-Version: 2.1 -Name: requests-unixsocket -Version: 0.2.0 -Summary: Use requests to talk HTTP via a UNIX domain socket -Home-page: https://github.com/msabramo/requests-unixsocket -Author: Marc Abramowitz -Author-email: marc@marc-abramowitz.com -License: Apache-2 -Platform: UNKNOWN -Classifier: Development Status :: 3 - Alpha -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: Information Technology -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Requires-Dist: requests (>=1.1) -Requires-Dist: urllib3 (>=1.8) - -requests-unixsocket -=================== - -.. image:: https://badge.fury.io/py/requests-unixsocket.svg - :target: https://badge.fury.io/py/requests-unixsocket - :alt: Latest Version on PyPI - -.. image:: https://travis-ci.org/msabramo/requests-unixsocket.svg?branch=master - :target: https://travis-ci.org/msabramo/requests-unixsocket - -Use `requests <http://docs.python-requests.org/>`_ to talk HTTP via a UNIX domain socket - -Usage ------ - -Explicit -++++++++ - -You can use it by instantiating a special ``Session`` object: - -.. code-block:: python - - import json - - import requests_unixsocket - - session = requests_unixsocket.Session() - - r = session.get('http+unix://%2Fvar%2Frun%2Fdocker.sock/info') - registry_config = r.json()['RegistryConfig'] - print(json.dumps(registry_config, indent=4)) - - -Implicit (monkeypatching) -+++++++++++++++++++++++++ - -Monkeypatching allows you to use the functionality in this module, while making -minimal changes to your code. Note that in the above example we had to -instantiate a special ``requests_unixsocket.Session`` object and call the -``get`` method on that object. Calling ``requests.get(url)`` (the easiest way -to use requests and probably very common), would not work. But we can make it -work by doing monkeypatching. - -You can monkeypatch globally: - -.. code-block:: python - - import requests_unixsocket - - requests_unixsocket.monkeypatch() - - r = requests.get('http+unix://%2Fvar%2Frun%2Fdocker.sock/info') - assert r.status_code == 200 - -or you can do it temporarily using a context manager: - -.. code-block:: python - - import requests_unixsocket - - with requests_unixsocket.monkeypatch(): - r = requests.get('http+unix://%2Fvar%2Frun%2Fdocker.sock/info') - assert r.status_code == 200 - - -Abstract namespace sockets -++++++++++++++++++++++++++ - -To connect to an `abstract namespace -socket <https://utcc.utoronto.ca/~cks/space/blog/python/AbstractUnixSocketsAndPeercred>`_ -(Linux only), prefix the name with a NULL byte (i.e.: `\0`) - e.g.: - -.. code-block:: python - - import requests_unixsocket - - session = requests_unixsocket.Session() - res = session.get('http+unix://\0test_socket/get') - print(res.text) - -For an example program that illustrates this, see -``examples/abstract_namespace.py`` in the git repo. Since abstract namespace -sockets are specific to Linux, the program will only work on Linux. - - -See also --------- - -- https://github.com/httpie/httpie-unixsocket - a plugin for `HTTPie <https://httpie.org/>`_ that allows you to interact with UNIX domain sockets - - - diff --git a/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/RECORD b/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/RECORD deleted file mode 100644 index cdb8bce..0000000 --- a/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/RECORD +++ /dev/null @@ -1,16 +0,0 @@ -requests_unixsocket-0.2.0.dist-info/AUTHORS,sha256=CAloaNwgMbpQp1CeYjcT6FeDSqSgUZMppfV8FdeFSmM,420 -requests_unixsocket-0.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -requests_unixsocket-0.2.0.dist-info/LICENSE,sha256=y16Ofl9KOYjhBjwULGDcLfdWBfTEZRXnduOspt-XbhQ,11325 -requests_unixsocket-0.2.0.dist-info/METADATA,sha256=wUV1Z9UnYmcs95HR7JMQrvwgxxh4lieBuSmGufX9BU4,3545 -requests_unixsocket-0.2.0.dist-info/RECORD,, -requests_unixsocket-0.2.0.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 -requests_unixsocket-0.2.0.dist-info/pbr.json,sha256=b-kcBU2vW_AOypwYSXDMuitwk2Wo4MC57Y9Pnx5JfZk,47 -requests_unixsocket-0.2.0.dist-info/top_level.txt,sha256=Y1EEbvkeC5k8NXwoNkaqjeDlx2oDGfUJrbEubbBbjcc,20 -requests_unixsocket/__init__.py,sha256=_SzyTnexKzhCfmtiIRbrDpLNpKYJuf01QyyNHw76bF0,2077 -requests_unixsocket/__pycache__/__init__.cpython-38.pyc,, -requests_unixsocket/__pycache__/adapters.cpython-38.pyc,, -requests_unixsocket/__pycache__/testutils.cpython-38.pyc,, -requests_unixsocket/adapters.py,sha256=UhXkEErWss-D90cehJltXqPVxwey4RjVkEj7wq0FFgs,2727 -requests_unixsocket/tests/__pycache__/test_requests_unixsocket.cpython-38.pyc,, -requests_unixsocket/tests/test_requests_unixsocket.py,sha256=FIDUuM8ZPhpDpiHxvff8fyqCdbJsCDeUa8mKrtSBcSM,5196 -requests_unixsocket/testutils.py,sha256=knU4P4lvwvogbEqRAJ-X77ojHD2V5rTDcYaLat_JreQ,3093 diff --git a/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/WHEEL b/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/WHEEL deleted file mode 100644 index c8240f0..0000000 --- a/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.33.1) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/pbr.json b/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/pbr.json deleted file mode 100644 index 859fce1..0000000 --- a/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/pbr.json +++ /dev/null @@ -1 +0,0 @@ -{"is_release": false, "git_version": "f4703e0"} \ No newline at end of file diff --git a/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/top_level.txt b/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/top_level.txt deleted file mode 100644 index 412903b..0000000 --- a/venv/lib/python3.8/site-packages/requests_unixsocket-0.2.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -requests_unixsocket diff --git a/venv/lib/python3.8/site-packages/requests_unixsocket/__init__.py b/venv/lib/python3.8/site-packages/requests_unixsocket/__init__.py deleted file mode 100644 index 0fb5e1f..0000000 --- a/venv/lib/python3.8/site-packages/requests_unixsocket/__init__.py +++ /dev/null @@ -1,77 +0,0 @@ -import requests -import sys - -from .adapters import UnixAdapter - -DEFAULT_SCHEME = 'http+unix://' - - -class Session(requests.Session): - def __init__(self, url_scheme=DEFAULT_SCHEME, *args, **kwargs): - super(Session, self).__init__(*args, **kwargs) - self.mount(url_scheme, UnixAdapter()) - - -class monkeypatch(object): - def __init__(self, url_scheme=DEFAULT_SCHEME): - self.session = Session() - requests = self._get_global_requests_module() - - # Methods to replace - self.methods = ('request', 'get', 'head', 'post', - 'patch', 'put', 'delete', 'options') - # Store the original methods - self.orig_methods = dict( - (m, requests.__dict__[m]) for m in self.methods) - # Monkey patch - g = globals() - for m in self.methods: - requests.__dict__[m] = g[m] - - def _get_global_requests_module(self): - return sys.modules['requests'] - - def __enter__(self): - return self - - def __exit__(self, *args): - requests = self._get_global_requests_module() - for m in self.methods: - requests.__dict__[m] = self.orig_methods[m] - - -# These are the same methods defined for the global requests object -def request(method, url, **kwargs): - session = Session() - return session.request(method=method, url=url, **kwargs) - - -def get(url, **kwargs): - kwargs.setdefault('allow_redirects', True) - return request('get', url, **kwargs) - - -def head(url, **kwargs): - kwargs.setdefault('allow_redirects', False) - return request('head', url, **kwargs) - - -def post(url, data=None, json=None, **kwargs): - return request('post', url, data=data, json=json, **kwargs) - - -def patch(url, data=None, **kwargs): - return request('patch', url, data=data, **kwargs) - - -def put(url, data=None, **kwargs): - return request('put', url, data=data, **kwargs) - - -def delete(url, **kwargs): - return request('delete', url, **kwargs) - - -def options(url, **kwargs): - kwargs.setdefault('allow_redirects', True) - return request('options', url, **kwargs) diff --git a/venv/lib/python3.8/site-packages/requests_unixsocket/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests_unixsocket/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index f36978e65343328a6f1ccae8b6c3aba49f67a20c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2996 zcmbtWNpBlB6efqG(O8z3IL_iM-P=@XW2Xzcq;8rZPEw$aE_QklkPZ}aWJ?}tWRhwU zV{)>Av_O$-FFhnj|0P~~%DJ~*+V^oJOJ0Hk?bv)na>#if-}k*Yx;HgdVs!oa_0o?Q zL&pBVVEpoFaGjd|m5gMPC#;s=d5ud?ip1-Pn&3?OHUAEi1sUuz8N{qz*b%h?%@k!w zGhrOixF{!NX_wVPIVsC@pO8~>n(igJAZO(4F0W0>bMl0oqh48_mnY>s^`_)0d74&D z%QNyU-Df0UWt9sr2@$Kl<YX({PTuRb9^H`jo{80VdBd3A2Ys5ky0p~5y73EV!lmCJ z6Eivot9h|#@~5oHC7o(_qUJwkKC2bTkFdqnSnF2WZFtx<xbPCR8EX0+GKLwRu^q4N zWnLzpan3UKTx8t%JM4u=0b;9ck5?-NThRSptQ2<JFp65;mWd);=%oFwQG#YGzV&sS zG;OJ`l1Mi;;!bS+x?0yZ*nEil9=8)w)JW=DN6{Yp>+X{2^p<+9-sM(Tn|hL5?shiQ zw5NYsQt?(l)<$1OICR?BjLrUBG&VN`ve<j9iUb0>(7?#}9N(TD#9(o_tP%iwx88{f zdnt-Ksq81{m!oK_Urz>4rdMv=zH#sSwP^L`x3})za&NX%1L%!7Nuo$0gt?hQZx#lQ zC#Y$}JmhYCgh<5dIu>0aGft!<k=J}Fq)&n=<g%;<xfmfsBDQ2FJ85?_e%z~@#>TPa z!hv2RW7rPS84<zHy%+2k$^#k+Ln<M~P!{Zl8EcCbw!?Suq+o&__QcEQ?$13Dki-J} znYD|VSY}(x5JSbURzh1G@MFb#Y^=W#*QND)sW!IYa9Ppo8ym<tiA`*aY0r=nbpxs& zUI-E5^$9h7flS8k&p+WACx0yC3#{q=z&P9T;8hi90p$ykCtD2?Ud6NC;uXs~q^WQy zmYfbSVJDW?<8J(@r>>pF`{Bsv9^1Y&7QB5`EG{Q$qn_w%i~GAOVXpL|&a=p#kLaY) zdXhe<C(+R1KtHzFiOohTwe^9{mQ&SQkA`!_e3MqM;|#unKooRp`MP=&11F`o&~qw+ zj?vL`WEc;5C<0OD{@*1L@DksiKkf_%Vv9H<zBj39xH7CwHDUq$c~$i`%}@Y^eyj<) zO99Hw9N0+K4$FJA6u6zD89x-iSBK;X96)k#Kt(pBG(Y+xP31l3Jtr`V;x1LiC_-R{ z?oS;&`e4NYXO3#xatGVqCqwFIFLGV;6=+P5!kw}+uPvOir$-v|6^^Vf!Bk+zS)0TJ zqBq9d2r`K?euS#{F0If38IX6BuzV4vkvf4_fn{|PW*!FY=NOjIy8<&JW#5}RO%E{A z^Z}$=Q=SP$DBSFkqJZT24oi_{C<+t;(dJDGO-8c#oofGY-ZOljyejD;$dzja)$xkw z@<5%Touu85=%zk~DZ}8PW8j=(u<}D{gDM<wxAy==!_;?}&e7V8Kd0g(J$!Ktmqbw0 z%eX`2SM3aa8PbQ8bh4%5hS6&ZIlbrEl8%jxoArKToRd9o4BIGX4i>fm{Qy>(yO;bA zSPF&fwpt*oK85)V=8#uB#r()CW*UOb@Pc0V2?9#v>NEn7dD0_t#DE-8RR|U_<jcCL zTfeQ-F6Hfj8%N9Mv_O3U;|Mwg2iw1*Hb^J;x&vwfFaUDQKw(2LlHjxm&<M(Tda9he zFR8aD^3c19<6L9;H`Io%G5)WvA>)y2brr)yC&dz1ZlE>B6~;%%#%bM2r>QeM=|Fc> zCNI*g!r_jk7EfJ`8F;|>h==`H{;SHJoYvH9aQ8|%;i&_R_cBf*#tda`wL-tq=zlh^ zPRKtS*7M($+Wk7qiwpMIAbrrLJaV<diN~cvu4Ld;j#?LF7XpWA6kpeKH9B0*KOWam Z+%>k+x5_JfzL*PUFNOvDm3;h#{y)r7G;9C> diff --git a/venv/lib/python3.8/site-packages/requests_unixsocket/__pycache__/adapters.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests_unixsocket/__pycache__/adapters.cpython-38.pyc deleted file mode 100644 index b8f5befbb549678e9a7e0ad36f770c9cfc263c65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3567 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 HzS;RN&qE<$ diff --git a/venv/lib/python3.8/site-packages/requests_unixsocket/__pycache__/testutils.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests_unixsocket/__pycache__/testutils.cpython-38.pyc deleted file mode 100644 index 2691e3234ec97728c9ed3882f18411af63c5fc50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3673 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 diff --git a/venv/lib/python3.8/site-packages/requests_unixsocket/adapters.py b/venv/lib/python3.8/site-packages/requests_unixsocket/adapters.py deleted file mode 100644 index a2c1564..0000000 --- a/venv/lib/python3.8/site-packages/requests_unixsocket/adapters.py +++ /dev/null @@ -1,89 +0,0 @@ -import socket - -from requests.adapters import HTTPAdapter -from requests.compat import urlparse, unquote - -try: - import http.client as httplib -except ImportError: - import httplib - -try: - from requests.packages import urllib3 -except ImportError: - import urllib3 - - -# The following was adapted from some code from docker-py -# https://github.com/docker/docker-py/blob/master/docker/transport/unixconn.py -class UnixHTTPConnection(httplib.HTTPConnection, object): - - def __init__(self, unix_socket_url, timeout=60): - """Create an HTTP connection to a unix domain socket - - :param unix_socket_url: A URL with a scheme of 'http+unix' and the - netloc is a percent-encoded path to a unix domain socket. E.g.: - 'http+unix://%2Ftmp%2Fprofilesvc.sock/status/pid' - """ - super(UnixHTTPConnection, self).__init__('localhost', timeout=timeout) - self.unix_socket_url = unix_socket_url - self.timeout = timeout - self.sock = None - - def __del__(self): # base class does not have d'tor - if self.sock: - self.sock.close() - - def connect(self): - sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - sock.settimeout(self.timeout) - socket_path = unquote(urlparse(self.unix_socket_url).netloc) - sock.connect(socket_path) - self.sock = sock - - -class UnixHTTPConnectionPool(urllib3.connectionpool.HTTPConnectionPool): - - def __init__(self, socket_path, timeout=60): - super(UnixHTTPConnectionPool, self).__init__( - 'localhost', timeout=timeout) - self.socket_path = socket_path - self.timeout = timeout - - def _new_conn(self): - return UnixHTTPConnection(self.socket_path, self.timeout) - - -class UnixAdapter(HTTPAdapter): - - def __init__(self, timeout=60, pool_connections=25): - super(UnixAdapter, self).__init__() - self.timeout = timeout - self.pools = urllib3._collections.RecentlyUsedContainer( - pool_connections, dispose_func=lambda p: p.close() - ) - super(UnixAdapter, self).__init__() - - def get_connection(self, url, proxies=None): - proxies = proxies or {} - proxy = proxies.get(urlparse(url.lower()).scheme) - - if proxy: - raise ValueError('%s does not support specifying proxies' - % self.__class__.__name__) - - with self.pools.lock: - pool = self.pools.get(url) - if pool: - return pool - - pool = UnixHTTPConnectionPool(url, self.timeout) - self.pools[url] = pool - - return pool - - def request_url(self, request, proxies): - return request.path_url - - def close(self): - self.pools.clear() diff --git a/venv/lib/python3.8/site-packages/requests_unixsocket/tests/__pycache__/test_requests_unixsocket.cpython-38.pyc b/venv/lib/python3.8/site-packages/requests_unixsocket/tests/__pycache__/test_requests_unixsocket.cpython-38.pyc deleted file mode 100644 index 2330582140a12c3c8823bfbb94c3d5f945f1549a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3497 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 diff --git a/venv/lib/python3.8/site-packages/requests_unixsocket/tests/test_requests_unixsocket.py b/venv/lib/python3.8/site-packages/requests_unixsocket/tests/test_requests_unixsocket.py deleted file mode 100755 index 733aa87..0000000 --- a/venv/lib/python3.8/site-packages/requests_unixsocket/tests/test_requests_unixsocket.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -"""Tests for requests_unixsocket""" - -import logging - -import pytest -import requests - -import requests_unixsocket -from requests_unixsocket.testutils import UnixSocketServerThread - - -logger = logging.getLogger(__name__) - - -def test_unix_domain_adapter_ok(): - with UnixSocketServerThread() as usock_thread: - session = requests_unixsocket.Session('http+unix://') - urlencoded_usock = requests.compat.quote_plus(usock_thread.usock) - url = 'http+unix://%s/path/to/page' % urlencoded_usock - - for method in ['get', 'post', 'head', 'patch', 'put', 'delete', - 'options']: - logger.debug('Calling session.%s(%r) ...', method, url) - r = getattr(session, method)(url) - logger.debug( - 'Received response: %r with text: %r and headers: %r', - r, r.text, r.headers) - assert r.status_code == 200 - assert r.headers['server'] == 'waitress' - assert r.headers['X-Transport'] == 'unix domain socket' - assert r.headers['X-Requested-Path'] == '/path/to/page' - assert r.headers['X-Socket-Path'] == usock_thread.usock - assert isinstance(r.connection, requests_unixsocket.UnixAdapter) - assert r.url.lower() == url.lower() - if method == 'head': - assert r.text == '' - else: - assert r.text == 'Hello world!' - - -def test_unix_domain_adapter_url_with_query_params(): - with UnixSocketServerThread() as usock_thread: - session = requests_unixsocket.Session('http+unix://') - urlencoded_usock = requests.compat.quote_plus(usock_thread.usock) - url = ('http+unix://%s' - '/containers/nginx/logs?timestamp=true' % urlencoded_usock) - - for method in ['get', 'post', 'head', 'patch', 'put', 'delete', - 'options']: - logger.debug('Calling session.%s(%r) ...', method, url) - r = getattr(session, method)(url) - logger.debug( - 'Received response: %r with text: %r and headers: %r', - r, r.text, r.headers) - assert r.status_code == 200 - assert r.headers['server'] == 'waitress' - assert r.headers['X-Transport'] == 'unix domain socket' - assert r.headers['X-Requested-Path'] == '/containers/nginx/logs' - assert r.headers['X-Requested-Query-String'] == 'timestamp=true' - assert r.headers['X-Socket-Path'] == usock_thread.usock - assert isinstance(r.connection, requests_unixsocket.UnixAdapter) - assert r.url.lower() == url.lower() - if method == 'head': - assert r.text == '' - else: - assert r.text == 'Hello world!' - - -def test_unix_domain_adapter_connection_error(): - session = requests_unixsocket.Session('http+unix://') - - for method in ['get', 'post', 'head', 'patch', 'put', 'delete', 'options']: - with pytest.raises(requests.ConnectionError): - getattr(session, method)( - 'http+unix://socket_does_not_exist/path/to/page') - - -def test_unix_domain_adapter_connection_proxies_error(): - session = requests_unixsocket.Session('http+unix://') - - for method in ['get', 'post', 'head', 'patch', 'put', 'delete', 'options']: - with pytest.raises(ValueError) as excinfo: - getattr(session, method)( - 'http+unix://socket_does_not_exist/path/to/page', - proxies={"http+unix": "http://10.10.1.10:1080"}) - assert ('UnixAdapter does not support specifying proxies' - in str(excinfo.value)) - - -def test_unix_domain_adapter_monkeypatch(): - with UnixSocketServerThread() as usock_thread: - with requests_unixsocket.monkeypatch('http+unix://'): - urlencoded_usock = requests.compat.quote_plus(usock_thread.usock) - url = 'http+unix://%s/path/to/page' % urlencoded_usock - - for method in ['get', 'post', 'head', 'patch', 'put', 'delete', - 'options']: - logger.debug('Calling session.%s(%r) ...', method, url) - r = getattr(requests, method)(url) - logger.debug( - 'Received response: %r with text: %r and headers: %r', - r, r.text, r.headers) - assert r.status_code == 200 - assert r.headers['server'] == 'waitress' - assert r.headers['X-Transport'] == 'unix domain socket' - assert r.headers['X-Requested-Path'] == '/path/to/page' - assert r.headers['X-Socket-Path'] == usock_thread.usock - assert isinstance(r.connection, - requests_unixsocket.UnixAdapter) - assert r.url.lower() == url.lower() - if method == 'head': - assert r.text == '' - else: - assert r.text == 'Hello world!' - - for method in ['get', 'post', 'head', 'patch', 'put', 'delete', 'options']: - with pytest.raises(requests.exceptions.InvalidSchema): - getattr(requests, method)(url) diff --git a/venv/lib/python3.8/site-packages/requests_unixsocket/testutils.py b/venv/lib/python3.8/site-packages/requests_unixsocket/testutils.py deleted file mode 100644 index 77e572e..0000000 --- a/venv/lib/python3.8/site-packages/requests_unixsocket/testutils.py +++ /dev/null @@ -1,97 +0,0 @@ -""" -Utilities helpful for writing tests - -Provides a UnixSocketServerThread that creates a running server, listening on a -newly created unix socket. - -Example usage: - -.. code-block:: python - - def test_unix_domain_adapter_monkeypatch(): - with UnixSocketServerThread() as usock_thread: - with requests_unixsocket.monkeypatch('http+unix://'): - urlencoded_usock = quote_plus(usock_process.usock) - url = 'http+unix://%s/path/to/page' % urlencoded_usock - r = requests.get(url) -""" - -import logging -import os -import threading -import time -import uuid -import waitress - - -logger = logging.getLogger(__name__) - - -class KillThread(threading.Thread): - def __init__(self, server, *args, **kwargs): - super(KillThread, self).__init__(*args, **kwargs) - self.server = server - - def run(self): - time.sleep(1) - logger.debug('Sleeping') - self.server._map.clear() - - -class WSGIApp: - server = None - - def __call__(self, environ, start_response): - logger.debug('WSGIApp.__call__: Invoked for %s', environ['PATH_INFO']) - logger.debug('WSGIApp.__call__: environ = %r', environ) - status_text = '200 OK' - response_headers = [ - ('X-Transport', 'unix domain socket'), - ('X-Socket-Path', environ['SERVER_PORT']), - ('X-Requested-Query-String', environ['QUERY_STRING']), - ('X-Requested-Path', environ['PATH_INFO'])] - body_bytes = b'Hello world!' - start_response(status_text, response_headers) - logger.debug( - 'WSGIApp.__call__: Responding with ' - 'status_text = %r; ' - 'response_headers = %r; ' - 'body_bytes = %r', - status_text, response_headers, body_bytes) - return [body_bytes] - - -class UnixSocketServerThread(threading.Thread): - def __init__(self, *args, **kwargs): - super(UnixSocketServerThread, self).__init__(*args, **kwargs) - self.usock = self.get_tempfile_name() - self.server = None - self.server_ready_event = threading.Event() - - def get_tempfile_name(self): - # I'd rather use tempfile.NamedTemporaryFile but IDNA limits - # the hostname to 63 characters and we'll get a "InvalidURL: - # URL has an invalid label" error if we exceed that. - args = (os.stat(__file__).st_ino, os.getpid(), uuid.uuid4().hex[-8:]) - return '/tmp/test_requests.%s_%s_%s' % args - - def run(self): - logger.debug('Call waitress.serve in %r ...', self) - wsgi_app = WSGIApp() - server = waitress.create_server(wsgi_app, unix_socket=self.usock) - wsgi_app.server = server - self.server = server - self.server_ready_event.set() - server.run() - - def __enter__(self): - logger.debug('Starting %r ...' % self) - self.start() - logger.debug('Started %r.', self) - self.server_ready_event.wait() - return self - - def __exit__(self, *args): - self.server_ready_event.wait() - if self.server: - KillThread(self.server).start() diff --git a/venv/lib/python3.8/site-packages/setuptools-40.8.0-py3.8.egg b/venv/lib/python3.8/site-packages/setuptools-40.8.0-py3.8.egg deleted file mode 100644 index 1f5c4ce8f7a82f0136d01cbb29d5764aa408127b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 571891 zcmZU)b983Gvo;#rcHY>Y*tRCN?Kie<+nm^TCg#MpZBKINch0@vch0(h)Y`qPS69{3 ztNYniy?T?8Fd19fGdWwrS(yWL0EWg!&Sv&Tc4h!_W<vl!fYjN{#nsWp!NJy<;RiD# z7b7!+qbJ+Hr<sKXDL@a-#nQ|kVCG?F0&w(nv2?Ki*9BlO0gzhRIXVDc0M4Gy^Z*BE z-v2Zh9gSQp8LjM{&44b{%>PmUx5miW`9D3>ROHN5G&H;bbD)DA;QzX1G;y%AGqN{j zG&6GcH262%#mLqc@c-I3c5rZUb^#hW{<jA+4=Wey|D&U(p&<p3k_(Z-nb|s<!2tkf zCYBEWZ~?5G0rn0qfPb+AOdNnfGZPoUe?c~P0RB_{>-`4~U~Xk=#`ymYQnLN$-3$Qy z@2RnJ0T>&Z*Z^D{{zshuzv%(|3mV`8^aL1L7+Kl>m#P2Eley7<f-$#(Q<4RTzyJXO zfdL7DlTgrA>=d{9_vZIckpId5M9b*t$uPx&6fA@w_Qy}rs3Y(P0RYV`s#(|2G*Mj3 z%8qOqqk|uXW$DKa+e0({Fz15o`i&h!iF%fv+U3v`O=>6z`ZP!^nQMRyOMy2fPn&J+ zBJk3teT8GwWy}KU=o(Yc7rt|sSg+i_1pNO-WmU<kWQkjmng9U;GKK&Gg8DBiaY;!A zX$1*ICMDVbZq#UO05>>Ld`~nAkgY6ONzYalvW<${E3aC!UW+8$9&ki=qeSG<sIgL} z`fh?sq-3IwXjKGpm;?E_ym<ra2JSO-uD>CnN+-zN2)gg=J)lrU>qA>*N>5v=$|VQ7 zcE_@@v_|A{8)V~H8MLa^Ju5x<44XvCevA<?C@z4~xfpvOfR8+6V0u2}%FA>qaWCld z-9yZMh??!%WJ%Z>)r?Rhpj%-N)1%PByZ-WAEoP$~TNkrQkq#w&2w8%kPn*UfW@TK6 z7)G-*GK&(JIK<Y=gq$GXPQ^$d%k}bqxI2D+h~;ECcR*S0`*y)>fTxH;08TP+3tDEn z%7KCNwZccF_6t?cb%9_=SnEL2!DLM3DCVlL%7W=iNgY@Va#IeO5u>C>j&|mc0h0r+ zKypG&h|aSt1?g>y-R?2Ld<Xe)F84y%h^SEV7%obXRqR3S@|PHEEJW|~rR>Cq@p@C* zbDx+GEC<?Qa!Y-n&TeInhZm|2iYt#TeO$f7`fg}#vU1{IBpL;VvE{kiWG?Y7oomvS zXwl)`SYKvY%gY7`pNpYPnOyg~1*)&(%dlD%b8+*c#hqW<+R0TBL>NT>xEv7mJ)_q; z5tuf<3L5LN$1!H34WIB>5*MYilmP9kVALt%XFWRlV&0iGr`ErapG?%$=Wh~b;Ie&% z)o?(EYD#amenK_SHx}9yBDnQrfH7M$JTuptHP2HVe=&zTKE$1Ws539`<G3_pbFj)8 z3?U;MNY&7-+Hu<rT%%4QkNGi;X>e$iCA~Z)#>nw>x9n>yAWq+aD|ESBdA(T(164?P zz2T~o4NcpX#POPN6SD9t-6As8T)8+7dxo9nZx};U)Gs`gxHd=q$eR}pH%A@8e}|S9 zKiecSgKOjJID;($$lp|1sbYVNIn!YUxR^^L=!jN^%W1b29$zBh&9DuU!=lCa%=moY zZ(+-bMa@F>Y>jh2;j1{~J!H%;`n_=ayCE|DDwatFH%ocXQVF98koR;U*CgXoMXznL zAOJm^ai3Zi*ee*ufVa<7rXA`eefJb@G`=m_@R?D|s!ZjrYw^!WN&eF+t5>aFrM4S% zXbO5?-&;dFe7CfT{q#KT<3(JkOM`CmdxokQpZ0US-J6VA3Qbo~KEh5Rm`>P1WL5RA z){8cmB6m@aY{BRlBt41R`jx4Q7c0h?l-)LK{-12p+H8uFP%SuoH<KtAqU4ui(zFD4 zM{`7+VJ8!Z2VEy#`*IVB^iXA4*3!PZQTK}@#AF??JvF>?id1X$jrm_JmhOyiOFIg> zzkHjfaCPtaXmk;Zo_~oq9f-a_3lds70Z+en9}T11pmjby>W9mA++}3<u*$6MH8%St zhQ$~=TnzAGSBE;vCZs|0L9NkwSdB^2<D%K@o<1O}yuxfTlJQmlmUSxj+Pf;|k}xDb z2n+~9M&iD+4@dao{EUL$K~xMX-gRZ~wHi4v=Y!RMF&GheVqWTgx{;Arbbwdn@VQ4^ z&(BrIna|w&yXEl3`+{RIpBnsigq~RZEycX`Mj4>G_JRGs>B|dsYT@Z0eUW2<fc%GQ z{||ksD60Jw6<1+&@o-7ilz0BeU_BQahpR+l@>f6jy>%&`n%#JuoJWKXqXr`<5B` zf4(!mk_5gsdP`6FBJUb^cyv{b3KHq}+8V%@PM_D6k6uk)xIKN|-amSNyekg8o^L$w zy_{Tu+=MW%Q`5q))yWLJKs7h`gD>$L>Ef^dc<v}9WI`^80xq4abZom;|61m>(WxQl z7l!xIWc)B98(EVHJ~LImzBpqNi{*Ow$)faIhz{S{&~YSUvc3qdbenI1>{1K-AlY@g zmVk(sOPGwj!gZ?w4$hec-q3O1S~us={I9Ttdu>{e5(E3YITy2C$hia52wnRo(NO~> zT=S_a><la4yYTHtwy<!pKsyHHx0@W|0I()Voxzn4kKl*M52Q1^hH=7J&{btM0=bQ; z81U=vy+s!|jv-N_A#70=>af%W6=iFAxiHEPFBja%s^K$E2(l>zlA$&OfGVr8vk~7A zTJqn&Or@3-?0Y;wFn!q6HBWOT8oDx<EP%Iks(H79%8#y+fjhwpQmXdepfpMC1G+hb zPISFxqx8?^J%VeUL|}zSY1h18r><)4V_GGdDY!=|BkK#H4@04;_w&pa?@*RIs$x3{ zI$z1)aKL_MJJPRLO8ajL?{32q5mY7H@H|)|r|Ckf;#0@8q(qb6cvr0Rh`aiq=AN7b znmKdq8UW0cMWXPWU;7I+j?}8D&~9MHf??2zMT*+Yi{KMsH8(eK?EwydA6bkM<){^> zUcmWd-vZ31pssW>pUDhW0%x`MS1-b@Ci*GedVfU|j%yE*6)thcrvBML-|?~d%^w&I z-5f+*_!6sW!H-_fVA&0|oA2L^Cp3a~WCRf0{%dVXNPm9g*A+Pd=IH7PyD14O@7aR> zmCcUjX(jL(;`(+nXt)J8FgJxzeFrIg+iV|kU4k*;?>VYPQ^{iTmyJhePjeO;M6h87 zhu3NO&K*N(#b)Hi_~9krU|EqVzfWRdrEaH>-}uA~UL1iq8QWtmIqa@j0ZrLJO|it# zIUI#d-Z+O6heX=MyNLV%I@w14C3-PdZ5yV$q7v1I_7|$DvZ4v^X!IHWRCiMYYt{*a zjb++}lz-ZZ#w@+37EjZn=DtPrv55Bu7Lx;Q0Gk}X#9xi6)tO4Bft-nbnN}@=oBXSJ zm7Kyy!>e0YFKMAav-|VdYq)t5;TYD0&DfNI9}7QYey(&7-bYiVbUUCY#m!IQ40ApS zpEO*93pDf)9x~dYlNs~BV)Q7o2@A&-4uP_O!kdKmaaB0wVOUYQmK+<f2%X6WK1ARL z@~rKmq(MgJ#*@~Bt+?`7t^%O|970f>cQ1s(yHsTm`H~kPZ7M*YqdYxhFpi*_irbk? zaJVA*sNcuqaV8<7eA*kn%e;FAw~^rI7^VRWzs>O!!c)<3)05^S0?;SKgd$x!K&h0_ z!%?rS2>JeOGvX#HxC=*ErOCoLM1+ql{w_3inKm0%8z(L;BVu<h(6s3d2xi<8ewc3s z;8iR!gOy5a9Lcf`K5q)|v~wQ(;DRDwZtAL5{piiWDrUW4-bd_|9ixg~;G^V5HFBNP zO~0NuMkCl|!E}?N&L}HJq_xOG&j!`?z=NKNlELLLVq>Er$9B&1Q%CII3swyN<bp=| zm7z5Cs6taX{TjUetzC&5_p^QtzM<Iqy#cstHt#*bLjEB6j{LuAl5@>qEA1aW-ux57 z|4EakW{zg|re^jgo(8s7_BPJ{#h26LNP_?jp+7x+d!6xxW~_H6)O>Kt@St)gecL2X zd-F@vdbz9KR#YM)oyNiUrz~|WZE-|EJ*kFkV{F@!BX3tJ0w+yxxU-Ew70LmS^f|jw zGr{d{uGwYlFbU?#SXAvXW$S~MMI4;eWWnFxtFg9LzR@)&QG#qryY=PwP7JiQ;K(Vo z&p)ZIeyOO-njI^%9)?r>Z$P;fclgC%ARx8yARxH^6Oftxzl7Yt(ZR~z<-ftGPup(- zP<kIQJOeKaJ5;55S}SQ=IwVnz?=GQg5HTD%t{2?<ck9#c*0I?<dL8_xrZTV#Qx_PR zsj7c$_n__C8~)^;{m1ni!Qeaib*>jkBJPA5(}iMlak8#Mo<2N2TN7kVu`azY_voRh zx9Y$)ThdBPpCprAR<8W?!sIN4pGBGrHOflzR5Z%9KSTRhEMY|)+zwYKTaAiRN8#M( z7Zh0<c8iahtIo(NqHvdS%nP&th~1)9)2w_nR@%~X(v``z{Y_a4^V_VnoDlKW!#d0J z^a*O5YoZ)^>aEwNaYYZ<$+_o$ut2oO&{<qJdAI{lZ58Qr?o@*H%q<wE!5Y?`kuhBs z|2UDv^##|Cq_+Hk{~gL!7Z4mZLM6;TNY`Fbd?3QNcnOJ!h&-RI{$P&Fetz0cPHxj& zVX6vZNwPClCS`(+Q@b7p8!GxhSZ!g@?FV;?vM}W%m&=Q7IHU7x#^V*o6C6qvTn3?C zBR!UW*P?zZXrTwQKDDHqFyqfp1}Lg+Aze*a(p!@CUQqM)_5#Ue$JweWv=BLmjv<)u z=XsGWoe(2<+xui7&wlnVo1}0r5!g9lDXBXo0<TQnCC>@mM!}mdbGCqtfj%o&K|c$j zvE<)*gjMzigN0~X)cbFi)G&=~>t24gMj;#ezX%;yCf~?u=JFFFdJWJx_g;{URkmot z5KKA@74N|>M_Mz+yrsTNjN<as=BdHSnBKk}+qFNTu)>EQ>WJe7{r$h4PaLrBrgZ0T z%mk>Adfo6d=q+=ki!tqI$NRCiQ+0;Xa?VWJk@nA~C1&iuj||t)#K@tNLP~qLt^{AE z&3D>-OAu{_t}NIHaTEKEFEwEyDG-^iOV#W4ybgpO8%jBJW9#er(nvW&KB52j$_6ut zSd{p;qGkUH=KoyTKr<&-E1=nbt?Gj)1qB9Lnz$n{<xH#0)>a9qFmtaoF9~y9-9N*_ z-0H)r!*`I}krY;M;vKE6=SP{IBNFEgx<Yu>P2_#lOUuhbvk~wh|JyOME@&e4KZlh6 z<X<-Re^V(J2S)>2GdDBa|B!>MJbi7<>=YfN^wjts?U+J5lMKTQ6N8Kb!!fM_0}TW9 z`0OmrG1&jG9rdsFO@>-w1^;Ig^q>5%D$~o#k-^!>-0a|gj`&ZtoKoy*4-W(ZX(<5x zuMO^KV`1<Qyn`#y#LSt=;NLNUm5YJFzq)y<=gJFzG!^ifuknXu6kZ5QCn<Nz^staE zs)T&KfufdtBe}3c2;DM)FldVz4+YZO$LiyfqNnXPZ?;lpY3bidz%wpiq<BG<qHivb zYwxTwht08??;H7sJ=SQSAQvAW9~Xo9%CK2x&1CCZt%ce1<KxkQ)4sFg?ILI8di7Y^ zv>7{H+FFrz8c4@BhML|?(}uOP+S0AhaKWfn({l~-`qgl^c6yV1)3#Z56;O{Ons0Jj zFZEr7Ij#D$K4_%oyMfVu;@NP)RAcx9jYQSP!`T_~TT8U7HN-zU7J)olfmosZ;8J+Y zmdLbC<964#W2DVch>O5WWjoMGogwDPGg<h-b|Xz|;drq~D|N2G`kW&;&mpQ)+b$hs z3h^Q!ELAV1zLz<vH562py?MCSkmzkd_y)s>{lrX1Z~uG%zis+G3)+D50$*#_ZN+{9 z-?xvD`0(h6LJ-$NoPV~JT>u>B3smmth%y_q9(PiGcYcPxDmzNOVpUlZ`YnDbYKKH~ z@y&L_J}dk3aoFnlt$5b3Bg(TQ>}&|n{K~DxdKo`!)5S~6p7Oz11wnG*Y(T!F!}^$; zWM#k@5rr~&*sVz~Jy}|PYtCj^e1pC%8#uUwjCAOpQS!Cc-d8E{y{^hx`qks+Z|7Du z&mQKv`(sMuOvJC9VVV6h!Dh!E?!~sD29z$l)Vsa2chkPI6d!F*sL3rJ6cnpo^xb!v zK0Tl^g1lFH$v$l<)Q`y_${H4@#a<S=Ot;QPaQL1wqrdF4zC#b2t_>#}NEp*lsl!M7 z-m(qo?7YryeHRj(lNj@H!FJquRm7PZFz@jOCJadC?H32%4^`{hHKso<L_c+EIcFDN zx<GH}TI8SP4|F>e#Ge;wt7qpzf_|HdPbTnv3JyH#`vkaJ!4^E<!Og^<kyxkZn%3<A zy*bk(iHbPF)o52*p5c?P9a4rCKFd6jD;THSE+}mO;3zy<$Akx@9l*>?!!=+z5x{`v zOhyytT~vpn1ONDd(C;hYAxEGr%Kz~4az=D<K!}J=F-ACX)mmCvyzSy-+Ud#Y{(JoR z_>}F=yx@Le*I{vH!!=<e1i>GAVB2EP7!`el6flT8{q^}Mj&_|NfRF-xR{>gMvsqS_ zyPN->ah7*&Dr@2Zn$M}Hy610*_>gT3)!YX$q2K&<68WKJt~6yR7_ex|ad8fI3R26M zL*A`vN?}Fx0Mxonh?@XQYoY^mU&&`@Z-c+SnFdwyW<D|+>{DoFYRK2XC)>DJZJos9 zw%m-g8@B{OTHn}@J>olAkXksf;vyw^oM#<7nzRV1K^4b)!j6lyRO~LrdpqcT)rWq( zl~r>Rza7gr^d4U$?XtH+N3EeDAtd}oC!N1_ZW#;9k8hGJzBEW!y_lj@>#^LW@_F7s zby)1I*j?>eTlT211P>37JN?A+gzNUd8<{a3dl*7}3V{B6tjj-h@^oJUDTrnuux<au zVLByc+I8e)&&l%a0L(xV*&sh&TXppQ(k3XF2MnV7JXWsp`PSOX-C|IWc85fQ-?nzp zG)+?EOqXtEw=Dr-`GPJI%j>OnOR=OZyH;6jz;eK=<@^9_DytsBLo$l%z+yqnhqsad z*%N*zD)ep#86j)m%T}9t`(-ny;=b85Gi3)2Ki&gu%7EG29T6PnC|JNiX92H+$Rnv= zFpMM|Qls=e+qM<DP}`GzqqX7jR>N-fPsiJ`-w)fKO7qi&f<wC6Wk0wSG(C+?A4yp3 z1BQ<vDkgn0{Yre&H;%vu?GEGoJ~kwGSTtBLY*Xuk#>Qaw`gQ=a9^R0@)7tg-3j-OO zuUbvRs>Tkv0Kl#T*=p+f!Xu=Wm{oQWh26=5i_Iq|M-a_aR0kGRp`jO6D9MI1(^SX0 zC9Uw@!=28yikgHu`>yn-4`Z$A(l>q(e>Huqrd&{D2rzCY982NJzYDXhpOHC)etaRL zQrrRl{*JzM&WYgc1V<Z71o#8!UWP*F#h&aNhf*nZlX~!oqnSbkvCTuU^}?U~rquj% z8bp|`F#eqiZ|32Molu%mEVgw4<D4}jP6;!$v#5h>hV!J8>|+Ac+xf^$dlq4olM;4Y z721Nd?;2En?(~a|ym058skPG{Mi3{W9@ybvDDRS@2O}*Zh+4G1$8NWx0ygShg*r;- zk$6Kz!MD&ksky?=iDY+Llec?SmzbPzowkf$>d&rt_PTQ&-ODS!#!j##4WoESob)V1 ziA<CG$Hw}m$Wc#bA7b%>&tXh3$m%mxv`7elJN$=+AU)e%=LZWQB_2dwn|hpL*dk`V zej=T!m1vCp0w)^scfK4I#r}nIUE><5*XCljsmeZpA;h;L{_M&EKEnOs-r<*Z1&n)% z-_98G;0NJ;5e{qf+?wx!**x^&4Gzcdviza-JbD#Ya(amsp|0$ZQ7~OQfvYc9NF9KI zv}>?3&483>$PKrGt1bO<7yQ&JvHk|428K9RBkSS0Q8czmpYteN2NMgH=Av$A$^KeP z-`Lp=*_nB29kaC=pgRfX#N4>%hFJYJ(i?X1{$6uAJ_&hqQ2py<DNK86H#ZH*Q2C}2 zYP@sfIHP3fteS&C7%2aW2l18*lKdJezd^S}xt_v(3Bf!yji<&rnM?Hw2QLj~2m|E8 zf<NQdU+zEUs6p9jTcoJB&R$zW*#NTbX4yM--PQ_2P%(h8TH04rQLXKDYwoB&6;ja; zv>1o66)*}C_|Ff1L#<J*IVK?A_YE8g<lK^V7KRl!QRU~x3*ApJtxUVIfBO6Y?jAnB zwQAbe=vL&D;Z@n&a>2A`FtqdwqsqdqicOtnI)?evuUj9hvCyXWFER|>CTJ$dXrlWt zgRd!*X9n(W8Y1}HUr6)nXjCEk6_a(@Z)@~hpSr`lFq?x^s5NxQw;tsSks|sF31}Hy z)yuyFjGHVSNuaSmOXO5fT=zPIMy50&1yQ4+nI?;RD|R$4$|T+jHIuX*x9D*jx3A)A zM7YArhwJ!1tC5g0+YCvp=wTHw{I8ii;6mMsbul)M%vr%%>K}&$^)vvZmrD9NNho3m zV-Xv4xHVAbQLEGLe8Fveft>SeE8>VH6NsOl^>3?Fky@`$kk<z^CILFqRF%vyA>HI4 zE=0HN+)J}rUZAE4fVDUwnKu>i#%84bY&>cGzhLQ6UamHjC@mK^s`3(bkaD$Jw1y-J zr*wP!#bn+5`Zz+AuHzXDh^CVbUzPg|_NEPnkB$bLqJ7TSl*0^e8WkUzfSXFR2$C^n z3Njd4Mv!6iAXbDJ9%@$>j#zFu$L@^r+<MjMzLeV`tPZHZ(%6Hi7R6RWsZmji<+l>d zKE4`)X+h<1!}hvv?LnLqo?5dLqI_cgWsCUYeS+Vf_n$`_?l70}Oa}bE4;n8|R~HW3 zeBOJ#0w0sn7T?eB+3wfjCrrJ*cS{#4Z?*iyd2ppXQ&P9O{eMDqX!yX2%=OdLxfI^d z_8P5f+vpaJCg=415Pu3*1}P$5dH<3e{EB$zx2yheg1gxB502E=hca;Z_el>`-bW6b zVolN5IGS$-qkg_{7I=9s|E^FkM@7k_MA1yc%G@1SBn)KnnDDxXg~QFW^aY_^#H37Z ztwL*k`P4HwM{Avx{f(ggH50gKarC(d>EfhQeS#_(c8-(@(AD4+7caj)`zX@JatzB0 z4|&?%9PdEA!sS^%%-kx+W>8MPEV7i{k2*erTTAz9EtXB&k@R(MvX?d<=G58*Rd<Ws z^ytuy;Q^!gg46A?OwNfz4#D+_)t^Y@ChpjiaB;#x6ik}RFA9XX9)7!SA53o51)D65 z*^o1Ap87+g7-3p%%h{V)AK^fF05$bmRwOF$Qs=okpggLADMX=p?8i(h@WmpGKafPR zIFxUB??Lhv^O=1E7GUv-vin6~IgT^cH`t+-YV&9HfDw@5%Nro;^L*NU;~L<9vJpRv zEa(0Ey+@~(Z91_QJ9{q}+O!#b#OZKv_gx`j7DPs2Zp6MaIXV}#W+OH~9eyK1Yv(-! zW<qmRNmC01w5cS>3m^If_oa&=4RzvZ+&*wtqIJoI5ZGe=eC@8wwQAiK5%4SuZpat4 zQtK`^1ieRd=78fHKP&6g>tU4OuWvWUig1sRK-BzeJ4I+^BxI+e*|bn5!+93|_Cufg zil5#)PNe(mYpr|@L`=&c&*jLE=u+6s&V@?G|2Wb#>gk+{UlEb8fq-Fbi9Uki_V1x? zc(|o3(dz^MDmV!*f>MkVT4Y=yZ0?g*^5E;q(4RW)D{m{v7obB_12k0Jk1#T5hMb@G z)rcq?QJ9ser|N{iO$P9j%vMm=Pj3__D7jMqt`xW&AvYYIeIzopI~~ifEe9j=Dq-~7 zq9NxnOn@Qgg;&0}S8u1Ycj(l6tvP9<8=?ee*T|@C<$bx{KP`N}y(1>kI4p5{-@m;D zvR2)mK7bF^48F`FA#}m*5EDau(th5b_On*s4&9k3_mr;I6uxEK7P-~)R;3=eH(70( zPs|XmlzL|`@v4A(PHbR)ie)isvU~<jcyHrsjtq7v%9V3Y`*hI<dM9#HEzmrKdtjl9 zk`UvUV~D_UtB)p;diT!}nO0vA;QK;nVwNo+t?=j0>qab2Xo6Mdt!}fiNiQ0W2LJF< z^8H~tSGUsN?}AatTt8E9s&u)+mY%prnguTs4pZJ~eP#~QG4}kU_4DV;Ar7Hv9D*;i z)WQl1O{6b}2wqqKn0$InVq$Jzv&C_Xv$A{=*u~C-UP&)2rP{`dWY9^C(H1e@JR}wh zUA&P{r&2aH^|N$QW`I&l5E-+a?YpK>JVen#jm|V-mAt~tj9EkI_Wi71<%Cc!S1DB| z3?QOVNBc7X0WqB)jv)le0J}+L(N+g|EtG2-EL`mx@(^P^8txzs=l`na+Q7Kn6+WBg z`qrx3S106{WHCs2_&5Uq0nd%t5S_8EC1J-4&6S?4Dk@deKqf{5jeesEl<(dj8LzhP zDP-SscYY~*%<#eIA<Rj#_9IKiDNyGI$-3s;hJ6^+Liky$GpMpYMQ|;VupdTyo<Ixv z)KQF5Q^BJ52HJ{ov9_e7%OFBFqZqt!+^U-|fX_D$Rkeh0qxEhEwh>?Je3dHjhAR(% zgCumt$srMJxc^{8kForPvi7)Q!qPDVreAsV^!noe{c?$`1Cz!ZM){*p{DbXQXW>l0 z3XzATNKU<BtB7&Za}o(mBjCwr+DC0^1KEYJLZ7!}?oba*3{-sne7@6(TjSprX0yPE zm;yZ|{8PMC?stc9Fhn3lpCgD-6IMCZrn#m3>HP?Y`6*1c#%T$0VjKNPRMGD+n^>-e zB{YZJH00#Q#f`9o=EAL-J;?WM>h~$_9bq1NJzmWj^(!E{*y(o2<hAfY0!?|yoY*L( zA2Li{938H4#db<08AB?){a5!Yt_}R~t*8Qt)HkVScGbURs(a#hq$<X8qBbLWh}ERz z3J8QwJ)`p?qS_>|eYu6uPw?C2(O2P{0Qmu$Y!!~^Zo92R`qmBNFak-bB!#CQChLds zIH)3xXE@Mlx~KUD`EL{06UW2+9oB^Ybour>RCY3|31mEGi2r9exbhIQY>SqI?B-@8 zT#XMVkx#eDosX=AeT?ZJh_PYT7u7?|+)pJ2$>)U(sCs@U9SvePA@~W75=dsOTy&(M z7`MDcSU=}01%*xL_%=x`t!CzsA_kMz$WIjUw$thsF^WHpDi!<?hWiWrVG?bkJT892 z$Y9|f&<MH1r~L@Imdq>@udSzQ-zc(yVEh7AGQ*e*2YQ8*!VEKqf@yjww<fp)ptZm* z((=tq<*#_pXN)-KNBstXAX8_^SX_jK09f$#@o(t#wr)7$-*nx#S;$@bvzaM5rjh9D zT5KPU1xS56M>xlMX=Hbg^21Ue9*akcmfc@HLyGIV)IV;Ty<Kx41%1*2AcwN?&2REg znIQ;$VEOs{QvCfQR{#1kO_~&b_F_*sATP)z^Mmh66#Dy$gEiZtzmq0~C)<jjzoYHw zAeS1h?B`mL+DG-VZ`%ov$YN7Y7=Wt7OLUn{`#C3x)8*=C-ww}qG5HC|SWEK^VPB8_ z!7o7M^LsuXSfbFbXoj{_W(F6p0l{u$I(xwpzh*0f7#Fd|PgZdtM}W=b(bMI?<vAgA z;WcgvX1hmD+{gyRIF0lrs15E28?akO!af02UglF`t#t0;#>=1vRr_fQ>vR$!{_I!< z;;F4}`mmrfG20IbB)EEWC>@OL>TV--*9>C4!hKpTHTY>$=O3B(nn#!f1W&yv`xM(C z1mLA7C_ADcwAo{adR<z><p?U&2UK4frsLDyCy$aV_cm981jdZBWauPH6thRLTfok1 z>y2?u7hi;CEc3wB3o)Se56J!kpR7Esh70~I*ctE`hJA;G6ic<XLWUCNi-3ecXt~is z!Shd;j@VK(rFOX=(TbRBWK)s&d4aJ&-$>Ilh(|eiPvb=P!|foru8WLJ`aonGH<d76 znCyhyB-~d7FTVCu14=Y3-J_b%ezc3B)zQ;g)DqaY7bZ#)u%%pdGQ+QqJ-X{FOy4^x zC3y5y4oY|O)-Y7kAZ9Z`I~n))D{?{J0F&YEQKcXqw=3q`Q{_Gukb^w7IxwF4DpYlb zZs-pqH^4Q)ztw%wZU5Ppfc&TmfKAd9K@0efLL&PRN{;)bl|b&^K!0xY4u4AYhZyX_ zzPN6}SOG|!<+g`HKkocdxn2(rqMye#vjoROR@fU7oo85|3@M6kh&JN!BX^$}M!JeU zW*FJjO|4*$u$B|fs{I#-5YfFM;^ybL4js#Px}C9&A%E`01aYHndvz_#wqlDZg3XWI zxOv}5aIK=YI#U)sNdkVF*S!N#`FObM1-%=>(l0Ed6()fcHaKoz(@|Tqv&*TT`q5@z zejyv%u4BV?1Buv-O!YXCn?gLxb4OS7;|-9Z`P><X)Q<pn-OaK6pn<d7h`6c2+iG6V z+PyFd20tVTOdr(@c0122&zknO{F2RESt1S6$;kvPg^2b8-)~b$89!>9`p2rtAc!pV zw~b`95dkr~_8)RM-=Tjcf>@7?L_yy}L?Q~^@4Y<K5e#nOpr@+@i157Jk4~6~Fsih^ z5X;~C<sY4D=cr*J{sd16qL;p$v3lFk_eqGzJ<6gIz2d{DG(YbU5F_#Js<N%Ms?YLZ z$~iI%coQ;QM}O<7n%TTzoW0>13Mf%Fs3#6VY$16)DLLGGabWoFM#h<#63UOMSIa9l zHa%P?Z$Shb`(#9Wdk8C{A)6Z)qeiIbEYyl!VaV9}5%8#gGZI-Hw=r|Y<A*skG4<<m z4U+uT*g~^J=ic9B;=Dj{fNQ=(vY6!1HGO$G!z=!JBi$WwJ6ibSZR3huo2PB%t#pj^ zlzbbN>{eWSX~~r{wgXa0s0m7@U<N|av@<gbKa(x+M<R!y<G30AwfqUZx3d{`bCYT* z;^p1l73t@Bo;`0>n+-3_mDOM;>f9q2ch~IKb%VvGbA*p87`^YAG2fYSHxdai@h~3X zh(+@M?Y>9gu3%uK5!DRE9ifX6xWyBqP&}zD5z#|JRJ&%c8opE6S6E7RTobJ)0fmG3 zI^-Sbv(Q*jI5g7ad;#$c{<Z1aPSgnr1EFRsm%YI;`QlOd31VZ$w;3)WE~$_k;ejce zXa_C1n-f)Gqo()3T}TVLFqo1;RKZV|<0pjrXtkP%l0yhTAA#wa<nk&^5fN^SGR(wY zMR>-VfO>%-<<I2}oUx(secGceD!Q3R|2u|#M^g*8;1aVsR9mhR8hZ@!W3dUN;bL0= zC%mq|Y{6a=LeW(Yj-~xEf!RR^>2+`<F;<0SI*T1JSh*KBe0x}%yQP_{<}Su;m;|s8 z`hG<Da14k#vIG5>Z^w0PI07l&u?l5E32BeGstept?xOPdc-7|9o50u)7k=48%UP?3 z1X27_{v%5qp(ScsdpogOmX~S|Hek89M-y<x4ZehUpTjpGI;3!`ARzNI@N{H4un~rE zPQLMEWqZ@w8@suMN-TblkT<_qMjVv{QF;K^qi{T{HO_*ChbME3mn9;yQF3trRzFfA zT1KILFd?#y&V+Cy;{qTm*qb+$j%t0arBiA`c0+h_h>vup7_lP0%DpCxlFooA>6~vg zMAJAcY5Fov^7xsyRu9XWr4+3hOB)QO$mH8aBMZBz`q$6rmtlPyd`F2&Z1G{jBunk1 z?<h4HnOxmxtU?ZWx$xisSJ%m6oGHR9!Pc%EuT(PUY_g3yCvlf~W&1sWDV?mvM|}n< z?Gla(2nR`&nfRNjSVPQX@g~;o&nb(-Umy-NMR*lN@M~B<O-2OfeZrQPo#~Y7X(!zF zA0hl>!5B&4>jh}%8j}#{+se*$2>lev*3dYlezXiG#j{04ifDH=J4)LF&vlGFVysxZ z-9x7Eu&k!sQgw6z6Q!X1E%vHNQ{urq^k*TTgr2q@(R1}6ykUc?9%kQoYSdOf38_eg zLYC?zO!m}fyQ+1_gvG)?s7lAD&jcd%w3H&_(_>khnoy5JgpX(HgYuQNb<9jK*Hdt% z&2w2PB56Z*o|a2|)5t$JN3+DPyclE<DC%kN6n)buJ~d~po}esmTA9!Om5#CD6$dz1 zGtv=d?Hm<^xejYp8-IRdKz)z}4`Pv!ndEI--Iq#0UdxesG7k*`QbrwQ4{(HX67Ln= zWm4_5mJ8db-6@$vgW9Z~(^jc0$z2%s**dFlQ4vcuRaAu%6Gw@t0B1kMkqRo?M*1s< zM3#iwn%D@&Jm*!=3>?Ym(UG7#AuQ(Zb3Xf37(6VdAcdyE<2IP-1~+q<kHFQ-bR85D zEC#?Ox6P@ho?SG7MwaBr`DD%jJC3G_Lrl{=PV)9R<eAo%u7y#LZ{7h#N3aa>$8Sj= zv#;c?r`J0?6-+hKprivB+l?@Kh_Y;uS(#=a6a54(!Un>6!U-YkgRf2kmFVw)cp#Y` z7g9Wo53w~H2NF4P(1D0<8PqxzEZ^KV7YGTt?Zm`Ek;4Ur^=NsgS$p6@0Bj+Vm6S<R za(9#r8H6na5%a|cJUJUSg*6ykv0#6^xkZ-puCfCJwuwr_sEhAyurygBY2$L-?6THa zUvV6m-AbK+s4Kx!q2_^h1lr9(2!ieX+E-i9_F$VH2LANWokj-*qK^dcbz(X@P*Vf* zGGp^uUdG1Nka>mJ<LXcsi|qIvC~Dn_kw8femYU3b4R)u6J!0`!h-)!?&go}*n>u<C zkNsi;1h(LrIf~@Ax3PGlgU#1ANm%10I-*?Y!)UW@jxvFwOp_d*v+3txG+Ix>8}m?U z%(z@Yq(RWCIN0DK(wsI!&`!@8m^pHc0L+@$OxXw>C=CHyT{XRjAmN6qM)bz2sQ`&+ z#2=AD4AN_~jHN|3AjZ)Vh*(N1?}3PDu3pyqx^s-rT!>i=Y*Np#5te;=*?}Pvq4Ce9 zn`|2j5z~{FBw{Ua3-Q>6b^s<l?RU&_5q^d(^b6#SruwvajY9b{I0Ux8ovJv!C+_=~ zyp$<;H)#;BIVeoch0|vFWSPbD0y6)+0(#plN#wq}ECL2Y;PJf~B8Ctp6o&aO`+PgJ zO-cnj8YrW5D!(N%ip6JZLZY5sN2+Yk2{i2onB}}K7h;kdu^DKiPS~LWYYL7fzPHIe zcM1w)%k~_mJTi5r<@h^SPxiVJ$qf^+T0jE{s0!mR+L+?!Ak1DGH(W}yvDJImCQ-y& zYzfJDhaA)J+kh{DkZH5lG!;=#qc~>lT17*cgcFjTs3kW&#=lNhmM77rgkVGpt6)NF z4YH`iO{JpY7LCKQN$$DFcI+!8wYJMT`71P?@v(5&nekUq9bt%@f2{(jno&hRHcl_c zlMhBuP%FYV>Hg3wN=%2i4hte>Jd+u_#`huIltm}~z%JV=`-8w~W-29$*i$ej%>fE0 zqnu0aou%;aWEUD%xe10wy0{pbMjuC8&#srb03;e~gTl#{KqJbL2HV0Z@E9)r0}#KG zQgp0nJ8_^3!(`?coS4A^9>yU0821LIrJT<KMo|f0;*(uv0(6he2qA7vzU{8gTDn!1 zlo$=O<v&1_9T#KDq{_T9XI6VI%m<GZnQ9s8D33TK`!u6sXE=ulW<&Y=n56&_St=ZL z4UbAw^O)qPcDHl{@GL4J9##>d#@%!hTR0Y@3T^76Q71%sQ5$@Ufn9OKq1h)dmpeH= zi!A6;Q|Ek3Sv`IEE9-dE(nuWQfrj&&-Z>v>srV&;Yy<fXMkUB=LI134m;7?dako&S z@vZmQv3tM}ynBOQa<Mb1U8L4FFNoIW>)3DuP~=>c_tcKA=L&H?A2x_&1DWvnbt43v zz^kjs*=+;QzH?IQqg8K&>Q3kW@3zwP2T6u3<?cA{Pj!BE4j;}p9-6XbE2>kw<SKyQ zlCFq)o-}%@z%aL8T;s}g<q-yPcsqNz)`n?xQE*V`IP@X~!#zxHgC7hwc-wdP!=N6| z8=n+BdH`|gA*Ox4o%fN516Wz%A2=iulR#oi-bfq-G#IrmX;Wot-`^G)xhIp+4}3@_ z3AurtQ;_2WQ9s;;=~W~hut7)v#(Z4Z*KUPXJaOZqIVBaH8x6a{g=~fp!gS9zO6}=x z#maZpao-_ckj}@kt`x}tWN;sj=NAoqEERLA(>7!a&`H>hNOFng11@96Ieq5o%DZ5m zlgDn)>5~EeV;~XO*BR<%y=-LmeXmM}{Zv%KzV{`Qcw9Ip(lwz9aLR+hj~KAsg<JFA z-P-QObCRgEq-_8pK|OVByLo3YK}+d|p+M}>y>^qiTa<_!1#|R5$S`n(yu^ADdnI`m z;?v)fg^WA3Cx2DpN#mlQHsE<u$a^Q%uubWkC02y934wLnh<9@nJMVOOFP;feYKcTf zHvxoPgtR0pat90XJ!xb(t~1)!E5(}9J?|5)jCYf4Kq-jDEqlCn#|A&->X3>O<=k^7 zpyqHt+DxSy*q}AMDrr<jWYVj78=51h*}$3n9F=Jg+gEnj8;mZSYRi1lK7`&WS*pB^ z*_{$uz*lF#uF+VM_ioAv^-+?NUxTw%WxMmzre|rxbzV2mG}a`TSvfauj`mcvoDUAn zKzFh}L*sz1(C<aq)oQI7-$7$(0y4|rVg52!oAyDMGtJ)$&g2Eh9sJ<TMr+XNc$6QP z9!-#5_vH8r!R*;ZMxgPiq2Y3p?K;aPm@U`m9LD$r=bpxuW&Pww51l38F&R8i81~&= z*<~u%+^#-LxRL7&6f41vLHK6`e}8-IZkH0nE>1MMZ)lIEbQBXH6p`fVu^Z%hOv$n` zM8LOebSk;R;PIHnNT@+Me(8w#<%0yMRurBqWOitVrr*vfZCPqdlIrYM7ZkzY@g7Lu zqUO?C^g87&4Fg@(bW`xr5<zu73{PrG%HhgpAqBt~q}nTTBxUkJ=jjs9*&;U$sE1nf z^D?qGk!#3`Saerj%AXk&DeIy<o$1861~*dzxq@RTY__tm*1e@xpaN`UKLRyM{YN+{ zw7RE(j9djfEV?;hl&e8hdc`&GLa%2zT7Z*3bgxDNId+T~PP?zId#BwS-3QE<dvgP( zFAjp-2M#hL$U};;opZw-Trv(}kMF*n8r9`sivhFxqlKe^uI<tfVge7ojU=QcO7DI~ zaXr47+WxB{VtUO{?fX49yjP0A3hyOY$&_lumV(&hPGy6ti$-0u^l5=YVobZ0Nb#Gi zMr@rebE^IKJM``OaZ*Aov7Kdm8f)vAJPQx>fA{Nc6bj>6&hIbftu@GCnX-K4(k*NG zKdrfPGwyL6>N6y%a+<<~r3EEeM}vi+5Q0}0efw6$z@Op_3q9jLUBoXlcSa*d_vB26 zh-<T2YZwCxtH%Q!4&{7~Nz1|FOq`51tv*#uU8_#~6mtaf+aEnzR=v}?*-aEL2TRy* zq2x@~oE9i7POgB$pXL~Mw~(mEt{wC{*sk3f!|Usj=93I>*cFqkZ-VF#MScjqqcU+j zxdMW$_vo&%#?~3n>n~#{dJr<pxT{14JB;dZ&__yhyb{c4w2Cq7)*uBV{nTI4ww7xy z#~p@ZIjiS*+~b-aD%hi@K*s6Qnd&taW$k1WlFq&U38wU(Ufj4;4MB(#l%y!JI}NWn zRZQb|(a{HC=oW1AOK%(w_0@*>fIA|oPJOb)4~51yWE~!=T$|=9c;(~s%kj7N1I|Ir zfRR8eA-@YSU@@f9wN(ZrI|0$|?x7curJ;~_rUUAO*kbd9tBJ(=eqPubYfbw2WWjFF z_+aXCP@PeVF~bg7q_A{KLAw|^Hqv2RzUkAoL52(AM<7WiW6*tB0U(-I0aM}6>hk9y zpW^dtl*e@PBCisPG1Vst9i#F|{oX)>Jh#h3BRH_Hm*q@VwOZU#!&K*3;IvE=BlS)! zwG!U+mh;&!`G!Is!BQ992S42(CwGzfH+{N|a`>JicrC<T$j&FXso|JLhIysM%&*h% zV$`z3G(ur~>@#pg=tU<KZ1}<$k^?XiQ8wfJ#DOs`B;M_`jOsY@#a2f3E4AeM4-SkR zIfn6BQo^JxCC__a)f|x@*;zkMO6qpiJjOIsMeoFt!NOOc)S)*|($V8L$mSLl2vVFW zGqZ#heQlFoVqBt66DfQ~D>g_aDT_Tw`wW(gN}tS)Y?djt%u*QFRQI`Z;6v;6P_f0q z@*D*jsq(-M#K1n1HF!p5Qt(6(Wlu$2)0-;G_MNzOohX~fS&{2#VvoVm9SMxqlAwc7 zBT80}>!+BUH9H4R-UN}#77|~SR@u_(@4@`O)@{eXhf^R#QMan!P%0)xAG6a3;<@N! z`HK?Bud-^up-qpY7KG~>p@q7Mf5-3<?f327+gJ2kHV+2ENj(U4HU~1pWOiqVbCc~c zi2Tvxin14KmCjogMz-(I%^Ax?ATBDhutW;%2-+Jbcd59B_=5fd-zS^G1mSWQC40M` zTKf>K$VUcmaioxrfUVDE3{k6B4a>kgNJlPALd!N<NkKDMTub2%Z}Q?6>!SOzY{|Zb za=%9FnklM+%Y(;;k#A1><C~qEqq+OHEs_|YQJqzbGB~a70L2pwT8%zttLwtyw86fW z4Lrl_T3r98D_fQdRgrcqqcflg9%3n(<m&qL`;TUrl%^}{-u1;{-`Z7RAqe3Ede*Yh z1((zc+`;uO9|Cf06;}+TTr(G9I>$p|x35TQrnNSq4gMpA=j|SStz8PIk-sWkZ~iTu zOk{_`$bfqe0&2#ug$~`-31GKXoU-SNy~qO)#o$NFZcN8BzDvq*O3-OTG$uO@Gpp^i zg^ON`B|12zgDk#QecE6$fyK`lC!HFCUPu<W0F3&LqL+GMAK9tOSd%1(pP1rz8C7g? z%`PoTTE82DXJJ?CMMHuXu8TYv0C6Oa_{}$7EKXbjer=Xki};boYwYc*rqJEtYN*bE ziK-z}f7|7PaKVf7d_Td=m;X$RqgL)YW1H`l;fBk$YprXLQQ-xpjCDo{zIgAyQkIy7 z#3|Gh$TV0ja~~ImLyp=~foBXZU7E8Oh*fc6BW1B%Y@hI(iHVxj-gI(5h7ptN5(VMs zbt8eZQ-m|X)krW7y70Ah2WckiH1MdPaPi!8*;GgGwxO(2q?t|+Ds5C=_!+67I8r;; z{(?>@CO05cd{cSmycd8L&@PnxI<QuF_#3h=b0WFBmSITy7Ev2Z%I`BYqU3@poN~CI z_;+PB30)XTqHCX<iV<gjf8}5d>BpT+36GwweS~yW5S`Epy@m1V-3qa@HqtUmbH-!$ z-8`Ie5FDm?4#v(%-Y0#!w|A0cG8c@Y;KE9SRiuh>d5#ncgkQcGmk~rNzbq_qHOR*l zGZ+yo>TBLq5Bh7_D6Pzi)f#S1t4t?InNT!K_4x5L1MVX6gdaIm++(k25ydQTpbCp8 zoYkC7+{LLZtdSi+B~fHYBNV?uIV(H?j~gAP!WR5V7Yr^`45B<5j(kKws^l6Mx-gGk zf8r1O<LLAn9(2WE2$WpdsLbD`-`|u{PhT>!m}AlfkdR=h;a_B?2_1uDXwL)votqx| zOtwb4pMVPzB*x1DVNXN6Es@$Vlr8uSmE6m!*T+E~ZR_UhOvQ%YO*Fdg*a-~xyskJQ zuQvhGb%OBb8al%VGC|nFXZ~vqw|*z`789B=D4z2iL7v>L<Va$qm@tb01ZL1gU~e;O z!_l#35a)^Zv=6ESLaC%wl$#N)DcDYSAC6$0^hu(}&ki{eR%nyORMbs9?T6o;bjIU& z?8+A5zt16u;NNO%|8^xuziA0$GuBt-SEFiOc^N%>=gm=%Gi+RSnzT`?sS<8ZIHeSM zP?WyF>xH7%(n>VZMd>eZhAEunP#*LYopZIEuMU(S=I$uFrnjZg@F{<bHiec?&W3&Q z>k|{DRTK5DEoYyX#n{lvWNMu_rCND9771o?CAERLDn~=n;PG$W;>g4aKUicw5=K>S zxAb!dMIy%@J|g_kV^l8XODUkA_=PTP1W3s;LVKMjCFtbp_9x#kfoQJtp8;gK{=3yT z3>1M!4Um4Vl_sF|6!elZ6$*d5XoNZnkPrLWcKylEPOW|@t%fi>U18pJ|06B#Z7TCv zDgp)C=0~|{`?5d16eX=|w-{)Dk7Cvnxgp7QvM9TZlZ@kcf|L~cp^u_F*Tjpd<JI)w zdvy6+a&gOZnrnW|Q@R2*o{h^{Rv|8hxqA^~%^g$T#a2gLk58$g-&xKAZe}v+lP|VV z62<rX+0AUhr$I9m>$^c0SVq9xO0AH4m=o}|Z`9VQq|drFE9DhiF@2ur_gNWw`PL}u z=Q?<;=vO<L{VCs;1nkWFEapnlkqv%^6@t66AF|S0S&IhO{!{&vRodMG{fW?xMNvRl zU;E6!>6DoMoA(lhU}P=eG~t}8UOT=DPrJN#dfFQH##nXj3h(vFGt$URw5$HrXhbRC z!ZA{`yZcZ%WG0pb8SRddKoIf1nfxfGA1Xl18116yqUK=tBbk0>cFXDa4PG2Lrc*5( zsbrZO$%lAcKz`aqmGM$hrfY2Lpm}tjd)A+fpF&F7ddZmi8D###kh^ocvbaKZQSUz+ zCB+VU3Y6_t^<3Up-2FZOS_iR5=JWeLr(=V1P3rYAEvHh_?_PRO89emUVqKLa*Rx^+ z2B{5xx<VI|ha-ynaqR1%rlUO-1g`+iaEse5d@u~1gUo(&kl;s@VtelJ;{r0F^1`_9 z__;_FEn5QFtfT325G2pwPlGm_S=xgapbIbibwtb1;U`MKZNYPy%%Ky(gcyk|jZ}k7 z6-R${Rm-DQ|Msjwsp<YSk%RdCTmUV~1?MoZL0w#v-dUqP8^Nl>ku!!9H<pk}TS1kk zl(XtQ)b`z=O)|HG6OQY~RN4(M)Qjv4;+dh$S8>RdSc<z5<uB}#u@}{|m#7{F)i5ZM zx3<>`_3k%z(9uoMoW{OlcOFTY)JqLFV>Y_atkPlN(_(v)YIBv8WDx2xqflNAL%9n- zUbNa6&2UWo3tZ^_T{Ee2Ki$UMfoT%2hD5tHm?=&oj`o<gx~&S~qOR`6BYK*n@6cKa zCEHluoknyH2(8MsErP80^Vy1n3yOys#{${%&>L-1k<sn+H|M{9%+TE#!^%$L@ZLkQ z6&b2Mf_xaVz2j0L0W~Yhc3W7{Kr{wP=3lSkblJI?d!c84e=x5IrXOCPeriqcUtWJe zi3Uq`vGiixIML)=D=8taPkUzwl#`3<F2=x<6Pak!`#<u}x9V^`281CSJ&ajZYNcA{ z=r!nIcaGWF)R0DUjzW=*DL*<)eX<8;#lZ#R(mer4qklGpifd{J8ozHEhr=E5ebgq% zC<AJ}$BFEe)?BwX-<|NmHt)o}b+V>F&D<W}1pmg3$be!z0D~1WdWb*+wz95WlpLUX z-I$BIe-UmPHoA1G&qB4~5OfgbNYeI@$+^A~^4T!!4OQx@q<P#8raSkP{1D<&=STy+ zO1z2@a`L*lH#Y;f<2FW-2%m!7I>*M-kARQJ)X2s`B4$_Mfvk$9U`MYseOW-n$}Sa+ zub5oTD9*+7YrBxR`hp%Qu)l9hPT%SAdr6O3=KFk`bx;@*@3dm#jgxF<$XBwb=4F}C z{zxdJ3dG)^s4XlrAmy7v>M9s>puOu-R7u6~e7MB5#ro<0xG#Q)x+xm~JdJ=2!l7KB zJ6Nb5UPVJOMq(Uqi3O_mx{>}7mC$N!nZAoBp})oP<y_vmo0aegv@s<+g9*VDfiU5a z!X_c-?>~vUS!diUu-cWzEB^%+6T7W8Dcr8Q^$fR~j)v){?KRi{@=(Uu7Xh!kUkC0l zz_n!Fv!Tl^xL`c~QVo*D8QA1@Vx4Zz_N;PuIdGw2@K+6PQ^pW$L@}${OZ_1#Yp11b zd7qIB$#Rq^piaN<fGDA8xi+?e$qJ_a-r1PzWrFC!;Q~uN`K|Kf6ea)1g>er)<o^Rf zK)%1c8iEniwC-(?rQGp$KBF8AlErO|LfVNKLWU?)^;ax<(bd=X#Op>B7BHszFo?<K z*TuCKa&cNoENvFp-ti;EX*g8!q^sgc)F}JU>{0W(-~Da`ROnIjPw)vKz>BjhXgKtk zPp=vGz3wS?YK{12ek<AMiOFUbo{-#awp&?$D{dNMfH`W(?C?u++6CMt0`GBCEvRB# z#FOZU2iu5iN0;w7^tr;(#4g7{WEwg3CD_0zIzSA+Ls`J$3(nD{JDg5q@->|%3D}rv zBYthRChuH_mS|8ax)tJu&UOW!J35Xvv#qNX?{0SoPjC5A_uNbEa<l$u?6sGw3$4T@ z<7sYJ))%E_$rgLY;M7_VhbeHTb@FKO)PI}UFNBP@l|T1-UcEdx#{7`%DS|ja^n);9 zIu(xJ-BvC6jTzQ!UM@>10vNJhE&C56NoB(1Y8+f{i**4aNf`#a^mXQf`sLzfw^xa2 z3wku@Jbcw`$|pP>5h#szBW7JW(=sovGikX~FM0zkdt#0j-2>z%=SJb&2C!SMEjhD} z8a*@YsdnOh?7Rq&vZ8*A$BFeI-D{rJXEOC@+GE)#FVM?8LUth*NxHTsFL02{duNVJ zzhIHm$->>=&l#7(opnT6220*>?(}H<5?_i->o{XBqTsEa6OAcFjV8dsG$`iQ6*QYi z`9l}mninwCwo%4xKoGhVXPEsP&~GLJPUCaSI$)k1kF)`|>aUd$uL^&7{rPjV0y%ZL z#l*vO-ZSKhmZj!@>UyDA&*?BN4UgoDh!#{E8xTSUQ^}#lHChUrW2V?(&UHAvZoN1t z#07&$`7~81kk7=v$r11DV#g#=W)g|WLT*cBhu2FO8EA?H-}_FX7dbV%UL!908O0#4 zJ9Q%Kic>%`cXP;U;o}#Vm+fI545t$_>cu|t1Rlgg9C*@!U9DEoYn$UJMDK_u2Kbq3 zqYO;P@}ibkCRG60-NItZ&)5^1Cb7P#Hgs=DND^b2CIJe3D9C(4FfcY?z2yV~SV@Ai zpVV-df&}_7_XT(PniM&Hu6gbRhX==l<T|a(9PZNL;Ou`tJ^qj4_{T@b|D2zHIvC>% zVUcT^pL!(AzY!|jf2!(|$`1n|fvV{UW(*hivigy4oo?6-+t@a0E<)j0!<fE}2Fv>; zx~OjRmo;!z)m+~4V{jobE<Q@ucsR&#q4Gh;rDp%C>UiwJ(wSs6)-ORFi5I;m*4!6o zCIi+DYn?Lje<jCZa;0<5{PTMw*D<fdWFS$$Bj?1=tFdXk0lViQIj^h6r!*n?WYdu1 zTHik|+gY(<qIct01@<6b0B=VMmjZ^FoEYgE92Ok&gmeZK<I#izYKLf@i_Xcn_#A_o z@fll#PhXs7zkBrifLbzuFSJve=!w8ot}hov=96aU{fA1!jDr!{v+;HZZ2AY6*2XxV zmANxSL_WV|j)lVOCjMOpU)ts4csE|H)L;ZPtQW0L#KnQ{Te93<OhtClG<Zj9LNqnN zNx-urbvHaqzz~OMm!#4_c1nfLJCLjU7H3CamR{7^w&J%lSnV*U2J}Bbk#)P=w@K2& zi6K-H`ksFsZ<|@#IFh`F<|!zld0$Jwd$8B*c;ds-hl0NX22Uj>w?psP%i7J~u=+?s zT!D4E(;Y#>ef<2<XOw*n#^jU_<>loh#x(p*(s#Mv_`Uu9T4P!8*l)|d3#<V;+YPxH zp63Zan;@kMoe=3wZWvowfL9>Ol>mnahky+Rqfuzz?DIOhv-Woo@3fFoFJ@%%n?2nI zzCQQuv}*D{?lxun^7T-25Zt$T`JQojkDHI1JhFE8UIx>D;Qp5Ind$2f-uuP<={b=8 z_H^UWolQaMj<u0MiWYZ&XA=7nz)AY48|i>`Pba+#-x*H?ir&xX<*b>*<+<G~j(<NG zk*HpM$WQ<JIr%zstMpVRc+<3dSC9PAO}ji;ig=xp?v3|C1OLLuB7&QY?epVMA=P<5 zGW2+Q-D{fmm0vv3u-`5s-i?I&26GqIotg4%ow|o%wLesCtgtASxh$vwApL;<Y99`= zPwi{T6BQnIYCKA*pQ2QP2_4j1?*AtS@|*R~)QQV$>TcEo+t}rRrd`Wb!p|qnnlg$e zJ|RZ+B<mg}nU!aTzh8e}<0S|G?S<mM+4uV1G8|{$mdhyIn{Erw{Kb3jdsc{c)AR;c zFYT~p97DqDv=cJ4ciQHt3yf-X&e-mOCMR-~BLL%gKw}i-%Gn@%7k?Te0E3$rO+63Z z2@;_=0VIP`Uy<teh|gazJpAP>8qImq%)9h6CJuC*JsJmF+OC$>W=LDvnP3l=nca>T z$^-tG)iS{P7R@t?dZl*kLwq`4HJg{p(U$YX2^9_TN-V7;MsPs1S~|A1sQ@TE=VrGm z{n51J37zc!JB%oH4*u^jriF%JqP?g89%GX6UL<bMYm!wk;*Ry5Y7v4<UPgga6_4RT z@RlBghlB2IgzfkG7xfHyk86=vDp)ftzR;3?>v}F~BXU4$W=8jWwb`uNCl4RCFu2tQ zq~$i}az`b#tD1*p{SY12+Rek&^`$pU<X4-U<q=G#njPzp$LyEtEgoNf`6W3xP=-mY z^jm#^H2{*oE@$|=IltPJd?8wrBjK=9G6B{&MQz`&F%yxMMf<ioer-5dG|j_{Vx4b3 zY$B+rFBtNO{ev(^kAsru4?hwR6_4nyO{a*l>*7~;;HC?Mh5!9mjum@Zd|V%*4AQUS zeZ>Zwwp<mISAx}aARiXh<<;hRi#}B?1^!y|k`7}%`2PF!qP<%K?Wc5=AevJ=^9=PA zWSv<SLF$h@&+XX~``{C*lhiEWF_{b0yO`}uwTb8BpT0k+G%JV<HZj^~PyQQ^S78Qr zRZ%;}{DIO$*fq4>RJAza5g{bc5&mATMmCE)e*9C|*o&4aUEHYN#4XI#;0Cvl^d>aM zWLi|OWg}m<!;f2|XoZ6Me@`zj(WQuLmpUAENF9J~gAsRT=KUB`D|3ex8|D?%>7z`o zHqdoUNBIlNZ?xT5x6-2?X!<<#RSSjz?ar{c5Qs*HTs92-4#cTnRo9%sUwX~Z><4#Y zei#ZM&&w5{I<W@g1Q+FQMaRKq39Eea+p)m`e}SrAqQkCKq=X^uoKXP+FG-e8kZA_- z;u_(T8|T_I!oj~ACnTy+GD2YOLpQeJXb^Bi2g)(2wi5ZJA;;H^gNxB*@w~j$ABRB; zr^nS_yvI<Hy|31rZLu`IZRsSQJ=)grj!rg?ST<rtCV&ROFAVL@1`nd(ts_j(L|LrL zjNE0o)Wvq~MP&44xxmCTE$7HacTt$%A<Xr<+*l(xP=p%{?!byiAZxZ?5VQe$<zUWj zN`7V4z>=+kD2e#hJ80II-@N0VH_Lf!IpIhvdhs_DD$_~C0FuH4h2Rux7%Zkyr7MZX zttC}+h{B!MMB5&4yR7jUy!i8<k6*s})9b;W*Vj$6QTLX(5huI1zwjz_8gqZ-qUT2< zmkK-l3u-@SM+Jx82Gu**-I~ZQ2{knKijF5|i0%C%V<;SmHX+JrxmUsq0dULs{r&Qo zgP_f#*MGh4pVc1sRR#j8tS<)lBF<!WCFp`<_#)b+c$jIzOpjFQ!a^0HLo8D%tsKsl zwv>TTPWEUz$p&v}=zoHp|B9ZVUW$K1$29x91EIk}h&C2nI9_=&qa@I3A!3!xvbvbu z6qpLAL|;PIZV)Xe)6*!LcY@}7;Nxt@Nt>h7koyHNmjRahyzg}&<$F1M7qBMezO7mI zF-8|?s<+>T7BX*~W9-MG!dFyVcv;+B%!|z9!xJkL?8g^Dfx+M-4~NwT_a%0~pbJ<h zDv0W$k}+~JSTetq|52^JF6wH5i;zm8{$sVm14a$9i*2>k%0+I)l4wgUhqSMIr2ju+ ztFV?7$j{ZXSgXhn-HZCqxrDj5N&ScQK-f-fE;6dmg;6ORbX|rizQp^084T+zO4Vai z0S18>myz2ya{mhntDxtYXDB#J0jtVHVYOSKqo1<UX}N@2N?>CSgT=$D+;p4$h(AY{ zD5gP8syWl;Ttml?hd>%+Lg|XG)FX0>6#dP_u+y-6ds=eBAn+R%f7w?E(WO3{Z74&j z)*wXEfW-k2MI5$%UEVYp$rWI&{Sp@dkoLN~4wc)`i9vrxU;d~lH~H=nLJbGD84_4` zFm5n|j=d~!^u6x;?r$W?l(}EP6deD>PL|>a;_?;xR^qlx#IrBka%ka4e>Bf;c|j6~ zos7D|2SGFihr>25(H)MFQfg69V$P6&<D);K&?_Cd7QQCh(B<GfILC9E^&aY%G566e z$YO^hZ7rGG&tJK49m&p5=nPoHP9VrgdlwJnHd@R0PN3n$p%y$z;_2xAf`=L6z2pw; zA7l$%Hxc-Rod>~|&%5a#=_;J=iSgT5v=OErdDqB5kfK9AL}zKn3QTbXKaVin82$V7 zthL*VfGIxGM5V5tc7nQ_D0dWqII=a11rr`C7Mi0!@-?Rm5VB_RR$C@lCdrw>wcL5% zMr7IrPYd1r&e>AgP1o3`(O{wbY1_i`rY)!vm`FMsT}r&$K4~d08uu{{w%_WN{8m%= zy6iDE?BC^R=VU`Ekp;Rs7Zf^5PY@`1-RB0-sx7zk=6KPD!jRjn098MAgSp3YJE2Tb z`F;zpuVHzS$4|~h`iimS@4FYS&v-Nb6}Yh#bg^?=BZsi3fDlV60cFYEwGtun-^(>C z_N+<Rk?yB0qE+h-W5iJpt^x|3bL@$WK_GI(F(@9rOs%?QGrNwW0><b74D?%692CM# z;*5i!_~uOVZhV^t*SXKI=IFii9h%TjHkik*AaGc$ap3lR{@lq!GASUtnHiOTN<GI9 zL)5$h&IQcvt30RC$)wVbC3gXG!`*A|69r#6fje^2!i7iE#J1L!iEi*GnLZ(3Txx8# zc6T$sx@kYXofjZS?&!aB6VXF`2(RMc_#Z#bhL6agfBe|u%j19k{UbP~3k-)-o@s7% zRroT1x<PXs{+-`k<3B?OxwCBUjWJEjP}$B>MkmftUW+RZCtVs-kQB-fasE<^8$q)( z1&~P0iKZ5ZwVm-LS${X&Ky#*jXlO<JR$P8u7b^%245P48)H`-ZB~#HscelohQvN)K zNT~M=l_hlxG&+dM+;?wYzI!ow`_1X;>o@OGWbWl_CT)Ym293)&DmD?|_ieqb>gz+7 z8^IH`L2_;RGjQcaMd~zqNOGl)R;E}g&62&zqufGi8ll8nNkT+~A{rY?mkZ~qH<1v7 zp&Lh%g^2diH4fo6+YLtkQ}{FLQEskLL%B-a8~Hy7+8lP}PC$;67*Sk@y$)g2f16X> z|Bwfgw2XKv9lweRi1^j;(UvF%&uW|v4U)P)BVf9ZHY<X@?`IOOU9vVXBjla$ih2Yi z%E-3bfn)s0s+KaMc~I$ezrP$s^mF7xG%v~-QZ~&iz_)lM^@gs>*)`T&xoF;(X>A2V z!(dBVOe+v~7c9chG%S}&WnL~xx$h!L0f5mz*$?Gmj&i#6&z?z#S>`=M?%U&EJW0-m z@41_O=z+AH<g<bz9FG_4s;uY0!G$St@uO(HFC|i%K!|a{VUmcWl~c?o@X6{r-uOa> zS{2c~Z1U~-f?6HHBPdz$tFIY_B)3d-w%pLtB24J9gN%;R&-iz3C&Uf48yXa<VCY{| z&&cmiH{+&ukDibC?6LMdNRUZM`va!hJvzCAs=Bwl#l&p0Gn+((Ua5)cV-dTm$^^op zoP_U%dif3mABkYjv71@{WXUEc7Mz`j!!^9xa8Q%bJXuy3EqTeH`)AlUJI^G^a@QX_ z;no|DC#TGJ^KSfr#1%y103n%~>4|_z$_w(y99m*RqqXbYRZ)GTHN6$npQoBM{6&`v zVIiELbe}GBz&XoF>@E)H?>n(xJ+TTvKWe>RrwR-SEF>i-qJ~h*GPEZjk~CQ+^(nnq zQ9NJ&#Q+b_xaql8GGgGpu<_G1N$Y2S&3n@uqA~RZY{_akI`1Ng+c{_o|E6{rfA+}X zt<4?HVn-4W)REFWb-Ys>p0T1fEk^a2uR9}(buOLJ?1LQI?)qSpB_sfm`!J+bmsA+n z_7lkU9}x)CQTB$>2&k>v6AIH&ll*;p-XDjPb`f&=;@tg(!m3g3d&4GL(Y{u)8CXBP z(qErvS8%CgzNrOYoAta{VpW&Ze`8+}_Nd?``3BP}KQVHe^U*m8`#gMzb9=aH9x9l_ zk%_l;w%K(_W=SskPT?>%>QoKXN+)rI3Xd6L&Yp_dek6S>2E<Bc`muLtleDUFo@?f9 zS=AzSwkScWNogvJ)oZ<o(4BTyPIt)U-8+oXanU+c&W{*zQm&(q4jwF+AM)T+!vDXO zJE>9fs`2|F+u$&xGL@GP4XaBWPSxbz>4Y)8tY;1Sw4X=};h0(J_T*3uw1+7c$lzFq z`{83nsXc+`7AUBg9qL=%cx!oJwlwv=sIU}@wHZi;>(BCk60<iV=9A34J;7`R=$Z2W z{onsHFazi`xEOr@p<I0b;R63ZAH*@1cH=s4n<%ny!6eD};ZJVqe-2arureOqU8y?? zNc-m9pN@YY>Yv%wwkOSW(6W;au?H*vZgHSO=T2d6j^;$pGYLxP$PQ`GFE4FQr5*xz zls!kE)n-M}@n{M)4~@5-A$aVW_6q$D&~}6k{JNq`+=QKJVoi=h8>OggFjECG&bsel zN}AYnkoZ2}jfWjqLihgY?9q7u175cUb*NA3(w6f)alQGYa^g>(S;cQ^^w=xs@v=v& zDWo&Gn#b=!2w&~+zvX5|sjlx_DTNs+b=}X#BXYEF`Z<Q>c~g!Do0zp=-QFw1>|Att zgg#h-q#k>C>Yvt6*v;JX1$UeTgvq!3zF{lN5h@~{(Y=d)99_^D$yj8DTM4pMMz(ux z(>2@&FSzs%+TM~#2ZLRWqX^LM>IOIw4`3XF+ZVN&03O4O?yT5Z`d|XYcnJat8F=6d zK&K$MA%i-`6RZ~rV(7_FKWpw9$1Cz9Hw|JM$64ZS>-Qna%%+KEQ}%6$>adcZt(ItJ zXDr^*Y0$CDn2KLeNMQt}jAxoX<nX1UMK%l|5<KBbN0Lr8IY7z|hmkd$CGo1*jL8QO z`9ObksC2X@MAA{Z+Ert|aj^WSJ@8bTREu?S)VAdCA*GNTt7OicPQxfWsz5Ed0;f|= ziB^6n&~WT(4<`5aELcbsP7|$U^Am-xu}7>xcrzw*bC7z_l^_gv)Rd*b(vwpMVyXjm zt43b16aDHt<FmnIL;D5|4CuiMTP3Gy2nxNcUJM}?Gqp7H8QGcRbqqv`1hd{Z;uWBO zslG72P7Zt3ipk#>n)H9?!w4km0NaLcbC%x75zotd&W;;{{Pt=&2)M@Es}kr&!eS;K zL6~Qe_tw8d36?1nGiO|MoVQY2k#VR67HlRF2dgFEcq7(|zM6~D-WK6rR6YkpsDblB zgP9svklb@ynhoi>F42AfTV<DvXU(u>54d`2a#|$2ZZEV-yc>Ndg~nhIibFv_hCql@ z2Z+y0BBVlQrSAo=Y0d8rrX~gXq4Y8uYkwg$Ta>b=2Kde$ZF5nfB9%v{S=%g<Vq;=Z zV;$@-oHP80OCKTE{s|``ST-kirQ3&dD!3;`I#$?$hDGR2k8&m6yMX$LJN-Q=k7l_{ z^{&xh7OZwPx!7qAN8k|J8SEZ*O5QyYQTsEc^5ulEc-86wbopYDp3wR5fZ%Rcl5?^1 zx%sv?7nqcde#fX+7iw`)P;|wjY49J(tqGEF{`e8@S@h#)^qYgScP`ZG?4BU~5O6@} z-EqEkf$_(W;hoPf9_xGYlaC)_5<&v9^!e*XhnDike}^%8ICqUy(J8{d*!*JchNs0E z14auh58c3VsHw)RSF#0OFF|Qp5*<0oOh;M`9d6W;fz_2c<H76-t9skS4ab<k<P6?D z@2Gvwy6HnPwO>g#hLKoQ)*Ft1hMpwcL^Zl}RS)GfU6;EPvod(R@XzuD&9DKD&}8=a z=1%V5&nU3dG0UC8d=5DBU@i|Ud(6x&x2Cr)UVmE=&5_WVHXm`p2c$W5+Xpgv=i;(U z(sSGNMJ}eI$!)|q;31`(KjECMHoVTR1czHocrQx@lKLMvp6ZG_;y9K!+S!`&pi2+r zw2l6qK&e`ZVkO-(t)9FS?5nWMOU|BRBU%uqceUUO%9}M6tB~$23qv}XMZv|K%$m_V z$~E&6xuF-em;8}~bebyWFKo1tgE;Yv*+YSJGNXgexI0ihdZ9D@9n1!SF*T)mvLYJY zYwkKA<)QQ)?L6Xt3@^o}`92+mx3NoRYG0M4`~I9#fQ8#`eV14@)bQXFmu{E#o4Ij# zR@A%UO|cr%Q^(YeGhpj<Gbz`x;qgX+sO9l3K+6f8ZKowSh^Bp))>on{g4$Qe2Lw+A z&NJY(c}qiB$gMBmm(&QIgnA)`bCwz78-obqtLAyd;U{tcG#M)Y9`2Y+c;epT*Gz09 zHX&Q4Ycd>YSsYa%o+Yl)3Bv6LEOxw4Tu#N$e4`0a^7_Ye-ApEU^aPaE)1eB)>FE*} zttM(@yN9D7i**oi94^Px4Z0{&F*D*Qt@Vs`m{>pq<yg$00hIE_=8V{rD7P=%8J~%X zX?W@?d669o6S{7mK3BqI>$T&D0zb{`uivIpAs=NgFY9K_wm?&rbm8k7knM0R!49T$ zq!r42kug~Qx+=XpK!xB*7Zt}Rmgrzs6LlTZU-^qyuirg?`G!nj`1R?tXD{BmZ?9gz zc=axJEmpge396)^01Ak|C`Dx^CE;(2UG^l(^|E#`%y7XS-eTx7tkR)m%SEH(XaDF+ z_jL2K==2g6!;XxjM6-vkScH>|1F=2CBSqk(8DXnD$FP?ep=d^rVy8Ze4)%HwX#GXj zURSGdPEmoj9`gcw4;btX6vKVSanqiz$Gs^Y?v!->v7*7qh2#}Pn3e^r4A07w=P$l} z@zv|o$@7<Q-;Etb#GR_qW0At9+47bk2h5pbVtQUdYRF1{v7>vHtG*K^2Z)Wkls5&- zEa80|1>WP&C-hGqSHsmEuVSY(zg+mt>Bqx6B{ek_oQVtJs4sV;j1@wHc|*b{o=u#> zZBb$+6e_j|yBYN1AJYAYTvT$=r7?Bsn+C-(Jd2b(GC1Nz$n~r#$$e)Gf&%zoVp6F1 zUrX-xt6}$IA4lT~xQQAiHUotmcoMpf)%7JnTjnosRxd+6i^xjwl1ccJOtvt<<Mbzj zH*o5elo=#=FZXYCdh9d4xa^Y?u}84!<?iN^pCoCi=>Uz5Hk}43lTD`)8Ej-=9)xB} z`F~@kNen79(kv?~J6E;V$W9cfcTq%UR>DR`wpWEzkqbkI@#8{p3iBQ=4MxUMs)8#_ zybvzSE4N&_&!ng)hEr-3iFdU#g|N~N5mf`M2vTvmrZ_#6|EdjD7-x_|BBW-HTg9=O zrgpYcvOQTo>QaWl(+0ke<~Q-&iw1hB5kRUFl|O8&_r;O|3>Z=lOl@G2GWa43fI%XB zt9NZ%%W?wux$f{ZBy@>0(=};z+NidZzfQ=I<t+b3YvNDB3ofR_C8IG<fy)WRMX@nm zkd0UMGS|?R0vtJu^gS(H#^}>^jF$cKc~g#H`&X1SO&w&i`Id^F96g4QzapLg%nbd@ zC;HV!!ljdJ9uiN6&R6c{j1A;$i)5U!i|Um?^2*-%;CI2h6H-9&mzLZ(1E>O28h3!E zfSefsh#iO}ZT>Yqe22b|oen&t+#Q3!86EBG6ZY?okV!c;VQTfFF?Ampo;8WEQydP( zdBssx8;1JiaGZ5IP_N34F|>O;VpFI$zVwhnrW?Tlv6&Ir=ED?&2}8IA0z6v3;ITSj zcWhA--hlrkamua#x};PW*vMx)+cRiYw2HAu$Uz56v#!+jMnI|ik-ZDN4u)Rupb8aY z<Ek>nhD+~>Zi}csnnXmbn>A~oe5<B5xp=F!SHXJoiS`MP)CJ@$p@S7wvvs2|nT<#$ zR|w)N&6<+5;{Cg3eO;`{JpsWU{qD0zbe|mk?(yg8<S4xn3estAJ9Q03t~OapQ!o~Q z7MtOqsuwmL3}(Y5%YRk7sqIUPY|7J73glv`rUY76m*Ef#M=5N(oJpXxp7#iba6UZR z(&Jb@gLQ`K<pWBoU_g7Q6Ag#3a7^Y4S?k0ucTuGiW#Js+>+;rx5U^pw91Ao~q?UXX zzj_CDYRhwXPgJeC#0;YYH6{(wD5mo6`Pmb?^aWx{RPNAn*H}~u!f-q48IT=!>Yoey zD^5Dh4-8Dx0rR6B_Si83c=hMS3|J=U4O1<M<QbeB3TkmMakUbxf9i-F1PCd&V1TrI zXMrpM|MLh)-lS{90@_zX!YD-%z7}?wS~G0b5v3(SM=~7UITczaVUZ@2B+z8cu9>pG z_&MIEa|scO+#MZ7D|?U2nMY`pc$lX7I=eM!BCa_)_m*myQejd+MbEEuvtkb1<JiC> z1|FIHi!$4;Fjms51rrO3b?c=@r>q}JUwBQAfr}aW_@~s>dKWlz!=Bm5e~lWOsGAIa ziG?R&tGN_*DN8qK;{{lk3(OM6zT*^Ifl}2t0>%Q%4r_ES!`R`w8GRo20_nf?45ITX zIf(Uqs=@Wcc9mEhYp&txL}lu%B(YkT@3Ct3a(67pXP%IyRmAYab<)p$$OmtP3M<JC zWwx40!En^;ozq>$U<vI@o-6Dgq28sFHypDy`uI%=gvI-FvTk>tH8(3vzzt`sZjW`@ zbP3p==99ikKpbf#J8s8!do@{dD?SB4X?+BuyD{fU3wyvW<ItQ#T6n*OE@&Mvw0Wq! z_T7bh=7S!?YxF34T~kR+$3dyypu#h3bp%*-vQzWXbKiTERXrNKV4p|(0Q5RrMIe5a z9<WcJv`-}%_s^>F?Q;1mFgQ>O>{}Ie0*m_d8hS+%;-8~3M}Xq5T-jYd4-YZQgaSca ze$I8(Vqxv=8u&wY_BSK6=@PL(tWz#y#sZeT;)IHm+3xbTA|>j~3~A&{j6DsWkQr@V zT;3E<U}Cf8eI!FYYih1E2?E#Y>$fleJ^Sp@qu-;MJ$ptF$Ec;5-OjV&=Oa~jwIY7q zpxWO1A+>q-O{*n~bqd7=g_#aV*)2#=c%_jHMV7N=byIO6&^&vJq!ABrLnIk`6ncJ3 zs=C#>xhO8El=+5GqS67PH!dD~av{+)t$Y)3QUU0wE%7#G+ua2QW3|;~twkYvc1H*9 z){^KtGLe!}he8K=*#}&g&pBYpo^;5Kug=83pw9Y9_tuh;aGNt%a*D|ivuYYPXl{n6 zHIPjy-+I!E(s7Ucf)2kYgSxKQ^Kygs*_zT}T#{jjXdrS_#afq}^ZF%MnwB}?D~k?t zBQuDO+te=|$kv2L-BB66J9(7$-Qy@mbZ-Xuv55d3dG`p-*WaT%<0(ecadcbqMadCp zCahki$SA>pODX`bT3OdMXvJim5F0e@cAqLyCltgKZq~+cHZp2H#J_-YP_Q2xILQ_w z6}&0!>knJBpxGz@FBT*4F?n$C8>H{Hnajyfos<>OlGluf6?1qfCnYVPM`WzdE|vul zIePb@47d&2Az5$*Nm`p!a&VN&xWR_gHo;WTnBAbG^dvf;V2Rs3@DC2Ye*OHLuU-%# z$hBzP`tbYPPlw;<@ZZsce>fcFoM;8Gb@J-z*HL3W8@dC-Kb-yxqQRGE|NHp-(~&tX z$M^`YmhKaJy4vA$3Mfpsa4?Xzewlw7xgP%EAo^4Ofq{+X_~zffc=N~CZ(n5piC<p+ z`PJ(;FP=Sp`(k{cGjySQsBb$3^xrt#e9Z=?btz_M#6YYoKgWcn6)M4)6(PGCa}WFC z_pF*!bf$Q&+LPf(s(16BXv4Jvk{}bJ5%1j4z__cb&7qX5R<%E6kqbr<#c~VX2pooO zaGg9i-@;}zB{U&W(rWq^^}thgP55inMj}Aj|Ie={;D6VL3qfIy)Dz8!>gF--j66(T z<i;DH{ZD}!KEZOOjwbrHT@XBj6pZZbllFW7V;YPtoOsI0{M)G_*7f?U9eQjPC+bhu zBb<9HC3@1yz%iWzh{fb3J<c8!>q{V(4<20K;$OYWV0y<(-Y$`qAHx`hncDejRGXd> zSd7Fn3aT3g{o=nof^Y@*6ip()r^OmJbW`$8P6^vlFEW=hNaZ{SHWsxgxsHo+Cw2kl zIv~lpUoLlXZ6*AiUSDdO?)I))ON0Tw-qL4%nE@%Q0Ck>-W|b$yc%M3G!;NW<HZzR= z6roVKxx6xzER)RiE8I_ZDnj+XPz_u;LjLr|I+LPNO2#K|Oh8dfeS#Hc@h7Y>JI;8C z9z}^L?P{oTV_VO((&BtOa~0#q<{)=7lqYqVoTX%zqMa;JGx5aJ1kJ*d(7Y*ppvwCF z3F{1r16hK&n4sL2>N$o$sa$Fd-_+N2b6dZ_SB6shN;@983Rgwo5Ov7Q5a?L{TyDha zf!-w^#h+ih;ba8I!%|VQ7aeM-U-c&(!<h2yyOM(<sTvSmp;LZwnqmH$OIF?T8+dcJ zO#n?2yP@<)PhqGy>6TT(GK5<++yjlvUZb|;w!(^`i@+DuIag<qr&J7_LII@AmG*An zB$h~rL1YDFb}UcVkZ*0V<dWjZ2cqcA>tW924=x)Wj!I8*o2LF+P(wzG%)dL%2#V0m zV3=bTlF-OG8r{b%xMDsZb3cm9AdLX&tP^}4&0z3-`@rN)88{v<|MU-|=-El4EuX?K z&%VFSfvt-hJb@pu6&_h_Gx|dU3{URM@6YlF-=9;9e;BBwg#RR~zwm`f)nD56EX_}0 zi5?1>Dlp~e<uXD3MC6zPjHy3VFHEy`S8s|BfGt?CklnaY0q`VBqbnQ}x@QYPd_sTY z>?u}iT|AaO{p{So`p(g00zi40JP#)}0K%&|JAz~X)9DkUgVSkne5X_Hr#*)UEIg8( zU9dS#)Ug!Fk|bEf6lRx)uo@k=<fz7!6o~ZfL3XokDeVo2DFez{BFn(Mq7H44agv+E z1Vs!hE7Hc=dyrfvbMkwnQZAPK3$uw+nGkAlHtH4=uAdF~?|}(dQwEkE<Cnp?k*%fB zu|8o1Pd6JR^v3XUx_Hac7oIkLmCK5IXB6FAhbtI3p*H_L!Ky)BIl(+kUZuf+e}Kup z@#Ie!%E1TZe{C-j*OKFpv5hs}tb{7*2O(K^onUrj<;l{YW0tn>I?#1+l<Ca`6DpDv zJ-)XLMXgnY;#WP_f>&ygC(?RXTj`ws8}(VP+-bwb$0mvuwiyh*T(O8&aVGCRYpfmq zbC9ztWQpy{9J*B%h>`smV4uko)ESyIFwVG9-Mxo+5z!8^EBqa#7+Rycr?Y=;w1Gz9 zqi|=NXhp^EpOO&J&1Z>1Cw+{xrgIKACRbk?hUv>-bcr3ds7bMVooryJeI&$5CUTV) zh?4}P`xHN@VXx|Kd5_&TH&p8=FLDKJDwYKecbms|!vFU9`^zM1T8NLsyL|^om-dW) zKey*VNI>`WcXP@C0PnJP15DZEX8ya$0!<v4OiqI}1W9zk<=2jUEme4E5NK%Ju9wT| zf(Mnu7dfR0RAF*^G*$-cJ{ZZ#pew}3Kv4}X@z4lGssaxOgK-!(sNL#(H4fB;1P2r* z3bEiIG}c%xYzRq_x!hC;Lo*i8yU1C*$Bk7#ux}+z!2-$Jn5NDuvaxzmWQ}s{p++4? zT(xe@H~<=MDr0F~Ix~P>PI>o<D7q~uPWM5Mxlt#AKKzOVw@}0c#pDGru=u9Ho{$?5 zPhEmxj0=#Cz&e#_tUkS?CuyXs;;XJ2Va4s!cWa=3s9>B?wJY>dXfWWff-lbBk%{B& zLya%eg+2YZKTjw#jm<2X&_#Ci3}c5-BFeg;asC>lo1>os5HewH?81^yPX9Xj`sx3C z{buZnO(fnnu~DdM#<-|XGEdXLhLLlujeP)%H4w2m%-X0KHIk0Ft`i-#cHp*=|BbYh zewJuqabKcF&K~F%AZ(z^j+muKI-0pI4#IF>!bY~tri*vO!0(_2=bno?3}&OtTEB4t z;V8QxZ!~J7Z2YI$i?IvTH*4du039C@#(DN2`>g}uJL<_rp$&q~g$GI^$dAYB0I)<< zxYJxkw$td$KsgUZH<EcUnU0u25~GljP|JkJ-AAnp0bwyFT_K0X37}8!xyCNpPUsH+ z(k=Xw6ib3uey44`qB-!%37iC(7~EX_*-y>yME_vqaj%ZB6c)L&>!AzNKL?Nci<R}2 zIlC&_tJ%$}=glrT<onq5I8HQhCo%Exy4;1oCfSkT{Et$7cnX7*ZIEiBcoQ`U3O(ZN zd#wogaHv`Sagl;om)>$kcX>~iZFx2O7jC8B14!k^K|1LNb@_3F`f?AXj~mpNdj?hh z&<jcfx4pnZEwnJwgb4Cv(utsZ>Ab}PR)Jh%*`ZUi*n!+`^fzYoVL^@5luq_cslIb{ zREh1tXvEdKE8qkr!|?_qI#frDVo34hj;DahSxTE(&)IP5od9yT*%nx!<-=`_wZz$v zjya^|PNK;2EE`sNnU6UKLN`trfE7C$GI9tKLZW<w9yHaf<1kS3r(9HT1w}aPA6I?? zUNDNOJAJF&OK>&te>)6OkeVdw6MO3!c}U|D^+#-A7Nf!8Bz);Gc9_sgU#1QFpR{Gr zQSNxEBz8t1;w0hA^0Jui`bPfMx6UcX=9&76UivoT(m+CBXc((!Tu2h57z5;PHU@ov zf1JTl_T3eiaFWaih9ljSv#YwA5h@p%j7Fb__7_(HlvPm}9Q@ngKJqLDpNl0NF0Ai# zjmC<NwYaz=Gs7do8gBRtMKx3{YyI*H=f!Sw3gxQU*l}zKf=G?6%VUNrO`M-ZX{|)1 z<4X2Mvmy6wY+JeLeJbdhy=}bt<+dCwm)Rw15G17r*;)-8Tt*g2&8liXm`p;;up~}n zY|^&Qs0x#Nw@~uABOiJTGFm>z>whz}S}FVtezHgN=WO_sK>v9}Q7;!I4oZ{?Xke2a z4=?u`CLz0<l(h2fug#X|8RZ6U=5qiHB($P<;yDE*aa3Gbi|i%mRjX!OtZ-j#Tww-| zV8Q_rfrXW?vq$-(94?`d%WYv{*wtyyg-~y*%QbCI<M2_-&@ao>*xPVOuz(|#k$s8y z?`z~}GaFwM`T~Rr@!!LGG93WH9fkp;5Sx52;qIXx`-yif<lTdSdoq|%(zLFyS5Pt{ zS3!Q%kueO4r}c<hci?NxjsvJR_*PXV*;Pp)#(*FX0Z%?@>0ox9Av#Jt0{KZ6j7%-f ziKPmtc6Z??^KwNx;XOVHPn{Z=jIV%OXp`2InnTVBGztv1?p<fwo(D{mr#46_(7&63 ze`J6rvurYjkH5(EO})n_tf^9~4*$l{wz^DxrE}dNc%9SraYOL)o1XR7+$#WXMLw1b zHJVX23k-t-S*N0SEIg`M)YebFeqXJdn%p&SiuE<+ZK&s>gv-cHq22{x+`D8tM2S~7 zMgXLD#noHJ>w=8jqUd9N1WYetNHBhpUpV0xqdg@X{rrY}W9j)Q{W_@td1wkLr37^2 zEUINYaqZ;~T$8RyU$I?DS`Yc3Zlx{0zp@f_idX}1PxB7Vu)|5{?0FTU8gh2!NE=39 zhVEyh&a|(=TAC<0vwj#)Cxzj#!wyc*Zw!|g9)O5W%x}5|7`28C)XPFE-7(Vf*RIp7 zjEz<RJ!?bDPl7meWJPxk!)bS?%p9;KSG)>)mm%;NG2Wr!8U9L$;v4I{!Xi;b3LC@) z@1L`#GUao7zG!KA+A)QL?-7>ZFFHS%KgP=OF&vJ}ykwavYi7blG8v*8LOwI-2mc*K zW$1c?9^A@y-KjclXe~c!DUVFuWbJl#C4^>C7L+^WleKdzrLE|m(C%KAtGMXnorR%P zINw`u(HfOI)p=}{#Xbjc&djAF!&<5DF@ut?j3NqNVaI~>xU^I*T+`mM$dg!S=$eZd zOyR!fgK?q;j8SCE)hroZj;1d_o2Cu&3UC&aM&l}Uxbp8P)rCTeR<t+tGEmZWc42jW z>C5s38$3vallGU{R5(6_B5eXr1e0IeGEZ7`JHcB?LWf%y_++;Z#6~VUx1Re#G(=P- z9nwV^+{5~moUV`If2*DNU5BT;@#%>>Y75}hJI_@uaHlp@4NI<F7>FMzN8_!Qv7>MH zG5WUzjpIY?<F<5-``og%+pa;`fI}iP{G=TjV$y?RUH=5-{<`knJx=i*;_77)O+m>+ zP;=@)l2FEcZC}O_56`713V${`c6hdB60AR-AI58qi(}pQlXizusKBLZI6WnP3DN#} ziSqS^W9hdw3a^(ng$}Q_7t3l!uMp2pyl&p9pcIiRY#vymC-ITy`z90xC<dZ)LD)_3 zHawYyohHaTy$XC{gQMfJ8Ma#xx`vV37~jtoS|nQjC%x7oI^>^7;obO$BXv4f4=qL2 zNLQ6uuO4pI=fbj@M~%oGNLOJ!mzA#q7}RqyT*^`x@GkqOBSmEY^zoSct)AYh)|V0# zKmGBZqj5L!sCnj0asjx|cxJBh)-sv>w?L6ir-osiPFdGRk{BL@_<q0)b+gTK*YAUs zGMgo|u%e8J^~S4m#&^ldNk0Kdbg_?ITA&{bHQwE>Yb1L^x`ihLCAnox$m>ezk$5dd z%$VN?a@WPD)4<^k*!d~FIz`IaiAk`#P&!ot6&0rupey{)c5U~p?D0YCMm|_CGT?vd zfKd@HTFRh<aaWQlSCpU38gl&zRjiX0O1J}>1+puHsuLtfvOMH!L_XJBNguYuCVMqG zkpkx9H91KD=pYcqW6>--bTP#%8pIJUk@2#JP+Digv_Fg60~`a1X0ltD2sPO#wM&FY z_eW&o>@8_I%}#yFXigh8o#Ke6Q@c%8wH4wCy9&}IYM(KYe8?RC?<E&<T)DUS68hl4 zayGT87>u8nix7+xW+D=Hj4drBP4Q7_#Cg5D#cUtrY~Ey2UMP=1yhs#FC%|mjp>TP& z)L_;%j@dRT)ZOsAfoQx`+27C=v_L(u&*p|u@=m8T6wI(B>Gt4o%{75%o?0D@C%os9 zG|`e|LsD&B+PF6U0J2<Fm(T{-v8q{Dn;n}b%>0L`_x>9$arXss3gLL-9T!tLcC(aB zi2L@X+UV8*-@%tgxH&<gPuK_cG2{4ogZ7rJh(qjtOIXdYx-1R+?l<BhU0=5j8r7Nw zZ@A*(6scr*C}*3LcqSble(3kH%kfjz+nW*%Qo}mRZYWda!aOH5i=-?r2%Q$dea;{I z=`tVs(Gq$f)mMuhqy3PwlDOTUtA})pfh9dqxcH?84$2UdZKI_5JUlaR+844B#_ome z;)d>*-MJjO^hJ`EeN5Rj5D5(kii5+06Be%t0e$o8s~2zIs;!zS!UY!bp>%GD)6UNo zhZ#`c)P4=kii~)P5J53{A_6&EJvmSBO=6`4<bGw5erN#!NoUv2vNvn$#WD;&(vPI| zL>e(%(Jj?&Q%8;JWUCMdySR6+3EY41`;LSi@1w+|(g(xlw(Y#qb)8sge)M()JIy!7 zZK?HO*FtzpEJ!o^B17LEcDFMp%R##(H;nFGmDEGm$kpkdV0uv84`4Ge@n}*B-KQtP zPnU9}7Y7AaM%;RJ&O8nNl{iRO#c#SxOCyfu7tb>F?0AnViyV$lvVr&Th>R#lT#kf; z$E&)0U$O4jxP%~}W9_KT;&LdR%cWgW&WG8C#Az5o(h$?DUbRV*XWjHhJ<2w`M1VxA z87bA_rddrWOg*K>MKYxCO9D@$%gsXQFvTQ230oz!(FxsgGA4)<e=DHjAjlk#Rxz`m z_zkXxlwLXsdl6_4P0AnX@tia@l*Mh*Q76ja7B$;K<J41i5aWTA!PfkVK8xBm4)^um z3)QyUQWL!=(o1mibM%zBEeuD0BQ=A``{|RGBX6ORbMK*>ERkixUT!2r%c6~8HnAc& zP8Z>hFj|N1>%3x>>amF1N36m{IsB$ZYb>$nbW9F``k?|`+-*`~XVUEyX|AC|OF#?} z+aiS;Wt&{>Qa&8*_M+WXn=Lt*QE7!8P_&}Hgv|g-aoeotlujfrZb{`ngHRDwOdG3$ z^QCqoi|1?x0i{q~D1nx^;0WceZ>>R?GgO2+cm9pehhN0-wSiKf!8p>p_PK<JEAfz) zw9f&@_?mR}m}m2nH7xkABZca<f>pXoxQtxFq|3{f^`fzQ=0NEz@bBTp9~Lro30^tf z!JIPl0bERZ*#ZNdU*=dIceNvFW>&3s=DffiKf6NPHZiLWCcHA?JY#W?^M{5Ufy1J^ zEoBjg4a;r{%nUH6L>BH9ASUmb<$we23jFf8#@XZi@#FkaJ}=)t`t-BUKl|shD6Jc& zc|4KFqg*_u!;+)qoQK!Rg+EQ=Imnx8()rGtTUab0P&c?%b`N;I!3x;f7uW2TO4jan zQ?ei?)mknkc}TcAMELCbc{goN`MM#eaCIk*O3?PCkFgHJzs^$*uRjNEf1H<ZmpV{E zq~3k-Tqkt@AU<mD1Np|8uM`QJv0FxwlQzKb>lg2yK7ab|DbuDG|Lev7inF;5&%Pgy z&oT4H@cViGfRc6$&&J=6&PRv6)Iq(Tk!f%Wz;uxPJR>1Ji^C8JEA~3jDe(AC+NX9k zh1@z$4-qaT_FQ{J_pO_vTC$3Eozq+}x|F`7ZB=0=ueNCTeQVg`y7d3dt8m8YnkUxh zE*&6{@+IV?u_+KKgOW5%Iu+QL^BzwlGx(oKlbxNN|7<0g*gfqid+B^Ri37m8AY!GW zDwvh6f6A5DelWJn5WfkJ;F1{*#K_Yg<H;V7-s$W--mf3p{XShIV>}Wku66=r@D5Dt zBH_*>BgEFdsR1x;hPV>)8}cnzr@-M)oXTYIgvt5O2|gG<>;wb={7})Qn<yes+#kyt zZNbsVBTi+0!vUPS8Vn%HbMJgL?^yX$W^3AGa?eUHeVcMeWKT?uunyXz;~2L(r?72w z7VVoG@5(4U&N|aDet8F-s8K{&YRQRdpM-H*{s~w9eUf6Aw3ROq{3LnZj1PX6SpSee zH;Lh7w@FBak#TJlOv7`zY%YK$PbI-W;s64^pV#e%Gu8nX6q+In4)p`Tz6Y>0bCf5| ztEAkvvSp_An@piM%E1-IY_JvvZ$iA$sk0#sdz3FGGFt5TGDHEM*{3?SJ#vgIMH>bU zm~?ysD|;N|K=ieVjm4L)2sVlOzAR^(_P)_H5?PQvl9KoFMkWYIDlcwqsb||7Cnzi7 z{v|_qwW!q2QfE^HBl)WMZ<hl^v*?l?uE>U~hHBdHj_VSWgN%G;2ue-gEJFU{D4PL` zxnVfvYDF#Sl?|2$##$Yvt+x05vB=$pkHga(4U}}DlN4AhP8b)*C?(2K_8jipO!Mt# z$Hy=l3|}-!@wiX~#>a5RsUrL4%~wJ2&mcP*DDVi&eAUylCzS31kH`>T7zLNmg4c*^ z+0a{dvg2%y!>l$eaIm_QV-L_DmH^uU(GNb;_4nV$Dw$wh$Df@iQ?w-YnDpkSlIy~x zz|fBzq_>-9^^*3o!#8_;c0cnaVo;M)c%%-{(EEW{Y|l-T;5Y>tbIltQ#@)!l>vi_( z^}FoZ)33hD-u>m}+w7ZH&tE_L=Ia-)-o1F90h9cf*U!HoYSeY&82x51%gRnv<~8p_ zB|}UMF6Q2P<}T@^4DhH<HZ3{%WTZ(E<)t)t9+8)A?NVbXe-&is?aia%n#Nf!y1p_T zg&IEC8;(kEQKB&9<AMp28%>Vfvk(ycs$Mvp*BZTel!FjTSFX=P;88YV;=CP`Ft%;t z1w*>=4CA0vSpYh5{NW(NXP&vR-9_)Kv!8@*I7Pd#b(BahOpp?dm!tW!lPGTgSroUw zCmKDO^q?D?ZqH^Ax7l4f8$u30n4y~y{o-J9eqF0eI3T7BDNP`7M&oiI2?5<Uhc<-E zzd3Qc-AD99qZxuAdn$toBHr+Gls(0Kkf=eFf;^}`zAbhXXF`FQ6gx?&MTm`(ibp<- zvsoBuBwMl1Vva$a?DDkXf=OuSQ!nkT1ytHdun{Mv)UZqgjzW8j*=#GBj+5F%hv&I2 zzO1X66nTBzKiPyq;rpk#?vm|vp6hf3oOtU6aDN!Pp!AUYN@Xh43|qW?6Xw2#bjNk_ zYl&Bpct2^42?=e!SvORV#PK)Ha(+xYo=l*HycXc701}Imv`V<1((jljOq^wdlvMIq z=MmIF<w`hM#izNj<*nIC6ixEfE?X4r|3VI3&Bc^WA5(qZd2&&u1ytaLs|C0N$h1L$ z4^}~QHp6JiSR_j8!I)l$Uq>21MDhczAHoez`-a73?mwwi(T8W7bD29894#l#IUy<- zVk?k&za8WKgKn7|(NcZ@(9X;tzAXuF7hi{Jwfp=r$3+9Nzb>IcJCs&q1~+N0^*HfP zUF=YdncOkzw{X%gnh(d^8g(Mh={_;zk-;uRtMA^teD`AV_M6kw*Kds5hd6`2W>#Zx z2=ltR1}KN2mo+*=5&coyi54DlGc%DQY$x$6g0=)%IEfZ@NdhFb0zB3=GUvB<U9@RG zLq~J)%l@eOr{Ddq!?0mBsu#4s34I$0mb^c4w4m7%d=eBaiKQw)ULgNNd3j8N1KqT% z0uY1g*$b5Irc-G%l^X8E^siv)%`TH~1UJ(d@8RK@{Bka79&uSq1}VKMNDZrYpjkqL z<q##CDRbgj0TI8BsW>}5$}=w#QFX?8$ANVG;zhYoM*-0^@c0NCkD3y8?*^3A7>_U~ zt1P6wT?#yj;zSw}O<e{Pks`D8I>f%5tZm3okU(Zk%!g-jx|5F7c6c5)k!Ct9ssTpB z*{7L{(W2AT&yu9U$4@xhWLF$a&fnpC(*LAC^Q}cOK#N08r?}4rU%Ga_J}e;OlcNli zXk^<}2E-q6fpTIU>{$aLiZ|C-U~rYtd%<-&0ZF1}GK_zv)Lr;;vo6*Z)(ay-0#XoB zP^+L400e5{K+*DuzcYYAij}9v!&nxVXFOuV8YaYFZ8zvScLAbds!N#&O!+8#i)3-e z=O##O!NtnRP&{_&lu*S0qAoBU>~@IuyDRKz2mJxGH4LG-fvNwE^+B@&1!GDkg?|Lf zJj(5lnfH-XHR_A?c3A=_eOc1;18rF^fmvj`YqOB(f7QQ{t16lrV{bvqAdER&%KX47 z>%w=3hwNko2#3yGmq6=Jf~6SC@Z9xz#Qe$Might-a#u4Vdz^nR74cweCPiD#%i*H0 z2+AT|bVK6;p__j-aHJwxU7?Y$`mr2do;bCu-VASHHvr@L_e>WWP0Yn5((HM;tS(CC z$@!uMKB+uzi}&Sx#Pm(uo@82w<ZJ##4*uoYU?Ob>=ahPY{^n;n*TnUr-;nP?<;SG4 zxcP_PQR+>E7pS!BBts(UKNagWx?{0m$W)Kflq(oUto7*{3$v7xBLZ6ol^rNEKH?WA zz;}f*rc-+R>FLX?cwbaYyo7TmLGO@pA>1IMM%6&jUl5K<xmb{jwPDU(HjH+INzEcY zDlbV<ULmOxCstBCzHhFHOM+c4wD2JQE)!>sE#2UiD$iwfKy=j&1r9IC!=~_Un{8{) zh2iAqdfhSeT7h_R3p{YuUWXT?Sz<ts@Aw-are+=CwH0idXuL5^eK=rt9vF24<;46g z#9eFY#N{mLSLXdFDT#@CiQ0CablpRAroop6@YvQD+qP}nwr$(CI_TK8ZFX#SY&)5r zS^a0unOeNdTHL#-bKk1x_po$K*x^|3Ef(c%RL+J6@j=fGJtKI1lDD$y9c-ZS%aiju z=pRBK=fDJ{y$De2AGyL!#7PYN)BjI<S1mlD>Sul2WxPX}Jy#G@AB;pXtB4QPvrx_h zD*OK9q?IyB4F-nxF|KRKb$OI*t+^(`WW0;gjnDd?pDeJQK6RwYV2Nvm>&Mi*k53{_ zr{2kBEVwMMD<8xNK|x5Rx(hpM?=Dt8k~j1GMH}-ghHJIYYhjTJe&J$4aymHAlhI@` zOAHRW=k{|U>C{TnPNeT~S;Ht5uWK6v`<xzxtpC(V91uc1^|G3VZB1X5Nc!DiDdr|P zMYU?CuKOF_^tvDs!k8PLa>dm;l5i-|kU7)jNk12-Z1LK%RHec4^M@v!^@fEgtBDqs zH7PZEiB<@W_dm?Z{}v=;`jf?_{(+P9|Cm^uf9~Y}79<_LSeQ&4>>Q0;{~3~MN^%Y% zjBq_C8lLARl6sgXRh5;vJXU3L=Lnn7B_pZjiK0&Bd%JUi??)-QCnqPbXQNsK{mJtx z;X61!ROJ*z(hfL@Yv7L%^nur*NZ{#-9Ot27e-TNR3QKs<6pZDp4t%b|a?fh2Cf zQsIoG^ez8oTp?c~oPzjXweIL3Mu%tMNM#t>w#!4>8|lWw4ymx)(YI~x&TY@dv4v`6 zC%)tcjdeoW>>1*$Ec@tP%n#wyxUKNku?eltuYq(7CDPBk04!v|&7!4pAf6;}Qza-h zN5IVD*)Wo^ctp#E9h>71ixAYhGOBU9b}BL%o9Q)mR4z9<<5M!!xEDp~oMnbg@)rN{ zY1O7rsbUTX*LsA*9UtDTfxdmcOnP8Wd36T1L9wszW%CwM=+my2HrHqMgOesj4sZYV zc^LiRrzYC;xJi5c56bkvJMgdQK>v#WKa1$!_kVZ5!2O>*?BM*LmM7@{X<_(-(UKAh z5RjiC5D?-2yMd9Tqp6j%%fCKe>0Y>RawdP*mG#eWN+c)9z9qYI=W(*w8*uaIuI-GU z6)U6`DWZ`wl}geHX)E7kc_sK2`Bm3Y1Ca_T0eI{^JXXGw6u}fJm!3p|{*LZuM@44q zF<9R3g~wUkF~U*f*xI=KJCe@9LVVChedq}6;k5^##akqCV2)NFudH7`KQGp7U*+1l zpN{UpJB-LrYtdYep;8=N(mGxxGx7Lb7O(zlkinPO`T17BRHIHe>xtppjp3u$6o}PK z7~{qE0%q*bxm$bDrFb4Rl!@)Qc;d@=>Xuwfla6tDHpUz~{4#gh8yPCL>Dn*PGAV-| zYIu;5TfOrg$oV~nvJclD=K`8C_8FcV!36kd_kJ#Q^PL_1mkfoAff6A*Or#4$x8h<P z@x=G9^0G7Z$#<Nw#y)>Llqdzkh9whTa)%S_Bx1{ckZM<X+ONNJA$6i&KXzuHuOBFI z2(;_!^slaX0~(vUnwq-WK<@`&Up;i3585vaNBA!<qP#!DKlU>v*kQt_tb{qR?g+{M zCBu%3U5GqT!s+tIqmDUzdwRjZwV4wi7nK4YUzhMlN%F~G9Y0Y;8j^i?z<({ek|T#? z=9E)h`VV_0#9VOVZW^&#y5kK9l@}u%j-?|K0~(6;&s^<2Ndrsb0gprS5qR|*@*#Xy z^*!FT$Tu2Sm0x6!!5iaPtD?AUnof>A`W33($S_$^S@RhM<*M`n+n^|pi?fJt?O#!N zxb=LP%NFxyeIOggQhPy0E|&xnOQDCO{T$T+rbF39nzH?=*2@gDaVj-aM%L`x3D;qT zsGKCEX$WIP;~q8NPB*BGgk#Tc8X=!PilUszjG&u_>F*=_y4rF7B%{{>6GxKLZ?H2Y zaQ3_4o^5J2$AAGeL+I#k_M(wT!9_u3RJ5G%p66iGXt<W-y}~d+nIVioYkZ6=yJpN7 zQ>P8@BbayW(czk2%)lIBY}V>w{I20Pm@CFBOKAp_I^^^bl+mf9ZnMtm5kiO0jE`x~ zY4crT6BKQ1m|rJ;SkLfDtir&naZ*uZmc|7+r4Pim;8A}erB3hPR_%fkjo4ORviboS zPBt(^d^bik*ZxPFy(r3$kO#&+_*fKqkRVp&zBHvu1Eo_zLmb>3ZpM_xTBzW89efI< z{`aVxrUq0*rSNv)94f#I<9mN9DH4hsJ+H9f5^NKi45>e<NIHx#OJ~#8u2#MjL?0=k zK5iixP*afYkY#u=@j>#7tqFODZp^Y|Q@;~pNZEp8&p3!K4oex>Jcc(uHFPzYT?LMC z9;F^tS9aV!w(KzB(TI1WqwoZ1;o%yzIV%U8FtZ;fndYifozk$hJo^Wm?AkcfL>wLw zCKXH<h>bj;dOXIZN@J3Yiw78XY&`GKrbI@~Ip4%n{lTgE&`}<4O{GC--T7b~8G1H8 zHY8>4ciMFVVU;J+_Y?0RA-eKh<UP9LX|M><p(7R<@DNy_ERe+awD?HTC^l=9kU0uD ze|;rcoNG0J<U|Iur`aG7dFUtIN)%8Yuz;EgL^>xp1sGw07z^Wa8C2;73SWd5$>$LY zsfeX2(YK%<M=M3=HP=uYWbtye(;xkeCY-J06WgFa-vMqIz_lcBj4}`FC7V~xRkj9B zpfGZcYoaj0{(Y8Elt>tehW#h0mg}zHudCE}gx0a@FS0-9ZNEEk3nm_Ga8w6RC>Jbd z@SgDEOJ@@5Om^+Z<;P9_=WX|Mui1_5DzsKNYq?UnsEHe@5INM!9(0mp!9j>~F7B$f zEL0!i=XKd5^P|!CSJ#{Nol7PcnT-_Ok}ojFoX{DT!3~Imb}`Y}nm<%G>j={E421C} zL^vpe;SVrWiHonN+nSf#-Enb{J&^c;5R&vn$UUJ`Bla;?Ng=nqNAoVf`n;que_FBV z2RJ=G{DT=!U$9A{I8Fy=ao}SkUmqHuhChDmwQikLgVq#YssE^S#v1}%M?H0+BulMS zo2eA+S#O#jK#_c*42-hJDnyP`v*acM)p-lesW27Ip59VxG;-Pum}7cj-jJ>l8$A~3 z&*2ZsrV@gHA;vx#4U1h}z6|f)Q0C_|;BN^i-splmK-eDcWib#`rXgP2VyuoQA|s<6 z0d_`X+uP5{HIuDal#&A%$hnE?S%epFU#x~@&k6GNDsbK#h}?>~zmNQ4JYmAoNy?G} zO=8BLOa=9Ev<lbT>Qw4{)Y9L_8w**uGE15DbjyGgrQeNEtGQR(&1<@%7GrLM_ZW}~ z4^q;P-=WS1*Rnx**kV|)g59Z;(qYS)l{5Jbdz3*^)G5u3GOFYNZW#u6=mOS;77JXU zBchWoeSxwh0KVb?vs5w2MBQDBGE{|&q>+{C^hW-bNG2y9k;gOaR^a6rruhfPkh@<0 z*vA>Rx<`VMskjCGw}tig<rr%Kd!!-(M37y9z+;i)@Itw}?{n)2jPs%?w&lDUHC8(L zo^?@XLbNFr1#ljF5+y{w4&k3Vp!^uGu@WVleShFrDdCub9im}w=xlrFYk%N0?&z6~ zio>@6(8v1S-q=B4O$3xg_K|RXMA}>!+}}Mjx||_Vk<oe_nf|5a*-Mk_Mv+|xf8ZL` zS)v3vOv{*o8ZF$Bx1|h5^%ARpZgDe3T1<%K0m4UXFA)xNbF%>(7Gp$MqS(ldgfd;E z#Nsj=!cm3>kDs^UDoD9-7KjnAE8sRT_jr2UUM@~~#=So;r*>I$-}-BIA+6Znn}HZ6 z*ygn){|-b^%>%NBoYcXo^$3Kb*<nbQpH$c21XJL?Ij|)_6jfSCmHv}i@bSg<0sZ{x zP@dKjku0NZmLbsRZrV3!9P>+RflG(lqe5Sc+z?z53{Uy9!Qg4-o8ZkIhR|8Kr4`r$ z=&z&K`P5$OD$BGiiK)${NleT)z}Ds0l~d2J7JH^D>MyZ<6~EzddU`oL_mUfP9+5)? zjBg!4Lj*9=&TbNDsV#_(+|A5{oYXSQY%b7}jzZ19)@TU{^m6j^zM8v3yS0RSa!Pns zI9z0_s~s^in(N!4V*^w*+XiT(CaM)&s45<Z7l2~LnYH>b(sh;&tTT0I3`&vQ$3#Ch zVSHqV609^~ZVF_Kv}QZ<jWc0vY*L3jFWJj_gnHphWemuZ$VTcmO=WYFW0U>7T5RIk zN;w9&X8FDIo$=<$IzWm0oP7Jm^%Xnw=@uwwil(r7c7s>F*(yFOn<`T~jxriP3SiW1 z%x@MBvvj$sr>c&km?T`)oOP?RmCeBn3=}4mO0pxF|DK!h{Y9*bpsmyrtln!Am)>84 zy#-wN*&8(UQxPOBkSM>iCnn#ARU0O$Qyz!LbEh?mw1oSaXkS2m4KDD9%$ZpzRNFXA zSkRfc+B@tX)u+*IuiA|1z$-VFu|?7}9OxpnMXoVGiduKLn&4a3@P~bDNYri&yHcrk z91f{R8;fm7yg#yVQDw(SLV(go(rFUylzJd}7tj>5fS#9xfPf`7qp?G=aSvVR%iy!U z+pbiSlHSk%l`5N53}#$Y?(#1*Uz3IRIW4X`#9yK2#{mzUL%CYAgMh`zYC{@uLa|vC zY9z*WdNUp|2l)orp#VT{AaKFUhRN#{PDfssu;R|tU~6DDTQ?mBcX@X`Hp=ST{W-<P zCBvGYVcpb9|7C5R#(Q?9#d?A1PCh@!_t2#|d%63&JN4ELnxM27!=2d`p6VVgkdIf> z@Cb@^G~DY)g5#I6;?_P8c)ePnGyXJ3WF0@)><(+0$E%dYY$htNIOZd^OfbIHCp6&U z;rDQBDR)$z*Xw@4qFqzsL;Idw1R>5_&Ps5;LrL_(bH01}iw6Y!ebd5LQa`wCQJ8L| zNIt94d<d%B;?lY}zdbjtF=^Dvj}4NK_gV!#1eS{v0j?q=f=#?1?s~q&Z&|=8?Vn7j z58zrUT~HoK2bqDW5rV<AO;9kY)rZ&heN3;Bf%QF_0x$jj-F)J(KB>+h8&C62lQWQ1 z-OoVKS`CKEZ+<sM`)y}>=R-r?g8*sVldUY$3l45?nno2gnq8tZjeP%UntPsdKexG* zm-wcmk(bSxG##y)uXuucrf+qJ6WQmZ1+(f>r$$BWnIJ|*EEZPr6s^qmc{<9^Q)P@F z$JM)mcw957-T59O&oR(Z?+j)s?|f!h0L`aqOrw}BIQdTNsKz%|f1%7D70U}gqs3*# zT9VB2EF8tka=TlCU+g$~Z)zi6TXF=6CegA(X`T><7%+!kyb{jkB4NaxM}Q^|0Z21X zPc@UQkom3h7PTDG5V3O4BTTV6Rvc}ABUXsv-WQlbg$5?>iUz^Kd+WIuj3{O~upkb3 zK7_{wM<`HN1doWURR&5E$CI1A=PwWzbYa-oSo53pL2OQDpFrNkBBFBSy~KVNz<JcN zPPUla$^7eSmdP(+)pl0C29a6a%=L}J-pCVeP8m8YJmFu&oRW9;jY%1~CB4;z4j9)j z-f;$I8k3_{b%Wu$H&G$3z6ZbSv|ZV+(ssbTuCJtjR4Q!G_4vz|lsDO`S<g4zf_%sk zvk^}2HT4B^YX(b(nokC!g}XQB@#D7}w9Om6hlwq)PFft@Yf2(an`|c<@j>x!hR@}o zk^&@w?}eyu;ICn=8Fc-*GDK-JXi)+}?&i6aE?(MruODzI=y@$b-=~;je4dL8al941 zABYSYEtgR16E3Md*e3lf@-#B0^AOY>5ve$n5*N&|2}+?I3YMwt^gz)giNV=Rr=cGs ziFyV1y)y!Kd3<Nqbu`h79~~eq=$mI#J1gI7%_1FSL%nFN>=uR4l@CUOWLyGPB9p@I zBhnH{|JT>g6O&4UH|A;fT%c47%m>K)*_?0szQFeF`ALcakHpPRFCSOmdACh&_Y7tv z?bm+qGmhT5EzR^MzqBBk&}R&5{quzDWdw4<23;x|51ABn1thd=e<e<P&k<McH_QH? zOTh3V#UeK2Rwkf1$htg7)4D417tbM<(7cyQi3DfG47>#UOu@3OfNpHKYl+qf<mGMK zw)Yci!jUum9j|Lw(Cv7X$?YFkOZ!2H5d6*L3wU>McX*$mB$t{=82R@OE@5Q7YwmU< zs%el9Dta{N_vV;rB<u2b%dD-3F<1NeWxHi*9H)*=Wl|`{$qh@^se^dkQf&1QgQx1^ zmVx*oDaOd0ywA1$#9p_E>Io2$eE3|P+3+31wI}0agxvC5unBQ(h8uEFBc4ZK@#t<< zddTP$gyyyD{*Q=Np4a`e=Z6!9Cg+iPWW3@Xp#>L79FoA87_i!t*{q@Rh}|^b3HN;d zT!BG4l+nRG-7@>(+zZ}X4)H8e_^eWq1<R(ki`bqHcPgK4+mL4+N@G=i`=Ju{d(c-j zf$j0x$ZILIus@&0nnG27x%*No=^o{MYED$?->WlUs9J>AY2hWF{}2pnp%8fV8Q@{Q z<kiB3bqUbM`fnE_(n=oN0-B+r4Yas5_4*KXwsWtxDU?Smanh0d4<~9~++*^7ddb_E zJH*aGzSw&)cQtk%-0~jK^_$jAlpTQS<4(jdd?uwCCU{L7Jo;U`E^LJUFsC`eTZR>} zN8{i3LV(#;jwC*M;KWL1O(mKK&ZKoul!;`leP#4(Sw706RUELHVMtSJUZmA9I@ivG z|2m@}i91c)u#xcWbHYQj9d8=zcIe~!obTZ6_8wthx1X(#0{-AYkm^u(tBP~=<qM&q zsz_%(ZF*Q)-hcZewPHr!CFQdMEsyxZ&}jf8CGS4%A*fxJky~ZJpun1^XdkpV;Ta*! z=`mk?#c8XALBcj#AZyj)ttU`y*V0zg7bt=Cb|S=U-ST{=@GfT!B4ES8Y%4fJ_K|)} zNSs^bK!0YFnytVeGZiUrKjR}8eaI|m!_8DUO@_&oPcGwfuB)E0BRfDfCdDu|K-aFQ zrIMhXwv{0is~ebg(MZlQQgC4yw_F@|Wzq>eVn;Q^Abhww%yrf)A_Ok*4!3dRDvmIJ zN(nj+<G=C?>(YzXkE7;c;ETlT+EQw2u&1pbQAS7HX@=VNSB<cerBGL`Nh(KKTIjub z%ddPJ)=JBx8m`fEZ@qf2IxRvGZu_COjb2n+n<?YnBmTH;t*tKc2-vd%D>e9vl^Ry@ zqAk}JPbsR;{*8vVWlFd(N@s5ZaIt)m?Bs}>VSdMG+m(8ebOXmh2>8lXxz^1A+(RON z^7rfRpQPzh*=oZVBd=+M+!b?1gSCvOw~wROpZ_zCGDi$;&|3lm@`wfnBL08JQI1}Y zM$Rr)_7?vJQkQ;qKAY@~r!V{pKcH1xwdJA8wq;kX_BncEPTITN3>@xl+lQV{^C)&r z>5^&1m!2v&4t)<0NI*hT?hAZA*EO9uGNg<^5FrDGj0`WqR{VJi$%gKHF)_?Dvk*-e z3IZLFKd|oi>uyPTxf(*8=ioRtHVN-IHWvnv0~enB&<KzNF@HQBnk9>0FN!lu&9aWQ z64M8~lu0R82egna)R^Og7m1~UKUpzz$40bJz}4`F*WDOpqEV>-QmEya&vS!Bhafk{ zhE=%)svegutLc&|`r{6pWhE?N3PK$EvgVU(p=+%Dwc?hVB&?oo;1N0zq;~UOTH=hN z5XuJbCsnKqu4?9<J5f_4HB&1l0Yeok_+!eSo>z{N;+ieZ0~M60OuXd<Ei$kp9y#`i z_CwCvyZ&jKoPL5Fj8(SQKhYh0LdH)(hNT_~%r_nLTb3LZEO`*fa^8)g0**CQ(L8cj zno+#QAooPYM>4Q>(JM)4Xd-ho7xcaSk3q5$Sz!IB6@S)W4Mtf@PMk8%W@i=hd!(H) ziZ?T15)+v5dl>JTo&l+><rKQQ$p_4EC*e~IQegnlQ3F#uh>x<mAPUv=7%fA&p2s}s za>9*ANQlN9V!(!f6V4?bSlw>-`{qv5wuO+z2avx<;a*wK(2c>DC#GN&$0h^f4}P~d zzHQ&9&+X98ltt*<cD_O1Iv*#Leh>7se)rDqrXL2l4}-^ZfN$%|eb*k9s^8l=<JzuI zg9nr&qJh#c5IYCJIiCb2gZu8KFQP(g{`J)j-Zvji-VI)_X#E`Uwfn92$ISlDY{JK; zL-49Vuh-YPA%Oc1j<9db=j{`owfV#N<%lRAW+QxT;Cgq@!}0d(`J11u{fh+d5dO*e zWci}6Z~f!?V`%R~<73W!e}7T$boY7jOV9r5XxGZ>+To@rGT361p|x+bB)Sf09*3IB z@AK?K&l^n6e(1*?;YGhk^z*XY+v^p=AH^TRpoeRzC18VREiU+q!v``l=fpu@2sTo$ z{4sh@a5<w34vHzkPlC`p{x=%J$ymsCr^K9l+Y9g(@CpY-D#hEPLb!<L*pN{@diU33 zihS9_8AUcK)yfj0J9+(eP+;O`DRlLO(?r!f>r5tPipK=hipK9sklif#e?NBfZT+SZ zpD{BeiV~>Y5iEP8qv0^Yt8+csY3@B;<MHs&p?O0W+%)bqvg9okHJ;GT|2E>zE0;%S z0?24nr0%cx-FUIBBL7`Bp#|T9T$NACnW1n34z%c>bd&>0-J{ska}y}q<IWFwpWvM9 ztj|O}Mo1y0|GjwoK}}f~l+p{@tH`J=M{4Y|*p8ihC{l!;iFFws2b0-P+$TH6sn^e` z5Zz9w&!5ayJ$nelBhn+W1@yZzlf;92wH+v33uq`?mju$w51u6t9_eM5V*2j^5cWVL z6!4}(@a#*!c+l!sDj?;~B9|~!{t&?h0teAZryVZV5!?5DV)kS9kU4KUt41Iyc<jzI z7E~sgBHzv4aFa8uEQLCA?st)<-w&T4{;ue)nLwCTJO#&e?#r%&#o;f)EYfzIG$5X> zfL*_NzfbHBwafd50mpxNToDTP!MK?gx<W6rf%4LNeWNstwrdQHESMDbJ`dD4py~7} zh0>lZ<z0sA7k2i<@gT1`81*bmqA;!y-55%sJWjk>xnm{NUJ5nDVP1kN)k&jfr+{k3 zY69mc{aeCQQM}hxzgI1ZApSAvAnV!b+bJwKB(NA4|K&3QV0ZZ|I7@CsDB#b|)x{}! za=hoi>$o0<E)-P~4lRJkd@u<;@1?k4`_P|xoX>l$7tH~4>X4Dp*CpdHq&Q)O#GN`9 zK|ZvYvAYQ{cFP^HAh-rx+oLkS%w(yYeYg-(F;fE5J60+)mO21E67=JK8$I96cTp8p z5pKEuRUZYlcS`Dmlp4s@t++lZy6uA?JnJ82$&~D%fw3BgKqQI&M)|;gagt&mwAx6l zR7rEfZq<1s%}7$r0b=r2REvCnVn4zCNC*gYnk0wwcn;3LTyQ92&CL1aFg1+%fkPFH z;H1yz-s$mzrtJvyDIS_1=e!faRm3G^x@0%h`q$vnH2nd4Ldd8A!d9V^LyxIVn4~CZ z5Mqf+p)P5`tSAbTx}8OqDv~V8yFy6dviw4U3MtmCr%FD3vo6E&)e6^xkEB>d^(>QR z!@x-3`TqBM%1Zf&m6<DcKZ^?Q*C&e#-|6X8F8m_|xf9*U_$Dd9i8zeZl^!S=Q8T(_ zURvN>-8AP~NW!7SRuBxo<%)BJZcQc>4N=v3A=?7~>c#4yMwy?yp*N46)@D70Vj<nY zu9OmzR&b%c1VDB|1Ic`8z8?mT918IU6Az%@rhRKAfr7ICLz8PQt&l{_1;HSc278Y1 z02ya+ub5Y3a)ci@KQvVL8Y3~?lBygAW>MaT?nnSy7Pq}+1xwUGw~tqFgl{kH)HL1? ziI=;ogQy+M&VY0NoiMyj!*{Y9uSL|q9mGJHdZ4wLLvR?BzK2sDLU~dYkLwZZ&<uiW zQn30cCcNW>UZ?x(Hhr?x1^F3@U*UovCj<}CVDdaXVJ3RpfW%Xy#nXhuKk^H(qWzo& zDT>THkk`KzA-;UvtOJW?K?jkr>7fHn5f#l97LOBUwr}e#&n9z{c_W#LFa0!s{T-ei zH8iQ;VZtXUT?{oCIC~__0(X_w)7kty__a4Sghvh2MF|%n^XE+sp>E(%iw!UL%PpSQ zOc8`#0=hb|$uyB{8P!_fT|u89-(UFAFKrkg=3MEn{t2`70F!?P<LO;#W03LAgX_#} zPSEMCS1TFbjB9*AioIl-j6_nKKVu2IED(ekpPb_9swB{nM|7kZFeb>3{#(jT^K0}@ zZRDwxh#juVWouh?g5!g0P<AISSquI0&(L<^IBXMw29qd!g&9a+S?ijFxR{Ay$g62_ z<qc5^r;w4e)&ziXKxhC!h`V^%{H(&!$Mo7naA_Ua#<ta8R5n{>3<q-gigj5bNiTBv z5}dc{$aa}Sb8y^^Vq3iiLm*)8q)E(Rq;!~g{RIo{p{Rb_h`Gm}6DkDBuDP+X#m5h0 zDg==qQvcxf#(n{o4_VOQOX4x}9E@M*xb|S>gzxt*1@NSW5x1UtCF&TR>Gvh=g5nFt zEAq|K@WJ{ro{cteqI?BlF@ELFR$kEKHg?WQnaYkT)ZM*3bO(Y<?e$F|KIHl`=c82L zI6e$8h(kUDzuK4fEga7Z6pH}$?x5e!Oy&4LtXlIFu|Kg736QVWH6jP(-&G{^0>I+i zUsW()>E#H!M>8H(H9zbj7T{J-#%6-EfiEQH4yp4n$<$;TB~G0oT^VhIRX<?(Uj<0f z8+4=kcKe|L=5Nez@ki!eSsW8u_Xsg~y2VW*$&($Ggy{j6OZd|kOJ1M;nFgd;-;E>@ z#Qmr_ot**&rxXWYnqTOduWBOIZGPv7c>0ZRsoHxfvR_vhDXHiEO3oI^852gn<N^jW z$+G@&2$dI7jYIbYeB)VYjutUS5+DWQ?sEPyAKNbx49^}ciSo5?>$vD8n_|chH|x{j z-27Q<k>L<~>%f<3C+18pDW#D0Ncy=8ZJ*RQz+}kJmWj{|(Z7B2x=ql4<{zxNnSj1g z3`Xq@$Q#GWpS&|OFMtC~xrBa=0-)p39mV7hZt`dH>$x4FZ8dn_L<PL`NHeVX8IqiF z5NDQ0Ptet9e<_g9C8xZtKT9fAWosp?oKD%|kWqb4Dq{iRlO2j;Alp@sZ(-pzd9f>- zG8XX-kBrtKd;uoV<ndUw$bQ06_bD69ae<~xmX;hVP>!t(7<KaGw#?KpoZLqlE}lRf zrF{kxNd;}1#Rqw1B;GhHjAks@iGDM7)Wkc1p__JqN!_1;wK@x{C*_s&|3cWG2bWD5 z$fF|9GA}#h*>hy#SP#=~U}A#GU-AU|m7aVYgZ>P{t}I?phi>e|T{Oh6N~Y4{*DtR$ zBgBi~<fFU^>q>NkXU89WU-!fB3ubmHEnzb@u!8aL60}tynJFl4@7lLl`^$YI4P5D6 z7xPz{?T=@-@#n#2<z89j>;p(%e;<em0)rYdnbU8WsDuU2#6hK?W&(gkwT`sXq6h^$ zSLECg(kx7k=7bMa%!NI`LZO7*KJCaC8$5+HMlh7&G#z|JB3L3wa`q;a#4~qKi@!_! zXpS_viCHyB2}M6eDy#V*2u#*jEERHY_YZ(=kSVf<^_EfKt;8Y{m9Sla=3YyHEDQ#P ziyoa@yK;fox!+b;f*A8VLAHo+zZe>KwhodoY9I;ZS&3dfL?RRllhSqaxBQ_iaYUi! zz{bp}0h&9~vJ^&frJNQrjHH=RSz&_M%%C?pRUIp1A2{>?Ju)$y^w{ZNv{?-FK9TG< zI!ri-fs~-I?03j{BN&yKh408t6e$*RX6T<KR9oHsUMei+nX8F^X@9hU61dL1BA`~* z71aSP*hGJP5)rz@b5-PGasXv~lIj=*;fX<_KATrYBU<D(o~KV0VYVIyRWp}BT+k(m z5lnKympG_k><XH*)B&W06d7v4F;S?J+pZi%xqcu?_PlAEg-8u7kYlp)VBtrZkHZ*Z zuN_15iFL?&c#5Ytb9{(3%W1D4&kY3Pp5+&PXc(G$e?UAt`^Uvt5B?|LwO5k4AcS~c zT6rCY9cAk2c6`U*6fg$EhQJ*EP;`IHL#|^F=X*?ql97GIc!Bz9g*(QCh%W?3DpTdb zBG#CLJk${3Z&B7TkFfrnL=HEIBim&4f)1qYzdNVfK=CI1yuyUQs?y=&yTs?pb*sO{ zdamA1k!BARee%{6_J^I*O=)>>2bpl%NM2FHS6MwfTM6Z{YG2An6a<L$p;LHdCzasD z_QCM027ndTO3DWE3-_GRc%y<5&MT$vBs0nj{raPZqe1_~GLj9ebfc9{F=?K176|W| znCCwgxN7PvDBMHK8^0(h;Ct-2cR7zv$7vY7C~QL>g<QAk9j~#*%}Y9}gZFPKZa^Ps z>7R3*V?D&zhyo$de6i$)nKvc<iRWtIB(=;CC)YdiRu%d^_1-Vc>8f6h=#g4WYC2lo zKPwsZct$}xqC%q+JS?Oezu*cr7F{ez1eIR?1Tq)?c(ACT=$^`N51!ld6enTe`?j3l z_YINA0K(E&=zthJ`@EQI(KUCNf;{amfqkN^<9q{Batn+!FBKKcvkJ*X{Apek;b9^D zI1IrPVsOt2D-pVmY^=&%8MBYTJV@htXjTJqvm9xiM=bI+LnyL9PH_%?v0v_{n|<DF z(60pUCe^81!NJB1DwH0EgI#UE<YEV*5mj&y7xIzP-O1nqWC^KsJRp`lZMmy#==zq! zQAXtsB=yNkFEs%Cs8OmdBT@wm*58bcAkrBg6^sQ0Bt%JIR}<8(l4n<-PEr`d{f?bU z8mR`Mh%t}wqs_yrIub)reb7iy9a`5`&NMfLB@=d>=K!UP&w1;>gV}}bZ<04s02Mz= z1>yrzV;zS$7``L*EuAvGdJe&C^>v1YAkpq^5k>MB%X9Md+y~?##KoQN<<V6oNc;Nn zv9lLK;x9>GvERgkCRltS&Fm|25y5bV7dJg9nkG<iwhfSf`ba-!<e)r-;}TsE!Ler- zzd(iBYcD;lNKjH(lWG525JM>8D=cSWA4a%O`YBJUU1@1YW-A}03|T$)&gXed<KExw z$8FDxBSjH`y+syZCU8aH$nHZ@s--Wj9>qKJ=`iL=3WP}HvsQcXQ0*sIuop4*b#18O zBzF-Zq?|!+-f{VP;`93pMTY5dP3U8M{)z$+SU4U=@$Rw10(Wn_z5TBm!zz4+%NrOZ z9GkvK6~m5JI27ey2sLSJxmtdS&pi1VLYNQm+P80*U^_@%&2Mj*bW7y7Z4n!5ZSEJZ z&}=_ZTi*|)<A?=$dFxc&^ae{b{9b!HMH{U2^v{j!-IY!le};-V6(z1_Q|9nJw!)fY z+ImPjUhAadp_H$Q5@CQEFT;G1BYs~kk|Z%vQ^xXqW9Q`%O=&R;^RQuPZp1sTy(-Rr z!<fzL2yLZ@jr!Ny-!PB9;-N5QD-sKp=i%95%i&7Qth))A^CUs|nF<D_NYybVRqg>H z^T5&(W0pyRvQFT4qM3(pMPekPU<;uHM-xrVsII1|TT7Ktbz>6422^+?o_CMeF|*_D zfyQ}#jbkYK+Q`}Y(VXO<dp$xjpCBGi5=_UV*Pgluxa|LlzVud9z1oKc)Wr@V*xy@7 z{W;ST=case&mN<;Fp)@_Ir1YN9X#HA;KRV^#p>=mgOe;CE^PPpmVZ;Qi78ybT)O7b z>_^usP;Rq%ZZGXP<YpOj11+?6-!5QuD`ccx>J`zFE%hAOqSzqq;JaI}$u8J}g)~7s z&h&ILPpQrmVZEC<S%1|rbb709277SjmK(JsV(idgvOAHcc#Iu6eP!@0MFRy=n80aH zty-c?#pLWb1}^AHboKq=yRw6vw`nfKgnOE!;BfqVxq7U?2gD+;<VTA^=j~feJ?ymV zT*ze3`4(@?x*XYLn76OTX%7H|Iy5-Q*2^ge=aSCz4Vr?gy?m2F=5tKgs)>WSS%w4? z6`Q8<BV+pMR0&f9b{?eUEari4B`<sMu>z|dH23WWdaP`nM+<|g{aXBzguJEy-q=PW zJ{U`-q1>Q6B3M125*oRbOnEZbT`lX0QqdqDqK)Y^V0W-h4p(F7ye?=qC@}$86OX9j zFAL5u`_Jr3JPRK=k5h0(=s>r!W~Dl2q))AEty#R(pWtxHWXW0u5z)-=z9HsY5hKR) z_$ZohM5Krby7`6Df-2W&sZe_q%Kl(m_eAU5X!KaTLsSLX&9EVW{4KUbbq*<vw7TP* zJV{|9hCpxvr&rW853|-k9QFBRw=ch=ZuHt>m%%+KLC1H>)ox1((m`&*^3^YVy>M8a zr^xcy^JIECe?)5)kmxXl&k*O)NifHW16F^)!s|XOaj}=ZGnTe4%WI$nk~nLS*t17& zy|pX1sl~&I8>BR)ogtr@#cnA`Y;u7z#&xx1=KS4)5OLQ)Yuq47LV(Kzi&%O~DpqsD z8nylw0<V|`UxV3HkXLtYoFAtmWr2I$olmMoS?|NaSA>?xo;ENw<)Nu8y>F@N5WkY( zVEs$Js5JdEHacWX%#IZj2VDn?zM*E3f+L~0Bs7UmWU!I7Kza$Wq!^U<QkQ}$(vXnf zgTNi$FY3eVAGDAeEa~(ugfx2RHkLYg4L(u#fR-7#buTCPZGj*S#2w<PDA4v{-u;_= z=2x*#5K*Xg6lW`xn*GJJTkxFL>huYgOtRk3@h=DbS_fX=X8X1<Sg4vjVZx(DTiA@O zDhQ+kbou=+ib30U*GwS&!Nye<WbuA($x7j|9{EGMKA=fEzhyF8Hyv0wFso;t3Na5f z)oBgVnOm^t`b29J{;&tbh#U-Wx<XIG_*A-k<YmwOAEY0x-FX9o8jpnSx4{^n@?ke@ z26T+}aq%J`<Debj(|0{kSk1rnj1Jzsn*G9ahfzc&;27BUEUo-V`%mV#mfOCfJ;6g` z;cx!{U|!I2grOroU{UBb6mj1^=b&;7H4c3JBOBcV`_3>>QiBms;oTa&rQSFUMPzD8 z9anwj;f-*^k%9XIHx9=46&D%!`6t*HMN0caJqPnNr`@l7*Ct0DS_ugKe+m`-z14-9 z=A9lgCZ<c|JmuiIG}HcLH)Qyj26zpbp+KI3L2}$1Mo#aSnPstOjoP&isbMM+*j_Hg zcZ<yL)Co!34()*iYNcIHoMpe%=zp<&){kZ36ua^4c<tqPPr|KrJ{r~`nt7j>9W$&; z{rX4}_fKmv`kq|oE_$D++Bg_+A!-L?dI$?qkXE<^_Uw*PVwTApJZg)>$b+2W>Z=$t z&=}E%fZGCT%2c<Z;xmM6s@0sT*G^TqK>Hr8o<K-`_J+bL#S&61JqB%%*D;=zd5)3l zC{fvhhkW)Al*;ociq?5s48@7^&A9k@pI)JN=!)=*st^K`=cgAF22Xu2I>XPIUyVvS zkZAZ%yluHrV5dM|xP$u5D-T09M9(^GW_bKd2VsYDHbrbpVt?z4edJ0kZN@J6TL^>P z3ilBw*mR1BaP}R1JXH(oXyzh!JiaWX*Gm?_fB7VeyY@#)$BNH;%b2^6`k~nk;IJ3i zA?vp8W9bwj|23H(R|@!Q51L5#Lczoc!UfNuWFjtWXMI=ZK*H_vu%W;Hhl@Fn=xz3& zn=J|V(|hOQ>)}>S5q-hMtqsORvM1r=N5s=_>lylkw9wOuc6_XgnaVo*P*^%wpl0l_ zW6Zwmjs6RgU@#K;`1dZ<*|R6HYQRV3m<W;1jlfD7NPDKP+j~LGGFQK-WfNngJM23B z+L6X`scraDn6#lVA2csa>L+f7e#1uv&g5X*%PNc?VP%6oZf^kNWmg5g3|)u(7IDSL zp1~*?l--x0>3gSPZJ9xg)%c_R<4h1HV##r?XDdk?v;hYW=PIxC=9p!fm@4m2&X%KY zD-EFr;XWzkiYl7rg8_TiFi=zhoFAtsP~UA-qW4O$3@wB%DQSyKXao$*X`ly=Q1VO} zr5t&|pD3}dUCL3|YB%8Znt^qurQLk6KFyVcnG)N@B1RdX+;K4zt9t2t^5?=RWgG<A zmV$}pw&^RI@T%OuZ=zKKYBh=Mc%OZJ)RI76&vV7&6GO7V4e=go%ATDe34j*~t)^Pd zH%ru+06HYiOX3cCK5aYAniD4}_iA?PqTfZ8Zt2%s(K#JyWTTYgt9DTAUBe*0`3tqN z6hM+S%_!F1<y{9oqszBm;H@DMcw~v>-msf{m90~d{`Ei$A=I{RpaQw_CvnO&%*vFu zkk-}v)q@3yqI9B9B1e1Nf^}CDZgZ@QBMG`fc3Du}DlQ<FRw1Dx%lKdI7pLz_q?<Mj zR%-<`ar&Uk1o4M);3D+?47?1sk1wNcHizxT+MJP_tpp`c%hB<zAvI#IC&sRA{;&`9 z+l)F3rNU$e%<#NZif-*`KC~B&*~z;tiwis%BKu?b;y5YVz;|EAl8R0fDc?M?Ql!{1 zNkh*I!dyTPgd>Xxa|V8W${r-fun<g-C7A)ZBE%y!=B%al_H7}7x?yXDCdnrNTg};H z>FODx5JOk6{Y+6eQP^lWqXd=FNFOhkszwS}3GOKiX~T{Lh(EU{-y`V$Hf&b@BKLR_ zcq&5@q!9A~jqqp}Fr8Lt5k)n*FDdQS_TJ$gd%(Za)8<#tc>_VXJx6DKE^pu;ZK9d( z#AB0kU)I)l;5%B0unW?r9Vde2RrW;U$BG!xmJcKO76K0xtxB^O<uDz8L(Zd2O_|vV zR!Az*8^5)zXRT?15o$ec<AV`}{TBLFFwyd?ch-Sd)UcXpO?n!i1P(pka|9QHW^U2_ znr7xHM^3Jm35IG5stV^=j`t91jTwLKpp8w~OlF9dc%~v-mDI(Pn8nnQbrP?EjF*oT z{x=kr8Q)L2*AUaF>z%e&ZD}85@O^fzVL%6Vg##ZvfqjLCZ>e;FZ3){zfUmHs4F2NU z3hUC7mpyl5I;eWSe!F!0oRnXRT%M7s%z*IjfCw2jJooFWtn0&-=<=$<K@zIJL2=7p z+e4-H+<PX3U0kFP>lufb3By(#f3QKsGdn?5>*u<)NPbXsym^a~8gJy@gif4>4w+lM zh%BsAy#y=6j=0b48G0*%Xsc4aQ|2ELwv4f8EAU(27D90$w~uUDZ%l`mf%wORn`no* zJfzy-)+jGEs@tmh6cXqXyc5PXY}b{KrFhHfmLaP|x7M9!xYR}40oOfKdCn2j@+Ong zWfc}dL%FH#`os)yg-q{_0Wz(Fw2h^TyFa>68`ICief5iT{%OPvyqY_cZC=dhB%OK% z$yhYSQ}if)n~ljTKx>zf;g82W?VWO(ef5V>mY5v$xh$3{(FTdyrGsYdbtpg*K&zy= zB`UE_irW3iJb_6&>FZjd2PMPQR)rj~k80qs$eKgczhd@yPELpn`r$q_^*j71efV@r zdcNVg`(JRj@wk#<bR!cnzNLw(Sh{^;4157pAHj_MIMBIsoQ@V)7JAlG)Dt9v!8>`^ zZ=33aI_JDOSXT|=qcmYR_#y9ZY(}-!-ffR80>w1#)T{R*63Uj>(J_7802csceMWJ4 zvp61r`kM-Io~F{y=u)X9+17`w+!|?hbbOF?xPOhI>b-oPSgW%wb*F}W*3VXG8XbDv zwui{c5n$6Ki3*GR)jYo5vs<5ohE+%<%-BrSKQ8=90h2z799+b9k27OWl*3IN`sdNv zSI8#DR3k>)_N(%|PRu$z_khkGmjASLuc-XzrusR+u;L3E=Xt<jkhDB4s%&Egyn_$F z>K4VC55!8??W(t`nr_)zwIT6`2O}NYr$sD0i2Vee2hFe^#)oY}ocNDVP&HL3+%IZS zgzTzVB_1%zsS(#K2wI*v3)hPBmEs@ErUm0FA4f<u@d1E=Z^MCg$~DQG=2BXB74A88 zia`dF=KY1PRiG>7Rf3ecZ@KF&#fid=*f4YB{(y@xR4=%4s)({K9$9AfF4H*{a8|!{ zsENS>DK0H@H7sozzED$V2u#A#7s}Z(s|!tnpSSFKXP2HkW!k8=f(Jqrm!I3It+IY> z0QBVD--C=rLuVyy6!@M4j#pz{eOdW{j?CC8gHgay@uo1*>=!$#DjIF~t3=#!2%VT8 z><DH=HF%x!V&Nt7==4jK3_KGyY|^ZT3iAb$+_tKWUV>DhRq^R1-&U@f5HvOubauF0 z>5_!HI7IK7tCSY~8%-y+<wr5y?3?=upLwL_b;wmj`A1(9G%}7cUY%=}w!zBnqarpC z8yoKSV8>21-^ic(S$}XeIk)Pv_iCHg6nZNtBzZ&~3sQ=8VOlNQY}Z$?W>vuPtHxbv zWkPy%!YY)I&}Se4H@w=((^J+W1)08=b>cL6OZ+W+yBfFfO!zg)=P;CREnWOg$Rc7O zgVnesgt!8mm996fE4*LQ_A&;jPTgIaY_gR>IH=Z0I4W#wHeVL_W~;lL#Z!^^A8$K^ zV-{Y%h|Xvup&dA~z-2pSx=dAgX}h+b!c|i(S=qERZ<{KkMOTFp!m*D2Vp+5@Ob2*c ztzeUqBA^wOphayi6B8kCj4!?pw3s?EBfu&(k1IY2g^B_vPxQ5fi5DSMW0_@(BTjB2 z34=;`LgF?s&NGeDAy-zC4CQfW1KDi)Hpx=c@3nChuwO1^J*7<9Vhz(!<&adHcE#)= zM<Wo430>*|2gxI_tlsLnHL~V9+qKI))2n7YaEdsdgI27ITfz10$>>1OxnsxL$6+8n z;&xO07~0JdJMDz(+vrqghKNpVHT8eUn93=vwwf+~7rTMb+K9HsFgw866&@|DOJW2M zI@I)%S}`a8HE=t}CPN9ZjnbpJ%jQ5nGWETaVWhe<c)vcsy9S50mSS4mT<?f{0E=Uw zI`6mkg9#4gU~^50vWgU6&N0Rt4)^KgI^uWA-hvxOmwzjccKyuMv%4T{2c;q9z+bh5 zLNn?}W%x9mm;gAmnvVL2`@>CZiJ3szA{ZRHQqDpZTBtIn!^K*k{kdcCiF~zO27bH# zN&srUj%#|}Q~P_w)olZ)#g<@qbg?tMech~vUpZ*2OVsXbhB^D;Q9Fz|HE*!*ma)Ez zC_d2_N3vc_GN@Yc@%-DaU|l9{`^X8i<6(rfEtmL{x_AWO^V|~C9XF}&6GvP>Ovytj zkK4JMfjK0I&PdY-nH%1=zC$5YL9<!=9LM6}4@s&FvfNd|3W_yw!{hN^T*Ci_JAD^O zpY{aJK1>_?bwwimDIA2$gom@vT|Vu2!em|#J9;*51cP$_l)*gbdpLIDx~ap>Vh3hC ze=tuzB94LB^5b`VPFCGU97k~`aB+zv(|<9cc-0NC-i6~%Sh+I>x5D)&RKKIBLH_Ld z(_y8xA}6Bc9X$(N#vPeqvU}nZZl&rN2V&<<0(kI6jBX!jE>V&HeHu22SP`t>Iyqc* zRjw$JZeMVje#iBcP<)fo^KJ^p=->uI;b8Eh7xIwOM3OV<8p8L`PG;$Gxh3gnkd*7f zFPaw2j^N%+wYKrd;p^Mx3Jseh_`CUN{H)R=8wTh>)q?A>vxK*-sno{-w6%Q_%RhAr z4c_VPA;ym^A>ly@Js->ek4a7u$|8?#(irnDi21TQq&f-YQ}9*8S+xB=t8ci}8)dGb zLxU)c9u`=pR&eq}Ln4d08zoLhfo(zxVNglr+*=&H&U<pfmGX(5Ij?md=Xny%iLNrY zD4?fQdLZCevo1%&smTR7oT1iz?MB3maic_&-~y<h7m};tZ+B04Swplr#Tvf4V%;cR zu~In@XQBsu3NvleQN75_)l=x_H9y6R+Ku}4KJln1-sWXw#uNAi_fxRNqBHQTKcCKe z^qrX{`Pr~VVrfJ3)!<A0F{uwWf)`|qvs8N3w2qV~->%OH9tN74DIq7whN^VZYXk%y z#A>kqd}m-QYHYd1BuV)fI<hC1y^a^w<HvUT*7L$~ap^r02|<XU<B{jw5@*!=jLT!A zymwLAo{{<6An9@=ZRHh!*bDHeeDGiOkjQOU4*}1wI-~vx_V)~nO!!7oBNAx&6Rhdc zZ~8$kg1zW!@0k(r)v__z@nS*xf#V?Uo?Q>$%JRSYzrn!In}*-?J+$v2+xolC{#x<( zrf0gDe}kyA0|V_I6^`iYIvdgt$)TonfCqWLyG3l|jv-#*ui4gyvGG6NimQn|n5~3? zfJtOUBOpFtRkcsOMNK@5daL!)()`NM703Md3hv&YKYC}e9)cbKdjp6IDhCU+2C_f_ zS!p?-)n+3uWhINpN9#qcu{#g!P7T6nc|@aY9{y#kIWby6$;T%rxy2UpD!<s|f<6pD zg)Ab}EFqZ;wjU1qgz`>roDN@e&P6JHaF6|YdJ=feuM!VR@yvqbDy*xlyI%|2_Sw#p z&WV$gmbO>8z+`c!oL~}`mcV2ud>Ox15V&~6$UOYUU_@f0E{8Sn!#J>qA3#%$oJ)@H z`dg8o={L2odcIRvYO)|``*k%cUf<ihv%7XG5Uk+nU}ExBv1y_*G<VDUI7<zt+)QIV zS}piXuT`<4i0ph29@Gufryk4Jmemq04?EYk47{@EyIJpHp59<1WBYj`c937QY#^Mz z$8j#^8jFOCWYRqeRUd(ty|r+;b3&o|JN#T*3vR+>HIo`D=a+?YehXmKkNmNn9<iCj z0Fi~UCWXtp9ph;grvaz9ttN3e%c;aCAR{apRn!g|)?&{d06%K6%tcNKOg=s^sGTq{ zxA00kC1dD1d4h1}Pi)nG?^Pmvt?sJ)K*bQNa`g<w=KOa)LuNsVa)z&~!Vhv%7o~;h zC7o0>nN6CEp96}Mg>C1^79|BC?1qi1Ywky2(t(C{52ltO=5fniD+)(50<_vd@==hb zn6NJqDj0{Zcv;n`dut3=$)TxMP11mkIhVJ5k>|7v^Wq%21zd2I?&MUgQp#*?Kx=3a zX|v<BpeeTEs>-cF-#|}-VU4`=q35RX7UyZ)pc7w_|I(G8L4e_7;N-|$5O7B<6247% zx>JUZNYY`+Cgc<XQ-j?Cd)@-=-K($9>?D0su7kJ&*chSZlH-JDbkcn%HwQO_AnX*j z>MxKZovoGQD3yWKqNT7=z9YI(W)~NDDn?$dO~cEuW7(VDIA1i6ZGK=ES>Ss2_3fT8 zAWN<m6Cz4cWRNDAbIBaSf9y1K7Vu=|*9L^~(&MDh(&Sf~Pg^;hEPr7Ks;~N0W;=2U zZ8{Xjv*Ja$A=y{)+;p_yOt@WdN{t<=vMZbUA{r!tFC%z?=~3mRefYpjw=mDg{Sg;{ z8YI}w*I2fF*dKD@r-sZ4_e=y>AQJH96jO-l>I$S*X7;@0!I!p8w$i|83{4h(8G<BW zT+Wp}z>%!V7`tiAgH@ZD+23%0l*nUkBehvpB7C^bZEK#59FA39gI1I{mqw@`Um$JX ziKZmW;Tf$%#x2q!9GsHEC^V%QqQw=(wY2Cr_qHBKLpL_TKIxU1Ano;P>KMgDV06~D z9+YqTVz??~&&30A5h4km?9C}<ENH0g*qxH^go1Wvzt3KC_u8_Q)JG2QjQqNokmQIu ze)p}Ko}$3hlSPTW(LXBkHMZv4`wjkyG+ee4`E-4isqpJCyRsrOMc>~H&l&qpA(sTH zcGmsK{IJ*7h^e*F9`nySX5^^^$#XB(W16&P>y-T?MG=4z>A@n~&WFdwwV~{nro%>B zoA|dK+Z(G+Gq?b+3w^Jrm3H~y+=vBDTei<Qaq<)j@w$7Vi{z|m!uJ4;&`&DnsJRU6 zqJEgXJ<XoF8)y1E=Gz$s!*S~P1GsISC6EfK1tx4sy>OngQ14hC*l8!Esp=_Iqj(OM zJD^Hcno9P<*fe28S0b|$wUt#6`B<RvDiTF9Ez<?8sB?VggoqoUd~FvLrZT}D>*f~i zlch0Hn)af--Y;c*Cd~XydSi~p$H7mPc37B|8XlNS+Ao7L%Ui^*2acc#t6dEjycd|v zaLIKBfaCXnXn$Hx!D$5_HCLPq)qwvm0Bk^$zbd;;p6SNKMA1yCwe$Y*;r7!fH{t|V z&d<*HkjvY1$qqg#l@DS9XykFaOp`0esZ7mB)3Gy>D{A3ajC_KqWQtNvYXct7oM!QK zd;&V*UqYAbxHQ)uLvxQwxx!Y|<q<qU&!H_o^s&Jls+apgIVeC}A;GT`1?&l`2~x5& zu0WDzhP01Dm-PA%s{Efum340TvjI&z6V@7DW+0bbH%TkxbhTJG@X(e{e~071D=Gs! zNW33FXMx#g4C%D<MwXL*IbbnV8`i~)Qgso$+2c}AY?lQCEl1qkgY``=D%-TP8+t1o zE94D@_79M7pCu>rGjZHQpJ)}=98pV`6FO-&3W7lxc3#lcN(ZKcPib^nKt>|$iEq4; zY3qcak0Z%38k%fDwb!Fed-kJ1_CTx0bFxls=`$@v?szuV10bi_(j5km0_e~;j{XyR zj1RGHt-fk>NSiJ$LnHn>YILH`iAMe)<4v<Sqq@0lKAD&;+&53LK#ARFc^{J@Lz`XT zY*0{qQOUiul*=W4b0!L5WM<<z>1>sOZ8O<jKo|aSKm`ouW?(ts{aKzN3z#s+e3y=} zEftuKa1c)>C1uR(j+0T&;pxyjx=5#V#^N;MSc=&Z(iJY-xJavO#eZN@L2T<196~)- zA5xJJfnavncZiRzM@GIqQZ8nk7M<MFw~Mo<?80Me`k<tWhsUmIWi*MZO{yCz<0vRZ zXU96N0X(7XfZNnjE8&Lp@~S|UNMX;Eyw`{$s8J2cDs^?9!og|Xbs_p!OXPVTi5y<J z*&~9#dF)Z^xC5|rtTeGxxNdnmGoN9y>jjXWD&%dciNb?b-Fk~=3ERds;RVVNA8ZBd z-q*I-Lp=(a6sBytv_R)*ikMLvAr<>b-=iWg%RajQ!zM>2#~+1=7gMm#61O7xE~i~Z zxcba!P5TiMuDnr4c+88LV1i6-REw9)rApr>DG|pUX!6nEOJW5enM~4uCIQvMgl-cQ zEI44L9#VN-q6MxX{b+OJ7<anxQS_y`LL^84CUYJF4;fvAG>EM=S5JCRXJLjOjVH*- zP+HPV>dV0z^o>9P&}2rl6c9+v=;qLlc2ey>YW5YW7yB8liN8qSx#vAC;CzTt6{c~4 znAJ!e_=eKw#vahG{(A3-fBU0L9a*puYsY?MRVQI}5(O>TA}FP|YgR@2*Hx}LqhnZh z7_?P-?1(8AYTA+3tWce_jKij6%<Fodlt`CXcu#qy@>Oy_frfz$S{e;vxiUqX0fJUA z(GsCs+5sQBxa7K#z7M@hB$afU!3l>!%#tjgRG3Fl>Y{Un+1>rUm%GDfd(WT4(7sZw z?L7~+U;aJVdG%~J*!h0@<#)RWQLy{B-Iu}t{_)@tp1*jp`||K0c=aZDy1)JM2Z91c zp6(w0v<syUzuygB?*4p8&jHjkJq~=cv%S9`9KH&k|M+qz*n4@f2d(_{X8ZN)-8YfZ zpBLEF)7{|3EBLv$`|LCLFc{>aLlTj<yi0bYSJTKW9wH)!oGct?1`Ss<1PU-$|5`tO zpgUk`&005B|9<J;Ed4trbiun>)+`g<{@XUoww-d7Z4zqroe+Md*ePBI<8(}lGT4hG zylFl!WP8D6du||I`j9EM(d{-HFaH*M=e#$xFoAW#S{jkPPS|U538$YpHZLb)>Y;67 zYs*7FOKuxm#)cm_exYmT0st6l1KEievx-`R$6BUo0i{d&WflCi+i1!F)QTmq6Osx@ zn+!Zj)&lK%Ws*^1IuZX_z?Ur_>L}-p&SR5vJrQ}|o>a5E#0wEQrOSHI;SiYJV&pgK zkw+U;><ttQS!uF9Y9}y%M@j)EwPffTm@H?@sJ<!n8QE%;x}}+}cKf6xVx&A@!32#{ znPnF`#1+A*k4w*XpKt%Te>nW<`@O^6A@J!p2Z-w6ZT7Z$TSy_0Bu?@&Vg6W2Mq@cR zaEZU7>OCE?hNk9tAQ(L3)8<d-DJ=LIRNXm;4uzDk-gX_gZ7yFyqeVJSN=xN+rNJ<O z6)phpwN@r)8u}dtq;ld^a;!qJfwXvQ+c$0T$q3teo1LAf!7mpRjL#_1sNfY{Y$d1o z2j1f!D6-7Ixz6EDevB1*{-_>OmdErgOHb2LoH?w!k;k`X9$=;`_ag8k4z}%z&hDO{ z2(1ZjA+R(<OzczW_DT689ymfLucy^6rg`U;#A(szrQBD8xHFlPxD3Z0u?L$7STwH6 zRiv!qHnBi!+7npPI5i6gH|e-t=|3cZ=<>Lsdcqgyh4mzU(p0UChZhmAZ;n;H{~?HB zoIGj|_h^rJDAdBRcZg)RFkh_`3CT*{TE@WbF-t2k=9aAVtb|jks(Mb5(>R^z61HjU zy?=2Ly%*23i!8r_ZJ4N>jtp%7QI`W@2$owpKOv$=PF`F;ls$7kLy5>~ACUScA)|7; zae8UwEB6;b1Z=DHtqL1%nTvE*v%rQxOl4@BAnvF<UKcScr!q=9CaYC&Jnc;5YgYL0 zPG_|$j?Zahb{rU;C!-6c9GE1hRli8!SXQQ{o4Q=RCbL7l@oA*cWn03t4EXu(yBT%H zJNYbp`Ky<>@k}RV-QzC-gQ*if%6QdKV4b5W?i3HRiB=n1iVu@W@EFPj6^}0|Ga<`; z6z<b$7G#8JdFJ?2a)<C@TLlYf^al?27q(+8?xvjB7wz)U1_YDR&=m=pQ;g=*`2@D0 z%OnWNq5;U)i$Y#N6bhYfFpPhLUT|*&8#x?=OjUQ;Aay^5<C1w@B#e&6nBvPkMQg7y zoSkBn^ps)`I3<y>2ih~zq8}F5u0Xe{clisB|ES!`Ni(@)Ul`sD0_6>ZQ%zg~=e_oU zG39y#7s`&T#3iq9C()0t$dnBmG@K@-(pBa~dX|!*8bK79_d}z1qxfV7i4>hB-mh#1 z6dnV<p`V58dcd%LsCOf=@NuI~S^x#u{q?ntFK~C#{xzK+TtQ8szPNh>o>pEgHXnE6 zwdz6sR(D5#b!5gbe+bss)`G9TSo<N^`0}e4ofQnozg*u~i?CW0eD&p*kG_Jx8()3> z#iK93`0^`bH{Jbpo?gZiq$ZVfV&^^HUI|7h=sU^K{1~3JOud24kBCTX(Trxe-mqf> zbB$RAoc-F}!ma3;Sls6DF4MP)D?4@XUgaPKLEm*lltV0lFu6)8PD*V-JZ;|)7Ab6J zyV_+gqTsUT?I51u>OBVddKsTV0SYL3JK5b>|8@$Hr#o80Gs3^@sx%cpZH8;>8;=Hq zK`#g~eF`8hSnEZ&ZDh&jI^7p<x_L%zZbJy_2o-j2*#X7ER%^T&2icoe+SzS&V;za> zH?WI4DITMao|8smM~19k54ZuNxduJCaTWnzZ)(}lq$|#GzCD@njd|%2jTcf|k<bP; z;t-2g3^*$a7LGGLnO6n^WJA*0dMl)dL54419qw*2S?g3}!F^nr_Zyp<yRS;fmTzll z1P2|Ow0Bbiq@R-BC(e|B9;13F9jWax;#?b)i_MrprlLqf{4ydE3J?eD3PzF6&^UGy zWAu15NHO+v6=|e~_V;{FJplaYIAM<LRokP-CnrU6nNoZc)Re~W40}&u-5spdL6)9z z2MliS5Q8q-w?cxlS<{fUvcsFl>f4jmQef4mOtt+r+O<xd?fOQ2>}&wAkEeHmK<8Lb zHmJnjD%%J5(VWoiNHfV5ZFeoffF(x2Aj!rhl2zEb-(VRAhdSD9=;)m_Z=bxRb>}o` zGcQ%fIYOYa--g{_O;Xe0PEX<RbisV^1iwC?P;3H^Q{)Twf20f<m%wLeNyw$}Y<wd7 z99kNlQ(!dQ3`MV-+B%f@gd8VH$;D=C15$qNyw_d0!Pj(#pm_9XtsBW1w8|}D<Fv%L zZLx!3$}~`CriRqE3`=?H&g{d8!W6*(>Tyhv#<`rRXeOgT4nf2U8;+&AOB~M)aMpYW z4{@ywNs;XfNhFhL_Pt>krF&&}$n`RlF%5=_iNCh+VK(8}6^H7iCt&I#{wO|nR%NOj zb$m@XR#dY|<CnMht8B}r<Sg6r{nO0wzF4{y<C$4mk;?gyPP9ouQa(plV9Ppm$h@w% zY3l?ihfax~pxStCUWA`!98?8o6Nz2<BGcBk)_<g3hh@fb+sC8sX%?1f;~C*;pm$^K zR;QGYM!n$&>IY_9=i>-Qb%O_27}&*}mVSV#o40HkKvdHwi5}w^{U|8Dd;*Ur`Bl$? zfmV$SL+98r(>ZXI=o7;<SXCs`!!0v~tC0di1;U-hql@^Aae-dh`?g=U5>aZvdkjZe zACZOfX-2A-^z@nyjs!N{AfwQr()yiaj?&VQt7@=D0?kvg>ZR@?)YORNE5aLP>nsu$ z9!&fi)bR?vyRTA=?FO_l&J*_eP@yEHQy6%g8n*-o<+|0#Sy$Q<?5bdlbgRUOZ+e{4 z2V>f%r?%xrd9F=D=9w~w#5e}=c@mE~BwRc}T?y9Kx9x`L`7sU3>2o`)a?6f<Mayye ze01}1`h0vFa{8=lNKT(Ssi&67Z?1Ue{{9^=eoU~OZ^j~FN>W5ov{~dqXVa#Q(W0^6 zRW<kFSh^R~8B$dhU^SC5Un^(%6%8ojz<5licf~V46V$G6$d^a!ZFfm+w>_AN$*|w# z!*O`(<Ye-yh9x;DW#hBnbwpxZo(;iKq}@^+z*I`6EMRGjg-3}_s9PsevPum!<FRSx z=CS?zi9g#TR!(?P5*I{3cy_sYjQ?7d7SG0m51$UtLv+XfD3i2<d46e%d^6-s5Kc=> zxylpRr(p(UuhPcFx0sn4@G5geTZCo9Otug)n)w32A2W&wz2m|$ZGUPRMDl-A3PlqI zH|}n)Mk*rbL%c9m8^uV~x|1Xzno11IqLegpQKa4&1`D!_u;WFo?z8}&#uc=R@*@Zi zd~#x`hivr-C(p4+?Z-iB4Dy-YThr+j<`brKa{VpGx<P5E0cF?I{J-^@1+^2yRHD9` zw;=vv1B=Lg3VpQf-dMvM2f_VThkQwtb2vgOsRVERfTF^^G%+?9-M?GzFt^Cy+SCRw z?eJaH!>pS%`HUb4Ly+TI0BS@d<GzXnq1S|o9<;AS4`Owh;E*9^aWz^XI@TPFE!f-W zj(9>QM+#T3g@HBVkQ@zKg0tdIjVnB~yd1KgRBDYhPHRDpiV6dw+<<$|HlV_e%;Ntx zW)I8lxi<Jv8#18J;qh`3uSGU>_?80+UEu?qGEm{Pj4+5660kLd<2!BFI|k{k=~jnb zQG{Jukc?wDd8j2t(YtA$paVWcZ~0EmZZSS5>oYRJGDafaF;{rbt*T@?BfUQ?CMJ6q zn#4w|PYVVl8evPdLe;A8u&VPSzp}Fu92zHReQl8Cau9_>c14MrsAhdAx7XRtjRg{; z{7_g4iFv(fHyAVp9LsX(G+Ro0Lo~$M!~02`{jyG_Y$(|*LPY$P&(SQrVNAo;^K}7- z0<4;j=?Z?3Y1C=_j5|}$a&NaF_nYvWA0*cCd^*K7orq>FbVuA?eE|aMB4k=+bH|n* zv74m&rJS+ykrjtXl$y(DN8Kp5V~>{?D;3?jZ{VN_*tXkpU|;E^0rgF_D{epwlZ1{! zNv1W-4!U^`u@8^y8o0()d5k7NQ5LU!QPr>_+sZFREMj#J<RUL-U6r>lNf{M8vXcAE z^0I25F3G>ki5i;l^h<5C|F7V$vm!rDRmKupwbb#K`A$4KZ);|$x<0TS=G4XgmI{Z% zhEcuX9>?ld=2R|O7!JXO%Y&MZr<Ut<C*nJ4_WAD6HgZ=#?}iROY*>P!MA@oucM3M{ z8C=T{X~nv8&;fu<`!H{$*u+?d_3B>8gIfG)G%O-*^9`$5$w41pb2+Dkmy5RZR?(p+ znYL^(7Es-JZYr{A#)Tz3vbI%RDAd`k)WVd>Mk3Q*!9QmvZ+;pZKvAO&75yH_?auZQ zR`QHbF-(iDHrjlsd_~Ps8gm)Raz_zmLA$Ms&}#D3kUQ_vn&ThkzYY5zy+#y1ZM#~G zO2$B+I6K+@e+$Zw^A8zX4b6d2@2tK()u{_R>Y=J`UWSGGV#_r^h$MyKmSe^qu|e`y z(-^_FmuRRMk=Vm}XljGB&WWCMCVES~6*1L^ZnqzcoGlfGPTM&^jmQOJajNh1+GDc0 zpQSUjxO)4iF|l_A<fjLgMeA6s(pxK}T12U8T4D&U@L7T4)aMRc8h-S)*4WjMhERQE zX@_O2^TYDXTN{3POMO1xriUMot8NQxy7fZ&D2wE_3*>iM93N$2{P!%1)mU&F>vWGE z$ygme`cFEM#&sR0X_fQD`l{!N^>(_}hYN><{3lIa#5{1qmaw9Fpt*Ti0V{o~5c41@ zR=Za0P?P!CiY>RLWpal?ge7grJk*07#TmhPi76C3<6S&lg0JyqS8R+av^yIavQ<l7 z2S=;bp1XndM*NCBQHMWfC#Y0P#(b!^UCPzywXY%J#&r?EicVZrJ!s%KP<N=xI6t|y zuwkSssd)s^7fC}}F~&r&ND&U@BC7>2+|q;_vCh;7o**1S8H}4jrF_uHvA~NK4P(G% zJp9=M4l4|G29fqrV-f!t3GHVTB?Rvy$^qN!VRViV9$WNn)hYdT%0+c(XuewXqP^Y_ z$4H?Mnl%*)bZxE=ym0uc7$-$C#&oVN+nG@H^Yk=tBWQ(di>RTo^q*cj_y982B!H%# zM&JD<S0Z|Y1a3q43jV6ZuY2w+0AD##n`(j#o)9h<N&gE2vFNtp;5Ebi7NL8g<$i>5 z{*YWRI)SQ>iV)~NU%s5{p6Mms0%qwl#?R8FjGwzKXI<}>OIp{v!?M<O@36F;4eLL4 z4ZAxWeqenJPg6<}hKXepF=-hmzs{5J=veyn|K@sEV_#v(>jkYV;SY3a$DsVk#9P+4 zE-n}5h^LRXdKWhM#~S~bYy4iFdyAJ79)~3?0N&yh$&9mFv)ejZ_Mb?&p$j%9F7o-= zc_0xGF3mf2x$Z-2^dhc?^?D8N)jn~6C$@Y!xfXYq@oTOS_P*7{=-yxX&jI+PVjk2Z z6L5@5fXZu6dqWWBF%saLefX=0%PxU2Z17xtv=#+x$2DfCZSgn2)DjvQlWXN`AokrB zM#wcmJIHHGiJ-6GUL|Bd&*;E#f@Uewh-04c9MG9eF2&%Y0xY9JMt+Ks-PG;B%D@(r zSx=4l`hdizxQ}-;`2F5t6uj6wz(_#o0A9c0Tzz<9=xxRXYcy(*GU3hkV{Xo5%OPh$ zHM;_PBy1U6oBQ27;d4o#04{3sbq`Zn)Ni7%BSczT)V6lXOZC?{lB<i})m)!$t0A1V zZ5Q_h*=AG;!yqQ2`BP~DbqLHw{JzxKkD%Fsj_4NNhhJpYy1H_Y#?>BUu-RZpn57tz z{B8YM>=RpC<vqi*1-CT3oF-s3wULCA-wPX!YD>b!MsF=rg31-rK61tTw7Z!_aZ7@J znOxcE-U2K%cl_lj+dL*teH`4U-Fs;Tb4>Jdm-iUk>ZoN%ydSCUNT7m5HRN!T>l<G? zR(TA(3_8+SM;U6NBUy^>+~YCsDbt*{R}A}Xc;ig+vvg!z=e<!IuxQ`e%B@tvWND94 zfzgzeT*z&mlWb<&+~lWKLdxzbx=3L#>Phl0I4fcdtXuYIV=`>Yv_BQEpfOX7t+7QS zP2#a^P02eD1S%s2{6nacj^m2M!i>=n?u8ydTDFk`ft?WVB!{hl>eXq|vav>!W;&&f zE9(bP2H*w+3)kkUAGi|<j|>+tnAMveJfeJm+A3IY2eTr-OvkQ~V890042~uS!zyWK zB_alH_ge%^QHN4x;!gfcnG29(1&<Ugf{&)=N;61+)*L8O0}H$GFo){tDV~Hbac0GP zcx<E4#^E8QVVxz(7<P8FT_lfJz`taH1zaHMNOUOIk%%8#0MAjfDFJ<b?g~1dJy!ul z0CtHRi9(mQaV&LbNdUDVUgvYk(4w4+ucaP<KFp~rm*i?^OvGtI9tjcFw(qcHM8OoD zKsiz~1#7^guZV(9yoZ6!BzhQEY46nSW1%6>F`CxS`&oHC%E{NegR2nFZm|2}XwLEu zb*%1#1#IWN)!>bC@56%ZXh)z2=y<DoL*T|aY39Z`VcTBA;>=DoHY(!sT;}B@DRoc? zmMh%$DTYtYFf6F?Da!RcFGMbSYTB1=i)TU*H0HNapa#Eif-Htz{}4-ayQ;HkIGtKp z)@u)%o;H~ekax@F--6ApA@jO72CLa++^U6I^W%=8w*)UNO!yvKf`vB16laRYfrT$; zCzE9nV|Hm1O8kc2`h0c<j4*3@dmhS>lO3y5-U5nK@=4CE*e$S|MM0j4vodd{X0#cj z(Q{bbCkY;&G3SEiizLhQ3WLK@w|FyV|E6E(X_3@XW1!izu>E`iYz@nDx@U`e-dyOM zz4Klnunsa28gWM`;KbNkT4sj`acH;B)3ck6Ve#MetiiDN@{Z+2j4OANj?zlb%_T>L zfgK%vmyv<wP4{JkKfx5_sHJC&FcT<p3{x%1;y5Q4`TyA-Y!;H;7SzePWEW~H$GbUf zV%W`njkY_^)e3@_k;9yPX2&2^QGD9UJb`)~9+=gm*ae~*Cd0s=v`xlszRxs>CQ$1L z**EtCZ0IMLJd8w1$fgZRjjy?X7;|SW?65R_#5Kgn*3Tz5cBBJwoZ~&vbTh7_3n95e zyH>=8+HWwjrzQxDxJQjSt$~_tb&=%CdXB6P0x1G@B5^8@dP=XtUiH*%XStc^a<*na z>P*Je9@MNGckPg3-55V7@c*t6#Th?teCnn34c1AqSr)`80}h}PoV9RQn~$5vzQ%6K zs?a)2sqX^5e(i2rD!Q!|Le}0?S9KFfTADHYse-jOoFZlBxAfP6$-WG((NN=<=7^RO z$Fy}=^H`Fr>1uIkxSb&^qZ%qvNZXL&A=WJ1S9ZB0%wjXMccZ2qqfIu=;Pt*+^_8u- zP&<X5U>p{$ubuy-PZWX#b;uFlMwFP&pcWW;i|0Ttlx_(7)6yM;YM`OjsH19F=9IwY z+a#N5{7yy28ot>6dARrT5JU?=(j=ZOlXebp_h@iJS{aU`9Qt4fyRcT3-y8>AQE^;q zkWN@V$%N+w*Fa98p5Un-&xeW9jFYgCi<@-~c;|gR(wZMrQaO;SW`rY(7s6+UZq`*j zr}zz&fy6mr?YtK}Q7}<T;Do_tMDCGynC(_WQb%bPCg=!kOE9&-#p8BI%biix;fsVI z7WuFlfTiB=?;dHz2(aRA{u1gh0WoMiPB<paDk1Yq*xe}JcBh<-e>q*>cr+=;zx;A> z`sj-<;mO4>r(gg1o5{s5<>~mFum9Y!D@z`40^w$NqKsxlIfTF{A$Kh^+k0<dEC&JN zHP**Qx<U6o&%}eE`;YGZ5a9Lcflpc6tiydlCw1SZ+zfH+U}**1*fsuv9}f_}()J(! z@RU~{Y1IGHg|Vy@_j_5XTLRS|M#kdf_1y)6yYBRN-Rn7NruKbk+47gWF!FZ2W|AAb zxjfI@ZQLkh7jR?qts;RbW@okClu!)s$}QWyQUQ2uY)-dwLC}si^@vyWti?>U`=-l? zr@HbLvF<Bnr))yKjT5f!G<<pBxtdvU&m;+V_t6yy;Vdw{Q0Q&X<Ak4Uj9pa6b(1km z8|~GgAF}Z+vARM?cbp_=%##(ytUlc0(ox`N0kU0)i!r$ZpcT5c1WFs}{C_Sj*D^4a z%}Nw${DSZzm0pGU$T-#oDxqre;pT?qM~PKfi>{cWo8%%LZ&3INNq5uOP*$569BK5i zr9a@S1XTF!ymv+bZR^lLN~2=wE8?m`f!hX1N}@_S!o4#iD5|bfU?x+Gh2dveN#i1t zwP>;Ag;j?Dl5|=Bhld0bE1B;Y`ZcD4I_jd1CW#1?#10_wjz%E88JCuHSs9q2^9+y* zZQhQm*cd!uyj&o#s^FbM@Li2n)FP2D-Pa4_7)gksL6ugMq~Y)3lY0T6JF*T%m*Zhw z(HcQT3M!DsX^F~4ROC(LaT1(O@*>UWa9Wv9r)>H}H(=$Q!hl}q#l^tN!tmOgh2bT% zw^vf!k)OD|SEs=%Xzy9w-V1E+JJsF+xA*j#wcH2L9#r`|w%4-maOH1NOat`<bFb{$ zV#PhAEX)XlqDXP6<C#*($C6iPnsKU`d4`&9Brk<NU0iKCq=d^&@F=bs*W4w3kJGdB z3RZ4)g?e>oGT4qvvk2qBWJ-Sxby8E9p`%PxMz!c^9^<`y%Rrqnk2GRcAoe!P;}&mi zUjz$zWqMOZrXSTJuR5GQ*cU79%G9>4xebtS)(U{{v`reAaqo`sqbSVTRE$~<I^7(r zLbN$sGtvbDJVBwzpI*4r8T^u`83+GExj!17PLT0sAyl+1g8taa17*V;7o+oA=(84t zk<2KL9p-FZw8xipk92yiH2g8$b*b%0_IA<`84KD>pw1V5?uFn-Q(X~4mg%l;v8CN3 zvzu93Q6hBc7X~UMm4@hhU`L;0BGM736~&D@f@UU@{E9PC|1&9a9h?)Nnnj&pJkZjR zTCld!0X2Ze;PRWGth7TafCGzCI+&ga1)nU~D=1Zr{=J{XWApcSIUIfVIN0MZn(!BR ziRjOsKx()7H0<#OYnsuOnu^SbRFHsNq^*f0btJBVNn$zFHbP_9148(}<Dix&T{`Mw zJKf_bIO<|M{0&>+ZwOo7@*kst?y<xA1XvU>DELc&;4gu}=lG8WqGkQII+9wR%11%9 z;%;iPkDwPE|G|De>=#&J)8!TLMlXy@1WKVgP7d&NA6I!Hj=QbQ_`4)asGzcU!jN+a z6W5D-$;uqnxMrY$^QCIb;C2gGEOS<B!{Mv7IUQf|laPqzN+Y|Dy0SIEHO6dQ&o_g) zN0Jy__1lsc?c-z}-Cdf{QC}HF%}hcbF5i5GpBd)i-okLouTCkIVb~c&-)=tafA*J- z%Wjz;Q6a20U}ET?OwTFr{}Rc8BEeGtW>SV9Coy_1V1;UqCZ(UP#B{m{6*&Px#4q}X z22W2sEl}y!fY>yV_CW&0Is3^%j^ULz6fL>ZE348h$r0r62ES;~j%V46R?c#LH@a`E zVPB(Ge7NB-9*?!B9LqtiYZK$;5FgV=rUwBU!q9T<>vJ`VPTSe|=4OBqx>F+{Kka%J zN34NM%=eNrIzY+&_mbWBrbJ;v*3E4sn6n}wHz@O54qfg<n4ipj_?dIRbe@19gLhNk z<Ch4_PsVN`3FC0iMJRj&w`y5J(Cg*rX{#YNx1dKz#u5HQZ}7`!tyFEFqj*9iO8nk( zQsgObSjRPU4Tp+4tj6$0!_%Mzt<mOHT;L^ZIlwPrXD7}O%qX9ppdw3UXF)3v3<&&r z>G93Mh<p@Sml|vf;&DK^!hYiBBHrdE$z?Lx+HhE!NDOv*Re89LC+MTVTq4JHR1984 z#m8Dk<l=@Nko<_km=KnYL@EjiX0+BnsNi>|0v`8+X3*MUIX|(d{uVRe*E1hA`KMf~ zQ;;_dyZgs%|J!C8XA>qHreQFo@Bs&ae==R7#+}9Apn%&f{{A0}|397_c-(!@;-AhZ zYU*#h_U{{OKSr%dNq0OtZ6y?VWTmq-l|fYCL16qrUyI$^`I#JMD6{4?QK>mo*2~1f zMqj5FP#~-M3{(A;aORn?`S;HI_tP|sK%fOyq#>}ObCI0Qv6$g)jki<?!%*z#E{IeM zAQ8Pccuq^L`|rLC>3*0+<oADrilh1&r)sW^#ofuK?o#0l(6Rsizmg*7T+}xqKJGPw zG=v3ujX_5!;%|bYa~3EnF6&viv648{{iOWuncFX;BjFmpZf|xC%ig|8!H%cZC8Mt4 ztS<zjvv}7qYACgNS_2O{85%1L(4^c*-(V1hRz~sBy<~^3MiQ|ko_;Htl*&fBS6{nH z#@9eG9>>z@d}<uqu}%#mAC2Y(nQ)f_G0w;1qmkfD0^W-i-&K*CjulQ9fZ+Z`)3y>r zX7&in&t-|Q)`YXcDLS83>Ia_6sg7|hbuUb~04?D*?j9-uhP%ztHF`&z8_hE)l|(1k zcHbZkbxn4>qjmQd#M49c`o)ox(nM8T(2CiYEjX7i4yRF5f7lYH!hzQom|x)4>Fis; zEx2Yf#EAR4$p=fi=$%yyXN{NZ$39ZR&oXlI%&AeRzhwegNg2t@9>aZ*z=Rn{Xj7M+ z<2vYC+jo}((sn;D;cyH8^hEVt!V$XO*3oD(GJdXGiGF<M&v)qsw(o7;*7d{e7)S{o zHwcm&{~P-1wzO_bMX(oV$r&5(l80}{7Ol(~S*5iy!Q48$m5a+Td2ybgJ5fSmPSA|; z*LgfaZqJUZMro&cbFi>nEFx;I#ybpt4Z8y@WUbe65gi(>`C>dx<BLS4(W0wmZ%_gh zPoFGX<^m-YnZF6SzwWd1UB3D)$W88Opx57Z2mcGkA(ooH-kW&5?H~XwDnE`8_VInA zJH6Yr)W$KWg%#oW!?~}3q8dH7=v2$F8wUgU<D3PJ13^<8U`05UvjZ2hq2$Hg&y&Bk z>10Vm{T$c)A7{sZ<JqxB`*JPfN1FFP^a%f<w7}#3&7((n_aRgNkG3WMs`z7i|Bci8 zs#w0nKh{M5vBv*HiGaub56>EhNxJ*g|EX<_qeJB%6Z~(SU_|%|7lI#Yvj14;|Dj~S z<NlLpou_2U0JASSidLWZf3+?0mwC0FUANA!?kAQ~&Dxzp(<e=kSv*a)NCVjF)qS29 z)o9K(b7TygRB!5B9cU0M0a?%vXnQhI_AhMJ<TcaSLj^ZBO`2ym-eOBqv^`5D{zvzI z_l9y1$0M>RB@L|G%#HG*uAxi5?idk<X7x91VV>-6<kPgOP}9rtQcEKe$v)?DzgfkX z`JN7?nzUY1U>cioT*Zz_%D_f#*ulPaddfxx(_la7^gGRRWj-pCQI@-Drd!%+1#Chx z;RNm61R*WR9b=wzonB+jB`Q3lvdY<AQ!=Kn#w({~i|atjiDy$jukc<W7hS&-MeXKW zMB3?`)MDiAp{&T19c2x8G?}CQGFc+dYL6*ypv{j(#&qCx-W=E@i7%5no$0diJ>!^k zJUYyTN-+jtd{-KT3Kmlv5n`MuwX#aNaj8MNNa>b=%GoV`Sc5t~RfeuJ80RU+q~el+ zp6yBD_le=%Mh;rq=yaNo=XlY0GUt56Cka_2vngYl16kDr=$B}aPwG(>BeD&_Olnp_ z*k)$m_MF#sElL!tJPHt5W&0ew0zO})W0?f8P%|fBWM`dSp~tpE5S6L(*J9*g8=_t$ z&$#iQ%(APE-U^?zjOywUtI_IPGYsFw5sY@;ljqe<$;P`eUTz90Dk^Z}g_x$gqOlfR zU8(5A^dhOK2BKUabxf^9DFy8qknD`1`e&?#g=E$0uhoK4jt&q8D+zy+N!?5Zo|A<y z0T~BjGB_Jxn%SvnUfE@SoO4hQT9(cL;mx;dZ3!0Z*x_W^EIy;6nNJjSRL47)L#ay1 ztX(m0V}Xfv0BiM4nz<jjR>e@(2_SVciGK+m-q+o`|1g-87r%_VJspn<i@5QqJaA=7 zMhDgPB-vqbAFur==<@T`%rYC|cboLBw+mZG+=QqEY*nElTdSK-mdsa5Ywi|N&TpzO zs+?yBZ>wtTe*{Ig_n;RvHR~QG{me*XrdAg@B=NII#UE5Zwf%u)z-;&KrkI)NCp(+O z6kNPcBs~Ry@fn8gX|6lH+!nGAGy56^sIR+>3vMW!lya~cLtK`a&Kj%*h+o_Sl#3_> znD%fn!1a6sT$MShc~ld4I*HGkf&PED={cZ4l-Ot;gpvYJViOT>nZzMkyjn%{Z}@(r z$jcHsJwS&oS43BFowsUH+^7aWeU)HLQ>X#${T4LrxA4<AlF&IdGth;nxvR0;|AC&A zhHqQVy0LXT!e1vo83pSbkAipC{|vtVX3gxcaW3;3yT4$^C54}W)2;_=;d->*^AyFC zoh~e_cjPku7NCy+=ob#qM)GVOfv~O~V$f_55rQvzQ4nH8pUrhj_`dn2uZzuw{|pU( zz1nC1g)5F`eI0S+YAS9u9;odMX#LS@BU=9w8~^Hq8vnA<_*WL$9oEOS@;txFIH*BP zVOPiV5!*1D0ypy?6&<x7j6j0Sr_N(`$TT>Yiqt0lWTfFRcbJ<2`f0FWD{=2F*DTAo zcjx`p_{I?8BI%&Rrl1_B{0tsrSv(6rQK)^KJqaHpTAoCY0V_{>9YfoL-cE>%0b(ap z9%JlFOdCNmE+bM2>Xf24x=~d*LdG7WGNqAa*KEtJHVC%ShBM10q_G&O62eFqL>MYD zVk-3Dd_Ik{K3X{v(<ViM_(&V*saxY@0cZqJ8u+4+ce;<7$tQ7{awJ}iHC>?e1M7#l znv#VglQimPs2`((lNpd#7tI=SUvu7c8j)HHq(@0=gU(Nz;r7#=XM@22Ca7)Shxx%R z#v5MDm1A1>|3w@6!u>f|K{``=_G)Lu;SdB>uR_yQ)*y}@EqF3pSdF8cm1asPk`d|< zYR#%{3^)Iw84A3C#^GhFeZScvteDZo8%`pHsbE<)q4g!&5Q_h5_QT8=h#(}<gg*DF z--qZ{yLEKjF5m26<66~Xm{b#?av};C&wRx3h^ena^QV~UE-}(y5tP)8Kiw2c-2opt zHy9j@3q&d{r@?o$OToVx<){BB;m{@aHY<Y>Hu5Odh8;mW*3Yd-n?Y!#0Eq<#=LR&` zOjU<3rxK|7g)<2%ehc!EM@}-D<YldL5M4zZ8a=^U5JeLChB9<JC>vl)W(*W@C*Q6> zo;m>(`4Ux%uX2)w%^BzvogS*JPd&%CMrRtWFHXR03VIf-dgA|ZjBh%|4~NOGtqvhx zHGqYPmR!!n1d(Lv3{Om<D4B1f*&F?8p385kbuedNB8RMU*jLr&7^%Y=3?()1ZEbm6 zrn00JNdgZQ6>O5ZB^Jxhg%+H&&OOPer8>S1(=oqx?`9WFk%{mvZ7OZm{@}hV<T7Ke zU^))m3=<S4y^W!AVnx~kex0XCpb00$AqGe=K+ZcuMJQeq<6EU>4Zh2zCWW&}jB{F= zO-Lu0j*1+skV8s2Ke09>K4oK&ld)WYOfce`#MUp`uH0UGvmy13vEz@NyQ+Fl7d6IK zfxV6yc@_|bG&_$HT>)YuB^1OEHtyHT$Hmkoi!!;GbL3|ldfTzOMFT)ySmsgQevKEC zMMb6b!s@KAS?A>?TT6o_v*c9cuV)aChd&#{X$woOjN8A;9dXgd5T#+8XNQPEgSbnF zuC+3It9!2-QTl~v^XW|9k-9)G4CN8#)&$9i;4TRtvP{;%=paSP&Q`{{z!2kb)WP{r zVw1eEOjJXw6N0g2Mq##u-NXpn|A*EjonYefI=G6jt#ERHAsvp<3|*qvE8cX|+9O(1 zJ-o}(!o#ouk7G(C&cJz9;Y|Roe=!Jg@bh~wIPcK#C@-3Kt0f>CYRKUYX*Nzroas%6 zB3IWY%Darl<kByX@muaN<wmO&fVu}D1M#h|)jvhNEvOjdE1g5G<f$-2WT|&3&rv5c z=pf%F<7|BEb``dCS^yDWyAph<g0SsrGFFnef2^5foQT2&FYKyuKDQy63($rnF>Dm> zaSW$o3BmJ9_7F-Nggz$#s*WRHxAKOKT{eLhL(yzU3OhaJoXRUsUK?$ac8Id2QJbO= zF_Ywlc&ecFi5=W|Z;psg_O#(fI+~A~7r9V0RuN7Mu@7Vvfz2tprQp%02W{Cq*hg_F zTZooHhe&sMHsIHe9fbODFEMCv4P>A>aJSp_NyhUGH8pZw-%ugr2eu|(MeVB8TCv|! z^K_EO5)8K-Ve%?CxQ$RsBKwMFjjsl48_C8aA1I|bUme(b(qG?bJ_hV~!y0u&+tNWo zVFaV^9tyre=Q)wkXPu8T6BtGGy1s<=PQ-utDo)dq6L!Lh4*!nRv$Rsj*6zU5Sbxwm zHC3K-GEQ%`M}ze*2J2sb<3*pdG1ChA5R6*28W#r32)8l5BY1M`&eJj~Zc^}3-w)?D zH0`D5BYOH^<B<pW?Wo*C;YakW0a<3EO}ypC7m}ryB%LG;&$svX{VAR5TYyLICBPS+ zu!^^%a}SL#?%4Yxfiu21iMOFT_$@Gt{TA3ncvBB)t#Pm6ixk<q-rCpN9nkB&v1*|O zV~fHq%@F&v_b5xw9Ig_f4(zmn>folT(SBUcVvIr|CMI<ww1GyVi&w|fNqUjcfe)8` z^KhkDX;^eBu|MOAZ{HfBn@h7{eDjDK^WRH`W~v<pvxu*Bpl7yqHj<&LC>AInD3a_J z-NAyKo@P*EJ_@z#Us!nAB1wZ{0Yfp=W2ZAYM-2-474|sd9*xaT7;d*HqU)kIm2|rm zNU$|k$p8w1m69UuP~2L$wjV3`%$F>U!#v<%ni@gX7sITSwX*zNADt_?rtjg=MfU+q zVl`g~YgK4b)Mu3R(#(@FwH>Ihg2aCAzRkKE)L9#D!6Y7gk?-OUKmN2P2pSWvP(YZl zz(ykc$1@x)kTf(0)pAXN3`C)eVGZ!G5#oVoOPzXrZqfDZt8Z#%OliSg;tRCLGoOO@ zG_HUrZv~z3`S#)Vey`(@{wxv2>T@huC$1N%qtk>4^%0dspDiBI21@8|YL*N*!=4Wh zP6f;d1+*|xm8xEUy~p{a;9nZf?cB2+*bH_lK%-WN_YsVRh^nMnvifYc&m?{{>CIea zJx}wJy8&M}`@28y?7lwSd-byJFx33$JvNm2>Vw%3jf1q`Q(rBJ73RvfSS4kc<{1?A z-R(%th7~Ma%G~vycZbuOc{xtk5KP#ge!}_14>5vy=)H~5yV~{%3WuYrVJeP_VgeHp zo9A0dyvMKdDF{>A0^Knp)qs`bOzL-=;mZZ;AzvyCjKc9{f?H;teF^{LF>%I8s@EJ# z7NAYXHHU7G*r6nzT*cQV_xDbHq!!&ix(0J}hY8G!3cEM6)A*W|A@tUNyA5UbFv%}n z7}mG=^}t`|WCqeUbjj~R!Vir*OD>b*1BNZ_tvYZi{t<_6l}U<XTB3DB=f{l3M4CJr zbEk31jb2#I3<AX1$GKQ(Gz}E_^3P7_6*|?8zVHu=HkH8TpQ1yaAhfBEDLXLR8pX!F zw`Doc|9W&xs+sP|BtCaj^zt*E-IsnI-=gkmo_`>S?xJMC9jw$b2lyOCK9CUlfNJd< zqPR;$rb+wncc8!oIG&0hJa8dgB-dn<rrA=+k;CZW2^>r=)FBi14$h}g8L5dxmKO5@ zZuAF+Npb7yE~ux=7gfa251Rg%yuxHK%T^eZ$(9MsS7Kl13^WQZv<;xT6fuaFF8Y|* z%~;{6Wvj1O>SABd3{!B+xl8=`Fak6WnS8T!@?bIc=q#~mUfsu2g0aw|91c~QVn5^R zc0MmV-QaV>aEbBhPD9OsYGRh)v0^6W%!$MJd|a)S>0^m|!Rw@;bVihze2&B3<b!Pi z;soC8oF!GM{6XU2{v@yNtGel_aR!!izE%JU>yhcvDsqk<<&@Hyz3$<KT2b{!X)&5( z^!}3Xs)3WCOrMu!N(R@oz%KK2tS#<1#R#fn1k%5Pzs`yrZBRZ6=f>btbwu=hM4{k( z)a~Yd4?=7GY;COvVs}V<xbC-64pYkadJT6Bk<2hnp9M2AmgtA?HN*Y-T>t4OOI^9m z!fKNe{`H}o6eng7wj1fFj+lf_R7?yog#+<8jjIG;nb%}793Zp4V%wVLFvD9uo#7pm zI3w3V<8KtoG47?>g*xeJrzgI{wehaf<?Ougrl(yBxk_KRv+=8Ja=i!71_m&N6B8Jm zZ@<OS&=0zrTMj;Wx3%8Ai8#<H{0^_TfH`%=5_fxqGhGJNRbJ<o808ro0^+5uq?Dj* z!+1PSRc1eIQ=y8{Z=xa{Lml!EypiRuFMJKxP?ii;wh1;tq?$OZg;COC!*VZ}a+bcB z<muUYoIyW}bW~!P{b7feeCL04j6RKIx4cnta2IUx%IKS{ab0KgRw+o&8LiTe<HsNm zwGczUO(|xD>hP`8kYyBizLnV0CNn(SeZKwU{^9V4-M|0z>dmv^&iC7I4q(wL9G4F| z!~fN>jg?v@j3}rHVT&Vzs#);ZbFv5`9a|uRpb|!dZ3*mY6xdRT9eBs~|FCEy<Nh5* z8?V^n+g<+M@`_bP(Hwd<%U6q<)I;BlsdpZ_P<g`^P+t9`S(yD7&C+F3h4q7`rSzRe z5o;t(op@--DwN&0Au<HVs{dM!u@KX1$}#i_DPyveH@t6yHpH8wM#FWxmQQJoq(u#5 z{7@Hse|<SfUy#q+2~++!l6RB{X*_q93jN?dcwTNdAB(2rcbta1>rb#Yxon_GjBEWn zBE4^Ovr_gmy4>I{+mH-V>xlna;vMmbGnLgnBNrc%QUtEVl<-EA@W+t&!4P%Z0!S?E zbR8-}iSmwCL@5;7h59yOKH{JNxS>%#M>LA!l#U{?;Kk~ur7%(ERHlxVvY2s55`m%} zK^TmA?2Lk!uMQi9IrszKd}}{lkL*{wu(~Md?7Vo^={eHeXgUtyd9X7budj8qr$0PG zKY!zoArtVoa3{~I0y7D4;uh`-Da1X}UGIZcLe6j+nsLvDXu5{o3tn@=<V2Ak>+I!Z zXc(N*LS*8X&McC`l#&;tYIl^-Vb;F2?D4TS+uLuY^y+qpcmGK5&hPBit4<>Fx3PLv zxd7NoDN)60<>c*_i9Yq*ZJFF{eQ2faE!RimK(k=Mv>asGz!^s)rmBxek-v|8_ivEx z{(Cf9dNrV<-r^gs%eY7-u3l#364d_2oZhuVE`J@ZysTAI3`ZFjahSR)nC3velv+70 z_3eQXMkv^MU-#`MsK~8()-ciUQ_@i=GAt#aQD56mQS=|#IIZIEUPzl5{;m(J>AkYU zUcc#ia-K|eaaODF$#ay?vx@a`#-zyBZ&*H)k6f%Sk1;eFyDZQauFRs%J)R8EsFoYt zsa6@2N)MkPU)N%Rg%xXzwb?bfS>z>qw$gN%%?ldEK-?JkRiaW~8*PB>a+YRD41JCb zC%<i2Ds}TnG>o-dl07;TffQQM90F?C)IBo}MZy{Cjt5sUmp}!ob^qGRrzNJ6u>?BX zhdc1U@3yxOzx!_6GNpB68r4OArlQQY!=tYC9Md<y@7Ck!ZU#q3-yFl!uEG^Q>RRn~ zk8hT?{IlD#@7B)&8-%p@<};j(bz^dSE1O>4Gx56;b`D#xbJ&KRm5^ihh!~HOvDLER zL2ej>yv4k88d_b`(gv+K9WvCP7ZSo3QLs8K__uFk_Z}*yZ+Cv(vwQ22uV`jq!uM$k z)k<Gd(&!cyHGVIbWIrz~`u%)t5->`~VWU5hr{U%`?{eK*o09IM$S$PUKs{?dG6Wi| zKGFJDEqc@?U{IuQkopg(Tmu7*tUFxm@s@7Ekv^R1YyfO8&AoBV#;4|lyQY~gK{O}J zwcJ7h*J(2<hf|cR61p3~s1g56XO<FblLvhqHAmC)sb9)s6hR^E&~Vy(jjG0C6nsXs z-eRU!4_jH7IlXQ%b4*WJ-EMH^CpMZ|8pIEoTiCB#tR8u)+{t?otow9P%3hgdOtE?k zk2Hdb{7~3FcGH#_)sJcpcf6dctcnK9#Hv1iUe{5Qvvznh3FyNOjec5ofvf40L?|d- zlF&o3Fwmu3gva`-zf5$J`DYTfgxx220g7};k{{`NxIV=t!Anf{@(|=7eZ%Pm!Pmg~ z_}aXp3^Asm1aH<XEv9LgOVCDx*l}_4Guxa(K@goIrFJ4gnu<NdbXg=i0D+%X=L43J zm6ncEY;lBa07By4I!Gk~h`~y!$M8lh+vz&B_pPPyqe7*E6~DU)IFc&0E?2@Rg|5Ly znZ$&cEZ0K6(@mr!z$5YQ0UA20p^A<GppqwpTm$R#2?fa_iQByjo~CE#<OxEuG;%Hm zRSUyA?{R_zqVlM%gDOkJ(U@(ln5x+Bm7*9kG`U(sB;Wxa{ROUalU}SyPnMv(|Gq5Z z?2N-SNwbzEssshIXh9$Etda^zZfvMBl2BpPQ0*W@XP#z4RR4NW$5VFiM8<$;L<(`1 z(`BG)x2b>~Db1YLiBcL>tG^)EjmOx5PVZ(Ayh)}BodzXiCqtgAnAqxcCWZv{G|6EG zLtnvU<`S`j-Jy-M?x7Q)f$asj*Vqq`NITox+v+~EGu|!|d`MBqt|gd>7~+i+l#t}0 zXHZ{v8`Vja^}fJ=k}j{`ZrL3u9;Ohbj!`a}_<CJy07%``(1@AQUubcZ!Fe*7;p`bi zq9b1*Dvg8d{(Fx7cw;=lEBPC@g!}M3dFL%xetnWw=v;<BPLc{{-;Uh9eXz5)C#1N( z@pXUW%P;Z345#&s!r52QQT#ifPU1N|Nve@{Rl;^K#JRMB)-|_mNiwKj!-jJ`J;^5+ zLIK6}a#W-<baWc0F?<DZF}`awu9rRz5~u;Y;6%=*F7y_tEbl3PVs2ODBxv3udqQpE ziO@=X%WG$CedEy=Uw-xHufOS#a}hmdz5*}%@YHK(ue%}143xpoD4wMidXOQ({xd0Z zgh}adaYrjqjc43Qap55Wvf_y<U0f8%Z>k;koCD=~URE4NfV35c;f<tfP~D<evWohK z6QTlOw;mbxB~ZKt0l)$=p)U!u6Qn2Q4G7DTL&HQwn=>+3Vtb-#`p&jGGJ^mUJn2Yh z?{7cv?>u|q_v5=q%%rwrY9pjFGWVBmWQ=@NUJiMemKJO3q)K|P-0DP~RrJ#MOH{{t zR}?E7kP5ce>9o7G7BR!ZFR@ZeZ%KRytJxNP_D@T#aZD)gt+(nU8i*)oHNwpZSAG2& z%`lW6*o4>2XsO5Qk>2$?e{=Qg6`EshwCdn15Yo}0L;Y?mr_4CiZyQr}2Yj|B`mHpk ze=jO44eH-3gk^Nw@eHc99dlq!CB}ii#U&jEoY2;qxouHObrt(<X<b<=LEB6v=!)<O zFxak1=Rc)2)$3s+$OijTkXT)c9)1PO@f}ak(~J$e;7e00fTQrC5nf5H_}y}(>(av) z+dmKYULHCPu~f0FDJtbFphh4C{JJVD5~fw)_NG}&HA9-&p!J~o?hLvM|5=wm=5l-B zAy!J~jNEN&oxUT7+gg)IuE^!K);v+^eN?~YX|XLpeUa!J>CVyT<?#d5sST47wo^Fv zpC#|!;O@-^7)_`S3!{*ES|eqbY)dcO=*8zH_TxVG<88az!~TRtGT=V@nqC&ZU4Ish z+rn`#YK+{ga`B@04#Qi0LjDb7RaB=be}#b;owp~Q2iDUE^vtg6ciWa~2qqbzsH(%N z)=jwc;ke2!gvt?aKZ;sc;ihOtc{KgWVH|YksufX9?Vz~MbH%o3o_DqYQy*3eiibL? zEd4?64DH(BtjOoH(A6<RU+t^-;JC^A8n@mbJO-~Go%EVprebrsW*upMq@@9K5iHQY z8#|b%6fpBpenoW;j5awMB&p_AElN;m*;0ydH}c4Z^*HP2)p?O$)h^<V4GcLnRO`za z9-Eu28&JaqWxJCqTDOEF>^~1k5BOF?TCvSG-h(C~G_WUYcDwWtO)|~4>5z)X9*<Y- ztncEWrN>sE?J^&I5txhAqoQ9e5_x+#<K|h3VKn0xw+&In`fg5SDRIVYUkAG;2Nwt2 zY?lWp;Q3}i2_3yBU$k75sF56PegP8BU@-6muvic)LRI&~HVA!(sn1*%LQlQ7P9_dO zKKN-f{Je}lm#a-{<et60@!sCJ8=K++A;s+jbzpJx9tt!;nE+HktG`z$BxTrlD8-^n z6s0m`-MOf7ImUTYQM}+LMb22MWK8oYnJG3Q`h8*y`1~wO|5@k9NHbJdR>AA*>KrpY zB$9kj8r(B1ZV`0yuFjvv_BpgumK5)iy2k47o%i8iUO%SX6_^F#rWZ-XM@h*U%*3pe zl5uid438~{<dSQVEh0wT%I28thB04sjvn-n|MGVH;O*e;_`azK!Vvp)xh{6?I*E%X zZ^!Syxasxr_Y_8T4iDar|H2Q(@wNOk^;!3z+0)J7ysBoK4<C|SO@5gar<42&rM8E^ z&N0j~h)oYSzWVc{Z@zhWo?rFHdH*_}_i2v%==j$s<yM~*Sbb55m3^Gle%zM{?AH_6 zRC%cpzj(hEeQ^`+y!dVB*>BJOvI9RK-SonrcYgbM|F`|W{4Brse*SImZ@>NRFMIsE zp`H?XbNptP(&lb)eq2Kk?Hq0Q|La(*Hht<WiQ2)*no9c|2Mrx^2wbsoqf~uVUfp3) zts7EH)*eutf5YfU?<P3Kq?;TVrk|FB;2>esWFcTIej_x@(V$U7G@HbkPN0jWS<h(Y ztm7Ck*o}dm3W2r;!nj9|W^sEnxR63edt5CMex;;`X|3cXMjgAgkJw`WFpq{prOVoC z<`dLq2zi)B0ROsBZgK1}8;lIlzDPdK8O*HeJuQ_5WhuZ}0`~HM+k4aQHg05L`1?KQ z{)bL`95$^cEy{KlMN+OT+lim6*dANCvrr08i)=}ZxP?txRwT`De`~=~K%+^@OO|<u zGm*(|pin3Pg+ig0Jm8xbpuE;bYa-y@;ST}sB^u{2-B%AcfFG5}Kx(EcW*9Z!bl0#y z*DRf@htCf2VX(3#GKPZU!l5_`-ZYT!7wXx{T14s@WvL{0X-rkAottxWlcKfy7@}Ge zA$t8(<@X4v3x5x7T1C{Fk8&Qr-LZSok^94?^hHPQo_#|?L$BYR$@d^%`NlZzY259F ze=I^~e~z+FNLK@}+vjLy(}RD4hYI-mQO*$VM)AIf2+_}qBZREwOSi9cBi>?mC5NHj zMx_1gd<>IcS%bc(WQ#j`4|vzGKVzx$7Xa#6#51ITi0c}Jmu=)DyeLM1q}j6u^03P* z;}E(^6?fIff&)QQO^uz!TmsLFt^#dMH87Y3DHa(3dIVff@D3Y!6fpGyh<7F<pyQB9 z!)F3Z#6^@*e$NI9nIZ=flESl?M#wl^#j00@xR)3N{S4*jH-Fu)6(D6*REq11k+FgO z8`1H2Jjk<=43vLymXj3*cb4pbFnp@b49wxq%MssY8}kuWx1r`2G*t2!D9&`02?eHC zj#TeZchvjqdrt}-E7zYNHc*LA%xHTD6EWl*z(%#}AOzbMoDxI^@uxIOg?**QttT^s zCwo`5!x@JEz%L{GLM9RvI0G}!51i6vid3GRe!>0OS>3f*9&<R@;4ek9fMb$&cS>r5 z;^*E;6zlZvhD32x40=DG)Fg+-t$2{X>jav*x~iql7;V>XZpzJD2thQit|T5YBXV;S zK&AL)5JDqHEYv#OuEhZYaK#mgz#J=%^|FKI$ScODPC0gYyIm`Rs~sIx7EqmCR79d= zFj5GadJF9n%uG%-6I9j-hGxoGL30mnmEbOQm7m2KZWT+UVo{V58}Y^}2XEm)4A1C8 zIF<9_;N<dbfX75(4R|BEfFnQNFJm5-%Zp5e^Rhe2w*AgwmXoq5WlAg#@?n9h%kg7A zxU%C9vz9n@4+#s-2rR2{aTb^T)2PD*!-9iTMD%r`obFYUKg%={bdm*^pShe?J_^NF zpc)B6!O^cOV<X9gI6t3<FhE3*%udW07ObmjyP%{+LOv}WYm_Lnt=Dt;J<BB9W{G<x zyiI)DTk2lv%1v*(a_Rfl8=AEQgYl?iCLDNv_;LT>`Tp}4Pbm<8^U2GD-TnQAC){c6 zZjpSu+5YKnakn_Cg)gd;$h&g4LmWKfFS>4)0|Ubz29W3>^23`~Kvu=+il<hquaeVM zQ*C`!@*Iv1r~jTLl6D-<x`}p5RvZp}*0!Uhj9cv*D28#hYjyg@=4)u`0aQGqyAF?5 zPKP)96+K?~S(%;yy}~oc|B(4So}<~OHB6#LD_u_;tvZD#uLrWicqWF5pDd&5l!ypN z*BTvNHMMm0dI@S^FR29DEJLNfgmhTy-D?h`|H>{5Zv+*HwK!?k{Yb?w4)uF?3%C6; zRh_-4A_m!eDoa;Wl&-8KeNP3cgKT-ytgay~X-EIPHG2ypPg!vRx!?j7AaX!A&-L%8 z3S?E^LR*`Fz)`w5r#wV`bO||8N1Kvjj+&XZOG4XbBP2zYk|DV&cYu^u-{&w!D)UC* zJYOzN`6Lc0p9G?62Czyzs<^tpC_2Mz0zJK|=I~S0Bt)AL{<C14p?o1!Y_z1<2^TwA zQf$h_rd7pm!jEwix+n(yS$a`)X}ce(ZZ?4?!y*Y0-!!X--K0TbP!Yo_U2x&2JaAS& z6dX9o|Eo<Zm{%9`<D`09NzrofbgQ)!qxsovMf5`R-9s(3<yO<ksihaUdz=U=&ZCc| zIS(H2e;)<9QZgD}dlkHu^(l7?JeP@|)<s|FOje>_mExVGxEJHu^U;Sm<q8ew^DE%= zH*5*Q#vJI{n4mQV1Jrq|ghCMtYb~sRq&5xo040B2j=C}(zwM){nVd1m=mg<6;BT&D zIMrA82FARqzC&?Q^2udz+A;Uv&L?-FPn&U-MIX_uq0{#E8jLgrjJceh^>v~()q||s zr%6mXC{t2}8YTEXW*##Yy?|f6^Ffggir)FpCuz~zh#ovl|L3zi=|<~8yg>U|!)oZb z$u;pCSH^EpAO8UmwN<p1&`af16?CEs1^hA{UluZ?IPXvFo?IahY6Rf5{`#Bw(1<ZC zd(zN0O0w2}{AoV^Il(;xBrX~lId#S8EFb0EAj24H`(9^q{$3{P(7t1TZdZsdfhOX5 z?j;O%O^kW!nzk=8G*^bsC8d=Y##i|-Y0P}NGGu;!3-j_nhuyPafzfX(cu5_co(!me z3mG~4LfU6!#Ea&oMzx?ppbfMOU`4y&&#YmvH$j)mZYq!p?hh40+Z%P$Z-W9-6<3Ng z`%4pp<W7fZRggMjS;4V&b>zR}OA(jgbee%YfPoh{@&dPjRam~m^C${`<Dnz!u}#%{ zst*(>v0x5cj3|+fW=$=%c{W!<Y(tqS=uyqV3YBEV;^a4Of`&LcJe(aKP7e=9@eMS! zJ1E8~DxwL$!g5-wWUSN?vTT+M9V<rN=tFNQpD0<8?sH^|8zzaLH-S(GDW-5w(J}mQ zGm5v~yxQB5=9KZ_EXL;tyN|u+BYM97%zHeg$9u26$0zjonOpiMAl>i|a8Yanv1UN3 zQCuP51RTJzYb&LMqLM&>3;!kuWO*z1u!b2(SMtxMvP4OifTWkU*NPit_+R{bkY{gm z+fY@=wnR5gMVn^m+Q7|STts_;?RRM!xmAM>TcH1@g42hKBa1xe#3+5F-P3ewHL2u7 zT;5g|N2>hZJQDl~#SgvpbzZ61tDGg&*#lQf5a|L~C4l2LeKU#K;2S>eblzjJSIXnu zx$njY<Gt}<J{);yR>#KAdT%pj$tU77bqNTnXKZBpZ)7y8S$0egJkxwKhT$!`(`?c= zIUE-regXDq93ZSkei=~#0$tAo9B1)QbDBiKwePQW%wUZ3#V!l&D~3^5J^62`&#D4S z^;zx#W*m$jqSi3Y2t2Ak$I=v_CGin<E6b%??IhXk7iwEl8OMPWI?Ez*I_ifA(HOd{ z$1bmr#A`7{pBcmwg3dVUqB~WC6XYH~F7W|cXqs3oYM<m;9;a%lixXge!Q;en84a}> z8Xbo=^6HC1pX>T%8*YAKw9z($>Ij4bU{}kQ?GGwgCr)4rTQxJWq$xr(2X#KqPy3^h zvL?;Q@>K?!X6H3&MI6-OiQ&o%>}0K06X(?3-Ca(#IOxmkI(*DgvP-Y{<?);cf(ke{ zeUD9LHg%=sdEugfisb*qk#J}eOG&!)2Y_hofEvq}C-|=J+DT&1{QaC&iL<(-!mEHj z5MifL&GuC039zpnV$_Zp=2A8p%$usZwv0UnBtqVVF~11_`B<5Q1s9Dh8x2Gkk=wHj zLi?e?^N}J?N4<};Xp}|uD$C{e;|5qR)!PP+FK(twogU|J-#<Ti%E@uey%?V9(m1Y{ zG<bo@pnCd|rvf_fJG*09iBd8Upp$5M2NEe5;OK~jR#KCEs36Wkb2y3AqMo?u$q8NQ zFZTX(oEg=p+8jQ{{1zB~2xmeO^W#oO6m<Lp<{i51BfH~Se`=gmIHoz}TmVY_jG0`8 zo`|F@lIlc=*K%9bMJt3_bl1aa#y)Vm`drnWF&~>Re!Q8o0xzs)TAyH+Y%N~we*mVU zAndFN;FI$t)KT7+BT+Qml|@#HaboiUsf%G)Tiv{;5-E>F3~k?JV2s&IOujm$suZqA zB4%s7iE(%HA)IDsxzfTO9^U{$XW85SnDWn*qg7}nu8nid^e_=dF=(-PaibH)6(+`S zx!(*@#4|q5l|x~HQE$<AxKh4fc<@$wSxpc0uQmh-$KqUxn@fNgw$c2qUd}J@dVi++ zs2D$ooUK^YACL3<xiM7;BCjXoX_-+6uj1T#za@Xi@wpv$U$XX$<QrafPWtjc*s4Q1 z1lAlpu3T~4+m+Xvb1eACt89gxaOE|&lG#UaA(|e3%w@P#W2TP-@LEL(lhMDHtljrn zxqcSd-+1ln)vI9YDV;b+ymI!pV`vhuN{ab0*N2gEs&FQO?s#~tEYpCJu*PSN$#jhQ z&g`rP2^aW8=~6MIqQxbLVbHU;IVDk0vne3bdEN1+vxeXeyfs$VO?6K55vGqBPY*D- zk3S|<3MUiVb<vLnQEfC#YXn__$782}w!L$9M}^&Iadi*Lu3$#>$QR54?LNoa7_?`l zUdRG>Sc$Bh>tU#MkOFPG2>fN5P56Rar2#0dlx#3a1XkFN6X1s?3_ex5(C`Y-xDK;P zvXne(#sqy-7WFwGn=XjJ<ABlw;!~K+KX49(GTH}*p1=7Xju<B4)imb=Pr&S{1M_u; zHr^sqy5|&O%`d2lcHgmrQE7=(T}~k3tS(bgXE4%*e7<kYLR_~Afq-n+zr8LW)qpWP zeK&&^(dxk~eq&4)Fcu@`FYfa2lhG?~wf)iCG1^1~s*c@oKAFwFNG7>vllKB!t-iV0 zF;!Wzd8QkVUmEJbYk$Qqy6&$aF>4B{ht^{nR3MGs%qK*F64SusKm@~yVZHE<iCMG1 z)o80JjbCX#txgt89@$xmRU5b4C7zz|kL79@u8v*BNWQnJTGg)j`}hgmEsVLCB1QQw zIu&-NOwf7-fuuE=CKNo%vmr{zmAaoWNkqlEf1$H%WmeU_gSQfcYy#YAl#~7c?x<HQ zv=WO#Ozt8>wSTho7-M+Ce?5v@q93N+wC5%o$J;9k^To$1%uh1K3`$Bjma#yL=LZ!W z@&zR_8S_<w#79C+2L1E=0!2>j_{(XH<NVPP?iu>e)w~=JiEs+$!P?%AHcGsM7tglb zhSrZt>?H~DBX^!eq2$c;L7N$>!Z!ANBB(6QB?W2p6kY&cRqEx(^97+>HTUPj+}F*c zXbrXl(R*0-M->37Hd3dMXQOeg+jE~+R~E(_PG$St_p1sFAuz9h?=cj8-9%2k=8fu~ zX9TOX*=V5`H0)oxCl&eZwI#iAD1q-O3C6pFfzteJm(Of$tgw(FyWk0~3%0x~c&>Hi zfP{%a6>j?X0UTuW?e>wokq*%%)F}c3yhg6Dx0KXOy8yFfF?5!9&tK==`IHXbQQO)6 zE$$>Y5+!a$H5NCW8de-#B#o9WL=-Xku#fwY*J4RU@EY@fO*u8XQpW9Fd6jOIfwN6| zXyYZ1r#+a#49nIiD4^vrhI&&@Td4jMcHdgbSPFQ_p_N&sS6i!r+&|%iy{JM*g+=um zqF$;p-IG4A&|)%%utU|zIa{4+{7YVFp`>Z{EeSt#7T%6tj`Ek&A5dNtNyFS|2dX3v zOIra>;(jl#rv^|G<5zfM-e;%q^T?4RD70Ii6@3sSE~e<=gpq<bOAR?~0Lv(~0?*ub z#N^<w%Ic9g)0^3Nk`RBB(>tKVyq8T+;Z%3;-uVT7D``(?DF79k7Ot=P@j(PcRAnjc zq;4}W1Lv;W=&Q<Uo;A)sqF&vlCfKN6$^FNHrM-%Mha;Csqx7ZPUALzDda*9!BSwC> zLkAS48_bFbrW%IQJVj>H;r5U)6afNGfJ$Ep>m0gpftme4fbU&8@TPe~Yb!-w&jPWe z3x@H0ip$RwbOK?D+$d@qxMX6SO2&bvhj0X7S`quy`=?lyda{=_5P=EMZfza~Y+!_D zE{)tZ6x73sHeG{Y{Xr#4f8@VG69-*205+^<GepD=u(}wn?3WTQq(x9iTOy?jWwsy( z5Pnp+ltq9ZXF?%Q^P(zrzyz@F;0BT7P65(yl~ib24x-xZU`)PFZY}{Pd39f{47jL= z!FJ^3g1j(Ue9b^@SLPW1;9(?34Ff@Gjnypz?2YI7WjMrzSb}TYqEboN@fNJd;<H}Q z>`1Gs(H7|Z^+{?4Wq(QOB=sMjJ~p~T+Jd&D?<4V2h?SoB$wg^26dvfX?(J8{P+<=% z?lUj*i_7EfZMB*uguK=&Vk3InUSQ~tfu*0Xrb7duFp096Is~Okq^Z!WX@TLx)nQk7 z_=+Rtp2erIJSd%`copBovdJYOF<zEV2-WgB2cE{L3b<|J`ME5&W0y!~7nx2j#!_3( zm)j}d<l1a1HeZWMkv$lXPSK28Ee@UGWDZ;Hin9Dqt}I_Eao@2ZfF244)Hanvr(KZC zkNwofKSg_Vt*HcZez+FZnrPB(AC;m&Ff7;5J8o?}h#oXs4_jYElofeVm|G}YJ4&N= zjVthXsI^*1+SM;lUrtvSMoq+=z<RC_R7aP$6;!L;`959vup#Y&`{ZuXX!*}gE-!cU z)-!wCF?Czc`NCokptwOBB)l#eZw6d(q(tIKBd|?}MYt7Z5f<8-Z0u(UQz1-v1cHi- z$}xcz^k8=uN-xR<-kSN}8ow%I3Rm38wWt%2bV40k;Ez=y7~P@OrEP+SV-?Lu&8QU5 zF2Llcmxg1)gW_yFMOTqBG*wLt1?UX10W82(8<1x$mGkh?wF>~BfH<{1$cD$gEPA&Y zHQr%#QMWkG?@lUW9))hbswI21cYU}xzrviSDl5->MWof|J`-=X`ESd5Yrq>I0ZoK$ zEsdBs8?aVa2<V>ZLejphv5?cQVsjLa#^wq>8(>_vY}S99lX{P)L@bPToh|C!c>1Rh zra^*QEKC1k1<Id3u1Kl-`)52mSb^AHVg8<iF>9a@l8y++LNPv})<_(t3M&f3*Y6<= zTUuzL_<FHWd?&h~U5ZdeH9cy;WEb_SUo1yoe^NObuml0OKlm(a?6|@+|5KKr9fjX~ z#@cY0aCsMbnLNeNxCJ`5T7RJ9A)WtiJNG!p0GOrTecGdeoh$!2BD~)b;e8JSeB1Ya zLXy10lh1D{JpJbw@PWqw$zjM^=M<zl_U=PXmSiz1+Ec2;FQe$S0k5<!r3bayV*X@4 z#XPaIg{xw9nbN1yGPx2zi)70Rglx5sC}Sc}#p(Ve0;Z5i{-lED^?wA-vY`1i>z;iA zTZxn`{?O5BbopsbB|cwKqU??b6#56I%gd7_e*N@G^z!xYi|?LB|9HB;|MG9qcdws5 zeGxt0|M6+`>c`iw_MgJ{-M#;fC~QFV`1Q-by^v|Ai?eK!cT`Gc1@z5df82fjG}?Rq zdJn1}ynYVw;mezY-Ph6gPyfFA-OCrz%e@2qSAtq>YrzfSs=>KTzcwjSnL!}orxN63 zT#QT|{6ST|qhS2T^5GpBLe$clG>5nZ@hzb$5*|^{0Hj|8k-jDTz@bk6SAjG9pwgxh zd=h&b4kbB;*%&1}zIsq27-E$bk2YF_+K1VNK6+w)Ir4u(1kp}CBQiFf@+9u1YAR4b ze!zoX>R5y&x?^Z3+*Ir!d@hLlxed>2DO8t_4I$i!ss?s*Iv*VXGcOW~&El{z8tO<* zDyF%blQg1HYkfV9S{r`0AFie*A<;g1v~KIe{O0P9*3+-Nx?G4?0@d7DSMbbarn(#J z=|it-3H{2Og7@fGyT+9;G7Q(lZ(J3>QEmJ}0BUr8T3^QpDgFUiPCC7Y)2e*V2n1@& zzBN$M2qoNSmzyrm4Y#9Kv-BZ@BniQlDWEpi$1ji8eY*Vk)FsO!+pn)GiSpyq5KX+Q zC5k*M6XdH9Js5B2h3dacBZZEbjggs-kvktFZ$h>O4XD0Dr48zcC8UPsQfk9?_hAL4 z2y}>4UfmL@Hp--W7$TL%tV}Eo;g;v-3i~ePyT6-(mv5sLh~I}Oq2xdtSn+XB$tM1s z(?&?7giWHwxmYN>b<*!ahp|s^@CrLk`G!k+Tkz9TA!Ox(MJ9~5g5{g$1F#JSRt2Xt zOt=@4pH#4cqcAP#CHW2@_G{E`NW+17{$%l6_41$jbj;?ZrG8rIdTYNm3AO2J7`6+x z3Sx<Fi6)#tUNp6&t+nky#{v~fOTx3Pn++%XIu@Vv6omO+wC%R)I0rx(=s~2*n4xnD z(TVmY30~XERa?J0&-2L-I^?y#oH-n$EaGdIhLfkt1Y9G#rcqi8&ZxDe1Ut!~(Vlnf zO)vD2>Q--cF=$8}z5!RSSG^RhXoPXs=kcHwU07#<A3I7KfMjIN(|kru4Ea}uwg|a} zA`p(nf_p_(qRIJrgP1b50wfITVu(<n3ZT-dF@5SfPLLkRkbRvuF&*z@1u@*sVV?s6 zz*#1(RwAgn9-50)N4Pn~KPd1rfw|!a%Ko>Av@fDY#ydV`y&fHg<|CcgN3)><cf+WQ zZpUzDzKqWB9^XrGqZC)c^}UA97`NP#a6?gy*o^d%t5gx@#zA8gi-9*9NVBQQQfoBM z4o%H|?~jIQRxbzz$#tXbLnmw^++sdVY{irZQ@u{wPVP-<pedpJDHLR%|3^VqR*=0C z4L=>7(M*4j;3G<3rYqfiviKubVh=d7NoOplOYaweWT7US%4-s=5(~qL$K;F{d-W_= zX_G9zl0tuFkSbaTgDwT=Vkr2Jf2gVOsZ^%n3vM;^;mV0uj&*!*$xtQtM5b$1I%rlp z*ig-|UyZHjpWCQXl}nAS1~Y57P^+4&m?weao)->Pkk3Mru?<)NBQzti39E_c^^bgZ zTr#G9RFe<)s9DhrDvoJ4l)ez9E2!n6O~S)n6-z|A50yMTS0tDP@TZR>;<8!30bCwS zWJNla>GiP!i`*XVTcCV<bgR6&R}G*M+U(pw7`N<(?Lrt#1;Xzk3n_$f?)l|{EI>hj zn}5gYqC|9mzrOMpcibl5Tk^U!;Z_pEG~qslcl@m}zP+pbDpLPSL2<&;+9wK(W0O^{ zLYfZ^nX^j794(DMQ$aN!Uxw&X62<q&<MZq+&w4fon+j*cx7aLJShJR91cJJ4LnrGR z=O)Rn$@`+>I+L8PV}pw5_niMl@9uq$e#7A2=F|R3UmI+azb@yG0a@Qi$ark1k}4c2 z1JdpKSV!65BD*XUEun5Snhyqijv!0U#g><N5o@6t^A(KcnH}c?6UV1NV{1|o<}|8p zid#TfDp?2PMe3Vv6&t{oV1V1A<eD5}fF=s#xmX7s;G1l&zGgOWssO)jNCE>G^E{6y zFGt%{hXQuIvO!ytT2!N>uN3j^Hw(|;;N`|$dZ!5(!j?J6Pi8SxWn0QczElKITz8Ve zB*C@!o%9UB<0IR^>Nb^u?b1>|bRV?z66hn|%UHI%f_qVQ;LsQ2+3x7J+ydsjPE#$i zH)8b2CA@=M`vdR|*|rnMw~B*cV#d_=zyW}=e>8qe^DE=z=pvJ)*XyOsXNgTu?O(N( z40_&wjx)MT=J%?33&ZCkO5;6_Uc5XYb{d9+(|=T(MHktK+@&Vd@gzH?$j)qQ>8EPE zU0%ay6treOLhxFRlt%HIzx{rKvoIXdN3`NzzyaJfl>FF<0?I4j&W1mlp7mc>ZU8GK z{;aA{RWWIPz>6+e40M&Th_NkD5%OM$C<ik2IStsP!3*{QN2%jZ%6!CkgxqA+F`P;{ z;dXtktpc-x5)e!J2m%}HXb}J6FO<xLzF6^=j>Sr4_t7>nk{3E!gXJrMyt2qnI(?Je zE(+(ovz6%BVY=q^RrJguyr@*R?e9ohxd6>h91@c5L_^H~0({-^K}ygNlpTpw3YiNw zx#K`JI4R%-hGNMF-$-b<#9&9l`@Q=6VDGUVA#~!HneZOo2)(~fu6&FG9`oF)G@z{n zM+5)!)g7KHg)hndbYM%ne>*Y=kS?MXP(ie?Nf`Zky2SGvKMSs@4d{|{1%7zEV8>fw z$QaTRcN4znwc%OJkA=}$h_YN~ZQIr<oxKxxFH5b?zLYV~JB`b&%m;2FWtgLg%ccW1 z+Y=16jj|xde-c;A&Iwq^uUwD+LLXqq!xY~d=LSntjdHXMT=gts%2sCmq2W^vz0eyn zuLZKDo4N}TFU7J5+8y@MeF8*6%^M`?5;}sKD{_^pLzj#$#`8fBt%3o@6l28=jXU7f zQbhu^7}V{<1+wQK>14a`EGyU(X7V%!<ocxQA5NX4s|Y8)^aPCH?ZFoLH#;|Cs4``d zTBF?UfHtjHd=4{lglKVZ*;CLv_%cEz|3?z4c}^L7a1H{j5haW9x8r_~P{5hQt(0S< z;k-b!em_maZK-?5b*>ER3PO5;kPhKU@)%3tF0COQaMA`_v}G)=(Y+{XrS(N93+D7k z7SOBZ^JcTTx`=M={+4lRZ80Mm6HLip0l;s-ubpQ8{TOys^oM;+g#@f%|H>?~n-w(& zOO8pxxHE7<GL`wC6%}XhO8n4l(TndD1pexXXWOc3q<qt`y0r6WI;gj+_`uPv_(12y zd@vxhmSlYVbKae~C-dX+c%Xbg136H{{dxz)`4KKwiUp%9mI+t^iMeh^Tg<)~&wfxQ zg4+_sx{)!p^U^9xQ^Uc+H!Kdn`b4}++cGA`iwho-VWV<MWI9;Jqsz(mOx89Ij!`N4 z-HCpDLzY?@=3(jOa4H<pp*MQe==D$gv*_3U1P&sDd12dms9yat&jzTl73MooIuw}! zSy0xUZ9gI@Lk~!;;lygtg&x+WGyxD7c$M7&z5w!&LhPT<Ur{gIGOdjV4<EUYd>~M9 z?I9(F@T<1gTaESg_15D0{SjTJA{_VC*I#}4#iNG%3_4MHSF)@>USB8_#luH6Po4~Q zC)5?JuAllaf?W!AC;G|$ezyC3e-pi8OX*rsz@nsq(W82bsV;zPwa9sK^NYH-2&=a+ zy?cjNe;~4+_FV9Gv<l0@MOr{%AQ7<dqPGgS|D%<<tx;WVr~E`aWLY=#kqowOyIbmg z%b}6tQGu}xtBNfCBJIRt)yB4G-5kKe53lAzXa^fT($tiYZlxnK_ytjN>r{ZTAj<gz z9Hq;jQ#4s!E_rj_pB#)=+TKYtASoX;eiPc?@gfi-0l-eF;$0BGnu9byp#4>QAh_GB zyR|Nm0%qCtG@rRv5YuygKPVDwlQMy~c*4#&Ff?GHb_a9Vot*;=ElW7T0OgSvaFDBV zYnb8{55CI&+BwM3xrN)}UZbf@83a3=E2$&HThNV$^5mdP(0bEiN}AW;No&sL-^x29 zI%R{d0<gH8^pW9Qf<!Uqbnu+;5V4W?cE>~V9;qvNs(*Sm)9K@)6XH@P+U+<@4udFa z;wz4X3PD>*M<b&oPqQdfHX=M$5<xXiCb@>CZ87@>2Z~c~9Ooxvb!QM9FBNn`LdLQ@ z(KX-9bkwg(;SNrl<0<Z5C9&z{e1=z5q)2*R6zDVanhQ6gR`mZs2HaR*U-z>RMJN|s zM{jbxyT`OS(UZLBPWv3%X7T4bik{#_`pZe~1*vJ^XRTpA;_K3nEbHM4at+2j14MCd z!Pn;_I@hD-XBHKg#Vj92-Dy^wg>coMFMJAo{g5K56|mU*T_naN9}JL;6lWh(eC>}< zVf2&QV0?N#s?`HfTMvDxUw#d*f9Q`epAeRO!{`-gv2k$*EDI!Ha;%t*(SB)ksm8Vt zP#=C-5;FyNUKo_)&C^%##%cqvr8<|@lWOi^7}P$@Gp*FXsc<=?gVKB=cqS=A0jvaL zn1j2@K@c0O^+mDpWM=82-@~(rQ-N(ca0Pf#@2~}#fQ{q%A!FgK5O<FLM5o}v*c_U( zD`SFwGjB2%?TLAPJeJuh7>5q=>TSLCKu1&6xoyVvjUS6v)bn+y)cOzEB!M!Fqdfn> zG&|2{T7PT9ouD^L-hqLnuqQZzVM!xGk5b!s5*PW~+g3qxtWd|`)`OJ}VqHFp!xm^b z0JC#4Ko{L}!|?G0FI_U>i3#gAd-LIBfz4SB)<1=nPz(USS8@P+`9;l%iD0_0DS1GH zX2xbUFOfyf2w`}QmV5(4uxVJ6MEdK8gtKBV@I7A2Ut)~u@vstk$!j$BOJP>@;_HXy zPAF7mC%*g|J3-ux)cC9NGKw$pWo1t!e=|K<6?R3BzWln>Bf@)y1F7<~P&+=Kkqi?+ zK_XQm2K@+}P8IV=l`t-jr{NsG_JSSw0ROn18djHae6d1)FRD*;7{j*sr&lP`M`I6y zYYD?7SY!%Az?3kyia`t)T_F~wfyrMy^sQmp3vCh1vKjKGPi9pHRGH2K#sNCxeRV8z z-xtY!v#LD~lcFQ-*>oj-<(RseGo2!3g=vw~f}N!uZC;~Wu&<2ejSW{~C-;(8#Lfsq zP$nf?o2YkN+lI7ZjYN<li`{+haC#Gx=9w;K1NTb(MX0^R39=9{D%2m9RweW*+_}(T zEbE*$?VX^>lM>j(NvK?<+Pnup)$u0itscTEbj!2}1FK9AwV?3;Io)4j+=Z!*kDOfl zYC|Y1(!yyZd|g^ptxUtu9SmTqVq5DGLrS7cAE6Y`7cs5Zwj)oOU6~?5i^q71RW`h2 z<Qq_RIT?Q{fZmCw8Quq<_=*o{B~I4k<N3^9z&Ner^6_+1?`d%>&ke`({-B2k7^P?8 zFcP)|&rv3z;CF}^b5Px0TQm4g`0vOq%KAfJC8>b~<zySo$!^FY6)(_Ac@r;;9+57c zi~>)XCjhp}pvxAN-b~YrY}#8%5vR(+ehPJ`nYI+j9A?V;6|I#UWMm`4^+}g>LJ78& zf1uGP0djM65J0upX?_gz1DC}~{~hu@YDsCU{)PghmoW*r<N0WOF-ny`5cCVU66<<6 zM5n_11}4e0kJf_H*nev)VD0|`4uqT0EIY^BHQ=Tss4`#{RV7s9&F}=Zl7sR198Cbb zc`wKHjfQUuwvM0hhFvB|d6v@Y`Ha+asGpk3x^TW85qjpdEl*1)7d_f~x3-|}b#x5> zsd-LEXgE&KNj(Rnk>lE+@TQq_;7TNnx(kF-q#s|BZ#MS$m=t^62$wlqF2TtUDJcUD zH>2n|4FPn5)P6lm2MII%ay)0aFm8i>w?D(s&S=*}W1vF7zzWEx6y$$Y8oG+EC#LUe zRqTyNFbp#_NOO)jgH+tMqin3dm{Me-H9G^eC(|)>X=rA_n>>&9ujJZS=0rDab%HaW zG<dWQ#Jnc*OyPK$XU4Te;b(fZN;nNVRa6~D6rj>gna&|zx+;_H42rY<iQm$175JG- zR)n&kciyY2SQf$4krk&a!c~ONT~4)Nyb4BTQ8L)~O9Z<(3G8jJGy}0GY^|`tx8o_U zA3BrL%oZ_O0%jg`Duz`l#?XTKNKqc%#}8k{$kTI474)wx{nw?#xB_Ko>#8vZZsnkV zD?fAXny*4bIAwj;gw<Tq-@B8ya7}L?ed2iSp*LkeaJ;kJjC^~lJ202#$Hy@KxYr?{ z2jK!Et`akco%-TrK8S|-a6IL(mB5QR&`|Ds%XOxxYo8I*Gk!E04Zo~@jwVrxwZ9lM z&16u;()s2Vg9YSZHjHhQv?a1+RTcsPAjU?7fi?vj8~E6j`c@*$?M4glo(&dGTnmiz z;+vn{GCEFRTlK@ogyP;%-VrTHm%_cxfFo{u%vCf>DMyUCo<Hy!8`o^FYPo1@J3XZt zC|#f{xhNdX;Z^~}o*K#9gb*_#m%6W3W)~kZV3^y7pm9)Czas(-FSHCYaTmF7+VstB zq(l_+1|>`AbQjpc2z_Nu7DARf$;1O~|1n|u=|Cq#SJZfXsm+X1YpKArLxXxuN`NMZ z+U}ilgrCmG^CAlPXMdxGb(q`A3J|@<j|UtLfxWXY5&GU$E$jUZJb$E!T)WW#jT7`@ zZ)aeC1LrO>kh#g0W~+Ow<Jjcu>`RoO34I4@5AX`1Nm0%zEt6!#ET1DK@YZ9L0~H+8 zY>xckXilozjg~fC>g)Su-&&>9&2ne8a){5Gbp9gi1-zk~qGcfoM8)m9YV~T?%I|NR z$$D$!0WgZy4f)V#gxlDTV^m?O=~NNXTM@5ftvdUyj(lZ(`WtkoO2$4IIh4&s0#ODE zPV+I%8?Y4dI7;yf`0U8-!xNYH!k(Z}5A9XUyzO;ej5n^nE|XvbS2~uK@ZSFL#U?lO zoNsryLYy%NWv{#LIZXkR0{+5XPhE)VQC0^0mGQYMgk3aaR*^M=_cFvy2Yx^*00z98 z0yOLQrH#6m4|F*vY_zVsR<bjURqRm<vy&A(F1T+b-oRlP?KB#Wd)Z){kCgcJbs(6l z9tUBKNP?q6rPAk9(X4H7K3X^;R-nMbc6($0vD<8J3X(LWQ`;JAs&G6Ss9Zrwm^FG> zL2Q2{F6>`f509H0>M}mGZZJ1;B`?~0`aNE8VNXY3!xcs{c;k<%UaEeL1%<piA9c+; zVc`xFr$2<%+oM582xS(Jb=~kgC!;7!kJHxrIwl{~eEx(S;4=JkOgqi`y1UVMNbpcC zMCHS9Y5T~0K%gE%b}4%=OJ61P>G$OUyg2OZBRl7xV0wi2nDUu%_j2=Dnt9Lr4ap?* z4D&GHU`;P|dMPwg(uS5OlW9qAnxDXy4$`&^HN#;EI5bVaq}hfRVE2lEIVj*i+9fy3 zj_2rErVIv)?lhZlTpXn#XVBg8U_Kma;gD4Dgm)ipFc@&<s{6P1F&>aH>M^<LK*jkK zsvOU!gKQFq(f-Ziece%3QzF$AYTXBDG)sE(k{r0A2QQmoRkSI*qAfUrq#{JBnM<q7 zmf*ppa&>fk!q-Z6pU=h(zBY;Q6z?4N)zw-MnC(NzskbZxBdo=J!`xlK7!Zpdtc`ro zBa-6!jbN!x`<Ox=Evx3U3Ey$xt8h!&;rXauZppzYE2wuGr;yE??>enA0C|qnI;RqT zv9lI`sfkNmou;n4!MwL~wrGW31lkEDB(l}yOMd~%cV3Pv`@&n2_LX1sN@2a}(}p^^ z=@U}-WYhFS=VHP~ib%>u7jJ-uY)(P!k-{LlS3);*`P0=Q)78{EzSLR}nsTeELIT?? z&Y<6Im&Ki?pTaxbopO+$@CGfnB67fKh;m?z&nX|qdO(Lr8jVp&uMT?=%k%B^vNl>= zL}9_SKPt5>fUs(lLDjVdaV4JH+aWs`)5A6bMdzW89Q42SXJ;=@PJpLlgzJ7ud+Na7 z2xT`y^jb%$1RCnn>Ub!CWn6-qTx4!<mD?NCRL7_2j&mmRVNpfc|4il5SP9yiLiNwK zqZYE(M0DT0btyoUGVkokXkj><mB?co4E1W6+t=-y0J2ak3y*+RhdoE0U4WlHr0L=^ z<fIW#Ru+M2q2u9QOQxE8(apBf>jqq@17c$_o=-{d5oaJRr%^ZU332M8TAIA*b+99t zhwK6+NfE??Q-oghN?X6K;|K|ifh!r_fu79JV?ZCOroux=9c6p-sn%jsgcf-7Gb&?Q zGIunS*=3XgJhq5wu)Bp;W5IC(6a8SFAzdOVn<+&_mM}`)-UxKtikT^inbic?s33qT z=!qSfNe_5zzIDyFo>WcBGh^3zo8b0H=bQa2=d5}YR4abiLC*=;pjC#|mmpfxWW!bs zE?*+&apNEu1phY8NJ_wkAU#rwlwx6yiuqJ!FQRO%7)=D#b2y%(?&AHOJ3Gv0XXD-; z)G6J0BOuaV0&f9=3_BV6Y9*pZpaNY`i_39t65r@1i*%6As_wxVM2V-Ej6)KygdqjA zr3R7mO}SA=sq{nUdC2$=8;EuKUhD}}%V(wgykO`5`@gUP-dE-FfOS$D;wO1`%mzR> z$i4h{etK$dt@Lm=l`OAjg+5I?PD*s!f=Hx%_0ltd>D0qVx4o-)X9tfKIWd*zS3H~z z6bEnEng02eiiO+Z1>3==Hz|~*<~pz{$oP#ODNS65HEcKaxOuY($L<*U@(fQk>>U+G zace8SaUy6l?^k}KykSOU>vXBiUQK9>Qj;{Y3qw}~n7@7bKmHI(WiHMLOv2Xb&C!4i zgwRfxtZ$ec6{^!3pRs`-qFq^nQ%XNl_3G{}anZxcZ%?BaWyM1nj{sjTya3&U^WM)z zR1A9fAN=V7<AOgwpTyOSdS}N>po;#}M1u26C3N7}>uHp<RS`Pu40`Gx{uj!sf1x;> z_O5Q^DSB&58v%w<h=3$BK%sZ?^ZB5V8lSd)=4%;GJWh8aR{pQay-Bt^J$1$um)SGc zm7W-j0KpfKKT)O#tk`ZmkQ#p_k1C)$4}7~A3tClQKMI>4@XentFIvAW;FQtJr_&~e zDTD1T7UOo;jL}^r{#{@icc=Bk5v3^5z)~^}8l**?IPK!7o@{V%V(28qL@)UQsxjc1 ze|1yF*N*XB7|-0^7~U;PsKVR2AJmeT{z8hlEzpb!kO7{Dk};5xM41@B+R-V`3q^}v ztwAFzKv8*OY)@1pzak^J1OJas2jk;x5S`@%kO&HTh%?hw$D8mb@Nhd$<5cBR%RM6o zGwHu4aKf8Dvk>`CWqjf|us0OvR`RO08z2D_<g^Nd0)k|6Hqv>@O1!8CrtFJ!tNb<} zxuMikEYD!I-##n6rG)|7IZyk&9_%`>UmzLTz(98&MS%+A0tEd0#Fo9mtrYkx8&p$8 z&niOSJC&jtDBB8p&w#ZoX`<wderqTHZ}?{NqF?088)C5b$_vGKDiv-+%cP69Kz9<! zz0gbOkY(xdaoR;EUUh?$u^i5Vcvp((0ib93JGu<hGqi>|#pMur&F$`PK7PEpx3~G^ z$>!6iwo&(aiIevRbe*Y{E~K(ui=(!7$D_vaiGH9;s4!-VKP$Y-QoOdnV1<`+HsXH4 zGuDMgv{5563FD-=h<9>UaDxENX-k2wF9gm!p*x;qZ2R5mG`rL+0oE28Nx630i`aky z5@G^s(H!9VV}7Kn6?7~olOcV+#NbiRt*HtiKz%TOfbd-8f=o<^WvKY1y230U44^qm zJwbAxs;U_i%ZmoJ(k-#hynwJXq>S!V=o(ofK!niOVcv?uwgd-JL}m`6vrv!=NO4BN z94R8&<We8z{lIRM>9{xVA{j@f->h_6uy~!(u3o#fjVL>gy1ghrso4wIj2CXN9JNb% zACNsp8XS?gI{FgFw1X<g7^(6ym4Irk^%}hDp=`!#9O&nU_O4)CB0DCwCWG1=lWxvj zv)9&JwUY2V$cD$gEP~A&W!xDmx}ps!ELKv;E(^Cgk8-W`Wu$W!6ZJ&-S9=ziW_3P8 zjlAqc>0FFHyfa6aY2l)i$%wX5zM0w`^^!JDrlWhKdL55O>iP?v1p<k9b)+ZMVlx2( zVV3k8X~j@UdQJIyn8R6E>YHO4qn~MZ7E@36G3<j|AnQ3a3sRC@C7+Pi>|lDy+lnJo zB?g@}K~u|3YYB+v^{8edO6g!yHDFUU!(}@s17vlhWM2;(%fOnrq`k!1y<h3T(oaM8 z6#zziNtibJaumagSDm`K@Ag*N@*>8>5noO7xBc<Fa8kG~-w#G5X4NlfT~G5aI!<Zt zx|8Wx*|ShoB4(|c75CAYVWJQa08<T-cqRI)6_$osR73lRY*tfx-*WvXIRfhYFvl&6 z3=YDEI7JSEARhjMbfKD}G!;^ln4zNWH=2Gk9JPP-wcRZ$GFqFh_=bg5)N#?1jra!8 zeVlhQb_DAeCe~D@Pu!}5%1bE~HmBCkRC8n93=)^Wug5o5tfdB&m3c2OFwk&Hn&G`G zr`xn|scKKgI>iwdB(V|%@$)I}P<rPg%f_CsVuXRJVtSKH()%BbU(;ab(=yA$IHVPK zcXV?Xx)Z||fgR3Dw?38L$ZAPNvr;wz{h47A6d(2Ko2e)j&PBe50rFrycV;sV4m4vm zJ%U-bd<h0QcWJWaL5^1<<3fHn5ljuIRf((lykZjM6*xKm!zi``MEM=K#POw_AI9LA zAUcW7mhy;iEcK-vjUt(K&ZR!29L^6_x~Rd;h=&wou8;6yl6dty<{0?ga-xsSQu2*R zXT2731g|1^v2jbrLlisEaWEGzds-Z@fXIm+&KX6{70XZ+b#;N27z*$^r_N{F61fon zt4MIYZm%u`E0DY-*ozQ1iT)4_sgoDoY?8l*qsP0~+2~X`x*Cn_oqqv_RD=mg@!yKg z=%<E|$0)GHG(LofvAn{;%cUkXHbCq8ZrV9623c{orX9H5_wnH<PN(>{;`NMP&tkVP z%DK(Rk05QoJV{VPL{u;G0W3is?qgnXPhCfb0Ned#-tV3pwu(BaoQ~_l1wK;SQo-wZ zn4RZ%jOAn?J++JnV<2fUYbfJS_$m!Ir*zIkrNHQ9fVMx-sZ&^wh_V}f1K1}_0fxz5 z5IW%@npx9ydxlNiu)F#(G(^sd<LNNtJ4>z`3WSQJf`2j{;sY9H#|){m)Lo?wp*tQ7 z@~(~wp{nUJ2CgQ4I4o)-LQh$W)@iDuvOw1|VDy-|U`T<8P%=8!W02xu|JRI<D#W%= z^ATAv0lrjUE^@vYb~J>3ojplaRUu0Hq|wx~N@+2r$2se`uxDge0Hvw%8|EklZ{&)h z)EBBBh7*jeMt<@%rQ<F5x`Q#3cD8|mNjCI0Gv~>W#r$z)WJzT-kM*xrNf(7|+Aqc< zZ4*ny*92~B^hhY$=|0S>=mrjq9|NG)MilMtZf`t@9&c^$?!xz-*2aRnv39%m7}WyX zWX!(7W{SJJ=F!Fjenf?~=n=dXrFL{hU#ozlrG`_A%temT^U(}AQit&@J>HD6CfOGz zBsU+MAC9C_khh9k&lGJ^1eyYO>cjwZ08E6>ruHV@Qy40a6V?S(p-iZ*f}%uiDM|(v z#j7ue$K!zvckLd@i5-Wd%-O0~s98*a8yJCP5C9WB$EHE32}2o>1JBId(|U9Qc?WMo ziY9(Z;^!)kel|UwlN~=scfs{WMw;wFr}^SE>Z_LHRIYgbyty3BvUh)D@MsYZg4iH` zn-8`(>V_m_lfkH#HPtW1oMqGSg+6p=U2AYLj8{L}qJx_PQE$kzTX#+|G5A%xFAi?F zCH$PSqn2abX$r5kHje@Zo{64TiHZpVZPZKAK=6aMf)?7(YpsB_U?8Fw4RFF!G6CS) zAML%{Q16=@U?%COzJHrbEiVK~1*U<cWnV?=az@tdcqkC)eM?jXVT!FWcp}G*oj8r+ zYvqg<wH;|p31XK+KJ>yD3LnP(JBpkjw4q1=a-M8&<1g*?rk{prtfnGikVJ9&ZgGUy zwz_JSxERJ#UZ&JwhpBn(ucTV=Fw)eT=1s=s!yEUn(mf<Rj$v=y%{I^S$q5B(CDuU^ z%kYhrAwnzzKa1Iho?v%?R~IPup?OQnriysvv+y0E*gj55%)63aOQ@wT#z9O)`5H~L z)m6m;F*?r*%&<lAq~O#%l@hger}F&Ql}RcxUk<Ru&hqxSfd$a~8^Q8DP81!G_)P)4 z#wXl}hJ_L`TGrp(q$N+q)VL~=Y9GXBsl8HnD3~f6`a?2!lW)PWd3`0<rE4Y50H8!> zY#P%D;9W5q8O}!-ql<)7h73|G9u4qcV`ylvz|vAoE{ax<5y>!`7%&iQADtT%I&W=; zix5`q38T#OY(Q@&4w1%~1D30aYj<{dSafUl=XT2aSngF+Pdm)fzur4-j{gz6;l;JF z$>_+bgbs}q8XjYn;hBq$hQc)2IBBUBZu^i5oIk)rE9_NOQJY@VrJy=_*~FX5y9;P@ zj^;7r3JA;nvHpMHF151zl<yOD3y&&4!=c)Oi29Dr1##Gjwhox;YVU~ZkyYJH`==OL z=m6SyHlC`~hT1WoHD1+wjqqgGfKp6(fb6UPtInXp8tqcLIOA_S8|z-cvQst_%9vld zdvP4h?+<?1=XlZ4EIYMf45!%zJ)p)o9t9~)EL`-$hzgAKfQkmCp(oXC*ib7v28loi zxYRu}#!PynLM0Jz2+~N*sEO1OMn%`qJBop(dZ>03Ghg`2b1#qG-jyDb8+&XbqlQBH z9BVC4%GzyfXKaldvPkQ>Jr}zhi6n=Jx4w1CkK+P0XBv4OCI+`n+{`s(X*E{aabwLw zb7MLlmg4RJJ>HB_o(}2tb)U(mZU4%fz_u@ia~D8^tuAcLY_ok#F@z?E212c)BsT{m zCE6lNSneX@Lo0&E*#j7kwSA@pt87CSdh<-tGB(zCo2adfwvKlqkN|tpR(}VHv~|C~ z6K&mxrz6}z2242_8;l&*DV9qTAIE9jF9mVKgaL4v><-2SX{JzhitFhhJ1r8Z>zxZw zqQRq@#~m07$^x9_gTdi0s=j$pXmdbVu09GnT}KOx%59=nNdnh%M!YTAt_;TAA4nX8 zeyH2X3Y(9DVgk=LBO6RRAN6E?^WC|mk%jzVGQx92UZk1wN!-!I?GQ_gjXB(!16US> z=dsmm=qV})2eiPrVh1b{+U{ZJiuSDOwYe#u0Pv%r_6D~J0l4CJsJ)54du?oGGM*$g zuc=ynv-AR5tkw0tZK&iAl4!c_7Zm|F^(~rs<m`>6lHU2|qf_fxzZq5Tar04cYz^IN zg~>)r)s^yochqxlF=5LY*^vU-4~0QASmcaZqXro?m2U_MS1+U-OT$(6N;6(b+$nNt z$$P8aa+AwSPC+@8=`S;G-WY+0(a7<hK$$D)%0W5J1Oui8%qg>8uW+M@xt!PDi2&pg zPZnM%90HroC<6)Sj&qnrg<CtPyY1z5p`5L0{B+N971!Adw5QqkV~$phB1>Oh6cIZ% zyUyO#*1_)Mog16AN$)P%rP(=<TX>tX2^B?+qu=X6b_{#-?fiZ8E8G(J_PjrGW(B+4 z$jgDj&qeQ~weetZUi5zcnZKR?{Bvt#W23Z<Fh?iA3xxc2l-Lm}NUx8iVBT(jg|E0F zc-ivaw)i!)4lg$zlx_~FBjc4gI`MP&+EPVDVHnVFGv5sFO=6l1^jnov9KRg6OaUOC zth7dVI9TJTPXWfe$^^4ur^j)jbJ#k$BZv<u0yy1b`$2k*Odma1-q7NR=qf<{l4VU1 zUH&O7hsczNUw-MQyrJ;oeWRA%8~aO^7lmvcZb8@aS};XoqL0#J_Fl0!5Y5|2-A|`@ zmEAsS+-v@2?Wb>(`oE%B=RV$u7LPLWzjg~*pl;xMR^&n(tiS}&hwI<A-~Iilz25jb zYn<#ho*k{li^0xE{qET`(bk~N0S7vm)(+R-)#_>M3vzAKO}^~T%1uIRU*5Kzc5Cw} z{fc3;G_Bw|)Vq%SzS<`mmFtM~#4pCP=OX|}K)1g{`>3WV+Ct#Sok*K(!Uf6pgtjMc z&~gxOvHCQB49x93*T%5gUMz0MPD1PWC+`1i>zSX#qx=;35f$X7g%Tzbm|e?OwVQwg z2{X~fB0DNMFHf<uHK&+XD@m1NRGrkQ9<Nr^^8(|<Icj}u_|W=zJe`g&3VjEMnq)r3 zOmXBVQLTMcb08|sC~caq=uddYI4O@}jCIr4iQ;uiU;V|GUws`1ie`;pZPDzw3!qQW z`aho!hNJQ1muWGZzrA>O`D;bhzjUzj;;Mh?=)|yo8WK7kVZMVA3HxN)27N7zO_h}+ zRE>V2&u$s!Dqy%anIWFEP>-fl5`-hV8eMDQw2XkUb=p>sb1Oy|D5fF%YNYIHdIAfQ zb~0mNh9`ewNl~JcX6#)ZHf~U%0AG%7>LGAv`MYY6dsnr?ceR@+f%@+@T5v?aIP2ri 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%0DUrlBtk5GAOV(MZGQ>>wI5qzKM)JR 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%0AbBVWk;%%^aTOi(S;%%{b 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%0DvrH` zb*o~p0=JY@)*QQle@4-K?Mr8Cvi-kAlV{zn5a$$3yF|xN_lVC*9YsL#OH$|-WX#BO z#6KSu8v-vj{LU0a&=x&?>a>_{I#qjbg6*@DC;T!{S5?sM;s72|e0CkVEdcTqjd}YO zbiSg~Vv%ffK6)gCXC-`o<j@o365#xBetg5?-do5ARSs2>b>{zT?@i#MI<kfF>IG<; zr5gnW*G|O5gs8YA)7TojrHPF;h6pOjWC5WOB0{IRS21xx8xrx#j7gj<lSQ*Tlgz{~ zlc;eL2V4+$lDJJaNz8Idn@AS7M7{rWs_HfkLMHDw^S*ii_f6yV)Ly5mPF0<%I(4d9 zc5S7XL0_N&4!G*V3aOsA3A32@HO#v_=<TN7gSfYmd5;WwUr)W2nan%zHg2dN1NY%f zNuzKDgl?NlLn{f#c(5IB(|c^1Kj1PGR^aE>vpa)fr`A(_d+qC)sB59yc3ij<W4!n_ z70x=ko|aU8^lf%cv-XTI5px-*9C0yqr0h)w2fg7>#ct`ImZScb)2Q=DIfUCZXP`4^ z#BkG=uM+|{LaL=SyMw}LdE(pb&dD&Ph41MM0{>gMe=m73_czcxDeR%fA?xuyJ?>$4 zO8c|$aPkNZp*|AkMd@MoWFkK*r1xcNcUM{b=e0{>{O5IIA1N&H38;rrQkWTFU5pWJ zLuAtnJs$ZaKhI8%sQyB(OZ_VO<L7&f@cnbVL-k?`izmOt6c$I!BK%qGeN@4B+ZQXT zp2TG**N347qu)GAh(<6n-K3Wq6-5?zvjQ96qzU`LdM0cR1k(z4VJjekDhYFD@S_&g zWJTFfaTzvbO){p-G~3znI64(Yq7w+AsuJmmJEd@33@Zs5o(e3{zsXhai$7M+UV8tz zyC2zZz6^IYXGou9NwPfu0lbRvwV=<c6G>L>8Sz^A)#rMwt{u<P6}OADp=uR;H8a}b zzo1>T7yeIPy3?_81nO{19iwE{->Gq^PXPC$bcZiy&^tHs=&eYs;1uYU$({j5Khq|? z%in51VzRGHK}nsh5_=5-pQRAP{0FpwaD1mi3}^n3y=g@b?)dmGXxOU@h=%F66B%ye zFnq~EFgV`ARti|FZB;@{wJi@_5RbrBj<@hdBUHF|!7L_XXt5WD3WHE0U@=#N;xJj# zYQ%BOyFe$7vp+bcW<)mw@SWl~)1Vh3?WV2!{cWj%evY#ZC~hiTSD&#K9mgjv(7{^J z-?-ah+gI7gf570do%dZS>TP@G5AYw*<88WrE@iL%Op`%O0$Zjj<Kr<(;8us})eE}w zyc!;S8#l2aj9wfF|7*l?Qj@<`D;SpHrhD}Qs50?t+r{}q<kQcn${aA9K*jH3>?@m+ zwP%j?SI!>SU8GH&S$78p&<fhK$GbVbgn405kR<HZMO}}(*nPMz$BFmRhYZw<)!6sO zG-S|c<|+M3@1%v<fC)#%@-fp_(_3r1<y%y_)li<`ymU}L8OC@4;Z_&}PdpDKj-3#X z1taY>n{hcN8g1vrfoJUb8lkWJb{N+<g16u|U|idFVGyMAd>9|~C+4Wf)L-AC9#exq z3f;T$to$IpH0Qum^7@3z=c%y9o~*ea<V|XFCK*uREgELcBkS0ic<`aa;N5L@Hz&w9 zuoHVO)lj{Ta|^T9g&y7S4l)amP-fxt=a5-gsWJ;EG8-=dvoQRN=R%kT=jS9utl{c) zbm}JSdYZcXtY!EX0PcgrD6;@5Fm53V-0r_bB^qMox7P+SqwK-sVO*49$6A`jQ)_$5 z;xA8!9M$tz(Nh^?z~66lB>I6X5UvD+K^OpQKeK!U$aGm@;@O|*MFN=gfd{}R$@$#x zKZ$x-hx>`DTQS=|;mU__hXkMS7K&k*mQl$9UUZ0---*H+i#ftv6jRNc!BquH#yF|Q z7bfzjBxK)0Wsqu7wTXYi{s*Z}x)s#x@Xd68T3qZO`o@FQrT;Bm<N=%cy(WBJsjD;~ z+c33eQ)DtZGD2z>L|jg(K}pz>P1)7n#n`C=al67C5Au6TUvI`MCv-CtWozDCM*By} z_HOP!W~0bJyZWH@VWF4Xwo{0)Tdx%dQ=$K2yaT}7rL2Q<%LamFQV{RR_by|n{i!I~ zFAk;h@}`Xu#dSJ+H;3F5!9NGjpfv{+#kSK_^CV#ir#hv&XgUO+*DOhO*uGtqB4z5O zosg>OcMWc7*Oo|iGnbw22siVHww+=xSK%^@?6S4{hS{wZ8sSQbI@sAM^;o6LG5HX@ z{U836dbyw*eCZ36RB(>96~hDg9@Lr5_LM0z1h_~py^`?xG!*AI)#Clh!1Mc1W@C3- z4SS-Q={M+BufY4jvXt6lu3kq-WdRIcuKM9)*3n}>|CfVN0LL{~$#bE=qRT%%LJ=qU zC){0)8a}RuMR6jmt%Yc)Ffobh9SKCgc^X03n`h`<u0KqplAjQ_Za@SqZ~Mr-pA0he z!=9u<S-kgkqsKjnFGUsbthB`}g)z8tE>&zkT*4!K=_efY8kI2mypH6&NSKh%WI#7j z5$yg6e_e{`UegKP{@tL9Y}2_citt4!Y_v|H7#BPd#CZM_-C)edP=0SIL7vXS$kzs= z1?~XUN7-U_JPoK{<0=I1C8p(R%qR4%PgvbGo^hHDC|x4y&4KG=15c^-_dQ-^I{i3b z+t4|v2R)m(OzjwtXFeSirkW}VpR<!O|DrL`L>yCpbELfW8N3Ql?Mcwl#_;EZP63N} z_E`UShy18G$3!!>@nIOaYZbvfRdRoh>|ByrNqA`r;ezoYis?}+q>F2(2RfuRaNw!# zY5-C(n_bG#k|{*h*MHf&4)#oZ7ezXmG3E?DY#uESS;sWmJER?Ls1fhYC|Wn*%3gd( zcGZX7^%PFOc2oTmcr0D0OpykhbD;<?;mXufr%3v9>}e^N?U>1r*M!cb8#Ja`)Oz5* z59-6liv1)eOdTv8&nq2lpg2T1>%AJ3BpnveDe1hP=B`EA&oeBzl2DV$QikqM?Tf%3 zaM40RpovZ3<*pmzt`B<|hNh`0fam7tq!C->XQdIYvjJE@W;R~bquh9-JkhO_rCp7! zVNRXwMA4i;k_+GW!t!8(Q1D_%q|HJflR9ateF`UrUA#_Emr)yDDWb1-)lX@bOOc-F znJo<Of~)W-U@`Pb`oMCFKTHcI;FzLYa2KD}Q)6YnCcA;S>nu(7NTWYL8Wo%8(G&tl z8ovy~$<|eP5aogR9>(0=D8tv#<TMyGz`wXIVzoI;&I?ZI6ozJPm-aM1QNNRq{)>`J zkb=A&57e`@krcN3zTg}?45u}VgDR}uq6fCP$(ei=OoHEJQpSnCCt_sR{GQOVfqNKE zQGM>?EZjc(jGRsn5;MK=R8>}3{(b6+a;jT;1Gm;Qq$}`g4OlOpty@f}#E|rrQ#$Xe zyTf4HW2)&*FD=YSR1$JsC>La^K?QF9#fd;sRP+=49QY#m_1wFfdyDt(%Ak`eF!hR% z?~pFkDyHB30i!@o2G4|Dwr0}<57UI)k->A}vYyU`4_Z6qP*B`qJQsJEM&DN1r6~1P zn!qC&(muDeoeSL@43W86;X(-m<UA^Hq-<#W74Ejr+!K_Ph}}i-)Eb2)s4gVP;_vQ4 zdQ)sK9wy&hiBolk0dnY^Je^9faiO#hzLjFCLB2A}c2=-SwNyPX>fFHpQn8VpC=Ih6 z)}AOgL2t3$KbgL3#$IaAl+LsvYvfE@OvLLtqJ~7Hl0;l?V#;JJ6+YlH3uv9G{40Kh z-)-I{OzJiPhBoDvj4W@aE4%SglxaRo7h?(z;#uZ84GM8AOZ$lFnppcNzr~c5is#Qy zR^iTz$JHTi{A((Efj6)x8QT_q4^y`rAE0Ou#%Gu|8Z(t`j(W%6P`A3?;cv8nlS|pg zU39p`iTmBg4Aj`@wCxu5I#YH#q(<Dt?YgF>{Fi$7vJLmdYYtITavejy>Po~6mUa{5 zqBT7(r58TTm(pF>EF?~P-j91ZTV2a2wJvyrX(X?TC*qLc`(pAyMNQ+jP9m9Z)5a{O z$xhblU|GSXCxO(IopL*Ukh%$FFa-n9ncj9xIGA#*yM^F(b*Xb152@ZYp5Q^c5m9xk zc(p7(++%T9KBOqLY=MDz5^#uLNL{d3&Vvy&V1NknBbU^%1k!dfrW^hnMjV@UY<tgp zE0w3j3;T8_Bcl2YoPffP+)p=bTwFht6tnYw&VxteLO}>u5^NciIe-2#k1I2Xs#~h_ z{X_qR`Ao^#z=<mmd@IaDF{VMTw1GE*gK(FeqNl^-Ob9XngFt;w!G_B~l3ux;iHoo| zct*?jqTRM@ej>P3k58K*npjiHAL;0VARM)P1zJ#5SiRG#=~!omUXkqfy`ogQ6hNuy zH}M=pwmy!NcLT};(z|n4$?reN4_xXJFO#?aX0@WUZKTVlt7#GRTw7f285Vtr{KU^h ze-)w!?!^MX9lV7|MZJn~qq24zOpqG7`IxLlQL16(3fGw;#>?ps2Cs`+!6+r7vY@6+ z=@3TU`Z>Mib-5mugx_KZ`#{jaL_g*OR^*IFL*8Kt(e{?g^k;B3*h^V-SYFAC1z3bq z72uV#>9sWf7PecJh%;d}6WKW^-~Tce3A}MTb~)E3TIFxmFhxAe@d(wlQEzR-v)!N+ zmNPkDeLY}T+b4wI-%|I(ZjesVCp8)`q8`%y@<z)12!rh_UP;Dj43&+dey*mPWK^|9 zw&3PRz#{iq&8w0xdLURe3x=WDvJn=fc2?V~sHf!6J2qn})weEiLk;&9b?SB^YDAZA ziD$Kv{&#j~a5U=KJf|^jWD$fI)5cZF*wq_b4N;BVNSnE&SNO{;JG_^@&BvsOrEhVy z%Erh{sSPH7`J9h7q?lyA{c^3SZLhLXP#h-@_-&5^%c$Rk2my6OXJd^QHLo<fmi<J> zn$3u?%fHY-#NKY00g+se(zz#`ZZkXd(k;=d?p7-@fo|!5W3$H0_C1DC(W%IA+E-Wk z8!q*%trdmtLN&JHT2j8GsQSsu*z(biMastErJd^4(9v@V$}jI%LU$hMAjrz^M7(MF zm4rPLk*Ptpg3jJ9=^&*J`P1JpHZ&VKi+e*8a-#_9etOQ@F%A1C(h^Ok6fovpc`q&D z!UVPr0V7wGoV=RVe>S0t2pOiew<@aIwmh64^4Y^fG@AU~Z*l1z_;g<vz7RKesK}ud zHuWBrDTML*ZIr!mO7GUqAX379pgG51sXX}yS<-oDU54Hb)Kj<EkWpW#*xsXp<kn2& zBKKioxUv;CA55fzbw-DDC<7Wp6G&1L&QE}jkgy<_s{dRS@XYU_uy9>M{%Xv)ejTBL zh)ZszvgErQDf|2f6l<aonW@`h+bf=u4oFQYjZR&&vyO$8YB$g*+fn?y*+rvtg#S(r z-{7pH0R!=np3`<<aT8GX3-oElrbRzEP=nyBfD^)(@KJ2rA@O6U^d~ABY73w=Qmj)d zMY&xe5;8N@zKq<ntr^#A+uLr}p=HMsx_G;pTJ|k5(&@6zPM@opVWw<y>;zgZ{*aQ6 z_AfSTeeYTC=;Nx-=p*dG*FbhUR+`2cd|~5Un)wFy@<-rvdY85huMwv`g+*DCLSwE{ zWBMVcspejwhK|U4dE`&C_|6ZqejO6Y3nt()vfXL>-c)lEI!0!Y-Ck0p3dl3*@EKE4 zI$UMYJA~w^l1AXnuOH4ia{(nbA-Sg@xn1F0O8on+Y(|2jn^YFNi3)9gPXl}LCIqXJ zEEE$zL|I%RsN~_`c=oi)546SWvGne43-sdn4k^@KSVwczV*Eghk=IH7bW~64j5*hJ zl0Oxea@o_~>>QGbYz9lxA$}^%3}TmI;46gvq4K8Tv>?JDX@*|Pf_`%VrrA*cnd4Q# z(;&Y+auqVz(>fdmt)jxHG97Dva!Uaxbj7GlDcmV#$2+0tI;9sF-JU?Y4aZ9p4r!14 zn{Tm_+igvz8iEgo+ja;ZcfDHaQVTxE9TZJ{<6E_yrkZyzuvHHP-aw0Vq*Kt9OhKWG zJ-2gEULpY>^E8bE{~7{%jLW+zYhzY=y4=OlA`7oN<l0mrS2HG(CgD0{zdTCf!mh(` zu`#lYE;g)P78^avxN<q~#4;>76K>_QuAOCEU0ldjmF!+kn{aQ3aQD_9f2oXX7hKfo zmLl^GPPWqApPOvA@yT|A{OSWepa0$8^JGh<6>+}Zs?N7`(PEdf&9(1}2~-_e$CUd= zd@SWg$!>5l_XFyb+jYKuoV~YbmJ=UPwLi2iMDC>9`L~C9NdzXxJY!~Op^h<MQ(*#! z^buaQOO`j?k2gxx64R?%yx99|fv~=!O>;$-?Q;{VQX*R>5T@(+FM1|SjgQD>;+8nd zjN>JQnpcqWtR)(kbp56KaJIVWFs<3;vR!`;Y$D+KjYHa*X*-Rb=yYHPK6$P*xYI_6 zr<I1Fdcybz_$mUmDT{;Oq&t_hfUr=rMzg%1K5HLA)e8D|!rYueFx+SEx{=5Nd+9lQ z-StcELmg+Q+0lo?_O+1aP8+@u9EDW5_$<3lcDMX`ty;%)lQyWACpGj+Z-(unfa2xH zsUAz&a6gq@7)UeNDKxq3hC$MUu!Ko0#22+RL=+G4JcNK6Ie9Nu+c$ue@Q_Q2#g)({ zN6HR&p^QAoMCeIWZeXAMw=<Li`njYCNA;pGGJ&aWby#l?Bc_^1DTYvZ`mzf?7k&Lh zm~zS`R2_ZxI5aa}oL+_6McrxhAjWc9v1eVVPe7jX0B-GF6pGzxWv7WS5XkW~q@}^v z+#8`g;pV&2L_I~>Rd`fY42Bx<T1<YrgCxaR?!{Z_w6OO;bzmtM1u6lRhz?ZRe5g~c zuIMz$sv8lwBLfx7BV!KOE!LhrUO!oD+htmXCl2nyhK_99wg!{G9CsNhK|t3ru^db_ zxN>$C9(30wHv_dc8z5b%<~0j(0|#2&RI`#(sOAm6aB$%R>Dy}*rtxj3P=>xIURRVX zVA!RDuKH}P>^jD%A-+prkk?X4g`=oqKIM>0mz(T$uDI5vY=e?ynlcV63H@%s((Dvt z{d*O;)UO`S;HY|{mQ`~UW_ScFfGbQTk6*;WcAvb1xwO4_F?dH-)tAGx(g-)n<6mb} zdA&;`57-pE`!?KFKT|`;m1epAXb%g<&#E!}E_FrSNeNEp{IVfGHf++1!n2C$)qdN@ zqEmi!dFc2+83aB){An4gY7#C#DDQMGibroK$(H6bh=ZwKM47JkXvD*vHgI;CHbxcO z4hUmR8}U?QpdJWQ*>1Ov5gs#b)R{KzZv4a$)oeQt^Im<r5_rqBsnK>$pvp3LQnRTR z28ix(azU*ZQ{ha!lZ<Nq0ukf32{A6E5#LP}zaO_v)VtWWmohYOG$G2+XX*dXkH(Is z%G9h}*5f3xwwlY-3`X(T!?@kk;*zx3Sk2W|B5a4?^73A)fDOw3nepg6r}F@v=XeYC zTeu1v9nvvmRmS3^iMkMz<m;C4Gj-iE^_Zw_a0ES2hdy))7BIH3H8pskeu6&x-tLBf z^)X2fAh*U#Vg4@$PnA}ETb-^Uc(A_GIm)meIM_`PmQ7vr`^vkk>CyMI)xlZkkKiqx zvK@zh1*Y{{Q|)q0+;&uW*ST`hD63;LeO6VgI9e2kY3o5eElWV@*(hl{)ztH{|HLJ? z^i`mU+n;zR;IJKYm?j+qQfRE^%*-yazkFSFa9hMdjoA0wCLjW<C>KFDIW_WzBltu@ zjKfZ)%%(~;v`p^0+f(hTB~v==*o@~Wc<%3F=d~-{sgaIx&8C{)64Z3ebX_}EWDzxz z!@oyy=-$t)pP_Nomz;I3aHd8&$0@>WH2|cL1}O-)*p3TXD~!Q-y7yhU&02B}qoe`u z8gWEOoN*XuAjC=Ph{GbBho~55oZ2wRFQhuLUq_GPJnFVlY^(nuPPm1+$*H!Zrd8YY zs89e0;|DhB=^GPcCMt^VD@eW_)4^g_n`#z<AE2W()!=Fd+AP*ly_guqh-!DLK_3XK zE=o20<SK*-=c6p?^Gw}NDv9N`$tM3e4cErwSgB7Q-_KNI#DnQ^JB1kf{A#AMqb<O< zc<e5v8D{><{+ad8WKFfzC`M-bcWB!fTi4q5Hb5v~d$540CS?PS96gE&DL`_(xbLOX zms5;NLfS}bx-Sh@1%e1g%)U`kLJQ~;uB?8GCS(+@wy#K0^H|BQ5w38KiVRH7w0$I+ z)L>#*lg=0z!^w%OM1oeQI*Qdmkkc0v6h$!Mn|@&*fDzJ$BD-xx$#&CnT(|`WhvH#p z^{EX+VqMYdkphmCuaOW;wYc+aJ7uboah*#KPBT-EpV3u|hD_b@w$~_!e>7nB|EOP@ z2*~<+gSSI>6h^#B*0+dxtcD0DU|^hN+FGMQ8&pZWtXZtiGY<bgrR_mfN!4K6CK_CY z+g!S1fjc|blMS-+|EOI7Jz!DXN}XC!;0l$L=KoPAUgkOuQ%X4&i074c_WcZCRtn#h zN52P41Yld;(p!|nccgsuj_j270^fq{{FryC1{r=>Qab{*L;=cul!VgZR7>3bi|{!! zK>9O!y&6V1+jdudSmk&{nZl8_n|`-T_jTQ(R972TnC<8m?8-uHu_J8;>4A8s)sG*R z1@-K|FG#qiP5R_w|2d%D3=OJk+9{Ze>7x=_N}lwIg8Ipqf~2c0PBT-|)zftWlJ1Y) zk?!Uo>Eadvrp0Nu?+8k<u}Z??>u9H~MHMATzor`0O9|w(%GQ;JZ=!`OPGji`Q;X|T zR<cX7YQ{*&;Phr^r!+O06}hS70<)0L<2xlKh85TKhSdgZKi95pII+M0s*@|;0nW(C z5c+AHq69Nf2t=#yC(ykvg^B{&zBDcWGm`z4-I9GYt7%rXl=5k_sssY9g4c=n%ZF&o zU%2EnIX`zuI|8Lj!i*H$mkNWyf8@PEi3uk)qJUA`po_R8J5LOAN?!*4jB?B1*M<*t z0xN!v-0xmGU46e$jT_3T;0@`>g{o+5UI;VKWvzRVdw1Z(`4!haGeF+B5T&l`66N}Z zp^|I~^k%y4C)27=aXOjMe=$zHM=0HV>6XrNvG)Osv5S5-IBV`_RPG(RvD-pL*+$5> zFQm$1u3y+8XVyvmpggsTY0SfOTxq+59Uhq;X@I4FiadzLK3f%357;Gk42vBo2TnBM zV@07-^OMdvEvVqfiRTT6!KV@x{2U7;$bYU1Ho*2OOq!{#@qbL!qh3S(A-@NzdcyXp z1^+<74}ZVQU1v{p)wv8aIvt!NQ#eL(yk70VCH(ul?CTT3rM^N_SM?<B`5&V>R&B_r z*(Vt4sx~_|ngbEQp?jSx&m!ZREB_&us?vz>N&_E>ielRGg~^w2wu#syh-h54C^;8Z z>I%9H;}5vmjXQ_f0U8`bn(>&e+ICRLP1!Guv+Wl~$*(V<`i`O$dF6u3RL;;mpkCI_ zr`tq7h2x-hE|7%Mt%3n^B#`6Rj=v$#8_+qWAE7_C;^_1i-IHxI3)kU)L-4;O{Lkb+ zZx<z}?MLaLX-#9m?2wuRQ4VQeAY9rX&`JlTrY(>p>aTDO*(TgH0asIkbppQJEnGW+ z;IqVoCg6S>+Mp8&S4|+{IC|Q)3H{qfDkvmzG7yK-qa<K_8@acD&LPQAMFz*)*bFEX zl3h7yW!Tkaz(BQJS(A*LU+b$K^%={c?^2<WY$%^y=;JVL`MMwccgpPFt*7pY7bF#3 zX+%GR8rC92puK+}3M^)UdJdqTa^{DqHWV+lTp?%9SF3vPe55m^0XZJ4mb9&-Vy!h) zZ-7%m-D%P)E+4)Kb=JC*^I;~%G>7e?vJkj_QxawmV;fC*^!>A1ToJ!Xn_Aj6q|w$W zrc*A!Uehk5U7jkSd3G>Onx+fsvqWP;6BTW)!YFtB@YIE*i+<@$$+?r@)tgI7!rfQV z>F)ucMtKtaCt2I}>A9fprJ;1<$YSZpRX>-`l{6jcm^?vb;(>We!py7b+Z`{-Z35OB z&VGU4<DwzlQGLK3i1eS+iFz;^a4D82Mae_)@dTRLeZkDwS{ZV58o#3%V$RMLf&rL{ zsP6HxRy$TUCA(HQlij9Td<-X}=8UOs8*(}|KL}M)RED$z*{c^L=~0{$D=SGZ!b3<@ zj!uMZz~%J2Fr>Gk&|*}G*s6WSqGY>#_&Ws_H)3KnSo(=^$p1Pa%GL<>>|!J2fZb5e zh-3~MXdx&TsEy`L?C-VTie_lo+#!v4+2fnofHtaKY8uiwf!G0qDHBi%Rk#jp0EU81 zON11#0Z0a$p3pZ#^h6xCVhtUI0)yYwKrh22fP8v6S3J+04eBt(I=!g|aRDN7I-skV zYG1)!4{6s>q&?h3vzu!0b!jwK3yTmmm}(!;P-gM|rF4tr<osCwMg4rM|6&*{ZSl-? z>nfT9t0L)?BL$W-78<tMREw8ccR?*Hmtf|^+p@I&p>~$;rbqBXgIZnX=s?wfE(+GW zlMRFN>~C?(RhX70+_knK^~{Aa(|PKze<Na?v)+EmxuS+5(uR+b;4_ZS36~ULIr<@O z0e2zi`+`U3(obzCu%L*RIE13$kPgWYMQ{zI=kbLEUWsi;L@JhE79wD?otl3S)Q0K) z3-~hnMZM{PuPEBAbk8&^>}BtdnInz6s+pBgw9@SstQN%H@s^He0Bj>fhGOfT&Xk?< zv<<w>^B}BFcG^B)`T<`Z6h_%szQSf7+6C;@pD(?<8`uqH2CJ*EcW2?mOv$|y=%l(R z&bqWwHaE0J7@Todyj<WGub>k|{~o%Q+hDMS5(|(9N`g6R+D$c&5O(Sf{r=7&P#9-& z_T>W?)%6k_yrB3N9b0KA3AYSk*9^oPl!U`q&_U@tFYdqfM{QD6F!o$n7S)>vs7$IZ zN;F)8W_=cxNNtnwWmPQZ9$L)vYBBdiu6iTxW<HsWJ1(weJ8&lHq7zZtQI}1pe|MeB zLbbW)`CZ2pfBuJ5?NaS-hv|0>s9AWJZ1MJ}_4xV<#uYI+wwmN>8mPhGl<eo|c`wSy z48tPZ=}fT)FFE1B!ZhE`M~0^zg1G!Z(nLtZi(alm)Ha3pEO%k)f&VS6WRGid*+V+` z2J|SH3QSS?VPJ--rS^;vEms0Yb*c1{1jGkk^R7EP?pkL_EkG4q&Gc3B<cc1*kZv#M zTSzl-*XS_4vWCr<M}_Y*C44hNK4@Sg-4QpEfSWz|`X0S0B7YgiD8r67LW=L<(}R3F zHSxQ}>YYzK3QD}}aNtZ9yYwlwxukD1Z3mzw9x3m9K+v%P_{uznZ(Cnf9%daSyq9S^ zA{=l@+Du!M(B!nH3XNNC$B^@ZHQO?h((QhibWSdg4X%Z4O{Ur>so|2TmafX{XQiQ- z*YuNo!?uZCRzSBAYjNlFsH;9thZ~8f%DLEGlc@$3OF*-gjU|M?-yv?p@vEuxmM&l~ z@0*JoM?1L^@vj<s2=)S=9Mvz;24Vm=Aq-`hbh!Nrd@)c;ea=XEExk~B084unj5+3L z9EbtkvxF+ep$~H&kWW)(bH}Jej9m6KErGi}KMc2khnEKnS#yA{9aJ%(O^rRE6^m#= zvR6Kh1s)qApDt6BtduXDk~OnlKi*wGG<!B<PP|!?KG}tD5FU_A8hh9z{@dLs#E!ew zw?t8i2z+_@OaZQIPa0rpj2k@O#cu=#$@OJeZLGhsH%FbY_Ug+@hY9?Eg|VGx+N8cL zSJa0ntGb@0{LFnle!<|YF$!+>P1Z=?%8lFD9wAbFHn?f=Ra^PxZES!SCb*=JTq(y~ zw&SMXG!neRvThJk7hb%rp9Q!y(*w_+sPZ4W(>O}rHaED_xM?mjmpwj3bQitbwFOrT zkm-E7Wzp)CwrARoyQISzrmS7y{OYrG`VgXBk1<S^^bdR>FNT!;)-W+j&Y7!nWq1=A zCO?RS?{O;$rw3x211UD+MS`0F$H0umcTf#)hapf?qdHILqB8db@@{;g1UbgnA>!F% zuKtSa>~YkGh}s>8%3s~BW+W?jD@-~6cl}`!)?olsO{_xI$7RyQOM{7@r7sb-oxRlc z9D-j~m%f9}HtisvQO&ad?vRymV7gN}2#KO_CLs3L0Vp1e;S5T`{Qm5vHhxWAf_Q;_ z!E5TIoOF9lz0*~I&^Hp?g)op0+&vF_SF^+4Iye(%pscwKc~hk5y^~ftHP)L<8*kSb zv<;4BC+JGXw6(?Y&X3D}q^w>ZKwR~q#u?=Kh9Lwt&w>ybJlCXZx5iLCMbhtuS&vwk zft^@2fz&SU%c;9IkO(%7VQIju`bVR`##)_G`+*p-8S@I59B1F}-!PQGq9qKGz>*pG zT|p*3dP8ZC6T;LIMcLekuG6Hj*I+SLr%~UaapUAb4-s-^gf637=`vbstDmfQ*3W_U z=2_>;Q?Q!t?LV&(Vwc1@Z2Oi(P&t}6G+D4twaZ6J=pM?eC85K-x}$*W=bdw4;s<t^ zDx|Pl#d8j8l?Ik`O~k@ozW8eiA*yO>e0t%L3`q0#WUn+(Uq*M663TFaB8)`EvW0uP zay<G5;E4<dpqRbN9$3eGh!+I6Yw%p+o&mV6vWZF{G8yyY##UXuJ5gU;w<`HH%6;yZ zzbHY<WxHmS6}%t$=;L*XF0OCRUHE~k-lfm1&(-Od%yLV+P^VV?z$J5$lwg2taB#LQ z3;3BVUHo>(%1MUxX3@AplPPIkb=p9LeMOqfZ&aYjRQ1U=1Jx1I7?Oi?+$mwS!}eh? zC#T7M!fE?*NneMwgGa}RG`_46Pdc{J!_(Y3*i~00qaqt<f;ubSxXZ>t0J#*ZrW+?c zdPy2`vuaq&Sm~7sDz}5o4!i5;?28gDO2UP{NNcOOvb|P052y@k)`;5D^pIb`=f9{G z@fpjR*^08yc1lcP5(Rq{CE;uz^*SEvGp7U9hv-!J7PSQ;>6wpBMgbHEr6e3l#78Wd z@G0X=cO(+3Yr!PXEDk=1g1bY@cC>~vhPW4J&zW)g9SSMziYdW+8dYHZ{dHJ7XHZu# zFmojt^~KsOU{mU}rcGh@Uxz!+ka2O{B*V(Eh1X%To?9`=i0V4(=*GYqtf*9+Lak^T zi;w?F7nn4`Q54_zZ#UF0iqN<u9n8j}EbZdLu(T26nqquhGXlM?#2do$QcrLSS>sU; ztB@IL(=n9;CG?psU<(}Yv6+0Z|6Cta?aEHOM{G*B6+(ju7`{ZF`Uqp&td9EedTi!w zV8ejN90TsUbKKz@Q_XEukwXT29|hvE5WRRIGU|);YAL>SNeNqSL+0v;m?A&_ASR8k zhP_DLn#8`DlF5HSk;l!!ljvVz!P;;KDMR|^FB6>B(ZaBmTHy7^Z5Ia1ul){VC(MPY z8TDmhn#{tTuKH;6N{wS&llW1FbUL$ee_*8DdXGj(tzM`dCthp4RVNO0)Ze6c6*jwc zdt@(5;ToEP5FVCUcmSNONx~in${c;<NZIMswc??t-IXR1;c8YRX*3#Lqn5a(2KjUt z<x{3pq0F=~;@_RRFCF}bi2Pv@=Xy~K9jqj#LJ8$x7vtD=21+P57Y3W{BQQeY`7vXp zmM)&h(hHv(a05FPtHTLAK`Oo^kcyAA7O@A;^E0KvZi(tmqo>bS+*WZRN2=LO*{t}k z59QukfM}WId23(>ZU8nxcZ`W|&{s5P(v$g2sV{v_eXlF!J(uo?{KlppShi@Mn1$Z6 zz=t)VdjH;}vtV+{b}aT^5Mz9dHm@mNAx%19*e1I0B>|Mh&Pai_LjKLAOL#I5D53CU z9JD`qmDZ9=_mdlIf2u?J&`k;KJq((1G*j1CzG71kTxnH4;*>>XiQb0TX<(&1he?T> zooUeHOtlZu1@-OtSOWGBTyDK5AK2JKl0)+;M}J#i&e0!~C%(}`&>!#Ood)~L)l{hk zjS$;YgxwfH_fr600zvLRHq$l{)pGyJrR>80r5OJ#>>>w*FnJ&+DXY8g`guXuh$1E_ z=Z3*)42-ET<H6XrqVuBn*X%xcs`Nh2^~2@63)t<<Nd@Yhf0+Vvd1gM{aL+!w?L5$m zxK~Ly)|+X!?4u+M?M2t?7+=1K0ZHI$n5M2+uMq~G*{&55<%k0H@I?MFKe!qAF6A3w z`PYryM^Hih7)8Fr$)x3Okk?{^cKeRc8+W0MMK=l(0!wi@YIUSlp{U0Z`bL(PaAgXG zokTrmm^Mbaq<1EracTzYg`xNcZdA=~p;zOl2GhpIs21CIVjoxieM$heJEIcep90~w zZ(SzmPY|?bx7c8Hchz&wUuX;!JlV(OJq+FGpzm^*+-=)Q^$*kMdeocZ+3BjjeAEcv zo4yQ51z67R1&%0#-rW9394`xZbrzB75TRRnCwtAT>#cGsIY=Kxw_OzehIOGFfPz7F zBtdmJ?A8=9tXSF~m}=UnD{lM*IEL-TQO(5;+f=hJ7D2BC5ycMO)cC+PXzSy<5<%jE z{^-~*5O3PlNR{@Rg~&;!jjIv|()${Hfw;lBAIoASW^ov^h$x0?2fyN|7Dy(CWs$?O z$YELJuq<*|7CAJFZ6R5#p;;8$-Vv`Yw(S=pT_|*ytnkvCYM$Y5xdj!juLg(y4gOZG z(rmw6XMOj#ukb#>Sd<i#u&!4!_4*Cs8JDs<)3#gCTjRtZtZ{CWvk@4&P6|*%^ojXT zn%#Br$!?^FEL1I>o1ExQX~{B8de7sQ1`I{rC|S1mD*F^WmVHXvv+AEf?UW7}LcvvR zcS{f#d3eCdydCBInYh+hF!<%m+tTP=uGBlW+h_2Fte+mK5W&c#0@oBWWqctakVlc; zkqol6`Z7Ouz3{GXA{Ay?@P@3E@FTAFrT9JaQ)z0bj)Heds84sf$K<6Whj%U2MAkWX zx{~~4_T^~N3ADKz4;tgu*<CQ{67jc}N0g(|FULMKCe+fH-OH?DxEH#nQG&ma6tDsO zi@k(Cd_HRSWsLxlGsb+d%!)6OJ4|b~vxmn+V?*=VWu3KCOmvsBvgPW=Zk+S^`ngj+ z?CSQ0g3IfLdOTXtW4+KD%nLe4#EjTAuR9AmWo4(ubrRuM{>3ijlL}{m(;nPrWSf^S z-r3FOrB0e*m-fi7HPE!|cWfvB`H=>Ey$pUIa`+vGhIj`1aX6Yo7l-*AR<B!!;bf z$l>c8HgR~2!!I~I$DtvC!9E<0-~eermcMWkhch|!ak!ep=Q-TW;kz7u!QmMWwS5?j z<**-z$sDF~IElmQ9M0y@%i$6ZS8(_khkxd93x`b{9^vp3hlzc8ejHBWFrUMFIb6-* z(;RN*u$jY;IXuT<cp|Sq4u^3#o<lc>vpMu}Si|8X9IoeZ3x`b{9^&vb4u9m(n8fRo z!(kkb<Iv5az+p9qt2um@!+-Rv>PP4e$JIFuuD^>xLkWXjf6cEj_uKn-@2~!f3rfp8 zMHZpLGRGrWJXNKFrLdyNV=4Ak%(HlX6@{M4$`QuUaD_fkf#3=Cvka{y@Q?n|E5x!Q zOL+yR<tenN&Lq8{936{G%Zn`83x$%3avDGs3TBsiAefPd8*+u0`i=l!X73cg!s{ug zp@&x%`bxdR2=BrLJYQc1AfL^!B4i$^B!#4c_=pGoMvx*>27k~#q@0M<d<|=_a<Q!J znvVJi$A3^^W}*ux;aamkBO@aWf7hpyY#PC0&CZK3kYA;y&dP?t*<!(Yofz^<^5F*! z<*kCB0YZ=nVlV(Oz+Z%cr*F1uXnSnnP@~o9!@?sBk;bU#m{^lJu2=8)gg$)}llt`^ zFmTXd%N17+NgjID)x)m2Hs!kEBSxl<8a-z0^*8*=nl{che!`6t?T$(5&WxKTyE3Ot zb!SbxIs2CBIk_`t&dR&>wqM_V$DMcO7tAg!@)XZ0DZP7c*}U=!?>)XsL7cy!YT>>2 zEn2)}DLsD1pHD0oO6Pej9-ptmXCWkpH%PAg=A0bnN}X~tr%evA66eiXj?8HtF4J#F z9Wyq@=qR@oc)ew%g#|(>G<8WqrDa|LkW~S=3xa2!S3puKt0(}HD)Cs-Eo%N{rL%nn zzJ-?3^1=$A&r>LrEgWIYF7p&rdVny?g@QtX#t2FM>Pkzc==E0kz{gWC&r%Epm{;NR zKpJ42N5hOz%Y*ohi7^hhI6BY}A?>W3Om_(73nitMmV(Mk&%D`X3oS*Wue5xQr5uu) z?_r@z%S(mQg0j+kY4XNg3=g!8D0v{JWwtm6?3RTUqAwKJ5tdBB0zv0hR0>emxgJOz zi{tZDie*6F#g@W?vNFsJY6@{0URW{DOS|5%k%eWxYb?cLc_FP+if2IwQstF`Pb?Im z@bHg%I?Kwk3QAeovD~Av+_Y<!SBP^;ES27ZLJzI3vI@wyQ-y`r*QhS_6)d}lHQw}G zR^LJiAYD;j=o#_L>mxLuRLlocLmWFYDdPB#wxYjSPDhN+Xq0#gyeuUQ_p6^N=YrCT zE^XHl?}i@ZRSHEv6YqMA=M|v_=9l^ev7oG@k+3ysKnypw$Mo;2D9539BvclTz;sXy zravmJbGhjli0xeg_9D;x(n60~i!3~^Cr_0Z`VUYJ)=p@jRm1(NOSpMJf~7(UjPFHA z5pzT1VECTvhes+Z5DGf7puZSK3S9>SpXVOYQ;C@(1x@Fj9||XUeDg}nae^sD8o+KK zmW!2GsS67Jg+l?9CpE3d@_5RjB`eD3dCCP|9t>~oF?@k<j);LPgQdstw7(U@ASYml z_EwaZ3qkZS865r?b;FXgw9r>kSy3!lW|q>@rl+I?>&49mMGR+z&?82SAmd^Fo#TTd zmKQ((v3zcM#e(u1AzvOP1Doy&qcNKW8)xBo;rb~mq<sd0T_0k9q>H^C?1m8gZ@Soj z+r_@Ri~Yea_J_LIAMRogudcqodRaA0l)C$??_XXW9~K5PaBXcZAfB39on5^GX47F; zTeD|X!~6=9aCSECxmku)uc(Gt1g7DVk`jX<qRQ)C;PqZM|Ng)Jvt0H!Eckc1-{pTU z;EaCmucn*7&LNhC{AqsSUugX0A%EIm_@~CT{JX3Ff57kZHZA$TO#zyYzhC<6L;;$P zKkYC4>!5&t_U|8+AOGUvFVq(5_lt|n%iY=jOUv6)?yfGHPRqgSWy}3Fwf8@;qHd+M zs{S{>UH#xg53l*%Bac4z`0t;1@~NlSu6yR$=bnGz#h2Fq;g2uB@~1z)y5ax4_LtY+ z*tlu)n_K?+*4tbE*3h_Z`;MJWyP9|J*}HH5frBmYy!+mv!$*!D`}_MJeE8AF$6G)7 z^u%YMfAOW<_Eq5I*Wa9K|Mt7@e>i>S?78zl{&eBuCFP%90QJ1U`9%w$e|P!+-TD8w zFF<?t{~uBRF4wqu^Tt)G+Z3b-e%D#D;AcU@LikbltgMkmMI)IdJBtuU77Oq66v7(O z<5S~LtC-)(elx7d(3<1%3aW=goFi5WgiI03XnIqC2S@1e`bu$+BCEhxSi<Aq<eBXg zIqyfq7L-#f<coP>`j|GRiRocl5Pu=2h3Q~?j6-q?1kqPiK-0O&SISMWzAq7dl|dUJ zvphxRo)Cvzk=e2;%Bf?H$YFti>0o?}gW)g?`qOxmJ?dV}ELa9sEXWZk^NsE^Dm}iN zXWtELj?50O+`;n$e|JHp;3&jZZFYrM^akCT8%vI4LCOVlJd-M_Sj-tY8Pms%9^rJm zS$Mz$&;hIfIlvK6MT}|vL6tzwKm|cPL3Kf`LFGXmLRCVIV#UHQ{pM*m&&W+CBVhfF zc6C2$#B7=jxX&x1@OGZxLRihrn_f{N^f>W$`e_D5lR-ih8B}B>gK{Iups@xrXmr2U z#Fjn{NrS^k%-Gc=Mze~9L-{uk2ATt=ToZ%tgTZ|Ob;qr-_5?x>^dTfULPPCnezq^L z&(sc)4!H=~k=faOKsXry?(yJmD4NpQ&!8oS-07XtO|pcOSj|)t(H_>S^J-HOpHwX& zaRb80fZ2%+eY^?z@u`HgrZ9!xtC9%0wI3n&PkC9Bj3jBSi6l)=Xz$$`*J5gj@kZxI zWoyE<B;2P>)x>K_{A=b^jY&^TW5bDQbd*<P)Dt6^jibZ8aRZEGK#_?I7#m9l_!8Uu zw8ppeYA}1%{Jy`MkPE{I$y4*gbVqBmBYQ=VUPXzd*Vw+KmnNP>c^Qr<E3Lhjkl1Tk z{8z#46qp|bc<-kSYAn&jQWQrlxxh0(z82qrcGf!aUX3}Nn1u*p2K>yUqZ>4lS`s-r zELD?eAc;lr<wlT1@Jk#GVdD)X9^B%=EgszBN1MG#*F=%NV~a>%&27Zo9@`q-Vr(#Y zBl5$uSz9*)f{~UOV%d>IEJ7mS(HC&&LoAwJB&oe`YeGv$UB5mK7Et4u`F6a@5~(AR znzx8HmDjrvNs=J{B*;Gr@=qF_(4a{)0-o>z-6aCu0iLuzHAXGgcWNA#uP74AXCUV3 z(G6-|YbO!XHyzf9yq@DQ{T<PeM-=2?47RUY$G>(G@(g^h^6*!Jc`JO!)pklSkOTp~ zq6m@zxFw8^YlyqttwqiMxtj<%0pB?_KCN3L)NLfxEtsc68B9PwMNvRUMq=^-9Yt$N zv?h)uB_l1o4z%zWpoI;T7O<|pu&#`wv=%{WP0g#<G(zUW7k`4~l{6UYVl41)zK+(y z_|{-OKphAGq27`J7pRLM-pi&FV$11BD~{1;s_Gv#3;HsA!&Uzf+E?rHWAJZ-?<OAR z5}1eP5mKzi>8&Tdp$xr8n}Ttc-%7}aTRY<H1oMSkJL0gqG80p-iI`r4y6S5neF6Wz zxd0)pzN344X&W7if;KTidw_X*Tq`YaXjw-mwDxX^3(`q!J|PF;TdL-x*AP9>P9%qF zxXH7jzrnZe1cP1u9|yOmW-~LwxV}cf&kVSkNMB#?_PAD4OH4ylu+8knguDk|BhQzn zH@hRf+&P34!uQb$1~mht$v~jpfj~n8frbV`Sq6?yYVF$seI%5QrbFG(GRHuff!=eW zt-(FX2jL7FVgQ`kcx9k%M#~(bB@vn@h^ALK(43j{dM(x)lOLVU(v5_44J=(X-t=%U z9k-@yv*YME7)kwA+>g#D<P-Q5l^#a|-ed344b&9tx*J0*{h_}48%h77SkixN4Cz0; zZ#!!xQ!vfwrG!j?Z^UPuhT_6W+}LOmHyvx$n6HK#Tn+UFUtb=M;T%nj4*||}EHT4a zVuG<GmLxvJ#*(DrF&Tq}c*wsuv{x_EJ3aO_W4oa>yhY!j<v8XAX)q4T3v~Eyls9Qq z%=JSAGZ_ryeSb)=@0eb`*!JjFV~e3dEt@qM59k)cP}+^vlGxG4)PGdwjgLY<dbFd= znm$I-2XOBL>GbjSYBjgSHbi@)@>%=6!D%E8Xv7ROVuCu4B?BK~G!jSqOAM4Rn)IFC zIiC}22{Eh-sWaZ^lX?S9ZsT*h+BbUf^1v9a&VOu7f&K+!VNy|W><*48Q(u7b3BC-q z?P&N|Mx%fa&}OHxc;1VIJPhBRJbXNucfLf(5^kq>&1QHFL;KZH8A<8!FmlGUN3}+_ zL^OnX_4&F~we7qr?z1^u4mi-U8^#HsZ$4H8$AowOM97<eCgjmj8p@3$#&^T{90}`W zsNZ;~U*HAUIG!5~^$|tK@uXzq^?k;~ZR?6nkdBZJfrb*N$G3O1qLKHv7)S@wdI<Y5 z)akRG`4D63Kkh3hn+O@SD}-*YFp?|ACXp+?>(`#x+NUMHp_ex<->mX9*>UkY6925( zYs&8!e-0jm@fW@gp)@fa_@C~_q4th(sDmyvVOkP4RzoxcBFO;Y14BxZ9R=k`8UpiS z*H+7BJX=+8&V)M7je)w3Ch-rMy{T~>TLQ&+9^FoQ{QXB>g2DgDOECEFmY2xUO!ky} zd<B9hot=oK3%;_9`JQrEhwTDC0i^=cD~dcp$pD{zRzaz7Q-v?5w0usPhpj}(BP5;5 zHSl1tsC-?Q;}Jp<brqBsmBIS`G^UzWQ6!dmZYnMFOe>h@fzTh2jB>%_OZSxurG*7$ zIUaicN60r?x2Isf=Q8&nJ5pf@13x!XpHt?6wfvP@zIt{P75OO6;hIq4hI=q>dd0kX z5Yb&)4%v^#7_h|l38EJl)eiEsZn{u5qkI9ZmNTlz4_FqKPkM!jb#o(&QN$bx`8%eG z<;h*>^^gYQ^ptso%h0yzbJg>?V12$!u@QYfsB_iPt)Ed|LQ{s^3q4+p42cW4{V_xj zxb*1VqRp&ydS;7r=6HPBP<U*}wOE#!>}Zu03HlMbxhpE>ir$;}VJkEM?vp%-KIsKs zLG&R_2%ai|e5v943iMbEMjNfmQ{cVH=Yf(xOU;h5vWh}-2Q5oBRw2nnvm+hmyLhat zn=`V|{663}v!JZBh|*NS91l4PEsr7r*?7JOC3q9}W<u<C%}r&MkO0IIJ;Z^w9Mv`v zZ4`}j*g_!~z8X@ix%6~36H0v}hG(dfC-k$RbtnyzcCEXjpokw6I#73dX7F&lOB*`M zi*mfB<%|s68q7SS<FqqJKuHH6|3=z(F7qH+J;azrR_JGy7J1T33VgX0S$L8>X`$dD z+q+K(sQr($-l5bXyFf5LQ&-j(p?B+U5k0<z*&ZJaQeMc&7i#rxY?Iv5!nvHDU%8wL zp~7+~mD8=6+*0VLm6XE4ME*eYneJhgS<8A9>+8_UkA~QxlL98`Q1fDC3C5o!78iSb zK>4j&cX}2SfffmBJxLcVcW#AR8RXN@P*83=>v?Fyz6SBqJG<aYkJ2j@%3$4@oJ9J- z+*Pt7FSGiC7AC|=(#t9;`A9-mGs@ujJIE6urMX!YyrO_*{C%fTvxpJ<WypwdFCP&x zQwPZ*FyMF#e4b!wXLfc0tUp2=L)v;~fv*&W793=1#`I|!?lGfB6qS_`Qlgs<^h^nt zywBnk-CWG<S7|$T4zYZM>{Ul5hX5JP76nhGgZ#^Wtr<)XtE;`!DT(<Xr-MAU<{yUY z9A5ih2>+koe}4b@UH%*W?D64`!}@Cf9hP^C4=Kv+*D!h4VBh+I+1tNokSiEgs*OD+ z`A_{Yk3OWMf9p6znHp4Pg%`8%js(6qh8O5jydUpG7&wgN(8&FwLj3yhxCl)=T{Cx! zgRd9=(ESSTem%E4xILZQvw589+&zcGSv>t)dERB*9S=b)gsuArz~|$*hV$^%9Oq>m zF6aJ!?q9>x!6!RV-1cd1e}?1pJkReX?!JlRcYymJ<^G8gtS;0#3$6FA?eKHIe|7l( zYW)B1^#7~z|MUCr_?dhBF@H;szke&*|FU1t!WYcHXW@W<FW&#k-~a10(B=34caj*U z-rLaA>F0Tv;PaO+Tz&=je(^Yi&%D6kvbC)j5ZaeiQ@9?&H$M0NbCw>GUv`N>JBM%l z!tf3bH$wP>&wlo7Kl1sr^0UA0IsGNiP}42IklgbAo$p)7UGLxh{^-lYzjy58*7Jmn zTEb%faEb9zs7n~_>0QGA-<oIa!#l6r{-^nC$j{eB_UP{8w_jlOTdm>#ItE)(8O-MS zs&Q4jN|y?67xky|!FfOO`(oTajN2o*{oHwGSJ~oxZdaGS!?-<84S$Z=dvSXUxA*4u zb=;oF?Iqlv#O-!&@5k*1Ztt(Acb3@)aQk|0AH?k|xP36UTe#iA?eZCBSNmoAX=cAt ztv7D3Qt{z-RqiR3+wWD==k^QSp2+QLWgECX@ri#e#PtKN1J)7NHeI(ORC@W2_si@s zMh9*VT^u?&v~xI~Lo0`=91i2q!l9W%!r>2k24xOE<FJ*(4>>%>;UNxNINZl!Glx4k zY~b)M4mWeSfx~qiuHkT1m-K5mT*RTkVF`!%9A<N9=g`XGSPqAAXy%Y`7^&~vpVj_2 zqDy<&dA}~3^sj+S`A;1$)I3#O)b*wMtM)R#_HWrZke!oD{+VC4^Ph{~%JH_0>3)3b zYQMzS=PJY>_IVq8$N^w~#mA5EwJCgk_<Q*9_%ao~Y4FX{bfk;%#u2ub#ap7NIQ4b- z@Exn~;4?$mk?>`~SN6YTf%K2$$+ca6I{s7RTf_Nyz~L|sEgb%@+p~lL^-K7w!ZoBF z;H@yBtpRgBz?XY7_YD9K!B-TeA+5df?3s{Pz}*b+YxsUJXgbMDhRRbSybC75A0Rx! zSK<2*%m_EZw-3w+55xBsn9l*62b1D>h+75lHkc4gVl{Y=oA~=P9BKfb;O?KHoX-Ge zjt6-602ZbU;KSU!2H;^HCKo2mO@o;kWdaTlW?_y2RNxzL($Got1(+y{0EhJeZx{mo z7~H)8lag870RVpw-y#U}B*5#3!Wax@!&P9uiiNQPyoZ|wfGfHAd4NaZTLs~d0gStv zkjKCr4{$p-?*KUM8sM+NyaM2<YgpWNfV)$m4#9mNz>iaSy8v7^9Og}EiyDA4V2~UO z<~)G)@HxS}8sO0pES+NjuNevRB)DG(@Q?82gZUMJ55k}!fO!qTWfK4&OmhNz`wr`8 z2f(%)VGaQIlK}6T2yGXsA#VZva3aG8;RS9+ILXfPbpqUAXL%tU<A69|9t-eIZhi}( za}uK~gv;QIhV*Lyjs=E09?S^;1m8Ls#5Mpto6gcd2k@j5@Pshu04~pfHo~|7BW_~( zS^yd*6S5lI5xOU{I!E{ueAUr_Gr;MYtX#PO55m_1<_iGLQ&>G9ylpDb2Dsl2@SCYD z{dR!wWdV->?uP)bo(9vXQA45SW=1mzAH4;}7jS><7OK~PI57;s%{i>z5RRU~$|%ev zWbaH?#(e-CvrwlF^izPfvsm~Q0LSG){{{E)02}gHxe$Jq$NLMwB$!B=A<O`PPu<4c z*8%(kESD~T`zrv`?tnUnG{*xhxC`(Ga}mIo?qYeZ2l&-pEbd8w-{wQxfcp;sqY7A< zXn@WFh6BPy+>G!wZnn>c_Jywu`!&Fq;9G_11Kcs2rPB=Xks?;NI{;ok2gV<8&jwfv z--lpc4RG5WhR+UwVI?fC0icDO5k6kR@_iEE-cr`S`v5*M7s?J{o&@+%8T2Edfi(bc zDu*@#vkTxF`0VHoaB>CkmSD~YSOZ@kn0Eji<7Kol7T`iJYwJY-w{!Eldw~8cp)3#{ z;f_icejmW)0&D9UfU`tq&I9-zd|n9u1Hi@e8GTj*JOkevFrNcBa|zH5nDYSEErmJ( z^D2OAtDzlZAYXvDErT`!a}mI(8Yl~xqXA~t0sb-gf*2v6!dDIE&j3za1#}7KY=D1< zZ!?(jt<u<sfPTPi2AKB{>zfF_=I-qP7d{N-1^gEQyk!kD=K|cx%_YE$TzrJJ1u`_h zdJOs(#I*vH9%Jpe3Sjl`VU7Yb!j|8&x<c6J31&_PxD&oa2-6I3%G1!^V0Hss^fU{D z(7Kl8g)n;^xI-9(53FN(tpNDsGf>Z9Mi}!P@Q{F~1>nKw811zHT=YDwy&w!i@&cbP z0KN#{W8mHb@Z?KS57;jNPFxRT4TP}+-1$eq6U+l%CS>?4Ed5k~(km>TRRDLrf?9hu zsK12h{>1235AcOQF?v`J@Pj|Ym<3@zM7ROwXfPxE_5T4{1alF<nXdspV9o<LdK0W4 zktPAYy@|DB1Hi+ZnfVyN6>kB~5C-Adw-~*h1NhC`Z0<|m3OwXihG!MPvpWHQFrNc> z_bw<S;8q6k?t@U*Xa;y|3(yCcZwL5o3v2fu0E+LixwQ(Q`7q!N?g(Ez%*zOH{t@UW zV6FnV=?KerGeG~}0cY$Z0P{ZvngBDx_K#Wm2tPW`aFzkS{0Xb)c7Qj23iJf+g7-4; zuEZ+rFQ2kI4~GCBgpY7D!dJN&;bCq@+5L0ej1Xno(Ts37HzT}>n-Si{%_w)il$#Mg z%*`nO-N?-dQ9c`SL#S|fgeXgk?g&S4Gr|mRMu_sQ7#`sQZbli`N4Xi{1|A;a1^BYf z|4W$v|NQ>TzyA+VO9KQH000080E7xgP7wM0DbI`m0000101^NI0CQz@b#QcVZ)|ff zXLV^VWq4)my?=aE#kn|qHhZ!;Nj5nPY#=~@07229qDwUECa^Kt5S8G@m0cnv!HP6) zX-mU7fL8*+vukrQY^AN<>TSK1i+(S?xA)ez^21hem(YX=$}fL_P#bI1iHjObOct`_ zyw5XdHwoDL-oAf*|9Rn)bI!~>GxN;M^E~rBGtbOcKe&T4avaCQpQdr#eop`A<o@@6 z6#lYj{2`lrCH>8r`wdIpocTcGqwDk6HGTivO%HuH|KW$e_r32+`QLgZze)aH{-fW^ zuei^X|K0Dee&pt?tc-$089koxnHO&RZ<74`VgEa17yJGV8G`q;=3??9ybrFrkp$S= zL4L>HH<6R<y@>3D_x+DP+=%)ACtTewj$2|da)#fMnq*uzXEbCQ(mC!82rSj(CR_&( z3ro~{0l!l?E;W%S`R1Gkz0>sM76yp0Bkz$H`?uf{$Ibl*`t*PM*V=#0*mUct{7?UG zmLAz8!Ta;B1VY$W{%V+fj$3te)9Qz$hd8b=UoVrJ1%Gc{4F~l)Z`Q%M!-ZI$K`*oK z8*t%&yhZ>2zyF*6YDh(a5ON#Z1ZSX2zT{cvEj;8SG*oeu(Qk0mO&J`g92RVv?VMUs zVCmpyh1MB@pKtL+O`)G-ezK$>w~fy%St%PANApW&$y0*b7K_in(o46oyk_H|P3thN ztc<4EH1YsKPiQrjS33T@xg9{W8K^f23fNd0I!v=VDh*tH-HO`wZ5PZytvg%BmvOek zYM?-Xke9qtkPB}gd5yi>(#Y{ZSeg)8UBH!<+#>TGW!lO%Lm(`F6$%uXfk@q<?FANK z)0)r&1=jmR6$MtekNzwRE48+4E)X~|_#!k0KFuq|z;o~k88Bl_=xLTw&l6fwV6E}e zddLXje8@c7bA^XmHuIS)Llu0coKe+Myi&?Re4s+J<4{w22ghNg{H34sjg|$a=YjOS zpI(9v@EaO=sFLy^kw_o=2K47ay4y=%Nk?SoMyDmAJ`jLe@r(5Ny!08CY$ec4=#U1| zQExj&QvlCxhq3?Kk0t*p7X%n%AK6@xM>@x1@8{jL4ay{I3+A%H&Qt3+wOBlu<|c#c z%7Q%lFRZ`J!LT%5Jb0gBaSd%{F?=vAf6*o`Ze3E47wD3{Egn31KmBepNlH^T7g#uH zNgEW2WKteI4P-KTpxq#kw}tIURgl7oPlu7hP7VdnNfr+hMVX)z#YNjW7??ax`gt4F z(3)Kt{Rw^moRz^%1~`bAn}7uxvv!y`&BYNHSE(*|0&u!RJUHoode)r82^z52u-HvI z%_9wHSp-CIyQXPCg4PD0Js|sbc#}iyYoz}+7x0`sekYe-#z8^pe$K7saNSOBKMLV? z=-=hGu)o3$Z82ke;Li$wxiIE=?oNnArlD)nSkquE=TC5Q5S>>6(OQlL3WEAq0&(z2 ztGW04IriUxPq!aH%m4!T<~8pA(8<x+Fdr#lr<)ENbw&*<hnKfQ7x2KCX1{j7nuVBZ zIRcgprH1$dca4_A>!qYMwm>P-{e&;Te9*oGaab8~gzn}N^g)0C3J<-CZFHOstxMT* zQ|LuDg#)&^gl`RPGU)Q4&EgE40($B!a~usxCd1|rur$BHOK&nE$I`|lP~$TCcqZiS zyoQ4gvhqJ5u`PF^Tp`xq-XG#`X*>)$-1P2DCT$7`|6Axf$QCt@;#YX6(s41gInA)S zqoJPsscuDbz_wk;O&KdctPmoBf_!*2a>!v&PmQ0$VbXG}&@0HCV{rn8wxZN<9NJ)o z`dW%_mdwb^$iI%r#xFaVEU;E3`lGGNfEi;XXYOC2$Ft_aQ?-zs`S`Bly{cOP@LU*7 z`fslw^TMDh!<xK+A<~!&V05W5F{n4BFfs{M8tZ|x5q03|dFja2*s6A)-h`(M^5J#A zmoE4<2*=QC{5%v8<wTbs1}wvp#LwyITyJR;fG09qE@eomEtj(7s6VBH!D2Cu*1uwJ zFV9FayNzV=*pwUro;%Ihj_n0`0NIvh!GK;nbZr5=TDKR>MU);W5blQpXQAw+twX?7 z^PzzSHD2iGx%B$W5D^2cR1mm9P0sW-cEcF=qVnkhQZp|jzb=>uEe!F6D2bdXoIW=) zS*J=MiYhN@nreC-$pw&9I(Wxlw#;Dk0HmK!_&>PmYzDFzxEqs)Hh;qEr{=LaS<;tV zrr@;1GJO#no9W8tPn6dR762YxU8f0qZ-wLn5)_D3V1{|%l@}S$c^i)*D?V#TjM{n~ ztA_oUam>K2Pa7FHlu<bGB9q?luAxuHHO)=K*iYM8!=Y~)P=qfU&7;%vP7AOz$uh$e z=I0ukcSX~nvO^ZmZ*J`C2Ru4vKy3r6++z!qI>GUQ_)OT*A?MR?L3}4S5peS2Kl<5p zHf1PBwB9!%5=60VX0X!RYMtPrzl8SGs&agw-0YM$dT7lw2rDs7nySQxrHSN3<Z>!G zqI@_b@}bFSe&&T6%eZLjtIq<X4U`pZm2W`M$p~sCM<SO}mF^jlZj+G@>45tgptGPw z%A-f7UyYeNfmwBrW|w>9*&ezcW)l(%xh!t4CYwF<Y&KAwtH<M`U$c28uhSJD2H8#1 zQ6#x~s0kX|uE_#jf~{!Z&soa2_MKrz8Rzv|>rwLUN3}g_a&$DOk&a!Mf<$&OAHZvO zy;g|QU7qd-hAqN0`qEViss1U;>)UOoUd3{wsXH-RHK!<%eB}_o?Gj3x&7b*)>jA<7 z5I%A!5=$j~5Zg{JE1%AYd}<<m8g`KY9gY)Fih3(#ziZp2b&z56TMf2weLFoh8<djL z`7qd=luCa-6Xu8_tc#}1#AXp~8M)vkvcTHs=xds_ZFm*by>SY8tB`ei#8N}Y&jA`* zYDOESHkzSy<a@Q8T#$72b$S8BB`7g#^F$?Vanp|rumjE8s&se&aha8HzFW^SnuE36 z5owxH$|}s=w#uw+)wIG0G?W!|Xg15P=gk|Fw^~pxS)tVC35h%m$)ElY;5Eu4agb@Q zxElr@2XteBE;Y@;0Xf(1ic1q{YaWMlaR%KAAEY|23ZVaV=?nv$X2y9hcuIQI76u(e z0JU)9w#z6uo3fSC)*D&h_C7NQXQxZbWxnaw!L!PTM#)@wvNcWVG$_3Wc>qYbTQElO zWr5cl%3qC<-W17n@js#93?1$>go6qi+TqD3_!T+a7wi%PKSA>Lkh35=tb-kBa>K-E zku#wfF&Knk^!hfF(qTx}DHVcBdy5V!e@xB-ocxgTkx`m33I-5&C{cs_IjYSo>Kobz zI}u!(m@GsLJPTnxR{l&cMA8!>+rWx?9ba{l(#d0;zx;zXJiLXNj3<;n&31@P1Tpw4 z&S2Okoe!Ln<^=|%>4S%W2sz1&Z%&gBtCOO++y0762k?~*UmW}5ZKqhNppZbhW?NWI z)9a82pb=tlqpoQ&tl2<oa;_#@HQ55=?ALIl-E)w&bCZNn<FTFd`qa9Zy-tvtNwwK= zR8F(kS>zu?Q{g4~?R8d+$dy-NM6Oh8ugk-TeEB|%$d{_@bp`T5d)-`lA@GbX>@1!x znW`!s?HdPL7TzfrIgUzGlxB-jeBx_pgg*t4@M|@6*>y}FSE{lQorJj$b-H3Wf%Kw% z44G0|Cu4b<S{H{Bmx%{WZYn^gS|CbeWprYjspJ+Zt7N5=UUIW6fJlXzYKx(=c)I+y zV@R3<cuP}BXQ4~5yK*-)yIHl+7xX;q0E^lzMAM1O>S%|Wa)~PrANM$1LX!&`C{1Sh z@;A7W`SR$CdOm2a82C>>u~3fN<+&SXgY1kWL;-z5hv*GKDi*S}P!{ZR{>C-Hmry!( z>jqYrRS)Irp*%g5uZIfs&|C~relnIM$P@h&>pl2SoljeHb)%#sdZWEACV%XoRST>c ziRO7nP`y;Z5YY>Ra%|y-`W0PCNs&8vc52stWYyV6YJfmUwH0F^K&pXG5&^&&5-o#g zriPVnV^U6ZvWc;vuHBJ^;#f|(*xtJvWk*7QdC6BDm1Y#?57S3(1DdTANYz?3n^ZNb zOL>y*$XYkGjFZNbtnE`k=2xwg(<pZfz?n!T??~M-84@QF$TX5JQ0aOshlkh!=eiWx zs#L8@fl3U~3?e|uP976G>gx{iIvUCar1nsCA6<j&;ObNMg9gVLwoC}Q`rLj2+wsc< zOq+;WNXrov8r6chkFQd?g_h<xC#8|<nDWrND~T>sN@)SeGkH8TkYufb1^{pw0N1sH z?Es|(p`O~>1WPFw@`0!9b!K@Qt(XL=7yi>HVtQ<1QagxNLt!vF=e??ns;+LFg*}M2 ztJ~e_>VX2ccDgRyg_-VRW{pLw?je1f(uk|OH8;xOJaoqboIj!Q$<bwk-9zdu!E<t& zE!_JrP=HSv;+y2q<ME)j;d{X0P;r|@3G+&X2k~?Noi%Z}y3KtBzDw?`xgy`u<{pOc z>+Y->mS?uPHTbsN38avzxZ=FMIo@<Ax=7sX)Wp4aYtc&h8iudoXbF5>fv+pk+u$n> zU-9T%y|$>>W`R<ycaD=S&N9svx7Wp+E&x#i*5Y1H+?!q)iT;h@?|YqsRP|{&1u$7b z*J?TW@Ug8EW4CFmKI6EJXlZ`Xkmzjs{OueYg3lJ<EZzz<Nq61^`Zfwo?F0;Q0<f_H zv}(OH$e+`=0QGS#XRaPj#i~x!C1s{SkKl;1`sV?}F~2}(p`z9fAB*zFC<%ShOk#op zQlKu-ZDpaUFR1`{nKX=wzzY_V9qa;_lMKe(bRh|&l)h4kGv(w)d{bAkF5WU&%@|cn zx84D*Sp}+aV-@PdI~l1#nRhkru7&UwX#ajEq;&EH6$tP!04SyVvDjK^Y9oHo&+pL7 zHG{pIg61y9+QLA-xs8^uArrNNWESW`Y#LIK?OeHiS}`a{V&G3W^GsU+-)%0-zoF8k zG@HSwe;zxy=+{{M{CSX##MI_9K~37E7462zsVuTjmCviqJ*wQTe8I!FW3b6b2Ma-} znWWDlaF2F7{i+bvQ2JpZiUIAtM4{(cY@)EY3K_fFn|tI`yQ^Eu#xk4F0N=10Nb{NK zFB{iE^Y^dDK4<`~wYG5+h9wN&hvB3$I|B`gW(z0JRaq0E-D{@+t~l&*5O2_SOqK*l z@L)na&9<U-fdhsM1_;<b%nXFOkyr!9{#P<qUs<5f>tPH+1pQGWNHj0Kcq1xYURvt_ z1%~$AiO-GW@Y%(_Ut!N*6yvk#4t!2WLilVpG{<!#_C~=jr1ttGAyq(A400;nZqpg! z?5zndpx0l~rIUYo<9r<Kq4ByY6A!tb1r}HU1nwVhP@CiXs~_aJHTG0oYnF?5mcVP< zehlC;zkL0xnFdUT`3I6GEBhsQXK%3By6i7g_!OUssMS4DBicyk%02Y>B1UvDC*{%Q zNVW9&n^2>K2n$`zB7DHKFul`Q7A7<c{;Bl3I5J+&d_Zc~3pn&O3ps9A2{evwFHJxR zltU<LbR;6u>6c*S)q3c^V?3z-X>R&wjG^108v}KRC6l<X`bgC1�|&dmFJ$RQMZM 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%0ArzIR;&LesFz1~|9LH>l*o;-5D zThCRAAY6>QUk+66n#vVxMyHx4$1d><H;?+Bm1|*LVrI?g|9g8a$Giidj#QQSq<}c8 zAgEQZ@t_`J^Z+M2NN4tIXO-6A;a=JpsGBCqn|Rx-62K*PEO?C+oNA&=Lf!6Oii0~4 zpfD-sV$fj*hLV1}+faRv>&)cI^tL>*i3V6?#m<<hV3@xpSp`a(OZZ-G)>ES&J^Z_j zN<M0KveWzODzsXNf=N(-kVi>$qR;n4p(tmng<z{|(R3q4wS8ciQbmA)d+s9v8J0%f zqHd5zbeM1|#d}YCAIt$>FM3Kk>uD{O9_1{(DmB1{kUD?i7(;_WB#7LdWL1~S0MUR6 zQiumUoSqW$SNlvcaJLB>n2crTDGToJFh(EJKUHgBUZFhb1r!etX42(|F~m2pXIfNu zS)8!l1yXR0%7h|EP;w&5py?H(HKwb<Xa8g#Pe27u96eFS_BQj+Mm%UYzFptj#tg_Y zzr$#-e=pK=DbwV}@9)oF8>xrK&v+Fi1T@tJHVOpMNeY7is8|35ffWG6LAuM*@pQnU zrkDVPAs|pHunK`#QlMaSeNYY1vk@RtM}0w72#cl5?3XOCON$-Tpn!ER2A{tWlOv`) zlC@8G6{^sK51-KVlJoKzG#Hg<E5&%>Q2PR}6RbVk0fs#(S%KMj{`R2vtke#u^uU9F z^w95D<jyc@-bN`WAI2DPy0dES*5Q{|n{kVIRsAY$dU>ZAr1MJ19T@p$InoHjv5N=* zsNXlKWVgsy`|>n|GcFR4+~i`G67>TRC1W_(IOD9o6{%FCq<UYb>VQ+B`_S`ki>PTO zurW4J!00odmZkq!l}0Rh5tQ`e>HTo_5)M@>y)jAH`R57*+GGeAWG@E4fu>Q)*#Xzc z43-AgUmFEMLXv!<2{gia4|%I{94e8YfPfAv1b}J`jUjfM+>!d`2tj!HmYu68x0r(H z5T!HUum6w#>+~#ptJ{iN>f!~5gd7_bAft<l(BI>>YT^!1v0%W)YLbqSpbN>lH&{-= z0c50p1Lhnl5Ht#aG{lmx9tM^TwhKab85?<V^i6>@l`(?IgOQoCr$o;KWC?*&d3n98 z?z$(dEA6Yb3Y>nx<FrW}U`sY41^z_#o4L?k`gM7uq);hvC_ZwdHp$Az>;`!4kz+iH zY-pyi{SF|~#0{V>%rpxDU?^*B1)76Ss@7rlWp$Q+di-vAV4fC(rkyP`(J|U%z#dST zWQ~Q(V?A(}Dk>QULHZlSb8alb7{Rc8CbqWz7zD_m+u@oXyBmleL)nOZbzRh$;V>v{ zNy2znpic60)RMG~-RkE!YgE=|6?`gJbSWB}EBdla@T3^(UlH?h4P&hcu$+DLg8~*# z=mLXmk|dq!1#%FtZR^h%`BYpP7gL4X`W<vETp6xZ+q@5WI%<ty6`W-FeBP_o3-jbS z@7As%8Kk1hanx#!mlA6YS}FqYtm>e3C0-Ul%$-PM1tz`jIp2N_o?o2$U+)htD2H9) zmK7LOCyhRE%}RWDtX~_*qA{*5{1YTA!*i+l!O&Wd0&Ly|ZV|b0Wj0+5)ol>nh9<$R z$7P%%IHTOn;uJg-Uq6Ij$WN&0R*-qsZ-$|KB(QA=Y2uP)DD_je4nYQ1vF<uyL<*CK z3RSi3utzHKxO-ng7illsfi86PJUs**ayBP|co(F`XB1?o2USecTHzW!IEAh14jKlk zCuGGK*&EAT0aJDfB#tKLPHSlTm}ch80r4&0+i}5)3viPJAL}Jt{U4mY>HEFl8?PX? zZj(iY7ZfaJl^P>et%8+a_jNgs&Y`Vb@tM~Xmt#hqMuYcp$F!;6wDShjrLgmQsy)cv z^iM^VN2(MZZtXe`;?^q?d-A(esA;%V7+v~KAu>?im3xw2>oqo)hFGU~c9{Zuain=e zYPtjYoknur^FV+g^hx`3Bu^_w`@6<Qy@`Or1jLB$JEqvkN&zI#*R$*}21VLTxVD)b zhNq5oUFYM6<Te`W(*Iz=o&^H9T*-N3DXwL3wZ`N}4m6tQ{^{(ldXWUQVx63v%#t5w z<9^-kV>Zc~sdnMh=PWpRZXbYr$=2@{{b{^PYrB!Dmbx^7aMQ_>|5T*_DL-|KV~!bQ zV^5fjPBv%zQ#7aGpe3=+7jCr?($35DN~&%4kDtUgynMUl%r*jdqa{O74_5r9D#*0j zQ0}5^Ss=>w61v`FR;tsG9>6)K76h&fz*Y4KOwjsu<gs)8pY>)4)0RAbu{9j+gy>4? zevks7uXD9}I>)Qn>+G0T`TU%yeFlAN^ow*K*ROjrH%&Y~gwT-}bS8e@(f9RDm;>}E zRLGj7iX7L6HqakMz1_gdi_VY3>-XH7olTwIrugw5mPeL3gQc8&C-9hDJQl384%vn9 z%a!oXk?n4$Z7=<b)a3EQj&SeSj2>Tja*wx*EkLJvmeh=w&lNPlI8p|QmRYGkPPb76 zssh?Sm_jIn=*XEJhWlFfUW-N_V^AASY#4=vHhBF9{#r{qiSohSrKuXAI_~>J=GCpe z=H@SbeBBS>s;xqdqN?_7MsD4on6>gGHu#uV`GiCw9Eb34O3XI(MO)g5682TWSMq6^ z=BW|4TDzt_$>rV1sX<;1-qS5ycUQ(cwDIAtk^r+D9gTl_Q&t;U{?(<TC*30F{KLbn zOREw!2#DFn8}`z5{<NCJA|`tcD!0q(eO%suai*u>nCnUG8t@S^ZNh_9u2-UeOjHi3 zs73Ff!D%HGLSMW7i&@u<fN-Eg<xGcAq_2go-n!bj72}4VVvuX)A-g5_;?C&1If&pZ zZ8_{ek8Lu%MF|BOqN2^x)q#VT)79DC{j#`?L!0cw;MBAIk~T7Uvq?18k;f+!2JPq~ z*;Tnm`~ZOqC#(IzR0OM<R`dXMwY^OYNeURPkbk18K`Sdhu)N}yzb3Pn4QX1Ief5rt zhCudhNm}1pmLqu?yPdlU{H^H}@c`7fJV%c;!g6?Kg9Cca@P6(`eaa8_jsD-*U7rjx zm-x5S<?^@F<$rQFTx>0j?2JwHT%0Ye|D#39R+5d)WI*VCpcWe^j3X=Su2zloG*4(j zZ?WtwC5fVdiD=d*_A+nydcqBQTeXH$;RL{&<>~dXqnVJh2-J*JHc2B*axZ{QM_>H1 zeC*P$M1oP&iB}APyb~%Tbspc}_t-}1vG(h0Enri?W{ESXaNp4fi{)>f<fb3=hIm&I zD&5@%_7#B}fUuy5x9F^|OC!8vWb9Txy}v9>2g&6rz>zAREJE;`%N5;tvIc~8RuX(S zp=dTxXU(0vA8X4i@%CVcu5tQC{Ki5((o*g!Qb*)z3CFHZ##3Sf(}#*DB3~#IhaT_H zTyy+GpoPS}PJBg{DEY7@p=1TZMLI+uT=@Ez7Q_nLMyJJGu`tXW_ypNbdiaq_CW6<p z4ca5PabdP(^jj}T^PVj(Gp$~O$d-VIs9hIg@>+r)pt!$$`Cn1Q6iDT)QIjJ;6kopR z5fn7_A%%zj-NY-kX7-yl-|Fjn3F|gPC1D8(q(<RGNNhy*Stv_uLtPP<)kq@ODK!bD z1VOEdl+bt)K(!^<@c2f&OO@88ZI|b^S|O>Oy(>U`Ldtz<*wf0X)2Gj1g(b|DiZS!2 zp67E@5bxE)pf}bGe~XCQOJ&esyyI`%cK)z1H^A7YlN!dme?#2?9!H)tA#5n<n}1nr zpjgS$b>3)=VlalxetbG<ILl8^QXq@T{RAL7)~K%_HqdNeST$4k;)km~;RXE$krSc% zhkk(mdv8h9%NUycV!XKD@jq=Zt|pF77IwD3yUHe78p@vmM&yN4)NSc6ID)okj6YUU znXIHDe`{+vcK;d=#<t8VQdE1>6h%>%2?;1eyQV#9IClhCOnA+Q=Cn+xl0qVbF}2iD zG7Y(r?$XLMHwc%w)bTrb@hkT;CtZB(=^ogBe^+A)^FbLT06-2t008oTV^BA96BFzI zkU^MVb{iv4ZeOV2CV=B9d_`MeFdF}+q?4x153p?F47J!oiR96YB8_iiT8<2UKDNEw zMq`PKJF@*b{@wZb^)5QLe_D`>l&4u{mZW6Rr%nzVQeW^+LKkc4Bt;(Rsb1dkcA{}v zOeot~wd<`i*ULvO_)s>*b<{{7!JS{1m#aAJ6nUP&71_(fi#F0q)t?I3)gV(UZ%xQJ zze=69Fg8gJAjTorNfslGSI1S9Q3J0WI5@!Xt8_^=W<GY5)kwC&u}fEWP&G8s;E5;} zdpW@1KiYGs`TcamFGUb#@OyuWXX{o%W>;<BEK;59{|Y%OY_1fpNmk*L-rH%5R->dU zhYjONyz&>TWRj(jS`6Rk{EN}}zihg{>DqbxT0@yB<4l3sV9;UskZ|5^ZjY9t#FleK zOC+=HUQ_7{nR%L@-;RxDdfhP*#V{5!Wwnypd1G}K{y5n`UqTjT7X0i31<Hl1KgRD| zP3#09)FX=D!e8KjzkkJEgx@G-U!g&xe2!K=s9k`3dwYGmW@~Hfc7dw|61=v}-QQ+0 zBo3vKNe<{A-V*G$0~AUeP=WHH8VJowBGC@{kYP>JL3q%b(Bkq&3p5mpV+jL>7erNN z<q3h~H0CgbgOAJ(r!=FE{3$a|ISh%`sA1s~2}SJduCxP1*6$437OVplq9ge*M&x7E zX_QAhQ<@^cQ>T;42VLaupUV?+G!8r5r7kKG@i6oz$TkYq5RR=XBUpOX(R4-95WFp1 zhsE)q0SF{%Lm{<Tjd$k2g<{$yT8a^skCB+L7PxWJQRc0;VF3cgCC?MPT9slG1k|@^ zD_}F;s5eK=%6CS(suaOXQK%LA)2!d595t6t5m_)gnf>G0&YNU7S)u91v5!}z7=9!f zkV}5aYV1*B<)QBZOD7^TATaEh@BF72Yk@9Dkaao0QQBc~tfhcn+1wh3fdw*mH;2Wh zw1c9P;=}BzHpJk)0>xs9?Xy+P7>01?@JXlHlU|FF0Wyir9NX9*&W{nr9e#C29`O)g zMObY5;?2;2WZO_o4fMDX>8J(Wq%S-Yo}-yQC;wrIOa%nj)x2AyuNtgT;j*D-Xf>UQ zHc20Up#fFdVj!=~Hb3g{5)RZ@;*!&g3i!DxwR~1KF1gbPVVXB);ET+()m$MVP;aus z=ALNLU?|_<Qsoq!lLe-_xEYv8ygRv$cs>&lDJlJi;r136`XdtF#6oFkO67G77K+F$ z6Zjux9r)Sm5@iE83zx=IAwU>eQY%3<Iq~V1(|!ddG%grV_&z0$gacNeBnLFBLXQF@ zo77k(?Bhf^DjkZ7-T}v44Y;XW$oBkXRdSqQN8`j~{(W`;Qp1rY1DJhQPREPEA$HZT zC@(Y(>(Ge`xCqCCX5ja3ON{nsYP+Zy37FKODo^40vC&)1C#e^#chYdtuo%<JoP)b6 zIvJcCL3zaKI2k&P5!5PQC0rv2DmrUeb?$oc9DyNCaM-*JrZE4<z4Xsek1?Pxtfvbi z{HO|6vGo)`%#$yWB&bS)x0-ZSds1T6_5!B(A#=uHopfNx2SQ%Gb6SK~{SE|>=c;3o z(BIKXel58958KnDXBrj|GMhmc8o0%<0fiup>q96anukQHzq#Xc=MbXWXUdksR%kAG zKKrMV(73?~M@!;qdQho0OQ|qciuQIDZ*!N*uU2WXDTB(@0s##&ipl=H)q3DIi1MRG zaL2WR4ONPuu7l13g0hvkDpXPyo!+;8DASn(XdyKO;t~f27pZFg5<G7u34c)FIu?mh z?*mhbHdx8CVsk4ROQF2R|EVxy9~-ii2&U*_hC58~So6;PKWv>tlpw&8Ma#Br+qP}n zwr$(CZFkwO>auOy_<d$I^UvfWcbS{myv%rUAJ1~7;mAE=X6*1;!5`4k{A9Bhs1^I& zJYAjMcfJO(bJ@&g)bSe2zk*=|f4fb&G7sZgS0$5qWwuKMfLOKA7*23VLlpQv+B$C0 zqlRsw1cn^5V+D$5_51&HjSGb9=DzCv_PJn(1k$?TV%j&I4|z^qim4dtdtN1MDzZz) z2KLyNW%@=>L_13WI~zgSLcP{-p&QO$T(9Q?T?jY4WMyp&;#MQLaQ9o%rhi5K04F`+ ze#l8|f!zyuZc;)T#kjy(*g+Qwn)<gQug_F8b@YZ@|EcEPI@~i*JH!rln8tqu$v9YF z2M0!k85NSgpe{IYokg74qyB-Jela?}_uC)xoyk8wcv%<d`wJ1Jy3qI)3h8nXyQhKc zwh{!G8Z{{~Tv)jJs#P}6X=okV3lxUAw6tH-+gGUROD2tjAX33FT!57q0`i)5Wtb~& zX1zhbk_YFZb2k4i9!?lHrJ}T=$%Pv$cX|u4B-xAQ+y&&h+u6ZK`|uA*Ue;N|T7zmm zO|a%+2`{pbt$}m|`v!k-Oo!Jm+>6eoAmH(bwyBLoedA)7P2p_%C89Z=ONFZkA6CJ& zNAfs-y@{sk#ZS`sOwjcZ%aOc%L8e?V-$13y#4G$&i}33)3N6Qhn9&1xOyrhU6_Ext zVxv6xy7Z+E2HX~FI3@F6FAZ5MZ8T{MaL|Br+yF_FlS<%-pZMnKgR@!0Txx4BnK=h> ze~ZRiJQO0*i3g>0(MI|$<4Ry?)ft3OOl)=()WbL6D#i_W-d~)$wPENWGHfIGJ)PON z?KzgwqutN{=i}?Uv#$U*xbI_S2KZiPp!jlO*zA1o=IO0Bh`L_uuO3fpmHAkzKSPfR z=Gds!mn#fkb^jC7s(wIj5KG)T_kPKa4;-*L>268}emryCV)UgqZ!<JLrkdaN-BS63 zQ)kJioYf{;rq_sEzufT(ox1FKI9NCr4ky0)#8|MldrAe&MZVf1G#@m8TO+|hMf1n2 zE1zJ!2`4lDA-i*~n-xx8>g30Yi*o+H%t7!7{L3UPbYUkwcP*G-UIRV|SFSBw)@XOf zC9+1KL8nCs4ZIC_p=Q)M)JMp1?eLUsVpZ^_Lq>D-=gyUZV}_n+(6Qvr{_G}BlYy9= zbzIxOm<8ln@6}37>?-C~RPmMKmQ$%*@CS&pMJ}f3Tkj{9k0&P|{@cC3s-Zp4?Cx(^ zCpV56V^<=Y_$4xYv20yl@W30egkJ6qfc^b}@v_vSnl@*MX23o;GR=9$+w>GSbl<}y z9z>G7Maq{sbe?^t`<I+@jPhu~f`NHPSxUY_$CQ&>KoXm~FlUXS_G+PipUmi0ix_LG zD4@z$l;8leqka6iw72>IS9@^oS%VVL_V2z%Y2X+u-%tRhBpJB%Jk?q<T}IiT&!dh! zN~vDi+yV*vbR1SUvth91kc2tEq%2xr{}qG!K6L}@@^8#y^5267_rHYQzw|(Rcjy1r zU~pBEwg1;<?KxHV(6K<YdQTvOg|s9P5EfzpL>^Ppau;clOz!~x`Cdq~Bha90EPl<) z$9*J8jUtHkjVh7CpnnXQrL-E=h(N^Ygg938RvI>^o)j^7#mM-Vt&vwem&MR%<8dME ztBiC(O2ZFDsSISqzaGlR;`3aYJ#T>%=eZQzi85a2;EAaG_1xuTXgVkSM1)tI`q9$& zR<Ud~(jx@4VGIYQ7$9HrMn?={i8QWBfEuD>D4>*!tJXj!Mb<zr<y}`j0T1_pt%@>L zj66R4J*j}4F7)R*{Zy`e`?`zNHXD0QD9JJi7id2+2b(=leRkoo#*0&KtVJ2b_0I!0 zV;NYgJgo1VaG2v2jsj%NAKX*8F3+013{NyDb|q5=@7<b}sgvzbi)M|upG4&{Z(y$i zHXRzXbU-<CWBUd@`tqUp=QZ!_II+V{!xp((xN5)UBln9Dd^Y^YYpbD<k{th5DZW*W zb;fKqH7TkoGyeap!~azX;9sTwXW{+ZolRX_9bD|~ZJg=#-Aw=0%ZXn9U+SZ!i@yFp zNe=v9eO)v7kVf4l008$WV1R!@{{K7e;OSua@10?1{_pseudVkcThrMqpZqUy^;TU) zh>}hDb(>v|?wF(2E*Cw!Tl@B*$MZarZF8DLYRQ#{@~wT}BNzgJprqRZulG%D7q&DB z0{~d?fB^&jYmg;ho_vyl8*g+p)66Vb^QAn0C-^V4+rzqRVqUJgAjbtLwzYNq2e$R4 zKKQ_;2OlIH_(1eu_s15AlDEr}j55>A6U~IQ0Z%0o^3?%NL~~W9xS&NM$)GP5jNGvi zO(alNyy10M2I(jysv~mM9J6^Ypr~NPmYC3L=Kz(H@?}*W5(Ph;Vbjd`1q=bOLm!rW zGEG$VwIfR|$w`8m*+y=`QvoVhucal9NOHj}z<v^i`k?9-uDMfH1rk%$5@HZ!!NR{L zd}(<VNXaf)Qrr-M2}(p;o{+)=J7N)IPbj}+EWPVrCP`_hh(Va;YyA`5L8qjA_@tO> zA%MKo(FHPO$RJ6B02cGE_?0j$Aqr*@yHX5dwfecI%H9$Ib&H;ff<qG-qq)Ez6@T@U z6iEXbMlJa=kJK4tEI6>sIa-{Q$sQ1P#>n4Ig@}!z#vh=(W_kuBGnbQT>n9&E!W@Op z%t?gM0gf9PJAk~E)C7<yr^jgMD|FrGftTZN-GhVG=ivP}{F<?^a6#&KyFWH}nzzjb z%|8MB+>7?gdxmcHzdbMnBH1_T;eYYEz3^=MzP#^-cBafj-naAh`__3mAoO}5U-Y_n zb~k;|K)vbRU;KUAULXGKQL6a9UofogdN;a5IKb;GW&_#UqhIifQ_#EZUirYwx8>hl z-{Su8Lgn4!_KGyj0p7UXd4108@65)3ZrTT}^7ndvUl^cs-NO*{ZF#?c!Lqb`8oeG9 z#zAd_jSbxF?zubMeZTzhv37hD!yLjsJDo0H_VulQ-h2-2eX4)Xx$W;S>YnYsEPm_S zT_5jSTHe^-_Cy4kZ_>B*ZI(vW1I%MnQTl$Jf9iUH$l4A4y1~8b^@x03b$fZff%zf% z!RhyKF17k^aIeJ%{Y&)*kH|T-*As+}(5-li+7nn#{{sWT81E}i;1ySZ0(UwVyxk=} z=hprTxCOYvPM$*kz9=6itT8rZ*nryo{gf<M{&-HFg-p4!1n)-Ha1$7i@Kpv`GvPQ< z{lPMmL6Ph}0kNW9PzAJ`DYySwo^Rtj4gZ3XE?yi@=>})fBNYXM0a}ym!AAYy;Sz_7 ziwemTvf!$IubwGquAu&mYIf9wGp|$;m4Qx5lPvjgv+v4-Wf_4;M?wR-1->emm@`A} z2pC}AKj|O~l(I*@r|ZgJyvLRA|1rTa*VT}Ld;*tDLRYYO_en)jADG+=+^fK#B}-!D zz1V@3dnjCtnt^#077LZpPt+$f#-ZEKAs^L2pvRZQSu=YG#Vy<;z6DTFl|k&zwb}uY zrU@{Vr9%wv=?lx82aE8!OFn&c0Dv{n1Od1yA2j>gFBZ7^or0cxZ=OpKB6kSq42BJF zsNDe*<ACM!F){l&d&rbGomtBt88mk95d$opM4s<zXRyhUS)NRlF;`Hm;rq)gfVV4h zXUZRH8Ar}Oo%_0LZ+@6fkV(>koeIFc<-hAY@B4-Ise1MBIN$&Q3llDH7le~xt|Rz5 z8z3j8+c!$hV6#Tw#Ee01=lw`^3!FxmTqNbeT=B<1?b6ncC=Tc?2d#m5Nd(FTtQ$=c znA?#jGk2_%%2U3UDAZFxxh8Sc^bEa5p$6aSS?`YEOa%9B)%Q(PJdke;GSF&v`fdsn z1_316*>CxrAJ9$i8peVP9s=;IYjtr-jtuwZXdTDhz?r;S+`bk4DIY{!*J~*@$S&k} z9{cM-^HpQOj4F5}<Za0)6d_g!E@7wMS%4QMdhC7zgw0|{G!Ui{$L6@)HzP?hXCEe* zMAQV|<er7nl(`<A4gvCMznzZv_NTa-vKXgA@4Ani$}2hLQBoD?`c6!b1l8tI0G8#i zl0<S=;J{d|eE@=Zf0JB5zZh|eH%eUuW{QLvLAT1hp+*D=#sCpn8?t%6ACa%Xegqg8 zDs`g$MI1ZF5ho0iXbV$58B{Gpe!x&A11QPMg;!dffJp}&U9!8z=LOG1P&H90sSfEa zmEH}g6m`G<o**K!zmR3f<j_+}GX@C~3YchuVu*8U5DSw0q)u0{g|Y;5(ykx^s0^QA zfPAtQ%bB8g->ma+T#fwA;1daEaRc*Y`7j^?XujWru99Ltd{xGZ?eC)e$Ia=Y{7+gM zr8D0Me(pp!BA#(FU;;J+Rh2tZdgP2wxu+&5XE*hQCW251(LbVpfow^R;GOY=f&sD` z4|sdPk#3AOa-`YmJ8H|=SzYFH2qwZU^hy~4NhK%Bt3P-bB!Kj{#>Zj6$e|!l5YYhY zUFwf!A}}ypAv1HGg(ZTpnE(iw;$Y7)E_(Vo%p1n_m@L8P?JqUugZfBxw}cA2zG<YF zfg1uk4YTXsvb+Uyfa~WQDBO>yR!S<*r}*oA^+DtgMwkBu-%cp*rojj4t>+^0Q6~{V zhAwbj#t;k|h0o!XyI`Iq`O|v%IwZZonk2Lyk}=OXf#=!&x^<rnRbhU*!grVe&?)|7 z6o?!*cc`)MHhRLD;o@0*!e6-sXpw%7!ej-e9q^k11+Z^#SF3>HS>QngEIP;l6L<wP z`Nfk2>Fv7)i}T5xB%TN+qAOpG?4#k?Q3K<K9Y#F-vc(Ynf%7MVOi&jYUG2@UgY3Pr zAzUh`KNK+G(tqDo;pzttHCb_Uzg^>aOcj9G#35?}noSZ&myxaX+~oD}^ZkULd{c+f zMV+eL)V`p$9-;Ejp**~*to74BxN)4A%<#Lsbn7I-T5yaGNU)Ynk`RdN@@Fidm-z$X z<C2m+Tom~`^9YX>{Ko{?PzxkoHNHphRY#u72-#q&owv4CCfGkY2W56*lQdDU{tj&y zjYBuXsWXbeR+<9!mA9>li-{WlV|tjBRNWFLa|jwbX-=RM3<wUO6W}afwY(^^_c6XT z<6l|DwzF>a7njdg8^Hiwy<uKeO3(=(z6Ry3I<Q{lP#>IhBiYofLE-b8IcgBm8!8?q z+<Zerx+|#NHDT<r<%9@=vuSK>Z1M6znFxaA2RA%=zO!9|<bxMB`VhO%yaeIZJFGog zI^y|$NTPetK#5sRy%Bbf&h-0`{DI&N!Y%g6RQJaGHkysnccgej$7J}<ovpg0!)fZ8 zlQfYTm9M{lf9wtbmE7x_f`82QVai9UxpjCPpceyw0erJ7>svUP<u4Hi=-olRo0-b- zdt9~RE@pdX8{#Kht#3l~&%dvX??nfR>v&Vfc%zdg=pIdfQqlOd16zPuJsq0~$^yI; zpF5<=!yr|aZW2Fp0(W7s2~zol;(OyKL2cBD?Az^!L^pe9dXGCc`;*B&q4@w8jjL1A zESxmiSw)cMZ?S|oZNB9B<(HvPlKIm_98T1aoYU3CUwB4-@U8KUn(?M8T+{A*0gtQK z^q!)%mn`#reVLqc(XZ%ao|Hae=tIV@Ka(Wm7YkQ)DcLmifX_RgiQ-@$Z72>@DCQ>X z7yY^Y8czS>&YU1u_r8vUTDmEU_;|ZM4a&urxfT%ywzm#=m3nH%=$u>z-tZ40y3qbb zg$+oG_+pU&Ngq|<o!4!Q0x<t*#l;BlgQP!dr%%>2PWJ4Tk#Py=Z^9{<J&Fz)hw30I zdvKdSli$GQ0BNJn{Vu}qsY{Y>$w!~)gbhElJbH?%N|P;5HkXwAzWySiSe>Prq<l7I zgH1~LGpU3LfJb^Lf`({YGron1+w94vWWrF)J3KO45BH5efg*>?qDlH2hP+SFXodqY zWxTZHP>FP6sn4LDC%a{;istAxN`Ltb<RIlekU%0}-6A%~BQ5^UQE511&PG_k&{-Sj z2!d+T2_pG$4$|f%q?VXh+Mf-#KMyLCJdj68mT6Xg&b{Zr$i5z`)yT*Qk-y{tlAV@x z5{>!-#HJ+HK#OYR$W=VVr$VaS>f0};I3vgd=jg4p3GG67i)+gl^icoH=L2GTB_(b> zHn4&=iGOYxKxzVv)4TTL+41_2Kn+uN|A*<j+~(J#+vw|HvudwAV)hXzufGq-7>-^Q zk<_sODl&e-BVkZ6umvC8yhd9}aZ#9@jWc5I7-1HwR%5~&BKpz}-CVwu%r5oV2MaWr zBw8SZ{wxi2MLbA6P-6BrgxDi@Pm}MD*zp`mP&1QCpdyl9vSen<K_G~Xk7x?`-0oj= z)<MRI9+o=>{`XSz2xNkP=!XYQe$r4VBu+Y1F0HBs9;bdAA#oy%pLm&Kg8dRmoY{JC zg2;hHpch3twP5iO2n-6B$pX1U7ozYYje(7sGkp{{gk?#zk}6qEL?{VU!SbSb(V0On zGRk@uhCWcp0Xjq?R;jVGBa~S*)IQ;?cUlY>uz}>j(5w&ec|$1W=!Kt%E+k22GA791 zC1e|&{a#8;rkU%BR!j*R^ir6vykdYhmKBu&P3QzaJYr$mgbNkK5;Am(xI~pPa)ML+ z1U**I^d^*uZCnrUYJx0XG|CoE{@B1PAVa96!f!EPftVE(C&>eFb4gO<!V|&}Mb}+f z@(R5G;;ea-c5~rcXaI*KrNN@la&P-F_+DH3s8g%p^{`|QFQ&L)E9SFaU+!Bl_&tkn zx{y#5wSNCNHnz{pu^zlH-W$(EGXXHMywr+%G+T<4v+cOfqht_zgT{ayzYtVEj6=>7 zcc%voxYCh*g*g6(Y59AG`0#Hy2TBvA!D5!^gFNJ5p&t>JQ1{UOoCJ1Puw$DfwZcw> ztfQT?ZGbrAejXtLKozMlv0b7IrTWzZ(Vpw~Glba#1@F8y`Tb$1G!q(boIytHcH%eW zuvHe1t~LTW%(~Z#5qW+>J;-EknMp+$(R~oS>H$FcwbJr|{GvTa6rRW+xQi;udx`Xl zBH#YV;V9t0F$|=`%H1esQ;ZsC9EC!A#%B4?g)SO;^70Rmaz?N6@_6n$ZhxFcr(@L( zU*)&KkArX8bx+n<V&^3s)Ij^U6gD6aH1#exFEAhDYDECxsK1$WL(Q5K|Hg4Pa*$Z0 zi;?M`dZ`E&OnvkVak!|}z`Li^k(i9u^v_BJKAn@(j3`rU2Mr7A#4Wf$j760Q5JIF? zJOj;zJsm8{E4Zcb*@5P^KF5md`@Apb_x*q+&;v2|71_fF&Au$=n*W(QOh%k`6URDL z(ssH9D!l_ln3s$U;$8)3B>FNd4tF<~dKw1f4%UBQfff&0M>JC5s*2u+V;ZFPI5e#V zx?PU2$|Dl~o*@ukAS1s3z1**G)ycYO(eGCTb(QSWsbptm0v1dQ#m1_!TXMDqQ;#e> zhz<Ts?(U*@2e1HFJQ)y8nzq<gGH`j%VK1k21Cab;p_3c{d{Qsdk`}Ip2I+6Xf)nlv ziwyebDix%_x2+BAP|mY0R3k2m=K8?OAc;@~Q$U-C`_<xRQ5lKGuQ_PKuL-GduV9>; z!juj@$+L&h!Q;5I=f?Ph=x3ZaQV0<@O9|u+RBIIrKNz+n`6HD)y?O!0WchuL2`Ap+ zWgba<gy}JPcHs^580_pu`}*Xf9H@2k^wiZ0CVoWRSK>RdpaBwBL_PaPRE$5I?#V?5 zjG_S$lw}Rzmp0Om5iux7?yy7~h=1bohmXHf^{tl<S~xH<wArM8Es#Eh;0>Cis1Gg7 zJMD}+#kQ=hGoy_cT$;22Yv=1Cx@qqy>uKBL@>oHbe{Yf5hY?i4C!+h1gmURyvq$0H zY&w)_k{m7q@x09rG(_v!1>{wfZCwjuIMGd55Fuxfi)UPJp6KG?Qh|PYTm$k1kFT;2 z2pWc)L9Bc1u+YuRc5nZ?)}R`X{^}MA0o%GSLfN3R4F*Xm8?H8$HCNL&;e|UtT@d3D zR_pE^17ru`Ps{r|2JI5rU3>V(TD#lj8zk#*<krt4$vAvrUfw!oH=X_xHJ|66cJT%a z9o<XQdUus0+TWoP4h8Y++2lDq_pQ*D==L7s&bNBWI0&U1!UQOQrmIjN#PEXaMdCz8 zDvB8HAFR9_!YNHAA#PSQjg2^mwKs*?A1KpVZNaUy&{4kzyIZEwH(VsfECnLLiacCf zELj}!nRQowGwwt%UlW1AWXXEQ#Hu|2L~dwWB8+kgV3rBIE)=t{tq8OPBrHLspeVwL z8I{#kH7m(d%5DrIX#Yz0gp2O+dL}lUJ>Xc+?{PE*A8T1#U+U8wRL>`Hrc?OCN&M+J z)Veb_f9L(bQCD6HD%bmv==Cu}aCQ&ol7G)N#keS*-Ll50%#FnpXO4YIMh8zeA9>Nx zdNI5E&S4}<hKo9UyyV{Ht)q(;FqUq(HTqFC3zgcfUpmS<54o7fT!D+M+_noDT#Fbe zmU@LXWy(ATw#YX~I(hFGtg{NYpuvq%PBJ_k&5~>Kgjw!qPS@YG4IJNVT0kCMxMW8y z2pKx{mTXU@$e&_H&fe%f%20p-<R`FOQmU6IQZP6=PXG&h5?p+Kd9Q83=dD|cFkqhN z$k`o^u2xUvc>$Q^6n$yXXuW(&sD>R^or)OEINsxoSe7H24f6JNIqcBUL+l&vWg29a zf^tdbc?V5^RbPKd!SmTCY*fWSTrGlw2un;-`4BODwX21w(03jsWzFXS?<B5z@Gt{v z>^1gn2YM`RoJNa+sC-*}69v7bj&5xt;2(`7Q;}|wp5QEB&Ik;hOQ$@T>aUk|MJTD^ z4^hUn8?icBCx>g$wBHsq8WkDQSrU$^V6O@<uKLeyOFfF7I8KsrglU1dGG`?_XQa+7 zZLF9*)t+In%VkL01mIE3?tj4M+u*~;^LWWyZiOX@@Vog0Qv<8kXeg0;<jenJS@lF| z->UbRe}Gj7+Rm`T0UecCAUg#YMOfZ*Or9n)5`n=vg3>8yn1x#D9gcc`vDsDJQ#E;R zu}R|`l%nD}=4!Pk2WlfWWBTY7y<OU`&XZ@l?|Cr3UOb_+@r!qwz^03FYsZ^m#{#N7 zV&Zn6mpa?Y+#5+*mFG250EnMAitpJWw%yrQSl8iV#|~1M(9Dp{%wn|`CNw)k7~!~B zFmV*L!iC>A(ik;L5aZ)8Lc^Eck%-pbvP7=G2g53)!q#Fm7v|O980E(*OPb@{bmx<3 zQZ#t8^A@8du%!-6O}T3*N$p#x*vGBJ+goMJ6_=%b#Y6><iQ2M&W20(g(lypDlC#H` zl!heI3J*516iO|@mzDtYT<MTAMi>zAx#PRR`bK_wBD4Tz1W7pl2qKK$yN;y{-hfWj zKcZwrY(2=z{+Po_0dNI-DDby`nspbD&19E&2NH%@MRK%3sM=jly9Ui^u1=p~N+;?5 zo@CqO)!Fm-wAi(WLPON%2@xDG+CZmgR)ZlFqRQ=mlMmW-xMTq64K}SZBZ~ENNmL1q z^~fF4_5n=V`Yw~&xN1YgfLOk8SBko$s7$Mq%-n&rG$dFV^MyVdgy*1n(H40a#HG+a zATE3C|04Wq?#}Du*Sg1VzYj)xR}8yi(W9bujEfZm7zOSCo_**7Lu(v0FxY$XX!Hxs z9YzwCf}&yBF}Lv{>_3~`S#0}=^aKr!g}o!7L-PPvzzrSq0*XMcA&L3)IR#drsj}ng z9b4-h*mZ>hljx6l2<_JDF7?KuDIiiwXuIes4R3@Qj0`*+xUw^RtT;=<&ObxHDp1%R z>e`#7I_`ewyEHp!(};uVwO`cJJy>3<YTWB0VqiE&%u@_rNHOj|b%TeEse{&%8t~`I z>nFv&qviB|n_853)T-WSlNh8Bg6!pj{j^FKq)bTIbZQO6Qz`CpU@!ZoME!P^SUr`8 zk?+Q_;dWHqKMS?hd#hUoYvg@hb<VIX_3I&sKRmBR>v?dRIqQBQYhk0o1gjp9>cTBV zf?ML?+p#%BidrOXaH}p3|I4!pQ(HxwfkcZkK))-LqDXNaDmjO{p<K<We(O?!39#$Y z><IwpV{0s`RwyOG)TP$~dK=?jnP(rVi4>73e9UM2M5?-oByXFyK~tEh*o=*f^X?V= zfUFF=tPaLEetCX1ruWeEq&4`O$!=2A21mhr=4sE31UUov#u?OWS$Q0?CVbImHO1vy zItV?KwJv5|5<O}t@s=&MupYbQYb6MDE!u~lVAU=r#NM~}_E0ITr=E-0asM`#S}$Dy z&Gt?ZbLo$eiV>Ulk~VWD@kOy6z-BA7Mbv5A$J8!HJTjgiSM>kx2%JdsM8ZG|!~spG zU?eK<VEIsDN5J{xZcTSXSG4CeqPy9DVY(#LPv@13r;AfPMfeR9yEYgd!Ip@J7am8q zt!v;1)JjJy()qb6Y9iz0O>W^-iJZQ}hBo`5JG#&|OK&Ln8NMFo<k6E*J>ac;LI_Xm zif^d|pfyw9?X@6kk*inSx{0>Y9eR^?<3Me()INMAMABH451bb&`5QY!x8bb}V|=jf zX&K4~x3a+&yElOLx~q&@j;c*|2fyNNM{k$}%;tmN{Ik=zwoEU|V)WVZc`g7IzT`01 zvz4d?+=vZ>eVtc!d&0a-M49(DXUjpSjhaB6V4nnhMFr(wW-wdkFhFD>j4y`>K;K<t zg4arrG!2*z2}!GSNH`SKS%5pXVA4!Eg)CX&-$>D|U5ZiY8dt#e+JSY(rQLjxK8=<5 znNpj@Vg_mN+;LH3%Lb`@vX`PrC2TmE*20P9_UUWuu<G2Scads-)!GC$+^@bqDhUA3 zm${Phi6I%l#yEFXC6BJ)c=T6s&E`6dcMIehe_8~ME22(1UM*XV+EYhKw;DF8;)3ET z*R-3hsGQDJ(oqVrRa*$QKf^#i`3rS1<Ny-2El5^g6@LzTMwjnALED1EaY+-%yr4Jt zs@kT&{Tcukf~jm=f%$XgPGgm*nUpAOz^!WbYX%G9MQBByg^%~R1nRFRT<2I8N8)t^ zZ8IUdm7ResEQ3RYm+`(kF3&!eNH(qME!PUEWA%WS@#79-L51o3=y~XEo?b^?tq(hl zv^XL*+we=Dm!sm^f@?)xPK{jJ{h%M|wi&b+%7jSunP7RQ6kIz}y=g9+vXXXN7Z<qG zh4;ts#ITdK0Pnv~BorJcl7F~kBuTKM6Ng?Fgg5~n2}Ty-=Jb90l-!AppurfQN;CX% zgo#F|%~;AB?An6^bVApPjFV2$Z8T<2q-tgegAH6j_A^9WMWCZ#4C9qYBfLGGtDDH7 z#kr=;r3^ab!T#Qz{*0jdS+iRD2|wV9<0=n{lYq_pH^HJ@LUmc9gcsN5z9x6n*m;F@ z?g3_}rOvNj@B{#Hd5q3_U){n!Sw}J6i^U}7zOJqBz;?C~Vil%NJ4^)0Deno#jTO_Q zEFVVjE(9DXSe9ii%3?SafX^dMO_|yXR7xn)8NIizXRc|05NJMc<AD%{76@h+PPD%0 zo_FFFH?AgFk(|XPf<lh>9K!^on3;FKrJ8!kl98!qfFRodtH3x^;68>}VZ`0oYhe+z zkQ$&QoGZ&zC;s71$YkuyJdIOF#LY+e2hB%j!t+(?HNY_Z^Fh<Ay0i~8_%XZIIG_!^ z!j1<T&$hzNyHvKox`d_A&s$Vo4tsfHiFxJ0!<M@-9auBpuwAx&LBc0VCda^7u1|1( zK!^w(miv8O{^!$$@anqKUIL=OQDMtZ%U!wd!fPg&O-#55^97rT5zR&nZ?I9=BP(7- z^Y^B$SZ+{cyk(1m3U}nem{yFM7LiM>m^8FYtrRoemZ;D41#&B#aH~qKOZub&dKqoe zhQC11225cgw~usLcTAgyp6J(|i*SdjBDhBX&M+?}vfHxd3>@GJv<u25bk~KKxn#@n zjy|(gr_POgxXfA09>*<1Y0d$|;x>cAc@-K?U8%YK=F}AZ8j;Qm4QN^$VH;BgXMc2| zF1nwY>pGib{&~a{w1z8#bzao_G>vKn!AK<8L*zJao0ZYhUvrm${;&Hy&An2pUCpOp zrl>6Bg$$+&;RdnlmAyvHO$fRKI*p>nmWcQ|33B%n(*y?1q>oFbE`&5=do^PCKC-_3 zB1;Zo|BC6;1sMS%@Tc3*R6*Er+VI(w)O_Phcd$#A(YT^PR1+f+o`tcBXqsI@G;AS6 zAO4KpIKYKdthOddCTiw$<TE&&{s-Bg0_&QCdZ)ZOXcu*&<5VG6*decOEC$up-fj0x ze1%l4l<SXTVv5$c(J?(7e`j>?hV+t(7BO6Osvk=DdFm=#!z;zoBpYwi3M+)w(eXi+ z;r=!H>W_+fBF(P$l$~0#SzjB$X;jE@n;t?(2XyOZ31n!T@0RiPp52BV6wD$@A%+&h z{&Ar%a;UUP#Gqo<2kaR;!W=H5kiY*t6@u2$ChE~zHs4hj^`cg3xd*g%(0pfQd&L#M zw>2;R29@8C*e?V6gCrHHk>wjJpq;#U)ptl%yg-&huGhWQHMGlCDvb%h+-PZ#-mRix zfo!L!+$aVOP~NN)Vnlzv18XQlV6v%z;j*e@6uChprbb*c!DzT+&0Q)hR!V*?niq_! zy&b?�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%0AG%7>LGAv`MYY6 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 diff --git a/venv/lib/python3.8/site-packages/setuptools.pth b/venv/lib/python3.8/site-packages/setuptools.pth deleted file mode 100644 index 61cb752..0000000 --- a/venv/lib/python3.8/site-packages/setuptools.pth +++ /dev/null @@ -1 +0,0 @@ -./setuptools-40.8.0-py3.8.egg diff --git a/venv/lib/python3.8/site-packages/tests/__init__.py b/venv/lib/python3.8/site-packages/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.8/site-packages/tests/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/tests/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 1a2ef6d82a0895e02f1798f8713cb604cc17b623..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmWIL<>g`k0uCqrI1v39L?8o3AjbiSi&=m~3PUi1CZpd<h9ZzKg7{^oUy@s(Uyxa# zo0(T!l9-dDn`3Ecn4Dp1uAiS&oLW?tn3R*MUy@o}Qmh{zpP83g5+AQuP<e~PCO1E& OG$+*#WZq{WW&i-TSs&H_ diff --git a/venv/lib/python3.8/site-packages/tests/__pycache__/test_core.cpython-38.pyc b/venv/lib/python3.8/site-packages/tests/__pycache__/test_core.cpython-38.pyc deleted file mode 100644 index cc0c834fd91487cec834d66518c97c1bc80d6e6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9896 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 Ryj{4j;BTil<xS&n>c5xESvUXy diff --git a/venv/lib/python3.8/site-packages/tests/test_core.py b/venv/lib/python3.8/site-packages/tests/test_core.py deleted file mode 100644 index 41894af..0000000 --- a/venv/lib/python3.8/site-packages/tests/test_core.py +++ /dev/null @@ -1,308 +0,0 @@ -import threading - -import pytest - -from observable import Observable, EventNotFound, HandlerNotFound - - -def test_on_decorator(): - """test event registering with the on decorator""" - obs = Observable() - - @obs.on("on_test") - def on_test(): - pass - - assert on_test in obs._events["on_test"] - - -def test_on(): - """test event registering with the on method""" - obs = Observable() - - def on_test(): - pass - - obs.on("on_test", on_test) - assert on_test in obs._events["on_test"] - - -def test_once_decorator(): - """test event registering with the once decorator""" - obs = Observable() - - @obs.once("once_test") - def once_test(): - pass - - assert once_test in obs._events["once_test"] - assert obs.trigger("once_test") - assert once_test not in obs._events["once_test"] - - -def test_once(): - """test event registering with the once method""" - obs = Observable() - - def once_test(): - pass - - obs.once("once_test", once_test) - - assert len(obs._events["once_test"]) == 1 - assert obs.trigger("once_test") - assert obs._events["once_test"] == [] - - -def test_on_trigger(): - """test event triggering with event registered with on""" - obs = Observable() - - obj = threading.local() - obj.called = False - - @obs.on("on_test") - def on_test(obj): - obj.called = True - - assert obs._events == {"on_test": [on_test]} - assert obs.trigger("on_test", obj) - assert obj.called - - -def test_once_trigger(): - """test event triggering with event registered with once""" - obs = Observable() - - obj = threading.local() - obj.called = False - - @obs.once("once_test") - def once_test(obj): - obj.called = True - - assert len(obs._events["once_test"]) == 1 - assert obs._events["once_test"] == [once_test] - assert obs.trigger("once_test", obj) - assert obj.called - assert obs._events["once_test"] == [] - assert not obs.trigger("once_test", obj) - - -def test_no_event_for_trigger(): - """test exception raising for not existing events""" - obs = Observable() - - assert not obs.trigger("no_existing_event") - - with pytest.raises(EventNotFound): - obs.off("no_existing_event") - - -def test_off(): - """test obs.off method""" - obs = Observable() - - @obs.on("on_test") - def on_test(): - pass - - assert obs._events["on_test"] == [on_test] - assert obs.trigger("on_test") - - obs.off("on_test", on_test) - - assert obs._events["on_test"] == [] - - obs.off() - - assert not obs._events - - @obs.on("more_than_one_event") - def func1(): - pass - - @obs.on("more_than_one_event") - def func2(): - pass - - @obs.on("more_than_one_event") - def func3(): - pass - - assert obs._events["more_than_one_event"] == [func1, func2, func3] - obs.off("more_than_one_event", func2) - assert obs._events["more_than_one_event"] == [func1, func3] - obs.off("more_than_one_event") - assert obs._events["more_than_one_event"] == [] - - -def test_off_exceptions(): - """test exception raising in the off method""" - obs = Observable() - - with pytest.raises(EventNotFound): - obs.off("non_existing_event") - - @obs.on("some_event") - def some_assigned_handler(): - pass - - def some_non_assigned_handler(): - pass - - assert some_assigned_handler in obs._events["some_event"] - assert some_non_assigned_handler not in obs._events["some_event"] - - with pytest.raises(HandlerNotFound): - obs.off("some_event", some_non_assigned_handler) - - -def test_trigger_arg(): - """test event triggering with arguments""" - obs = Observable() - - @obs.on("some_test") - def some_test(some_data): - assert some_data == "some data" - - assert obs.trigger("some_test", "some data") - - -def test_trigger_args(): - """test event triggering with argument list""" - obs = Observable() - - @obs.on("some_test") - def some_test(some_data, some_other_data): - assert some_data is True - assert some_other_data is False - - assert obs.trigger("some_test", *[True, False]) - - -def test_trigger_kwargs(): - """test event triggering with keyword-arguments""" - obs = Observable() - - @obs.on("some_test") - def some_test(some_data=True, some_other_data=False): - assert some_data is False - assert some_other_data is True - - assert obs.trigger("some_test", some_other_data=True, some_data=False) - - -def test_on_multiple_handlers(): - """test event registering with the on method and multiple handlers""" - obs = Observable() - - results = [] - - def some_test(*args, **kw): - results.append(1) - - def some_test_2(*args, **kw): - results.append(2) - - obs.on("some_test", some_test, some_test_2) - assert len(obs._events["some_test"]) == 2 - - obs.trigger("some_test") - assert results == [1, 2] - - -def test_off_multiple_handlers(): - """test event unregistering with the off method and multiple handlers""" - obs = Observable() - - results = [] - - def some_test(*args, **kw): - results.append(1) - - def some_test_2(*args, **kw): - results.append(2) - - obs.on("some_test", some_test, some_test_2) - assert len(obs._events["some_test"]) == 2 - - obs.off("some_test", some_test, some_test_2) - assert len(obs._events["some_test"]) == 0 - assert not obs.trigger("some_test") - - -def test_multiple_inheritance(): - """Test using class inheritance without calling Observable.__init__""" - - class SomeBaseClass(object): - pass - - class SomeBaseAndObservable(SomeBaseClass, Observable): - def __init__(self): - super(SomeBaseAndObservable, self).__init__() - - def test(self): - self.trigger("some", True) - - def some_test(data): - assert data is True - - obj = SomeBaseAndObservable() - obj.on("some", some_test) - - obj.test() - - -def test_get_all_handlers(): - """test get_all_handlers() after registering handlers for two events""" - obs = Observable() - - def some_test(): - pass - - def other_test(): - pass - - assert not obs.get_all_handlers() - - obs.on("some_event", some_test) - assert "some_event" in obs.get_all_handlers() - assert some_test in obs.get_all_handlers()["some_event"] - - obs.on("other_event", other_test) - assert "other_event" in obs.get_all_handlers() - assert other_test in obs.get_all_handlers()["other_event"] - assert other_test not in obs.get_all_handlers()["some_event"] - - -def test_get_handlers(): - """test get_handlers() after registering handlers for two events""" - obs = Observable() - - def some_test(): - pass - - def other_test(): - pass - - assert not obs.get_handlers("some_event") - - obs.on("some_event", some_test) - assert some_test in obs.get_handlers("some_event") - - obs.on("other_event", other_test) - assert other_test in obs.get_handlers("other_event") - assert other_test not in obs.get_handlers("some_event") - - -def test_is_registered(): - """test is_registered() after registering an event""" - obs = Observable() - - def some_test(): - pass - - assert not obs.is_registered("some_event", some_test) - obs.on("some_event", some_test) - assert obs.is_registered("some_event", some_test) diff --git a/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/INSTALLER b/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/LICENSE.txt b/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/LICENSE.txt deleted file mode 100644 index c89cf27..0000000 --- a/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2008-2019 Andrey Petrov and contributors (see CONTRIBUTORS.txt) - -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. diff --git a/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/METADATA b/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/METADATA deleted file mode 100644 index 4a7d147..0000000 --- a/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/METADATA +++ /dev/null @@ -1,1238 +0,0 @@ -Metadata-Version: 2.1 -Name: urllib3 -Version: 1.25.8 -Summary: HTTP library with thread-safe connection pooling, file post, and more. -Home-page: https://urllib3.readthedocs.io/ -Author: Andrey Petrov -Author-email: andrey.petrov@shazow.net -License: MIT -Project-URL: Documentation, https://urllib3.readthedocs.io/ -Project-URL: Code, https://github.com/urllib3/urllib3 -Project-URL: Issue tracker, https://github.com/urllib3/urllib3/issues -Keywords: urllib httplib threadsafe filepost http https ssl pooling -Platform: UNKNOWN -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Internet :: WWW/HTTP -Classifier: Topic :: Software Development :: Libraries -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4 -Provides-Extra: brotli -Requires-Dist: brotlipy (>=0.6.0) ; extra == 'brotli' -Provides-Extra: secure -Requires-Dist: pyOpenSSL (>=0.14) ; extra == 'secure' -Requires-Dist: cryptography (>=1.3.4) ; extra == 'secure' -Requires-Dist: idna (>=2.0.0) ; extra == 'secure' -Requires-Dist: certifi ; extra == 'secure' -Requires-Dist: ipaddress ; (python_version == "2.7") and extra == 'secure' -Provides-Extra: socks -Requires-Dist: PySocks (!=1.5.7,<2.0,>=1.5.6) ; extra == 'socks' - -urllib3 -======= - -urllib3 is a powerful, *sanity-friendly* HTTP client for Python. Much of the -Python ecosystem already uses urllib3 and you should too. -urllib3 brings many critical features that are missing from the Python -standard libraries: - -- Thread safety. -- Connection pooling. -- Client-side SSL/TLS verification. -- File uploads with multipart encoding. -- Helpers for retrying requests and dealing with HTTP redirects. -- Support for gzip, deflate, and brotli encoding. -- Proxy support for HTTP and SOCKS. -- 100% test coverage. - -urllib3 is powerful and easy to use:: - - >>> import urllib3 - >>> http = urllib3.PoolManager() - >>> r = http.request('GET', 'http://httpbin.org/robots.txt') - >>> r.status - 200 - >>> r.data - 'User-agent: *\nDisallow: /deny\n' - - -Installing ----------- - -urllib3 can be installed with `pip <https://pip.pypa.io>`_:: - - $ pip install urllib3 - -Alternatively, you can grab the latest source code from `GitHub <https://github.com/urllib3/urllib3>`_:: - - $ git clone git://github.com/urllib3/urllib3.git - $ python setup.py install - - -Documentation -------------- - -urllib3 has usage and reference documentation at `urllib3.readthedocs.io <https://urllib3.readthedocs.io>`_. - - -Contributing ------------- - -urllib3 happily accepts contributions. Please see our -`contributing documentation <https://urllib3.readthedocs.io/en/latest/contributing.html>`_ -for some tips on getting started. - - -Security Disclosures --------------------- - -To report a security vulnerability, please use the -`Tidelift security contact <https://tidelift.com/security>`_. -Tidelift will coordinate the fix and disclosure with maintainers. - -Maintainers ------------ - -- `@sethmlarson <https://github.com/sethmlarson>`_ (Seth M. Larson) -- `@pquentin <https://github.com/pquentin>`_ (Quentin Pradet) -- `@theacodes <https://github.com/theacodes>`_ (Thea Flowers) -- `@haikuginger <https://github.com/haikuginger>`_ (Jess Shapiro) -- `@lukasa <https://github.com/lukasa>`_ (Cory Benfield) -- `@sigmavirus24 <https://github.com/sigmavirus24>`_ (Ian Stapleton Cordasco) -- `@shazow <https://github.com/shazow>`_ (Andrey Petrov) - -👋 - - -Sponsorship ------------ - -.. |tideliftlogo| image:: https://nedbatchelder.com/pix/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White_small.png - :width: 75 - :alt: Tidelift - -.. list-table:: - :widths: 10 100 - - * - |tideliftlogo| - - Professional support for urllib3 is available as part of the `Tidelift - Subscription`_. Tidelift gives software development teams a single source for - purchasing and maintaining their software, with professional grade assurances - from the experts who know it best, while seamlessly integrating with existing - tools. - -.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=readme - -If your company benefits from this library, please consider `sponsoring its -development <https://urllib3.readthedocs.io/en/latest/contributing.html#sponsorship-project-grants>`_. - -Sponsors include: - -- Abbott (2018-2019), sponsored `@sethmlarson <https://github.com/sethmlarson>`_'s work on urllib3. -- Google Cloud Platform (2018-2019), sponsored `@theacodes <https://github.com/theacodes>`_'s work on urllib3. -- Akamai (2017-2018), sponsored `@haikuginger <https://github.com/haikuginger>`_'s work on urllib3 -- Hewlett Packard Enterprise (2016-2017), sponsored `@Lukasa’s <https://github.com/Lukasa>`_ work on urllib3. - - -Changes -======= - -1.25.8 (2020-01-20) -------------------- - -* Drop support for EOL Python 3.4 (Pull #1774) - -* Optimize _encode_invalid_chars (Pull #1787) - - -1.25.7 (2019-11-11) -------------------- - -* Preserve ``chunked`` parameter on retries (Pull #1715, Pull #1734) - -* Allow unset ``SERVER_SOFTWARE`` in App Engine (Pull #1704, Issue #1470) - -* Fix issue where URL fragment was sent within the request target. (Pull #1732) - -* Fix issue where an empty query section in a URL would fail to parse. (Pull #1732) - -* Remove TLS 1.3 support in SecureTransport due to Apple removing support (Pull #1703) - - -1.25.6 (2019-09-24) -------------------- - -* Fix issue where tilde (``~``) characters were incorrectly - percent-encoded in the path. (Pull #1692) - - -1.25.5 (2019-09-19) -------------------- - -* Add mitigation for BPO-37428 affecting Python <3.7.4 and OpenSSL 1.1.1+ which - caused certificate verification to be enabled when using ``cert_reqs=CERT_NONE``. - (Issue #1682) - - -1.25.4 (2019-09-19) -------------------- - -* Propagate Retry-After header settings to subsequent retries. (Pull #1607) - -* Fix edge case where Retry-After header was still respected even when - explicitly opted out of. (Pull #1607) - -* Remove dependency on ``rfc3986`` for URL parsing. - -* Fix issue where URLs containing invalid characters within ``Url.auth`` would - raise an exception instead of percent-encoding those characters. - -* Add support for ``HTTPResponse.auto_close = False`` which makes HTTP responses - work well with BufferedReaders and other ``io`` module features. (Pull #1652) - -* Percent-encode invalid characters in URL for ``HTTPConnectionPool.request()`` (Pull #1673) - - -1.25.3 (2019-05-23) -------------------- - -* Change ``HTTPSConnection`` to load system CA certificates - when ``ca_certs``, ``ca_cert_dir``, and ``ssl_context`` are - unspecified. (Pull #1608, Issue #1603) - -* Upgrade bundled rfc3986 to v1.3.2. (Pull #1609, Issue #1605) - - -1.25.2 (2019-04-28) -------------------- - -* Change ``is_ipaddress`` to not detect IPvFuture addresses. (Pull #1583) - -* Change ``parse_url`` to percent-encode invalid characters within the - path, query, and target components. (Pull #1586) - - -1.25.1 (2019-04-24) -------------------- - -* Add support for Google's ``Brotli`` package. (Pull #1572, Pull #1579) - -* Upgrade bundled rfc3986 to v1.3.1 (Pull #1578) - - -1.25 (2019-04-22) ------------------ - -* Require and validate certificates by default when using HTTPS (Pull #1507) - -* Upgraded ``urllib3.utils.parse_url()`` to be RFC 3986 compliant. (Pull #1487) - -* Added support for ``key_password`` for ``HTTPSConnectionPool`` to use - encrypted ``key_file`` without creating your own ``SSLContext`` object. (Pull #1489) - -* Add TLSv1.3 support to CPython, pyOpenSSL, and SecureTransport ``SSLContext`` - implementations. (Pull #1496) - -* Switched the default multipart header encoder from RFC 2231 to HTML 5 working draft. (Issue #303, PR #1492) - -* Fixed issue where OpenSSL would block if an encrypted client private key was - given and no password was given. Instead an ``SSLError`` is raised. (Pull #1489) - -* Added support for Brotli content encoding. It is enabled automatically if - ``brotlipy`` package is installed which can be requested with - ``urllib3[brotli]`` extra. (Pull #1532) - -* Drop ciphers using DSS key exchange from default TLS cipher suites. - Improve default ciphers when using SecureTransport. (Pull #1496) - -* Implemented a more efficient ``HTTPResponse.__iter__()`` method. (Issue #1483) - -1.24.3 (2019-05-01) -------------------- - -* Apply fix for CVE-2019-9740. (Pull #1591) - -1.24.2 (2019-04-17) -------------------- - -* Don't load system certificates by default when any other ``ca_certs``, ``ca_certs_dir`` or - ``ssl_context`` parameters are specified. - -* Remove Authorization header regardless of case when redirecting to cross-site. (Issue #1510) - -* Add support for IPv6 addresses in subjectAltName section of certificates. (Issue #1269) - - -1.24.1 (2018-11-02) -------------------- - -* Remove quadratic behavior within ``GzipDecoder.decompress()`` (Issue #1467) - -* Restored functionality of ``ciphers`` parameter for ``create_urllib3_context()``. (Issue #1462) - - -1.24 (2018-10-16) ------------------ - -* Allow key_server_hostname to be specified when initializing a PoolManager to allow custom SNI to be overridden. (Pull #1449) - -* Test against Python 3.7 on AppVeyor. (Pull #1453) - -* Early-out ipv6 checks when running on App Engine. (Pull #1450) - -* Change ambiguous description of backoff_factor (Pull #1436) - -* Add ability to handle multiple Content-Encodings (Issue #1441 and Pull #1442) - -* Skip DNS names that can't be idna-decoded when using pyOpenSSL (Issue #1405). - -* Add a server_hostname parameter to HTTPSConnection which allows for - overriding the SNI hostname sent in the handshake. (Pull #1397) - -* Drop support for EOL Python 2.6 (Pull #1429 and Pull #1430) - -* Fixed bug where responses with header Content-Type: message/* erroneously - raised HeaderParsingError, resulting in a warning being logged. (Pull #1439) - -* Move urllib3 to src/urllib3 (Pull #1409) - - -1.23 (2018-06-04) ------------------ - -* Allow providing a list of headers to strip from requests when redirecting - to a different host. Defaults to the ``Authorization`` header. Different - headers can be set via ``Retry.remove_headers_on_redirect``. (Issue #1316) - -* Fix ``util.selectors._fileobj_to_fd`` to accept ``long`` (Issue #1247). - -* Dropped Python 3.3 support. (Pull #1242) - -* Put the connection back in the pool when calling stream() or read_chunked() on - a chunked HEAD response. (Issue #1234) - -* Fixed pyOpenSSL-specific ssl client authentication issue when clients - attempted to auth via certificate + chain (Issue #1060) - -* Add the port to the connectionpool connect print (Pull #1251) - -* Don't use the ``uuid`` module to create multipart data boundaries. (Pull #1380) - -* ``read_chunked()`` on a closed response returns no chunks. (Issue #1088) - -* Add Python 2.6 support to ``contrib.securetransport`` (Pull #1359) - -* Added support for auth info in url for SOCKS proxy (Pull #1363) - - -1.22 (2017-07-20) ------------------ - -* Fixed missing brackets in ``HTTP CONNECT`` when connecting to IPv6 address via - IPv6 proxy. (Issue #1222) - -* Made the connection pool retry on ``SSLError``. The original ``SSLError`` - is available on ``MaxRetryError.reason``. (Issue #1112) - -* Drain and release connection before recursing on retry/redirect. Fixes - deadlocks with a blocking connectionpool. (Issue #1167) - -* Fixed compatibility for cookiejar. (Issue #1229) - -* pyopenssl: Use vendored version of ``six``. (Issue #1231) - - -1.21.1 (2017-05-02) -------------------- - -* Fixed SecureTransport issue that would cause long delays in response body - delivery. (Pull #1154) - -* Fixed regression in 1.21 that threw exceptions when users passed the - ``socket_options`` flag to the ``PoolManager``. (Issue #1165) - -* Fixed regression in 1.21 that threw exceptions when users passed the - ``assert_hostname`` or ``assert_fingerprint`` flag to the ``PoolManager``. - (Pull #1157) - - -1.21 (2017-04-25) ------------------ - -* Improved performance of certain selector system calls on Python 3.5 and - later. (Pull #1095) - -* Resolved issue where the PyOpenSSL backend would not wrap SysCallError - exceptions appropriately when sending data. (Pull #1125) - -* Selectors now detects a monkey-patched select module after import for modules - that patch the select module like eventlet, greenlet. (Pull #1128) - -* Reduced memory consumption when streaming zlib-compressed responses - (as opposed to raw deflate streams). (Pull #1129) - -* Connection pools now use the entire request context when constructing the - pool key. (Pull #1016) - -* ``PoolManager.connection_from_*`` methods now accept a new keyword argument, - ``pool_kwargs``, which are merged with the existing ``connection_pool_kw``. - (Pull #1016) - -* Add retry counter for ``status_forcelist``. (Issue #1147) - -* Added ``contrib`` module for using SecureTransport on macOS: - ``urllib3.contrib.securetransport``. (Pull #1122) - -* urllib3 now only normalizes the case of ``http://`` and ``https://`` schemes: - for schemes it does not recognise, it assumes they are case-sensitive and - leaves them unchanged. - (Issue #1080) - - -1.20 (2017-01-19) ------------------ - -* Added support for waiting for I/O using selectors other than select, - improving urllib3's behaviour with large numbers of concurrent connections. - (Pull #1001) - -* Updated the date for the system clock check. (Issue #1005) - -* ConnectionPools now correctly consider hostnames to be case-insensitive. - (Issue #1032) - -* Outdated versions of PyOpenSSL now cause the PyOpenSSL contrib module - to fail when it is injected, rather than at first use. (Pull #1063) - -* Outdated versions of cryptography now cause the PyOpenSSL contrib module - to fail when it is injected, rather than at first use. (Issue #1044) - -* Automatically attempt to rewind a file-like body object when a request is - retried or redirected. (Pull #1039) - -* Fix some bugs that occur when modules incautiously patch the queue module. - (Pull #1061) - -* Prevent retries from occurring on read timeouts for which the request method - was not in the method whitelist. (Issue #1059) - -* Changed the PyOpenSSL contrib module to lazily load idna to avoid - unnecessarily bloating the memory of programs that don't need it. (Pull - #1076) - -* Add support for IPv6 literals with zone identifiers. (Pull #1013) - -* Added support for socks5h:// and socks4a:// schemes when working with SOCKS - proxies, and controlled remote DNS appropriately. (Issue #1035) - - -1.19.1 (2016-11-16) -------------------- - -* Fixed AppEngine import that didn't function on Python 3.5. (Pull #1025) - - -1.19 (2016-11-03) ------------------ - -* urllib3 now respects Retry-After headers on 413, 429, and 503 responses when - using the default retry logic. (Pull #955) - -* Remove markers from setup.py to assist ancient setuptools versions. (Issue - #986) - -* Disallow superscripts and other integerish things in URL ports. (Issue #989) - -* Allow urllib3's HTTPResponse.stream() method to continue to work with - non-httplib underlying FPs. (Pull #990) - -* Empty filenames in multipart headers are now emitted as such, rather than - being suppressed. (Issue #1015) - -* Prefer user-supplied Host headers on chunked uploads. (Issue #1009) - - -1.18.1 (2016-10-27) -------------------- - -* CVE-2016-9015. Users who are using urllib3 version 1.17 or 1.18 along with - PyOpenSSL injection and OpenSSL 1.1.0 *must* upgrade to this version. This - release fixes a vulnerability whereby urllib3 in the above configuration - would silently fail to validate TLS certificates due to erroneously setting - invalid flags in OpenSSL's ``SSL_CTX_set_verify`` function. These erroneous - flags do not cause a problem in OpenSSL versions before 1.1.0, which - interprets the presence of any flag as requesting certificate validation. - - There is no PR for this patch, as it was prepared for simultaneous disclosure - and release. The master branch received the same fix in PR #1010. - - -1.18 (2016-09-26) ------------------ - -* Fixed incorrect message for IncompleteRead exception. (PR #973) - -* Accept ``iPAddress`` subject alternative name fields in TLS certificates. - (Issue #258) - -* Fixed consistency of ``HTTPResponse.closed`` between Python 2 and 3. - (Issue #977) - -* Fixed handling of wildcard certificates when using PyOpenSSL. (Issue #979) - - -1.17 (2016-09-06) ------------------ - -* Accept ``SSLContext`` objects for use in SSL/TLS negotiation. (Issue #835) - -* ConnectionPool debug log now includes scheme, host, and port. (Issue #897) - -* Substantially refactored documentation. (Issue #887) - -* Used URLFetch default timeout on AppEngine, rather than hardcoding our own. - (Issue #858) - -* Normalize the scheme and host in the URL parser (Issue #833) - -* ``HTTPResponse`` contains the last ``Retry`` object, which now also - contains retries history. (Issue #848) - -* Timeout can no longer be set as boolean, and must be greater than zero. - (PR #924) - -* Removed pyasn1 and ndg-httpsclient from dependencies used for PyOpenSSL. We - now use cryptography and idna, both of which are already dependencies of - PyOpenSSL. (PR #930) - -* Fixed infinite loop in ``stream`` when amt=None. (Issue #928) - -* Try to use the operating system's certificates when we are using an - ``SSLContext``. (PR #941) - -* Updated cipher suite list to allow ChaCha20+Poly1305. AES-GCM is preferred to - ChaCha20, but ChaCha20 is then preferred to everything else. (PR #947) - -* Updated cipher suite list to remove 3DES-based cipher suites. (PR #958) - -* Removed the cipher suite fallback to allow HIGH ciphers. (PR #958) - -* Implemented ``length_remaining`` to determine remaining content - to be read. (PR #949) - -* Implemented ``enforce_content_length`` to enable exceptions when - incomplete data chunks are received. (PR #949) - -* Dropped connection start, dropped connection reset, redirect, forced retry, - and new HTTPS connection log levels to DEBUG, from INFO. (PR #967) - - -1.16 (2016-06-11) ------------------ - -* Disable IPv6 DNS when IPv6 connections are not possible. (Issue #840) - -* Provide ``key_fn_by_scheme`` pool keying mechanism that can be - overridden. (Issue #830) - -* Normalize scheme and host to lowercase for pool keys, and include - ``source_address``. (Issue #830) - -* Cleaner exception chain in Python 3 for ``_make_request``. - (Issue #861) - -* Fixed installing ``urllib3[socks]`` extra. (Issue #864) - -* Fixed signature of ``ConnectionPool.close`` so it can actually safely be - called by subclasses. (Issue #873) - -* Retain ``release_conn`` state across retries. (Issues #651, #866) - -* Add customizable ``HTTPConnectionPool.ResponseCls``, which defaults to - ``HTTPResponse`` but can be replaced with a subclass. (Issue #879) - - -1.15.1 (2016-04-11) -------------------- - -* Fix packaging to include backports module. (Issue #841) - - -1.15 (2016-04-06) ------------------ - -* Added Retry(raise_on_status=False). (Issue #720) - -* Always use setuptools, no more distutils fallback. (Issue #785) - -* Dropped support for Python 3.2. (Issue #786) - -* Chunked transfer encoding when requesting with ``chunked=True``. - (Issue #790) - -* Fixed regression with IPv6 port parsing. (Issue #801) - -* Append SNIMissingWarning messages to allow users to specify it in - the PYTHONWARNINGS environment variable. (Issue #816) - -* Handle unicode headers in Py2. (Issue #818) - -* Log certificate when there is a hostname mismatch. (Issue #820) - -* Preserve order of request/response headers. (Issue #821) - - -1.14 (2015-12-29) ------------------ - -* contrib: SOCKS proxy support! (Issue #762) - -* Fixed AppEngine handling of transfer-encoding header and bug - in Timeout defaults checking. (Issue #763) - - -1.13.1 (2015-12-18) -------------------- - -* Fixed regression in IPv6 + SSL for match_hostname. (Issue #761) - - -1.13 (2015-12-14) ------------------ - -* Fixed ``pip install urllib3[secure]`` on modern pip. (Issue #706) - -* pyopenssl: Fixed SSL3_WRITE_PENDING error. (Issue #717) - -* pyopenssl: Support for TLSv1.1 and TLSv1.2. (Issue #696) - -* Close connections more defensively on exception. (Issue #734) - -* Adjusted ``read_chunked`` to handle gzipped, chunk-encoded bodies without - repeatedly flushing the decoder, to function better on Jython. (Issue #743) - -* Accept ``ca_cert_dir`` for SSL-related PoolManager configuration. (Issue #758) - - -1.12 (2015-09-03) ------------------ - -* Rely on ``six`` for importing ``httplib`` to work around - conflicts with other Python 3 shims. (Issue #688) - -* Add support for directories of certificate authorities, as supported by - OpenSSL. (Issue #701) - -* New exception: ``NewConnectionError``, raised when we fail to establish - a new connection, usually ``ECONNREFUSED`` socket error. - - -1.11 (2015-07-21) ------------------ - -* When ``ca_certs`` is given, ``cert_reqs`` defaults to - ``'CERT_REQUIRED'``. (Issue #650) - -* ``pip install urllib3[secure]`` will install Certifi and - PyOpenSSL as dependencies. (Issue #678) - -* Made ``HTTPHeaderDict`` usable as a ``headers`` input value - (Issues #632, #679) - -* Added `urllib3.contrib.appengine <https://urllib3.readthedocs.io/en/latest/contrib.html#google-app-engine>`_ - which has an ``AppEngineManager`` for using ``URLFetch`` in a - Google AppEngine environment. (Issue #664) - -* Dev: Added test suite for AppEngine. (Issue #631) - -* Fix performance regression when using PyOpenSSL. (Issue #626) - -* Passing incorrect scheme (e.g. ``foo://``) will raise - ``ValueError`` instead of ``AssertionError`` (backwards - compatible for now, but please migrate). (Issue #640) - -* Fix pools not getting replenished when an error occurs during a - request using ``release_conn=False``. (Issue #644) - -* Fix pool-default headers not applying for url-encoded requests - like GET. (Issue #657) - -* log.warning in Python 3 when headers are skipped due to parsing - errors. (Issue #642) - -* Close and discard connections if an error occurs during read. - (Issue #660) - -* Fix host parsing for IPv6 proxies. (Issue #668) - -* Separate warning type SubjectAltNameWarning, now issued once - per host. (Issue #671) - -* Fix ``httplib.IncompleteRead`` not getting converted to - ``ProtocolError`` when using ``HTTPResponse.stream()`` - (Issue #674) - -1.10.4 (2015-05-03) -------------------- - -* Migrate tests to Tornado 4. (Issue #594) - -* Append default warning configuration rather than overwrite. - (Issue #603) - -* Fix streaming decoding regression. (Issue #595) - -* Fix chunked requests losing state across keep-alive connections. - (Issue #599) - -* Fix hanging when chunked HEAD response has no body. (Issue #605) - - -1.10.3 (2015-04-21) -------------------- - -* Emit ``InsecurePlatformWarning`` when SSLContext object is missing. - (Issue #558) - -* Fix regression of duplicate header keys being discarded. - (Issue #563) - -* ``Response.stream()`` returns a generator for chunked responses. - (Issue #560) - -* Set upper-bound timeout when waiting for a socket in PyOpenSSL. - (Issue #585) - -* Work on platforms without `ssl` module for plain HTTP requests. - (Issue #587) - -* Stop relying on the stdlib's default cipher list. (Issue #588) - - -1.10.2 (2015-02-25) -------------------- - -* Fix file descriptor leakage on retries. (Issue #548) - -* Removed RC4 from default cipher list. (Issue #551) - -* Header performance improvements. (Issue #544) - -* Fix PoolManager not obeying redirect retry settings. (Issue #553) - - -1.10.1 (2015-02-10) -------------------- - -* Pools can be used as context managers. (Issue #545) - -* Don't re-use connections which experienced an SSLError. (Issue #529) - -* Don't fail when gzip decoding an empty stream. (Issue #535) - -* Add sha256 support for fingerprint verification. (Issue #540) - -* Fixed handling of header values containing commas. (Issue #533) - - -1.10 (2014-12-14) ------------------ - -* Disabled SSLv3. (Issue #473) - -* Add ``Url.url`` property to return the composed url string. (Issue #394) - -* Fixed PyOpenSSL + gevent ``WantWriteError``. (Issue #412) - -* ``MaxRetryError.reason`` will always be an exception, not string. - (Issue #481) - -* Fixed SSL-related timeouts not being detected as timeouts. (Issue #492) - -* Py3: Use ``ssl.create_default_context()`` when available. (Issue #473) - -* Emit ``InsecureRequestWarning`` for *every* insecure HTTPS request. - (Issue #496) - -* Emit ``SecurityWarning`` when certificate has no ``subjectAltName``. - (Issue #499) - -* Close and discard sockets which experienced SSL-related errors. - (Issue #501) - -* Handle ``body`` param in ``.request(...)``. (Issue #513) - -* Respect timeout with HTTPS proxy. (Issue #505) - -* PyOpenSSL: Handle ZeroReturnError exception. (Issue #520) - - -1.9.1 (2014-09-13) ------------------- - -* Apply socket arguments before binding. (Issue #427) - -* More careful checks if fp-like object is closed. (Issue #435) - -* Fixed packaging issues of some development-related files not - getting included. (Issue #440) - -* Allow performing *only* fingerprint verification. (Issue #444) - -* Emit ``SecurityWarning`` if system clock is waaay off. (Issue #445) - -* Fixed PyOpenSSL compatibility with PyPy. (Issue #450) - -* Fixed ``BrokenPipeError`` and ``ConnectionError`` handling in Py3. - (Issue #443) - - - -1.9 (2014-07-04) ----------------- - -* Shuffled around development-related files. If you're maintaining a distro - package of urllib3, you may need to tweak things. (Issue #415) - -* Unverified HTTPS requests will trigger a warning on the first request. See - our new `security documentation - <https://urllib3.readthedocs.io/en/latest/security.html>`_ for details. - (Issue #426) - -* New retry logic and ``urllib3.util.retry.Retry`` configuration object. - (Issue #326) - -* All raised exceptions should now wrapped in a - ``urllib3.exceptions.HTTPException``-extending exception. (Issue #326) - -* All errors during a retry-enabled request should be wrapped in - ``urllib3.exceptions.MaxRetryError``, including timeout-related exceptions - which were previously exempt. Underlying error is accessible from the - ``.reason`` property. (Issue #326) - -* ``urllib3.exceptions.ConnectionError`` renamed to - ``urllib3.exceptions.ProtocolError``. (Issue #326) - -* Errors during response read (such as IncompleteRead) are now wrapped in - ``urllib3.exceptions.ProtocolError``. (Issue #418) - -* Requesting an empty host will raise ``urllib3.exceptions.LocationValueError``. - (Issue #417) - -* Catch read timeouts over SSL connections as - ``urllib3.exceptions.ReadTimeoutError``. (Issue #419) - -* Apply socket arguments before connecting. (Issue #427) - - -1.8.3 (2014-06-23) ------------------- - -* Fix TLS verification when using a proxy in Python 3.4.1. (Issue #385) - -* Add ``disable_cache`` option to ``urllib3.util.make_headers``. (Issue #393) - -* Wrap ``socket.timeout`` exception with - ``urllib3.exceptions.ReadTimeoutError``. (Issue #399) - -* Fixed proxy-related bug where connections were being reused incorrectly. - (Issues #366, #369) - -* Added ``socket_options`` keyword parameter which allows to define - ``setsockopt`` configuration of new sockets. (Issue #397) - -* Removed ``HTTPConnection.tcp_nodelay`` in favor of - ``HTTPConnection.default_socket_options``. (Issue #397) - -* Fixed ``TypeError`` bug in Python 2.6.4. (Issue #411) - - -1.8.2 (2014-04-17) ------------------- - -* Fix ``urllib3.util`` not being included in the package. - - -1.8.1 (2014-04-17) ------------------- - -* Fix AppEngine bug of HTTPS requests going out as HTTP. (Issue #356) - -* Don't install ``dummyserver`` into ``site-packages`` as it's only needed - for the test suite. (Issue #362) - -* Added support for specifying ``source_address``. (Issue #352) - - -1.8 (2014-03-04) ----------------- - -* Improved url parsing in ``urllib3.util.parse_url`` (properly parse '@' in - username, and blank ports like 'hostname:'). - -* New ``urllib3.connection`` module which contains all the HTTPConnection - objects. - -* Several ``urllib3.util.Timeout``-related fixes. Also changed constructor - signature to a more sensible order. [Backwards incompatible] - (Issues #252, #262, #263) - -* Use ``backports.ssl_match_hostname`` if it's installed. (Issue #274) - -* Added ``.tell()`` method to ``urllib3.response.HTTPResponse`` which - returns the number of bytes read so far. (Issue #277) - -* Support for platforms without threading. (Issue #289) - -* Expand default-port comparison in ``HTTPConnectionPool.is_same_host`` - to allow a pool with no specified port to be considered equal to to an - HTTP/HTTPS url with port 80/443 explicitly provided. (Issue #305) - -* Improved default SSL/TLS settings to avoid vulnerabilities. - (Issue #309) - -* Fixed ``urllib3.poolmanager.ProxyManager`` not retrying on connect errors. - (Issue #310) - -* Disable Nagle's Algorithm on the socket for non-proxies. A subset of requests - will send the entire HTTP request ~200 milliseconds faster; however, some of - the resulting TCP packets will be smaller. (Issue #254) - -* Increased maximum number of SubjectAltNames in ``urllib3.contrib.pyopenssl`` - from the default 64 to 1024 in a single certificate. (Issue #318) - -* Headers are now passed and stored as a custom - ``urllib3.collections_.HTTPHeaderDict`` object rather than a plain ``dict``. - (Issue #329, #333) - -* Headers no longer lose their case on Python 3. (Issue #236) - -* ``urllib3.contrib.pyopenssl`` now uses the operating system's default CA - certificates on inject. (Issue #332) - -* Requests with ``retries=False`` will immediately raise any exceptions without - wrapping them in ``MaxRetryError``. (Issue #348) - -* Fixed open socket leak with SSL-related failures. (Issue #344, #348) - - -1.7.1 (2013-09-25) ------------------- - -* Added granular timeout support with new ``urllib3.util.Timeout`` class. - (Issue #231) - -* Fixed Python 3.4 support. (Issue #238) - - -1.7 (2013-08-14) ----------------- - -* More exceptions are now pickle-able, with tests. (Issue #174) - -* Fixed redirecting with relative URLs in Location header. (Issue #178) - -* Support for relative urls in ``Location: ...`` header. (Issue #179) - -* ``urllib3.response.HTTPResponse`` now inherits from ``io.IOBase`` for bonus - file-like functionality. (Issue #187) - -* Passing ``assert_hostname=False`` when creating a HTTPSConnectionPool will - skip hostname verification for SSL connections. (Issue #194) - -* New method ``urllib3.response.HTTPResponse.stream(...)`` which acts as a - generator wrapped around ``.read(...)``. (Issue #198) - -* IPv6 url parsing enforces brackets around the hostname. (Issue #199) - -* Fixed thread race condition in - ``urllib3.poolmanager.PoolManager.connection_from_host(...)`` (Issue #204) - -* ``ProxyManager`` requests now include non-default port in ``Host: ...`` - header. (Issue #217) - -* Added HTTPS proxy support in ``ProxyManager``. (Issue #170 #139) - -* New ``RequestField`` object can be passed to the ``fields=...`` param which - can specify headers. (Issue #220) - -* Raise ``urllib3.exceptions.ProxyError`` when connecting to proxy fails. - (Issue #221) - -* Use international headers when posting file names. (Issue #119) - -* Improved IPv6 support. (Issue #203) - - -1.6 (2013-04-25) ----------------- - -* Contrib: Optional SNI support for Py2 using PyOpenSSL. (Issue #156) - -* ``ProxyManager`` automatically adds ``Host: ...`` header if not given. - -* Improved SSL-related code. ``cert_req`` now optionally takes a string like - "REQUIRED" or "NONE". Same with ``ssl_version`` takes strings like "SSLv23" - The string values reflect the suffix of the respective constant variable. - (Issue #130) - -* Vendored ``socksipy`` now based on Anorov's fork which handles unexpectedly - closed proxy connections and larger read buffers. (Issue #135) - -* Ensure the connection is closed if no data is received, fixes connection leak - on some platforms. (Issue #133) - -* Added SNI support for SSL/TLS connections on Py32+. (Issue #89) - -* Tests fixed to be compatible with Py26 again. (Issue #125) - -* Added ability to choose SSL version by passing an ``ssl.PROTOCOL_*`` constant - to the ``ssl_version`` parameter of ``HTTPSConnectionPool``. (Issue #109) - -* Allow an explicit content type to be specified when encoding file fields. - (Issue #126) - -* Exceptions are now pickleable, with tests. (Issue #101) - -* Fixed default headers not getting passed in some cases. (Issue #99) - -* Treat "content-encoding" header value as case-insensitive, per RFC 2616 - Section 3.5. (Issue #110) - -* "Connection Refused" SocketErrors will get retried rather than raised. - (Issue #92) - -* Updated vendored ``six``, no longer overrides the global ``six`` module - namespace. (Issue #113) - -* ``urllib3.exceptions.MaxRetryError`` contains a ``reason`` property holding - the exception that prompted the final retry. If ``reason is None`` then it - was due to a redirect. (Issue #92, #114) - -* Fixed ``PoolManager.urlopen()`` from not redirecting more than once. - (Issue #149) - -* Don't assume ``Content-Type: text/plain`` for multi-part encoding parameters - that are not files. (Issue #111) - -* Pass `strict` param down to ``httplib.HTTPConnection``. (Issue #122) - -* Added mechanism to verify SSL certificates by fingerprint (md5, sha1) or - against an arbitrary hostname (when connecting by IP or for misconfigured - servers). (Issue #140) - -* Streaming decompression support. (Issue #159) - - -1.5 (2012-08-02) ----------------- - -* Added ``urllib3.add_stderr_logger()`` for quickly enabling STDERR debug - logging in urllib3. - -* Native full URL parsing (including auth, path, query, fragment) available in - ``urllib3.util.parse_url(url)``. - -* Built-in redirect will switch method to 'GET' if status code is 303. - (Issue #11) - -* ``urllib3.PoolManager`` strips the scheme and host before sending the request - uri. (Issue #8) - -* New ``urllib3.exceptions.DecodeError`` exception for when automatic decoding, - based on the Content-Type header, fails. - -* Fixed bug with pool depletion and leaking connections (Issue #76). Added - explicit connection closing on pool eviction. Added - ``urllib3.PoolManager.clear()``. - -* 99% -> 100% unit test coverage. - - -1.4 (2012-06-16) ----------------- - -* Minor AppEngine-related fixes. - -* Switched from ``mimetools.choose_boundary`` to ``uuid.uuid4()``. - -* Improved url parsing. (Issue #73) - -* IPv6 url support. (Issue #72) - - -1.3 (2012-03-25) ----------------- - -* Removed pre-1.0 deprecated API. - -* Refactored helpers into a ``urllib3.util`` submodule. - -* Fixed multipart encoding to support list-of-tuples for keys with multiple - values. (Issue #48) - -* Fixed multiple Set-Cookie headers in response not getting merged properly in - Python 3. (Issue #53) - -* AppEngine support with Py27. (Issue #61) - -* Minor ``encode_multipart_formdata`` fixes related to Python 3 strings vs - bytes. - - -1.2.2 (2012-02-06) ------------------- - -* Fixed packaging bug of not shipping ``test-requirements.txt``. (Issue #47) - - -1.2.1 (2012-02-05) ------------------- - -* Fixed another bug related to when ``ssl`` module is not available. (Issue #41) - -* Location parsing errors now raise ``urllib3.exceptions.LocationParseError`` - which inherits from ``ValueError``. - - -1.2 (2012-01-29) ----------------- - -* Added Python 3 support (tested on 3.2.2) - -* Dropped Python 2.5 support (tested on 2.6.7, 2.7.2) - -* Use ``select.poll`` instead of ``select.select`` for platforms that support - it. - -* Use ``Queue.LifoQueue`` instead of ``Queue.Queue`` for more aggressive - connection reusing. Configurable by overriding ``ConnectionPool.QueueCls``. - -* Fixed ``ImportError`` during install when ``ssl`` module is not available. - (Issue #41) - -* Fixed ``PoolManager`` redirects between schemes (such as HTTP -> HTTPS) not - completing properly. (Issue #28, uncovered by Issue #10 in v1.1) - -* Ported ``dummyserver`` to use ``tornado`` instead of ``webob`` + - ``eventlet``. Removed extraneous unsupported dummyserver testing backends. - Added socket-level tests. - -* More tests. Achievement Unlocked: 99% Coverage. - - -1.1 (2012-01-07) ----------------- - -* Refactored ``dummyserver`` to its own root namespace module (used for - testing). - -* Added hostname verification for ``VerifiedHTTPSConnection`` by vendoring in - Py32's ``ssl_match_hostname``. (Issue #25) - -* Fixed cross-host HTTP redirects when using ``PoolManager``. (Issue #10) - -* Fixed ``decode_content`` being ignored when set through ``urlopen``. (Issue - #27) - -* Fixed timeout-related bugs. (Issues #17, #23) - - -1.0.2 (2011-11-04) ------------------- - -* Fixed typo in ``VerifiedHTTPSConnection`` which would only present as a bug if - you're using the object manually. (Thanks pyos) - -* Made RecentlyUsedContainer (and consequently PoolManager) more thread-safe by - wrapping the access log in a mutex. (Thanks @christer) - -* Made RecentlyUsedContainer more dict-like (corrected ``__delitem__`` and - ``__getitem__`` behaviour), with tests. Shouldn't affect core urllib3 code. - - -1.0.1 (2011-10-10) ------------------- - -* Fixed a bug where the same connection would get returned into the pool twice, - causing extraneous "HttpConnectionPool is full" log warnings. - - -1.0 (2011-10-08) ----------------- - -* Added ``PoolManager`` with LRU expiration of connections (tested and - documented). -* Added ``ProxyManager`` (needs tests, docs, and confirmation that it works - with HTTPS proxies). -* Added optional partial-read support for responses when - ``preload_content=False``. You can now make requests and just read the headers - without loading the content. -* Made response decoding optional (default on, same as before). -* Added optional explicit boundary string for ``encode_multipart_formdata``. -* Convenience request methods are now inherited from ``RequestMethods``. Old - helpers like ``get_url`` and ``post_url`` should be abandoned in favour of - the new ``request(method, url, ...)``. -* Refactored code to be even more decoupled, reusable, and extendable. -* License header added to ``.py`` files. -* Embiggened the documentation: Lots of Sphinx-friendly docstrings in the code - and docs in ``docs/`` and on https://urllib3.readthedocs.io/. -* Embettered all the things! -* Started writing this file. - - -0.4.1 (2011-07-17) ------------------- - -* Minor bug fixes, code cleanup. - - -0.4 (2011-03-01) ----------------- - -* Better unicode support. -* Added ``VerifiedHTTPSConnection``. -* Added ``NTLMConnectionPool`` in contrib. -* Minor improvements. - - -0.3.1 (2010-07-13) ------------------- - -* Added ``assert_host_name`` optional parameter. Now compatible with proxies. - - -0.3 (2009-12-10) ----------------- - -* Added HTTPS support. -* Minor bug fixes. -* Refactored, broken backwards compatibility with 0.2. -* API to be treated as stable from this version forward. - - -0.2 (2008-11-17) ----------------- - -* Added unit tests. -* Bug fixes. - - -0.1 (2008-11-16) ----------------- - -* First release. - - diff --git a/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/RECORD b/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/RECORD deleted file mode 100644 index 0f0f0b1..0000000 --- a/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/RECORD +++ /dev/null @@ -1,78 +0,0 @@ -urllib3-1.25.8.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -urllib3-1.25.8.dist-info/LICENSE.txt,sha256=fA0TbuBYU4mt8tJWcbuZaHofdZKfRlt_Fu4_Ado3JV4,1115 -urllib3-1.25.8.dist-info/METADATA,sha256=wpZVQoSoPynUpjdB1CXW1wqWCss1St4E3ZQeb9GWABI,38976 -urllib3-1.25.8.dist-info/RECORD,, -urllib3-1.25.8.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 -urllib3-1.25.8.dist-info/top_level.txt,sha256=EMiXL2sKrTcmrMxIHTqdc3ET54pQI2Y072LexFEemvo,8 -urllib3/__init__.py,sha256=oVOeFuNyEg33ShIefD4qSeGvbb-aJ3otjcdX2iswkLM,2683 -urllib3/__pycache__/__init__.cpython-38.pyc,, -urllib3/__pycache__/_collections.cpython-38.pyc,, -urllib3/__pycache__/connection.cpython-38.pyc,, -urllib3/__pycache__/connectionpool.cpython-38.pyc,, -urllib3/__pycache__/exceptions.cpython-38.pyc,, -urllib3/__pycache__/fields.cpython-38.pyc,, -urllib3/__pycache__/filepost.cpython-38.pyc,, -urllib3/__pycache__/poolmanager.cpython-38.pyc,, -urllib3/__pycache__/request.cpython-38.pyc,, -urllib3/__pycache__/response.cpython-38.pyc,, -urllib3/_collections.py,sha256=GouVsNzwg6jADZTmimMI6oqmwKSswnMo9dh5tGNVWO4,10792 -urllib3/connection.py,sha256=wHpV1S60bvXWnqEDtdzmHiY9NwIiKeFwQI5VvX7AtqM,14026 -urllib3/connectionpool.py,sha256=jg_yTHo2B3Zyo4urYVecyg-34v3hxUrH9B401-c4A9w,36513 -urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -urllib3/contrib/__pycache__/__init__.cpython-38.pyc,, -urllib3/contrib/__pycache__/_appengine_environ.cpython-38.pyc,, -urllib3/contrib/__pycache__/appengine.cpython-38.pyc,, -urllib3/contrib/__pycache__/ntlmpool.cpython-38.pyc,, -urllib3/contrib/__pycache__/pyopenssl.cpython-38.pyc,, -urllib3/contrib/__pycache__/securetransport.cpython-38.pyc,, -urllib3/contrib/__pycache__/socks.cpython-38.pyc,, -urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957 -urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -urllib3/contrib/_securetransport/__pycache__/__init__.cpython-38.pyc,, -urllib3/contrib/_securetransport/__pycache__/bindings.cpython-38.pyc,, -urllib3/contrib/_securetransport/__pycache__/low_level.cpython-38.pyc,, -urllib3/contrib/_securetransport/bindings.py,sha256=mullWYFaghBdRWla6HYU-TBgFRTPLBEfxj3jplbeJmQ,16886 -urllib3/contrib/_securetransport/low_level.py,sha256=V7GnujxnWZh2N2sMsV5N4d9Imymokkm3zBwgt77_bSE,11956 -urllib3/contrib/appengine.py,sha256=9RyUW5vKy4VPa2imtwBNWYKILrypr-K6UXEHUYsf0JY,11010 -urllib3/contrib/ntlmpool.py,sha256=a402AwGN_Ll3N-4ur_AS6UrU-ycUtlnYqoBF76lORg8,4160 -urllib3/contrib/pyopenssl.py,sha256=Lp95UgpAQsI5-zTGy42-oxU_2n6XyneC7gNHw3qx0Cw,16423 -urllib3/contrib/securetransport.py,sha256=iKzVUAxKnChsADR5YMwc05oEixXDzAk0xPU0g-rc2z8,32275 -urllib3/contrib/socks.py,sha256=nzDMgDIFJWVubKHqvIn2-SKCO91hhJInP92WgHChGzA,7036 -urllib3/exceptions.py,sha256=P3e-p9_LScyIxX7FoR3wU0A6hZmDqFAVCz2wgI3D0lM,6607 -urllib3/fields.py,sha256=kroD76QK-GdHHW7f_AUN4XxDC3OQPI2FFrS9eSL4BCs,8553 -urllib3/filepost.py,sha256=vj0qbrpT1AFzvvW4SuC8M5kJiw7wftHcSr-7b8UpPpw,2440 -urllib3/packages/__init__.py,sha256=h4BLhD4tLaBx1adaDtKXfupsgqY0wWLXb_f1_yVlV6A,108 -urllib3/packages/__pycache__/__init__.cpython-38.pyc,, -urllib3/packages/__pycache__/six.cpython-38.pyc,, -urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -urllib3/packages/backports/__pycache__/__init__.cpython-38.pyc,, -urllib3/packages/backports/__pycache__/makefile.cpython-38.pyc,, -urllib3/packages/backports/makefile.py,sha256=005wrvH-_pWSnTFqQ2sdzzh4zVCtQUUQ4mR2Yyxwc0A,1418 -urllib3/packages/six.py,sha256=adx4z-eM_D0Vvu0IIqVzFACQ_ux9l64y7DkSEfbxCDs,32536 -urllib3/packages/ssl_match_hostname/__init__.py,sha256=ywgKMtfHi1-DrXlzPfVAhzsLzzqcK7GT6eLgdode1Fg,688 -urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-38.pyc,, -urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-38.pyc,, -urllib3/packages/ssl_match_hostname/_implementation.py,sha256=6dZ-q074g7XhsJ27MFCgkct8iVNZB3sMZvKhf-KUVy0,5679 -urllib3/poolmanager.py,sha256=JYUyBUN3IiEknUdjZ7VJrpCQr6SP7vi0WwSndrn8XpE,17053 -urllib3/request.py,sha256=hhoHvEEatyd9Tn5EbGjQ0emn-ENMCyY591yNWTneINA,6018 -urllib3/response.py,sha256=5OVDLR6ss88mak30ZhDaSqHxXbbAQ7CIUrktI7B5aPA,27833 -urllib3/util/__init__.py,sha256=bWNaav_OT-1L7-sxm59cGb59rDORlbhb_4noduM5m0U,1038 -urllib3/util/__pycache__/__init__.cpython-38.pyc,, -urllib3/util/__pycache__/connection.cpython-38.pyc,, -urllib3/util/__pycache__/queue.cpython-38.pyc,, -urllib3/util/__pycache__/request.cpython-38.pyc,, -urllib3/util/__pycache__/response.cpython-38.pyc,, -urllib3/util/__pycache__/retry.cpython-38.pyc,, -urllib3/util/__pycache__/ssl_.cpython-38.pyc,, -urllib3/util/__pycache__/timeout.cpython-38.pyc,, -urllib3/util/__pycache__/url.cpython-38.pyc,, -urllib3/util/__pycache__/wait.cpython-38.pyc,, -urllib3/util/connection.py,sha256=NsxUAKQ98GKywta--zg57CdVpeTCI6N-GElCq78Dl8U,4637 -urllib3/util/queue.py,sha256=myTX3JDHntglKQNBf3b6dasHH-uF-W59vzGSQiFdAfI,497 -urllib3/util/request.py,sha256=C-6-AWffxZG03AdRGoY59uqsn4CVItKU6gjxz7Hc3Mc,3815 -urllib3/util/response.py,sha256=_WbTQr8xRQuJuY2rTIZxVdJD6mnEOtQupjaK_bF_Vj8,2573 -urllib3/util/retry.py,sha256=Ui74h44gLIIWkAxT9SK3A2mEvu55-odWgJMw3LiUNGk,15450 -urllib3/util/ssl_.py,sha256=9lyLPCmz4lzob2O384XSa84Y0m4l3TbULoVxfeaPzQE,14155 -urllib3/util/timeout.py,sha256=bCtaS_xVKaTDJ5VMlroXBfCnPUDNVGZqik7-z83issg,9871 -urllib3/util/url.py,sha256=jqI2IgFwthDybHmmmiN_Kh8ViNOxh6I-WtZaZFEaXos,13962 -urllib3/util/wait.py,sha256=k46KzqIYu3Vnzla5YW3EvtInNlU_QycFqQAghIOxoAg,5406 diff --git a/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/WHEEL b/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/WHEEL deleted file mode 100644 index 8b701e9..0000000 --- a/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.33.6) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/top_level.txt b/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/top_level.txt deleted file mode 100644 index a42590b..0000000 --- a/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -urllib3 diff --git a/venv/lib/python3.8/site-packages/urllib3/__init__.py b/venv/lib/python3.8/site-packages/urllib3/__init__.py deleted file mode 100644 index 9bd8323..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/__init__.py +++ /dev/null @@ -1,86 +0,0 @@ -""" -urllib3 - Thread-safe connection pooling and re-using. -""" -from __future__ import absolute_import -import warnings - -from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, connection_from_url - -from . import exceptions -from .filepost import encode_multipart_formdata -from .poolmanager import PoolManager, ProxyManager, proxy_from_url -from .response import HTTPResponse -from .util.request import make_headers -from .util.url import get_host -from .util.timeout import Timeout -from .util.retry import Retry - - -# Set default logging handler to avoid "No handler found" warnings. -import logging -from logging import NullHandler - -__author__ = "Andrey Petrov (andrey.petrov@shazow.net)" -__license__ = "MIT" -__version__ = "1.25.8" - -__all__ = ( - "HTTPConnectionPool", - "HTTPSConnectionPool", - "PoolManager", - "ProxyManager", - "HTTPResponse", - "Retry", - "Timeout", - "add_stderr_logger", - "connection_from_url", - "disable_warnings", - "encode_multipart_formdata", - "get_host", - "make_headers", - "proxy_from_url", -) - -logging.getLogger(__name__).addHandler(NullHandler()) - - -def add_stderr_logger(level=logging.DEBUG): - """ - Helper for quickly adding a StreamHandler to the logger. Useful for - debugging. - - Returns the handler after adding it. - """ - # This method needs to be in this __init__.py to get the __name__ correct - # even if urllib3 is vendored within another package. - logger = logging.getLogger(__name__) - handler = logging.StreamHandler() - handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s")) - logger.addHandler(handler) - logger.setLevel(level) - logger.debug("Added a stderr logging handler to logger: %s", __name__) - return handler - - -# ... Clean up. -del NullHandler - - -# All warning filters *must* be appended unless you're really certain that they -# shouldn't be: otherwise, it's very hard for users to use most Python -# mechanisms to silence them. -# SecurityWarning's always go off by default. -warnings.simplefilter("always", exceptions.SecurityWarning, append=True) -# SubjectAltNameWarning's should go off once per host -warnings.simplefilter("default", exceptions.SubjectAltNameWarning, append=True) -# InsecurePlatformWarning's don't vary between requests, so we keep it default. -warnings.simplefilter("default", exceptions.InsecurePlatformWarning, append=True) -# SNIMissingWarnings should go off only once. -warnings.simplefilter("default", exceptions.SNIMissingWarning, append=True) - - -def disable_warnings(category=exceptions.HTTPWarning): - """ - Helper for quickly disabling all urllib3 warnings. - """ - warnings.simplefilter("ignore", category) diff --git a/venv/lib/python3.8/site-packages/urllib3/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index cddb5b45fa52a436553862a59eb4a65e2ca23664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2074 zcmZ`)-ESN<5Z{mc*!xT_A5D|+u`Pt=pt*=brGg4-X(_GLMp2Rq$w;i6v+r(Gdv|Ml z)83Ijfq3J8NFL!&@+(jM7kFaqy=zh`cC~Xe<MDVr^P9P+tybNE=dW+JfBpryzm0J5 zDT8naKKZ5VIK)8?af!!V?jg@Lyw7~(lM*Sj5-+1Nub>LAqAIMFNQDKwhH93tvN~^| zhUEj+<So?VZPey-XwK?tY@T;e$MSWyz!%Y?<r{2?FQaA4H`yh=f>tcwVwd?US_R(3 zu!h#)x6Ri0I$8(a9D0w;qxVS%eLxn_hji^Uq*u<|)2np-SLe)i9lCb((ZD5(Wa&2- zef-lp^^Z2lGOZnbLN1Y&KYXw-n#-WM_Ks%r9ZmO*rgrox_+2Gy;P*4)?>pV~$*p=W z7>f_T2)Dw6k)W7tNj#uoKTQ(aS8<wzS(>sq8HP9^p`cs21ff@dZ7R`q^&CEwDa#d& zVxFZ!?YxF!I9*>aJUlqqz4yk=E_l(4Mz{Z8<@s6BK%_i^h`@23zU<S?L?A(0rAa>} zG~zi^afXG82C3i#D-1_9jPoZr!9yx^b62D<$1|y&8R??mrio#X$_yM+@Z9A18I4A8 zb1KY9!H}wGlu8AB^&sXn%?(@Lqe_f{Y3$^TJ%nU1DkhtE6C&t1+=a#TINSs^h`r2; zcjO39(igpis;>5*JUW<EKJVSQ*}K(kixMPB7yyf!AqME8X~?`Gb3k+l6B0=UVTp*P zL%5r$82vnnB|c;{dVxg(wU8n(d)kJy3~2!An<~s69~g7iJ^17UAj&y)m3QX8a)I;D zoLAn7cUl6zOx!bgUFXC-t(<^`<*FwZn4k-Y2m7GCPCS5*Kl!~L!t;=_jEWE{5<bu4 z{xdcXA$E(Ia9;ta_%vUkN<%fGVR4;a_*BwC&df&ZhtR`(IJEGxGNe2giL_frMaDxs zP;k`LeXM%caI&$ni6y|5)2<9RHW@vpEWuNWQz-!&T{*damk>%q92RM{ahNb?&LO-a zw6DVr*{$iSk-$LL02GgH4RjDi#&Z<u)?0VeO-a=Q03}usp{|{?b%=JF03CqQV-uY& z+uH(q%QjkFDNfeaX)u2};tG`NpPSo?XWLnvZN-UHn6a(F@%Y(S>L%Tuw(gtXD2kI< zMNuysi$&PGZR%}s;neDG;Lf{sc$=<W(-q8K;ITXaNLO%{(S+zKp#uyJ_7->ykPKQa zcnmrXc!&#-FjKaG!R`NpK><~Z1jfSIsF?w`D4wpw!z2}Sr|aopwglOPdBW%*W{^#Y zG3aAOhp8CbtQ6!bL?f1f?7=5JAWq53-Rrs<MI`M*mFiJ6$N@)CF=0%^H6XfuK6K1{ zyU>re#~e{LRskGOGnfUo#dO1%@?y?h=v&ioIuO&5V%r!sa}~3mpwDv(yG>i7z^Whz zwpFJV2C^_<Y{#SebQ27kVh$|BKG8Am;TAYoqg23+8d1dJK85jB2*)tEU`&Dlmj-~q zMK76+D~7C_-R1k=fA{nUTX(T(6m$EupNm+He=KH*Uf$0Sk6_^6Woie|JyWkdf>Xef z?lP>PP5Er0v%mA`Ni5BO!A#XKgLNv{DqN_PL9#IA(!p(>lAO_R4X)%3ASJ))2Huj_ d1ZXb7H+@Ti+w@8<yk4oZ;I|jO>Vjuq|6jImN00yj diff --git a/venv/lib/python3.8/site-packages/urllib3/__pycache__/_collections.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/__pycache__/_collections.cpython-38.pyc deleted file mode 100644 index 9eaeafb2d62cafee9d44003e765ea2ac742fec0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10628 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 Ph5QTwA0(5t=Rf*CV~nxz diff --git a/venv/lib/python3.8/site-packages/urllib3/__pycache__/connection.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/__pycache__/connection.cpython-38.pyc deleted file mode 100644 index 14e2fd300400cd5b03cb5db212841d50018439ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10082 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 F{{^kXkbeLG diff --git a/venv/lib/python3.8/site-packages/urllib3/__pycache__/connectionpool.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/__pycache__/connectionpool.cpython-38.pyc deleted file mode 100644 index e5e95b62dbf952ec09e4c3638d27153a77b2d713..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24063 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 $XdgPt6D`Q*L6H@b01ELm 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 a9k*}<&z{Jq=6)p+{i)esNj#Q4_WuFxjmYi* diff --git a/venv/lib/python3.8/site-packages/urllib3/__pycache__/exceptions.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/__pycache__/exceptions.cpython-38.pyc deleted file mode 100644 index 93c90f7461019eb01fd17ca370e3e776fc770f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10017 zcmbtaPiz}kdgqW7MahyZOOb5Haq=8Twi(-05^pxK{3mu~IX2)hhGeIx4y8x)o}`I~ zGt8TzWO0>6flaYMF9r72Qxl*U_pq0}>}7$T+CvY$^hBUQfjuk&^w7%!iv_mm@B7{i zIU|X5iKWdkzi-~W`MvM^-uLhM>Ez^i4xfLzwfI;6ema-?EfML@2#7oQhL7^OoXknf z%QdWZ%gV{TEO_}wVZCVOKFi6X9QigUN7TsA3hO1%B{>RuRE>fzgD%T4&||6udJOcq zJO=uh8UsBJdO}Wup5*(-Ku^izppP>>0eV`V0DXe#NzgNL7W6FBQ)+7cIC!tgIq>Gx zIOd!NJugp!KFRb6(5K{S(5LyC8PKoGGoa5fJq!8`c^33pHH#;T>#u?HrhE&Wx6~|V zoC7W7Ind|S9B>!c=fQbfo(JbVuj3@>cjN--1*T7dz927xzNqM}#r4<0xg;y#RMhL3 z^9<;B<z>*98O0l*ugI&Quc|Wcp9Ni&i=Y?PS<r8Seowv+`hBL~0{wx!2KpM)0`!mM zhoC=X`W)yV%a1^R#Phuk`eS(=^mV4sgI<z1K;KYP>NF6(1I|r(3!GbwXaV$X`3dMx zR7n*vq5#evc^90!JmLcAPvtV`WrcNO#3gX<$rW%`cti#Cefb&a&zOE!K3L0D9{xaf zR<SzA?Ts+-T9K-|jb@;uA1uS4dgwbrqv@$gttwkOG(7#GVR!Hir*ToabxY>f^U_)` z$ULSmbjBV$dGdHg>p-{9e`<$Hs27fEMsDDXR;Z-d*b~vV8;V9CTb`=cUKTs$dfm4h zs$TDm*XxFl-xKxv*Dc$N?~K;#GH~kkmpOe5FXqc1KU$0$&BdnMyz2U4WP9G#&7HmH z*P{>BVoQ6TyK$}iZx=;aZSHB>U!$~$A}(dCXfbE#wH~9j{)Mf5*WYTN<JImO>gcuV zQUblV2t7f(NnGeh4-jz<0fIL$!Wa0F6}~Kdn_Dj$kFY)>OHjsWXY6qhct#nE2b8fH zXrV|=p>S;0%&rT?_`()VJXCcGct!G|--LY`-|$Ub_O1O~Jr`Nu<@e#8K;<{{^SSTy z@K8CtIbUm+7Q!X55W*sgG#?9?H0}CsRId{|RNkgOj>$Ts4Hbs=mO3aEGO^d_m87Pe zRkGSM-33*XsT{J%<U_wnNDP#G?0)Vm0Nf<o%-8U@_R{K%)$5LDhas%V(kC$Jz<bFI zwUR9dCV2|CLz*#{Z@-p)c`~5(vZTqBbeS$=bfNcZ!mj7((zRFfi}gK)8}#OoqzVJf zmy4Qs4!)Vsuo|CORbRJM7#XF1e1y`wiwLn1?MQ6fJ4!$rf#cc{Ht5sUM`6`riN{Fj zH|-b}DhXsCT2HhO-50(u7`?x=YEWzedyf~xGN=@dh)L1<b-K*Zr6&}Y2T4od+tc)1 zdLjLlP1qP0&C1HAE1c41ft0QhU7>kRR%G5jN52ldoz(OWzKNnw9(Z?G*ZO4kX`Y7{ zKw>#dQ=}A1yh93omH#ZStvxczyS{3><S}=*l`p^*j?$64={iu8*tA_Q6trD^L0)K0 zIDzjgha7FS*5A>b0j3J!B*C%gBhJt$#~<t9#h$@=C5<!MRw*PR3IzNKjWvh|L3;y0 zsu^g+85-KLd&&u<GT3gUvDvLCXxNeK2uVZWw8aJ@loW_f%Yh#$Kf3y4uNez>5LD9i zwG33^3=MS>Qj7v8anZNaV8fuH$RBTsmakqkp;-Xkwwq1mBY3*<sx}*aQLC^S_#r}R zf31_t{y2k|IEU~Sz`R4lXrE@n%ZMz<;<pw840+O0XYzCV#j1+5F#&r5R-Fb<R?x6t zxQ$jr_^rl<(jwRt8V|S%RvU6sprn%3@o|CAQq$IUg9Fc!c#<_CiXLWAM7kkzNi4Ag zUwZb_IL=pl)=vYfv?ZX@cteoOdzOAt2p}X`jj8B$u`J2^>G)*^Q7Ua%>E<z7*<s+D zCtJQ$+S{Yq6h%|Bo?6C#lJD$B&kG>-3*<i$H}m`OQuDcQiYAg$9NjN|kK8_qqVGY@ zUAYk$5}Ke$ZNM*t;?lAS-$<+$bOrvmWbkQnKgI=*9CX2gZuRrSHQZ!3hKQS=$hYS+ zy6(E-idB0#(m(X|Tx`!tzJ;0Z(d@DF8PmiW!VF7YGaTXkX8J)8M$6l_zon$v@Smj3 z5WZ2paKnhSLuMhiR1^w3QMaHR$fm1uw|udUxvD?V9_X*Vw{e&B#yZP=hb*Y4GuCQ8 z(Ol&TY+aHA46tPnye6Z;N};E!&S<<zDu;AN0jjUg{t`E1ot3R=t9|;QV7h9nRV;m; zraDKLqqIb8{F3I2wUpPyaq!K2UKPkrJaHQ;Xhmxg;+0X(HIdd%6G;bY23m6c9ouuI zKoXDG#z7-8Pm2LwZ2@@d`1XJjXK0`kF;Ii?pEDS3fxPIsibMj3H@OHLr=`Q#c`e(K z!;YHk8Z%(m^*rR&xFI$IY}O_0-KA$#P^DiMvQN5skbV0ZWFq5dVlS3?Ox!$zd;3|H zryC$J@;xdgu#zUu&;px22)KPet=B^`GtxpH<9g(39p&zj-lZL3^XZ@=@PyJkN)Ld3 z5kP|!bW0OwXy~&?2(EqS|Bv2@V+!E2mA(@9C7|5N;3m${xMyl=H-?S`&sge%H0)iI zwGb*~|MrIGhTD*<uXa=ESXDd?QBr$*VrBV@T5WaZ{?oOUdxH`ON)>;Sflr*F;ZLnJ zn$aGGVFP_R4c!!+Lbs6Ez+X_Nkcb(14Q~ZMK)*nvOrfvm1-r-`1{lk`!1&i0)WjJY z_3>pdKzi60cAPZ`<c$htbi59G6BJ4-ld2$P3&n;)1aNq=L9j0a<lkgq6K81HGmipz z9+=6Ow%3Y1@6EKpfems*7S_u#cXa@h=DfldTka0<q7H;#ZnmO9kgovX-)0~a=MdyP zn0IIx<s_NJ68%imw?I4}>2#q#wsjaozm<lL0A8m!EfBdwx8ZuWj!PjJK2kRHn@I9K z><+y;`4sSjg4!~^+{U2R1wwf~GNC+A4GaYIT)i8{XYZrXGI5-zH$4sRW^iuRDSNTB z5yrWfKqXAyIQ<KHGv$Igt85{+I+N(Cx8Po+?jNGBVuHV;sk$MWIETdE4bg|ij!eFQ zHc^qqKDip#5N3DYdrCzS?AE4@7}>55gXUZb`4lC&aN?8!i?G#fdX(jG+bEkRwogR? zcCGF2b)PYHO4z>8z4H?a_^q%`1=}|V$JHuFc2+u*pRLqZRv#|cS5{ZQSnW)$JziOU zct4?!OlcM&oxdk}k?5)FMaPeL{Uz3?yLo&~A@aM?Uefh@kA6S`T%<RZhL{=@+`@Pq zM1@8Yr#W1khXdT!2SD@>gfiBurHL~%#<{iD##g8p?|M-UZPf(nr)i{#gH7TX@2PnE zr`rq-H_p+-+TGe9M?lr^KW4BKXK3v64^hcN!stD78!G|7m<HdlpT~J)%SYCLmIxGJ znjo=D9)$Eq!1XeNlsH2pJ+ZbIMyf%1SpqU+3nAa;ypdgPD~xM+II0aL*x?Sag%5%0 zml>4A85-ruM4pd5J0jamu&$&9N*c#5H%+F%-*mTHnj;7y_k&2-JMe-?DipO!5a;5_ z28sE{fcvY=0*Ev80#2;e9)50&FoAwO4Lz}ito}KYQ7(a}d*BDb{RrTGoq<c7;o;s> zsP?4tovw#)I4e(MM!{o8u$^W^@@?3XOCEC!1L>L*5EG1({TJ{FifwumGI<A@DX+}= zKgKeClUmq_CeF|cn@K`MEkMED@}Dc&zLD^dW-5txGF!G|?ovz$G@2vCM!Z0ffF0qm zfo_L`RB;{n{w0Oj(!?1W@u^P(xd*flq6k51V;P59uxZ$EyUiM*+alZ!S{@Fil-M@I zxO3E9m*+lL;*#l*`(m?6deiO(PR*#AakhCPRO~H{L{;0!wRv?Fj+V6OdMu4gl~*ci z35)!<)Uro3aSkoJ049Axsw2{=)X#I9799_NTkahL{T%7eIvoX-G{uzmzcS$7@|3@Y z;#3AI^e;xRM5<T2%|_H4+!B4nqfBE9p@lndl%$iyaFF66{jFvX4Y@X=G#y3|36%CN z#V@8D;u+GY$hEy^JZL9C)$c%3+@nD@w*?o&(F?Tz5{wA98cN1;wq<PZP9g=81pTJf z(ZAt5E)fo<_H#eW<8TVCn&eQ*90e3QBgk5i#n2O`J7)5>&S(s*Q%)qHXK4(#NV<m< z|4A?5oYHE;xu%awyNTPO6DdNrOb=34ft(X(Qglc`tv~1nhh>Y|nJz83I46zJDkU4b zB0zHalK`vWMB^r=(zobx#EAwSv}x7U_4<EdL`X+dIV(?j&;K5Q+KjA>_HX9h#`B%Y z_}I)*o`>mKE_`7zv4lvd|AB9kXO$-kENBP3%%_`~_Q|s*ADWKP1FT=^_9bf4Zu4(C zP1td{3kq*S70fo<88?syxs^Kr@H>2a*%fgPAtPPUClt8!+h4q|s0CT<%<xIbnzOAM z>Z$+S4|e_b`^@{?_UTNMw--lIN|$lc&J{{Gbq@K-LuCrVpl?WLAiXlBYuNek>3@U7 z=5rQqj+1fBj#LN|!g-6Cn2%uf4NRi%(uL$5S1O&78Dff+BW(SDFqWl7#Y+3k;e~cB ze$W}{C-mB*jD_(0ck&7(<poCg=PSh63>8$!5=})@i)%>q$kB8}wo^C8RL7pDQC9?f zx<C&Fc`-6d#ARrSj;_35tGXK>>2q_kLEbLoeiGNi+Ik1;A#F9wGH=erzbT~LQK74~ zLajZw5MIII4ncs@s2hgjQg=pUD}t6-ZTCoitTuC!+8LE<6X|`}nM@w8)5Cq$_=iNs zIqD3bIV_&88uc>0>nL3jh~Fpk(0R2c&LLgBYFp1e^|jh{eMz|_1z@9|>+vZLIw?-j zqHYQVLd|<FHo3IIQ4{6-oJ-II(9H(L_x@*I4*>8_Dae*4POWm8j`ufPh}k&a*W}9A z-)!2>bL`cy8oDp4jbI1AQqhfFSZ6-Y5b9Z9-5Kj144MDqFdFBn{C_&kIru5OMAJE| zrroU1(uEG-I>!-X<1;Fj1fPd+yIoT&o7=P8=+qSLHTB*!wX*bOTsq^u29Kt;i>4+3 z*R@<Y>T5(&aighr(3F2`%4#_S<fMvI41EW@&eUDr7)f{0cnh{Y5?jhB*gVMFcgi<S zs(PE$9@4N0Yhq-Y{!HMH`Bf^Gre~(drc2Y~Go#ZZGt9+x92_&kT*ts0o0-LkvFY;v E0hP1J>Hq)$ diff --git a/venv/lib/python3.8/site-packages/urllib3/__pycache__/fields.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/__pycache__/fields.cpython-38.pyc deleted file mode 100644 index e2e6a27e0031f35b729f50c6dc3a00ef0916773e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8088 zcmdT}U2ojRxh98P?rOD?9ocd0qzG6AioAieO5~(X72CCIJBf=}$+4X;!3jlixDqAq zay{fa(U$6s1k}A~(W19SA@wf3EBX)4A2|2CEn3w7pb!q?^Sm?Ue#o+sb8vv7D{(j+ z&b;&Sem(EYk0&Oo8h(GewD4u{eNFo-Jq-UWJY2yQ{{{uuxE^XPeMQ%)&O)|g$h)~> z%6n<0#0_qSR;#>HMxQg>;^jSkrNS$GY)@Mm<5fP6zuNDOm8xIeALkQ%a!>PX7=2=w zUDtN?1EPJBKZo8Ee2SmKebS#?Iq{yxPxI&ZH2%DQa@SaSj<Y*j{e?$Zl~&iY6Yg3Z zh26w=f>tLI$?_vzy)fe7>%+5drxOOAn*>pNA@UMGnU53UyDg8=`20t81J^ZN@rx)@ zO`J)zeLd9<bgrM%I;T_pjz(9V_5NP9@q4f9$FZGk`1bU*sGa!jWd81U$Dg*NrtR9z zAoLqm*>S1k3b!R&+HT8Vl8r>+F2+(nYPFNdUVjF~ZXC4N?WI=4msVRr%TF*>yxJI^ zfcs6i8zuw#H=A}lI=VW~ZQE<Un#<>Nc0P*cU(M?|Ss~AnWn=yMvZ`F7LzCB8Rw)*r zmGhC`Xo6(w@WMjU>MV4E&V1006E_U!n-8|Pew4iBFLXs125T4k_h#USJZ^NhvnfT~ zQ->)h86$p>9BN~xKBbEqY9ovzrco!l$A3hTXb-hS-(<T?oO!728yr&gOD!>fp*3~R zxUpB^Cdt~a9&=tw(YwjcXgjPonX>&7w@3y*)!JuGEwPevlWkSSm%2uOpKERFGcASe zfqq3KpkB(Uk8MJpA3{S8*e^9+E~sK&>iLJkIv#2epo;qsoUG*B`+nH*h28A7JrYo2 zLNgLAH?iF|x9@kO#D^>q>qFn(@Li71Qkwh(H6;^}KuHT??I!;EHgPm)``ixN_U(7C z*^7%8-pD2KBUdDW*9~0}Zez6H?1nVo6O?27tBt_huv@|UMq(2~+@LKdX-Dn(t9P#5 zylFphLx}5~9R^!Uift0(xB;mSVo(jk=&M*Q;KJK)+jo4m!#5jmj;h6zDk0SYN<^yF z-|QTnLn25C{I5G8h7IDhAjxVuQ9Ilo(FVD`fi94)$tF_IBa}NLdJu3BbYpvUb!|I= zX06&dmsQNTS}2+Dhg9pTJllCX+j+$?T2QwgcoFyWg{tKombyuE{%wzxsrVJ<<^mex zGbmE+i^&~5)gNkG)+dm)`;0?UzR{PZIziP~<MoVr8{g<zN$x_ni*XFi#xAb=ZJdd? zTqklS3R7cRuc6lED6w(mNjjqGNqM*!MxGnSmmB@TJ#+frMD?&d6JMI1iKnxY8+$>} zvu5JgF3rUCT2>7phfwCW=L?!78($0BuGp4}npxbZt!IYY-p(w)Egz;nRtIuJKHd-_ z5?Rr9UG`UP#z&toW+lJn24RNd3c@&>R3wT8*Nx01xe!w{vnBi(mQEeQb7)Z~@zOJP z`~rH#HVW-TO|P;udQE5gBy5VsOlIj-b5gI-orzb_r)SJ8F80{Hdv)VbpFY&@i5av$ z!9%i4*KozJq6mnKFB2EJwpA9UbRV!jT;FFY?!ROAO>!S~{n1P4-Yd`iZ0YsI&vxpD zI!=qEXG3I`+C`m-6X*u6dupF#Sk*qO7kS_%UexMbzKO=Tg2G}<uY6n4#A|qXWTP0d zlO;5iaT&PcB^1&g!XoZfb{MUc8~co#ytD_4xNjV2${!!-J4R~kn<;}MWIJX`JFu2V z4uS-m<lz*No<#8w2eD7a5Pp+3ysR7vM0Z_8-40xK2^LNY^VzoV^U#kSm^(-KozV6C z7CdP@B;S?1UEHP#q}SGauN1wV76c*az}faiy6AtXry~ocp>z&+hz@Dpdaic`r+zCr zB&Q~o6Fvkv_FVFHk{2tMTJDql2!mMh;}fDyr(ux_&OBq47yD!CC9#MRS(!KrIFOl} zQP9rJEq^=CjJUgo4kY$sfr{5<*N&UO1GL37HA%^6P)!<y=bo7LKkzOl->K;}!_?0_ zHq9CnBnBfwQkW$v(sOv50Pz&gG}V<e-O&>ht)*SI1Mx}GgB&RMY`A|0f&X{6_Ws>l zAG}2tRXVqSnIj{Yv8vYcX(YDD4_y~-Gm-lpIJY-mZ!9i0ez@vL2QJ0jS0HiC-*6uU za4PUW9zc-l0Fx<z#{_((FXDW6jfU+UGu4m}&8Hc-w~Zv}#7hecUtRDT>p`;7U26o< z!bZ{x7h>O&E-G%&<10#E00d;?Ja-d!1g8F*`r{+McTW1?P6tkz{5|Z>8q7=tob7D@ zjRQW=X%h$+6A*N98b#d_WEG?}7UVC)St>|PvQvs7&g~l?eQ@>KjaxUC@7{q`_&#-z zx+!&VV4}|*=Zfh3-}(|mq{Y@wkt2e`xri1I*T|1-$Q4{MSv_A{fm2ywTu0EwIP=Y> zLBSTntCDZwN#}sBdjPd7WnShL1WpLLcop|C3b}Bv@)I)P(pSc1_;fO>-S+PT!6ok! z0C%4+boZ)FB2j=opiJz<7OJbg7V+%?CM)DM4{)9(Ie>%(4GH)g_N{K55PZuq(+GB> z6%1sXpc}O;DEvli80lR^A%hV>XHka$wF`V(1Xwxl`(G?WA*c9wy5xfACHRfjHi1V; z&hh~SOoMii1PFX2&X#9L7DVk`%3XeFIXY9~0;xQHGGMjPg#-h+A~wKb0=!H7t5A}( zC5nW^w)r|5_D{CuTqNgtgf@o`7?1xYiaM57pDL(1?p^j|`~@kbAJxfCNEbn_C`E|u zXsLlxCzRkY!a<Ian&MSB3Uim<8z~|!r$m@m5JIS1S;--B$;O<5Kbc89&dT}P@rVP? zP98lU3^ijvY%0~e0%C&TkGM(&t?H<At~d_y!f}3$mlB_76-!rtre4*1&kyTCqv-9C z0v10Bu<#&vy^0DPBTIC|m~SR5WxK$5TTD!+?4Ge>?v!?{`&Up0UfL-oIEh_-$7<I& zo^e?z+reqz+)AmLLXCfA?v&H=rkPsY{FSb2X&KJ6<o=~lNMhbqd&vvkI9^))c^*GE z^0;|;@vC+dmMs$7c2h(xI|?~+9or-|T>zvf^_D2#>2@e-5|hHi$#xN?QJ&$u&4yX} z^3{*jND%;Ca&1*HTWnulzAjsd-Euh%Y^wi2^62(SoiAhp*$K$RoPF!&tsAyXI^<jV zYQq<#4F2F1ktmd2nFre5yD(n<*KP~@Us_Urj+*H=+l->wC3|+w6|-~wxz!tY3o&%) z<Mny!M)gMWbuv3=&*td~OxA>2%U84YBjb@@3j5<he`tKv@!RKT`yJ{HRQdV(Q3|wK zK18A?Ng&|D5)_FwSGLU-6tJ|Q<*xe+n;n1si4`Gkhq~niNA@syqpTCoqJJ3DHK@2= znV8&`#&+vC>rH3($bfn*!!=5+B!vOquMOvPfM&_fW+f>GnSuP5%<E*6EgXA}=Ydb^ zmCW!E364ogr{yb8E0tVQzXCGiJ)$*{TXhxX9yI~uqz;apF8%|$$2JOWs)`t}#wu{a zrj9=ZPz<&We~&Gr#(HOmRjV;X!lNw~KdO_dpjAnTO|cJ@n;lS+Qg?46JnEn4hYx%q z0xm82#?w<jPfPeb!=96apyUOa#>P>bNhyr}8jf|=#5r=abjlJiq25>M@1A-gGCBPt z>6c=H?~;OX3rsMQM<EJzU7C1A%-3<;Pe)%hL_lpIYZ8a#KZ!FirkXb1J2%49;a($w z5P3O@mL*d^KxG{n!W6Nv3W#9$Uqm>>4m666uWMgSD_fr;AGkFpUPdMn{t!{KnU)S1 zWfbqf%#mG$P*4Kda6cRtivL3naEP5B53+b8X+jD*D2)g+NnvF~cmWoxh?eaj@momN z-Ds>g2F7dlTAs+h9>f>|1QWGqm02jT9<gB*y3iR9VI=Bs)s6`;B2z?jp5L0YAJmoQ zhS?Oh+xIWz<B@3_^eOV6eQ_mnl$P6i<I?nlH>TgQw-!-ZM5WPa<Pe4WEFZFW>;l36 z1T4!+a*LUT4*(Db@gds84^W^JNl#YG)kLm8E2&!rg9Pd4(}indSZw0|0;%{U3T>RM zNL8<}nqJXQv)+qOm9=;zEioc&dmsd11E2uTH`Wb^9fN?q20_y{>3alF{{a(IBz{O= z%huF5CzIGx(57TRnZWtt)m$u*zCl9j{j`Kjje}rP)GkM;HktV57K9dg8whE+cd5^V z+ftcS7@Nbh9MQt(=9YID+7dqwPaPvmhqa>dF8tf!$>Qk)BqK@I-lcTol06gm*hCe6 zf<Rqntow<~{Rm29jIgj2BGC;G5d*<EGF?(Bs@ZtXUNUKYUJvC?2eH~@ZY=Vx{SC9o z^pIwn4E#iv@I^L-y9urWFTOOw*U_;fsFB<PC1j)(`3#j*?^qmocoW~xE&?Ufy`-Jf zkbBd)35!82)i#YL;}-5_lQm&6)^Yt1i93t{zQ&j`YLfB1a#7=BU{=*lhb_u2_)+54 zQSKlpL1g0QMgVGilzDxQ%N#yFGHpb#8p>&bV*fkWka?J%8#EJBrwJ(Z>GVew9G)JI zkqEyP;sf;qqo904wk@|a-p~i3L3l($MlP#wvuO6&!g&>B2f-rsKSGdl;3Rg>AX=>Z zDTMnQ?Tt|!C9^5wQ?Ocmgd)pblmsgz0OE5L%ei1nNfwka6ql*^F^amWY}2V?&wOBr z71B9byeSrc1nh{Pg3Ld0#gx*}PE6{P05<q|_LzOk9#<+)2=EcmWh^f*BiWCri4@0i zvZ~|YqhmLudd+d}cik|5Q+6C4d5$9!7~%$I%f@Bgpae%OqeYorxye;}q}2_rxUYob z5?<`!iob^fx^^09OlODHlgQG)QkkfnsmT3kk7Z8)0m|gor)YW2ZqgN4o**Zmjmysn z4fz#8yo?q>23BQQD;?L{0!EHij)yX$GTkrUp^;X%gK)#oO2TcgBNC^#l$*&;9TOvG zmJ0jja*o?kR=KFo?J`tTeIX#nfIn6<s*{!17y-`zwkjq*K~%mqADd&?=J!nFe*hwW Bg$)1z diff --git a/venv/lib/python3.8/site-packages/urllib3/__pycache__/filepost.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/__pycache__/filepost.cpython-38.pyc deleted file mode 100644 index 73467372607612c3415ac6cb047831be51762e4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2723 zcmbVOTW=gS6t-t(CzHwM(rqXdm0}f&x>9z-MMY&v3xa|aq^3XsiB-#HcI-_inakGp zq}gb~ODfbSenawDegVH_UU}+Y;E8iQn@t)(DtP7NV~;P#-#Pxyem^_w6DYskUjFIn zG$DUr=WMZ|^C?vI6a*)n#w4L#N>R6Bt81Co?%Jkxx(>8<Tua=p3v(P^i>DH=>lxjR zrxU;H8+|ICN$TA?CBi<M<=!#n)0atij{AJ(3F*%BI-iAhfzR=IXfN;vU*H#>&~AfU z>!f+{IaouQw44w6DvNV1dQmdWq+Wxusn14QsMY(=X*I`I(H;!bK8X6a;!!S?{xT9V z->>C*(7N>;?-=5SCj}SQpneWjy$wQ>BdV<<o6}?X9T4qo*Ay$rk;^UY7X*y5_t$&| z<$f-iNcw@4fl^Vr8IM{DtcwMcVi*UZNJOgHAd@VK5}~s!R_$;r%arK#vpnU29JS3x z&llk6vKFW?ikefU*N;-8ms49}FOCMI(#ljhmCGRISt8Nm(*F9#_e+<HFyjL5>z(ZQ zjK~Ij|MTXuPKL|FXxNHUrGq$b4R%L6AL*N7IhS!9^*@-jgD4imOzHM;RL-9>a31zj z9th$rP?!2tE`lB+a3=*(b)X`$>MIZ$VAAx^l9v$5f&g$d^|VuvL(mF(mpr_7V8JX) z*I?GI!uo+w^5~kbZM%i_E2(;%0@T+2F9xAiEo7ht%XWoi1N5nC`{v7fKE!xXERK|B z*?`^HSz^0QrgLzFVt^RqQK;3DQE`%jS!QV`jKOi8ji1MWw8tBt4V{hgF>Bx#KLRfU zmT4$T2RE%eF&%+%P!m-;sLCn8pqv@VEa_ENH0{!@_AY5u){JVrREdi?zky48=2I{0 zZwoN_G6FgWf_OfyTb|_s{+=b@fRPtGfZjk4m@r-fW#WOWoO0_4Iq}0?@W48}TO2D$ z)oVII3pOx_wA+k}p%fut%{v|TUi-re<<)=1|GO>00?s2HWhuh{QlPRV*a7G0tw^y! zo`$&C7?9yB7h1I0Dj+QazQl4RSO+I{HvSIL#u9tH6@^>y;&d)k_40mYW03!27*!AU z1@tlgu_~;ugDA+u#slks9#{n}tU(psz@O{n8C^3je`c3f``wc6lyvueAWW}pid5_k z<(&?0h<<g5OZKmx-d?p=;w%heb*DX<{C`c7SK)xlhBqe~GKj>mly8ApfjY6H>Bv{` z!zC2RMDkS-O)Bx`=kGFe#^x4$S1t%r_vxY~k#0i^`{RP&u$n0T9TZIt31Z0Ujwcs^ zQOE(1GqMOU$nd}}fL*l1Va6pGJBD1PYlU@4fphF5_ZWDGlEU7eI&idCIC>hm=7IJL z2Uw^Ync1$x*xqE7gDX-W_brT$8n<!u(UtLO&Y9DEUaNWsaPHCUF)3;T%vx^n&B=@U zB1M8`fgvG?a^QS?B^w(RA8c$ud_(Ghryy98$2uAYQZGZ!NLoD50lT+)?+Z*JNubA( z+JPBCGA6-}33vwOF7VOm{?+abQqL(ZiqX=`z0T%~C!J)L)3a6wEX_1iLlH)B5<F5c zKZQ$H35uPpV2`6XW_`ghqLIIOb=!&2<9B_^zvD!7E(rk%;}zHT-B#<mn)MZi&8)xg zVYk%+?Vqswcw)!x>#8{?ZCGTomm$!y_83W9V#JkhrI&M3q#S5?3z$bp;B)kWiTBcu zQeE0g%Q5L|v8Q`_G!&(`DfDg-=c4IWkKh7s>GU%`l2`D|8`!UhS*qdxfLU|?om>_s zOnQ?D=%LH;@K0c^Vj#$jOFimZb=t5R&|)U2(*?`7>Q)1)T!uMKy4Ji{`n}#D2RanJ zo<yYN42aUjKn#_f#f}wa29MGk2H{SyDU`WZw|>%X!+$A*O?4%c(%d-9cJiTo2lvFk u0R~9(kj?35ZZ#p0(pyO~p2y-2CMoqAh&tQ@eqeK*!q1wsJ>OgO8h-&5Otw4# diff --git a/venv/lib/python3.8/site-packages/urllib3/__pycache__/poolmanager.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/__pycache__/poolmanager.cpython-38.pyc deleted file mode 100644 index 813b1a6b0c0b012077acc023f7bc26f838a6f826..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12893 zcmbtaU2GiJb)LWd<#I_;6eamb9y@kq8Wfe-ap17BU`3Yg#x|{pa%^vt%no-h$suQV zR(EE_A1sm9GLk1HerTJbO;9rJLtPXF3KVFc`%<9jYx*#c?URANH9*k@ZTg*aXJ%)Y zl2f-NIJ`4+@0okgJ@-4`IrqLhJzdxE^XD&L{_an|u4(^5H^rY4ZeGD(^q8(`p62O+ z*410OPGuu7S_c0&TPFXvT9#*eR#57eTV>QSy;4x=R$J9>tySauGVbfGI+rWKRJYM; zbf;U>-Da!F&#J*pceXXl<yvs6JJ*`yay>ZRoo~%^c`7*5U1%+Exe=W0o@<>$dD?4w zGn;1Xys(ZQ5sx10t;f9C*5lr()&*f4J>kuX3&%#w_D*~AA8D;8g?aRpcv9HM#;D|- z`H9i`f~blbm!5uI^A^16k04vj-!og!;Qp-F#C=mdgZnRf=e!xny672e+T!_7NpFjK zGUKjCVK9h=<9GX^j8{K}>gdIpTcRU+aj^exB)sckFLwQ&kc&n#_r~qpH}Rk+I<X)2 zZiZoyoTg`M;}0RDNfMp)eJAQ{iLO{QlexFTj!VtH<pu+BL&{Jl({H<bw?r)W)$QC( z8Sd?`af^3*JH2qX2T^9^@8Mr%AcO7Drzg!@;?6)s@!KNa3cUzVYJFEm!a)_>lvrdk zMg4o*?YWymCJh#y-8K94A!kE|U2aoNsyhPrejt)sN1*40q7-+cq}p*EdJ!d4Q4~0L zg^VziWGa2^c)nC`I?$Kci(3s6*mt97H<aGu`J_(wN*U^7TVWKd5~(VgqW7`i72zPg zkx+~;qO>K-oj9pct@R-6>?Ct6FdWE^a9q!mB8n3JC_Sg{w`QqCe_1z@X}TMYZ*<FJ z<ktB(XQ*y*to)!j-n>RSW;KScyBGNfLfvc$*Mq9m7#!BR>bNR9+52=bogEQ7VV|rd zO6x@!Ym`4bO`U>LX^KdJJ+~{8g~G!PzlZ7WOTQN<Tp3j{S)<AovWhpwe#f9?kp7hM zpAh6a{-VFbWvCx%$J(JWG(7#hcBCI`RJuY}BfmGU06AXOzO!^_4$YylQ<h6ZV`!e& zJZq;WmtwT0yCd^hyQfq6igpJzjx4WqtRGrKi|g&hrJ+Udz0wseF5`WL>O<}V<QhlS zp?OSi%R}?51_>Vxwe1?-&L5VBC499af96?`j@Ea6Hq<uI#~<og=N0$gF~qu!pX*Y% zv9MjckFnd(mJK7b!wo#a#M4T$(<!t)SQ)hM%Kha!x4qWsz<{AuI}YtzuU)ra_}WWf zU9#81c*~Brgsn{4c6**p6Jonk*c~?#m;7ENdXXRdcf~SGy1gZ&*a)RqLPI~YHwHca zmfZ_w*9~AZkrKPkwWv!`EC;AVAIGPt_biD<073Yu&FGVjV%h%94SPQv*t>p&-i3B& z%Y`|p&#j9s_pXoivSh;!@A{r#S#A&u*(3FI+#qn*1M~td+ifzcjot{t+U-;$E5I7J zOKNmF0c>%F<&d5+LYp6vgh3?i-7V2OIS#a3MqQ{N+6o7OXRp)TkSTldpdYAyk-S|$ zRdTzn)ZA{fqT6j!HEtj&vRx?M?)p8yJLoD+uf+R(VHbKhDLfrQI{8jI`J;hcE7-xM zz~2#exV{b0hbHkgst%XHbCTH&Pe(ovtdX=AlOJKx%C=SjaRb>~v9A?6n0^Cu3$;Lr zp6z0c^wHGq<W`&xR?=u!Y&%`p{OzQiLajxbg7>LpNYk7^o~AQ~Fsn(E?h7zv(L^uS z6RQ*U_mff(?!uka;5rUq-Xcy)ek{6CVs28I=P$7WAJ|R}@w^}QlL`P?1n^X4h2U%? z$;^aml1i%0#6(lLle{BQQepw0X!09Cr~iEEa@_4-?)!aOWijmb(#GBWov+0&ipy|; zfxrGj{+||2S2@9D^#82mi4AuU#OxUIl_y^%<hy{2cBZP&>a%85pVt?xx?a^A)~r5n zQmJmpw@~8~BeAyPxSy2h8g-~u@yEo?EBK4{a1mNd_cZV?9o)+R?|RGw{(YpkN?zHk zfR&WJs#nARiubrz_oncs>NSYXv})c3Z^oO&le%}xo5PbS?+NBbdaL2t-WhKJ@20_Z z&f#6td(wNvdlXM*nCCntXYqOWY4nCo;#z>I1L_cN$aO!Kz_`p{Bdk<-OdAh-5tcWz zAFLnIXY7$~X9sY}Vqk>uwA6OOB9&;M&p1r<23?2dpa2uAgYLSJguf?55N5gHKd^m5 zO01Qr<EHS7r-5*zn7cvnAXA#ARtbG%{L`t)kCyct${Q0p`Mpjs@PJSRF)*N96HE4> z2MmmC06aRG%3xUE1eEvkuZz8Y;CFn`#PP3w`?=>v!{VVkJG-MkT=P8m1bCRhW*ilO zU#xG8mDf5cKzXYTFq*CWYby$B+o^dkk3PZUzMiAQO{k%b;bB?yFjHyYZtS^TAnVGC z0v^)d)vH(SbYa*pGkB!z@Y#IIUVeTt?*LVosF<y#bnQNS@%0<GFD}^^X(_B+zPuTR zn}I<0x|c8he;RjPKluCt_T8;8e9*@O(R()QIa}kXZ_g{0tbR%XR)^MZ_G6(ye{bS1 zdI^^pOlSyxact-s7?0){u{qQ|-7^qtnD-4lvA||Drxcfo#h_I7G;k4XwL`H*_CsZG z6TE@oDlS8f=+>I{iM~qwy%U6yKtb;_+^GxoBB@>p-0r&PUi}&F{tbWH!53-9)2Ul_ z9QeW5ah9)uBfCL#6$RA*;u=^@eMokQc`R1tG)v5yBy%I1%FI^M@RJg2ELos`%H@k_ z#0wIp*+r%xSI}zFN~}l(8%ZrUC;1|t%lGL*C_WmNd=IyOjK7G3T)m-}^*O7oAIv{! zY$sGn>by>^skcL@QGOEz7XOJZznzsw-%Dza1Be4Hc0QqYG#8qFaAy2#X^jp^&3>p% zwfS=m6x7TitR>26tiGnEPq=c?;x8vvvDb0PLnjp~-F1Vc%#YS5l#o=>sXdy!zkpmG zi>6nNNgb#v9b)U*4_Q#o-oJ|*Fk~?J^BNek<>@<B`52z)M+O+Z<r(14vxnuObz~09 zo=&!W$A%S~JBGX&Tl}`dZ!78BtHiU1=7uq}m|0uy-$3O#GUV*KCwA=&rzQbu9hBI! z!yc1lFi?biODT6=B2Je}b9?(X!nqtHVRJ;}D2fD1ZVtMbmJHPh#=v;n?Fk|QW(abb zvRrS;_T%C`@u?FM^X~(IGp?O-S;FO%uXZ`$CSe&^yPbFd_W^IHP#bM?QKR+5lr6Hs z#y!#kf{*omdxfN}v`4k_c$`^oK}@&r_TVyX_4x=ip9h2(Pq0Ar8C)?$oF{$H1LY<s z-x)-4*!2%M=b)$}>1%b-lrO+W<X3P>ESd<pisE8Pw&*c0Pg=n8>r|n!w)U3u=8X^D zd*{}xYrqU%O?i7MsNxN(SWVF(lCRUPv9mjA-!%sY!pQPhs1eQKqScvJm8*KwsDfZM zjfq8=wK%cn^F`Q%6tZ`UQL|-u@YlKWZgl%Gg?rM5HsEAII;f-YxCq#gv{0m8beRK? z^Cjp_ohGS^!<1bg1fdrq&e+(X27d3-M&NI5aVU_o@(3{@<`wh54^olVUmqER6qgj4 z-vI7__>em$9#EVaLw<nK$TnSQ9ZzVGU;HDUE5NE8oGJoV2jocdRE~iIh4zG6j99l( z80t|Y243CMKZG-bL$eT!mxgBlF%Lnshai1uL@TiYc)%UPck37d{jovG06amMJ=F2P zjQ`pZLhxf1Y~L?J!s~)!vR{h@w9qI%$?$;YM8z$I8Q=v@X3DF&cQLk^hw-XrMZ@%w zV*xkwY)WYH@+}06g9scpw}<w_7!-YB<kS%CDr8}+-q{86MEw0+&?LHah1^6B@{l!S zU>76cQ(=v#0^99e(p^{j6nC>pX1Fqf6PsXlB!JBqgWmv{3LsG~rY8izWn@kVbE~0B zNko0o@ex0H%WNLJ{6D=3Q&7v7fMBsK$%`a&4v!=A|1@k_p_*6e@*7m;?5Hmauy9Wq zKZsy(AaP1C!9+4u&>$nlgi$B+lk&(SevYOJA*L)i!8#~`g@6ngVH^~>YJmr<&QRmA z)D}6$-2RtvLxc@ht<qa?i$f%|IDv%~fuxkS4L656#(hc_n+N}#EBJF5b?T33+DJ78 zYkrWg>H?`Li^0(ix5=^#1v7@nVgvEx(UgNs41~?iIfX)Xke7H+?k0~2?9ALomcj-B zrbIXn??AIGe+!r7+~m}#xfJ_w7ChI~f?Fr^*(*w>sI(RG+sY}RTN9Hm12p_s{4x90 zDh(Zez&QBA%>tF3{C29#F@{d2NtBVnjbxH1*w%m40zW68U<`GD8?uw~xuN+UnA?lm zH?>>ZpMWD$J`)p<%pqko0e}X99e9zpZNdObLu4X7>%PUN!F=k9_FmfleXxHRN9o{~ z{}<!Pkb_q;F_AIz$n*%bd2n`2<%hx^aSoM;ifq5z9mIqod4E*C3RK}*Av;Dyh^+;g zK*|aVm`avdTSA!@PrE(N$J*@_dsPN!!fKdBsMQ`q{UE*M!H@t#>PBIPPme3gTqMeh zEr54~!H9<_2@^p<AGQAjf6+WHTD5Kx22f&#e&_Ug<KXGfvX@MeV+KP=Kpv3|#zr9q z9$?)gm;(}+So<cX-`pm%(C=Hs>D_-SdbTyc>j$o+6v7IHQ7aGgCzIxjz&%T#60b<T z8Um_<b778=n+JJAq(y=LG!zts$En!@slZ3nS`%Qom`lW4MMP98*k#9+Ggb-^eNH#$ z#zK~mIqUyjg5g2lF&Fm$?#*tETp}_s%l2xBbTg+?;l>I>^g<+`!LxEnG-gsY&`mi+ zxOh-o>Te3MluJiuTqU$U=pY?)>adYl83_Y{qkfD`7+@!01IiA&C;``qPs$!$#vNG} z&zVq=q`HYdm_W7U^aCdS6s#vAq1sdx_G`fzS(@>ygC}l&2G-#lC!AOfBG_!dg#x1+ z7%xbfE^lGC2C*F?x0P=jhbHf=P}KLvL7n2Zmw{V%ZdzJw?$qV0I#{x<eSjzLYj+la zbZTE_VMy-IaL*Qv{cYkjn4r<72=V7M&Jge<a6c;T_Ylh~AR80uY=Z4>==mG__CuPn zqf@zYN`2E3pe~Fi?izwb04IP?W#RKK6?&>Nd#aPv?RI+=j0tO@XcJO&(Y8PwQyMpt zGy3Q%Okflpy^L8%s&5Llb(=cGq?+|4nWcz#j7M=?RAQw~7>?Y5uqVk-Qm7-K1IQV0 zi%q6K2N#Owa+0Lo9?McRAdcu9C$2t(T%eo*ltXF?C|3f?m4I@kZ6pWon}=oaejEqD zW*+^w@E>UdY^%MB+NGm1(pX4X6Wiaecx7ztZF9>C(goYY@^%%`fT2<Yhn3!3`lPg7 z%bpF*@cYBcQ60uw9af`{hm|!go`Ts`?-_Vf*=~4M$oey{c8FNyXxgj8W!K{7uolnU zGopWpXSQdDwV~-v-8T+v!`k+#k9B!&SU#E?R*&_M_2^uDI-Wl|L%lq&9TS?@hjlE5 zrw*rvQ%4KvKiXh(@)xSc(b?gYSLU?GFAf&)?i`I^SV1zR0e4?}PwPF6#d3b9j_=%3 z%LTO_!QD4L)P|KZ7SEan3Q&W*I`jg%Kw66*J$lTWrg0scOg~67)jVm^biY$vT5H(t zqC`ZR1b7JQo;+``jGAFz^hV(W+qnw%0g_=9T_QIQd`zR;Al&pjyrP&hU{jLZ$Ou6% z4WyrAB>8&EG+@0@6^@qjjX&~RxABzYuk76@i#;Nu>A4Cdcm^HXC8Zs@p6&Jl)7Y8D zUSs~f&*ycpH^94M9gHx|a`**QSTsg({#r7dZj(pQG;e<=)l4Uxh+O4h$iIwPNlYZM zlS+EvU{RNcSUfoIfd)vJVwWo^@k&0Jzm;m0wnd(a>`Pa1U3~nZPD5opDVu^MDjm7t zQyesZ$yAoJg8Gv)*gSKx-Z_-IrCE@)j<J&$yYV1mHkH(UM6)WjFK6g&mCta{ZvP_+ z%d#T{PT0#OCJjGway`gb&`?fsYwX=g0#Zf#Ipb5q)(Au)%_hm^B&Ve71IdcwOxRRn z`Mr&BvBAtPDXY|!9FS<zp4_6#T@rwe!(LDRHWg2u9OL(>9wmm8vf68z#KwDg_ab5A zYba>7s=h#}BK$Rtd40~9Gl&*iX5Fmo76L^eW~reYzbcz^K+q;?82UnnrrffrADk|t zX}Y3dJrolo0gn`!G7c_NO8)lZETv~@i`sFLy5qoq4FW1R9On)afa#lx<9K1mapZ@P z#93|WP|2eUF=3V4VR}K~iX@IJcj-bdK+;$X<7YxlAkJHPzk@>b2rl3ek7B6xs#z`7 zAFbBvXRFiobM@Kkd<SpGeu(eVPxJ;ZV_T8UA7~poZ$;LyDLKP;6|eeH4I7iQUd^jx zBeCqA;^(v-S!-2(0Or!Ff+oz#QxNCwnQ0dI>vXgLOkkS=S>7(s)^$P8h$|>Trtqh@ z;|73`;b2qkbrI@dhZYB}JYscw``C}81P;T|^><cRZ(P5f=0TYXs`C%;-g+y`38!28 z+?LKZjdtD$x==C0Hm;G9OGOJAmB!ki*g-5F49LPS>Rq-?$XJ(Ur7%<^1k-#njRmY3 z$05KAa{L3%(g<jD2=9@fTo)vcTQaZ<?1qlGuG*zlq$iibD!82KhQyD=u^`6%5W9iP z_Vw(%1ru`O(yWGDmODUCda<tnD5Y=N=3!oo_5zjqUbZvOb(02|?I32mfxHPt?r7zO zFF*g%i5<Z&V?UAQET>@jId&7D|8;F?Lvr2kEr)V*^24+nsJ`0=36Dm5fnOdQqI}^q zzY$@(^D{mozw&Ea$CzRO@WVDNAK1kg)OMx9s<BKjF+N)FgzV8D;6kx&tlu-_1y3L9 zV0}7RpT2Evm<!sWj*Uv<N@XxMD|(GKEKx!-1esncftg`TQ@uwb1bna+*Qf^PjgcmC z>O-r);e!`CQ{aa6G&ihmPpRy1+=!=#+C5{tNg)P!Q0a#{67=9si<Q-b`ZJ_HT%Pge zHu?&u%c0oYC?{ogMn!&=Ud+fJ;GZnfWn$xjW3@az351rSAGkQ*SEtH^!O1i$F>{JZ zDH`;#OG5C)@SN^w;QS<+FX4s!4!z@@%0HwMGk%71>fa|gYU!vwP@wz>pJ@a0N93fQ zLP4w5LEYh$bnCy$r7AWvn|gy>lTpSW{l_jxVY%eHwkNaqG-}FM0BN=8Rb0S>b+BbS z)?#Gup<T=>=@%T-pnOH)ITBgOW6+g&zqySqKUIg^+dGg2opaDzk$;3cr4)8eJlu)! zH_iBsKjrrFr__3+3li~{qzm#@*usQMHjsM5@2|=@P*cW$$`k=VIi`cj(3w!9L&MH~ zNELK{9e>f6aG`y7AE_Ia!rA5%h4KO-T2pOe;54F%44`ogv*Uc7b?|Y%zSl&I{kZfz zh)SK)o*bD0&YZ5;Y0jL^#K8rTSHeL+(I+D7*>9k4xujIcvi%OF<ZvRYAQu@2NTjoN zIOMj^VgS5y6jLT;CHBC4?(%bqMS_u(AiGY=JrM&xlk%YNfih<)S7unum#XQP9eIrU z1=>K20hxSsW&Ety-_oRzY^_8obxN#Tm>i@c#*FbqyYb+X)>{rUtGLO7%hEPd>oCqQ zA&di%kkJ8502N1+WkAS928cijrz6;OD=KvKkZ|)6`u$j)+q4c|$$}&DY|pMOULQN$ zl0`t2@WOgUK%XbT)3_tu=HNBVOuniJI->_~Wbms$Mc)gSe-F1=qVi*U#hM=HvI-X_ z?426^J*k#ZM>C*WtEtb@#(hz(=qmAk%r3Lc366Ptu_k|)KKgrf`F*<lm@b4XDjUVU zrB5Z(DFAgu5M&_4tB?D|bdm5arY_B*0J``%Cw+d|e4<&e&vfu2|1nUa*`#K?;S%En zE!>5M8PU@jF;?YI@EUMIa>0{XGfeRLyQ8H~d%8cT?~+(eUwoFh^2Pv%9Kn?(J;aIe zFbLH7`3T1d=?pCS;G}|>ViVj4jJi-m9YAT0z=0gL@&yEoyf>B9ah?K86A@FyyI35z zun)in1dguZ0DQ#pPV0&6b{S{tmnroVkvZYO;4&YeR}mKiK|U1B2V`2+LF@-qi;bvN z=UWOD_f-T2&JU14C{RNX_Z9{L|H4!GL+aoLkC_h}sswscA02d+&r_ARs7eLjr?f0@ zyr`XcnmYx`q}Iav&h?GsKq?TqN>dsUHaCE`6dpAY@-(nx*2sQM1W1N8ZCz-X)vv+_ Q{dc)kH)p@6#k21J0N>vXUH||9 diff --git a/venv/lib/python3.8/site-packages/urllib3/__pycache__/request.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/__pycache__/request.cpython-38.pyc deleted file mode 100644 index fa6aa575c333ac1704b9d51d140d38a3ec27325c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5611 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 diff --git a/venv/lib/python3.8/site-packages/urllib3/__pycache__/response.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/__pycache__/response.cpython-38.pyc deleted file mode 100644 index 4a9a058ff83b8691cf247a56507d10f7efd3376f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20322 zcmeHvX^b4#onP0{$Mp0JheL9BNTNy<C30kPB<onoTv_5RQcDfxnXx2y*6!))S2NQy zeGFe!lVYdo1fuLU7LgBRkHj&OVb)F}V?Q`Ib^~m%PO#Vn$$rQIEGqe6AV2~I!6LwZ z$r@NIzu*5=b$9i&ob@6=zGMdV>eYL%-ub`(|LV_AO%*fv`~GL2{?czXGMWFvhvB~h z9?s(me$mQgR7P2iOw%e`7V~z)ZaQU0@=n7oyC`!S*>YCyxpEG7w~=oa$`jHii+r&> zX=S=4X;CVd-p;g+xEX(HyQmvhhX2Ybm%fl`+3#djPURcZ&3)y4D9x!tW2U*kyuUeH zo^2i|A7~ydA8Z~fA8O8(=bDGhho#L#<4E&p`B?Lz@<Z}mY&_h2q<mcRlZ{84UfF9t zR(?#LON|rF$IFj5PnJ(w89%rCg#Y9Nt9<IUjG9u@?`PDsfBL>tp2zb(HG}6Fd43Ad z`_(L-XXW`*en~mo6W_G-0%{JZgQz(uHD~aANX_ASPM*)I!|KTUnKIiQRmV_%%+GE; zjWM24&T?k{p^v!l^H#L4x)!t>ozSn;n>%eCqG-C-ZiW84VYAw*Zuoi;MftGa^xGZQ zW__*O`Xd|=U!T6VvhwCNzp8wFxn2wB^U;xuZFP6C9bOB=oko4_QoFfR4eM(SKbm?| zx5IX=-MGRYqRGpCt*w0XFtda{R?Hx#WOm69cG|7LM_-pVJFRVBMbp<?HT2i;L!a%V zsq3xV)ka;J3C!D3DF}7FwNVN0?)X9Ey!nOaFvrPFOr=t5)csb7HdCDPm3M3YPFQcZ zqSD1`;4d%VkWtx1J*cd+c{{*}2k@lhiB!UNWfQ~JxOKySHXhF73Qi*NGi6I<%C@qU zjRSC$qg>owl~p<1vnr46FGSOq{q;sQ^vx#d8uv5#W1f9p!WA4tqO4w~0u(@Mh4!xV zAcGtb06jU2D}Rg@nfYu~tgP2{5LQBcH_BF2HLON%7e^3HDeQD}2kQvhYg>_9LHeN; zxq;tU|1hH;#p^$Q;pwos^Yl)A=WM+dgw;ml?E3Ay+n)(v@SpDJ26}m}e^2&fVdrjC zs8s5$dRVDEhE9SUXJX~>-#wgO-$K%^#)Tz+%saSbp(SKOENsi_S@-Sb%!k(Ehjx_T z@WW~tYW*;(KeY96+#<JCZTd2AlXxtgtW@H*mCBPS2xKIydu-24`pr_4;Y22J$z;Bb zOwS4mJ!_d$!ZC1SyLQidASG^Q%jsD!;+QH<_r##?p53$c)%d)4N>0yy8|UO^LU$_* z!t*OJ;gJ&!-Q66@^OKnee73p=dl`&@z8_d`Xa06Bm-zzTRnpHp$P1z3soRTJ=L`A> zCMo+86$dA*kFu0dqq9sNLK029ap9fH+ZV5|EYCaf77Bcn2JiW5WJC37yg836IDsT% zxt43^tdc!#*;WZpJm#D=BbRL*w7W+~HhR$a;)gjx3Qw(40i0HvZPjToU#e7Yb*c?h zqX|U%6cdg;G#`Sf_L$5eVMbuBU=^|jN6Km_OZ^dv&f^NWO9P|?LfSw^2Z-omBeT)W zYu)<JWg$g+8KCBCzNrby9}$8U=X3fjOBR?sjU*~vy}q=(QhDRb8yBxEMN>Cdu3cG* zpO&N2^4k|~+_?F6<?@A<3uBk?4Ei{a%PhghzFL}PdzQfArQy#&S0;y+vxlg-=up6$ zSQKV<EoFt7E&H$mKZhU+Fa#$B_SuUc&7jqM-oO&UND~?a;AFn~Sv*F$3djX^?Ge_= zISmer=XniRz=1Q?EC76HdVda@piiJ5{Wy~+n2d}^(7AytLH)z&(Z=IF=SIOpHs-s? zgqiyp;4$z$w6~mXJD39{I3Bt^`#x|VILf;0ZjQ9zMYM!i@iOo`zf}N!w+w#s?RyU2 zCtmlMo7lGXrs>7t^?NZ!v$w6{J&?WN{bUrj=bK@EcM^w`-zvq2l)ZJF$D@A^6P=%m zCf4qTepT!0UHuYD%(*;|T$E)^U`|W0X+RR5WBp{O)d7bSJ|RRxPIulF@}Qq$6G!`D zG!4FSyWZ{u@i~udIlI1zEAWtz_Rm-a8{~k5!7f-uyJP`N0pd)%bHfKRL?84SygYQ8 z0}y%v6|dn+@ZANzv+Vy0vP@lsMAE3o*uMu|h<^eV)5s8Agzwt2{{+N&C(5l!59Jd3 zh*_-RRiB6u+juhp(7DtE{tO6lQf5NvQecw$2y+9jggm$sITSdAq2F$l->e3G4l0FF zen+=!kOt-rKb6xS+I<g$NW&JVYM6QnG{1W!J>9_p?%6sAZ_3sY>I_$x3D21cKOkEJ zkB9gYW!D>>U{fDPLolcFxEY|m$lN%p!is=bGP9!9J&>N6bh(#u8wMlTAiWP@c>r*) zpy!RG_X5DJkku^vWPoFTX$GSlk@z6<iNpuh0(U4CSnxztdZW__6PT+W0JkZ6_`9mx zO>gPyr5B%l?$hU_gr(Qly>`p@+S+TjweR_me-#AWz}u|e_PsUVZ+X=n$l1Q~!nRlS zv`;Y)f-Yq4cI%86Zu<ScPz*60Mb&Wd(&lidZ+w1v#oO>(z6M1{Z<nYDw8FDj;$iz; zQ4B^`>vg|@f!SfB9)tmh^F(`Sg}9rU)>~5C)_emGcQ)&_&3;dK<F0qd$J*j`EJ#&K zGPAM4q|$wWGO~5g+Jyr5z`C5dFVd69!|q}V7Wpd0pk-Vl32Z=^`r^zz@IAZ^guZWm z%f1CkK)|2kKZVE&Asf?;veYMbP;4(e6Ism>9EplAbJ;}vSMGBFPBI6Xusc6|#(lJ2 zc)8K8RU5%8$RzLm*gAvmvjNU9j3$zS6U>aVkd#2h2Y~8f2m#~wI3SmovAT!G4wu>p z3N>skdq{c)M1)>(RH&M;dy#uU5q<%c`XZB0LcXt{G8uX{HMHPe>g*h}?Vp_yJ4gcV z<J7)5O=;OsuY1<5B4urT0_{Op3t&3F27fZsA&SM4t6@#nSZVcZoS2~s)1+62Q<EEz zt3^mPBQjmSQc>+%rD8~gEMMrvVCM%Uf_r$ELluyKw-rDn9L>^C-tu#(rCP9^(=()p z6eW6~fe;Fght_=nXb8r#J)xgRDTEIFeCSB2%XHpd)Ys8N<ZeJ(jqEi&pOpcH7wT70 zB}7U@VW_+=!DbX{E~C}gaRog73>h*Qbj~KD)~u_sc=&HW9?s(m6rg96!fil|_8~-L z%1`>BbQ_R`AXtOese+nN#f>Z|-VHHlSmnGiW0VWVXi=W<i^g1W-zrZcFUAVwOU77H zo>C8~he0!^)g$US?)%iE%ENue-|x?E9ay)^2jj87>m!E}j($)*rcR*MA@#UAiTj*? zSUsVhd>@-#KBC@Gr_|~9t@2T|sGd@vLhhLVkUFEzO8vuXK|PIk9#J>dGwRc*J+7Wr z&!OZ|^}KokcMtRYIrXBneoVcjK7+Co>YVy{+#gpjtIy(oQoW*H#r+9&UR}WbNp(?O z!u^!GtghgGTD_^Rs@Kr_yt<~YqvR>|y7~p&KPBqO=b{p=6HBqhq59iE9ifLT^^#&C zvDG@r^g>Z;FIH>YcdA+iXGx2UxrO|Ih7YLjrvh)dS8uHo3P}d15DSa9y1E9V&FZRG z52U|F8{}Pi)t2%MB~;)-XO$0&kOKV%(;=Z>U8N3*w;)aI_&U6c*S%_uf`zXZJa1() z?ylCT27y#If;J}KpW>Z*xG7z|c{ki_w>)SPEroS}o2==ozKe;U10<hYt+!WYVn%N~ zBQvX2TOOuTBOCNW?So}u%9sI|U{zINaq?j2@M|HNPM<No8+z?^JXS;La9u+uz0=m) z@lIZOH`G;cr^;d|HG#Jd*1P6|+d>4^UaK8qwZdT8YrMY;!@GOV9LYK9gN?bFm6$1} z82gIu_`;zvVRH~zFAu`IQ*Si5s`zcJOLb`1;=zL>b!uep@r>hv%sKs(aimYkfqrub zr{9hbRyIb)T!R^m$IKGh8j2sM;(4D<1dmhLa<cyP;B8&ssJE((zNu`m&bJM;05XO* z$-AS$?kNuheR)H9>lA@_ss?OR+uEO!Iny&<J;ZKddbj-+4SQTty;W;;6o3K1nM_Fz zQ2A?}4R5ETcVN^D7QE|tchDi4>pS(p_l!oAUK&&&UH5~*f>zLZT$tdYk$V8-p?6MT z{oLx8W24zZC#*LX*#7Rq64TWI>~Vwd0AQ(xB?ru@YyVcq55n|3{1zaw<|hYSY51*; zaC0!NE2dti#O*NkUTxE_Z3A)^Jep-W@s4g`xV5`p;A^m0ui3%0o7HegCWB42gB@J& z%YQdyu=wb)_3H@|EO<AQ-8<vyDmT%man}fO`g33&QC=BK=b~Q1WBn|6NqvFI(@dUY z@;s6#BLc|E)!HnYC4UEz>5C6@Xa?SCgJ0TumTGv#ZWTj|iaGN=D%(!aMe6ow$;kF{ zNOQdc(tK|UX`wfbbfUK(X;BPolaj(mfRd>mmF{UV-|g#_ke}(zAl=`y^w%jdhO;4< z4@Uobk0X|PMWhFNlSmJRFcT=&eP8OP6lZf-`lXs??;cfPlMn3OV-GU-X2~eu&-7+@ zA5sM)!rnWeCVB@TAN+U4UJt_*_;7EZ7zQ8d<ze%mMK7gqS^@9Jdj&Q5fy_a~-qND% zUgVPYUG44%6>A0SzV0KgehWL95>IRtIJiWWqFD`s@ieUvyO{@>x8NMP1%V`y$Si#Y zEg&6U#Vv9`4o0MlXyRom4)5;hSN?>Z^3Yt0!l#Gvew-+ryk-QPe9hSUS74x?P7}5H zN26jr5c4#szRq(dc|(qZC`T()Cy4SC8)?_iVJ8CKDZ<x6{fp8(#@uLbJU&ImY6n(+ zG5*71X~u^dP$7wo95@D|*-AoM`qVC(rpG|+EhvLu!f6H@&?I6+u7DOqMbcN}ozRp8 z(dSOP-GJ2^G^_<Kg*hALx6In2Yy+@-J&YV^BvH1}hL)sXXJyIQ+zpCHGv<!bnve;A z>-udpnm-uZc{y|aC6wq2lT{{FCTmEdeIpFYY}5X|OLS$n#i7a4j-e?tYQ>(WlhuN8 zZnjl4nLK0l+GmSgs4D=RXd+=IWA&QfMbm)tcjizL5^7Pb%*NI%DQwU~|Mo1TS3I+w z!}3}CASBzIQ*x%E7mbCz6c&J_3|tWOF#x%ESwKXCwvG~uiZNGI3wWW=I+i!v9Voze zNV8R4Q`U$jB<QnY`&A<fkj|eols7o%f$N8xq{Q(HR0(<b5PpQkgSeu<4G0?5K_dg) z{c+hN6;v5bJYZhZ%>u--MVJgI%&m`hAnjZ2R6oNnUWIZRze!1F&je&pL)$rpsF1vT z6?Q{{SG0fW%H``zS1zqomRByUe17@LvVpx@s2rzHMu(_wC!0}8`g5_%Mv*JP@ML#S zqz-cIE1!I-)Z=)n8U%gI3T8;v_$;0loGl!*c&@-}mry%L)AFU;T+u{jrxOa2j-7uA z0v-sBFy_{NPMb<$h8_}lO1ei=6CZB-$@4vd_xtlTbG7twl-RU;d;rB!NIpD&(DbHi zRq*&kEP#$o+m+sALNYLJ&Z0pd=}(nt0~G4+PfeAg{hle}9b-VCj?F118)nH~jU9}N z@?#u~{3c^}52uD1(33rbvHc}n0b>TJGSh013}|ag24<aO%oI_f9vBbq6aAq_$wAU$ z&%k3=Id66UQy*(?u7x19B4xHZ%{9nS5S4`bL&R(}C`D7Sq9}I<M8Sj3vtHE;-W%1s zo~o~dD~qJt?~e_u&2|S;8#=;{(B=lz9f)e@NK?<PuBNt*oMu(9T*mHqSH+M*Vf*5| znZ{{<VdD(CH&$w2%?}WH-qKs#&T%{GhJK@Qy1$FL5jbIO%HTt58&N=x?nlTFPUvZR zVA0$Ii^qiiWdgH49Xh-4#0dhz7TkR~ggJpGQy7JEDrcmk`*fq^d(M4J<+oj34hyQ# zv*)1FzX!L<?gV5hI$#jj5f<To>Ba6<`<@MV>GV73OHFKN^e-!vbf-f|YFj1r=?=Z~ zgZQ0^d#-V@_FPrm&INy{CVQ?6?yzm?KTxIZOz?*-+kzCRreL4>&uW6}fo*2G`$m8B zmwl?6^{`%TBqF$xrm07!^mm>yD0KC9wcenzIyjB43BZ8e)o}L3?!Q~|YkvJU4m8me zaimb4*V;%f#YWm#NGAhYNu<9kvEdfNez+hCIW;ayX;9J|cc~n$)s=!m4}}26XAjor zXVAFjJ-6`O!n4qnHd>Gcpm~lNB~~U`3*{?zDGX)^&1TO$&OsrOP>zKZ))CbyFp8Cy zh%HvylCjdJEwonT)EUMR3!>QE5kXX6!~3rjUfH8qW6!4WW>|O{XOR^-RQ$i)mqu1i z+@#$_L2H5yAAu;)8AW&ECdfet-svZT`Pi2F(Z9hI>d#;@A5lj7==YIC?zJlyF3(R5 z@kNpNoJM;i%EO975iW9YU`E(;00f#AyU5vT??lD7sGLc#ivB7}h3&!^NYkqBvRTeR zO_VqHz{q`Ky_CdbOA7s*S3o~v#x2nj=(?8uv72{oJ9h;9%jW;bC~-^HG#q&_bh<Wj z$U9GhyN&R+;cZPFuEPOv@g9&deJv&k%7!vz1A#4+AWmkxpjD4~7qZv0VHRN^c&a$9 zXO-KdJf?mrvu;To4dOCDBHUPUvOyrA0%|pQM}nO4-Ommq=Go4U5amRy_vjU?!x-ih z5g~&ECt!3MAmWc_c;G<Pv=(Jdv8gpC0DORJJb^?2_*kM%VNIMrRzck=<!}(aDw?@; zb8+R$;!5T6l}k4-Us+mC0NfgOtb6EKz`M<pBM;8O)jIu?Zpu=!U``^|UB*E;LPta) z5TQ)7({(1l%H%Q=Y8m<)NRnugWFsiQi(5zEV-tZVVHzGDqp8%$G#Up)=1gwZD&n7> zV1Ut2a#?tSkBz~}c*-?GOY+B6QUDNk@-8wx+eGDb=}LsF(6ASJJ?|lArghmR!?D2% z)~w7u$dTQXcqXHP>;!nr0^YJ=4$66UF4J@G+wbA67Z5sl&;7ES#Mty49a4$k%|FP% z!w;PpWIo$n>_gLK@ec_!QBZ=xkTy@61WA5(+5{S~08&^wH%&w1QyPGm{uL}o^z!bN zPayE4@ORF8A~+-V+jX!Fj5sjl)x(8F9ITw=X>=SNieag8WohZ=QsvT(3(IM7Tuz>Q zOZ}D8Ob`PRFG5b9;`~H!o=Vm0Ut`6uGf9(`C?9w67kTy`8e~9JKu{zuU={%&F;TJY zKb_0El<W_t;lO~v9^4}B5C}MljGVh?&RxU`oR2(#mK+8TQ9LcXyWKynt6ZFKtaJ%l zc(Lx*ZsCw%YK32p`w2ooaV&0S4B8<Alp1&Yy{-8q_B7fJ9pz!n3&_&neQ}@xiMfxF zv({N3*(v>PRD6rOR6r(^MPQXRZFe6^??!6ZQ=7sK;nCG_1^)wy0{C~o+bt@arW+u_ zHz5%*;Oto=-Gs1&ZRM4%ocqpu7UY~A)W-oU_aN1DJ>`ZIB%|AT{pNd_bbCP&NKju! zq%7Wjp3+u0xlT0O1)A~w*|4Otl+4gaf>eVyB*K;m`U1o1{y>iKcgzt!z<iOjHA`*! zWaT-d|Ets^*pazim*t4lrNou*{<r>dT%zd`>hB#$OSk=ow_{uheiGmbe4)t*!ZJjY zv$Rpl@tK&$elNGHx?XLCXbfrHIJEmc4!ZIvTT?TJ%7=JV;ya+F-^pfuV>6ybb*CQN zZ=ol9H(QXo>LE;|Mp+aX18&E5A8!r*8=^8nk9L*;U|n78?pxyA8GsALq7yE3k5KaW z=yEZJgML-_(50b1b$i=yfnewr2pe^PNR$<o$f#=Xqd>pM(y8TkZQBpy;9JcQNTdFe znL!Xi>?JL-(WGf-M2`uSB+Q{$!*;YPT%n;1BSc}kA~xX)>>N;4^>+yMq)?d&QU)75 zVcMCsXY7(=+sEyLw&xaH*Uec)U`5fLu|}~X)mw^L&?Ly238^Sy9Ka12F5n5OGsFvt zK9SHa^L&z|0-Avv!d46Q8nJ=*oqMnx6WYFUTV#E{x7y1FZwYi}A0P-5%p#|<_uST- zco&Q$2u&TCkg0`^klS|j4|=)a2U3^gEcgzd@+i-26`;=`2b{}n!QQ)7NU-K}nI*t^ zF9(Y+?A8c01*Y|K_u=3~u&K1fS|;=#NnOFzy~H}S-Yvo6ZTH*<&b?gEksfFPpX%j+ zHHGS%ARB#XU9LBwc|cEX!^tN4<v70!d>2qN4bL&|x;uz7Q3@(f8y=s2Zv&UvIXVV~ z*Ckeo)m34OtE;tPTgB??5QfBFtZFkHxHO14*V=a=YXiZ>X*UQi!K67cC@AY*u;bV2 z2t`rQZZQDS8%j>FU5AHB^(V;Q*8Ex(gd4siPqqD^b&8&kZD{B|;>@`bGC{ikM1hOB zFP)0S%ylUDsqPYGZ0|bK>rXEUGd7;TKbJ?2%lJQe<=7_P(A19qw0Q)KC*msmb_Wq` z0`9%gL)HcGilRXP<p*0lvKO(r0^uq<b%@mQfk|*^^3Y)bQsXX9XdU89?4LD?X{tAz zAI=FIPKJE9-GQGB>N2MQsNuu_Qhl#8&kb^Vy#=QgUAgE!)me2No?He@aa_Dlz&SmS z9^_Dm=W+Tb3^&>+#29#W74V35BTJ<&J>MT;@oJParX~qtTZvUaxh>95>%RtiBtn!i zR#AY_zrjSzbAOXL#Ux}h#bk>KrEmQmCN$_FUd2cfn2_o0KCAu)lJZ3VYlX3Kd>rOK zlH{I4CUb~kn6#F=h&!Ify&x8J7xCM<k44`rqRyI`I0BO(#r9cyTI}m1W*_e1M=*0{ zY9J~7KiYm=Ts2(55)#n0jD8Aq30$4`Ed<b$7JpzP{HF-o>4>B0;nqo^!0vr3SVSwR zezX*Q0Lt8R@t!NKo)V?btyZ9I^|${*;y;FcC2=a#)?z@J2kjY$#DaH0guK|f4omYk zly`V%`&}i+ZA^KC06VVL_@>$E5ZlHu(gO$U_cBxuC^nF>mq7gNgl+|6$Dw&#DkB68 zs(Msw(>8sfm_{)H<O3Uxq+qCc6K2Tx%?32yfmuk%UabS3FeL4gmNe?yKBQy`{OE}I zG_WFi9A<%ZngLrToPi+*@Gl#G24~ve9QM{?LyFu9rP;eX|If%L=f^+&7XZ8v-@k{O z;2UE}#Y{67bawciR8Wa6S>o{vBKQFq=3%T`L&j;MUt*r=_ZGPgM(>DzH6kq0UFlbw zj{?R`oYu@V@er6g4UFv`NGS-WZOZ(b=*x`a3s#ZztgQ@8s1k#I-ww`%jy@5>RZbCy z##K1bp%wRFhD9sHv{O%p5ClPG9q+=WZf)gp!Qz65bXYKy^Bq`Qe%=1M1wknbvBIrV z(&``aYp_#N4ep0RjFT!rQ~8w<gLhU}^(y3x7$U3verj!P_$#AG`<*3W6@At_ydSFx zLmBwpmJ+Ava7+)S_*i2H?;uhS_d*QE#v;h34S23L+C%I_B%syRJ?_!ZVhsbKU0kb% z59D<RXYh&sSA7Sy^F=Mb)Gx9nMOe)bFQP2)wh6#uR7@q_L@n&2!Zxc+sz~N@(d1Gb zKy;}QL>4}+OSY%7eaDQwhK39d2zEvl(ceVPX9#WVIx``>!J2l84!`lCcn$^L<o?7h z*#9e69I^WiPp<|*=>IX#>k=+8R*@OR{+kaiGp%tBha%j2u~)y$dEr7wBYvYnn-l{g zGa>_$F=;gAn7gzO!1gon9eoKkn%1vah0#wUFM%pmh&CfT6ixI8`{K}i=7wQrq2J`s zyaoF2a}wh=z^x;er#duL+B3)6J)>~pvS`|Kx#$3KEBrJd)}|fp;o0dwy8#TWTRFNw zjRQ2<oV@-n=S4fM7U6_WP~*S1>+L9a{U*Pc95-)i?sM8DyuwdGijW+5b!St1B|Pzy zSFnPYWd#RAYYQLH?1B`TkM6ectuM5(6V%$oK9QApo0rf!OH*CH)Ik)^4VG@<TUXKX zP=^@W75zR}!xh3*<}?3KnEcbE6b3Ab|E`z~IL~r<Wz0EAH*Kz$>Tw3^gk>C<QZlAa zdxTaSN#K*0ogADj5lhGC5^!;~j)PX?IAx&}pfddW6AJ|$X1#cV-NkOo#Q|A2fSJO` z*r0F#POmCYECe};aumN??e0xV70jO{k5A$yLj-Q7Ng|$&aD@m<4Ns*?4FQqAhA?^1 zON0Rsa-#h8o5oIX9#8tWn2g&&R`j@oCL-AwiHkG}d_1yyX1;rN&qW6U_Rq2>?h`|( z7r^b9XPDSRvVSyu1q*{6jCamNx)UN8!ysUP9uJ1lUSw|E#98r6{fXO!k8Qj76Wb~M zshu4Gb}`}YnRlNqasdQTe6O=&=+2no7!7YCTED?DanX^U4sJ<Wq=W%d1<K^IMU?+( z55eXDwCIgBk#n#nz)s0Yz;Xb9GNoU!UygGo+(5s9*C7#6o=Ld|thER(VmOsY1R0q# zTy^cg$~n_knL$7V!y;hO**kZ(+_O!bzs#K!#e@LxP`O>*ANM7NON?<ue6cazj_8;v zz;3kLXegjQ5H!ZgCy5~8y$xG1MFb!KJf!%b4r(Tp*I2<=-|0`H?@JPs1Ply#gI-p; zc@fV8|3C-2Gs=yi6Chghj&X(}VtJrS$6i#J`Y_zENO^k5T_4%&_$I|fiwVSzff@aG zv1Q-sgG;{qc!~y(mts=~KrkyL2SCGiAHSxFJ9q+lCN&Z-SL|O=&QUyfXXuGj@UFo4 zL}T=mFc{}xEMB!B641O$a&5r?y*ojpnHZ#LA|{#6F8(pm<LAW%D^iqx5zmm4c5pK& z`p=OwSRsP+>#X=HlW#F0-$G=di6R!AI<~~?4_Q3|s0S;Z9Vjt~p`q{|2iAU%J12DA zF*JP!lF$rfaJa4>OYP*iw^K++1ndJcr7gv;OMz%$WzPydBDJz9fA<_QPR8L9aa@w! zx()dSEfB^~j@uJ`X-Y&tN3fd+eRc2It;M*Vt-m(XZlp(P?Zs`(*urH@m_{<L1UKM2 z!cSw)5R`<l7b`(^-4~rlj$>H0VF;ix0-3FZy_q{2WyLW*y6sbyP58?25x6w^hum*U zVf@a#08UCi3U?vW5+#ZFo)Z!RiDJZkINViAAk3jhT7+x3f}bEE1&n1PE11JKH^OF7 z3P28?3|%l<MwVoDv#<dFo_Hd1`W-l!Gh491>UVhGEwBgrGH9#)4ScU7=rFNW6el)l zWV&W|G9Iyn&t+`=)my)b{-?xcNxSnjlq{QW?GLDSxmw5e4vn7@_#s;E1B$Wyho&5F zV5Hp{Ix=B<{tvf))WeTTpx+<f`q3@4-^%I#xp$U8F8=OEp^7yPl(oG!;1q0=01exI zq1F8~)9*OT?_TBpXE%LZ|Nl1L*2dt=3$aij>0V3JJ~A7+rDF2~%rQ7P7+Fs32?Os3 z;GE(+&3Zs{&O&!Xz77aXI4evuV|gO^CcmBV;&x&olLT<FzB3d~A)k1T;dBcoO8qLx zG2O~yzZ7w1syM&jSW0PR(Pa0+z%&_<F_+evJH$lP65)Gf1NvVu5!Ueg%!$qP+syqg zlEjt$Jr>BAzlR)EJ;u+faSTEKJ+$~&q(@{cndt%~drG9PTQK)*5h4uiF^r3GNTcAw z0==@~gRwu(IiO!Q+u|28(1I>5<Pl^!qBjpS_Y~hH^CRyS!Dj&(ATwk{$h9YpT)V|s zmy;~rf|2wn)H)$QZtVGXy8p5-l`IKCHtvhhFWrD3gHLt&%?XVj0lsL00Y(h<0EWb7 zFtB3)@7OL5<TfuSUkCHE-=UY#$iy?#3nMkg>e`>lu)&g@uJe1L{#%3a<^BtcAAO8J z@E4M9kvPH9@zrb_zizWX8Lb~MtQ%}KMh=Q{(0*Vw+UMXv$qh2OIeOaDhBVVAbqtiu zd2#rFks2EmbmS-)gbVw1>mEFYJsW{NAtDx`kWr>quKA#q6#Xc|5tMUSKBmAkzWDeG zj!Qm#1*=bLZoQ7W{82bv&3yx&{99k<Xt!n%FoY4Pp);?)ne<M3xCl!Hs13ALipW$H z4}=k!xK#bGkwB~YKJx_T$lYq!@ks=~y=p1c9A{w;;Ry&z)q)w;yQ7SnKk)+#a;0*N zTX+m_kVoTZ9su=6a3`NG**W~s1MHJ&!9IBt$o&>xGuUrDBa*JHEb{N_B0`xR+(8%q z4%^LJi%^Ib=g*9MrK{gWt%*~5mASvf<S{0HnaO)dqC(;qGUio=9~%|^E6g$O%@CU3 zW{#^dKa=y<nH$g!EOppT!ySw!<=ZX;*P4Qy{s&C{5tDz+L<kdANu%*zWbU6a`5h({ z$PKX)Iz=j@|1Fb$&txE!O3q^$Eg^LA1dMwE5%K7}A>qO4|MdSqDqbo~74jfV1zh+# zxlkxPUpN4F500uZSC~ZUOU2iV$8h%wP7xmWLJ|2=VG=Ff!UX=O3v<P*g-Myk{HOV= zJ?kA{5`MKulRV)Q6$Zz>i{H;!)3RN%nY5=M^sv2w4+1yv@r}e5Xd;sSTTCbo>jz9; zMG{S3mtP$dV*$Qv!H<JA%(pOs`M#$(2);19fWn+EGLb+9;S}OEqY0s0+Cd}*ezYuD z2<q?ZeQefbGQ-N*;mU<3g0us@pS3?^B7j1PUo-BZJQaVqXFkj{27PiLu?F72@_;aB z+4`@rFlW9>l+UltZ?L?;x>uN7Vse>@n3;H}<4!v&yllR1eT57lph1JOFOM9DhGXNe gE-?<XWSyKK*3DQmcF~#fX7V$~!I5TX4i%>UH{S1bi~s-t diff --git a/venv/lib/python3.8/site-packages/urllib3/_collections.py b/venv/lib/python3.8/site-packages/urllib3/_collections.py deleted file mode 100644 index 019d151..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/_collections.py +++ /dev/null @@ -1,336 +0,0 @@ -from __future__ import absolute_import - -try: - from collections.abc import Mapping, MutableMapping -except ImportError: - from collections import Mapping, MutableMapping -try: - from threading import RLock -except ImportError: # Platform-specific: No threads available - - class RLock: - def __enter__(self): - pass - - def __exit__(self, exc_type, exc_value, traceback): - pass - - -from collections import OrderedDict -from .exceptions import InvalidHeader -from .packages.six import iterkeys, itervalues, PY3 - - -__all__ = ["RecentlyUsedContainer", "HTTPHeaderDict"] - - -_Null = object() - - -class RecentlyUsedContainer(MutableMapping): - """ - Provides a thread-safe dict-like container which maintains up to - ``maxsize`` keys while throwing away the least-recently-used keys beyond - ``maxsize``. - - :param maxsize: - Maximum number of recent elements to retain. - - :param dispose_func: - Every time an item is evicted from the container, - ``dispose_func(value)`` is called. Callback which will get called - """ - - ContainerCls = OrderedDict - - def __init__(self, maxsize=10, dispose_func=None): - self._maxsize = maxsize - self.dispose_func = dispose_func - - self._container = self.ContainerCls() - self.lock = RLock() - - def __getitem__(self, key): - # Re-insert the item, moving it to the end of the eviction line. - with self.lock: - item = self._container.pop(key) - self._container[key] = item - return item - - def __setitem__(self, key, value): - evicted_value = _Null - with self.lock: - # Possibly evict the existing value of 'key' - evicted_value = self._container.get(key, _Null) - self._container[key] = value - - # If we didn't evict an existing value, we might have to evict the - # least recently used item from the beginning of the container. - if len(self._container) > self._maxsize: - _key, evicted_value = self._container.popitem(last=False) - - if self.dispose_func and evicted_value is not _Null: - self.dispose_func(evicted_value) - - def __delitem__(self, key): - with self.lock: - value = self._container.pop(key) - - if self.dispose_func: - self.dispose_func(value) - - def __len__(self): - with self.lock: - return len(self._container) - - def __iter__(self): - raise NotImplementedError( - "Iteration over this class is unlikely to be threadsafe." - ) - - def clear(self): - with self.lock: - # Copy pointers to all values, then wipe the mapping - values = list(itervalues(self._container)) - self._container.clear() - - if self.dispose_func: - for value in values: - self.dispose_func(value) - - def keys(self): - with self.lock: - return list(iterkeys(self._container)) - - -class HTTPHeaderDict(MutableMapping): - """ - :param headers: - An iterable of field-value pairs. Must not contain multiple field names - when compared case-insensitively. - - :param kwargs: - Additional field-value pairs to pass in to ``dict.update``. - - A ``dict`` like container for storing HTTP Headers. - - Field names are stored and compared case-insensitively in compliance with - RFC 7230. Iteration provides the first case-sensitive key seen for each - case-insensitive pair. - - Using ``__setitem__`` syntax overwrites fields that compare equal - case-insensitively in order to maintain ``dict``'s api. For fields that - compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` - in a loop. - - If multiple fields that are equal case-insensitively are passed to the - constructor or ``.update``, the behavior is undefined and some will be - lost. - - >>> headers = HTTPHeaderDict() - >>> headers.add('Set-Cookie', 'foo=bar') - >>> headers.add('set-cookie', 'baz=quxx') - >>> headers['content-length'] = '7' - >>> headers['SET-cookie'] - 'foo=bar, baz=quxx' - >>> headers['Content-Length'] - '7' - """ - - def __init__(self, headers=None, **kwargs): - super(HTTPHeaderDict, self).__init__() - self._container = OrderedDict() - if headers is not None: - if isinstance(headers, HTTPHeaderDict): - self._copy_from(headers) - else: - self.extend(headers) - if kwargs: - self.extend(kwargs) - - def __setitem__(self, key, val): - self._container[key.lower()] = [key, val] - return self._container[key.lower()] - - def __getitem__(self, key): - val = self._container[key.lower()] - return ", ".join(val[1:]) - - def __delitem__(self, key): - del self._container[key.lower()] - - def __contains__(self, key): - return key.lower() in self._container - - def __eq__(self, other): - if not isinstance(other, Mapping) and not hasattr(other, "keys"): - return False - if not isinstance(other, type(self)): - other = type(self)(other) - return dict((k.lower(), v) for k, v in self.itermerged()) == dict( - (k.lower(), v) for k, v in other.itermerged() - ) - - def __ne__(self, other): - return not self.__eq__(other) - - if not PY3: # Python 2 - iterkeys = MutableMapping.iterkeys - itervalues = MutableMapping.itervalues - - __marker = object() - - def __len__(self): - return len(self._container) - - def __iter__(self): - # Only provide the originally cased names - for vals in self._container.values(): - yield vals[0] - - def pop(self, key, default=__marker): - """D.pop(k[,d]) -> v, remove specified key and return the corresponding value. - If key is not found, d is returned if given, otherwise KeyError is raised. - """ - # Using the MutableMapping function directly fails due to the private marker. - # Using ordinary dict.pop would expose the internal structures. - # So let's reinvent the wheel. - try: - value = self[key] - except KeyError: - if default is self.__marker: - raise - return default - else: - del self[key] - return value - - def discard(self, key): - try: - del self[key] - except KeyError: - pass - - def add(self, key, val): - """Adds a (name, value) pair, doesn't overwrite the value if it already - exists. - - >>> headers = HTTPHeaderDict(foo='bar') - >>> headers.add('Foo', 'baz') - >>> headers['foo'] - 'bar, baz' - """ - key_lower = key.lower() - new_vals = [key, val] - # Keep the common case aka no item present as fast as possible - vals = self._container.setdefault(key_lower, new_vals) - if new_vals is not vals: - vals.append(val) - - def extend(self, *args, **kwargs): - """Generic import function for any type of header-like object. - Adapted version of MutableMapping.update in order to insert items - with self.add instead of self.__setitem__ - """ - if len(args) > 1: - raise TypeError( - "extend() takes at most 1 positional " - "arguments ({0} given)".format(len(args)) - ) - other = args[0] if len(args) >= 1 else () - - if isinstance(other, HTTPHeaderDict): - for key, val in other.iteritems(): - self.add(key, val) - elif isinstance(other, Mapping): - for key in other: - self.add(key, other[key]) - elif hasattr(other, "keys"): - for key in other.keys(): - self.add(key, other[key]) - else: - for key, value in other: - self.add(key, value) - - for key, value in kwargs.items(): - self.add(key, value) - - def getlist(self, key, default=__marker): - """Returns a list of all the values for the named field. Returns an - empty list if the key doesn't exist.""" - try: - vals = self._container[key.lower()] - except KeyError: - if default is self.__marker: - return [] - return default - else: - return vals[1:] - - # Backwards compatibility for httplib - getheaders = getlist - getallmatchingheaders = getlist - iget = getlist - - # Backwards compatibility for http.cookiejar - get_all = getlist - - def __repr__(self): - return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) - - def _copy_from(self, other): - for key in other: - val = other.getlist(key) - if isinstance(val, list): - # Don't need to convert tuples - val = list(val) - self._container[key.lower()] = [key] + val - - def copy(self): - clone = type(self)() - clone._copy_from(self) - return clone - - def iteritems(self): - """Iterate over all header lines, including duplicate ones.""" - for key in self: - vals = self._container[key.lower()] - for val in vals[1:]: - yield vals[0], val - - def itermerged(self): - """Iterate over all headers, merging duplicate ones together.""" - for key in self: - val = self._container[key.lower()] - yield val[0], ", ".join(val[1:]) - - def items(self): - return list(self.iteritems()) - - @classmethod - def from_httplib(cls, message): # Python 2 - """Read headers from a Python 2 httplib message object.""" - # python2.7 does not expose a proper API for exporting multiheaders - # efficiently. This function re-reads raw lines from the message - # object and extracts the multiheaders properly. - obs_fold_continued_leaders = (" ", "\t") - headers = [] - - for line in message.headers: - if line.startswith(obs_fold_continued_leaders): - if not headers: - # We received a header line that starts with OWS as described - # in RFC-7230 S3.2.4. This indicates a multiline header, but - # there exists no previous header to which we can attach it. - raise InvalidHeader( - "Header continuation with no previous header: %s" % line - ) - else: - key, value = headers[-1] - headers[-1] = (key, value + " " + line.strip()) - continue - - key, value = line.split(":", 1) - headers.append((key, value.strip())) - - return cls(headers) diff --git a/venv/lib/python3.8/site-packages/urllib3/connection.py b/venv/lib/python3.8/site-packages/urllib3/connection.py deleted file mode 100644 index 71e6790..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/connection.py +++ /dev/null @@ -1,414 +0,0 @@ -from __future__ import absolute_import -import datetime -import logging -import os -import socket -from socket import error as SocketError, timeout as SocketTimeout -import warnings -from .packages import six -from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection -from .packages.six.moves.http_client import HTTPException # noqa: F401 - -try: # Compiled with SSL? - import ssl - - BaseSSLError = ssl.SSLError -except (ImportError, AttributeError): # Platform-specific: No SSL. - ssl = None - - class BaseSSLError(BaseException): - pass - - -try: - # Python 3: not a no-op, we're adding this to the namespace so it can be imported. - ConnectionError = ConnectionError -except NameError: - # Python 2 - class ConnectionError(Exception): - pass - - -from .exceptions import ( - NewConnectionError, - ConnectTimeoutError, - SubjectAltNameWarning, - SystemTimeWarning, -) -from .packages.ssl_match_hostname import match_hostname, CertificateError - -from .util.ssl_ import ( - resolve_cert_reqs, - resolve_ssl_version, - assert_fingerprint, - create_urllib3_context, - ssl_wrap_socket, -) - - -from .util import connection - -from ._collections import HTTPHeaderDict - -log = logging.getLogger(__name__) - -port_by_scheme = {"http": 80, "https": 443} - -# When it comes time to update this value as a part of regular maintenance -# (ie test_recent_date is failing) update it to ~6 months before the current date. -RECENT_DATE = datetime.date(2019, 1, 1) - - -class DummyConnection(object): - """Used to detect a failed ConnectionCls import.""" - - pass - - -class HTTPConnection(_HTTPConnection, object): - """ - Based on httplib.HTTPConnection but provides an extra constructor - backwards-compatibility layer between older and newer Pythons. - - Additional keyword parameters are used to configure attributes of the connection. - Accepted parameters include: - - - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` - - ``source_address``: Set the source address for the current connection. - - ``socket_options``: Set specific options on the underlying socket. If not specified, then - defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling - Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. - - For example, if you wish to enable TCP Keep Alive in addition to the defaults, - you might pass:: - - HTTPConnection.default_socket_options + [ - (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), - ] - - Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). - """ - - default_port = port_by_scheme["http"] - - #: Disable Nagle's algorithm by default. - #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` - default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] - - #: Whether this connection verifies the host's certificate. - is_verified = False - - def __init__(self, *args, **kw): - if not six.PY2: - kw.pop("strict", None) - - # Pre-set source_address. - self.source_address = kw.get("source_address") - - #: The socket options provided by the user. If no options are - #: provided, we use the default options. - self.socket_options = kw.pop("socket_options", self.default_socket_options) - - _HTTPConnection.__init__(self, *args, **kw) - - @property - def host(self): - """ - Getter method to remove any trailing dots that indicate the hostname is an FQDN. - - In general, SSL certificates don't include the trailing dot indicating a - fully-qualified domain name, and thus, they don't validate properly when - checked against a domain name that includes the dot. In addition, some - servers may not expect to receive the trailing dot when provided. - - However, the hostname with trailing dot is critical to DNS resolution; doing a - lookup with the trailing dot will properly only resolve the appropriate FQDN, - whereas a lookup without a trailing dot will search the system's search domain - list. Thus, it's important to keep the original host around for use only in - those cases where it's appropriate (i.e., when doing DNS lookup to establish the - actual TCP connection across which we're going to send HTTP requests). - """ - return self._dns_host.rstrip(".") - - @host.setter - def host(self, value): - """ - Setter for the `host` property. - - We assume that only urllib3 uses the _dns_host attribute; httplib itself - only uses `host`, and it seems reasonable that other libraries follow suit. - """ - self._dns_host = value - - def _new_conn(self): - """ Establish a socket connection and set nodelay settings on it. - - :return: New socket connection. - """ - extra_kw = {} - if self.source_address: - extra_kw["source_address"] = self.source_address - - if self.socket_options: - extra_kw["socket_options"] = self.socket_options - - try: - conn = connection.create_connection( - (self._dns_host, self.port), self.timeout, **extra_kw - ) - - except SocketTimeout: - raise ConnectTimeoutError( - self, - "Connection to %s timed out. (connect timeout=%s)" - % (self.host, self.timeout), - ) - - except SocketError as e: - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % e - ) - - return conn - - def _prepare_conn(self, conn): - self.sock = conn - # Google App Engine's httplib does not define _tunnel_host - if getattr(self, "_tunnel_host", None): - # TODO: Fix tunnel so it doesn't depend on self.sock state. - self._tunnel() - # Mark this connection as not reusable - self.auto_open = 0 - - def connect(self): - conn = self._new_conn() - self._prepare_conn(conn) - - def request_chunked(self, method, url, body=None, headers=None): - """ - Alternative to the common request method, which sends the - body with chunked encoding and not as one block - """ - headers = HTTPHeaderDict(headers if headers is not None else {}) - skip_accept_encoding = "accept-encoding" in headers - skip_host = "host" in headers - self.putrequest( - method, url, skip_accept_encoding=skip_accept_encoding, skip_host=skip_host - ) - for header, value in headers.items(): - self.putheader(header, value) - if "transfer-encoding" not in headers: - self.putheader("Transfer-Encoding", "chunked") - self.endheaders() - - if body is not None: - stringish_types = six.string_types + (bytes,) - if isinstance(body, stringish_types): - body = (body,) - for chunk in body: - if not chunk: - continue - if not isinstance(chunk, bytes): - chunk = chunk.encode("utf8") - len_str = hex(len(chunk))[2:] - self.send(len_str.encode("utf-8")) - self.send(b"\r\n") - self.send(chunk) - self.send(b"\r\n") - - # After the if clause, to always have a closed body - self.send(b"0\r\n\r\n") - - -class HTTPSConnection(HTTPConnection): - default_port = port_by_scheme["https"] - - ssl_version = None - - def __init__( - self, - host, - port=None, - key_file=None, - cert_file=None, - key_password=None, - strict=None, - timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - ssl_context=None, - server_hostname=None, - **kw - ): - - HTTPConnection.__init__(self, host, port, strict=strict, timeout=timeout, **kw) - - self.key_file = key_file - self.cert_file = cert_file - self.key_password = key_password - self.ssl_context = ssl_context - self.server_hostname = server_hostname - - # Required property for Google AppEngine 1.9.0 which otherwise causes - # HTTPS requests to go out as HTTP. (See Issue #356) - self._protocol = "https" - - -class VerifiedHTTPSConnection(HTTPSConnection): - """ - Based on httplib.HTTPSConnection but wraps the socket with - SSL certification. - """ - - cert_reqs = None - ca_certs = None - ca_cert_dir = None - ssl_version = None - assert_fingerprint = None - - def set_cert( - self, - key_file=None, - cert_file=None, - cert_reqs=None, - key_password=None, - ca_certs=None, - assert_hostname=None, - assert_fingerprint=None, - ca_cert_dir=None, - ): - """ - This method should only be called once, before the connection is used. - """ - # If cert_reqs is not provided we'll assume CERT_REQUIRED unless we also - # have an SSLContext object in which case we'll use its verify_mode. - if cert_reqs is None: - if self.ssl_context is not None: - cert_reqs = self.ssl_context.verify_mode - else: - cert_reqs = resolve_cert_reqs(None) - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.key_password = key_password - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - self.ca_certs = ca_certs and os.path.expanduser(ca_certs) - self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) - - def connect(self): - # Add certificate verification - conn = self._new_conn() - hostname = self.host - - # Google App Engine's httplib does not define _tunnel_host - if getattr(self, "_tunnel_host", None): - self.sock = conn - # Calls self._set_hostport(), so self.host is - # self._tunnel_host below. - self._tunnel() - # Mark this connection as not reusable - self.auto_open = 0 - - # Override the host with the one we're requesting data from. - hostname = self._tunnel_host - - server_hostname = hostname - if self.server_hostname is not None: - server_hostname = self.server_hostname - - is_time_off = datetime.date.today() < RECENT_DATE - if is_time_off: - warnings.warn( - ( - "System time is way off (before {0}). This will probably " - "lead to SSL verification errors" - ).format(RECENT_DATE), - SystemTimeWarning, - ) - - # Wrap socket using verification with the root certs in - # trusted_root_certs - default_ssl_context = False - if self.ssl_context is None: - default_ssl_context = True - self.ssl_context = create_urllib3_context( - ssl_version=resolve_ssl_version(self.ssl_version), - cert_reqs=resolve_cert_reqs(self.cert_reqs), - ) - - context = self.ssl_context - context.verify_mode = resolve_cert_reqs(self.cert_reqs) - - # Try to load OS default certs if none are given. - # Works well on Windows (requires Python3.4+) - if ( - not self.ca_certs - and not self.ca_cert_dir - and default_ssl_context - and hasattr(context, "load_default_certs") - ): - context.load_default_certs() - - self.sock = ssl_wrap_socket( - sock=conn, - keyfile=self.key_file, - certfile=self.cert_file, - key_password=self.key_password, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - server_hostname=server_hostname, - ssl_context=context, - ) - - if self.assert_fingerprint: - assert_fingerprint( - self.sock.getpeercert(binary_form=True), self.assert_fingerprint - ) - elif ( - context.verify_mode != ssl.CERT_NONE - and not getattr(context, "check_hostname", False) - and self.assert_hostname is not False - ): - # While urllib3 attempts to always turn off hostname matching from - # the TLS library, this cannot always be done. So we check whether - # the TLS Library still thinks it's matching hostnames. - cert = self.sock.getpeercert() - if not cert.get("subjectAltName", ()): - warnings.warn( - ( - "Certificate for {0} has no `subjectAltName`, falling back to check for a " - "`commonName` for now. This feature is being removed by major browsers and " - "deprecated by RFC 2818. (See https://github.com/urllib3/urllib3/issues/497 " - "for details.)".format(hostname) - ), - SubjectAltNameWarning, - ) - _match_hostname(cert, self.assert_hostname or server_hostname) - - self.is_verified = ( - context.verify_mode == ssl.CERT_REQUIRED - or self.assert_fingerprint is not None - ) - - -def _match_hostname(cert, asserted_hostname): - try: - match_hostname(cert, asserted_hostname) - except CertificateError as e: - log.warning( - "Certificate did not match expected hostname: %s. Certificate: %s", - asserted_hostname, - cert, - ) - # Add cert to exception and reraise so client code can inspect - # the cert when catching the exception, if they want to - e._peer_cert = cert - raise - - -if ssl: - # Make a copy for testing. - UnverifiedHTTPSConnection = HTTPSConnection - HTTPSConnection = VerifiedHTTPSConnection -else: - HTTPSConnection = DummyConnection diff --git a/venv/lib/python3.8/site-packages/urllib3/connectionpool.py b/venv/lib/python3.8/site-packages/urllib3/connectionpool.py deleted file mode 100644 index d42eb7b..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/connectionpool.py +++ /dev/null @@ -1,1051 +0,0 @@ -from __future__ import absolute_import -import errno -import logging -import sys -import warnings - -from socket import error as SocketError, timeout as SocketTimeout -import socket - - -from .exceptions import ( - ClosedPoolError, - ProtocolError, - EmptyPoolError, - HeaderParsingError, - HostChangedError, - LocationValueError, - MaxRetryError, - ProxyError, - ReadTimeoutError, - SSLError, - TimeoutError, - InsecureRequestWarning, - NewConnectionError, -) -from .packages.ssl_match_hostname import CertificateError -from .packages import six -from .packages.six.moves import queue -from .connection import ( - port_by_scheme, - DummyConnection, - HTTPConnection, - HTTPSConnection, - VerifiedHTTPSConnection, - HTTPException, - BaseSSLError, -) -from .request import RequestMethods -from .response import HTTPResponse - -from .util.connection import is_connection_dropped -from .util.request import set_file_position -from .util.response import assert_header_parsing -from .util.retry import Retry -from .util.timeout import Timeout -from .util.url import ( - get_host, - parse_url, - Url, - _normalize_host as normalize_host, - _encode_target, -) -from .util.queue import LifoQueue - - -xrange = six.moves.xrange - -log = logging.getLogger(__name__) - -_Default = object() - - -# Pool objects -class ConnectionPool(object): - """ - Base class for all connection pools, such as - :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. - """ - - scheme = None - QueueCls = LifoQueue - - def __init__(self, host, port=None): - if not host: - raise LocationValueError("No host specified.") - - self.host = _normalize_host(host, scheme=self.scheme) - self._proxy_host = host.lower() - self.port = port - - def __str__(self): - return "%s(host=%r, port=%r)" % (type(self).__name__, self.host, self.port) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.close() - # Return False to re-raise any potential exceptions - return False - - def close(self): - """ - Close all pooled connections and disable the pool. - """ - pass - - -# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 -_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} - - -class HTTPConnectionPool(ConnectionPool, RequestMethods): - """ - Thread-safe connection pool for one host. - - :param host: - Host used for this HTTP Connection (e.g. "localhost"), passed into - :class:`httplib.HTTPConnection`. - - :param port: - Port used for this HTTP Connection (None is equivalent to 80), passed - into :class:`httplib.HTTPConnection`. - - :param strict: - Causes BadStatusLine to be raised if the status line can't be parsed - as a valid HTTP/1.0 or 1.1 status line, passed into - :class:`httplib.HTTPConnection`. - - .. note:: - Only works in Python 2. This parameter is ignored in Python 3. - - :param timeout: - Socket timeout in seconds for each individual connection. This can - be a float or integer, which sets the timeout for the HTTP request, - or an instance of :class:`urllib3.util.Timeout` which gives you more - fine-grained control over request timeouts. After the constructor has - been parsed, this is always a `urllib3.util.Timeout` object. - - :param maxsize: - Number of connections to save that can be reused. More than 1 is useful - in multithreaded situations. If ``block`` is set to False, more - connections will be created but they will not be saved once they've - been used. - - :param block: - If set to True, no more than ``maxsize`` connections will be used at - a time. When no free connections are available, the call will block - until a connection has been released. This is a useful side effect for - particular multithreaded situations where one does not want to use more - than maxsize connections per host to prevent flooding. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param retries: - Retry configuration to use by default with requests in this pool. - - :param _proxy: - Parsed proxy URL, should not be used directly, instead, see - :class:`urllib3.connectionpool.ProxyManager`" - - :param _proxy_headers: - A dictionary with proxy headers, should not be used directly, - instead, see :class:`urllib3.connectionpool.ProxyManager`" - - :param \\**conn_kw: - Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, - :class:`urllib3.connection.HTTPSConnection` instances. - """ - - scheme = "http" - ConnectionCls = HTTPConnection - ResponseCls = HTTPResponse - - def __init__( - self, - host, - port=None, - strict=False, - timeout=Timeout.DEFAULT_TIMEOUT, - maxsize=1, - block=False, - headers=None, - retries=None, - _proxy=None, - _proxy_headers=None, - **conn_kw - ): - ConnectionPool.__init__(self, host, port) - RequestMethods.__init__(self, headers) - - self.strict = strict - - if not isinstance(timeout, Timeout): - timeout = Timeout.from_float(timeout) - - if retries is None: - retries = Retry.DEFAULT - - self.timeout = timeout - self.retries = retries - - self.pool = self.QueueCls(maxsize) - self.block = block - - self.proxy = _proxy - self.proxy_headers = _proxy_headers or {} - - # Fill the queue up so that doing get() on it will block properly - for _ in xrange(maxsize): - self.pool.put(None) - - # These are mostly for testing and debugging purposes. - self.num_connections = 0 - self.num_requests = 0 - self.conn_kw = conn_kw - - if self.proxy: - # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. - # We cannot know if the user has added default socket options, so we cannot replace the - # list. - self.conn_kw.setdefault("socket_options", []) - - def _new_conn(self): - """ - Return a fresh :class:`HTTPConnection`. - """ - self.num_connections += 1 - log.debug( - "Starting new HTTP connection (%d): %s:%s", - self.num_connections, - self.host, - self.port or "80", - ) - - conn = self.ConnectionCls( - host=self.host, - port=self.port, - timeout=self.timeout.connect_timeout, - strict=self.strict, - **self.conn_kw - ) - return conn - - def _get_conn(self, timeout=None): - """ - Get a connection. Will return a pooled connection if one is available. - - If no connections are available and :prop:`.block` is ``False``, then a - fresh connection is returned. - - :param timeout: - Seconds to wait before giving up and raising - :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and - :prop:`.block` is ``True``. - """ - conn = None - try: - conn = self.pool.get(block=self.block, timeout=timeout) - - except AttributeError: # self.pool is None - raise ClosedPoolError(self, "Pool is closed.") - - except queue.Empty: - if self.block: - raise EmptyPoolError( - self, - "Pool reached maximum size and no more connections are allowed.", - ) - pass # Oh well, we'll create a new connection then - - # If this is a persistent connection, check if it got disconnected - if conn and is_connection_dropped(conn): - log.debug("Resetting dropped connection: %s", self.host) - conn.close() - if getattr(conn, "auto_open", 1) == 0: - # This is a proxied connection that has been mutated by - # httplib._tunnel() and cannot be reused (since it would - # attempt to bypass the proxy) - conn = None - - return conn or self._new_conn() - - def _put_conn(self, conn): - """ - Put a connection back into the pool. - - :param conn: - Connection object for the current host and port as returned by - :meth:`._new_conn` or :meth:`._get_conn`. - - If the pool is already full, the connection is closed and discarded - because we exceeded maxsize. If connections are discarded frequently, - then maxsize should be increased. - - If the pool is closed, then the connection will be closed and discarded. - """ - try: - self.pool.put(conn, block=False) - return # Everything is dandy, done. - except AttributeError: - # self.pool is None. - pass - except queue.Full: - # This should never happen if self.block == True - log.warning("Connection pool is full, discarding connection: %s", self.host) - - # Connection never got put back into the pool, close it. - if conn: - conn.close() - - def _validate_conn(self, conn): - """ - Called right before a request is made, after the socket is created. - """ - pass - - def _prepare_proxy(self, conn): - # Nothing to do for HTTP connections. - pass - - def _get_timeout(self, timeout): - """ Helper that always returns a :class:`urllib3.util.Timeout` """ - if timeout is _Default: - return self.timeout.clone() - - if isinstance(timeout, Timeout): - return timeout.clone() - else: - # User passed us an int/float. This is for backwards compatibility, - # can be removed later - return Timeout.from_float(timeout) - - def _raise_timeout(self, err, url, timeout_value): - """Is the error actually a timeout? Will raise a ReadTimeout or pass""" - - if isinstance(err, SocketTimeout): - raise ReadTimeoutError( - self, url, "Read timed out. (read timeout=%s)" % timeout_value - ) - - # See the above comment about EAGAIN in Python 3. In Python 2 we have - # to specifically catch it and throw the timeout error - if hasattr(err, "errno") and err.errno in _blocking_errnos: - raise ReadTimeoutError( - self, url, "Read timed out. (read timeout=%s)" % timeout_value - ) - - # Catch possible read timeouts thrown as SSL errors. If not the - # case, rethrow the original. We need to do this because of: - # http://bugs.python.org/issue10272 - if "timed out" in str(err) or "did not complete (read)" in str( - err - ): # Python < 2.7.4 - raise ReadTimeoutError( - self, url, "Read timed out. (read timeout=%s)" % timeout_value - ) - - def _make_request( - self, conn, method, url, timeout=_Default, chunked=False, **httplib_request_kw - ): - """ - Perform a request on a given urllib connection object taken from our - pool. - - :param conn: - a connection from one of our connection pools - - :param timeout: - Socket timeout in seconds for the request. This can be a - float or integer, which will set the same timeout value for - the socket connect and the socket read, or an instance of - :class:`urllib3.util.Timeout`, which gives you more fine-grained - control over your timeouts. - """ - self.num_requests += 1 - - timeout_obj = self._get_timeout(timeout) - timeout_obj.start_connect() - conn.timeout = timeout_obj.connect_timeout - - # Trigger any extra validation we need to do. - try: - self._validate_conn(conn) - except (SocketTimeout, BaseSSLError) as e: - # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. - self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) - raise - - # conn.request() calls httplib.*.request, not the method in - # urllib3.request. It also calls makefile (recv) on the socket. - if chunked: - conn.request_chunked(method, url, **httplib_request_kw) - else: - conn.request(method, url, **httplib_request_kw) - - # Reset the timeout for the recv() on the socket - read_timeout = timeout_obj.read_timeout - - # App Engine doesn't have a sock attr - if getattr(conn, "sock", None): - # In Python 3 socket.py will catch EAGAIN and return None when you - # try and read into the file pointer created by http.client, which - # instead raises a BadStatusLine exception. Instead of catching - # the exception and assuming all BadStatusLine exceptions are read - # timeouts, check for a zero timeout before making the request. - if read_timeout == 0: - raise ReadTimeoutError( - self, url, "Read timed out. (read timeout=%s)" % read_timeout - ) - if read_timeout is Timeout.DEFAULT_TIMEOUT: - conn.sock.settimeout(socket.getdefaulttimeout()) - else: # None or a value - conn.sock.settimeout(read_timeout) - - # Receive the response from the server - try: - try: - # Python 2.7, use buffering of HTTP responses - httplib_response = conn.getresponse(buffering=True) - except TypeError: - # Python 3 - try: - httplib_response = conn.getresponse() - except BaseException as e: - # Remove the TypeError from the exception chain in - # Python 3 (including for exceptions like SystemExit). - # Otherwise it looks like a bug in the code. - six.raise_from(e, None) - except (SocketTimeout, BaseSSLError, SocketError) as e: - self._raise_timeout(err=e, url=url, timeout_value=read_timeout) - raise - - # AppEngine doesn't have a version attr. - http_version = getattr(conn, "_http_vsn_str", "HTTP/?") - log.debug( - '%s://%s:%s "%s %s %s" %s %s', - self.scheme, - self.host, - self.port, - method, - url, - http_version, - httplib_response.status, - httplib_response.length, - ) - - try: - assert_header_parsing(httplib_response.msg) - except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 - log.warning( - "Failed to parse headers (url=%s): %s", - self._absolute_url(url), - hpe, - exc_info=True, - ) - - return httplib_response - - def _absolute_url(self, path): - return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url - - def close(self): - """ - Close all pooled connections and disable the pool. - """ - if self.pool is None: - return - # Disable access to the pool - old_pool, self.pool = self.pool, None - - try: - while True: - conn = old_pool.get(block=False) - if conn: - conn.close() - - except queue.Empty: - pass # Done. - - def is_same_host(self, url): - """ - Check if the given ``url`` is a member of the same host as this - connection pool. - """ - if url.startswith("/"): - return True - - # TODO: Add optional support for socket.gethostbyname checking. - scheme, host, port = get_host(url) - if host is not None: - host = _normalize_host(host, scheme=scheme) - - # Use explicit default port for comparison when none is given - if self.port and not port: - port = port_by_scheme.get(scheme) - elif not self.port and port == port_by_scheme.get(scheme): - port = None - - return (scheme, host, port) == (self.scheme, self.host, self.port) - - def urlopen( - self, - method, - url, - body=None, - headers=None, - retries=None, - redirect=True, - assert_same_host=True, - timeout=_Default, - pool_timeout=None, - release_conn=None, - chunked=False, - body_pos=None, - **response_kw - ): - """ - Get a connection from the pool and perform an HTTP request. This is the - lowest level call for making a request, so you'll need to specify all - the raw details. - - .. note:: - - More commonly, it's appropriate to use a convenience method provided - by :class:`.RequestMethods`, such as :meth:`request`. - - .. note:: - - `release_conn` will only behave as expected if - `preload_content=False` because we want to make - `preload_content=False` the default behaviour someday soon without - breaking backwards compatibility. - - :param method: - HTTP request method (such as GET, POST, PUT, etc.) - - :param body: - Data to send in the request body (useful for creating - POST requests, see HTTPConnectionPool.post_url for - more convenience). - - :param headers: - Dictionary of custom headers to send, such as User-Agent, - If-None-Match, etc. If None, pool headers are used. If provided, - these headers completely replace any pool-specific headers. - - :param retries: - Configure the number of retries to allow before raising a - :class:`~urllib3.exceptions.MaxRetryError` exception. - - Pass ``None`` to retry until you receive a response. Pass a - :class:`~urllib3.util.retry.Retry` object for fine-grained control - over different types of retries. - Pass an integer number to retry connection errors that many times, - but no other types of errors. Pass zero to never retry. - - If ``False``, then retries are disabled and any exception is raised - immediately. Also, instead of raising a MaxRetryError on redirects, - the redirect response will be returned. - - :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. - - :param redirect: - If True, automatically handle redirects (status codes 301, 302, - 303, 307, 308). Each redirect counts as a retry. Disabling retries - will disable redirect, too. - - :param assert_same_host: - If ``True``, will make sure that the host of the pool requests is - consistent else will raise HostChangedError. When False, you can - use the pool on an HTTP proxy and request foreign hosts. - - :param timeout: - If specified, overrides the default timeout for this one - request. It may be a float (in seconds) or an instance of - :class:`urllib3.util.Timeout`. - - :param pool_timeout: - If set and the pool is set to block=True, then this method will - block for ``pool_timeout`` seconds and raise EmptyPoolError if no - connection is available within the time period. - - :param release_conn: - If False, then the urlopen call will not release the connection - back into the pool once a response is received (but will release if - you read the entire contents of the response such as when - `preload_content=True`). This is useful if you're not preloading - the response's content immediately. You will need to call - ``r.release_conn()`` on the response ``r`` to return the connection - back into the pool. If None, it takes the value of - ``response_kw.get('preload_content', True)``. - - :param chunked: - If True, urllib3 will send the body using chunked transfer - encoding. Otherwise, urllib3 will send the body using the standard - content-length form. Defaults to False. - - :param int body_pos: - Position to seek to in file-like body in the event of a retry or - redirect. Typically this won't need to be set because urllib3 will - auto-populate the value when needed. - - :param \\**response_kw: - Additional parameters are passed to - :meth:`urllib3.response.HTTPResponse.from_httplib` - """ - if headers is None: - headers = self.headers - - if not isinstance(retries, Retry): - retries = Retry.from_int(retries, redirect=redirect, default=self.retries) - - if release_conn is None: - release_conn = response_kw.get("preload_content", True) - - # Check host - if assert_same_host and not self.is_same_host(url): - raise HostChangedError(self, url, retries) - - # Ensure that the URL we're connecting to is properly encoded - if url.startswith("/"): - url = six.ensure_str(_encode_target(url)) - else: - url = six.ensure_str(parse_url(url).url) - - conn = None - - # Track whether `conn` needs to be released before - # returning/raising/recursing. Update this variable if necessary, and - # leave `release_conn` constant throughout the function. That way, if - # the function recurses, the original value of `release_conn` will be - # passed down into the recursive call, and its value will be respected. - # - # See issue #651 [1] for details. - # - # [1] <https://github.com/urllib3/urllib3/issues/651> - release_this_conn = release_conn - - # Merge the proxy headers. Only do this in HTTP. We have to copy the - # headers dict so we can safely change it without those changes being - # reflected in anyone else's copy. - if self.scheme == "http": - headers = headers.copy() - headers.update(self.proxy_headers) - - # Must keep the exception bound to a separate variable or else Python 3 - # complains about UnboundLocalError. - err = None - - # Keep track of whether we cleanly exited the except block. This - # ensures we do proper cleanup in finally. - clean_exit = False - - # Rewind body position, if needed. Record current position - # for future rewinds in the event of a redirect/retry. - body_pos = set_file_position(body, body_pos) - - try: - # Request a connection from the queue. - timeout_obj = self._get_timeout(timeout) - conn = self._get_conn(timeout=pool_timeout) - - conn.timeout = timeout_obj.connect_timeout - - is_new_proxy_conn = self.proxy is not None and not getattr( - conn, "sock", None - ) - if is_new_proxy_conn: - self._prepare_proxy(conn) - - # Make the request on the httplib connection object. - httplib_response = self._make_request( - conn, - method, - url, - timeout=timeout_obj, - body=body, - headers=headers, - chunked=chunked, - ) - - # If we're going to release the connection in ``finally:``, then - # the response doesn't need to know about the connection. Otherwise - # it will also try to release it and we'll have a double-release - # mess. - response_conn = conn if not release_conn else None - - # Pass method to Response for length checking - response_kw["request_method"] = method - - # Import httplib's response into our own wrapper object - response = self.ResponseCls.from_httplib( - httplib_response, - pool=self, - connection=response_conn, - retries=retries, - **response_kw - ) - - # Everything went great! - clean_exit = True - - except queue.Empty: - # Timed out by queue. - raise EmptyPoolError(self, "No pool connections are available.") - - except ( - TimeoutError, - HTTPException, - SocketError, - ProtocolError, - BaseSSLError, - SSLError, - CertificateError, - ) as e: - # Discard the connection for these exceptions. It will be - # replaced during the next _get_conn() call. - clean_exit = False - if isinstance(e, (BaseSSLError, CertificateError)): - e = SSLError(e) - elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: - e = ProxyError("Cannot connect to proxy.", e) - elif isinstance(e, (SocketError, HTTPException)): - e = ProtocolError("Connection aborted.", e) - - retries = retries.increment( - method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2] - ) - retries.sleep() - - # Keep track of the error for the retry warning. - err = e - - finally: - if not clean_exit: - # We hit some kind of exception, handled or otherwise. We need - # to throw the connection away unless explicitly told not to. - # Close the connection, set the variable to None, and make sure - # we put the None back in the pool to avoid leaking it. - conn = conn and conn.close() - release_this_conn = True - - if release_this_conn: - # Put the connection back to be reused. If the connection is - # expired then it will be None, which will get replaced with a - # fresh connection during _get_conn. - self._put_conn(conn) - - if not conn: - # Try again - log.warning( - "Retrying (%r) after connection broken by '%r': %s", retries, err, url - ) - return self.urlopen( - method, - url, - body, - headers, - retries, - redirect, - assert_same_host, - timeout=timeout, - pool_timeout=pool_timeout, - release_conn=release_conn, - chunked=chunked, - body_pos=body_pos, - **response_kw - ) - - def drain_and_release_conn(response): - try: - # discard any remaining response body, the connection will be - # released back to the pool once the entire response is read - response.read() - except ( - TimeoutError, - HTTPException, - SocketError, - ProtocolError, - BaseSSLError, - SSLError, - ): - pass - - # Handle redirect? - redirect_location = redirect and response.get_redirect_location() - if redirect_location: - if response.status == 303: - method = "GET" - - try: - retries = retries.increment(method, url, response=response, _pool=self) - except MaxRetryError: - if retries.raise_on_redirect: - # Drain and release the connection for this response, since - # we're not returning it to be released manually. - drain_and_release_conn(response) - raise - return response - - # drain and return the connection to the pool before recursing - drain_and_release_conn(response) - - retries.sleep_for_retry(response) - log.debug("Redirecting %s -> %s", url, redirect_location) - return self.urlopen( - method, - redirect_location, - body, - headers, - retries=retries, - redirect=redirect, - assert_same_host=assert_same_host, - timeout=timeout, - pool_timeout=pool_timeout, - release_conn=release_conn, - chunked=chunked, - body_pos=body_pos, - **response_kw - ) - - # Check if we should retry the HTTP response. - has_retry_after = bool(response.getheader("Retry-After")) - if retries.is_retry(method, response.status, has_retry_after): - try: - retries = retries.increment(method, url, response=response, _pool=self) - except MaxRetryError: - if retries.raise_on_status: - # Drain and release the connection for this response, since - # we're not returning it to be released manually. - drain_and_release_conn(response) - raise - return response - - # drain and return the connection to the pool before recursing - drain_and_release_conn(response) - - retries.sleep(response) - log.debug("Retry: %s", url) - return self.urlopen( - method, - url, - body, - headers, - retries=retries, - redirect=redirect, - assert_same_host=assert_same_host, - timeout=timeout, - pool_timeout=pool_timeout, - release_conn=release_conn, - chunked=chunked, - body_pos=body_pos, - **response_kw - ) - - return response - - -class HTTPSConnectionPool(HTTPConnectionPool): - """ - Same as :class:`.HTTPConnectionPool`, but HTTPS. - - When Python is compiled with the :mod:`ssl` module, then - :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, - instead of :class:`.HTTPSConnection`. - - :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, - ``assert_hostname`` and ``host`` in this order to verify connections. - If ``assert_hostname`` is False, no verification is done. - - The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, - ``ca_cert_dir``, ``ssl_version``, ``key_password`` are only used if :mod:`ssl` - is available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade - the connection socket into an SSL socket. - """ - - scheme = "https" - ConnectionCls = HTTPSConnection - - def __init__( - self, - host, - port=None, - strict=False, - timeout=Timeout.DEFAULT_TIMEOUT, - maxsize=1, - block=False, - headers=None, - retries=None, - _proxy=None, - _proxy_headers=None, - key_file=None, - cert_file=None, - cert_reqs=None, - key_password=None, - ca_certs=None, - ssl_version=None, - assert_hostname=None, - assert_fingerprint=None, - ca_cert_dir=None, - **conn_kw - ): - - HTTPConnectionPool.__init__( - self, - host, - port, - strict, - timeout, - maxsize, - block, - headers, - retries, - _proxy, - _proxy_headers, - **conn_kw - ) - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.key_password = key_password - self.ca_certs = ca_certs - self.ca_cert_dir = ca_cert_dir - self.ssl_version = ssl_version - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - - def _prepare_conn(self, conn): - """ - Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` - and establish the tunnel if proxy is used. - """ - - if isinstance(conn, VerifiedHTTPSConnection): - conn.set_cert( - key_file=self.key_file, - key_password=self.key_password, - cert_file=self.cert_file, - cert_reqs=self.cert_reqs, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - assert_hostname=self.assert_hostname, - assert_fingerprint=self.assert_fingerprint, - ) - conn.ssl_version = self.ssl_version - return conn - - def _prepare_proxy(self, conn): - """ - Establish tunnel connection early, because otherwise httplib - would improperly set Host: header to proxy's IP:port. - """ - conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers) - conn.connect() - - def _new_conn(self): - """ - Return a fresh :class:`httplib.HTTPSConnection`. - """ - self.num_connections += 1 - log.debug( - "Starting new HTTPS connection (%d): %s:%s", - self.num_connections, - self.host, - self.port or "443", - ) - - if not self.ConnectionCls or self.ConnectionCls is DummyConnection: - raise SSLError( - "Can't connect to HTTPS URL because the SSL module is not available." - ) - - actual_host = self.host - actual_port = self.port - if self.proxy is not None: - actual_host = self.proxy.host - actual_port = self.proxy.port - - conn = self.ConnectionCls( - host=actual_host, - port=actual_port, - timeout=self.timeout.connect_timeout, - strict=self.strict, - cert_file=self.cert_file, - key_file=self.key_file, - key_password=self.key_password, - **self.conn_kw - ) - - return self._prepare_conn(conn) - - def _validate_conn(self, conn): - """ - Called right before a request is made, after the socket is created. - """ - super(HTTPSConnectionPool, self)._validate_conn(conn) - - # Force connect early to allow us to validate the connection. - if not getattr(conn, "sock", None): # AppEngine might not have `.sock` - conn.connect() - - if not conn.is_verified: - warnings.warn( - ( - "Unverified HTTPS request is being made to host '%s'. " - "Adding certificate verification is strongly advised. See: " - "https://urllib3.readthedocs.io/en/latest/advanced-usage.html" - "#ssl-warnings" % conn.host - ), - InsecureRequestWarning, - ) - - -def connection_from_url(url, **kw): - """ - Given a url, return an :class:`.ConnectionPool` instance of its host. - - This is a shortcut for not having to parse out the scheme, host, and port - of the url before creating an :class:`.ConnectionPool` instance. - - :param url: - Absolute URL string that must include the scheme. Port is optional. - - :param \\**kw: - Passes additional parameters to the constructor of the appropriate - :class:`.ConnectionPool`. Useful for specifying things like - timeout, maxsize, headers, etc. - - Example:: - - >>> conn = connection_from_url('http://google.com/') - >>> r = conn.request('GET', '/') - """ - scheme, host, port = get_host(url) - port = port or port_by_scheme.get(scheme, 80) - if scheme == "https": - return HTTPSConnectionPool(host, port=port, **kw) - else: - return HTTPConnectionPool(host, port=port, **kw) - - -def _normalize_host(host, scheme): - """ - Normalize hosts for comparisons and use with sockets. - """ - - host = normalize_host(host, scheme) - - # httplib doesn't like it when we include brackets in IPv6 addresses - # Specifically, if we include brackets but also pass the port then - # httplib crazily doubles up the square brackets on the Host header. - # Instead, we need to make sure we never pass ``None`` as the port. - # However, for backward compatibility reasons we can't actually - # *assert* that. See http://bugs.python.org/issue28539 - if host.startswith("[") and host.endswith("]"): - host = host[1:-1] - return host diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/__init__.py b/venv/lib/python3.8/site-packages/urllib3/contrib/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 004af3f740a013df5e3be13097776d6ae33f3178..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmWIL<>g`kf>pNqaUl9Jh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6vOza+OnzaX<f zH#4ueBrzvPH?6EP+p@$oRll?-Cnqz>7)~eW=am#?Ch5n=XXa&=#K-FuRNmsS$<0qG N%}KQb8T%QC82~6<BZU9} diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/_appengine_environ.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/_appengine_environ.cpython-38.pyc deleted file mode 100644 index 2f735ddf898a8af60aa09af2e18461c9a6055ee1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1376 zcmb_c&2AGh5cYc0WZAZ&t*S~$2w8AIl^`pD5I+J$p=rf|fYJg|53II3Zr1I_UfE6{ zy~2aQ5#E6p*()brfdephOBxZ5ShB}nJ2T&W-%MUEF2)4Mmj}t4uOT7d++li9JUqf_ z?%)Dsk3ayl4E6#Dq49z2QJ8}!+7Mb0p>4o9h|$i$JS?DX0^K3&i^q@S-9i{PP%tbx ztF#&k;CSYlG|Van-16KqTX42fRjecXLUP9CNN6PoT-tX09TAXj?$+rM;Nb~Qvw({w z?@1Ng;61^pL3f?jE5f9u%Cj=fs)~EJ^)h}#2ypi4GtmwFxnF*4Cw5RJm8h-@X>3-O z*AGVHqr3JNPlmcI#s1BS&6TuT>?dcQ(o@XsYFsa1oJrKkVRUqoKsRxnNyOdxL{@R* z5>YEQIHV9<AV7~CjbU~Lv+eOpX=|7`@N{7ShRo`rltT8IkpAm|(8jVpmt1F7D9KDF zVPCy#$1%gPi#!{S=wbQ|`mkbvvSgYw)T59Bi7Us<SW%YFb@s>4HMT#rOjz&D2|LUS zR&s+txIs#CD@ObpGwRg8^D<ULW(qYdL0+{?at==Uyx{o}J5U<EwY@vTIV-HK%)KPZ zOErXcU#Wh{+qoJf6Fw7Axk*qT37LlE4|eaNUfy`|qSM`e+U=yhm)+f`&pLZiHMWJ4 zH*T+op8uLEQ@2jlI#d5-H-{3`tJCtOrv$nxJCU)aUF*!q=<3MJcnLQUSaKK~HPuCD zKT@C&exe_-cRmFu=v-H~@Kt?&r_+1Y>7_f*w{~A|^g1;;UfAR#UaHE~e)74YUHRy9 z?s3@XwvI7zEP}Vf7XQMoT`{fU^j$%MrGOIpt3l~cfAc>;>v@OB(Q&-8?e&@J+(a+B z+euHIv8qG7xQKHWnY)=mHfe9?3mj?mcz%;tn&+A2(BAqxh>z*@TbpU~bTAs2%PzQY zM5>o?zuu}_X^Pd9rY9`B?)2Jvt~_A>@b5@INOb??KkcCd>T_x|qA+Siany{OzX7g$ BN3#F` diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/appengine.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/appengine.cpython-38.pyc deleted file mode 100644 index 74b1b968d4267387f1dae4300e248e44d11ebce6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8201 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 SSyzz&Xn1}hZQ!OtJpT)WY9qY> diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/ntlmpool.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/ntlmpool.cpython-38.pyc deleted file mode 100644 index eeedb3a348f6c88175a2bcb53dc24e7d994318db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3233 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 diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-38.pyc deleted file mode 100644 index 2d4cfad11d8ad19f8f43505916740afa2b775e18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14898 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 LrSK*(bm#v7Q^oHP diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/securetransport.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/securetransport.cpython-38.pyc deleted file mode 100644 index 599978e4f1113e4547b340867fa1ba1e2cca717c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19784 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 US{fVtRfB(LlU6R3O(kRh7fL)<Qvd(} diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/socks.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/socks.cpython-38.pyc deleted file mode 100644 index ec76a8f6936e812a5bf7f3de54db07cb678e3b5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5536 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 B>zDul diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/_appengine_environ.py b/venv/lib/python3.8/site-packages/urllib3/contrib/_appengine_environ.py deleted file mode 100644 index 8765b90..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/contrib/_appengine_environ.py +++ /dev/null @@ -1,36 +0,0 @@ -""" -This module provides means to detect the App Engine environment. -""" - -import os - - -def is_appengine(): - return is_local_appengine() or is_prod_appengine() - - -def is_appengine_sandbox(): - """Reports if the app is running in the first generation sandbox. - - The second generation runtimes are technically still in a sandbox, but it - is much less restrictive, so generally you shouldn't need to check for it. - see https://cloud.google.com/appengine/docs/standard/runtimes - """ - return is_appengine() and os.environ["APPENGINE_RUNTIME"] == "python27" - - -def is_local_appengine(): - return "APPENGINE_RUNTIME" in os.environ and os.environ.get( - "SERVER_SOFTWARE", "" - ).startswith("Development/") - - -def is_prod_appengine(): - return "APPENGINE_RUNTIME" in os.environ and os.environ.get( - "SERVER_SOFTWARE", "" - ).startswith("Google App Engine/") - - -def is_prod_appengine_mvms(): - """Deprecated.""" - return False diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/__init__.py b/venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 63e8c8feb4fe412ac91ca74bbee9296cba56a902..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmWIL<>g`kf>pNqaUl9Jh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6vHza+OnzaX<f zH#4ueBrzvPH?6EP+p@$oRll?-Cnqz>7)~eW=am#?Ch5l)rzV#crIr*W<`oy@7nSJ8 e$7kkcmc+;F6;$5hu*uC&Da}c>1KIN#h#3F^Ln@d6 diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-38.pyc deleted file mode 100644 index 12087a343c39a5c4748c7abd62ddc10d6b08e044..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10188 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 CloLPz diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-38.pyc deleted file mode 100644 index cab1a6547dc23eb4bf6580a74b0fe48c913c0fac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7509 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 diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/bindings.py b/venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/bindings.py deleted file mode 100644 index d9b6733..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/bindings.py +++ /dev/null @@ -1,493 +0,0 @@ -""" -This module uses ctypes to bind a whole bunch of functions and constants from -SecureTransport. The goal here is to provide the low-level API to -SecureTransport. These are essentially the C-level functions and constants, and -they're pretty gross to work with. - -This code is a bastardised version of the code found in Will Bond's oscrypto -library. An enormous debt is owed to him for blazing this trail for us. For -that reason, this code should be considered to be covered both by urllib3's -license and by oscrypto's: - - Copyright (c) 2015-2016 Will Bond <will@wbond.net> - - 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. -""" -from __future__ import absolute_import - -import platform -from ctypes.util import find_library -from ctypes import ( - c_void_p, - c_int32, - c_char_p, - c_size_t, - c_byte, - c_uint32, - c_ulong, - c_long, - c_bool, -) -from ctypes import CDLL, POINTER, CFUNCTYPE - - -security_path = find_library("Security") -if not security_path: - raise ImportError("The library Security could not be found") - - -core_foundation_path = find_library("CoreFoundation") -if not core_foundation_path: - raise ImportError("The library CoreFoundation could not be found") - - -version = platform.mac_ver()[0] -version_info = tuple(map(int, version.split("."))) -if version_info < (10, 8): - raise OSError( - "Only OS X 10.8 and newer are supported, not %s.%s" - % (version_info[0], version_info[1]) - ) - -Security = CDLL(security_path, use_errno=True) -CoreFoundation = CDLL(core_foundation_path, use_errno=True) - -Boolean = c_bool -CFIndex = c_long -CFStringEncoding = c_uint32 -CFData = c_void_p -CFString = c_void_p -CFArray = c_void_p -CFMutableArray = c_void_p -CFDictionary = c_void_p -CFError = c_void_p -CFType = c_void_p -CFTypeID = c_ulong - -CFTypeRef = POINTER(CFType) -CFAllocatorRef = c_void_p - -OSStatus = c_int32 - -CFDataRef = POINTER(CFData) -CFStringRef = POINTER(CFString) -CFArrayRef = POINTER(CFArray) -CFMutableArrayRef = POINTER(CFMutableArray) -CFDictionaryRef = POINTER(CFDictionary) -CFArrayCallBacks = c_void_p -CFDictionaryKeyCallBacks = c_void_p -CFDictionaryValueCallBacks = c_void_p - -SecCertificateRef = POINTER(c_void_p) -SecExternalFormat = c_uint32 -SecExternalItemType = c_uint32 -SecIdentityRef = POINTER(c_void_p) -SecItemImportExportFlags = c_uint32 -SecItemImportExportKeyParameters = c_void_p -SecKeychainRef = POINTER(c_void_p) -SSLProtocol = c_uint32 -SSLCipherSuite = c_uint32 -SSLContextRef = POINTER(c_void_p) -SecTrustRef = POINTER(c_void_p) -SSLConnectionRef = c_uint32 -SecTrustResultType = c_uint32 -SecTrustOptionFlags = c_uint32 -SSLProtocolSide = c_uint32 -SSLConnectionType = c_uint32 -SSLSessionOption = c_uint32 - - -try: - Security.SecItemImport.argtypes = [ - CFDataRef, - CFStringRef, - POINTER(SecExternalFormat), - POINTER(SecExternalItemType), - SecItemImportExportFlags, - POINTER(SecItemImportExportKeyParameters), - SecKeychainRef, - POINTER(CFArrayRef), - ] - Security.SecItemImport.restype = OSStatus - - Security.SecCertificateGetTypeID.argtypes = [] - Security.SecCertificateGetTypeID.restype = CFTypeID - - Security.SecIdentityGetTypeID.argtypes = [] - Security.SecIdentityGetTypeID.restype = CFTypeID - - Security.SecKeyGetTypeID.argtypes = [] - Security.SecKeyGetTypeID.restype = CFTypeID - - Security.SecCertificateCreateWithData.argtypes = [CFAllocatorRef, CFDataRef] - Security.SecCertificateCreateWithData.restype = SecCertificateRef - - Security.SecCertificateCopyData.argtypes = [SecCertificateRef] - Security.SecCertificateCopyData.restype = CFDataRef - - Security.SecCopyErrorMessageString.argtypes = [OSStatus, c_void_p] - Security.SecCopyErrorMessageString.restype = CFStringRef - - Security.SecIdentityCreateWithCertificate.argtypes = [ - CFTypeRef, - SecCertificateRef, - POINTER(SecIdentityRef), - ] - Security.SecIdentityCreateWithCertificate.restype = OSStatus - - Security.SecKeychainCreate.argtypes = [ - c_char_p, - c_uint32, - c_void_p, - Boolean, - c_void_p, - POINTER(SecKeychainRef), - ] - Security.SecKeychainCreate.restype = OSStatus - - Security.SecKeychainDelete.argtypes = [SecKeychainRef] - Security.SecKeychainDelete.restype = OSStatus - - Security.SecPKCS12Import.argtypes = [ - CFDataRef, - CFDictionaryRef, - POINTER(CFArrayRef), - ] - Security.SecPKCS12Import.restype = OSStatus - - SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) - SSLWriteFunc = CFUNCTYPE( - OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t) - ) - - Security.SSLSetIOFuncs.argtypes = [SSLContextRef, SSLReadFunc, SSLWriteFunc] - Security.SSLSetIOFuncs.restype = OSStatus - - Security.SSLSetPeerID.argtypes = [SSLContextRef, c_char_p, c_size_t] - Security.SSLSetPeerID.restype = OSStatus - - Security.SSLSetCertificate.argtypes = [SSLContextRef, CFArrayRef] - Security.SSLSetCertificate.restype = OSStatus - - Security.SSLSetCertificateAuthorities.argtypes = [SSLContextRef, CFTypeRef, Boolean] - Security.SSLSetCertificateAuthorities.restype = OSStatus - - Security.SSLSetConnection.argtypes = [SSLContextRef, SSLConnectionRef] - Security.SSLSetConnection.restype = OSStatus - - Security.SSLSetPeerDomainName.argtypes = [SSLContextRef, c_char_p, c_size_t] - Security.SSLSetPeerDomainName.restype = OSStatus - - Security.SSLHandshake.argtypes = [SSLContextRef] - Security.SSLHandshake.restype = OSStatus - - Security.SSLRead.argtypes = [SSLContextRef, c_char_p, c_size_t, POINTER(c_size_t)] - Security.SSLRead.restype = OSStatus - - Security.SSLWrite.argtypes = [SSLContextRef, c_char_p, c_size_t, POINTER(c_size_t)] - Security.SSLWrite.restype = OSStatus - - Security.SSLClose.argtypes = [SSLContextRef] - Security.SSLClose.restype = OSStatus - - Security.SSLGetNumberSupportedCiphers.argtypes = [SSLContextRef, POINTER(c_size_t)] - Security.SSLGetNumberSupportedCiphers.restype = OSStatus - - Security.SSLGetSupportedCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - POINTER(c_size_t), - ] - Security.SSLGetSupportedCiphers.restype = OSStatus - - Security.SSLSetEnabledCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - c_size_t, - ] - Security.SSLSetEnabledCiphers.restype = OSStatus - - Security.SSLGetNumberEnabledCiphers.argtype = [SSLContextRef, POINTER(c_size_t)] - Security.SSLGetNumberEnabledCiphers.restype = OSStatus - - Security.SSLGetEnabledCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - POINTER(c_size_t), - ] - Security.SSLGetEnabledCiphers.restype = OSStatus - - Security.SSLGetNegotiatedCipher.argtypes = [SSLContextRef, POINTER(SSLCipherSuite)] - Security.SSLGetNegotiatedCipher.restype = OSStatus - - Security.SSLGetNegotiatedProtocolVersion.argtypes = [ - SSLContextRef, - POINTER(SSLProtocol), - ] - Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus - - Security.SSLCopyPeerTrust.argtypes = [SSLContextRef, POINTER(SecTrustRef)] - Security.SSLCopyPeerTrust.restype = OSStatus - - Security.SecTrustSetAnchorCertificates.argtypes = [SecTrustRef, CFArrayRef] - Security.SecTrustSetAnchorCertificates.restype = OSStatus - - Security.SecTrustSetAnchorCertificatesOnly.argstypes = [SecTrustRef, Boolean] - Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus - - Security.SecTrustEvaluate.argtypes = [SecTrustRef, POINTER(SecTrustResultType)] - Security.SecTrustEvaluate.restype = OSStatus - - Security.SecTrustGetCertificateCount.argtypes = [SecTrustRef] - Security.SecTrustGetCertificateCount.restype = CFIndex - - Security.SecTrustGetCertificateAtIndex.argtypes = [SecTrustRef, CFIndex] - Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef - - Security.SSLCreateContext.argtypes = [ - CFAllocatorRef, - SSLProtocolSide, - SSLConnectionType, - ] - Security.SSLCreateContext.restype = SSLContextRef - - Security.SSLSetSessionOption.argtypes = [SSLContextRef, SSLSessionOption, Boolean] - Security.SSLSetSessionOption.restype = OSStatus - - Security.SSLSetProtocolVersionMin.argtypes = [SSLContextRef, SSLProtocol] - Security.SSLSetProtocolVersionMin.restype = OSStatus - - Security.SSLSetProtocolVersionMax.argtypes = [SSLContextRef, SSLProtocol] - Security.SSLSetProtocolVersionMax.restype = OSStatus - - Security.SecCopyErrorMessageString.argtypes = [OSStatus, c_void_p] - Security.SecCopyErrorMessageString.restype = CFStringRef - - Security.SSLReadFunc = SSLReadFunc - Security.SSLWriteFunc = SSLWriteFunc - Security.SSLContextRef = SSLContextRef - Security.SSLProtocol = SSLProtocol - Security.SSLCipherSuite = SSLCipherSuite - Security.SecIdentityRef = SecIdentityRef - Security.SecKeychainRef = SecKeychainRef - Security.SecTrustRef = SecTrustRef - Security.SecTrustResultType = SecTrustResultType - Security.SecExternalFormat = SecExternalFormat - Security.OSStatus = OSStatus - - Security.kSecImportExportPassphrase = CFStringRef.in_dll( - Security, "kSecImportExportPassphrase" - ) - Security.kSecImportItemIdentity = CFStringRef.in_dll( - Security, "kSecImportItemIdentity" - ) - - # CoreFoundation time! - CoreFoundation.CFRetain.argtypes = [CFTypeRef] - CoreFoundation.CFRetain.restype = CFTypeRef - - CoreFoundation.CFRelease.argtypes = [CFTypeRef] - CoreFoundation.CFRelease.restype = None - - CoreFoundation.CFGetTypeID.argtypes = [CFTypeRef] - CoreFoundation.CFGetTypeID.restype = CFTypeID - - CoreFoundation.CFStringCreateWithCString.argtypes = [ - CFAllocatorRef, - c_char_p, - CFStringEncoding, - ] - CoreFoundation.CFStringCreateWithCString.restype = CFStringRef - - CoreFoundation.CFStringGetCStringPtr.argtypes = [CFStringRef, CFStringEncoding] - CoreFoundation.CFStringGetCStringPtr.restype = c_char_p - - CoreFoundation.CFStringGetCString.argtypes = [ - CFStringRef, - c_char_p, - CFIndex, - CFStringEncoding, - ] - CoreFoundation.CFStringGetCString.restype = c_bool - - CoreFoundation.CFDataCreate.argtypes = [CFAllocatorRef, c_char_p, CFIndex] - CoreFoundation.CFDataCreate.restype = CFDataRef - - CoreFoundation.CFDataGetLength.argtypes = [CFDataRef] - CoreFoundation.CFDataGetLength.restype = CFIndex - - CoreFoundation.CFDataGetBytePtr.argtypes = [CFDataRef] - CoreFoundation.CFDataGetBytePtr.restype = c_void_p - - CoreFoundation.CFDictionaryCreate.argtypes = [ - CFAllocatorRef, - POINTER(CFTypeRef), - POINTER(CFTypeRef), - CFIndex, - CFDictionaryKeyCallBacks, - CFDictionaryValueCallBacks, - ] - CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef - - CoreFoundation.CFDictionaryGetValue.argtypes = [CFDictionaryRef, CFTypeRef] - CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef - - CoreFoundation.CFArrayCreate.argtypes = [ - CFAllocatorRef, - POINTER(CFTypeRef), - CFIndex, - CFArrayCallBacks, - ] - CoreFoundation.CFArrayCreate.restype = CFArrayRef - - CoreFoundation.CFArrayCreateMutable.argtypes = [ - CFAllocatorRef, - CFIndex, - CFArrayCallBacks, - ] - CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef - - CoreFoundation.CFArrayAppendValue.argtypes = [CFMutableArrayRef, c_void_p] - CoreFoundation.CFArrayAppendValue.restype = None - - CoreFoundation.CFArrayGetCount.argtypes = [CFArrayRef] - CoreFoundation.CFArrayGetCount.restype = CFIndex - - CoreFoundation.CFArrayGetValueAtIndex.argtypes = [CFArrayRef, CFIndex] - CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p - - CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( - CoreFoundation, "kCFAllocatorDefault" - ) - CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll( - CoreFoundation, "kCFTypeArrayCallBacks" - ) - CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( - CoreFoundation, "kCFTypeDictionaryKeyCallBacks" - ) - CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( - CoreFoundation, "kCFTypeDictionaryValueCallBacks" - ) - - CoreFoundation.CFTypeRef = CFTypeRef - CoreFoundation.CFArrayRef = CFArrayRef - CoreFoundation.CFStringRef = CFStringRef - CoreFoundation.CFDictionaryRef = CFDictionaryRef - -except (AttributeError): - raise ImportError("Error initializing ctypes") - - -class CFConst(object): - """ - A class object that acts as essentially a namespace for CoreFoundation - constants. - """ - - kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) - - -class SecurityConst(object): - """ - A class object that acts as essentially a namespace for Security constants. - """ - - kSSLSessionOptionBreakOnServerAuth = 0 - - kSSLProtocol2 = 1 - kSSLProtocol3 = 2 - kTLSProtocol1 = 4 - kTLSProtocol11 = 7 - kTLSProtocol12 = 8 - # SecureTransport does not support TLS 1.3 even if there's a constant for it - kTLSProtocol13 = 10 - kTLSProtocolMaxSupported = 999 - - kSSLClientSide = 1 - kSSLStreamType = 0 - - kSecFormatPEMSequence = 10 - - kSecTrustResultInvalid = 0 - kSecTrustResultProceed = 1 - # This gap is present on purpose: this was kSecTrustResultConfirm, which - # is deprecated. - kSecTrustResultDeny = 3 - kSecTrustResultUnspecified = 4 - kSecTrustResultRecoverableTrustFailure = 5 - kSecTrustResultFatalTrustFailure = 6 - kSecTrustResultOtherError = 7 - - errSSLProtocol = -9800 - errSSLWouldBlock = -9803 - errSSLClosedGraceful = -9805 - errSSLClosedNoNotify = -9816 - errSSLClosedAbort = -9806 - - errSSLXCertChainInvalid = -9807 - errSSLCrypto = -9809 - errSSLInternal = -9810 - errSSLCertExpired = -9814 - errSSLCertNotYetValid = -9815 - errSSLUnknownRootCert = -9812 - errSSLNoRootCert = -9813 - errSSLHostNameMismatch = -9843 - errSSLPeerHandshakeFail = -9824 - errSSLPeerUserCancelled = -9839 - errSSLWeakPeerEphemeralDHKey = -9850 - errSSLServerAuthCompleted = -9841 - errSSLRecordOverflow = -9847 - - errSecVerifyFailed = -67808 - errSecNoTrustSettings = -25263 - errSecItemNotFound = -25300 - errSecInvalidTrustSettings = -25262 - - # Cipher suites. We only pick the ones our default cipher string allows. - # Source: https://developer.apple.com/documentation/security/1550981-ssl_cipher_suite_values - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA9 - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA8 - TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F - TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 - TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A - TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 - TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B - TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 - TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 - TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 - TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D - TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C - TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D - TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C - TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 - TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F - TLS_AES_128_GCM_SHA256 = 0x1301 - TLS_AES_256_GCM_SHA384 = 0x1302 - TLS_AES_128_CCM_8_SHA256 = 0x1305 - TLS_AES_128_CCM_SHA256 = 0x1304 diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/low_level.py b/venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/low_level.py deleted file mode 100644 index e60168c..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/low_level.py +++ /dev/null @@ -1,328 +0,0 @@ -""" -Low-level helpers for the SecureTransport bindings. - -These are Python functions that are not directly related to the high-level APIs -but are necessary to get them to work. They include a whole bunch of low-level -CoreFoundation messing about and memory management. The concerns in this module -are almost entirely about trying to avoid memory leaks and providing -appropriate and useful assistance to the higher-level code. -""" -import base64 -import ctypes -import itertools -import re -import os -import ssl -import tempfile - -from .bindings import Security, CoreFoundation, CFConst - - -# This regular expression is used to grab PEM data out of a PEM bundle. -_PEM_CERTS_RE = re.compile( - b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL -) - - -def _cf_data_from_bytes(bytestring): - """ - Given a bytestring, create a CFData object from it. This CFData object must - be CFReleased by the caller. - """ - return CoreFoundation.CFDataCreate( - CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring) - ) - - -def _cf_dictionary_from_tuples(tuples): - """ - Given a list of Python tuples, create an associated CFDictionary. - """ - dictionary_size = len(tuples) - - # We need to get the dictionary keys and values out in the same order. - keys = (t[0] for t in tuples) - values = (t[1] for t in tuples) - cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys) - cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values) - - return CoreFoundation.CFDictionaryCreate( - CoreFoundation.kCFAllocatorDefault, - cf_keys, - cf_values, - dictionary_size, - CoreFoundation.kCFTypeDictionaryKeyCallBacks, - CoreFoundation.kCFTypeDictionaryValueCallBacks, - ) - - -def _cf_string_to_unicode(value): - """ - Creates a Unicode string from a CFString object. Used entirely for error - reporting. - - Yes, it annoys me quite a lot that this function is this complex. - """ - value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p)) - - string = CoreFoundation.CFStringGetCStringPtr( - value_as_void_p, CFConst.kCFStringEncodingUTF8 - ) - if string is None: - buffer = ctypes.create_string_buffer(1024) - result = CoreFoundation.CFStringGetCString( - value_as_void_p, buffer, 1024, CFConst.kCFStringEncodingUTF8 - ) - if not result: - raise OSError("Error copying C string from CFStringRef") - string = buffer.value - if string is not None: - string = string.decode("utf-8") - return string - - -def _assert_no_error(error, exception_class=None): - """ - Checks the return code and throws an exception if there is an error to - report - """ - if error == 0: - return - - cf_error_string = Security.SecCopyErrorMessageString(error, None) - output = _cf_string_to_unicode(cf_error_string) - CoreFoundation.CFRelease(cf_error_string) - - if output is None or output == u"": - output = u"OSStatus %s" % error - - if exception_class is None: - exception_class = ssl.SSLError - - raise exception_class(output) - - -def _cert_array_from_pem(pem_bundle): - """ - Given a bundle of certs in PEM format, turns them into a CFArray of certs - that can be used to validate a cert chain. - """ - # Normalize the PEM bundle's line endings. - pem_bundle = pem_bundle.replace(b"\r\n", b"\n") - - der_certs = [ - base64.b64decode(match.group(1)) for match in _PEM_CERTS_RE.finditer(pem_bundle) - ] - if not der_certs: - raise ssl.SSLError("No root certificates specified") - - cert_array = CoreFoundation.CFArrayCreateMutable( - CoreFoundation.kCFAllocatorDefault, - 0, - ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), - ) - if not cert_array: - raise ssl.SSLError("Unable to allocate memory!") - - try: - for der_bytes in der_certs: - certdata = _cf_data_from_bytes(der_bytes) - if not certdata: - raise ssl.SSLError("Unable to allocate memory!") - cert = Security.SecCertificateCreateWithData( - CoreFoundation.kCFAllocatorDefault, certdata - ) - CoreFoundation.CFRelease(certdata) - if not cert: - raise ssl.SSLError("Unable to build cert object!") - - CoreFoundation.CFArrayAppendValue(cert_array, cert) - CoreFoundation.CFRelease(cert) - except Exception: - # We need to free the array before the exception bubbles further. - # We only want to do that if an error occurs: otherwise, the caller - # should free. - CoreFoundation.CFRelease(cert_array) - - return cert_array - - -def _is_cert(item): - """ - Returns True if a given CFTypeRef is a certificate. - """ - expected = Security.SecCertificateGetTypeID() - return CoreFoundation.CFGetTypeID(item) == expected - - -def _is_identity(item): - """ - Returns True if a given CFTypeRef is an identity. - """ - expected = Security.SecIdentityGetTypeID() - return CoreFoundation.CFGetTypeID(item) == expected - - -def _temporary_keychain(): - """ - This function creates a temporary Mac keychain that we can use to work with - credentials. This keychain uses a one-time password and a temporary file to - store the data. We expect to have one keychain per socket. The returned - SecKeychainRef must be freed by the caller, including calling - SecKeychainDelete. - - Returns a tuple of the SecKeychainRef and the path to the temporary - directory that contains it. - """ - # Unfortunately, SecKeychainCreate requires a path to a keychain. This - # means we cannot use mkstemp to use a generic temporary file. Instead, - # we're going to create a temporary directory and a filename to use there. - # This filename will be 8 random bytes expanded into base64. We also need - # some random bytes to password-protect the keychain we're creating, so we - # ask for 40 random bytes. - random_bytes = os.urandom(40) - filename = base64.b16encode(random_bytes[:8]).decode("utf-8") - password = base64.b16encode(random_bytes[8:]) # Must be valid UTF-8 - tempdirectory = tempfile.mkdtemp() - - keychain_path = os.path.join(tempdirectory, filename).encode("utf-8") - - # We now want to create the keychain itself. - keychain = Security.SecKeychainRef() - status = Security.SecKeychainCreate( - keychain_path, len(password), password, False, None, ctypes.byref(keychain) - ) - _assert_no_error(status) - - # Having created the keychain, we want to pass it off to the caller. - return keychain, tempdirectory - - -def _load_items_from_file(keychain, path): - """ - Given a single file, loads all the trust objects from it into arrays and - the keychain. - Returns a tuple of lists: the first list is a list of identities, the - second a list of certs. - """ - certificates = [] - identities = [] - result_array = None - - with open(path, "rb") as f: - raw_filedata = f.read() - - try: - filedata = CoreFoundation.CFDataCreate( - CoreFoundation.kCFAllocatorDefault, raw_filedata, len(raw_filedata) - ) - result_array = CoreFoundation.CFArrayRef() - result = Security.SecItemImport( - filedata, # cert data - None, # Filename, leaving it out for now - None, # What the type of the file is, we don't care - None, # what's in the file, we don't care - 0, # import flags - None, # key params, can include passphrase in the future - keychain, # The keychain to insert into - ctypes.byref(result_array), # Results - ) - _assert_no_error(result) - - # A CFArray is not very useful to us as an intermediary - # representation, so we are going to extract the objects we want - # and then free the array. We don't need to keep hold of keys: the - # keychain already has them! - result_count = CoreFoundation.CFArrayGetCount(result_array) - for index in range(result_count): - item = CoreFoundation.CFArrayGetValueAtIndex(result_array, index) - item = ctypes.cast(item, CoreFoundation.CFTypeRef) - - if _is_cert(item): - CoreFoundation.CFRetain(item) - certificates.append(item) - elif _is_identity(item): - CoreFoundation.CFRetain(item) - identities.append(item) - finally: - if result_array: - CoreFoundation.CFRelease(result_array) - - CoreFoundation.CFRelease(filedata) - - return (identities, certificates) - - -def _load_client_cert_chain(keychain, *paths): - """ - Load certificates and maybe keys from a number of files. Has the end goal - of returning a CFArray containing one SecIdentityRef, and then zero or more - SecCertificateRef objects, suitable for use as a client certificate trust - chain. - """ - # Ok, the strategy. - # - # This relies on knowing that macOS will not give you a SecIdentityRef - # unless you have imported a key into a keychain. This is a somewhat - # artificial limitation of macOS (for example, it doesn't necessarily - # affect iOS), but there is nothing inside Security.framework that lets you - # get a SecIdentityRef without having a key in a keychain. - # - # So the policy here is we take all the files and iterate them in order. - # Each one will use SecItemImport to have one or more objects loaded from - # it. We will also point at a keychain that macOS can use to work with the - # private key. - # - # Once we have all the objects, we'll check what we actually have. If we - # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, - # we'll take the first certificate (which we assume to be our leaf) and - # ask the keychain to give us a SecIdentityRef with that cert's associated - # key. - # - # We'll then return a CFArray containing the trust chain: one - # SecIdentityRef and then zero-or-more SecCertificateRef objects. The - # responsibility for freeing this CFArray will be with the caller. This - # CFArray must remain alive for the entire connection, so in practice it - # will be stored with a single SSLSocket, along with the reference to the - # keychain. - certificates = [] - identities = [] - - # Filter out bad paths. - paths = (path for path in paths if path) - - try: - for file_path in paths: - new_identities, new_certs = _load_items_from_file(keychain, file_path) - identities.extend(new_identities) - certificates.extend(new_certs) - - # Ok, we have everything. The question is: do we have an identity? If - # not, we want to grab one from the first cert we have. - if not identities: - new_identity = Security.SecIdentityRef() - status = Security.SecIdentityCreateWithCertificate( - keychain, certificates[0], ctypes.byref(new_identity) - ) - _assert_no_error(status) - identities.append(new_identity) - - # We now want to release the original certificate, as we no longer - # need it. - CoreFoundation.CFRelease(certificates.pop(0)) - - # We now need to build a new CFArray that holds the trust chain. - trust_chain = CoreFoundation.CFArrayCreateMutable( - CoreFoundation.kCFAllocatorDefault, - 0, - ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), - ) - for item in itertools.chain(identities, certificates): - # ArrayAppendValue does a CFRetain on the item. That's fine, - # because the finally block will release our other refs to them. - CoreFoundation.CFArrayAppendValue(trust_chain, item) - - return trust_chain - finally: - for obj in itertools.chain(identities, certificates): - CoreFoundation.CFRelease(obj) diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/appengine.py b/venv/lib/python3.8/site-packages/urllib3/contrib/appengine.py deleted file mode 100644 index 9b7044f..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/contrib/appengine.py +++ /dev/null @@ -1,314 +0,0 @@ -""" -This module provides a pool manager that uses Google App Engine's -`URLFetch Service <https://cloud.google.com/appengine/docs/python/urlfetch>`_. - -Example usage:: - - from urllib3 import PoolManager - from urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox - - if is_appengine_sandbox(): - # AppEngineManager uses AppEngine's URLFetch API behind the scenes - http = AppEngineManager() - else: - # PoolManager uses a socket-level API behind the scenes - http = PoolManager() - - r = http.request('GET', 'https://google.com/') - -There are `limitations <https://cloud.google.com/appengine/docs/python/\ -urlfetch/#Python_Quotas_and_limits>`_ to the URLFetch service and it may not be -the best choice for your application. There are three options for using -urllib3 on Google App Engine: - -1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is - cost-effective in many circumstances as long as your usage is within the - limitations. -2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets. - Sockets also have `limitations and restrictions - <https://cloud.google.com/appengine/docs/python/sockets/\ - #limitations-and-restrictions>`_ and have a lower free quota than URLFetch. - To use sockets, be sure to specify the following in your ``app.yaml``:: - - env_variables: - GAE_USE_SOCKETS_HTTPLIB : 'true' - -3. If you are using `App Engine Flexible -<https://cloud.google.com/appengine/docs/flexible/>`_, you can use the standard -:class:`PoolManager` without any configuration or special environment variables. -""" - -from __future__ import absolute_import -import io -import logging -import warnings -from ..packages.six.moves.urllib.parse import urljoin - -from ..exceptions import ( - HTTPError, - HTTPWarning, - MaxRetryError, - ProtocolError, - TimeoutError, - SSLError, -) - -from ..request import RequestMethods -from ..response import HTTPResponse -from ..util.timeout import Timeout -from ..util.retry import Retry -from . import _appengine_environ - -try: - from google.appengine.api import urlfetch -except ImportError: - urlfetch = None - - -log = logging.getLogger(__name__) - - -class AppEnginePlatformWarning(HTTPWarning): - pass - - -class AppEnginePlatformError(HTTPError): - pass - - -class AppEngineManager(RequestMethods): - """ - Connection manager for Google App Engine sandbox applications. - - This manager uses the URLFetch service directly instead of using the - emulated httplib, and is subject to URLFetch limitations as described in - the App Engine documentation `here - <https://cloud.google.com/appengine/docs/python/urlfetch>`_. - - Notably it will raise an :class:`AppEnginePlatformError` if: - * URLFetch is not available. - * If you attempt to use this on App Engine Flexible, as full socket - support is available. - * If a request size is more than 10 megabytes. - * If a response size is more than 32 megabtyes. - * If you use an unsupported request method such as OPTIONS. - - Beyond those cases, it will raise normal urllib3 errors. - """ - - def __init__( - self, - headers=None, - retries=None, - validate_certificate=True, - urlfetch_retries=True, - ): - if not urlfetch: - raise AppEnginePlatformError( - "URLFetch is not available in this environment." - ) - - warnings.warn( - "urllib3 is using URLFetch on Google App Engine sandbox instead " - "of sockets. To use sockets directly instead of URLFetch see " - "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.", - AppEnginePlatformWarning, - ) - - RequestMethods.__init__(self, headers) - self.validate_certificate = validate_certificate - self.urlfetch_retries = urlfetch_retries - - self.retries = retries or Retry.DEFAULT - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - # Return False to re-raise any potential exceptions - return False - - def urlopen( - self, - method, - url, - body=None, - headers=None, - retries=None, - redirect=True, - timeout=Timeout.DEFAULT_TIMEOUT, - **response_kw - ): - - retries = self._get_retries(retries, redirect) - - try: - follow_redirects = redirect and retries.redirect != 0 and retries.total - response = urlfetch.fetch( - url, - payload=body, - method=method, - headers=headers or {}, - allow_truncated=False, - follow_redirects=self.urlfetch_retries and follow_redirects, - deadline=self._get_absolute_timeout(timeout), - validate_certificate=self.validate_certificate, - ) - except urlfetch.DeadlineExceededError as e: - raise TimeoutError(self, e) - - except urlfetch.InvalidURLError as e: - if "too large" in str(e): - raise AppEnginePlatformError( - "URLFetch request too large, URLFetch only " - "supports requests up to 10mb in size.", - e, - ) - raise ProtocolError(e) - - except urlfetch.DownloadError as e: - if "Too many redirects" in str(e): - raise MaxRetryError(self, url, reason=e) - raise ProtocolError(e) - - except urlfetch.ResponseTooLargeError as e: - raise AppEnginePlatformError( - "URLFetch response too large, URLFetch only supports" - "responses up to 32mb in size.", - e, - ) - - except urlfetch.SSLCertificateError as e: - raise SSLError(e) - - except urlfetch.InvalidMethodError as e: - raise AppEnginePlatformError( - "URLFetch does not support method: %s" % method, e - ) - - http_response = self._urlfetch_response_to_http_response( - response, retries=retries, **response_kw - ) - - # Handle redirect? - redirect_location = redirect and http_response.get_redirect_location() - if redirect_location: - # Check for redirect response - if self.urlfetch_retries and retries.raise_on_redirect: - raise MaxRetryError(self, url, "too many redirects") - else: - if http_response.status == 303: - method = "GET" - - try: - retries = retries.increment( - method, url, response=http_response, _pool=self - ) - except MaxRetryError: - if retries.raise_on_redirect: - raise MaxRetryError(self, url, "too many redirects") - return http_response - - retries.sleep_for_retry(http_response) - log.debug("Redirecting %s -> %s", url, redirect_location) - redirect_url = urljoin(url, redirect_location) - return self.urlopen( - method, - redirect_url, - body, - headers, - retries=retries, - redirect=redirect, - timeout=timeout, - **response_kw - ) - - # Check if we should retry the HTTP response. - has_retry_after = bool(http_response.getheader("Retry-After")) - if retries.is_retry(method, http_response.status, has_retry_after): - retries = retries.increment(method, url, response=http_response, _pool=self) - log.debug("Retry: %s", url) - retries.sleep(http_response) - return self.urlopen( - method, - url, - body=body, - headers=headers, - retries=retries, - redirect=redirect, - timeout=timeout, - **response_kw - ) - - return http_response - - def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): - - if is_prod_appengine(): - # Production GAE handles deflate encoding automatically, but does - # not remove the encoding header. - content_encoding = urlfetch_resp.headers.get("content-encoding") - - if content_encoding == "deflate": - del urlfetch_resp.headers["content-encoding"] - - transfer_encoding = urlfetch_resp.headers.get("transfer-encoding") - # We have a full response's content, - # so let's make sure we don't report ourselves as chunked data. - if transfer_encoding == "chunked": - encodings = transfer_encoding.split(",") - encodings.remove("chunked") - urlfetch_resp.headers["transfer-encoding"] = ",".join(encodings) - - original_response = HTTPResponse( - # In order for decoding to work, we must present the content as - # a file-like object. - body=io.BytesIO(urlfetch_resp.content), - msg=urlfetch_resp.header_msg, - headers=urlfetch_resp.headers, - status=urlfetch_resp.status_code, - **response_kw - ) - - return HTTPResponse( - body=io.BytesIO(urlfetch_resp.content), - headers=urlfetch_resp.headers, - status=urlfetch_resp.status_code, - original_response=original_response, - **response_kw - ) - - def _get_absolute_timeout(self, timeout): - if timeout is Timeout.DEFAULT_TIMEOUT: - return None # Defer to URLFetch's default. - if isinstance(timeout, Timeout): - if timeout._read is not None or timeout._connect is not None: - warnings.warn( - "URLFetch does not support granular timeout settings, " - "reverting to total or default URLFetch timeout.", - AppEnginePlatformWarning, - ) - return timeout.total - return timeout - - def _get_retries(self, retries, redirect): - if not isinstance(retries, Retry): - retries = Retry.from_int(retries, redirect=redirect, default=self.retries) - - if retries.connect or retries.read or retries.redirect: - warnings.warn( - "URLFetch only supports total retries and does not " - "recognize connect, read, or redirect retry parameters.", - AppEnginePlatformWarning, - ) - - return retries - - -# Alias methods from _appengine_environ to maintain public API interface. - -is_appengine = _appengine_environ.is_appengine -is_appengine_sandbox = _appengine_environ.is_appengine_sandbox -is_local_appengine = _appengine_environ.is_local_appengine -is_prod_appengine = _appengine_environ.is_prod_appengine -is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/ntlmpool.py b/venv/lib/python3.8/site-packages/urllib3/contrib/ntlmpool.py deleted file mode 100644 index 1fd242a..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/contrib/ntlmpool.py +++ /dev/null @@ -1,121 +0,0 @@ -""" -NTLM authenticating pool, contributed by erikcederstran - -Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 -""" -from __future__ import absolute_import - -from logging import getLogger -from ntlm import ntlm - -from .. import HTTPSConnectionPool -from ..packages.six.moves.http_client import HTTPSConnection - - -log = getLogger(__name__) - - -class NTLMConnectionPool(HTTPSConnectionPool): - """ - Implements an NTLM authentication version of an urllib3 connection pool - """ - - scheme = "https" - - def __init__(self, user, pw, authurl, *args, **kwargs): - """ - authurl is a random URL on the server that is protected by NTLM. - user is the Windows user, probably in the DOMAIN\\username format. - pw is the password for the user. - """ - super(NTLMConnectionPool, self).__init__(*args, **kwargs) - self.authurl = authurl - self.rawuser = user - user_parts = user.split("\\", 1) - self.domain = user_parts[0].upper() - self.user = user_parts[1] - self.pw = pw - - def _new_conn(self): - # Performs the NTLM handshake that secures the connection. The socket - # must be kept open while requests are performed. - self.num_connections += 1 - log.debug( - "Starting NTLM HTTPS connection no. %d: https://%s%s", - self.num_connections, - self.host, - self.authurl, - ) - - headers = {"Connection": "Keep-Alive"} - req_header = "Authorization" - resp_header = "www-authenticate" - - conn = HTTPSConnection(host=self.host, port=self.port) - - # Send negotiation message - headers[req_header] = "NTLM %s" % ntlm.create_NTLM_NEGOTIATE_MESSAGE( - self.rawuser - ) - log.debug("Request headers: %s", headers) - conn.request("GET", self.authurl, None, headers) - res = conn.getresponse() - reshdr = dict(res.getheaders()) - log.debug("Response status: %s %s", res.status, res.reason) - log.debug("Response headers: %s", reshdr) - log.debug("Response data: %s [...]", res.read(100)) - - # Remove the reference to the socket, so that it can not be closed by - # the response object (we want to keep the socket open) - res.fp = None - - # Server should respond with a challenge message - auth_header_values = reshdr[resp_header].split(", ") - auth_header_value = None - for s in auth_header_values: - if s[:5] == "NTLM ": - auth_header_value = s[5:] - if auth_header_value is None: - raise Exception( - "Unexpected %s response header: %s" % (resp_header, reshdr[resp_header]) - ) - - # Send authentication message - ServerChallenge, NegotiateFlags = ntlm.parse_NTLM_CHALLENGE_MESSAGE( - auth_header_value - ) - auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE( - ServerChallenge, self.user, self.domain, self.pw, NegotiateFlags - ) - headers[req_header] = "NTLM %s" % auth_msg - log.debug("Request headers: %s", headers) - conn.request("GET", self.authurl, None, headers) - res = conn.getresponse() - log.debug("Response status: %s %s", res.status, res.reason) - log.debug("Response headers: %s", dict(res.getheaders())) - log.debug("Response data: %s [...]", res.read()[:100]) - if res.status != 200: - if res.status == 401: - raise Exception("Server rejected request: wrong username or password") - raise Exception("Wrong server response: %s %s" % (res.status, res.reason)) - - res.fp = None - log.debug("Connection established") - return conn - - def urlopen( - self, - method, - url, - body=None, - headers=None, - retries=3, - redirect=True, - assert_same_host=True, - ): - if headers is None: - headers = {} - headers["Connection"] = "Keep-Alive" - return super(NTLMConnectionPool, self).urlopen( - method, url, body, headers, retries, redirect, assert_same_host - ) diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/pyopenssl.py b/venv/lib/python3.8/site-packages/urllib3/contrib/pyopenssl.py deleted file mode 100644 index 3051ef3..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/contrib/pyopenssl.py +++ /dev/null @@ -1,498 +0,0 @@ -""" -SSL with SNI_-support for Python 2. Follow these instructions if you would -like to verify SSL certificates in Python 2. Note, the default libraries do -*not* do certificate checking; you need to do additional work to validate -certificates yourself. - -This needs the following packages installed: - -* pyOpenSSL (tested with 16.0.0) -* cryptography (minimum 1.3.4, from pyopenssl) -* idna (minimum 2.0, from cryptography) - -However, pyopenssl depends on cryptography, which depends on idna, so while we -use all three directly here we end up having relatively few packages required. - -You can install them with the following command: - - pip install pyopenssl cryptography idna - -To activate certificate checking, call -:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code -before you begin making HTTP requests. This can be done in a ``sitecustomize`` -module, or at any other time before your application begins using ``urllib3``, -like this:: - - try: - import urllib3.contrib.pyopenssl - urllib3.contrib.pyopenssl.inject_into_urllib3() - except ImportError: - pass - -Now you can use :mod:`urllib3` as you normally would, and it will support SNI -when the required modules are installed. - -Activating this module also has the positive side effect of disabling SSL/TLS -compression in Python 2 (see `CRIME attack`_). - -If you want to configure the default list of supported cipher suites, you can -set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. - -.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication -.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) -""" -from __future__ import absolute_import - -import OpenSSL.SSL -from cryptography import x509 -from cryptography.hazmat.backends.openssl import backend as openssl_backend -from cryptography.hazmat.backends.openssl.x509 import _Certificate - -try: - from cryptography.x509 import UnsupportedExtension -except ImportError: - # UnsupportedExtension is gone in cryptography >= 2.1.0 - class UnsupportedExtension(Exception): - pass - - -from socket import timeout, error as SocketError -from io import BytesIO - -try: # Platform-specific: Python 2 - from socket import _fileobject -except ImportError: # Platform-specific: Python 3 - _fileobject = None - from ..packages.backports.makefile import backport_makefile - -import logging -import ssl -from ..packages import six -import sys - -from .. import util - - -__all__ = ["inject_into_urllib3", "extract_from_urllib3"] - -# SNI always works. -HAS_SNI = True - -# Map from urllib3 to PyOpenSSL compatible parameter-values. -_openssl_versions = { - util.PROTOCOL_TLS: OpenSSL.SSL.SSLv23_METHOD, - ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, -} - -if hasattr(ssl, "PROTOCOL_SSLv3") and hasattr(OpenSSL.SSL, "SSLv3_METHOD"): - _openssl_versions[ssl.PROTOCOL_SSLv3] = OpenSSL.SSL.SSLv3_METHOD - -if hasattr(ssl, "PROTOCOL_TLSv1_1") and hasattr(OpenSSL.SSL, "TLSv1_1_METHOD"): - _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD - -if hasattr(ssl, "PROTOCOL_TLSv1_2") and hasattr(OpenSSL.SSL, "TLSv1_2_METHOD"): - _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD - - -_stdlib_to_openssl_verify = { - ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, - ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, - ssl.CERT_REQUIRED: OpenSSL.SSL.VERIFY_PEER - + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, -} -_openssl_to_stdlib_verify = dict((v, k) for k, v in _stdlib_to_openssl_verify.items()) - -# OpenSSL will only write 16K at a time -SSL_WRITE_BLOCKSIZE = 16384 - -orig_util_HAS_SNI = util.HAS_SNI -orig_util_SSLContext = util.ssl_.SSLContext - - -log = logging.getLogger(__name__) - - -def inject_into_urllib3(): - "Monkey-patch urllib3 with PyOpenSSL-backed SSL-support." - - _validate_dependencies_met() - - util.SSLContext = PyOpenSSLContext - util.ssl_.SSLContext = PyOpenSSLContext - util.HAS_SNI = HAS_SNI - util.ssl_.HAS_SNI = HAS_SNI - util.IS_PYOPENSSL = True - util.ssl_.IS_PYOPENSSL = True - - -def extract_from_urllib3(): - "Undo monkey-patching by :func:`inject_into_urllib3`." - - util.SSLContext = orig_util_SSLContext - util.ssl_.SSLContext = orig_util_SSLContext - util.HAS_SNI = orig_util_HAS_SNI - util.ssl_.HAS_SNI = orig_util_HAS_SNI - util.IS_PYOPENSSL = False - util.ssl_.IS_PYOPENSSL = False - - -def _validate_dependencies_met(): - """ - Verifies that PyOpenSSL's package-level dependencies have been met. - Throws `ImportError` if they are not met. - """ - # Method added in `cryptography==1.1`; not available in older versions - from cryptography.x509.extensions import Extensions - - if getattr(Extensions, "get_extension_for_class", None) is None: - raise ImportError( - "'cryptography' module missing required functionality. " - "Try upgrading to v1.3.4 or newer." - ) - - # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 - # attribute is only present on those versions. - from OpenSSL.crypto import X509 - - x509 = X509() - if getattr(x509, "_x509", None) is None: - raise ImportError( - "'pyOpenSSL' module missing required functionality. " - "Try upgrading to v0.14 or newer." - ) - - -def _dnsname_to_stdlib(name): - """ - Converts a dNSName SubjectAlternativeName field to the form used by the - standard library on the given Python version. - - Cryptography produces a dNSName as a unicode string that was idna-decoded - from ASCII bytes. We need to idna-encode that string to get it back, and - then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib - uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). - - If the name cannot be idna-encoded then we return None signalling that - the name given should be skipped. - """ - - def idna_encode(name): - """ - Borrowed wholesale from the Python Cryptography Project. It turns out - that we can't just safely call `idna.encode`: it can explode for - wildcard names. This avoids that problem. - """ - import idna - - try: - for prefix in [u"*.", u"."]: - if name.startswith(prefix): - name = name[len(prefix) :] - return prefix.encode("ascii") + idna.encode(name) - return idna.encode(name) - except idna.core.IDNAError: - return None - - # Don't send IPv6 addresses through the IDNA encoder. - if ":" in name: - return name - - name = idna_encode(name) - if name is None: - return None - elif sys.version_info >= (3, 0): - name = name.decode("utf-8") - return name - - -def get_subj_alt_name(peer_cert): - """ - Given an PyOpenSSL certificate, provides all the subject alternative names. - """ - # Pass the cert to cryptography, which has much better APIs for this. - if hasattr(peer_cert, "to_cryptography"): - cert = peer_cert.to_cryptography() - else: - # This is technically using private APIs, but should work across all - # relevant versions before PyOpenSSL got a proper API for this. - cert = _Certificate(openssl_backend, peer_cert._x509) - - # We want to find the SAN extension. Ask Cryptography to locate it (it's - # faster than looping in Python) - try: - ext = cert.extensions.get_extension_for_class(x509.SubjectAlternativeName).value - except x509.ExtensionNotFound: - # No such extension, return the empty list. - return [] - except ( - x509.DuplicateExtension, - UnsupportedExtension, - x509.UnsupportedGeneralNameType, - UnicodeError, - ) as e: - # A problem has been found with the quality of the certificate. Assume - # no SAN field is present. - log.warning( - "A problem was encountered with the certificate that prevented " - "urllib3 from finding the SubjectAlternativeName field. This can " - "affect certificate validation. The error was %s", - e, - ) - return [] - - # We want to return dNSName and iPAddress fields. We need to cast the IPs - # back to strings because the match_hostname function wants them as - # strings. - # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 - # decoded. This is pretty frustrating, but that's what the standard library - # does with certificates, and so we need to attempt to do the same. - # We also want to skip over names which cannot be idna encoded. - names = [ - ("DNS", name) - for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) - if name is not None - ] - names.extend( - ("IP Address", str(name)) for name in ext.get_values_for_type(x509.IPAddress) - ) - - return names - - -class WrappedSocket(object): - """API-compatibility wrapper for Python OpenSSL's Connection-class. - - Note: _makefile_refs, _drop() and _reuse() are needed for the garbage - collector of pypy. - """ - - def __init__(self, connection, socket, suppress_ragged_eofs=True): - self.connection = connection - self.socket = socket - self.suppress_ragged_eofs = suppress_ragged_eofs - self._makefile_refs = 0 - self._closed = False - - def fileno(self): - return self.socket.fileno() - - # Copy-pasted from Python 3.5 source code - def _decref_socketios(self): - if self._makefile_refs > 0: - self._makefile_refs -= 1 - if self._closed: - self.close() - - def recv(self, *args, **kwargs): - try: - data = self.connection.recv(*args, **kwargs) - except OpenSSL.SSL.SysCallError as e: - if self.suppress_ragged_eofs and e.args == (-1, "Unexpected EOF"): - return b"" - else: - raise SocketError(str(e)) - except OpenSSL.SSL.ZeroReturnError: - if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: - return b"" - else: - raise - except OpenSSL.SSL.WantReadError: - if not util.wait_for_read(self.socket, self.socket.gettimeout()): - raise timeout("The read operation timed out") - else: - return self.recv(*args, **kwargs) - - # TLS 1.3 post-handshake authentication - except OpenSSL.SSL.Error as e: - raise ssl.SSLError("read error: %r" % e) - else: - return data - - def recv_into(self, *args, **kwargs): - try: - return self.connection.recv_into(*args, **kwargs) - except OpenSSL.SSL.SysCallError as e: - if self.suppress_ragged_eofs and e.args == (-1, "Unexpected EOF"): - return 0 - else: - raise SocketError(str(e)) - except OpenSSL.SSL.ZeroReturnError: - if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: - return 0 - else: - raise - except OpenSSL.SSL.WantReadError: - if not util.wait_for_read(self.socket, self.socket.gettimeout()): - raise timeout("The read operation timed out") - else: - return self.recv_into(*args, **kwargs) - - # TLS 1.3 post-handshake authentication - except OpenSSL.SSL.Error as e: - raise ssl.SSLError("read error: %r" % e) - - def settimeout(self, timeout): - return self.socket.settimeout(timeout) - - def _send_until_done(self, data): - while True: - try: - return self.connection.send(data) - except OpenSSL.SSL.WantWriteError: - if not util.wait_for_write(self.socket, self.socket.gettimeout()): - raise timeout() - continue - except OpenSSL.SSL.SysCallError as e: - raise SocketError(str(e)) - - def sendall(self, data): - total_sent = 0 - while total_sent < len(data): - sent = self._send_until_done( - data[total_sent : total_sent + SSL_WRITE_BLOCKSIZE] - ) - total_sent += sent - - def shutdown(self): - # FIXME rethrow compatible exceptions should we ever use this - self.connection.shutdown() - - def close(self): - if self._makefile_refs < 1: - try: - self._closed = True - return self.connection.close() - except OpenSSL.SSL.Error: - return - else: - self._makefile_refs -= 1 - - def getpeercert(self, binary_form=False): - x509 = self.connection.get_peer_certificate() - - if not x509: - return x509 - - if binary_form: - return OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_ASN1, x509) - - return { - "subject": ((("commonName", x509.get_subject().CN),),), - "subjectAltName": get_subj_alt_name(x509), - } - - def version(self): - return self.connection.get_protocol_version_name() - - def _reuse(self): - self._makefile_refs += 1 - - def _drop(self): - if self._makefile_refs < 1: - self.close() - else: - self._makefile_refs -= 1 - - -if _fileobject: # Platform-specific: Python 2 - - def makefile(self, mode, bufsize=-1): - self._makefile_refs += 1 - return _fileobject(self, mode, bufsize, close=True) - - -else: # Platform-specific: Python 3 - makefile = backport_makefile - -WrappedSocket.makefile = makefile - - -class PyOpenSSLContext(object): - """ - I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible - for translating the interface of the standard library ``SSLContext`` object - to calls into PyOpenSSL. - """ - - def __init__(self, protocol): - self.protocol = _openssl_versions[protocol] - self._ctx = OpenSSL.SSL.Context(self.protocol) - self._options = 0 - self.check_hostname = False - - @property - def options(self): - return self._options - - @options.setter - def options(self, value): - self._options = value - self._ctx.set_options(value) - - @property - def verify_mode(self): - return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] - - @verify_mode.setter - def verify_mode(self, value): - self._ctx.set_verify(_stdlib_to_openssl_verify[value], _verify_callback) - - def set_default_verify_paths(self): - self._ctx.set_default_verify_paths() - - def set_ciphers(self, ciphers): - if isinstance(ciphers, six.text_type): - ciphers = ciphers.encode("utf-8") - self._ctx.set_cipher_list(ciphers) - - def load_verify_locations(self, cafile=None, capath=None, cadata=None): - if cafile is not None: - cafile = cafile.encode("utf-8") - if capath is not None: - capath = capath.encode("utf-8") - self._ctx.load_verify_locations(cafile, capath) - if cadata is not None: - self._ctx.load_verify_locations(BytesIO(cadata)) - - def load_cert_chain(self, certfile, keyfile=None, password=None): - self._ctx.use_certificate_chain_file(certfile) - if password is not None: - if not isinstance(password, six.binary_type): - password = password.encode("utf-8") - self._ctx.set_passwd_cb(lambda *_: password) - self._ctx.use_privatekey_file(keyfile or certfile) - - def wrap_socket( - self, - sock, - server_side=False, - do_handshake_on_connect=True, - suppress_ragged_eofs=True, - server_hostname=None, - ): - cnx = OpenSSL.SSL.Connection(self._ctx, sock) - - if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 - server_hostname = server_hostname.encode("utf-8") - - if server_hostname is not None: - cnx.set_tlsext_host_name(server_hostname) - - cnx.set_connect_state() - - while True: - try: - cnx.do_handshake() - except OpenSSL.SSL.WantReadError: - if not util.wait_for_read(sock, sock.gettimeout()): - raise timeout("select timed out") - continue - except OpenSSL.SSL.Error as e: - raise ssl.SSLError("bad handshake: %r" % e) - break - - return WrappedSocket(cnx, sock) - - -def _verify_callback(cnx, x509, err_no, err_depth, return_code): - return err_no == 0 diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/securetransport.py b/venv/lib/python3.8/site-packages/urllib3/contrib/securetransport.py deleted file mode 100644 index 87d844a..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/contrib/securetransport.py +++ /dev/null @@ -1,859 +0,0 @@ -""" -SecureTranport support for urllib3 via ctypes. - -This makes platform-native TLS available to urllib3 users on macOS without the -use of a compiler. This is an important feature because the Python Package -Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL -that ships with macOS is not capable of doing TLSv1.2. The only way to resolve -this is to give macOS users an alternative solution to the problem, and that -solution is to use SecureTransport. - -We use ctypes here because this solution must not require a compiler. That's -because pip is not allowed to require a compiler either. - -This is not intended to be a seriously long-term solution to this problem. -The hope is that PEP 543 will eventually solve this issue for us, at which -point we can retire this contrib module. But in the short term, we need to -solve the impending tire fire that is Python on Mac without this kind of -contrib module. So...here we are. - -To use this module, simply import and inject it:: - - import urllib3.contrib.securetransport - urllib3.contrib.securetransport.inject_into_urllib3() - -Happy TLSing! - -This code is a bastardised version of the code found in Will Bond's oscrypto -library. An enormous debt is owed to him for blazing this trail for us. For -that reason, this code should be considered to be covered both by urllib3's -license and by oscrypto's: - - Copyright (c) 2015-2016 Will Bond <will@wbond.net> - - 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. -""" -from __future__ import absolute_import - -import contextlib -import ctypes -import errno -import os.path -import shutil -import socket -import ssl -import threading -import weakref - -from .. import util -from ._securetransport.bindings import Security, SecurityConst, CoreFoundation -from ._securetransport.low_level import ( - _assert_no_error, - _cert_array_from_pem, - _temporary_keychain, - _load_client_cert_chain, -) - -try: # Platform-specific: Python 2 - from socket import _fileobject -except ImportError: # Platform-specific: Python 3 - _fileobject = None - from ..packages.backports.makefile import backport_makefile - -__all__ = ["inject_into_urllib3", "extract_from_urllib3"] - -# SNI always works -HAS_SNI = True - -orig_util_HAS_SNI = util.HAS_SNI -orig_util_SSLContext = util.ssl_.SSLContext - -# This dictionary is used by the read callback to obtain a handle to the -# calling wrapped socket. This is a pretty silly approach, but for now it'll -# do. I feel like I should be able to smuggle a handle to the wrapped socket -# directly in the SSLConnectionRef, but for now this approach will work I -# guess. -# -# We need to lock around this structure for inserts, but we don't do it for -# reads/writes in the callbacks. The reasoning here goes as follows: -# -# 1. It is not possible to call into the callbacks before the dictionary is -# populated, so once in the callback the id must be in the dictionary. -# 2. The callbacks don't mutate the dictionary, they only read from it, and -# so cannot conflict with any of the insertions. -# -# This is good: if we had to lock in the callbacks we'd drastically slow down -# the performance of this code. -_connection_refs = weakref.WeakValueDictionary() -_connection_ref_lock = threading.Lock() - -# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over -# for no better reason than we need *a* limit, and this one is right there. -SSL_WRITE_BLOCKSIZE = 16384 - -# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to -# individual cipher suites. We need to do this because this is how -# SecureTransport wants them. -CIPHER_SUITES = [ - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, - SecurityConst.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_AES_256_GCM_SHA384, - SecurityConst.TLS_AES_128_GCM_SHA256, - SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_AES_128_CCM_8_SHA256, - SecurityConst.TLS_AES_128_CCM_SHA256, - SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256, - SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA, -] - -# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of -# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version. -# TLSv1 to 1.2 are supported on macOS 10.8+ -_protocol_to_min_max = { - util.PROTOCOL_TLS: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12) -} - -if hasattr(ssl, "PROTOCOL_SSLv2"): - _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = ( - SecurityConst.kSSLProtocol2, - SecurityConst.kSSLProtocol2, - ) -if hasattr(ssl, "PROTOCOL_SSLv3"): - _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = ( - SecurityConst.kSSLProtocol3, - SecurityConst.kSSLProtocol3, - ) -if hasattr(ssl, "PROTOCOL_TLSv1"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = ( - SecurityConst.kTLSProtocol1, - SecurityConst.kTLSProtocol1, - ) -if hasattr(ssl, "PROTOCOL_TLSv1_1"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = ( - SecurityConst.kTLSProtocol11, - SecurityConst.kTLSProtocol11, - ) -if hasattr(ssl, "PROTOCOL_TLSv1_2"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = ( - SecurityConst.kTLSProtocol12, - SecurityConst.kTLSProtocol12, - ) - - -def inject_into_urllib3(): - """ - Monkey-patch urllib3 with SecureTransport-backed SSL-support. - """ - util.SSLContext = SecureTransportContext - util.ssl_.SSLContext = SecureTransportContext - util.HAS_SNI = HAS_SNI - util.ssl_.HAS_SNI = HAS_SNI - util.IS_SECURETRANSPORT = True - util.ssl_.IS_SECURETRANSPORT = True - - -def extract_from_urllib3(): - """ - Undo monkey-patching by :func:`inject_into_urllib3`. - """ - util.SSLContext = orig_util_SSLContext - util.ssl_.SSLContext = orig_util_SSLContext - util.HAS_SNI = orig_util_HAS_SNI - util.ssl_.HAS_SNI = orig_util_HAS_SNI - util.IS_SECURETRANSPORT = False - util.ssl_.IS_SECURETRANSPORT = False - - -def _read_callback(connection_id, data_buffer, data_length_pointer): - """ - SecureTransport read callback. This is called by ST to request that data - be returned from the socket. - """ - wrapped_socket = None - try: - wrapped_socket = _connection_refs.get(connection_id) - if wrapped_socket is None: - return SecurityConst.errSSLInternal - base_socket = wrapped_socket.socket - - requested_length = data_length_pointer[0] - - timeout = wrapped_socket.gettimeout() - error = None - read_count = 0 - - try: - while read_count < requested_length: - if timeout is None or timeout >= 0: - if not util.wait_for_read(base_socket, timeout): - raise socket.error(errno.EAGAIN, "timed out") - - remaining = requested_length - read_count - buffer = (ctypes.c_char * remaining).from_address( - data_buffer + read_count - ) - chunk_size = base_socket.recv_into(buffer, remaining) - read_count += chunk_size - if not chunk_size: - if not read_count: - return SecurityConst.errSSLClosedGraceful - break - except (socket.error) as e: - error = e.errno - - if error is not None and error != errno.EAGAIN: - data_length_pointer[0] = read_count - if error == errno.ECONNRESET or error == errno.EPIPE: - return SecurityConst.errSSLClosedAbort - raise - - data_length_pointer[0] = read_count - - if read_count != requested_length: - return SecurityConst.errSSLWouldBlock - - return 0 - except Exception as e: - if wrapped_socket is not None: - wrapped_socket._exception = e - return SecurityConst.errSSLInternal - - -def _write_callback(connection_id, data_buffer, data_length_pointer): - """ - SecureTransport write callback. This is called by ST to request that data - actually be sent on the network. - """ - wrapped_socket = None - try: - wrapped_socket = _connection_refs.get(connection_id) - if wrapped_socket is None: - return SecurityConst.errSSLInternal - base_socket = wrapped_socket.socket - - bytes_to_write = data_length_pointer[0] - data = ctypes.string_at(data_buffer, bytes_to_write) - - timeout = wrapped_socket.gettimeout() - error = None - sent = 0 - - try: - while sent < bytes_to_write: - if timeout is None or timeout >= 0: - if not util.wait_for_write(base_socket, timeout): - raise socket.error(errno.EAGAIN, "timed out") - chunk_sent = base_socket.send(data) - sent += chunk_sent - - # This has some needless copying here, but I'm not sure there's - # much value in optimising this data path. - data = data[chunk_sent:] - except (socket.error) as e: - error = e.errno - - if error is not None and error != errno.EAGAIN: - data_length_pointer[0] = sent - if error == errno.ECONNRESET or error == errno.EPIPE: - return SecurityConst.errSSLClosedAbort - raise - - data_length_pointer[0] = sent - - if sent != bytes_to_write: - return SecurityConst.errSSLWouldBlock - - return 0 - except Exception as e: - if wrapped_socket is not None: - wrapped_socket._exception = e - return SecurityConst.errSSLInternal - - -# We need to keep these two objects references alive: if they get GC'd while -# in use then SecureTransport could attempt to call a function that is in freed -# memory. That would be...uh...bad. Yeah, that's the word. Bad. -_read_callback_pointer = Security.SSLReadFunc(_read_callback) -_write_callback_pointer = Security.SSLWriteFunc(_write_callback) - - -class WrappedSocket(object): - """ - API-compatibility wrapper for Python's OpenSSL wrapped socket object. - - Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage - collector of PyPy. - """ - - def __init__(self, socket): - self.socket = socket - self.context = None - self._makefile_refs = 0 - self._closed = False - self._exception = None - self._keychain = None - self._keychain_dir = None - self._client_cert_chain = None - - # We save off the previously-configured timeout and then set it to - # zero. This is done because we use select and friends to handle the - # timeouts, but if we leave the timeout set on the lower socket then - # Python will "kindly" call select on that socket again for us. Avoid - # that by forcing the timeout to zero. - self._timeout = self.socket.gettimeout() - self.socket.settimeout(0) - - @contextlib.contextmanager - def _raise_on_error(self): - """ - A context manager that can be used to wrap calls that do I/O from - SecureTransport. If any of the I/O callbacks hit an exception, this - context manager will correctly propagate the exception after the fact. - This avoids silently swallowing those exceptions. - - It also correctly forces the socket closed. - """ - self._exception = None - - # We explicitly don't catch around this yield because in the unlikely - # event that an exception was hit in the block we don't want to swallow - # it. - yield - if self._exception is not None: - exception, self._exception = self._exception, None - self.close() - raise exception - - def _set_ciphers(self): - """ - Sets up the allowed ciphers. By default this matches the set in - util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done - custom and doesn't allow changing at this time, mostly because parsing - OpenSSL cipher strings is going to be a freaking nightmare. - """ - ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES) - result = Security.SSLSetEnabledCiphers( - self.context, ciphers, len(CIPHER_SUITES) - ) - _assert_no_error(result) - - def _custom_validate(self, verify, trust_bundle): - """ - Called when we have set custom validation. We do this in two cases: - first, when cert validation is entirely disabled; and second, when - using a custom trust DB. - """ - # If we disabled cert validation, just say: cool. - if not verify: - return - - # We want data in memory, so load it up. - if os.path.isfile(trust_bundle): - with open(trust_bundle, "rb") as f: - trust_bundle = f.read() - - cert_array = None - trust = Security.SecTrustRef() - - try: - # Get a CFArray that contains the certs we want. - cert_array = _cert_array_from_pem(trust_bundle) - - # Ok, now the hard part. We want to get the SecTrustRef that ST has - # created for this connection, shove our CAs into it, tell ST to - # ignore everything else it knows, and then ask if it can build a - # chain. This is a buuuunch of code. - result = Security.SSLCopyPeerTrust(self.context, ctypes.byref(trust)) - _assert_no_error(result) - if not trust: - raise ssl.SSLError("Failed to copy trust reference") - - result = Security.SecTrustSetAnchorCertificates(trust, cert_array) - _assert_no_error(result) - - result = Security.SecTrustSetAnchorCertificatesOnly(trust, True) - _assert_no_error(result) - - trust_result = Security.SecTrustResultType() - result = Security.SecTrustEvaluate(trust, ctypes.byref(trust_result)) - _assert_no_error(result) - finally: - if trust: - CoreFoundation.CFRelease(trust) - - if cert_array is not None: - CoreFoundation.CFRelease(cert_array) - - # Ok, now we can look at what the result was. - successes = ( - SecurityConst.kSecTrustResultUnspecified, - SecurityConst.kSecTrustResultProceed, - ) - if trust_result.value not in successes: - raise ssl.SSLError( - "certificate verify failed, error code: %d" % trust_result.value - ) - - def handshake( - self, - server_hostname, - verify, - trust_bundle, - min_version, - max_version, - client_cert, - client_key, - client_key_passphrase, - ): - """ - Actually performs the TLS handshake. This is run automatically by - wrapped socket, and shouldn't be needed in user code. - """ - # First, we do the initial bits of connection setup. We need to create - # a context, set its I/O funcs, and set the connection reference. - self.context = Security.SSLCreateContext( - None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType - ) - result = Security.SSLSetIOFuncs( - self.context, _read_callback_pointer, _write_callback_pointer - ) - _assert_no_error(result) - - # Here we need to compute the handle to use. We do this by taking the - # id of self modulo 2**31 - 1. If this is already in the dictionary, we - # just keep incrementing by one until we find a free space. - with _connection_ref_lock: - handle = id(self) % 2147483647 - while handle in _connection_refs: - handle = (handle + 1) % 2147483647 - _connection_refs[handle] = self - - result = Security.SSLSetConnection(self.context, handle) - _assert_no_error(result) - - # If we have a server hostname, we should set that too. - if server_hostname: - if not isinstance(server_hostname, bytes): - server_hostname = server_hostname.encode("utf-8") - - result = Security.SSLSetPeerDomainName( - self.context, server_hostname, len(server_hostname) - ) - _assert_no_error(result) - - # Setup the ciphers. - self._set_ciphers() - - # Set the minimum and maximum TLS versions. - result = Security.SSLSetProtocolVersionMin(self.context, min_version) - _assert_no_error(result) - - result = Security.SSLSetProtocolVersionMax(self.context, max_version) - _assert_no_error(result) - - # If there's a trust DB, we need to use it. We do that by telling - # SecureTransport to break on server auth. We also do that if we don't - # want to validate the certs at all: we just won't actually do any - # authing in that case. - if not verify or trust_bundle is not None: - result = Security.SSLSetSessionOption( - self.context, SecurityConst.kSSLSessionOptionBreakOnServerAuth, True - ) - _assert_no_error(result) - - # If there's a client cert, we need to use it. - if client_cert: - self._keychain, self._keychain_dir = _temporary_keychain() - self._client_cert_chain = _load_client_cert_chain( - self._keychain, client_cert, client_key - ) - result = Security.SSLSetCertificate(self.context, self._client_cert_chain) - _assert_no_error(result) - - while True: - with self._raise_on_error(): - result = Security.SSLHandshake(self.context) - - if result == SecurityConst.errSSLWouldBlock: - raise socket.timeout("handshake timed out") - elif result == SecurityConst.errSSLServerAuthCompleted: - self._custom_validate(verify, trust_bundle) - continue - else: - _assert_no_error(result) - break - - def fileno(self): - return self.socket.fileno() - - # Copy-pasted from Python 3.5 source code - def _decref_socketios(self): - if self._makefile_refs > 0: - self._makefile_refs -= 1 - if self._closed: - self.close() - - def recv(self, bufsiz): - buffer = ctypes.create_string_buffer(bufsiz) - bytes_read = self.recv_into(buffer, bufsiz) - data = buffer[:bytes_read] - return data - - def recv_into(self, buffer, nbytes=None): - # Read short on EOF. - if self._closed: - return 0 - - if nbytes is None: - nbytes = len(buffer) - - buffer = (ctypes.c_char * nbytes).from_buffer(buffer) - processed_bytes = ctypes.c_size_t(0) - - with self._raise_on_error(): - result = Security.SSLRead( - self.context, buffer, nbytes, ctypes.byref(processed_bytes) - ) - - # There are some result codes that we want to treat as "not always - # errors". Specifically, those are errSSLWouldBlock, - # errSSLClosedGraceful, and errSSLClosedNoNotify. - if result == SecurityConst.errSSLWouldBlock: - # If we didn't process any bytes, then this was just a time out. - # However, we can get errSSLWouldBlock in situations when we *did* - # read some data, and in those cases we should just read "short" - # and return. - if processed_bytes.value == 0: - # Timed out, no data read. - raise socket.timeout("recv timed out") - elif result in ( - SecurityConst.errSSLClosedGraceful, - SecurityConst.errSSLClosedNoNotify, - ): - # The remote peer has closed this connection. We should do so as - # well. Note that we don't actually return here because in - # principle this could actually be fired along with return data. - # It's unlikely though. - self.close() - else: - _assert_no_error(result) - - # Ok, we read and probably succeeded. We should return whatever data - # was actually read. - return processed_bytes.value - - def settimeout(self, timeout): - self._timeout = timeout - - def gettimeout(self): - return self._timeout - - def send(self, data): - processed_bytes = ctypes.c_size_t(0) - - with self._raise_on_error(): - result = Security.SSLWrite( - self.context, data, len(data), ctypes.byref(processed_bytes) - ) - - if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: - # Timed out - raise socket.timeout("send timed out") - else: - _assert_no_error(result) - - # We sent, and probably succeeded. Tell them how much we sent. - return processed_bytes.value - - def sendall(self, data): - total_sent = 0 - while total_sent < len(data): - sent = self.send(data[total_sent : total_sent + SSL_WRITE_BLOCKSIZE]) - total_sent += sent - - def shutdown(self): - with self._raise_on_error(): - Security.SSLClose(self.context) - - def close(self): - # TODO: should I do clean shutdown here? Do I have to? - if self._makefile_refs < 1: - self._closed = True - if self.context: - CoreFoundation.CFRelease(self.context) - self.context = None - if self._client_cert_chain: - CoreFoundation.CFRelease(self._client_cert_chain) - self._client_cert_chain = None - if self._keychain: - Security.SecKeychainDelete(self._keychain) - CoreFoundation.CFRelease(self._keychain) - shutil.rmtree(self._keychain_dir) - self._keychain = self._keychain_dir = None - return self.socket.close() - else: - self._makefile_refs -= 1 - - def getpeercert(self, binary_form=False): - # Urgh, annoying. - # - # Here's how we do this: - # - # 1. Call SSLCopyPeerTrust to get hold of the trust object for this - # connection. - # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. - # 3. To get the CN, call SecCertificateCopyCommonName and process that - # string so that it's of the appropriate type. - # 4. To get the SAN, we need to do something a bit more complex: - # a. Call SecCertificateCopyValues to get the data, requesting - # kSecOIDSubjectAltName. - # b. Mess about with this dictionary to try to get the SANs out. - # - # This is gross. Really gross. It's going to be a few hundred LoC extra - # just to repeat something that SecureTransport can *already do*. So my - # operating assumption at this time is that what we want to do is - # instead to just flag to urllib3 that it shouldn't do its own hostname - # validation when using SecureTransport. - if not binary_form: - raise ValueError("SecureTransport only supports dumping binary certs") - trust = Security.SecTrustRef() - certdata = None - der_bytes = None - - try: - # Grab the trust store. - result = Security.SSLCopyPeerTrust(self.context, ctypes.byref(trust)) - _assert_no_error(result) - if not trust: - # Probably we haven't done the handshake yet. No biggie. - return None - - cert_count = Security.SecTrustGetCertificateCount(trust) - if not cert_count: - # Also a case that might happen if we haven't handshaked. - # Handshook? Handshaken? - return None - - leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) - assert leaf - - # Ok, now we want the DER bytes. - certdata = Security.SecCertificateCopyData(leaf) - assert certdata - - data_length = CoreFoundation.CFDataGetLength(certdata) - data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) - der_bytes = ctypes.string_at(data_buffer, data_length) - finally: - if certdata: - CoreFoundation.CFRelease(certdata) - if trust: - CoreFoundation.CFRelease(trust) - - return der_bytes - - def version(self): - protocol = Security.SSLProtocol() - result = Security.SSLGetNegotiatedProtocolVersion( - self.context, ctypes.byref(protocol) - ) - _assert_no_error(result) - if protocol.value == SecurityConst.kTLSProtocol13: - raise ssl.SSLError("SecureTransport does not support TLS 1.3") - elif protocol.value == SecurityConst.kTLSProtocol12: - return "TLSv1.2" - elif protocol.value == SecurityConst.kTLSProtocol11: - return "TLSv1.1" - elif protocol.value == SecurityConst.kTLSProtocol1: - return "TLSv1" - elif protocol.value == SecurityConst.kSSLProtocol3: - return "SSLv3" - elif protocol.value == SecurityConst.kSSLProtocol2: - return "SSLv2" - else: - raise ssl.SSLError("Unknown TLS version: %r" % protocol) - - def _reuse(self): - self._makefile_refs += 1 - - def _drop(self): - if self._makefile_refs < 1: - self.close() - else: - self._makefile_refs -= 1 - - -if _fileobject: # Platform-specific: Python 2 - - def makefile(self, mode, bufsize=-1): - self._makefile_refs += 1 - return _fileobject(self, mode, bufsize, close=True) - - -else: # Platform-specific: Python 3 - - def makefile(self, mode="r", buffering=None, *args, **kwargs): - # We disable buffering with SecureTransport because it conflicts with - # the buffering that ST does internally (see issue #1153 for more). - buffering = 0 - return backport_makefile(self, mode, buffering, *args, **kwargs) - - -WrappedSocket.makefile = makefile - - -class SecureTransportContext(object): - """ - I am a wrapper class for the SecureTransport library, to translate the - interface of the standard library ``SSLContext`` object to calls into - SecureTransport. - """ - - def __init__(self, protocol): - self._min_version, self._max_version = _protocol_to_min_max[protocol] - self._options = 0 - self._verify = False - self._trust_bundle = None - self._client_cert = None - self._client_key = None - self._client_key_passphrase = None - - @property - def check_hostname(self): - """ - SecureTransport cannot have its hostname checking disabled. For more, - see the comment on getpeercert() in this file. - """ - return True - - @check_hostname.setter - def check_hostname(self, value): - """ - SecureTransport cannot have its hostname checking disabled. For more, - see the comment on getpeercert() in this file. - """ - pass - - @property - def options(self): - # TODO: Well, crap. - # - # So this is the bit of the code that is the most likely to cause us - # trouble. Essentially we need to enumerate all of the SSL options that - # users might want to use and try to see if we can sensibly translate - # them, or whether we should just ignore them. - return self._options - - @options.setter - def options(self, value): - # TODO: Update in line with above. - self._options = value - - @property - def verify_mode(self): - return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE - - @verify_mode.setter - def verify_mode(self, value): - self._verify = True if value == ssl.CERT_REQUIRED else False - - def set_default_verify_paths(self): - # So, this has to do something a bit weird. Specifically, what it does - # is nothing. - # - # This means that, if we had previously had load_verify_locations - # called, this does not undo that. We need to do that because it turns - # out that the rest of the urllib3 code will attempt to load the - # default verify paths if it hasn't been told about any paths, even if - # the context itself was sometime earlier. We resolve that by just - # ignoring it. - pass - - def load_default_certs(self): - return self.set_default_verify_paths() - - def set_ciphers(self, ciphers): - # For now, we just require the default cipher string. - if ciphers != util.ssl_.DEFAULT_CIPHERS: - raise ValueError("SecureTransport doesn't support custom cipher strings") - - def load_verify_locations(self, cafile=None, capath=None, cadata=None): - # OK, we only really support cadata and cafile. - if capath is not None: - raise ValueError("SecureTransport does not support cert directories") - - self._trust_bundle = cafile or cadata - - def load_cert_chain(self, certfile, keyfile=None, password=None): - self._client_cert = certfile - self._client_key = keyfile - self._client_cert_passphrase = password - - def wrap_socket( - self, - sock, - server_side=False, - do_handshake_on_connect=True, - suppress_ragged_eofs=True, - server_hostname=None, - ): - # So, what do we do here? Firstly, we assert some properties. This is a - # stripped down shim, so there is some functionality we don't support. - # See PEP 543 for the real deal. - assert not server_side - assert do_handshake_on_connect - assert suppress_ragged_eofs - - # Ok, we're good to go. Now we want to create the wrapped socket object - # and store it in the appropriate place. - wrapped_socket = WrappedSocket(sock) - - # Now we can handshake - wrapped_socket.handshake( - server_hostname, - self._verify, - self._trust_bundle, - self._min_version, - self._max_version, - self._client_cert, - self._client_key, - self._client_key_passphrase, - ) - return wrapped_socket diff --git a/venv/lib/python3.8/site-packages/urllib3/contrib/socks.py b/venv/lib/python3.8/site-packages/urllib3/contrib/socks.py deleted file mode 100644 index 9e97f7a..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/contrib/socks.py +++ /dev/null @@ -1,210 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module contains provisional support for SOCKS proxies from within -urllib3. This module supports SOCKS4, SOCKS4A (an extension of SOCKS4), and -SOCKS5. To enable its functionality, either install PySocks or install this -module with the ``socks`` extra. - -The SOCKS implementation supports the full range of urllib3 features. It also -supports the following SOCKS features: - -- SOCKS4A (``proxy_url='socks4a://...``) -- SOCKS4 (``proxy_url='socks4://...``) -- SOCKS5 with remote DNS (``proxy_url='socks5h://...``) -- SOCKS5 with local DNS (``proxy_url='socks5://...``) -- Usernames and passwords for the SOCKS proxy - - .. note:: - It is recommended to use ``socks5h://`` or ``socks4a://`` schemes in - your ``proxy_url`` to ensure that DNS resolution is done from the remote - server instead of client-side when connecting to a domain name. - -SOCKS4 supports IPv4 and domain names with the SOCKS4A extension. SOCKS5 -supports IPv4, IPv6, and domain names. - -When connecting to a SOCKS4 proxy the ``username`` portion of the ``proxy_url`` -will be sent as the ``userid`` section of the SOCKS request:: - - proxy_url="socks4a://<userid>@proxy-host" - -When connecting to a SOCKS5 proxy the ``username`` and ``password`` portion -of the ``proxy_url`` will be sent as the username/password to authenticate -with the proxy:: - - proxy_url="socks5h://<username>:<password>@proxy-host" - -""" -from __future__ import absolute_import - -try: - import socks -except ImportError: - import warnings - from ..exceptions import DependencyWarning - - warnings.warn( - ( - "SOCKS support in urllib3 requires the installation of optional " - "dependencies: specifically, PySocks. For more information, see " - "https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies" - ), - DependencyWarning, - ) - raise - -from socket import error as SocketError, timeout as SocketTimeout - -from ..connection import HTTPConnection, HTTPSConnection -from ..connectionpool import HTTPConnectionPool, HTTPSConnectionPool -from ..exceptions import ConnectTimeoutError, NewConnectionError -from ..poolmanager import PoolManager -from ..util.url import parse_url - -try: - import ssl -except ImportError: - ssl = None - - -class SOCKSConnection(HTTPConnection): - """ - A plain-text HTTP connection that connects via a SOCKS proxy. - """ - - def __init__(self, *args, **kwargs): - self._socks_options = kwargs.pop("_socks_options") - super(SOCKSConnection, self).__init__(*args, **kwargs) - - def _new_conn(self): - """ - Establish a new connection via the SOCKS proxy. - """ - extra_kw = {} - if self.source_address: - extra_kw["source_address"] = self.source_address - - if self.socket_options: - extra_kw["socket_options"] = self.socket_options - - try: - conn = socks.create_connection( - (self.host, self.port), - proxy_type=self._socks_options["socks_version"], - proxy_addr=self._socks_options["proxy_host"], - proxy_port=self._socks_options["proxy_port"], - proxy_username=self._socks_options["username"], - proxy_password=self._socks_options["password"], - proxy_rdns=self._socks_options["rdns"], - timeout=self.timeout, - **extra_kw - ) - - except SocketTimeout: - raise ConnectTimeoutError( - self, - "Connection to %s timed out. (connect timeout=%s)" - % (self.host, self.timeout), - ) - - except socks.ProxyError as e: - # This is fragile as hell, but it seems to be the only way to raise - # useful errors here. - if e.socket_err: - error = e.socket_err - if isinstance(error, SocketTimeout): - raise ConnectTimeoutError( - self, - "Connection to %s timed out. (connect timeout=%s)" - % (self.host, self.timeout), - ) - else: - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % error - ) - else: - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % e - ) - - except SocketError as e: # Defensive: PySocks should catch all these. - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % e - ) - - return conn - - -# We don't need to duplicate the Verified/Unverified distinction from -# urllib3/connection.py here because the HTTPSConnection will already have been -# correctly set to either the Verified or Unverified form by that module. This -# means the SOCKSHTTPSConnection will automatically be the correct type. -class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): - pass - - -class SOCKSHTTPConnectionPool(HTTPConnectionPool): - ConnectionCls = SOCKSConnection - - -class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): - ConnectionCls = SOCKSHTTPSConnection - - -class SOCKSProxyManager(PoolManager): - """ - A version of the urllib3 ProxyManager that routes connections via the - defined SOCKS proxy. - """ - - pool_classes_by_scheme = { - "http": SOCKSHTTPConnectionPool, - "https": SOCKSHTTPSConnectionPool, - } - - def __init__( - self, - proxy_url, - username=None, - password=None, - num_pools=10, - headers=None, - **connection_pool_kw - ): - parsed = parse_url(proxy_url) - - if username is None and password is None and parsed.auth is not None: - split = parsed.auth.split(":") - if len(split) == 2: - username, password = split - if parsed.scheme == "socks5": - socks_version = socks.PROXY_TYPE_SOCKS5 - rdns = False - elif parsed.scheme == "socks5h": - socks_version = socks.PROXY_TYPE_SOCKS5 - rdns = True - elif parsed.scheme == "socks4": - socks_version = socks.PROXY_TYPE_SOCKS4 - rdns = False - elif parsed.scheme == "socks4a": - socks_version = socks.PROXY_TYPE_SOCKS4 - rdns = True - else: - raise ValueError("Unable to determine SOCKS version from %s" % proxy_url) - - self.proxy_url = proxy_url - - socks_options = { - "socks_version": socks_version, - "proxy_host": parsed.host, - "proxy_port": parsed.port, - "username": username, - "password": password, - "rdns": rdns, - } - connection_pool_kw["_socks_options"] = socks_options - - super(SOCKSProxyManager, self).__init__( - num_pools, headers, **connection_pool_kw - ) - - self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/venv/lib/python3.8/site-packages/urllib3/exceptions.py b/venv/lib/python3.8/site-packages/urllib3/exceptions.py deleted file mode 100644 index 0a74c79..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/exceptions.py +++ /dev/null @@ -1,255 +0,0 @@ -from __future__ import absolute_import -from .packages.six.moves.http_client import IncompleteRead as httplib_IncompleteRead - -# Base Exceptions - - -class HTTPError(Exception): - "Base exception used by this module." - pass - - -class HTTPWarning(Warning): - "Base warning used by this module." - pass - - -class PoolError(HTTPError): - "Base exception for errors caused within a pool." - - def __init__(self, pool, message): - self.pool = pool - HTTPError.__init__(self, "%s: %s" % (pool, message)) - - def __reduce__(self): - # For pickling purposes. - return self.__class__, (None, None) - - -class RequestError(PoolError): - "Base exception for PoolErrors that have associated URLs." - - def __init__(self, pool, url, message): - self.url = url - PoolError.__init__(self, pool, message) - - def __reduce__(self): - # For pickling purposes. - return self.__class__, (None, self.url, None) - - -class SSLError(HTTPError): - "Raised when SSL certificate fails in an HTTPS connection." - pass - - -class ProxyError(HTTPError): - "Raised when the connection to a proxy fails." - pass - - -class DecodeError(HTTPError): - "Raised when automatic decoding based on Content-Type fails." - pass - - -class ProtocolError(HTTPError): - "Raised when something unexpected happens mid-request/response." - pass - - -#: Renamed to ProtocolError but aliased for backwards compatibility. -ConnectionError = ProtocolError - - -# Leaf Exceptions - - -class MaxRetryError(RequestError): - """Raised when the maximum number of retries is exceeded. - - :param pool: The connection pool - :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` - :param string url: The requested Url - :param exceptions.Exception reason: The underlying error - - """ - - def __init__(self, pool, url, reason=None): - self.reason = reason - - message = "Max retries exceeded with url: %s (Caused by %r)" % (url, reason) - - RequestError.__init__(self, pool, url, message) - - -class HostChangedError(RequestError): - "Raised when an existing pool gets a request for a foreign host." - - def __init__(self, pool, url, retries=3): - message = "Tried to open a foreign host with url: %s" % url - RequestError.__init__(self, pool, url, message) - self.retries = retries - - -class TimeoutStateError(HTTPError): - """ Raised when passing an invalid state to a timeout """ - - pass - - -class TimeoutError(HTTPError): - """ Raised when a socket timeout error occurs. - - Catching this error will catch both :exc:`ReadTimeoutErrors - <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`. - """ - - pass - - -class ReadTimeoutError(TimeoutError, RequestError): - "Raised when a socket timeout occurs while receiving data from a server" - pass - - -# This timeout error does not have a URL attached and needs to inherit from the -# base HTTPError -class ConnectTimeoutError(TimeoutError): - "Raised when a socket timeout occurs while connecting to a server" - pass - - -class NewConnectionError(ConnectTimeoutError, PoolError): - "Raised when we fail to establish a new connection. Usually ECONNREFUSED." - pass - - -class EmptyPoolError(PoolError): - "Raised when a pool runs out of connections and no more are allowed." - pass - - -class ClosedPoolError(PoolError): - "Raised when a request enters a pool after the pool has been closed." - pass - - -class LocationValueError(ValueError, HTTPError): - "Raised when there is something wrong with a given URL input." - pass - - -class LocationParseError(LocationValueError): - "Raised when get_host or similar fails to parse the URL input." - - def __init__(self, location): - message = "Failed to parse: %s" % location - HTTPError.__init__(self, message) - - self.location = location - - -class ResponseError(HTTPError): - "Used as a container for an error reason supplied in a MaxRetryError." - GENERIC_ERROR = "too many error responses" - SPECIFIC_ERROR = "too many {status_code} error responses" - - -class SecurityWarning(HTTPWarning): - "Warned when performing security reducing actions" - pass - - -class SubjectAltNameWarning(SecurityWarning): - "Warned when connecting to a host with a certificate missing a SAN." - pass - - -class InsecureRequestWarning(SecurityWarning): - "Warned when making an unverified HTTPS request." - pass - - -class SystemTimeWarning(SecurityWarning): - "Warned when system time is suspected to be wrong" - pass - - -class InsecurePlatformWarning(SecurityWarning): - "Warned when certain SSL configuration is not available on a platform." - pass - - -class SNIMissingWarning(HTTPWarning): - "Warned when making a HTTPS request without SNI available." - pass - - -class DependencyWarning(HTTPWarning): - """ - Warned when an attempt is made to import a module with missing optional - dependencies. - """ - - pass - - -class ResponseNotChunked(ProtocolError, ValueError): - "Response needs to be chunked in order to read it as chunks." - pass - - -class BodyNotHttplibCompatible(HTTPError): - """ - Body should be httplib.HTTPResponse like (have an fp attribute which - returns raw chunks) for read_chunked(). - """ - - pass - - -class IncompleteRead(HTTPError, httplib_IncompleteRead): - """ - Response length doesn't match expected Content-Length - - Subclass of http_client.IncompleteRead to allow int value - for `partial` to avoid creating large objects on streamed - reads. - """ - - def __init__(self, partial, expected): - super(IncompleteRead, self).__init__(partial, expected) - - def __repr__(self): - return "IncompleteRead(%i bytes read, %i more expected)" % ( - self.partial, - self.expected, - ) - - -class InvalidHeader(HTTPError): - "The header provided was somehow invalid." - pass - - -class ProxySchemeUnknown(AssertionError, ValueError): - "ProxyManager does not support the supplied scheme" - # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. - - def __init__(self, scheme): - message = "Not supported proxy scheme %s" % scheme - super(ProxySchemeUnknown, self).__init__(message) - - -class HeaderParsingError(HTTPError): - "Raised by assert_header_parsing, but we convert it to a log.warning statement." - - def __init__(self, defects, unparsed_data): - message = "%s, unparsed data: %r" % (defects or "Unknown", unparsed_data) - super(HeaderParsingError, self).__init__(message) - - -class UnrewindableBodyError(HTTPError): - "urllib3 encountered an error when trying to rewind a body" - pass diff --git a/venv/lib/python3.8/site-packages/urllib3/fields.py b/venv/lib/python3.8/site-packages/urllib3/fields.py deleted file mode 100644 index 8715b22..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/fields.py +++ /dev/null @@ -1,273 +0,0 @@ -from __future__ import absolute_import -import email.utils -import mimetypes -import re - -from .packages import six - - -def guess_content_type(filename, default="application/octet-stream"): - """ - Guess the "Content-Type" of a file. - - :param filename: - The filename to guess the "Content-Type" of using :mod:`mimetypes`. - :param default: - If no "Content-Type" can be guessed, default to `default`. - """ - if filename: - return mimetypes.guess_type(filename)[0] or default - return default - - -def format_header_param_rfc2231(name, value): - """ - Helper function to format and quote a single header parameter using the - strategy defined in RFC 2231. - - Particularly useful for header parameters which might contain - non-ASCII values, like file names. This follows RFC 2388 Section 4.4. - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as ``bytes`` or `str``. - :ret: - An RFC-2231-formatted unicode string. - """ - if isinstance(value, six.binary_type): - value = value.decode("utf-8") - - if not any(ch in value for ch in '"\\\r\n'): - result = u'%s="%s"' % (name, value) - try: - result.encode("ascii") - except (UnicodeEncodeError, UnicodeDecodeError): - pass - else: - return result - - if six.PY2: # Python 2: - value = value.encode("utf-8") - - # encode_rfc2231 accepts an encoded string and returns an ascii-encoded - # string in Python 2 but accepts and returns unicode strings in Python 3 - value = email.utils.encode_rfc2231(value, "utf-8") - value = "%s*=%s" % (name, value) - - if six.PY2: # Python 2: - value = value.decode("utf-8") - - return value - - -_HTML5_REPLACEMENTS = { - u"\u0022": u"%22", - # Replace "\" with "\\". - u"\u005C": u"\u005C\u005C", - u"\u005C": u"\u005C\u005C", -} - -# All control characters from 0x00 to 0x1F *except* 0x1B. -_HTML5_REPLACEMENTS.update( - { - six.unichr(cc): u"%{:02X}".format(cc) - for cc in range(0x00, 0x1F + 1) - if cc not in (0x1B,) - } -) - - -def _replace_multiple(value, needles_and_replacements): - def replacer(match): - return needles_and_replacements[match.group(0)] - - pattern = re.compile( - r"|".join([re.escape(needle) for needle in needles_and_replacements.keys()]) - ) - - result = pattern.sub(replacer, value) - - return result - - -def format_header_param_html5(name, value): - """ - Helper function to format and quote a single header parameter using the - HTML5 strategy. - - Particularly useful for header parameters which might contain - non-ASCII values, like file names. This follows the `HTML5 Working Draft - Section 4.10.22.7`_ and matches the behavior of curl and modern browsers. - - .. _HTML5 Working Draft Section 4.10.22.7: - https://w3c.github.io/html/sec-forms.html#multipart-form-data - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as ``bytes`` or `str``. - :ret: - A unicode string, stripped of troublesome characters. - """ - if isinstance(value, six.binary_type): - value = value.decode("utf-8") - - value = _replace_multiple(value, _HTML5_REPLACEMENTS) - - return u'%s="%s"' % (name, value) - - -# For backwards-compatibility. -format_header_param = format_header_param_html5 - - -class RequestField(object): - """ - A data container for request body parameters. - - :param name: - The name of this request field. Must be unicode. - :param data: - The data/value body. - :param filename: - An optional filename of the request field. Must be unicode. - :param headers: - An optional dict-like object of headers to initially use for the field. - :param header_formatter: - An optional callable that is used to encode and format the headers. By - default, this is :func:`format_header_param_html5`. - """ - - def __init__( - self, - name, - data, - filename=None, - headers=None, - header_formatter=format_header_param_html5, - ): - self._name = name - self._filename = filename - self.data = data - self.headers = {} - if headers: - self.headers = dict(headers) - self.header_formatter = header_formatter - - @classmethod - def from_tuples(cls, fieldname, value, header_formatter=format_header_param_html5): - """ - A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. - - Supports constructing :class:`~urllib3.fields.RequestField` from - parameter of key/value strings AND key/filetuple. A filetuple is a - (filename, data, MIME type) tuple where the MIME type is optional. - For example:: - - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - - Field names and filenames must be unicode. - """ - if isinstance(value, tuple): - if len(value) == 3: - filename, data, content_type = value - else: - filename, data = value - content_type = guess_content_type(filename) - else: - filename = None - content_type = None - data = value - - request_param = cls( - fieldname, data, filename=filename, header_formatter=header_formatter - ) - request_param.make_multipart(content_type=content_type) - - return request_param - - def _render_part(self, name, value): - """ - Overridable helper function to format a single header parameter. By - default, this calls ``self.header_formatter``. - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as a unicode string. - """ - - return self.header_formatter(name, value) - - def _render_parts(self, header_parts): - """ - Helper function to format and quote a single header. - - Useful for single headers that are composed of multiple items. E.g., - 'Content-Disposition' fields. - - :param header_parts: - A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format - as `k1="v1"; k2="v2"; ...`. - """ - parts = [] - iterable = header_parts - if isinstance(header_parts, dict): - iterable = header_parts.items() - - for name, value in iterable: - if value is not None: - parts.append(self._render_part(name, value)) - - return u"; ".join(parts) - - def render_headers(self): - """ - Renders the headers for this request field. - """ - lines = [] - - sort_keys = ["Content-Disposition", "Content-Type", "Content-Location"] - for sort_key in sort_keys: - if self.headers.get(sort_key, False): - lines.append(u"%s: %s" % (sort_key, self.headers[sort_key])) - - for header_name, header_value in self.headers.items(): - if header_name not in sort_keys: - if header_value: - lines.append(u"%s: %s" % (header_name, header_value)) - - lines.append(u"\r\n") - return u"\r\n".join(lines) - - def make_multipart( - self, content_disposition=None, content_type=None, content_location=None - ): - """ - Makes this request field into a multipart request field. - - This method overrides "Content-Disposition", "Content-Type" and - "Content-Location" headers to the request parameter. - - :param content_type: - The 'Content-Type' of the request body. - :param content_location: - The 'Content-Location' of the request body. - - """ - self.headers["Content-Disposition"] = content_disposition or u"form-data" - self.headers["Content-Disposition"] += u"; ".join( - [ - u"", - self._render_parts( - ((u"name", self._name), (u"filename", self._filename)) - ), - ] - ) - self.headers["Content-Type"] = content_type - self.headers["Content-Location"] = content_location diff --git a/venv/lib/python3.8/site-packages/urllib3/filepost.py b/venv/lib/python3.8/site-packages/urllib3/filepost.py deleted file mode 100644 index b7b0099..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/filepost.py +++ /dev/null @@ -1,98 +0,0 @@ -from __future__ import absolute_import -import binascii -import codecs -import os - -from io import BytesIO - -from .packages import six -from .packages.six import b -from .fields import RequestField - -writer = codecs.lookup("utf-8")[3] - - -def choose_boundary(): - """ - Our embarrassingly-simple replacement for mimetools.choose_boundary. - """ - boundary = binascii.hexlify(os.urandom(16)) - if not six.PY2: - boundary = boundary.decode("ascii") - return boundary - - -def iter_field_objects(fields): - """ - Iterate over fields. - - Supports list of (k, v) tuples and dicts, and lists of - :class:`~urllib3.fields.RequestField`. - - """ - if isinstance(fields, dict): - i = six.iteritems(fields) - else: - i = iter(fields) - - for field in i: - if isinstance(field, RequestField): - yield field - else: - yield RequestField.from_tuples(*field) - - -def iter_fields(fields): - """ - .. deprecated:: 1.6 - - Iterate over fields. - - The addition of :class:`~urllib3.fields.RequestField` makes this function - obsolete. Instead, use :func:`iter_field_objects`, which returns - :class:`~urllib3.fields.RequestField` objects. - - Supports list of (k, v) tuples and dicts. - """ - if isinstance(fields, dict): - return ((k, v) for k, v in six.iteritems(fields)) - - return ((k, v) for k, v in fields) - - -def encode_multipart_formdata(fields, boundary=None): - """ - Encode a dictionary of ``fields`` using the multipart/form-data MIME format. - - :param fields: - Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). - - :param boundary: - If not specified, then a random boundary will be generated using - :func:`urllib3.filepost.choose_boundary`. - """ - body = BytesIO() - if boundary is None: - boundary = choose_boundary() - - for field in iter_field_objects(fields): - body.write(b("--%s\r\n" % (boundary))) - - writer(body).write(field.render_headers()) - data = field.data - - if isinstance(data, int): - data = str(data) # Backwards compatibility - - if isinstance(data, six.text_type): - writer(body).write(data) - else: - body.write(data) - - body.write(b"\r\n") - - body.write(b("--%s--\r\n" % (boundary))) - - content_type = str("multipart/form-data; boundary=%s" % boundary) - - return body.getvalue(), content_type diff --git a/venv/lib/python3.8/site-packages/urllib3/packages/__init__.py b/venv/lib/python3.8/site-packages/urllib3/packages/__init__.py deleted file mode 100644 index fce4caa..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/packages/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import absolute_import - -from . import ssl_match_hostname - -__all__ = ("ssl_match_hostname",) diff --git a/venv/lib/python3.8/site-packages/urllib3/packages/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/packages/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 6e5ad3a0ed6e05eb0f20da0d61dda04deae544a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 266 zcmYjLF=_)b5R`OhVvJ27FGzcZqr$id#3nCr6VhCfMYiNvcy%YFmBCMPo^)+0e<4+* z1VRROW@mR{_H{O!u#AtDe8a4t#r%iJ<~diq&!m~=$Q*AuXIkhAg{#^s_f=c#`h_*4 zYrbL)A8yq)_L#_kb-oXD<-ha07!jPJ-2o1Lq)s`rX-2~YV4o-j0}x8$z(QT*20$SK zTv!-q|3hDENzO}e{oHnu@_xQQosW;SG%^K5yIuULSG%KnH&FuE&Jw_bKM&(4*Xx94 MU4DusXDX)R8`RW9!2kdN diff --git a/venv/lib/python3.8/site-packages/urllib3/packages/__pycache__/six.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/packages/__pycache__/six.cpython-38.pyc deleted file mode 100644 index 24db799b889e5f4a0ea56c14585a70347ec6b0e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26478 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 V8icV-=qiJ0@DIlxMsG=4{}1#T>ZJex diff --git a/venv/lib/python3.8/site-packages/urllib3/packages/backports/__init__.py b/venv/lib/python3.8/site-packages/urllib3/packages/backports/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.8/site-packages/urllib3/packages/backports/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/packages/backports/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 907a1dd6ca2bed1b79aea2a5c54461d55a0e2a38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmWIL<>g`kf>pNqaUl9Jh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6v5za+OnzaX<f zH#4ueBrzvPH?6EP+p@$oRll?-Cnqz>7)}=?CTAz6rxxoc0T~7PMJ2`h@$s2?nI-Y@ XdIgoYIBatBQ%ZAE?Lans24V&P=tC#g diff --git a/venv/lib/python3.8/site-packages/urllib3/packages/backports/__pycache__/makefile.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/packages/backports/__pycache__/makefile.cpython-38.pyc deleted file mode 100644 index 19df104e21694663a535d49a47f949b5c569ed32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1267 zcmZuw&2Aev5GJ{+-PP&`Zc_9bCP0k}NTfp&1PziRQDdV93MYu-8qgu@mB@|PTJ0`K zDyj@BhdQS`K`#ZGV~Za87<mRB+mm0QhhEa*$`TATLvT3raX7=7ArD%u5CQ%Eu=ny^ z4WYlSa+v@_k6_AeU<?fr!;EBjh+%ayGIfRyM$Bh5=Do#3myrSL1gF1*qj)?i3!!9p z8c%qVW;}fJKMKSC+Kj4WPM<B*ago#8^yo+y;|W)r!$(JS%3+hyq!4r_Ii08Kn8rDr zNb^^4I#%I4&XuI9pku*f#c51$BoO=tT{)x0=!B0|H#~<_(0&J-U{FQbdup&4dltQ* z7OYnP7N*?72q~oTna!Cn=h&HG2!olcae}`<XZR<;HJ*4&k72u(ceK|;OJDo4uRYmU z1T37&B4D*;UHf9F>kQvRAbTPKnOIpl8tM8OS%w<9=)`5-Jw#CCYQp?UAl|WHNkFbo zkoZ~EPP_|^h(C28|9~5X_AWXcAc*h*JbzHNUws|IAn%=JBi{zx02WjT0pxSI-(U8A zfY#Tj4#YpYF+hNYx}hEI>e_pE+0<A!qlRumj~l1=LkhHRAT5$lb}bRbbko=F-EMVA zI8axE=LU~Xx6}M}oTZFT3&!b}f__!x*@B9jbbgbLXq;umoU@KW=g<bUfBq3jSn>4w zEFaC1gbU87RM7INq|=#Hbj0Z>&113XG>s#<GT{$#Hsd=&6vDJ0OUZ>wi@eeW0awFz zw0@<L;E6OOEzH#?JG+k$zJC$*4|aEVo=1bd;f`tdFCsoad={tRZKLy;@k{!lNEPU< z7yL)H_w-Q2WeKWllkBvND|wcPE4B*tRSxioO~CVU!K~zQdsk`voX@i~=f<CdKfB{Y zo-318iU7oO>(w|Q7;ojxxC-L_hQu`p@$Yv%H7$E(THZ=?si2~_lGlsL*Xl0s%|w=^ zquZOcg#Q@7;<C5-zrA&3y5+)rwuU$LYC{0|2pICN;5H6mHi5e^EDvy4p;q!P5G!xN zUYi79Yc026Ph1Bdom%xY_JKMz<3|xI#!)1iuw}f}FRmI^8CS_&V$@m%51<&cjDKVM QDz|{Sen6To2rK&dA3q0cZU6uP diff --git a/venv/lib/python3.8/site-packages/urllib3/packages/backports/makefile.py b/venv/lib/python3.8/site-packages/urllib3/packages/backports/makefile.py deleted file mode 100644 index a3156a6..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/packages/backports/makefile.py +++ /dev/null @@ -1,52 +0,0 @@ -# -*- coding: utf-8 -*- -""" -backports.makefile -~~~~~~~~~~~~~~~~~~ - -Backports the Python 3 ``socket.makefile`` method for use with anything that -wants to create a "fake" socket object. -""" -import io - -from socket import SocketIO - - -def backport_makefile( - self, mode="r", buffering=None, encoding=None, errors=None, newline=None -): - """ - Backport of ``socket.makefile`` from Python 3.5. - """ - if not set(mode) <= {"r", "w", "b"}: - raise ValueError("invalid mode %r (only r, w, b allowed)" % (mode,)) - writing = "w" in mode - reading = "r" in mode or not writing - assert reading or writing - binary = "b" in mode - rawmode = "" - if reading: - rawmode += "r" - if writing: - rawmode += "w" - raw = SocketIO(self, rawmode) - self._makefile_refs += 1 - if buffering is None: - buffering = -1 - if buffering < 0: - buffering = io.DEFAULT_BUFFER_SIZE - if buffering == 0: - if not binary: - raise ValueError("unbuffered streams must be binary") - return raw - if reading and writing: - buffer = io.BufferedRWPair(raw, raw, buffering) - elif reading: - buffer = io.BufferedReader(raw, buffering) - else: - assert writing - buffer = io.BufferedWriter(raw, buffering) - if binary: - return buffer - text = io.TextIOWrapper(buffer, encoding, errors, newline) - text.mode = mode - return text diff --git a/venv/lib/python3.8/site-packages/urllib3/packages/six.py b/venv/lib/python3.8/site-packages/urllib3/packages/six.py deleted file mode 100644 index 3144240..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/packages/six.py +++ /dev/null @@ -1,1021 +0,0 @@ -# Copyright (c) 2010-2019 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.12.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 - - -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 __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 - - -_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("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_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" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" -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" -_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) - - -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, 2): - exec_( - """def raise_from(value, from_value): - try: - if from_value is None: - raise value - raise value from from_value - finally: - value = None -""" - ) -elif sys.version_info[:2] > (3, 2): - 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): - - def wraps( - wrapped, - assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES, - ): - def wrapper(f): - f = functools.wraps(wrapped, assigned, updated)(f) - f.__wrapped__ = wrapped - return f - - return wrapper - - -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): - return meta(name, 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, text_type): - return s.encode(encoding, errors) - elif isinstance(s, binary_type): - return s - else: - 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` - """ - if not isinstance(s, (text_type, binary_type)): - raise TypeError("not expecting type '%s'" % type(s)) - if PY2 and isinstance(s, text_type): - s = s.encode(encoding, errors) - elif PY3 and isinstance(s, binary_type): - s = s.decode(encoding, errors) - 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 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/venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__init__.py b/venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__init__.py deleted file mode 100644 index 75b6bb1..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -import sys - -try: - # Our match_hostname function is the same as 3.5's, so we only want to - # import the match_hostname function if it's at least that good. - if sys.version_info < (3, 5): - raise ImportError("Fallback to vendored code") - - from ssl import CertificateError, match_hostname -except ImportError: - try: - # Backport of the function from a pypi module - from backports.ssl_match_hostname import CertificateError, match_hostname - except ImportError: - # Our vendored copy - from ._implementation import CertificateError, match_hostname - -# Not needed, but documenting what we provide. -__all__ = ("CertificateError", "match_hostname") diff --git a/venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index b0a50ac50cca534740ad4290e42a080c4a7e8945..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 507 zcmZWkO-lnY5S?VVTI=Vb7omq9MCd{HARYu2K@_|QBBJiWux(O}O*TuC7Fs+h_+Rwo z@7b%T{sm7?tf<8adBgBt-kV%3F4h3+buYPjqX6$=_*?Th9N=}&2pl+3kiuwPz&+u# z2eu(7kDkaQK`vI2j?-9I(h7k~$WLPsv{$na1i~5Bzce#bnze7uV4~p_bea8CTtiN; zV1hhOtDKxeYi5kQz-fz)Bkbb}!f5q4Q>vYHdQESd1CeuM1#fl?7cE+@9181YS9UTl zj;uAdT+*5E+_5|3e4c4BCg{<cD<d~_<-$N%Cr!>|-Zka?i7t%wlV_20%EqX*AvA4- zz`(jqB-pfPy3C|5l+YsgnMc2JmN8tCu@|rl!6U%OS>kn(6tdWmx%0?xbO*!Uj^7qZ z-zp{BTR*+PwCq;6<bPPga9ima+bo7<bypkSS7JZ>%GD97ltwjDrFF7IXh7PCJ^`E7 Bho1ld diff --git a/venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-38.pyc deleted file mode 100644 index 6ac28ae49f551088fb6eabcca85bce6b1b3a7e8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3264 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 diff --git a/venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/_implementation.py b/venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/_implementation.py deleted file mode 100644 index 689208d..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/_implementation.py +++ /dev/null @@ -1,160 +0,0 @@ -"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" - -# Note: This file is under the PSF license as the code comes from the python -# stdlib. http://docs.python.org/3/license.html - -import re -import sys - -# ipaddress has been backported to 2.6+ in pypi. If it is installed on the -# system, use it to handle IPAddress ServerAltnames (this was added in -# python-3.5) otherwise only do DNS matching. This allows -# backports.ssl_match_hostname to continue to be used in Python 2.7. -try: - import ipaddress -except ImportError: - ipaddress = None - -__version__ = "3.5.0.1" - - -class CertificateError(ValueError): - pass - - -def _dnsname_match(dn, hostname, max_wildcards=1): - """Matching according to RFC 6125, section 6.4.3 - - http://tools.ietf.org/html/rfc6125#section-6.4.3 - """ - pats = [] - if not dn: - return False - - # Ported from python3-syntax: - # leftmost, *remainder = dn.split(r'.') - parts = dn.split(r".") - leftmost = parts[0] - remainder = parts[1:] - - wildcards = leftmost.count("*") - if wildcards > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survey of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn) - ) - - # speed up common case w/o wildcards - if not wildcards: - return dn.lower() == hostname.lower() - - # RFC 6125, section 6.4.3, subitem 1. - # The client SHOULD NOT attempt to match a presented identifier in which - # the wildcard character comprises a label other than the left-most label. - if leftmost == "*": - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append("[^.]+") - elif leftmost.startswith("xn--") or hostname.startswith("xn--"): - # RFC 6125, section 6.4.3, subitem 3. - # The client SHOULD NOT attempt to match a presented identifier - # where the wildcard character is embedded within an A-label or - # U-label of an internationalized domain name. - pats.append(re.escape(leftmost)) - else: - # Otherwise, '*' matches any dotless string, e.g. www* - pats.append(re.escape(leftmost).replace(r"\*", "[^.]*")) - - # add the remaining fragments, ignore any wildcards - for frag in remainder: - pats.append(re.escape(frag)) - - pat = re.compile(r"\A" + r"\.".join(pats) + r"\Z", re.IGNORECASE) - return pat.match(hostname) - - -def _to_unicode(obj): - if isinstance(obj, str) and sys.version_info < (3,): - obj = unicode(obj, encoding="ascii", errors="strict") - return obj - - -def _ipaddress_match(ipname, host_ip): - """Exact matching of IP addresses. - - RFC 6125 explicitly doesn't define an algorithm for this - (section 1.7.2 - "Out of Scope"). - """ - # OpenSSL may add a trailing newline to a subjectAltName's IP address - # Divergence from upstream: ipaddress can't handle byte str - ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) - return ip == host_ip - - -def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 - rules are followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError( - "empty or no certificate, match_hostname needs a " - "SSL socket or SSL context with either " - "CERT_OPTIONAL or CERT_REQUIRED" - ) - try: - # Divergence from upstream: ipaddress can't handle byte str - host_ip = ipaddress.ip_address(_to_unicode(hostname)) - except ValueError: - # Not an IP address (common case) - host_ip = None - except UnicodeError: - # Divergence from upstream: Have to deal with ipaddress not taking - # byte strings. addresses should be all ascii, so we consider it not - # an ipaddress in this case - host_ip = None - except AttributeError: - # Divergence from upstream: Make ipaddress library optional - if ipaddress is None: - host_ip = None - else: - raise - dnsnames = [] - san = cert.get("subjectAltName", ()) - for key, value in san: - if key == "DNS": - if host_ip is None and _dnsname_match(value, hostname): - return - dnsnames.append(value) - elif key == "IP Address": - if host_ip is not None and _ipaddress_match(value, host_ip): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get("subject", ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == "commonName": - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise CertificateError( - "hostname %r " - "doesn't match either of %s" % (hostname, ", ".join(map(repr, dnsnames))) - ) - elif len(dnsnames) == 1: - raise CertificateError("hostname %r doesn't match %r" % (hostname, dnsnames[0])) - else: - raise CertificateError( - "no appropriate commonName or subjectAltName fields were found" - ) diff --git a/venv/lib/python3.8/site-packages/urllib3/poolmanager.py b/venv/lib/python3.8/site-packages/urllib3/poolmanager.py deleted file mode 100644 index 242a2f8..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/poolmanager.py +++ /dev/null @@ -1,470 +0,0 @@ -from __future__ import absolute_import -import collections -import functools -import logging - -from ._collections import RecentlyUsedContainer -from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool -from .connectionpool import port_by_scheme -from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown -from .packages import six -from .packages.six.moves.urllib.parse import urljoin -from .request import RequestMethods -from .util.url import parse_url -from .util.retry import Retry - - -__all__ = ["PoolManager", "ProxyManager", "proxy_from_url"] - - -log = logging.getLogger(__name__) - -SSL_KEYWORDS = ( - "key_file", - "cert_file", - "cert_reqs", - "ca_certs", - "ssl_version", - "ca_cert_dir", - "ssl_context", - "key_password", -) - -# All known keyword arguments that could be provided to the pool manager, its -# pools, or the underlying connections. This is used to construct a pool key. -_key_fields = ( - "key_scheme", # str - "key_host", # str - "key_port", # int - "key_timeout", # int or float or Timeout - "key_retries", # int or Retry - "key_strict", # bool - "key_block", # bool - "key_source_address", # str - "key_key_file", # str - "key_key_password", # str - "key_cert_file", # str - "key_cert_reqs", # str - "key_ca_certs", # str - "key_ssl_version", # str - "key_ca_cert_dir", # str - "key_ssl_context", # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext - "key_maxsize", # int - "key_headers", # dict - "key__proxy", # parsed proxy url - "key__proxy_headers", # dict - "key_socket_options", # list of (level (int), optname (int), value (int or str)) tuples - "key__socks_options", # dict - "key_assert_hostname", # bool or string - "key_assert_fingerprint", # str - "key_server_hostname", # str -) - -#: The namedtuple class used to construct keys for the connection pool. -#: All custom key schemes should include the fields in this key at a minimum. -PoolKey = collections.namedtuple("PoolKey", _key_fields) - - -def _default_key_normalizer(key_class, request_context): - """ - Create a pool key out of a request context dictionary. - - According to RFC 3986, both the scheme and host are case-insensitive. - Therefore, this function normalizes both before constructing the pool - key for an HTTPS request. If you wish to change this behaviour, provide - alternate callables to ``key_fn_by_scheme``. - - :param key_class: - The class to use when constructing the key. This should be a namedtuple - with the ``scheme`` and ``host`` keys at a minimum. - :type key_class: namedtuple - :param request_context: - A dictionary-like object that contain the context for a request. - :type request_context: dict - - :return: A namedtuple that can be used as a connection pool key. - :rtype: PoolKey - """ - # Since we mutate the dictionary, make a copy first - context = request_context.copy() - context["scheme"] = context["scheme"].lower() - context["host"] = context["host"].lower() - - # These are both dictionaries and need to be transformed into frozensets - for key in ("headers", "_proxy_headers", "_socks_options"): - if key in context and context[key] is not None: - context[key] = frozenset(context[key].items()) - - # The socket_options key may be a list and needs to be transformed into a - # tuple. - socket_opts = context.get("socket_options") - if socket_opts is not None: - context["socket_options"] = tuple(socket_opts) - - # Map the kwargs to the names in the namedtuple - this is necessary since - # namedtuples can't have fields starting with '_'. - for key in list(context.keys()): - context["key_" + key] = context.pop(key) - - # Default to ``None`` for keys missing from the context - for field in key_class._fields: - if field not in context: - context[field] = None - - return key_class(**context) - - -#: A dictionary that maps a scheme to a callable that creates a pool key. -#: This can be used to alter the way pool keys are constructed, if desired. -#: Each PoolManager makes a copy of this dictionary so they can be configured -#: globally here, or individually on the instance. -key_fn_by_scheme = { - "http": functools.partial(_default_key_normalizer, PoolKey), - "https": functools.partial(_default_key_normalizer, PoolKey), -} - -pool_classes_by_scheme = {"http": HTTPConnectionPool, "https": HTTPSConnectionPool} - - -class PoolManager(RequestMethods): - """ - Allows for arbitrary requests while transparently keeping track of - necessary connection pools for you. - - :param num_pools: - Number of connection pools to cache before discarding the least - recently used pool. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param \\**connection_pool_kw: - Additional parameters are used to create fresh - :class:`urllib3.connectionpool.ConnectionPool` instances. - - Example:: - - >>> manager = PoolManager(num_pools=2) - >>> r = manager.request('GET', 'http://google.com/') - >>> r = manager.request('GET', 'http://google.com/mail') - >>> r = manager.request('GET', 'http://yahoo.com/') - >>> len(manager.pools) - 2 - - """ - - proxy = None - - def __init__(self, num_pools=10, headers=None, **connection_pool_kw): - RequestMethods.__init__(self, headers) - self.connection_pool_kw = connection_pool_kw - self.pools = RecentlyUsedContainer(num_pools, dispose_func=lambda p: p.close()) - - # Locally set the pool classes and keys so other PoolManagers can - # override them. - self.pool_classes_by_scheme = pool_classes_by_scheme - self.key_fn_by_scheme = key_fn_by_scheme.copy() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.clear() - # Return False to re-raise any potential exceptions - return False - - def _new_pool(self, scheme, host, port, request_context=None): - """ - Create a new :class:`ConnectionPool` based on host, port, scheme, and - any additional pool keyword arguments. - - If ``request_context`` is provided, it is provided as keyword arguments - to the pool class used. This method is used to actually create the - connection pools handed out by :meth:`connection_from_url` and - companion methods. It is intended to be overridden for customization. - """ - pool_cls = self.pool_classes_by_scheme[scheme] - if request_context is None: - request_context = self.connection_pool_kw.copy() - - # Although the context has everything necessary to create the pool, - # this function has historically only used the scheme, host, and port - # in the positional args. When an API change is acceptable these can - # be removed. - for key in ("scheme", "host", "port"): - request_context.pop(key, None) - - if scheme == "http": - for kw in SSL_KEYWORDS: - request_context.pop(kw, None) - - return pool_cls(host, port, **request_context) - - def clear(self): - """ - Empty our store of pools and direct them all to close. - - This will not affect in-flight connections, but they will not be - re-used after completion. - """ - self.pools.clear() - - def connection_from_host(self, host, port=None, scheme="http", pool_kwargs=None): - """ - Get a :class:`ConnectionPool` based on the host, port, and scheme. - - If ``port`` isn't given, it will be derived from the ``scheme`` using - ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is - provided, it is merged with the instance's ``connection_pool_kw`` - variable and used to create the new connection pool, if one is - needed. - """ - - if not host: - raise LocationValueError("No host specified.") - - request_context = self._merge_pool_kwargs(pool_kwargs) - request_context["scheme"] = scheme or "http" - if not port: - port = port_by_scheme.get(request_context["scheme"].lower(), 80) - request_context["port"] = port - request_context["host"] = host - - return self.connection_from_context(request_context) - - def connection_from_context(self, request_context): - """ - Get a :class:`ConnectionPool` based on the request context. - - ``request_context`` must at least contain the ``scheme`` key and its - value must be a key in ``key_fn_by_scheme`` instance variable. - """ - scheme = request_context["scheme"].lower() - pool_key_constructor = self.key_fn_by_scheme[scheme] - pool_key = pool_key_constructor(request_context) - - return self.connection_from_pool_key(pool_key, request_context=request_context) - - def connection_from_pool_key(self, pool_key, request_context=None): - """ - Get a :class:`ConnectionPool` based on the provided pool key. - - ``pool_key`` should be a namedtuple that only contains immutable - objects. At a minimum it must have the ``scheme``, ``host``, and - ``port`` fields. - """ - with self.pools.lock: - # If the scheme, host, or port doesn't match existing open - # connections, open a new ConnectionPool. - pool = self.pools.get(pool_key) - if pool: - return pool - - # Make a fresh ConnectionPool of the desired type - scheme = request_context["scheme"] - host = request_context["host"] - port = request_context["port"] - pool = self._new_pool(scheme, host, port, request_context=request_context) - self.pools[pool_key] = pool - - return pool - - def connection_from_url(self, url, pool_kwargs=None): - """ - Similar to :func:`urllib3.connectionpool.connection_from_url`. - - If ``pool_kwargs`` is not provided and a new pool needs to be - constructed, ``self.connection_pool_kw`` is used to initialize - the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` - is provided, it is used instead. Note that if a new pool does not - need to be created for the request, the provided ``pool_kwargs`` are - not used. - """ - u = parse_url(url) - return self.connection_from_host( - u.host, port=u.port, scheme=u.scheme, pool_kwargs=pool_kwargs - ) - - def _merge_pool_kwargs(self, override): - """ - Merge a dictionary of override values for self.connection_pool_kw. - - This does not modify self.connection_pool_kw and returns a new dict. - Any keys in the override dictionary with a value of ``None`` are - removed from the merged dictionary. - """ - base_pool_kwargs = self.connection_pool_kw.copy() - if override: - for key, value in override.items(): - if value is None: - try: - del base_pool_kwargs[key] - except KeyError: - pass - else: - base_pool_kwargs[key] = value - return base_pool_kwargs - - def urlopen(self, method, url, redirect=True, **kw): - """ - Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` - with custom cross-host redirect logic and only sends the request-uri - portion of the ``url``. - - The given ``url`` parameter must be absolute, such that an appropriate - :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. - """ - u = parse_url(url) - conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) - - kw["assert_same_host"] = False - kw["redirect"] = False - - if "headers" not in kw: - kw["headers"] = self.headers.copy() - - if self.proxy is not None and u.scheme == "http": - response = conn.urlopen(method, url, **kw) - else: - response = conn.urlopen(method, u.request_uri, **kw) - - redirect_location = redirect and response.get_redirect_location() - if not redirect_location: - return response - - # Support relative URLs for redirecting. - redirect_location = urljoin(url, redirect_location) - - # RFC 7231, Section 6.4.4 - if response.status == 303: - method = "GET" - - retries = kw.get("retries") - if not isinstance(retries, Retry): - retries = Retry.from_int(retries, redirect=redirect) - - # Strip headers marked as unsafe to forward to the redirected location. - # Check remove_headers_on_redirect to avoid a potential network call within - # conn.is_same_host() which may use socket.gethostbyname() in the future. - if retries.remove_headers_on_redirect and not conn.is_same_host( - redirect_location - ): - headers = list(six.iterkeys(kw["headers"])) - for header in headers: - if header.lower() in retries.remove_headers_on_redirect: - kw["headers"].pop(header, None) - - try: - retries = retries.increment(method, url, response=response, _pool=conn) - except MaxRetryError: - if retries.raise_on_redirect: - raise - return response - - kw["retries"] = retries - kw["redirect"] = redirect - - log.info("Redirecting %s -> %s", url, redirect_location) - return self.urlopen(method, redirect_location, **kw) - - -class ProxyManager(PoolManager): - """ - Behaves just like :class:`PoolManager`, but sends all requests through - the defined proxy, using the CONNECT method for HTTPS URLs. - - :param proxy_url: - The URL of the proxy to be used. - - :param proxy_headers: - A dictionary containing headers that will be sent to the proxy. In case - of HTTP they are being sent with each request, while in the - HTTPS/CONNECT case they are sent only once. Could be used for proxy - authentication. - - Example: - >>> proxy = urllib3.ProxyManager('http://localhost:3128/') - >>> r1 = proxy.request('GET', 'http://google.com/') - >>> r2 = proxy.request('GET', 'http://httpbin.org/') - >>> len(proxy.pools) - 1 - >>> r3 = proxy.request('GET', 'https://httpbin.org/') - >>> r4 = proxy.request('GET', 'https://twitter.com/') - >>> len(proxy.pools) - 3 - - """ - - def __init__( - self, - proxy_url, - num_pools=10, - headers=None, - proxy_headers=None, - **connection_pool_kw - ): - - if isinstance(proxy_url, HTTPConnectionPool): - proxy_url = "%s://%s:%i" % ( - proxy_url.scheme, - proxy_url.host, - proxy_url.port, - ) - proxy = parse_url(proxy_url) - if not proxy.port: - port = port_by_scheme.get(proxy.scheme, 80) - proxy = proxy._replace(port=port) - - if proxy.scheme not in ("http", "https"): - raise ProxySchemeUnknown(proxy.scheme) - - self.proxy = proxy - self.proxy_headers = proxy_headers or {} - - connection_pool_kw["_proxy"] = self.proxy - connection_pool_kw["_proxy_headers"] = self.proxy_headers - - super(ProxyManager, self).__init__(num_pools, headers, **connection_pool_kw) - - def connection_from_host(self, host, port=None, scheme="http", pool_kwargs=None): - if scheme == "https": - return super(ProxyManager, self).connection_from_host( - host, port, scheme, pool_kwargs=pool_kwargs - ) - - return super(ProxyManager, self).connection_from_host( - self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs - ) - - def _set_proxy_headers(self, url, headers=None): - """ - Sets headers needed by proxies: specifically, the Accept and Host - headers. Only sets headers not provided by the user. - """ - headers_ = {"Accept": "*/*"} - - netloc = parse_url(url).netloc - if netloc: - headers_["Host"] = netloc - - if headers: - headers_.update(headers) - return headers_ - - def urlopen(self, method, url, redirect=True, **kw): - "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." - u = parse_url(url) - - if u.scheme == "http": - # For proxied HTTPS requests, httplib sets the necessary headers - # on the CONNECT to the proxy. For HTTP, we'll definitely - # need to set 'Host' at the very least. - headers = kw.get("headers", self.headers) - kw["headers"] = self._set_proxy_headers(url, headers) - - return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) - - -def proxy_from_url(url, **kw): - return ProxyManager(proxy_url=url, **kw) diff --git a/venv/lib/python3.8/site-packages/urllib3/request.py b/venv/lib/python3.8/site-packages/urllib3/request.py deleted file mode 100644 index 55f160b..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/request.py +++ /dev/null @@ -1,171 +0,0 @@ -from __future__ import absolute_import - -from .filepost import encode_multipart_formdata -from .packages.six.moves.urllib.parse import urlencode - - -__all__ = ["RequestMethods"] - - -class RequestMethods(object): - """ - Convenience mixin for classes who implement a :meth:`urlopen` method, such - as :class:`~urllib3.connectionpool.HTTPConnectionPool` and - :class:`~urllib3.poolmanager.PoolManager`. - - Provides behavior for making common types of HTTP request methods and - decides which type of request field encoding to use. - - Specifically, - - :meth:`.request_encode_url` is for sending requests whose fields are - encoded in the URL (such as GET, HEAD, DELETE). - - :meth:`.request_encode_body` is for sending requests whose fields are - encoded in the *body* of the request using multipart or www-form-urlencoded - (such as for POST, PUT, PATCH). - - :meth:`.request` is for making any kind of request, it will look up the - appropriate encoding format and use one of the above two methods to make - the request. - - Initializer parameters: - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - """ - - _encode_url_methods = {"DELETE", "GET", "HEAD", "OPTIONS"} - - def __init__(self, headers=None): - self.headers = headers or {} - - def urlopen( - self, - method, - url, - body=None, - headers=None, - encode_multipart=True, - multipart_boundary=None, - **kw - ): # Abstract - raise NotImplementedError( - "Classes extending RequestMethods must implement " - "their own ``urlopen`` method." - ) - - def request(self, method, url, fields=None, headers=None, **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the appropriate encoding of - ``fields`` based on the ``method`` used. - - This is a convenience method that requires the least amount of manual - effort. It can be used in most situations, while still having the - option to drop down to more specific methods when necessary, such as - :meth:`request_encode_url`, :meth:`request_encode_body`, - or even the lowest level :meth:`urlopen`. - """ - method = method.upper() - - urlopen_kw["request_url"] = url - - if method in self._encode_url_methods: - return self.request_encode_url( - method, url, fields=fields, headers=headers, **urlopen_kw - ) - else: - return self.request_encode_body( - method, url, fields=fields, headers=headers, **urlopen_kw - ) - - def request_encode_url(self, method, url, fields=None, headers=None, **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the url. This is useful for request methods like GET, HEAD, DELETE, etc. - """ - if headers is None: - headers = self.headers - - extra_kw = {"headers": headers} - extra_kw.update(urlopen_kw) - - if fields: - url += "?" + urlencode(fields) - - return self.urlopen(method, url, **extra_kw) - - def request_encode_body( - self, - method, - url, - fields=None, - headers=None, - encode_multipart=True, - multipart_boundary=None, - **urlopen_kw - ): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the body. This is useful for request methods like POST, PUT, PATCH, etc. - - When ``encode_multipart=True`` (default), then - :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode - the payload with the appropriate content type. Otherwise - :meth:`urllib.urlencode` is used with the - 'application/x-www-form-urlencoded' content type. - - Multipart encoding must be used when posting files, and it's reasonably - safe to use it in other times too. However, it may break request - signing, such as with OAuth. - - Supports an optional ``fields`` parameter of key/value strings AND - key/filetuple. A filetuple is a (filename, data, MIME type) tuple where - the MIME type is optional. For example:: - - fields = { - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), - 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - } - - When uploading a file, providing a filename (the first parameter of the - tuple) is optional but recommended to best mimic behavior of browsers. - - Note that if ``headers`` are supplied, the 'Content-Type' header will - be overwritten because it depends on the dynamic random boundary string - which is used to compose the body of the request. The random boundary - string can be explicitly set with the ``multipart_boundary`` parameter. - """ - if headers is None: - headers = self.headers - - extra_kw = {"headers": {}} - - if fields: - if "body" in urlopen_kw: - raise TypeError( - "request got values for both 'fields' and 'body', can only specify one." - ) - - if encode_multipart: - body, content_type = encode_multipart_formdata( - fields, boundary=multipart_boundary - ) - else: - body, content_type = ( - urlencode(fields), - "application/x-www-form-urlencoded", - ) - - extra_kw["body"] = body - extra_kw["headers"] = {"Content-Type": content_type} - - extra_kw["headers"].update(headers) - extra_kw.update(urlopen_kw) - - return self.urlopen(method, url, **extra_kw) diff --git a/venv/lib/python3.8/site-packages/urllib3/response.py b/venv/lib/python3.8/site-packages/urllib3/response.py deleted file mode 100644 index 6090a73..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/response.py +++ /dev/null @@ -1,809 +0,0 @@ -from __future__ import absolute_import -from contextlib import contextmanager -import zlib -import io -import logging -from socket import timeout as SocketTimeout -from socket import error as SocketError - -try: - import brotli -except ImportError: - brotli = None - -from ._collections import HTTPHeaderDict -from .exceptions import ( - BodyNotHttplibCompatible, - ProtocolError, - DecodeError, - ReadTimeoutError, - ResponseNotChunked, - IncompleteRead, - InvalidHeader, -) -from .packages.six import string_types as basestring, PY3 -from .packages.six.moves import http_client as httplib -from .connection import HTTPException, BaseSSLError -from .util.response import is_fp_closed, is_response_to_head - -log = logging.getLogger(__name__) - - -class DeflateDecoder(object): - def __init__(self): - self._first_try = True - self._data = b"" - self._obj = zlib.decompressobj() - - def __getattr__(self, name): - return getattr(self._obj, name) - - def decompress(self, data): - if not data: - return data - - if not self._first_try: - return self._obj.decompress(data) - - self._data += data - try: - decompressed = self._obj.decompress(data) - if decompressed: - self._first_try = False - self._data = None - return decompressed - except zlib.error: - self._first_try = False - self._obj = zlib.decompressobj(-zlib.MAX_WBITS) - try: - return self.decompress(self._data) - finally: - self._data = None - - -class GzipDecoderState(object): - - FIRST_MEMBER = 0 - OTHER_MEMBERS = 1 - SWALLOW_DATA = 2 - - -class GzipDecoder(object): - def __init__(self): - self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) - self._state = GzipDecoderState.FIRST_MEMBER - - def __getattr__(self, name): - return getattr(self._obj, name) - - def decompress(self, data): - ret = bytearray() - if self._state == GzipDecoderState.SWALLOW_DATA or not data: - return bytes(ret) - while True: - try: - ret += self._obj.decompress(data) - except zlib.error: - previous_state = self._state - # Ignore data after the first error - self._state = GzipDecoderState.SWALLOW_DATA - if previous_state == GzipDecoderState.OTHER_MEMBERS: - # Allow trailing garbage acceptable in other gzip clients - return bytes(ret) - raise - data = self._obj.unused_data - if not data: - return bytes(ret) - self._state = GzipDecoderState.OTHER_MEMBERS - self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) - - -if brotli is not None: - - class BrotliDecoder(object): - # Supports both 'brotlipy' and 'Brotli' packages - # since they share an import name. The top branches - # are for 'brotlipy' and bottom branches for 'Brotli' - def __init__(self): - self._obj = brotli.Decompressor() - - def decompress(self, data): - if hasattr(self._obj, "decompress"): - return self._obj.decompress(data) - return self._obj.process(data) - - def flush(self): - if hasattr(self._obj, "flush"): - return self._obj.flush() - return b"" - - -class MultiDecoder(object): - """ - From RFC7231: - If one or more encodings have been applied to a representation, the - sender that applied the encodings MUST generate a Content-Encoding - header field that lists the content codings in the order in which - they were applied. - """ - - def __init__(self, modes): - self._decoders = [_get_decoder(m.strip()) for m in modes.split(",")] - - def flush(self): - return self._decoders[0].flush() - - def decompress(self, data): - for d in reversed(self._decoders): - data = d.decompress(data) - return data - - -def _get_decoder(mode): - if "," in mode: - return MultiDecoder(mode) - - if mode == "gzip": - return GzipDecoder() - - if brotli is not None and mode == "br": - return BrotliDecoder() - - return DeflateDecoder() - - -class HTTPResponse(io.IOBase): - """ - HTTP Response container. - - Backwards-compatible to httplib's HTTPResponse but the response ``body`` is - loaded and decoded on-demand when the ``data`` property is accessed. This - class is also compatible with the Python standard library's :mod:`io` - module, and can hence be treated as a readable object in the context of that - framework. - - Extra parameters for behaviour not present in httplib.HTTPResponse: - - :param preload_content: - If True, the response's body will be preloaded during construction. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param original_response: - When this HTTPResponse wrapper is generated from an httplib.HTTPResponse - object, it's convenient to include the original for debug purposes. It's - otherwise unused. - - :param retries: - The retries contains the last :class:`~urllib3.util.retry.Retry` that - was used during the request. - - :param enforce_content_length: - Enforce content length checking. Body returned by server must match - value of Content-Length header, if present. Otherwise, raise error. - """ - - CONTENT_DECODERS = ["gzip", "deflate"] - if brotli is not None: - CONTENT_DECODERS += ["br"] - REDIRECT_STATUSES = [301, 302, 303, 307, 308] - - def __init__( - self, - body="", - headers=None, - status=0, - version=0, - reason=None, - strict=0, - preload_content=True, - decode_content=True, - original_response=None, - pool=None, - connection=None, - msg=None, - retries=None, - enforce_content_length=False, - request_method=None, - request_url=None, - auto_close=True, - ): - - if isinstance(headers, HTTPHeaderDict): - self.headers = headers - else: - self.headers = HTTPHeaderDict(headers) - self.status = status - self.version = version - self.reason = reason - self.strict = strict - self.decode_content = decode_content - self.retries = retries - self.enforce_content_length = enforce_content_length - self.auto_close = auto_close - - self._decoder = None - self._body = None - self._fp = None - self._original_response = original_response - self._fp_bytes_read = 0 - self.msg = msg - self._request_url = request_url - - if body and isinstance(body, (basestring, bytes)): - self._body = body - - self._pool = pool - self._connection = connection - - if hasattr(body, "read"): - self._fp = body - - # Are we using the chunked-style of transfer encoding? - self.chunked = False - self.chunk_left = None - tr_enc = self.headers.get("transfer-encoding", "").lower() - # Don't incur the penalty of creating a list and then discarding it - encodings = (enc.strip() for enc in tr_enc.split(",")) - if "chunked" in encodings: - self.chunked = True - - # Determine length of response - self.length_remaining = self._init_length(request_method) - - # If requested, preload the body. - if preload_content and not self._body: - self._body = self.read(decode_content=decode_content) - - def get_redirect_location(self): - """ - Should we redirect and where to? - - :returns: Truthy redirect location string if we got a redirect status - code and valid location. ``None`` if redirect status and no - location. ``False`` if not a redirect status code. - """ - if self.status in self.REDIRECT_STATUSES: - return self.headers.get("location") - - return False - - def release_conn(self): - if not self._pool or not self._connection: - return - - self._pool._put_conn(self._connection) - self._connection = None - - @property - def data(self): - # For backwords-compat with earlier urllib3 0.4 and earlier. - if self._body: - return self._body - - if self._fp: - return self.read(cache_content=True) - - @property - def connection(self): - return self._connection - - def isclosed(self): - return is_fp_closed(self._fp) - - def tell(self): - """ - Obtain the number of bytes pulled over the wire so far. May differ from - the amount of content returned by :meth:``HTTPResponse.read`` if bytes - are encoded on the wire (e.g, compressed). - """ - return self._fp_bytes_read - - def _init_length(self, request_method): - """ - Set initial length value for Response content if available. - """ - length = self.headers.get("content-length") - - if length is not None: - if self.chunked: - # This Response will fail with an IncompleteRead if it can't be - # received as chunked. This method falls back to attempt reading - # the response before raising an exception. - log.warning( - "Received response with both Content-Length and " - "Transfer-Encoding set. This is expressly forbidden " - "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " - "attempting to process response as Transfer-Encoding: " - "chunked." - ) - return None - - try: - # RFC 7230 section 3.3.2 specifies multiple content lengths can - # be sent in a single Content-Length header - # (e.g. Content-Length: 42, 42). This line ensures the values - # are all valid ints and that as long as the `set` length is 1, - # all values are the same. Otherwise, the header is invalid. - lengths = set([int(val) for val in length.split(",")]) - if len(lengths) > 1: - raise InvalidHeader( - "Content-Length contained multiple " - "unmatching values (%s)" % length - ) - length = lengths.pop() - except ValueError: - length = None - else: - if length < 0: - length = None - - # Convert status to int for comparison - # In some cases, httplib returns a status of "_UNKNOWN" - try: - status = int(self.status) - except ValueError: - status = 0 - - # Check for responses that shouldn't include a body - if status in (204, 304) or 100 <= status < 200 or request_method == "HEAD": - length = 0 - - return length - - def _init_decoder(self): - """ - Set-up the _decoder attribute if necessary. - """ - # Note: content-encoding value should be case-insensitive, per RFC 7230 - # Section 3.2 - content_encoding = self.headers.get("content-encoding", "").lower() - if self._decoder is None: - if content_encoding in self.CONTENT_DECODERS: - self._decoder = _get_decoder(content_encoding) - elif "," in content_encoding: - encodings = [ - e.strip() - for e in content_encoding.split(",") - if e.strip() in self.CONTENT_DECODERS - ] - if len(encodings): - self._decoder = _get_decoder(content_encoding) - - DECODER_ERROR_CLASSES = (IOError, zlib.error) - if brotli is not None: - DECODER_ERROR_CLASSES += (brotli.error,) - - def _decode(self, data, decode_content, flush_decoder): - """ - Decode the data passed in and potentially flush the decoder. - """ - if not decode_content: - return data - - try: - if self._decoder: - data = self._decoder.decompress(data) - except self.DECODER_ERROR_CLASSES as e: - content_encoding = self.headers.get("content-encoding", "").lower() - raise DecodeError( - "Received response with content-encoding: %s, but " - "failed to decode it." % content_encoding, - e, - ) - if flush_decoder: - data += self._flush_decoder() - - return data - - def _flush_decoder(self): - """ - Flushes the decoder. Should only be called if the decoder is actually - being used. - """ - if self._decoder: - buf = self._decoder.decompress(b"") - return buf + self._decoder.flush() - - return b"" - - @contextmanager - def _error_catcher(self): - """ - Catch low-level python exceptions, instead re-raising urllib3 - variants, so that low-level exceptions are not leaked in the - high-level api. - - On exit, release the connection back to the pool. - """ - clean_exit = False - - try: - try: - yield - - except SocketTimeout: - # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but - # there is yet no clean way to get at it from this context. - raise ReadTimeoutError(self._pool, None, "Read timed out.") - - except BaseSSLError as e: - # FIXME: Is there a better way to differentiate between SSLErrors? - if "read operation timed out" not in str(e): # Defensive: - # This shouldn't happen but just in case we're missing an edge - # case, let's avoid swallowing SSL errors. - raise - - raise ReadTimeoutError(self._pool, None, "Read timed out.") - - except (HTTPException, SocketError) as e: - # This includes IncompleteRead. - raise ProtocolError("Connection broken: %r" % e, e) - - # If no exception is thrown, we should avoid cleaning up - # unnecessarily. - clean_exit = True - finally: - # If we didn't terminate cleanly, we need to throw away our - # connection. - if not clean_exit: - # The response may not be closed but we're not going to use it - # anymore so close it now to ensure that the connection is - # released back to the pool. - if self._original_response: - self._original_response.close() - - # Closing the response may not actually be sufficient to close - # everything, so if we have a hold of the connection close that - # too. - if self._connection: - self._connection.close() - - # If we hold the original response but it's closed now, we should - # return the connection back to the pool. - if self._original_response and self._original_response.isclosed(): - self.release_conn() - - def read(self, amt=None, decode_content=None, cache_content=False): - """ - Similar to :meth:`httplib.HTTPResponse.read`, but with two additional - parameters: ``decode_content`` and ``cache_content``. - - :param amt: - How much of the content to read. If specified, caching is skipped - because it doesn't make sense to cache partial content as the full - response. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param cache_content: - If True, will save the returned data such that the same result is - returned despite of the state of the underlying file object. This - is useful if you want the ``.data`` property to continue working - after having ``.read()`` the file object. (Overridden if ``amt`` is - set.) - """ - self._init_decoder() - if decode_content is None: - decode_content = self.decode_content - - if self._fp is None: - return - - flush_decoder = False - fp_closed = getattr(self._fp, "closed", False) - - with self._error_catcher(): - if amt is None: - # cStringIO doesn't like amt=None - data = self._fp.read() if not fp_closed else b"" - flush_decoder = True - else: - cache_content = False - data = self._fp.read(amt) if not fp_closed else b"" - if ( - amt != 0 and not data - ): # Platform-specific: Buggy versions of Python. - # Close the connection when no data is returned - # - # This is redundant to what httplib/http.client _should_ - # already do. However, versions of python released before - # December 15, 2012 (http://bugs.python.org/issue16298) do - # not properly close the connection in all cases. There is - # no harm in redundantly calling close. - self._fp.close() - flush_decoder = True - if self.enforce_content_length and self.length_remaining not in ( - 0, - None, - ): - # This is an edge case that httplib failed to cover due - # to concerns of backward compatibility. We're - # addressing it here to make sure IncompleteRead is - # raised during streaming, so all calls with incorrect - # Content-Length are caught. - raise IncompleteRead(self._fp_bytes_read, self.length_remaining) - - if data: - self._fp_bytes_read += len(data) - if self.length_remaining is not None: - self.length_remaining -= len(data) - - data = self._decode(data, decode_content, flush_decoder) - - if cache_content: - self._body = data - - return data - - def stream(self, amt=2 ** 16, decode_content=None): - """ - A generator wrapper for the read() method. A call will block until - ``amt`` bytes have been read from the connection or until the - connection is closed. - - :param amt: - How much of the content to read. The generator will return up to - much data per iteration, but may return less. This is particularly - likely when using compressed data. However, the empty string will - never be returned. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - if self.chunked and self.supports_chunked_reads(): - for line in self.read_chunked(amt, decode_content=decode_content): - yield line - else: - while not is_fp_closed(self._fp): - data = self.read(amt=amt, decode_content=decode_content) - - if data: - yield data - - @classmethod - def from_httplib(ResponseCls, r, **response_kw): - """ - Given an :class:`httplib.HTTPResponse` instance ``r``, return a - corresponding :class:`urllib3.response.HTTPResponse` object. - - Remaining parameters are passed to the HTTPResponse constructor, along - with ``original_response=r``. - """ - headers = r.msg - - if not isinstance(headers, HTTPHeaderDict): - if PY3: - headers = HTTPHeaderDict(headers.items()) - else: - # Python 2.7 - headers = HTTPHeaderDict.from_httplib(headers) - - # HTTPResponse objects in Python 3 don't have a .strict attribute - strict = getattr(r, "strict", 0) - resp = ResponseCls( - body=r, - headers=headers, - status=r.status, - version=r.version, - reason=r.reason, - strict=strict, - original_response=r, - **response_kw - ) - return resp - - # Backwards-compatibility methods for httplib.HTTPResponse - def getheaders(self): - return self.headers - - def getheader(self, name, default=None): - return self.headers.get(name, default) - - # Backwards compatibility for http.cookiejar - def info(self): - return self.headers - - # Overrides from io.IOBase - def close(self): - if not self.closed: - self._fp.close() - - if self._connection: - self._connection.close() - - if not self.auto_close: - io.IOBase.close(self) - - @property - def closed(self): - if not self.auto_close: - return io.IOBase.closed.__get__(self) - elif self._fp is None: - return True - elif hasattr(self._fp, "isclosed"): - return self._fp.isclosed() - elif hasattr(self._fp, "closed"): - return self._fp.closed - else: - return True - - def fileno(self): - if self._fp is None: - raise IOError("HTTPResponse has no file to get a fileno from") - elif hasattr(self._fp, "fileno"): - return self._fp.fileno() - else: - raise IOError( - "The file-like object this HTTPResponse is wrapped " - "around has no file descriptor" - ) - - def flush(self): - if ( - self._fp is not None - and hasattr(self._fp, "flush") - and not getattr(self._fp, "closed", False) - ): - return self._fp.flush() - - def readable(self): - # This method is required for `io` module compatibility. - return True - - def readinto(self, b): - # This method is required for `io` module compatibility. - temp = self.read(len(b)) - if len(temp) == 0: - return 0 - else: - b[: len(temp)] = temp - return len(temp) - - def supports_chunked_reads(self): - """ - Checks if the underlying file-like object looks like a - httplib.HTTPResponse object. We do this by testing for the fp - attribute. If it is present we assume it returns raw chunks as - processed by read_chunked(). - """ - return hasattr(self._fp, "fp") - - def _update_chunk_length(self): - # First, we'll figure out length of a chunk and then - # we'll try to read it from socket. - if self.chunk_left is not None: - return - line = self._fp.fp.readline() - line = line.split(b";", 1)[0] - try: - self.chunk_left = int(line, 16) - except ValueError: - # Invalid chunked protocol response, abort. - self.close() - raise httplib.IncompleteRead(line) - - def _handle_chunk(self, amt): - returned_chunk = None - if amt is None: - chunk = self._fp._safe_read(self.chunk_left) - returned_chunk = chunk - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - elif amt < self.chunk_left: - value = self._fp._safe_read(amt) - self.chunk_left = self.chunk_left - amt - returned_chunk = value - elif amt == self.chunk_left: - value = self._fp._safe_read(amt) - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - returned_chunk = value - else: # amt > self.chunk_left - returned_chunk = self._fp._safe_read(self.chunk_left) - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - return returned_chunk - - def read_chunked(self, amt=None, decode_content=None): - """ - Similar to :meth:`HTTPResponse.read`, but with an additional - parameter: ``decode_content``. - - :param amt: - How much of the content to read. If specified, caching is skipped - because it doesn't make sense to cache partial content as the full - response. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - self._init_decoder() - # FIXME: Rewrite this method and make it a class with a better structured logic. - if not self.chunked: - raise ResponseNotChunked( - "Response is not chunked. " - "Header 'transfer-encoding: chunked' is missing." - ) - if not self.supports_chunked_reads(): - raise BodyNotHttplibCompatible( - "Body should be httplib.HTTPResponse like. " - "It should have have an fp attribute which returns raw chunks." - ) - - with self._error_catcher(): - # Don't bother reading the body of a HEAD request. - if self._original_response and is_response_to_head(self._original_response): - self._original_response.close() - return - - # If a response is already read and closed - # then return immediately. - if self._fp.fp is None: - return - - while True: - self._update_chunk_length() - if self.chunk_left == 0: - break - chunk = self._handle_chunk(amt) - decoded = self._decode( - chunk, decode_content=decode_content, flush_decoder=False - ) - if decoded: - yield decoded - - if decode_content: - # On CPython and PyPy, we should never need to flush the - # decoder. However, on Jython we *might* need to, so - # lets defensively do it anyway. - decoded = self._flush_decoder() - if decoded: # Platform-specific: Jython. - yield decoded - - # Chunk content ends with \r\n: discard it. - while True: - line = self._fp.fp.readline() - if not line: - # Some sites may not end with '\r\n'. - break - if line == b"\r\n": - break - - # We read everything; close the "file". - if self._original_response: - self._original_response.close() - - def geturl(self): - """ - Returns the URL that was the source of this response. - If the request that generated this response redirected, this method - will return the final redirect location. - """ - if self.retries is not None and len(self.retries.history): - return self.retries.history[-1].redirect_location - else: - return self._request_url - - def __iter__(self): - buffer = [] - for chunk in self.stream(decode_content=True): - if b"\n" in chunk: - chunk = chunk.split(b"\n") - yield b"".join(buffer) + chunk[0] + b"\n" - for x in chunk[1:-1]: - yield x + b"\n" - if chunk[-1]: - buffer = [chunk[-1]] - else: - buffer = [] - else: - buffer.append(chunk) - if buffer: - yield b"".join(buffer) diff --git a/venv/lib/python3.8/site-packages/urllib3/util/__init__.py b/venv/lib/python3.8/site-packages/urllib3/util/__init__.py deleted file mode 100644 index a96c73a..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/util/__init__.py +++ /dev/null @@ -1,46 +0,0 @@ -from __future__ import absolute_import - -# For backwards compatibility, provide imports that used to be here. -from .connection import is_connection_dropped -from .request import make_headers -from .response import is_fp_closed -from .ssl_ import ( - SSLContext, - HAS_SNI, - IS_PYOPENSSL, - IS_SECURETRANSPORT, - assert_fingerprint, - resolve_cert_reqs, - resolve_ssl_version, - ssl_wrap_socket, - PROTOCOL_TLS, -) -from .timeout import current_time, Timeout - -from .retry import Retry -from .url import get_host, parse_url, split_first, Url -from .wait import wait_for_read, wait_for_write - -__all__ = ( - "HAS_SNI", - "IS_PYOPENSSL", - "IS_SECURETRANSPORT", - "SSLContext", - "PROTOCOL_TLS", - "Retry", - "Timeout", - "Url", - "assert_fingerprint", - "current_time", - "is_connection_dropped", - "is_fp_closed", - "get_host", - "parse_url", - "make_headers", - "resolve_cert_reqs", - "resolve_ssl_version", - "split_first", - "ssl_wrap_socket", - "wait_for_read", - "wait_for_write", -) diff --git a/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index e01bb04e93d951e19118a762e081341b76e8ea9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 972 zcmZ9KU2oGc6o!+2ENz;8uUogVfy7lMMlTQ-AV5shBqmL5)pQs50xN6WEt;JK+u7JZ z0)CQjx!PagigP?cClcj}&pC<xp4UEaHhl-KpYO+CS{29ng~8*i1i?pm)OSGa#4dM) zOI+89OL3W(M46QBxWX%<N~(5T<r~5yo*i%Sny8by@QE)Pq#*(lh$d-@7HNq#X^Rf& zh%V{cZ#~`<ebN`3WYfkqJ`h`E%Z}@OTMWri?2sL?OLoN`*|T|{KN0(6UmTDFh#TZ- z9E8rOc@Juxk!#w~h01uL8BIi<Nqz4=<OhkO%PdXVQYTqTW0~bSi{XbrMAwX7u_$Iz zVGJLxa=PT1f_mNfVR&|&rJ8-y#`|;>(r|KWg42-BK2K*S6R4UVMB&Nt`TS%tKbnNI z>3m^&ky1=*x=PYZCUcpj+H@rYZ8wZAu_D=5W%_?pN^yDv3P7A`V{j{@oT_Yj&9n(- z^XX!GJUyd}vv5>0!LpE&rJCwQFyk$NS)oCEb<VWB8&yp0l4*LCDQ)U`Bo(8D<ffr= zo}eTN`SQ8sFjez5!c-<fPZXQhzwlNjnvDjs2L8!90?&=~5N$*c(M4<_8i)=8PL(4! z5PifZqKXI*O~e4vLTn?3fXV2Y@hM#ux{!=giRaMx>n*d>8V_76n9_DaQv>(%ECr)+ zIa5L39u)qk+KO8*Z&$`9jE4?_cMr<38&j3&p>5BU!L~<TSlQUEsi045@y4Sx;+)bS zj(iSvi{Ed@TIAzA$q$oMX{aBrZtkw%=+|rv^YY~4)%vXyKBhEDVKeB<{La+gi7YNS Y`+(<Hq1Qn<aPfZ8=#&C?=ypnf018e3S^xk5 diff --git a/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/connection.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/connection.cpython-38.pyc deleted file mode 100644 index aae6e58071fb81bc815907030b19dacac25cadc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3145 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 diff --git a/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/queue.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/queue.cpython-38.pyc deleted file mode 100644 index 1f1c8ac2f7523e44f3a46159e774df403ef6fb1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1017 zcmZ`&O>fgc5Z(3Kj*}*Bf$}4KXo5fpRRUBABrYfdRUGhvmGN#Wr|XZb?TS{pH9w>| zhM%-oPCatv#LPwxRx3u@m-(>vy_wm38I1-6?B|=wx8IbIUl?@Fh2RuU^&UVFK^2LJ za0F8{b0UYL?<$tLkxPkm=AItgul%U@fe26dD<XX9&ixw}1%jTDuy+SHk?EZS7*fNk z^v8x8Z_&s`CRpkkgWwcS^$b9ghzb%pf(mCvA|~A#6->A*8hKl)$QL~kK&>bGKs7M^ zkLj%VY_CSX*3ifE4o<ZXP?KA_CQHH{LC(mAPD5t)l0qq&)M=4d#uE}0Y7f2*9phF~ z%?#xmqKA<A^J-FO<)lo@<20}8SgGUL<<-SW{ZdXEtyKE`#lPP=RTJCnxV$nRPxG|i zLm5^dy*}6}9@|>-U){L4C0&v^xq-Rr9)ud#6*?MAhAEj_d0QA^&gY9Ny_VQ=OL*8J zw8aOExCA??LvWDqmM-a<!tP;KmKP{-GRBX~Qs$yn;HI_A?n`ia+0>6Z0`@xspp?Kf z+!^}2McIZe{rWyJD~mFuw(p00=dwP6d)kJ(d{CN(feARz<4kgH2ApSwXcYQG&KFIr zwiS&t(+3DR2K@x#DFVKL4&a=%4}fy303e_N8?u1eY}nVBGeH?A7xB5QG>$iV+=gTL zKa8{D5(;*t?9<oh#<Nd2I^s><R8q7OZPwn};kR<^vV+&#R^H+iE0hz^Assrt6R^L1 CT+kT+ diff --git a/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/request.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/request.cpython-38.pyc deleted file mode 100644 index b8f6d50c040e384eff91396e040c254b136895a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3311 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 diff --git a/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/response.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/response.cpython-38.pyc deleted file mode 100644 index 72b66675769fdde7bbdc352a606b970688d21c15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1938 zcmZWqOK;;g5GEzrRum_@&7#1fhm<H51q?LK0*fAMY>Nil0BM1yL6hwxhbXj2*@~&h zl2kTMl}poW|3h+YPyIc*_LRTSQ-_q?I9(Zh4mmTN@0;=KwY31j_vh!^Cua7ySuB4J zEWU)MOvezz0;TvEW5gWh3MX}sJv;YAC+!}0Vcucg-_UW7^_UN%&sJCf;|g0nM1%ev zXh8#9KcZumi&FD2NsC<SJ7Wj-SEpJRVI&fsX;^OTamu(npi(8-WLL^uM%bumKQs5C zy@I9$beBPeZqP0I5gj5AX*>($CPwD>Gs>Kw(4}9YGiOQq@`1DuQkUVGzjWec`GoeE zbB%w+48v>OOC1pSUQKy4Q{?TG>nWFnl1XyTGZH6)Z;52aNj^T~ktT^Ek;oNi!@%Af z6;#sHNJn;UbRA9kyBBp%B4cA{kL_O$UT1VHIDvh}HJ53U@&C-n#gd^xr}h)oSgqH0 zw3f*jqHZHuciVj@F6!V1D#~Ub;_iY^e<0b1i2gI$)@iX_B*j*eDNTjgiqGe>&-AB! zyOcsC;}`d%PQ<q4s>n0NhsC_^Cn}5$p61m(1JVc3A>VNWypFq$<M_?!_U$OwLHYpU z4s4ia5k7~BMit<C=3F~!Qv+5vp6*oW8sB1ri|$sInb+=BGxwMabKvTgTRHLs*wMR1 z>ZEe6(Uk|fJnie17_@=RgELsgl`EwVDqOj&^Sc9ByMT3<9st>F{CAY%QZL~x1esc% zDl(<#oQyf3ugWOmO2wrRa{@qH*bTzF7h2K??(;0l%M9S-jBrD3MPiw!1V}_6h^5dZ zkL^|9{=z~_o$oTx`Zkw9yF4QYb3KLO#Y0}TK8;9|M9R?RoXaGhH#{2YdBGQYN95F` z9>6)=J32b}7F?$je!9>oX`;9yE#O0b5%EGN0Q2zO4814w*Z1zX52O<44X=h2FtND& zh+h<t8W4en_15wyWRh$0%k!&Y-D5n4GitwHop2o%bS`qr29A6Lbg0+Ltch;OsHTI} zI!K^a08z7u*S%J2y}I<MdgTZn-ljmD%arQcGqI?9pr1mHSl*@pKmw|D-5Jj{SGB9O zl!l9tRJ}I1)(80*HsyQ9n_lakO`WD&GyCsTOPa8`25+zh?PCzBr_iCteZ1lHao_Q< z=lYNt>)3<bkeeWTkPoI#y3lMsJc9{TECgJ~71oBuPb;WRGv^Rh_{P13TrhK}RDaoc z|F2RtOnXyuWvNCD?QHG>k5xlsO7?blzS@%9o@!9rqZt#x26O#QnOG9WWTz;0vk6q9 z1!v%qP~D<D%Nj;Be6wpZiUdSt^ni2Ux5iJct9Ry=wP&mkyt)^rP+W5+H_Wb^WPnOp z6kHCR+Fy8GciTgzZY>4>2~?rQnNa5zgm2)8GJhRtrHca$p*CRb4}v-f!?@I?<Y6dH zw2wCm8qFXX)KDcC!!$qVN_rrWPoS%V`&_W(uqDjmW;HGm!Fpxc;J-|BRto-w`TtVp O57<E8cl{6jXa52hNEDF( diff --git a/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/retry.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/retry.cpython-38.pyc deleted file mode 100644 index 6628b595a83adf9b18db325287c401d64ff69b9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12934 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 KKh@}O{=Wg7_%R;< diff --git a/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/ssl_.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/ssl_.cpython-38.pyc deleted file mode 100644 index a245ba3407d07ae2d22fb94161c53790f81eac60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9802 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 diff --git a/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/timeout.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/timeout.cpython-38.pyc deleted file mode 100644 index da0feaf2f7322e544a36c9f06c21673f13316309..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8832 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 ba9gxq(oA|8kx948R{RyW<*oQlf3@*1KtdSh diff --git a/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/url.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/url.cpython-38.pyc deleted file mode 100644 index 1c1b0e2acbda95cd8b88b654fc6f94f4e55a52bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10656 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 Po-p1t-Y^CY)5!lH*m`~^ diff --git a/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/wait.cpython-38.pyc b/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/wait.cpython-38.pyc deleted file mode 100644 index 913af8909df3def604b2b6fe565c8b0b4bd76009..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3066 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 diff --git a/venv/lib/python3.8/site-packages/urllib3/util/connection.py b/venv/lib/python3.8/site-packages/urllib3/util/connection.py deleted file mode 100644 index 86f0a3b..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/util/connection.py +++ /dev/null @@ -1,138 +0,0 @@ -from __future__ import absolute_import -import socket -from .wait import NoWayToWaitForSocketError, wait_for_read -from ..contrib import _appengine_environ - - -def is_connection_dropped(conn): # Platform-specific - """ - Returns True if the connection is dropped and should be closed. - - :param conn: - :class:`httplib.HTTPConnection` object. - - Note: For platforms like AppEngine, this will always return ``False`` to - let the platform handle connection recycling transparently for us. - """ - sock = getattr(conn, "sock", False) - if sock is False: # Platform-specific: AppEngine - return False - if sock is None: # Connection already closed (such as by httplib). - return True - try: - # Returns True if readable, which here means it's been dropped - return wait_for_read(sock, timeout=0.0) - except NoWayToWaitForSocketError: # Platform-specific: AppEngine - return False - - -# This function is copied from socket.py in the Python 2.7 standard -# library test suite. Added to its signature is only `socket_options`. -# One additional modification is that we avoid binding to IPv6 servers -# discovered in DNS if the system doesn't have IPv6 functionality. -def create_connection( - address, - timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - source_address=None, - socket_options=None, -): - """Connect to *address* and return the socket object. - - Convenience function. Connect to *address* (a 2-tuple ``(host, - port)``) and return the socket object. Passing the optional - *timeout* parameter will set the timeout on the socket instance - before attempting to connect. If no *timeout* is supplied, the - global default timeout setting returned by :func:`getdefaulttimeout` - is used. If *source_address* is set it must be a tuple of (host, port) - for the socket to bind as a source address before making the connection. - An host of '' or port 0 tells the OS to use the default. - """ - - host, port = address - if host.startswith("["): - host = host.strip("[]") - err = None - - # Using the value from allowed_gai_family() in the context of getaddrinfo lets - # us select whether to work with IPv4 DNS records, IPv6 records, or both. - # The original create_connection function always returns all records. - family = allowed_gai_family() - - for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): - af, socktype, proto, canonname, sa = res - sock = None - try: - sock = socket.socket(af, socktype, proto) - - # If provided, set socket level options before connecting. - _set_socket_options(sock, socket_options) - - if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: - sock.settimeout(timeout) - if source_address: - sock.bind(source_address) - sock.connect(sa) - return sock - - except socket.error as e: - err = e - if sock is not None: - sock.close() - sock = None - - if err is not None: - raise err - - raise socket.error("getaddrinfo returns an empty list") - - -def _set_socket_options(sock, options): - if options is None: - return - - for opt in options: - sock.setsockopt(*opt) - - -def allowed_gai_family(): - """This function is designed to work in the context of - getaddrinfo, where family=socket.AF_UNSPEC is the default and - will perform a DNS search for both IPv6 and IPv4 records.""" - - family = socket.AF_INET - if HAS_IPV6: - family = socket.AF_UNSPEC - return family - - -def _has_ipv6(host): - """ Returns True if the system can bind an IPv6 address. """ - sock = None - has_ipv6 = False - - # App Engine doesn't support IPV6 sockets and actually has a quota on the - # number of sockets that can be used, so just early out here instead of - # creating a socket needlessly. - # See https://github.com/urllib3/urllib3/issues/1446 - if _appengine_environ.is_appengine_sandbox(): - return False - - if socket.has_ipv6: - # has_ipv6 returns true if cPython was compiled with IPv6 support. - # It does not tell us if the system has IPv6 support enabled. To - # determine that we must bind to an IPv6 address. - # https://github.com/urllib3/urllib3/pull/611 - # https://bugs.python.org/issue658327 - try: - sock = socket.socket(socket.AF_INET6) - sock.bind((host, 0)) - has_ipv6 = True - except Exception: - pass - - if sock: - sock.close() - return has_ipv6 - - -HAS_IPV6 = _has_ipv6("::1") diff --git a/venv/lib/python3.8/site-packages/urllib3/util/queue.py b/venv/lib/python3.8/site-packages/urllib3/util/queue.py deleted file mode 100644 index d3d379a..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/util/queue.py +++ /dev/null @@ -1,21 +0,0 @@ -import collections -from ..packages import six -from ..packages.six.moves import queue - -if six.PY2: - # Queue is imported for side effects on MS Windows. See issue #229. - import Queue as _unused_module_Queue # noqa: F401 - - -class LifoQueue(queue.Queue): - def _init(self, _): - self.queue = collections.deque() - - def _qsize(self, len=len): - return len(self.queue) - - def _put(self, item): - self.queue.append(item) - - def _get(self): - return self.queue.pop() diff --git a/venv/lib/python3.8/site-packages/urllib3/util/request.py b/venv/lib/python3.8/site-packages/urllib3/util/request.py deleted file mode 100644 index 3b7bb54..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/util/request.py +++ /dev/null @@ -1,135 +0,0 @@ -from __future__ import absolute_import -from base64 import b64encode - -from ..packages.six import b, integer_types -from ..exceptions import UnrewindableBodyError - -ACCEPT_ENCODING = "gzip,deflate" -try: - import brotli as _unused_module_brotli # noqa: F401 -except ImportError: - pass -else: - ACCEPT_ENCODING += ",br" - -_FAILEDTELL = object() - - -def make_headers( - keep_alive=None, - accept_encoding=None, - user_agent=None, - basic_auth=None, - proxy_basic_auth=None, - disable_cache=None, -): - """ - Shortcuts for generating request headers. - - :param keep_alive: - If ``True``, adds 'connection: keep-alive' header. - - :param accept_encoding: - Can be a boolean, list, or string. - ``True`` translates to 'gzip,deflate'. - List will get joined by comma. - String will be used as provided. - - :param user_agent: - String representing the user-agent you want, such as - "python-urllib3/0.6" - - :param basic_auth: - Colon-separated username:password string for 'authorization: basic ...' - auth header. - - :param proxy_basic_auth: - Colon-separated username:password string for 'proxy-authorization: basic ...' - auth header. - - :param disable_cache: - If ``True``, adds 'cache-control: no-cache' header. - - Example:: - - >>> make_headers(keep_alive=True, user_agent="Batman/1.0") - {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} - >>> make_headers(accept_encoding=True) - {'accept-encoding': 'gzip,deflate'} - """ - headers = {} - if accept_encoding: - if isinstance(accept_encoding, str): - pass - elif isinstance(accept_encoding, list): - accept_encoding = ",".join(accept_encoding) - else: - accept_encoding = ACCEPT_ENCODING - headers["accept-encoding"] = accept_encoding - - if user_agent: - headers["user-agent"] = user_agent - - if keep_alive: - headers["connection"] = "keep-alive" - - if basic_auth: - headers["authorization"] = "Basic " + b64encode(b(basic_auth)).decode("utf-8") - - if proxy_basic_auth: - headers["proxy-authorization"] = "Basic " + b64encode( - b(proxy_basic_auth) - ).decode("utf-8") - - if disable_cache: - headers["cache-control"] = "no-cache" - - return headers - - -def set_file_position(body, pos): - """ - If a position is provided, move file to that point. - Otherwise, we'll attempt to record a position for future use. - """ - if pos is not None: - rewind_body(body, pos) - elif getattr(body, "tell", None) is not None: - try: - pos = body.tell() - except (IOError, OSError): - # This differentiates from None, allowing us to catch - # a failed `tell()` later when trying to rewind the body. - pos = _FAILEDTELL - - return pos - - -def rewind_body(body, body_pos): - """ - Attempt to rewind body to a certain position. - Primarily used for request redirects and retries. - - :param body: - File-like object that supports seek. - - :param int pos: - Position to seek to in file. - """ - body_seek = getattr(body, "seek", None) - if body_seek is not None and isinstance(body_pos, integer_types): - try: - body_seek(body_pos) - except (IOError, OSError): - raise UnrewindableBodyError( - "An error occurred when rewinding request body for redirect/retry." - ) - elif body_pos is _FAILEDTELL: - raise UnrewindableBodyError( - "Unable to record file position for rewinding " - "request body during a redirect/retry." - ) - else: - raise ValueError( - "body_pos must be of type integer, instead it was %s." % type(body_pos) - ) diff --git a/venv/lib/python3.8/site-packages/urllib3/util/response.py b/venv/lib/python3.8/site-packages/urllib3/util/response.py deleted file mode 100644 index 715868d..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/util/response.py +++ /dev/null @@ -1,86 +0,0 @@ -from __future__ import absolute_import -from ..packages.six.moves import http_client as httplib - -from ..exceptions import HeaderParsingError - - -def is_fp_closed(obj): - """ - Checks whether a given file-like object is closed. - - :param obj: - The file-like object to check. - """ - - try: - # Check `isclosed()` first, in case Python3 doesn't set `closed`. - # GH Issue #928 - return obj.isclosed() - except AttributeError: - pass - - try: - # Check via the official file-like-object way. - return obj.closed - except AttributeError: - pass - - try: - # Check if the object is a container for another file-like object that - # gets released on exhaustion (e.g. HTTPResponse). - return obj.fp is None - except AttributeError: - pass - - raise ValueError("Unable to determine whether fp is closed.") - - -def assert_header_parsing(headers): - """ - Asserts whether all headers have been successfully parsed. - Extracts encountered errors from the result of parsing headers. - - Only works on Python 3. - - :param headers: Headers to verify. - :type headers: `httplib.HTTPMessage`. - - :raises urllib3.exceptions.HeaderParsingError: - If parsing errors are found. - """ - - # This will fail silently if we pass in the wrong kind of parameter. - # To make debugging easier add an explicit check. - if not isinstance(headers, httplib.HTTPMessage): - raise TypeError("expected httplib.Message, got {0}.".format(type(headers))) - - defects = getattr(headers, "defects", None) - get_payload = getattr(headers, "get_payload", None) - - unparsed_data = None - if get_payload: - # get_payload is actually email.message.Message.get_payload; - # we're only interested in the result if it's not a multipart message - if not headers.is_multipart(): - payload = get_payload() - - if isinstance(payload, (bytes, str)): - unparsed_data = payload - - if defects or unparsed_data: - raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) - - -def is_response_to_head(response): - """ - Checks whether the request of a response has been a HEAD-request. - Handles the quirks of AppEngine. - - :param conn: - :type conn: :class:`httplib.HTTPResponse` - """ - # FIXME: Can we do this somehow without accessing private httplib _method? - method = response._method - if isinstance(method, int): # Platform-specific: Appengine - return method == 3 - return method.upper() == "HEAD" diff --git a/venv/lib/python3.8/site-packages/urllib3/util/retry.py b/venv/lib/python3.8/site-packages/urllib3/util/retry.py deleted file mode 100644 index 5a049fe..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/util/retry.py +++ /dev/null @@ -1,450 +0,0 @@ -from __future__ import absolute_import -import time -import logging -from collections import namedtuple -from itertools import takewhile -import email -import re - -from ..exceptions import ( - ConnectTimeoutError, - MaxRetryError, - ProtocolError, - ReadTimeoutError, - ResponseError, - InvalidHeader, -) -from ..packages import six - - -log = logging.getLogger(__name__) - - -# Data structure for representing the metadata of requests that result in a retry. -RequestHistory = namedtuple( - "RequestHistory", ["method", "url", "error", "status", "redirect_location"] -) - - -class Retry(object): - """ Retry configuration. - - Each retry attempt will create a new Retry object with updated values, so - they can be safely reused. - - Retries can be defined as a default for a pool:: - - retries = Retry(connect=5, read=2, redirect=5) - http = PoolManager(retries=retries) - response = http.request('GET', 'http://example.com/') - - Or per-request (which overrides the default for the pool):: - - response = http.request('GET', 'http://example.com/', retries=Retry(10)) - - Retries can be disabled by passing ``False``:: - - response = http.request('GET', 'http://example.com/', retries=False) - - Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless - retries are disabled, in which case the causing exception will be raised. - - :param int total: - Total number of retries to allow. Takes precedence over other counts. - - Set to ``None`` to remove this constraint and fall back on other - counts. It's a good idea to set this to some sensibly-high value to - account for unexpected edge cases and avoid infinite retry loops. - - Set to ``0`` to fail on the first retry. - - Set to ``False`` to disable and imply ``raise_on_redirect=False``. - - :param int connect: - How many connection-related errors to retry on. - - These are errors raised before the request is sent to the remote server, - which we assume has not triggered the server to process the request. - - Set to ``0`` to fail on the first retry of this type. - - :param int read: - How many times to retry on read errors. - - These errors are raised after the request was sent to the server, so the - request may have side-effects. - - Set to ``0`` to fail on the first retry of this type. - - :param int redirect: - How many redirects to perform. Limit this to avoid infinite redirect - loops. - - A redirect is a HTTP response with a status code 301, 302, 303, 307 or - 308. - - Set to ``0`` to fail on the first retry of this type. - - Set to ``False`` to disable and imply ``raise_on_redirect=False``. - - :param int status: - How many times to retry on bad status codes. - - These are retries made on responses, where status code matches - ``status_forcelist``. - - Set to ``0`` to fail on the first retry of this type. - - :param iterable method_whitelist: - Set of uppercased HTTP method verbs that we should retry on. - - By default, we only retry on methods which are considered to be - idempotent (multiple requests with the same parameters end with the - same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`. - - Set to a ``False`` value to retry on any verb. - - :param iterable status_forcelist: - A set of integer HTTP status codes that we should force a retry on. - A retry is initiated if the request method is in ``method_whitelist`` - and the response status code is in ``status_forcelist``. - - By default, this is disabled with ``None``. - - :param float backoff_factor: - A backoff factor to apply between attempts after the second try - (most errors are resolved immediately by a second try without a - delay). urllib3 will sleep for:: - - {backoff factor} * (2 ** ({number of total retries} - 1)) - - seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep - for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer - than :attr:`Retry.BACKOFF_MAX`. - - By default, backoff is disabled (set to 0). - - :param bool raise_on_redirect: Whether, if the number of redirects is - exhausted, to raise a MaxRetryError, or to return a response with a - response code in the 3xx range. - - :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: - whether we should raise an exception, or return a response, - if status falls in ``status_forcelist`` range and retries have - been exhausted. - - :param tuple history: The history of the request encountered during - each call to :meth:`~Retry.increment`. The list is in the order - the requests occurred. Each list item is of class :class:`RequestHistory`. - - :param bool respect_retry_after_header: - Whether to respect Retry-After header on status codes defined as - :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. - - :param iterable remove_headers_on_redirect: - Sequence of headers to remove from the request when a response - indicating a redirect is returned before firing off the redirected - request. - """ - - DEFAULT_METHOD_WHITELIST = frozenset( - ["HEAD", "GET", "PUT", "DELETE", "OPTIONS", "TRACE"] - ) - - RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) - - DEFAULT_REDIRECT_HEADERS_BLACKLIST = frozenset(["Authorization"]) - - #: Maximum backoff time. - BACKOFF_MAX = 120 - - def __init__( - self, - total=10, - connect=None, - read=None, - redirect=None, - status=None, - method_whitelist=DEFAULT_METHOD_WHITELIST, - status_forcelist=None, - backoff_factor=0, - raise_on_redirect=True, - raise_on_status=True, - history=None, - respect_retry_after_header=True, - remove_headers_on_redirect=DEFAULT_REDIRECT_HEADERS_BLACKLIST, - ): - - self.total = total - self.connect = connect - self.read = read - self.status = status - - if redirect is False or total is False: - redirect = 0 - raise_on_redirect = False - - self.redirect = redirect - self.status_forcelist = status_forcelist or set() - self.method_whitelist = method_whitelist - self.backoff_factor = backoff_factor - self.raise_on_redirect = raise_on_redirect - self.raise_on_status = raise_on_status - self.history = history or tuple() - self.respect_retry_after_header = respect_retry_after_header - self.remove_headers_on_redirect = frozenset( - [h.lower() for h in remove_headers_on_redirect] - ) - - def new(self, **kw): - params = dict( - total=self.total, - connect=self.connect, - read=self.read, - redirect=self.redirect, - status=self.status, - method_whitelist=self.method_whitelist, - status_forcelist=self.status_forcelist, - backoff_factor=self.backoff_factor, - raise_on_redirect=self.raise_on_redirect, - raise_on_status=self.raise_on_status, - history=self.history, - remove_headers_on_redirect=self.remove_headers_on_redirect, - respect_retry_after_header=self.respect_retry_after_header, - ) - params.update(kw) - return type(self)(**params) - - @classmethod - def from_int(cls, retries, redirect=True, default=None): - """ Backwards-compatibility for the old retries format.""" - if retries is None: - retries = default if default is not None else cls.DEFAULT - - if isinstance(retries, Retry): - return retries - - redirect = bool(redirect) and None - new_retries = cls(retries, redirect=redirect) - log.debug("Converted retries value: %r -> %r", retries, new_retries) - return new_retries - - def get_backoff_time(self): - """ Formula for computing the current backoff - - :rtype: float - """ - # We want to consider only the last consecutive errors sequence (Ignore redirects). - consecutive_errors_len = len( - list( - takewhile(lambda x: x.redirect_location is None, reversed(self.history)) - ) - ) - if consecutive_errors_len <= 1: - return 0 - - backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) - return min(self.BACKOFF_MAX, backoff_value) - - def parse_retry_after(self, retry_after): - # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 - if re.match(r"^\s*[0-9]+\s*$", retry_after): - seconds = int(retry_after) - else: - retry_date_tuple = email.utils.parsedate(retry_after) - if retry_date_tuple is None: - raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) - retry_date = time.mktime(retry_date_tuple) - seconds = retry_date - time.time() - - if seconds < 0: - seconds = 0 - - return seconds - - def get_retry_after(self, response): - """ Get the value of Retry-After in seconds. """ - - retry_after = response.getheader("Retry-After") - - if retry_after is None: - return None - - return self.parse_retry_after(retry_after) - - def sleep_for_retry(self, response=None): - retry_after = self.get_retry_after(response) - if retry_after: - time.sleep(retry_after) - return True - - return False - - def _sleep_backoff(self): - backoff = self.get_backoff_time() - if backoff <= 0: - return - time.sleep(backoff) - - def sleep(self, response=None): - """ Sleep between retry attempts. - - This method will respect a server's ``Retry-After`` response header - and sleep the duration of the time requested. If that is not present, it - will use an exponential backoff. By default, the backoff factor is 0 and - this method will return immediately. - """ - - if self.respect_retry_after_header and response: - slept = self.sleep_for_retry(response) - if slept: - return - - self._sleep_backoff() - - def _is_connection_error(self, err): - """ Errors when we're fairly sure that the server did not receive the - request, so it should be safe to retry. - """ - return isinstance(err, ConnectTimeoutError) - - def _is_read_error(self, err): - """ Errors that occur after the request has been started, so we should - assume that the server began processing it. - """ - return isinstance(err, (ReadTimeoutError, ProtocolError)) - - def _is_method_retryable(self, method): - """ Checks if a given HTTP method should be retried upon, depending if - it is included on the method whitelist. - """ - if self.method_whitelist and method.upper() not in self.method_whitelist: - return False - - return True - - def is_retry(self, method, status_code, has_retry_after=False): - """ Is this method/status code retryable? (Based on whitelists and control - variables such as the number of total retries to allow, whether to - respect the Retry-After header, whether this header is present, and - whether the returned status code is on the list of status codes to - be retried upon on the presence of the aforementioned header) - """ - if not self._is_method_retryable(method): - return False - - if self.status_forcelist and status_code in self.status_forcelist: - return True - - return ( - self.total - and self.respect_retry_after_header - and has_retry_after - and (status_code in self.RETRY_AFTER_STATUS_CODES) - ) - - def is_exhausted(self): - """ Are we out of retries? """ - retry_counts = (self.total, self.connect, self.read, self.redirect, self.status) - retry_counts = list(filter(None, retry_counts)) - if not retry_counts: - return False - - return min(retry_counts) < 0 - - def increment( - self, - method=None, - url=None, - response=None, - error=None, - _pool=None, - _stacktrace=None, - ): - """ Return a new Retry object with incremented retry counters. - - :param response: A response object, or None, if the server did not - return a response. - :type response: :class:`~urllib3.response.HTTPResponse` - :param Exception error: An error encountered during the request, or - None if the response was received successfully. - - :return: A new ``Retry`` object. - """ - if self.total is False and error: - # Disabled, indicate to re-raise the error. - raise six.reraise(type(error), error, _stacktrace) - - total = self.total - if total is not None: - total -= 1 - - connect = self.connect - read = self.read - redirect = self.redirect - status_count = self.status - cause = "unknown" - status = None - redirect_location = None - - if error and self._is_connection_error(error): - # Connect retry? - if connect is False: - raise six.reraise(type(error), error, _stacktrace) - elif connect is not None: - connect -= 1 - - elif error and self._is_read_error(error): - # Read retry? - if read is False or not self._is_method_retryable(method): - raise six.reraise(type(error), error, _stacktrace) - elif read is not None: - read -= 1 - - elif response and response.get_redirect_location(): - # Redirect retry? - if redirect is not None: - redirect -= 1 - cause = "too many redirects" - redirect_location = response.get_redirect_location() - status = response.status - - else: - # Incrementing because of a server error like a 500 in - # status_forcelist and a the given method is in the whitelist - cause = ResponseError.GENERIC_ERROR - if response and response.status: - if status_count is not None: - status_count -= 1 - cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status) - status = response.status - - history = self.history + ( - RequestHistory(method, url, error, status, redirect_location), - ) - - new_retry = self.new( - total=total, - connect=connect, - read=read, - redirect=redirect, - status=status_count, - history=history, - ) - - if new_retry.is_exhausted(): - raise MaxRetryError(_pool, url, error or ResponseError(cause)) - - log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) - - return new_retry - - def __repr__(self): - return ( - "{cls.__name__}(total={self.total}, connect={self.connect}, " - "read={self.read}, redirect={self.redirect}, status={self.status})" - ).format(cls=type(self), self=self) - - -# For backwards compatibility (equivalent to pre-v1.9): -Retry.DEFAULT = Retry(3) diff --git a/venv/lib/python3.8/site-packages/urllib3/util/ssl_.py b/venv/lib/python3.8/site-packages/urllib3/util/ssl_.py deleted file mode 100644 index 5b363d7..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/util/ssl_.py +++ /dev/null @@ -1,407 +0,0 @@ -from __future__ import absolute_import -import errno -import warnings -import hmac -import sys - -from binascii import hexlify, unhexlify -from hashlib import md5, sha1, sha256 - -from .url import IPV4_RE, BRACELESS_IPV6_ADDRZ_RE -from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning -from ..packages import six - - -SSLContext = None -HAS_SNI = False -IS_PYOPENSSL = False -IS_SECURETRANSPORT = False - -# Maps the length of a digest to a possible hash function producing this digest -HASHFUNC_MAP = {32: md5, 40: sha1, 64: sha256} - - -def _const_compare_digest_backport(a, b): - """ - Compare two digests of equal length in constant time. - - The digests must be of type str/bytes. - Returns True if the digests match, and False otherwise. - """ - result = abs(len(a) - len(b)) - for l, r in zip(bytearray(a), bytearray(b)): - result |= l ^ r - return result == 0 - - -_const_compare_digest = getattr(hmac, "compare_digest", _const_compare_digest_backport) - -try: # Test for SSL features - import ssl - from ssl import wrap_socket, CERT_REQUIRED - from ssl import HAS_SNI # Has SNI? -except ImportError: - pass - -try: # Platform-specific: Python 3.6 - from ssl import PROTOCOL_TLS - - PROTOCOL_SSLv23 = PROTOCOL_TLS -except ImportError: - try: - from ssl import PROTOCOL_SSLv23 as PROTOCOL_TLS - - PROTOCOL_SSLv23 = PROTOCOL_TLS - except ImportError: - PROTOCOL_SSLv23 = PROTOCOL_TLS = 2 - - -try: - from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION -except ImportError: - OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 - OP_NO_COMPRESSION = 0x20000 - - -# A secure default. -# Sources for more information on TLS ciphers: -# -# - https://wiki.mozilla.org/Security/Server_Side_TLS -# - https://www.ssllabs.com/projects/best-practices/index.html -# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ -# -# The general intent is: -# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), -# - prefer ECDHE over DHE for better performance, -# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and -# security, -# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, -# - disable NULL authentication, MD5 MACs, DSS, and other -# insecure ciphers for security reasons. -# - NOTE: TLS 1.3 cipher suites are managed through a different interface -# not exposed by CPython (yet!) and are enabled by default if they're available. -DEFAULT_CIPHERS = ":".join( - [ - "ECDHE+AESGCM", - "ECDHE+CHACHA20", - "DHE+AESGCM", - "DHE+CHACHA20", - "ECDH+AESGCM", - "DH+AESGCM", - "ECDH+AES", - "DH+AES", - "RSA+AESGCM", - "RSA+AES", - "!aNULL", - "!eNULL", - "!MD5", - "!DSS", - ] -) - -try: - from ssl import SSLContext # Modern SSL? -except ImportError: - - class SSLContext(object): # Platform-specific: Python 2 - def __init__(self, protocol_version): - self.protocol = protocol_version - # Use default values from a real SSLContext - self.check_hostname = False - self.verify_mode = ssl.CERT_NONE - self.ca_certs = None - self.options = 0 - self.certfile = None - self.keyfile = None - self.ciphers = None - - def load_cert_chain(self, certfile, keyfile): - self.certfile = certfile - self.keyfile = keyfile - - def load_verify_locations(self, cafile=None, capath=None): - self.ca_certs = cafile - - if capath is not None: - raise SSLError("CA directories not supported in older Pythons") - - def set_ciphers(self, cipher_suite): - self.ciphers = cipher_suite - - def wrap_socket(self, socket, server_hostname=None, server_side=False): - warnings.warn( - "A true SSLContext object is not available. This prevents " - "urllib3 from configuring SSL appropriately and may cause " - "certain SSL connections to fail. You can upgrade to a newer " - "version of Python to solve this. For more information, see " - "https://urllib3.readthedocs.io/en/latest/advanced-usage.html" - "#ssl-warnings", - InsecurePlatformWarning, - ) - kwargs = { - "keyfile": self.keyfile, - "certfile": self.certfile, - "ca_certs": self.ca_certs, - "cert_reqs": self.verify_mode, - "ssl_version": self.protocol, - "server_side": server_side, - } - return wrap_socket(socket, ciphers=self.ciphers, **kwargs) - - -def assert_fingerprint(cert, fingerprint): - """ - Checks if given fingerprint matches the supplied certificate. - - :param cert: - Certificate as bytes object. - :param fingerprint: - Fingerprint as string of hexdigits, can be interspersed by colons. - """ - - fingerprint = fingerprint.replace(":", "").lower() - digest_length = len(fingerprint) - hashfunc = HASHFUNC_MAP.get(digest_length) - if not hashfunc: - raise SSLError("Fingerprint of invalid length: {0}".format(fingerprint)) - - # We need encode() here for py32; works on py2 and p33. - fingerprint_bytes = unhexlify(fingerprint.encode()) - - cert_digest = hashfunc(cert).digest() - - if not _const_compare_digest(cert_digest, fingerprint_bytes): - raise SSLError( - 'Fingerprints did not match. Expected "{0}", got "{1}".'.format( - fingerprint, hexlify(cert_digest) - ) - ) - - -def resolve_cert_reqs(candidate): - """ - Resolves the argument to a numeric constant, which can be passed to - the wrap_socket function/method from the ssl module. - Defaults to :data:`ssl.CERT_REQUIRED`. - If given a string it is assumed to be the name of the constant in the - :mod:`ssl` module or its abbreviation. - (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. - If it's neither `None` nor a string we assume it is already the numeric - constant which can directly be passed to wrap_socket. - """ - if candidate is None: - return CERT_REQUIRED - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, "CERT_" + candidate) - return res - - return candidate - - -def resolve_ssl_version(candidate): - """ - like resolve_cert_reqs - """ - if candidate is None: - return PROTOCOL_TLS - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, "PROTOCOL_" + candidate) - return res - - return candidate - - -def create_urllib3_context( - ssl_version=None, cert_reqs=None, options=None, ciphers=None -): - """All arguments have the same meaning as ``ssl_wrap_socket``. - - By default, this function does a lot of the same work that - ``ssl.create_default_context`` does on Python 3.4+. It: - - - Disables SSLv2, SSLv3, and compression - - Sets a restricted set of server ciphers - - If you wish to enable SSLv3, you can do:: - - from urllib3.util import ssl_ - context = ssl_.create_urllib3_context() - context.options &= ~ssl_.OP_NO_SSLv3 - - You can do the same to enable compression (substituting ``COMPRESSION`` - for ``SSLv3`` in the last line above). - - :param ssl_version: - The desired protocol version to use. This will default to - PROTOCOL_SSLv23 which will negotiate the highest protocol that both - the server and your installation of OpenSSL support. - :param cert_reqs: - Whether to require the certificate verification. This defaults to - ``ssl.CERT_REQUIRED``. - :param options: - Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, - ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. - :param ciphers: - Which cipher suites to allow the server to select. - :returns: - Constructed SSLContext object with specified options - :rtype: SSLContext - """ - context = SSLContext(ssl_version or PROTOCOL_TLS) - - context.set_ciphers(ciphers or DEFAULT_CIPHERS) - - # Setting the default here, as we may have no ssl module on import - cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs - - if options is None: - options = 0 - # SSLv2 is easily broken and is considered harmful and dangerous - options |= OP_NO_SSLv2 - # SSLv3 has several problems and is now dangerous - options |= OP_NO_SSLv3 - # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ - # (issue #309) - options |= OP_NO_COMPRESSION - - context.options |= options - - # Enable post-handshake authentication for TLS 1.3, see GH #1634. PHA is - # necessary for conditional client cert authentication with TLS 1.3. - # The attribute is None for OpenSSL <= 1.1.0 or does not exist in older - # versions of Python. We only enable on Python 3.7.4+ or if certificate - # verification is enabled to work around Python issue #37428 - # See: https://bugs.python.org/issue37428 - if (cert_reqs == ssl.CERT_REQUIRED or sys.version_info >= (3, 7, 4)) and getattr( - context, "post_handshake_auth", None - ) is not None: - context.post_handshake_auth = True - - context.verify_mode = cert_reqs - if ( - getattr(context, "check_hostname", None) is not None - ): # Platform-specific: Python 3.2 - # We do our own verification, including fingerprints and alternative - # hostnames. So disable it here - context.check_hostname = False - return context - - -def ssl_wrap_socket( - sock, - keyfile=None, - certfile=None, - cert_reqs=None, - ca_certs=None, - server_hostname=None, - ssl_version=None, - ciphers=None, - ssl_context=None, - ca_cert_dir=None, - key_password=None, -): - """ - All arguments except for server_hostname, ssl_context, and ca_cert_dir have - the same meaning as they do when using :func:`ssl.wrap_socket`. - - :param server_hostname: - When SNI is supported, the expected hostname of the certificate - :param ssl_context: - A pre-made :class:`SSLContext` object. If none is provided, one will - be created using :func:`create_urllib3_context`. - :param ciphers: - A string of ciphers we wish the client to support. - :param ca_cert_dir: - A directory containing CA certificates in multiple separate files, as - supported by OpenSSL's -CApath flag or the capath argument to - SSLContext.load_verify_locations(). - :param key_password: - Optional password if the keyfile is encrypted. - """ - context = ssl_context - if context is None: - # Note: This branch of code and all the variables in it are no longer - # used by urllib3 itself. We should consider deprecating and removing - # this code. - context = create_urllib3_context(ssl_version, cert_reqs, ciphers=ciphers) - - if ca_certs or ca_cert_dir: - try: - context.load_verify_locations(ca_certs, ca_cert_dir) - except IOError as e: # Platform-specific: Python 2.7 - raise SSLError(e) - # Py33 raises FileNotFoundError which subclasses OSError - # These are not equivalent unless we check the errno attribute - except OSError as e: # Platform-specific: Python 3.3 and beyond - if e.errno == errno.ENOENT: - raise SSLError(e) - raise - - elif ssl_context is None and hasattr(context, "load_default_certs"): - # try to load OS default certs; works well on Windows (require Python3.4+) - context.load_default_certs() - - # Attempt to detect if we get the goofy behavior of the - # keyfile being encrypted and OpenSSL asking for the - # passphrase via the terminal and instead error out. - if keyfile and key_password is None and _is_key_file_encrypted(keyfile): - raise SSLError("Client private key is encrypted, password is required") - - if certfile: - if key_password is None: - context.load_cert_chain(certfile, keyfile) - else: - context.load_cert_chain(certfile, keyfile, key_password) - - # If we detect server_hostname is an IP address then the SNI - # extension should not be used according to RFC3546 Section 3.1 - # We shouldn't warn the user if SNI isn't available but we would - # not be using SNI anyways due to IP address for server_hostname. - if ( - server_hostname is not None and not is_ipaddress(server_hostname) - ) or IS_SECURETRANSPORT: - if HAS_SNI and server_hostname is not None: - return context.wrap_socket(sock, server_hostname=server_hostname) - - warnings.warn( - "An HTTPS request has been made, but the SNI (Server Name " - "Indication) extension to TLS is not available on this platform. " - "This may cause the server to present an incorrect TLS " - "certificate, which can cause validation failures. You can upgrade to " - "a newer version of Python to solve this. For more information, see " - "https://urllib3.readthedocs.io/en/latest/advanced-usage.html" - "#ssl-warnings", - SNIMissingWarning, - ) - - return context.wrap_socket(sock) - - -def is_ipaddress(hostname): - """Detects whether the hostname given is an IPv4 or IPv6 address. - Also detects IPv6 addresses with Zone IDs. - - :param str hostname: Hostname to examine. - :return: True if the hostname is an IP address, False otherwise. - """ - if not six.PY2 and isinstance(hostname, bytes): - # IDN A-label bytes are ASCII compatible. - hostname = hostname.decode("ascii") - return bool(IPV4_RE.match(hostname) or BRACELESS_IPV6_ADDRZ_RE.match(hostname)) - - -def _is_key_file_encrypted(key_file): - """Detects if a key file is encrypted or not.""" - with open(key_file, "r") as f: - for line in f: - # Look for Proc-Type: 4,ENCRYPTED - if "ENCRYPTED" in line: - return True - - return False diff --git a/venv/lib/python3.8/site-packages/urllib3/util/timeout.py b/venv/lib/python3.8/site-packages/urllib3/util/timeout.py deleted file mode 100644 index 9883700..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/util/timeout.py +++ /dev/null @@ -1,258 +0,0 @@ -from __future__ import absolute_import - -# The default socket timeout, used by httplib to indicate that no timeout was -# specified by the user -from socket import _GLOBAL_DEFAULT_TIMEOUT -import time - -from ..exceptions import TimeoutStateError - -# A sentinel value to indicate that no timeout was specified by the user in -# urllib3 -_Default = object() - - -# Use time.monotonic if available. -current_time = getattr(time, "monotonic", time.time) - - -class Timeout(object): - """ Timeout configuration. - - Timeouts can be defined as a default for a pool:: - - timeout = Timeout(connect=2.0, read=7.0) - http = PoolManager(timeout=timeout) - response = http.request('GET', 'http://example.com/') - - Or per-request (which overrides the default for the pool):: - - response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) - - Timeouts can be disabled by setting all the parameters to ``None``:: - - no_timeout = Timeout(connect=None, read=None) - response = http.request('GET', 'http://example.com/, timeout=no_timeout) - - - :param total: - This combines the connect and read timeouts into one; the read timeout - will be set to the time leftover from the connect attempt. In the - event that both a connect timeout and a total are specified, or a read - timeout and a total are specified, the shorter timeout will be applied. - - Defaults to None. - - :type total: integer, float, or None - - :param connect: - The maximum amount of time (in seconds) to wait for a connection - attempt to a server to succeed. Omitting the parameter will default the - connect timeout to the system default, probably `the global default - timeout in socket.py - <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. - None will set an infinite timeout for connection attempts. - - :type connect: integer, float, or None - - :param read: - The maximum amount of time (in seconds) to wait between consecutive - read operations for a response from the server. Omitting the parameter - will default the read timeout to the system default, probably `the - global default timeout in socket.py - <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. - None will set an infinite timeout. - - :type read: integer, float, or None - - .. note:: - - Many factors can affect the total amount of time for urllib3 to return - an HTTP response. - - For example, Python's DNS resolver does not obey the timeout specified - on the socket. Other factors that can affect total request time include - high CPU load, high swap, the program running at a low priority level, - or other behaviors. - - In addition, the read and total timeouts only measure the time between - read operations on the socket connecting the client and the server, - not the total amount of time for the request to return a complete - response. For most requests, the timeout is raised because the server - has not sent the first byte in the specified time. This is not always - the case; if a server streams one byte every fifteen seconds, a timeout - of 20 seconds will not trigger, even though the request will take - several minutes to complete. - - If your goal is to cut off any request after a set amount of wall clock - time, consider having a second "watcher" thread to cut off a slow - request. - """ - - #: A sentinel object representing the default timeout value - DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT - - def __init__(self, total=None, connect=_Default, read=_Default): - self._connect = self._validate_timeout(connect, "connect") - self._read = self._validate_timeout(read, "read") - self.total = self._validate_timeout(total, "total") - self._start_connect = None - - def __str__(self): - return "%s(connect=%r, read=%r, total=%r)" % ( - type(self).__name__, - self._connect, - self._read, - self.total, - ) - - @classmethod - def _validate_timeout(cls, value, name): - """ Check that a timeout attribute is valid. - - :param value: The timeout value to validate - :param name: The name of the timeout attribute to validate. This is - used to specify in error messages. - :return: The validated and casted version of the given value. - :raises ValueError: If it is a numeric value less than or equal to - zero, or the type is not an integer, float, or None. - """ - if value is _Default: - return cls.DEFAULT_TIMEOUT - - if value is None or value is cls.DEFAULT_TIMEOUT: - return value - - if isinstance(value, bool): - raise ValueError( - "Timeout cannot be a boolean value. It must " - "be an int, float or None." - ) - try: - float(value) - except (TypeError, ValueError): - raise ValueError( - "Timeout value %s was %s, but it must be an " - "int, float or None." % (name, value) - ) - - try: - if value <= 0: - raise ValueError( - "Attempted to set %s timeout to %s, but the " - "timeout cannot be set to a value less " - "than or equal to 0." % (name, value) - ) - except TypeError: - # Python 3 - raise ValueError( - "Timeout value %s was %s, but it must be an " - "int, float or None." % (name, value) - ) - - return value - - @classmethod - def from_float(cls, timeout): - """ Create a new Timeout from a legacy timeout value. - - The timeout value used by httplib.py sets the same timeout on the - connect(), and recv() socket requests. This creates a :class:`Timeout` - object that sets the individual timeouts to the ``timeout`` value - passed to this function. - - :param timeout: The legacy timeout value. - :type timeout: integer, float, sentinel default object, or None - :return: Timeout object - :rtype: :class:`Timeout` - """ - return Timeout(read=timeout, connect=timeout) - - def clone(self): - """ Create a copy of the timeout object - - Timeout properties are stored per-pool but each request needs a fresh - Timeout object to ensure each one has its own start/stop configured. - - :return: a copy of the timeout object - :rtype: :class:`Timeout` - """ - # We can't use copy.deepcopy because that will also create a new object - # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to - # detect the user default. - return Timeout(connect=self._connect, read=self._read, total=self.total) - - def start_connect(self): - """ Start the timeout clock, used during a connect() attempt - - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to start a timer that has been started already. - """ - if self._start_connect is not None: - raise TimeoutStateError("Timeout timer has already been started.") - self._start_connect = current_time() - return self._start_connect - - def get_connect_duration(self): - """ Gets the time elapsed since the call to :meth:`start_connect`. - - :return: Elapsed time in seconds. - :rtype: float - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to get duration for a timer that hasn't been started. - """ - if self._start_connect is None: - raise TimeoutStateError( - "Can't get connect duration for timer that has not started." - ) - return current_time() - self._start_connect - - @property - def connect_timeout(self): - """ Get the value to use when setting a connection timeout. - - This will be a positive float or integer, the value None - (never timeout), or the default system timeout. - - :return: Connect timeout. - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - """ - if self.total is None: - return self._connect - - if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: - return self.total - - return min(self._connect, self.total) - - @property - def read_timeout(self): - """ Get the value for the read timeout. - - This assumes some time has elapsed in the connection timeout and - computes the read timeout appropriately. - - If self.total is set, the read timeout is dependent on the amount of - time taken by the connect timeout. If the connection time has not been - established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be - raised. - - :return: Value to use for the read timeout. - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` - has not yet been called on this object. - """ - if ( - self.total is not None - and self.total is not self.DEFAULT_TIMEOUT - and self._read is not None - and self._read is not self.DEFAULT_TIMEOUT - ): - # In case the connect timeout has not yet been established. - if self._start_connect is None: - return self._read - return max(0, min(self.total - self.get_connect_duration(), self._read)) - elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: - return max(0, self.total - self.get_connect_duration()) - else: - return self._read diff --git a/venv/lib/python3.8/site-packages/urllib3/util/url.py b/venv/lib/python3.8/site-packages/urllib3/util/url.py deleted file mode 100644 index 8ef5a23..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/util/url.py +++ /dev/null @@ -1,430 +0,0 @@ -from __future__ import absolute_import -import re -from collections import namedtuple - -from ..exceptions import LocationParseError -from ..packages import six - - -url_attrs = ["scheme", "auth", "host", "port", "path", "query", "fragment"] - -# We only want to normalize urls with an HTTP(S) scheme. -# urllib3 infers URLs without a scheme (None) to be http. -NORMALIZABLE_SCHEMES = ("http", "https", None) - -# Almost all of these patterns were derived from the -# 'rfc3986' module: https://github.com/python-hyper/rfc3986 -PERCENT_RE = re.compile(r"%[a-fA-F0-9]{2}") -SCHEME_RE = re.compile(r"^(?:[a-zA-Z][a-zA-Z0-9+-]*:|/)") -URI_RE = re.compile( - r"^(?:([a-zA-Z][a-zA-Z0-9+.-]*):)?" - r"(?://([^/?#]*))?" - r"([^?#]*)" - r"(?:\?([^#]*))?" - r"(?:#(.*))?$", - re.UNICODE | re.DOTALL, -) - -IPV4_PAT = r"(?:[0-9]{1,3}\.){3}[0-9]{1,3}" -HEX_PAT = "[0-9A-Fa-f]{1,4}" -LS32_PAT = "(?:{hex}:{hex}|{ipv4})".format(hex=HEX_PAT, ipv4=IPV4_PAT) -_subs = {"hex": HEX_PAT, "ls32": LS32_PAT} -_variations = [ - # 6( h16 ":" ) ls32 - "(?:%(hex)s:){6}%(ls32)s", - # "::" 5( h16 ":" ) ls32 - "::(?:%(hex)s:){5}%(ls32)s", - # [ h16 ] "::" 4( h16 ":" ) ls32 - "(?:%(hex)s)?::(?:%(hex)s:){4}%(ls32)s", - # [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 - "(?:(?:%(hex)s:)?%(hex)s)?::(?:%(hex)s:){3}%(ls32)s", - # [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 - "(?:(?:%(hex)s:){0,2}%(hex)s)?::(?:%(hex)s:){2}%(ls32)s", - # [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 - "(?:(?:%(hex)s:){0,3}%(hex)s)?::%(hex)s:%(ls32)s", - # [ *4( h16 ":" ) h16 ] "::" ls32 - "(?:(?:%(hex)s:){0,4}%(hex)s)?::%(ls32)s", - # [ *5( h16 ":" ) h16 ] "::" h16 - "(?:(?:%(hex)s:){0,5}%(hex)s)?::%(hex)s", - # [ *6( h16 ":" ) h16 ] "::" - "(?:(?:%(hex)s:){0,6}%(hex)s)?::", -] - -UNRESERVED_PAT = r"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._!\-~" -IPV6_PAT = "(?:" + "|".join([x % _subs for x in _variations]) + ")" -ZONE_ID_PAT = "(?:%25|%)(?:[" + UNRESERVED_PAT + "]|%[a-fA-F0-9]{2})+" -IPV6_ADDRZ_PAT = r"\[" + IPV6_PAT + r"(?:" + ZONE_ID_PAT + r")?\]" -REG_NAME_PAT = r"(?:[^\[\]%:/?#]|%[a-fA-F0-9]{2})*" -TARGET_RE = re.compile(r"^(/[^?#]*)(?:\?([^#]*))?(?:#.*)?$") - -IPV4_RE = re.compile("^" + IPV4_PAT + "$") -IPV6_RE = re.compile("^" + IPV6_PAT + "$") -IPV6_ADDRZ_RE = re.compile("^" + IPV6_ADDRZ_PAT + "$") -BRACELESS_IPV6_ADDRZ_RE = re.compile("^" + IPV6_ADDRZ_PAT[2:-2] + "$") -ZONE_ID_RE = re.compile("(" + ZONE_ID_PAT + r")\]$") - -SUBAUTHORITY_PAT = (u"^(?:(.*)@)?(%s|%s|%s)(?::([0-9]{0,5}))?$") % ( - REG_NAME_PAT, - IPV4_PAT, - IPV6_ADDRZ_PAT, -) -SUBAUTHORITY_RE = re.compile(SUBAUTHORITY_PAT, re.UNICODE | re.DOTALL) - -UNRESERVED_CHARS = set( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-~" -) -SUB_DELIM_CHARS = set("!$&'()*+,;=") -USERINFO_CHARS = UNRESERVED_CHARS | SUB_DELIM_CHARS | {":"} -PATH_CHARS = USERINFO_CHARS | {"@", "/"} -QUERY_CHARS = FRAGMENT_CHARS = PATH_CHARS | {"?"} - - -class Url(namedtuple("Url", url_attrs)): - """ - Data structure for representing an HTTP URL. Used as a return value for - :func:`parse_url`. Both the scheme and host are normalized as they are - both case-insensitive according to RFC 3986. - """ - - __slots__ = () - - def __new__( - cls, - scheme=None, - auth=None, - host=None, - port=None, - path=None, - query=None, - fragment=None, - ): - if path and not path.startswith("/"): - path = "/" + path - if scheme is not None: - scheme = scheme.lower() - return super(Url, cls).__new__( - cls, scheme, auth, host, port, path, query, fragment - ) - - @property - def hostname(self): - """For backwards-compatibility with urlparse. We're nice like that.""" - return self.host - - @property - def request_uri(self): - """Absolute path including the query string.""" - uri = self.path or "/" - - if self.query is not None: - uri += "?" + self.query - - return uri - - @property - def netloc(self): - """Network location including host and port""" - if self.port: - return "%s:%d" % (self.host, self.port) - return self.host - - @property - def url(self): - """ - Convert self into a url - - This function should more or less round-trip with :func:`.parse_url`. The - returned url may not be exactly the same as the url inputted to - :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls - with a blank port will have : removed). - - Example: :: - - >>> U = parse_url('http://google.com/mail/') - >>> U.url - 'http://google.com/mail/' - >>> Url('http', 'username:password', 'host.com', 80, - ... '/path', 'query', 'fragment').url - 'http://username:password@host.com:80/path?query#fragment' - """ - scheme, auth, host, port, path, query, fragment = self - url = u"" - - # We use "is not None" we want things to happen with empty strings (or 0 port) - if scheme is not None: - url += scheme + u"://" - if auth is not None: - url += auth + u"@" - if host is not None: - url += host - if port is not None: - url += u":" + str(port) - if path is not None: - url += path - if query is not None: - url += u"?" + query - if fragment is not None: - url += u"#" + fragment - - return url - - def __str__(self): - return self.url - - -def split_first(s, delims): - """ - .. deprecated:: 1.25 - - Given a string and an iterable of delimiters, split on the first found - delimiter. Return two split parts and the matched delimiter. - - If not found, then the first part is the full input string. - - Example:: - - >>> split_first('foo/bar?baz', '?/=') - ('foo', 'bar?baz', '/') - >>> split_first('foo/bar?baz', '123') - ('foo/bar?baz', '', None) - - Scales linearly with number of delims. Not ideal for large number of delims. - """ - min_idx = None - min_delim = None - for d in delims: - idx = s.find(d) - if idx < 0: - continue - - if min_idx is None or idx < min_idx: - min_idx = idx - min_delim = d - - if min_idx is None or min_idx < 0: - return s, "", None - - return s[:min_idx], s[min_idx + 1 :], min_delim - - -def _encode_invalid_chars(component, allowed_chars, encoding="utf-8"): - """Percent-encodes a URI component without reapplying - onto an already percent-encoded component. - """ - if component is None: - return component - - component = six.ensure_text(component) - - # Normalize existing percent-encoded bytes. - # Try to see if the component we're encoding is already percent-encoded - # so we can skip all '%' characters but still encode all others. - component, percent_encodings = PERCENT_RE.subn( - lambda match: match.group(0).upper(), component - ) - - uri_bytes = component.encode("utf-8", "surrogatepass") - is_percent_encoded = percent_encodings == uri_bytes.count(b"%") - encoded_component = bytearray() - - for i in range(0, len(uri_bytes)): - # Will return a single character bytestring on both Python 2 & 3 - byte = uri_bytes[i : i + 1] - byte_ord = ord(byte) - if (is_percent_encoded and byte == b"%") or ( - byte_ord < 128 and byte.decode() in allowed_chars - ): - encoded_component += byte - continue - encoded_component.extend(b"%" + (hex(byte_ord)[2:].encode().zfill(2).upper())) - - return encoded_component.decode(encoding) - - -def _remove_path_dot_segments(path): - # See http://tools.ietf.org/html/rfc3986#section-5.2.4 for pseudo-code - segments = path.split("/") # Turn the path into a list of segments - output = [] # Initialize the variable to use to store output - - for segment in segments: - # '.' is the current directory, so ignore it, it is superfluous - if segment == ".": - continue - # Anything other than '..', should be appended to the output - elif segment != "..": - output.append(segment) - # In this case segment == '..', if we can, we should pop the last - # element - elif output: - output.pop() - - # If the path starts with '/' and the output is empty or the first string - # is non-empty - if path.startswith("/") and (not output or output[0]): - output.insert(0, "") - - # If the path starts with '/.' or '/..' ensure we add one more empty - # string to add a trailing '/' - if path.endswith(("/.", "/..")): - output.append("") - - return "/".join(output) - - -def _normalize_host(host, scheme): - if host: - if isinstance(host, six.binary_type): - host = six.ensure_str(host) - - if scheme in NORMALIZABLE_SCHEMES: - is_ipv6 = IPV6_ADDRZ_RE.match(host) - if is_ipv6: - match = ZONE_ID_RE.search(host) - if match: - start, end = match.span(1) - zone_id = host[start:end] - - if zone_id.startswith("%25") and zone_id != "%25": - zone_id = zone_id[3:] - else: - zone_id = zone_id[1:] - zone_id = "%" + _encode_invalid_chars(zone_id, UNRESERVED_CHARS) - return host[:start].lower() + zone_id + host[end:] - else: - return host.lower() - elif not IPV4_RE.match(host): - return six.ensure_str( - b".".join([_idna_encode(label) for label in host.split(".")]) - ) - return host - - -def _idna_encode(name): - if name and any([ord(x) > 128 for x in name]): - try: - import idna - except ImportError: - six.raise_from( - LocationParseError("Unable to parse URL without the 'idna' module"), - None, - ) - try: - return idna.encode(name.lower(), strict=True, std3_rules=True) - except idna.IDNAError: - six.raise_from( - LocationParseError(u"Name '%s' is not a valid IDNA label" % name), None - ) - return name.lower().encode("ascii") - - -def _encode_target(target): - """Percent-encodes a request target so that there are no invalid characters""" - path, query = TARGET_RE.match(target).groups() - target = _encode_invalid_chars(path, PATH_CHARS) - query = _encode_invalid_chars(query, QUERY_CHARS) - if query is not None: - target += "?" + query - return target - - -def parse_url(url): - """ - Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is - performed to parse incomplete urls. Fields not provided will be None. - This parser is RFC 3986 compliant. - - The parser logic and helper functions are based heavily on - work done in the ``rfc3986`` module. - - :param str url: URL to parse into a :class:`.Url` namedtuple. - - Partly backwards-compatible with :mod:`urlparse`. - - Example:: - - >>> parse_url('http://google.com/mail/') - Url(scheme='http', host='google.com', port=None, path='/mail/', ...) - >>> parse_url('google.com:80') - Url(scheme=None, host='google.com', port=80, path=None, ...) - >>> parse_url('/foo?bar') - Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) - """ - if not url: - # Empty - return Url() - - source_url = url - if not SCHEME_RE.search(url): - url = "//" + url - - try: - scheme, authority, path, query, fragment = URI_RE.match(url).groups() - normalize_uri = scheme is None or scheme.lower() in NORMALIZABLE_SCHEMES - - if scheme: - scheme = scheme.lower() - - if authority: - auth, host, port = SUBAUTHORITY_RE.match(authority).groups() - if auth and normalize_uri: - auth = _encode_invalid_chars(auth, USERINFO_CHARS) - if port == "": - port = None - else: - auth, host, port = None, None, None - - if port is not None: - port = int(port) - if not (0 <= port <= 65535): - raise LocationParseError(url) - - host = _normalize_host(host, scheme) - - if normalize_uri and path: - path = _remove_path_dot_segments(path) - path = _encode_invalid_chars(path, PATH_CHARS) - if normalize_uri and query: - query = _encode_invalid_chars(query, QUERY_CHARS) - if normalize_uri and fragment: - fragment = _encode_invalid_chars(fragment, FRAGMENT_CHARS) - - except (ValueError, AttributeError): - return six.raise_from(LocationParseError(source_url), None) - - # For the sake of backwards compatibility we put empty - # string values for path if there are any defined values - # beyond the path in the URL. - # TODO: Remove this when we break backwards compatibility. - if not path: - if query is not None or fragment is not None: - path = "" - else: - path = None - - # Ensure that each part of the URL is a `str` for - # backwards compatibility. - if isinstance(url, six.text_type): - ensure_func = six.ensure_text - else: - ensure_func = six.ensure_str - - def ensure_type(x): - return x if x is None else ensure_func(x) - - return Url( - scheme=ensure_type(scheme), - auth=ensure_type(auth), - host=ensure_type(host), - port=port, - path=ensure_type(path), - query=ensure_type(query), - fragment=ensure_type(fragment), - ) - - -def get_host(url): - """ - Deprecated. Use :func:`parse_url` instead. - """ - p = parse_url(url) - return p.scheme or "http", p.hostname, p.port diff --git a/venv/lib/python3.8/site-packages/urllib3/util/wait.py b/venv/lib/python3.8/site-packages/urllib3/util/wait.py deleted file mode 100644 index d71d2fd..0000000 --- a/venv/lib/python3.8/site-packages/urllib3/util/wait.py +++ /dev/null @@ -1,153 +0,0 @@ -import errno -from functools import partial -import select -import sys - -try: - from time import monotonic -except ImportError: - from time import time as monotonic - -__all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"] - - -class NoWayToWaitForSocketError(Exception): - pass - - -# How should we wait on sockets? -# -# There are two types of APIs you can use for waiting on sockets: the fancy -# modern stateful APIs like epoll/kqueue, and the older stateless APIs like -# select/poll. The stateful APIs are more efficient when you have a lots of -# sockets to keep track of, because you can set them up once and then use them -# lots of times. But we only ever want to wait on a single socket at a time -# and don't want to keep track of state, so the stateless APIs are actually -# more efficient. So we want to use select() or poll(). -# -# Now, how do we choose between select() and poll()? On traditional Unixes, -# select() has a strange calling convention that makes it slow, or fail -# altogether, for high-numbered file descriptors. The point of poll() is to fix -# that, so on Unixes, we prefer poll(). -# -# On Windows, there is no poll() (or at least Python doesn't provide a wrapper -# for it), but that's OK, because on Windows, select() doesn't have this -# strange calling convention; plain select() works fine. -# -# So: on Windows we use select(), and everywhere else we use poll(). We also -# fall back to select() in case poll() is somehow broken or missing. - -if sys.version_info >= (3, 5): - # Modern Python, that retries syscalls by default - def _retry_on_intr(fn, timeout): - return fn(timeout) - - -else: - # Old and broken Pythons. - def _retry_on_intr(fn, timeout): - if timeout is None: - deadline = float("inf") - else: - deadline = monotonic() + timeout - - while True: - try: - return fn(timeout) - # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7 - except (OSError, select.error) as e: - # 'e.args[0]' incantation works for both OSError and select.error - if e.args[0] != errno.EINTR: - raise - else: - timeout = deadline - monotonic() - if timeout < 0: - timeout = 0 - if timeout == float("inf"): - timeout = None - continue - - -def select_wait_for_socket(sock, read=False, write=False, timeout=None): - if not read and not write: - raise RuntimeError("must specify at least one of read=True, write=True") - rcheck = [] - wcheck = [] - if read: - rcheck.append(sock) - if write: - wcheck.append(sock) - # When doing a non-blocking connect, most systems signal success by - # marking the socket writable. Windows, though, signals success by marked - # it as "exceptional". We paper over the difference by checking the write - # sockets for both conditions. (The stdlib selectors module does the same - # thing.) - fn = partial(select.select, rcheck, wcheck, wcheck) - rready, wready, xready = _retry_on_intr(fn, timeout) - return bool(rready or wready or xready) - - -def poll_wait_for_socket(sock, read=False, write=False, timeout=None): - if not read and not write: - raise RuntimeError("must specify at least one of read=True, write=True") - mask = 0 - if read: - mask |= select.POLLIN - if write: - mask |= select.POLLOUT - poll_obj = select.poll() - poll_obj.register(sock, mask) - - # For some reason, poll() takes timeout in milliseconds - def do_poll(t): - if t is not None: - t *= 1000 - return poll_obj.poll(t) - - return bool(_retry_on_intr(do_poll, timeout)) - - -def null_wait_for_socket(*args, **kwargs): - raise NoWayToWaitForSocketError("no select-equivalent available") - - -def _have_working_poll(): - # Apparently some systems have a select.poll that fails as soon as you try - # to use it, either due to strange configuration or broken monkeypatching - # from libraries like eventlet/greenlet. - try: - poll_obj = select.poll() - _retry_on_intr(poll_obj.poll, 0) - except (AttributeError, OSError): - return False - else: - return True - - -def wait_for_socket(*args, **kwargs): - # We delay choosing which implementation to use until the first time we're - # called. We could do it at import time, but then we might make the wrong - # decision if someone goes wild with monkeypatching select.poll after - # we're imported. - global wait_for_socket - if _have_working_poll(): - wait_for_socket = poll_wait_for_socket - elif hasattr(select, "select"): - wait_for_socket = select_wait_for_socket - else: # Platform-specific: Appengine. - wait_for_socket = null_wait_for_socket - return wait_for_socket(*args, **kwargs) - - -def wait_for_read(sock, timeout=None): - """ Waits for reading to be available on a given socket. - Returns True if the socket is readable, or False if the timeout expired. - """ - return wait_for_socket(sock, read=True, timeout=timeout) - - -def wait_for_write(sock, timeout=None): - """ Waits for writing to be available on a given socket. - Returns True if the socket is readable, or False if the timeout expired. - """ - return wait_for_socket(sock, write=True, timeout=timeout) diff --git a/venv/lib64 b/venv/lib64 deleted file mode 120000 index 7951405..0000000 --- a/venv/lib64 +++ /dev/null @@ -1 +0,0 @@ -lib \ No newline at end of file diff --git a/venv/pyvenv.cfg b/venv/pyvenv.cfg deleted file mode 100644 index 517a829..0000000 --- a/venv/pyvenv.cfg +++ /dev/null @@ -1,3 +0,0 @@ -home = /usr/bin -include-system-site-packages = false -version = 3.8.1