From ad94815c9d3dc67bc61a79ac3a005a390a75ceb8 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 20:05:05 +0000 Subject: [PATCH] chore: drop tracked local-machine artifacts (Phase 4) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove 1543 files that were committed from developer machines before matching .gitignore rules were added. All patterns involved are already ignored; this just cleans up the historical tracking. - venv/ (1539 files, Python virtualenv) - __pycache__/ (1 file — root; all 706 under venv/ covered above) - home/intlc/projects/... (1 file — stale copy of multi-chain-execution/src/api/mirror-routes.ts; the canonical in-repo version is newer and has comments) - .phase1-event-status (ephemeral phase marker) - .gitignore.backup.20260103_171034 (pre-cleanup .gitignore snapshot) Also add '/home/' to .gitignore so future operator-home paste captures don't get re-introduced. No working code changed — every deletion is of a build artifact, virtualenv content, or stale duplicate. Tracking: https://gitea.d-bis.org/d-bis/proxmox/issues/1 Co-Authored-By: Nakamoto, S --- .gitignore | 4 + .gitignore.backup.20260103_171034 | 37 - .phase1-event-status | 1 - __pycache__/list_vms.cpython-312.pyc | Bin 18412 -> 0 bytes .../src/api/mirror-routes.ts | 78 - venv/bin/Activate.ps1 | 247 - venv/bin/activate | 70 - venv/bin/activate.csh | 27 - venv/bin/activate.fish | 69 - venv/bin/flask | 8 - venv/bin/normalizer | 8 - venv/bin/pip | 8 - venv/bin/pip3 | 8 - venv/bin/pip3.12 | 8 - venv/bin/python | 1 - venv/bin/python3 | 1 - venv/bin/python3.12 | 1 - .../blinker-1.9.0.dist-info/INSTALLER | 1 - .../blinker-1.9.0.dist-info/LICENSE.txt | 20 - .../blinker-1.9.0.dist-info/METADATA | 60 - .../blinker-1.9.0.dist-info/RECORD | 12 - .../blinker-1.9.0.dist-info/WHEEL | 4 - .../site-packages/blinker/__init__.py | 17 - .../__pycache__/__init__.cpython-312.pyc | Bin 491 -> 0 bytes .../__pycache__/_utilities.cpython-312.pyc | Bin 2718 -> 0 bytes .../blinker/__pycache__/base.cpython-312.pyc | Bin 21995 -> 0 bytes .../site-packages/blinker/_utilities.py | 64 - .../python3.12/site-packages/blinker/base.py | 512 - .../python3.12/site-packages/blinker/py.typed | 0 .../certifi-2025.11.12.dist-info/INSTALLER | 1 - .../certifi-2025.11.12.dist-info/METADATA | 78 - .../certifi-2025.11.12.dist-info/RECORD | 14 - .../certifi-2025.11.12.dist-info/WHEEL | 5 - .../licenses/LICENSE | 20 - .../top_level.txt | 1 - .../site-packages/certifi/__init__.py | 4 - .../site-packages/certifi/__main__.py | 12 - .../__pycache__/__init__.cpython-312.pyc | Bin 306 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 621 -> 0 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 2053 -> 0 bytes .../site-packages/certifi/cacert.pem | 4678 --------- .../python3.12/site-packages/certifi/core.py | 83 - .../python3.12/site-packages/certifi/py.typed | 0 .../INSTALLER | 1 - .../METADATA | 764 -- .../charset_normalizer-3.4.4.dist-info/RECORD | 35 - .../charset_normalizer-3.4.4.dist-info/WHEEL | 7 - .../entry_points.txt | 2 - .../licenses/LICENSE | 21 - .../top_level.txt | 1 - .../charset_normalizer/__init__.py | 48 - .../charset_normalizer/__main__.py | 6 - .../__pycache__/__init__.cpython-312.pyc | Bin 1772 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 347 -> 0 bytes .../__pycache__/api.cpython-312.pyc | Bin 18183 -> 0 bytes .../__pycache__/cd.cpython-312.pyc | Bin 13288 -> 0 bytes .../__pycache__/constant.cpython-312.pyc | Bin 40802 -> 0 bytes .../__pycache__/legacy.cpython-312.pyc | Bin 3002 -> 0 bytes .../__pycache__/md.cpython-312.pyc | Bin 24339 -> 0 bytes .../__pycache__/models.cpython-312.pyc | Bin 17119 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 13748 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 374 -> 0 bytes .../site-packages/charset_normalizer/api.py | 669 -- .../site-packages/charset_normalizer/cd.py | 395 - .../charset_normalizer/cli/__init__.py | 8 - .../charset_normalizer/cli/__main__.py | 381 - .../cli/__pycache__/__init__.cpython-312.pyc | Bin 335 -> 0 bytes .../cli/__pycache__/__main__.cpython-312.pyc | Bin 14396 -> 0 bytes .../charset_normalizer/constant.py | 2015 ---- .../charset_normalizer/legacy.py | 80 - .../md.cpython-312-x86_64-linux-gnu.so | Bin 15912 -> 0 bytes .../site-packages/charset_normalizer/md.py | 635 -- .../md__mypyc.cpython-312-x86_64-linux-gnu.so | Bin 290584 -> 0 bytes .../charset_normalizer/models.py | 360 - .../site-packages/charset_normalizer/py.typed | 0 .../site-packages/charset_normalizer/utils.py | 414 - .../charset_normalizer/version.py | 8 - .../click-8.3.1.dist-info/INSTALLER | 1 - .../click-8.3.1.dist-info/METADATA | 84 - .../click-8.3.1.dist-info/RECORD | 40 - .../site-packages/click-8.3.1.dist-info/WHEEL | 4 - .../licenses/LICENSE.txt | 28 - .../site-packages/click/__init__.py | 123 - .../__pycache__/__init__.cpython-312.pyc | Bin 4063 -> 0 bytes .../click/__pycache__/_compat.cpython-312.pyc | Bin 24185 -> 0 bytes .../__pycache__/_termui_impl.cpython-312.pyc | Bin 31607 -> 0 bytes .../__pycache__/_textwrap.cpython-312.pyc | Bin 2416 -> 0 bytes .../click/__pycache__/_utils.cpython-312.pyc | Bin 1191 -> 0 bytes .../__pycache__/_winconsole.cpython-312.pyc | Bin 11761 -> 0 bytes .../click/__pycache__/core.cpython-312.pyc | Bin 134657 -> 0 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 22128 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 14767 -> 0 bytes .../__pycache__/formatting.cpython-312.pyc | Bin 13663 -> 0 bytes .../click/__pycache__/globals.cpython-312.pyc | Bin 2956 -> 0 bytes .../click/__pycache__/parser.cpython-312.pyc | Bin 20433 -> 0 bytes .../shell_completion.cpython-312.pyc | Bin 23328 -> 0 bytes .../click/__pycache__/termui.cpython-312.pyc | Bin 34642 -> 0 bytes .../click/__pycache__/testing.cpython-312.pyc | Bin 27400 -> 0 bytes .../click/__pycache__/types.cpython-312.pyc | Bin 50029 -> 0 bytes .../click/__pycache__/utils.cpython-312.pyc | Bin 24870 -> 0 bytes .../python3.12/site-packages/click/_compat.py | 622 -- .../site-packages/click/_termui_impl.py | 852 -- .../site-packages/click/_textwrap.py | 51 - .../python3.12/site-packages/click/_utils.py | 36 - .../site-packages/click/_winconsole.py | 296 - .../python3.12/site-packages/click/core.py | 3415 ------- .../site-packages/click/decorators.py | 551 - .../site-packages/click/exceptions.py | 308 - .../site-packages/click/formatting.py | 301 - .../python3.12/site-packages/click/globals.py | 67 - .../python3.12/site-packages/click/parser.py | 532 - .../python3.12/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 667 -- .../python3.12/site-packages/click/termui.py | 883 -- .../python3.12/site-packages/click/testing.py | 577 -- .../python3.12/site-packages/click/types.py | 1209 --- .../python3.12/site-packages/click/utils.py | 627 -- .../flask-3.1.2.dist-info/INSTALLER | 1 - .../flask-3.1.2.dist-info/METADATA | 91 - .../flask-3.1.2.dist-info/RECORD | 58 - .../flask-3.1.2.dist-info/REQUESTED | 0 .../site-packages/flask-3.1.2.dist-info/WHEEL | 4 - .../flask-3.1.2.dist-info/entry_points.txt | 3 - .../licenses/LICENSE.txt | 28 - .../site-packages/flask/__init__.py | 61 - .../site-packages/flask/__main__.py | 3 - .../__pycache__/__init__.cpython-312.pyc | Bin 2523 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 231 -> 0 bytes .../flask/__pycache__/app.cpython-312.pyc | Bin 62478 -> 0 bytes .../__pycache__/blueprints.cpython-312.pyc | Bin 4990 -> 0 bytes .../flask/__pycache__/cli.cpython-312.pyc | Bin 43534 -> 0 bytes .../flask/__pycache__/config.cpython-312.pyc | Bin 16242 -> 0 bytes .../flask/__pycache__/ctx.cpython-312.pyc | Bin 19828 -> 0 bytes .../__pycache__/debughelpers.cpython-312.pyc | Bin 9140 -> 0 bytes .../flask/__pycache__/globals.cpython-312.pyc | Bin 1855 -> 0 bytes .../flask/__pycache__/helpers.cpython-312.pyc | Bin 25556 -> 0 bytes .../flask/__pycache__/logging.cpython-312.pyc | Bin 3257 -> 0 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 17172 -> 0 bytes .../flask/__pycache__/signals.cpython-312.pyc | Bin 1212 -> 0 bytes .../__pycache__/templating.cpython-312.pyc | Bin 9921 -> 0 bytes .../flask/__pycache__/testing.cpython-312.pyc | Bin 13602 -> 0 bytes .../flask/__pycache__/typing.cpython-312.pyc | Bin 4120 -> 0 bytes .../flask/__pycache__/views.cpython-312.pyc | Bin 7011 -> 0 bytes .../__pycache__/wrappers.cpython-312.pyc | Bin 10043 -> 0 bytes .../lib/python3.12/site-packages/flask/app.py | 1536 --- .../site-packages/flask/blueprints.py | 128 - .../lib/python3.12/site-packages/flask/cli.py | 1135 --- .../python3.12/site-packages/flask/config.py | 367 - .../lib/python3.12/site-packages/flask/ctx.py | 449 - .../site-packages/flask/debughelpers.py | 178 - .../python3.12/site-packages/flask/globals.py | 51 - .../python3.12/site-packages/flask/helpers.py | 641 -- .../site-packages/flask/json/__init__.py | 170 - .../json/__pycache__/__init__.cpython-312.pyc | Bin 6683 -> 0 bytes .../json/__pycache__/provider.cpython-312.pyc | Bin 9250 -> 0 bytes .../json/__pycache__/tag.cpython-312.pyc | Bin 13945 -> 0 bytes .../site-packages/flask/json/provider.py | 215 - .../site-packages/flask/json/tag.py | 327 - .../python3.12/site-packages/flask/logging.py | 79 - .../python3.12/site-packages/flask/py.typed | 0 .../site-packages/flask/sansio/README.md | 6 - .../sansio/__pycache__/app.cpython-312.pyc | Bin 33702 -> 0 bytes .../__pycache__/blueprints.cpython-312.pyc | Bin 31203 -> 0 bytes .../__pycache__/scaffold.cpython-312.pyc | Bin 30216 -> 0 bytes .../site-packages/flask/sansio/app.py | 964 -- .../site-packages/flask/sansio/blueprints.py | 632 -- .../site-packages/flask/sansio/scaffold.py | 792 -- .../site-packages/flask/sessions.py | 399 - .../python3.12/site-packages/flask/signals.py | 17 - .../site-packages/flask/templating.py | 219 - .../python3.12/site-packages/flask/testing.py | 298 - .../python3.12/site-packages/flask/typing.py | 93 - .../python3.12/site-packages/flask/views.py | 191 - .../site-packages/flask/wrappers.py | 257 - .../idna-3.11.dist-info/INSTALLER | 1 - .../idna-3.11.dist-info/METADATA | 209 - .../site-packages/idna-3.11.dist-info/RECORD | 22 - .../site-packages/idna-3.11.dist-info/WHEEL | 4 - .../idna-3.11.dist-info/licenses/LICENSE.md | 31 - .../python3.12/site-packages/idna/__init__.py | 45 - .../idna/__pycache__/__init__.cpython-312.pyc | Bin 874 -> 0 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 4974 -> 0 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 878 -> 0 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 16186 -> 0 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 100903 -> 0 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 2626 -> 0 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 205 -> 0 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 161833 -> 0 bytes .../python3.12/site-packages/idna/codec.py | 122 - .../python3.12/site-packages/idna/compat.py | 15 - .../lib/python3.12/site-packages/idna/core.py | 437 - .../python3.12/site-packages/idna/idnadata.py | 4309 -------- .../site-packages/idna/intranges.py | 57 - .../site-packages/idna/package_data.py | 1 - .../python3.12/site-packages/idna/py.typed | 0 .../site-packages/idna/uts46data.py | 8841 ----------------- .../itsdangerous-2.2.0.dist-info/INSTALLER | 1 - .../itsdangerous-2.2.0.dist-info/LICENSE.txt | 28 - .../itsdangerous-2.2.0.dist-info/METADATA | 60 - .../itsdangerous-2.2.0.dist-info/RECORD | 22 - .../itsdangerous-2.2.0.dist-info/WHEEL | 4 - .../site-packages/itsdangerous/__init__.py | 38 - .../__pycache__/__init__.cpython-312.pyc | Bin 1622 -> 0 bytes .../__pycache__/_json.cpython-312.pyc | Bin 1176 -> 0 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 2676 -> 0 bytes .../__pycache__/exc.cpython-312.pyc | Bin 3936 -> 0 bytes .../__pycache__/serializer.cpython-312.pyc | Bin 15417 -> 0 bytes .../__pycache__/signer.cpython-312.pyc | Bin 11282 -> 0 bytes .../__pycache__/timed.cpython-312.pyc | Bin 8730 -> 0 bytes .../__pycache__/url_safe.cpython-312.pyc | Bin 3526 -> 0 bytes .../site-packages/itsdangerous/_json.py | 18 - .../site-packages/itsdangerous/encoding.py | 54 - .../site-packages/itsdangerous/exc.py | 106 - .../site-packages/itsdangerous/py.typed | 0 .../site-packages/itsdangerous/serializer.py | 406 - .../site-packages/itsdangerous/signer.py | 266 - .../site-packages/itsdangerous/timed.py | 228 - .../site-packages/itsdangerous/url_safe.py | 83 - .../jinja2-3.1.6.dist-info/INSTALLER | 1 - .../jinja2-3.1.6.dist-info/METADATA | 84 - .../jinja2-3.1.6.dist-info/RECORD | 57 - .../jinja2-3.1.6.dist-info/WHEEL | 4 - .../jinja2-3.1.6.dist-info/entry_points.txt | 3 - .../licenses/LICENSE.txt | 28 - .../site-packages/jinja2/__init__.py | 38 - .../__pycache__/__init__.cpython-312.pyc | Bin 1647 -> 0 bytes .../__pycache__/_identifier.cpython-312.pyc | Bin 2128 -> 0 bytes .../__pycache__/async_utils.cpython-312.pyc | Bin 4968 -> 0 bytes .../__pycache__/bccache.cpython-312.pyc | Bin 19339 -> 0 bytes .../__pycache__/compiler.cpython-312.pyc | Bin 104054 -> 0 bytes .../__pycache__/constants.cpython-312.pyc | Bin 1550 -> 0 bytes .../jinja2/__pycache__/debug.cpython-312.pyc | Bin 6575 -> 0 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 1600 -> 0 bytes .../__pycache__/environment.cpython-312.pyc | Bin 76676 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7714 -> 0 bytes .../jinja2/__pycache__/ext.cpython-312.pyc | Bin 41907 -> 0 bytes .../__pycache__/filters.cpython-312.pyc | Bin 72324 -> 0 bytes .../__pycache__/idtracking.cpython-312.pyc | Bin 19189 -> 0 bytes .../jinja2/__pycache__/lexer.cpython-312.pyc | Bin 32070 -> 0 bytes .../__pycache__/loaders.cpython-312.pyc | Bin 32349 -> 0 bytes .../jinja2/__pycache__/meta.cpython-312.pyc | Bin 5484 -> 0 bytes .../__pycache__/nativetypes.cpython-312.pyc | Bin 7005 -> 0 bytes .../jinja2/__pycache__/nodes.cpython-312.pyc | Bin 58267 -> 0 bytes .../__pycache__/optimizer.cpython-312.pyc | Bin 2683 -> 0 bytes .../jinja2/__pycache__/parser.cpython-312.pyc | Bin 61197 -> 0 bytes .../__pycache__/runtime.cpython-312.pyc | Bin 48885 -> 0 bytes .../__pycache__/sandbox.cpython-312.pyc | Bin 18101 -> 0 bytes .../jinja2/__pycache__/tests.cpython-312.pyc | Bin 9044 -> 0 bytes .../jinja2/__pycache__/utils.cpython-312.pyc | Bin 34857 -> 0 bytes .../__pycache__/visitor.cpython-312.pyc | Bin 5359 -> 0 bytes .../site-packages/jinja2/_identifier.py | 6 - .../site-packages/jinja2/async_utils.py | 99 - .../site-packages/jinja2/bccache.py | 408 - .../site-packages/jinja2/compiler.py | 1998 ---- .../site-packages/jinja2/constants.py | 20 - .../python3.12/site-packages/jinja2/debug.py | 191 - .../site-packages/jinja2/defaults.py | 48 - .../site-packages/jinja2/environment.py | 1672 ---- .../site-packages/jinja2/exceptions.py | 166 - .../python3.12/site-packages/jinja2/ext.py | 870 -- .../site-packages/jinja2/filters.py | 1873 ---- .../site-packages/jinja2/idtracking.py | 318 - .../python3.12/site-packages/jinja2/lexer.py | 868 -- .../site-packages/jinja2/loaders.py | 693 -- .../python3.12/site-packages/jinja2/meta.py | 112 - .../site-packages/jinja2/nativetypes.py | 130 - .../python3.12/site-packages/jinja2/nodes.py | 1206 --- .../site-packages/jinja2/optimizer.py | 48 - .../python3.12/site-packages/jinja2/parser.py | 1049 -- .../python3.12/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 1062 -- .../site-packages/jinja2/sandbox.py | 436 - .../python3.12/site-packages/jinja2/tests.py | 256 - .../python3.12/site-packages/jinja2/utils.py | 766 -- .../site-packages/jinja2/visitor.py | 92 - .../markupsafe-3.0.3.dist-info/INSTALLER | 1 - .../markupsafe-3.0.3.dist-info/METADATA | 74 - .../markupsafe-3.0.3.dist-info/RECORD | 14 - .../markupsafe-3.0.3.dist-info/WHEEL | 7 - .../licenses/LICENSE.txt | 28 - .../markupsafe-3.0.3.dist-info/top_level.txt | 1 - .../site-packages/markupsafe/__init__.py | 396 - .../__pycache__/__init__.cpython-312.pyc | Bin 20957 -> 0 bytes .../__pycache__/_native.cpython-312.pyc | Bin 609 -> 0 bytes .../site-packages/markupsafe/_native.py | 8 - .../site-packages/markupsafe/_speedups.c | 200 - .../_speedups.cpython-312-x86_64-linux-gnu.so | Bin 44072 -> 0 bytes .../site-packages/markupsafe/_speedups.pyi | 1 - .../site-packages/markupsafe/py.typed | 0 .../pip-24.0.dist-info/AUTHORS.txt | 760 -- .../pip-24.0.dist-info/INSTALLER | 1 - .../pip-24.0.dist-info/LICENSE.txt | 20 - .../site-packages/pip-24.0.dist-info/METADATA | 88 - .../site-packages/pip-24.0.dist-info/RECORD | 1005 -- .../pip-24.0.dist-info/REQUESTED | 0 .../site-packages/pip-24.0.dist-info/WHEEL | 5 - .../pip-24.0.dist-info/entry_points.txt | 4 - .../pip-24.0.dist-info/top_level.txt | 1 - .../python3.12/site-packages/pip/__init__.py | 13 - .../python3.12/site-packages/pip/__main__.py | 24 - .../site-packages/pip/__pip-runner__.py | 50 - .../pip/__pycache__/__init__.cpython-312.pyc | Bin 684 -> 0 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 840 -> 0 bytes .../__pip-runner__.cpython-312.pyc | Bin 2203 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 18 - .../__pycache__/__init__.cpython-312.pyc | Bin 786 -> 0 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 14293 -> 0 bytes .../__pycache__/cache.cpython-312.pyc | Bin 12664 -> 0 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 17665 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 33283 -> 0 bytes .../__pycache__/main.cpython-312.pyc | Bin 669 -> 0 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 4970 -> 0 bytes .../self_outdated_check.cpython-312.pyc | Bin 10551 -> 0 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 13648 -> 0 bytes .../site-packages/pip/_internal/build_env.py | 311 - .../site-packages/pip/_internal/cache.py | 290 - .../pip/_internal/cli/__init__.py | 4 - .../cli/__pycache__/__init__.cpython-312.pyc | Bin 277 -> 0 bytes .../autocompletion.cpython-312.pyc | Bin 8464 -> 0 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 10454 -> 0 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 30373 -> 0 bytes .../command_context.cpython-312.pyc | Bin 1780 -> 0 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 2297 -> 0 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 4904 -> 0 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 15021 -> 0 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 2619 -> 0 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 18851 -> 0 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 7839 -> 0 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 374 -> 0 bytes .../pip/_internal/cli/autocompletion.py | 172 - .../pip/_internal/cli/base_command.py | 236 - .../pip/_internal/cli/cmdoptions.py | 1074 -- .../pip/_internal/cli/command_context.py | 27 - .../site-packages/pip/_internal/cli/main.py | 79 - .../pip/_internal/cli/main_parser.py | 134 - .../site-packages/pip/_internal/cli/parser.py | 294 - .../pip/_internal/cli/progress_bars.py | 68 - .../pip/_internal/cli/req_command.py | 505 - .../pip/_internal/cli/spinners.py | 159 - .../pip/_internal/cli/status_codes.py | 6 - .../pip/_internal/commands/__init__.py | 132 - .../__pycache__/__init__.cpython-312.pyc | Bin 4001 -> 0 bytes .../__pycache__/cache.cpython-312.pyc | Bin 9710 -> 0 bytes .../__pycache__/check.cpython-312.pyc | Bin 2089 -> 0 bytes .../__pycache__/completion.cpython-312.pyc | Bin 5191 -> 0 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 13211 -> 0 bytes .../__pycache__/debug.cpython-312.pyc | Bin 10160 -> 0 bytes .../__pycache__/download.cpython-312.pyc | Bin 7588 -> 0 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 4415 -> 0 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 2982 -> 0 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 1672 -> 0 bytes .../__pycache__/index.cpython-312.pyc | Bin 6719 -> 0 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 3974 -> 0 bytes .../__pycache__/install.cpython-312.pyc | Bin 28912 -> 0 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 15655 -> 0 bytes .../__pycache__/search.cpython-312.pyc | Bin 7620 -> 0 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 9727 -> 0 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 4725 -> 0 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 8955 -> 0 bytes .../pip/_internal/commands/cache.py | 225 - .../pip/_internal/commands/check.py | 54 - .../pip/_internal/commands/completion.py | 130 - .../pip/_internal/commands/configuration.py | 280 - .../pip/_internal/commands/debug.py | 201 - .../pip/_internal/commands/download.py | 147 - .../pip/_internal/commands/freeze.py | 109 - .../pip/_internal/commands/hash.py | 59 - .../pip/_internal/commands/help.py | 41 - .../pip/_internal/commands/index.py | 139 - .../pip/_internal/commands/inspect.py | 92 - .../pip/_internal/commands/install.py | 774 -- .../pip/_internal/commands/list.py | 370 - .../pip/_internal/commands/search.py | 174 - .../pip/_internal/commands/show.py | 189 - .../pip/_internal/commands/uninstall.py | 113 - .../pip/_internal/commands/wheel.py | 183 - .../pip/_internal/configuration.py | 383 - .../pip/_internal/distributions/__init__.py | 21 - .../__pycache__/__init__.cpython-312.pyc | Bin 940 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 2861 -> 0 bytes .../__pycache__/installed.cpython-312.pyc | Bin 1699 -> 0 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 8487 -> 0 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 2247 -> 0 bytes .../pip/_internal/distributions/base.py | 51 - .../pip/_internal/distributions/installed.py | 29 - .../pip/_internal/distributions/sdist.py | 156 - .../pip/_internal/distributions/wheel.py | 40 - .../site-packages/pip/_internal/exceptions.py | 728 -- .../pip/_internal/index/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 231 -> 0 bytes .../__pycache__/collector.cpython-312.pyc | Bin 21885 -> 0 bytes .../package_finder.cpython-312.pyc | Bin 40734 -> 0 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 12603 -> 0 bytes .../pip/_internal/index/collector.py | 507 - .../pip/_internal/index/package_finder.py | 1027 -- .../pip/_internal/index/sources.py | 285 - .../pip/_internal/locations/__init__.py | 467 - .../__pycache__/__init__.cpython-312.pyc | Bin 16775 -> 0 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 6855 -> 0 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 8010 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 3780 -> 0 bytes .../pip/_internal/locations/_distutils.py | 172 - .../pip/_internal/locations/_sysconfig.py | 213 - .../pip/_internal/locations/base.py | 81 - .../site-packages/pip/_internal/main.py | 12 - .../pip/_internal/metadata/__init__.py | 128 - .../__pycache__/__init__.cpython-312.pyc | Bin 5881 -> 0 bytes .../__pycache__/_json.cpython-312.pyc | Bin 2874 -> 0 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 35711 -> 0 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 15789 -> 0 bytes .../pip/_internal/metadata/_json.py | 84 - .../pip/_internal/metadata/base.py | 702 -- .../_internal/metadata/importlib/__init__.py | 6 - .../__pycache__/__init__.cpython-312.pyc | Bin 357 -> 0 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 3332 -> 0 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 13424 -> 0 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 11179 -> 0 bytes .../_internal/metadata/importlib/_compat.py | 55 - .../_internal/metadata/importlib/_dists.py | 227 - .../pip/_internal/metadata/importlib/_envs.py | 189 - .../pip/_internal/metadata/pkg_resources.py | 278 - .../pip/_internal/models/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 265 -> 0 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 1904 -> 0 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 11198 -> 0 bytes .../format_control.cpython-312.pyc | Bin 4226 -> 0 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 1693 -> 0 bytes .../installation_report.cpython-312.pyc | Bin 2271 -> 0 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 26001 -> 0 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 1168 -> 0 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 5087 -> 0 bytes .../selection_prefs.cpython-312.pyc | Bin 1850 -> 0 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 4953 -> 0 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 5779 -> 0 bytes .../pip/_internal/models/candidate.py | 30 - .../pip/_internal/models/direct_url.py | 235 - .../pip/_internal/models/format_control.py | 78 - .../pip/_internal/models/index.py | 28 - .../_internal/models/installation_report.py | 56 - .../pip/_internal/models/link.py | 579 -- .../pip/_internal/models/scheme.py | 31 - .../pip/_internal/models/search_scope.py | 132 - .../pip/_internal/models/selection_prefs.py | 51 - .../pip/_internal/models/target_python.py | 122 - .../pip/_internal/models/wheel.py | 92 - .../pip/_internal/network/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 253 -> 0 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 21995 -> 0 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 6517 -> 0 bytes .../__pycache__/download.cpython-312.pyc | Bin 8552 -> 0 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 11662 -> 0 bytes .../__pycache__/session.cpython-312.pyc | Bin 18773 -> 0 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 2252 -> 0 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 2948 -> 0 bytes .../pip/_internal/network/auth.py | 561 -- .../pip/_internal/network/cache.py | 106 - .../pip/_internal/network/download.py | 186 - .../pip/_internal/network/lazy_wheel.py | 210 - .../pip/_internal/network/session.py | 520 - .../pip/_internal/network/utils.py | 96 - .../pip/_internal/network/xmlrpc.py | 62 - .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 196 -> 0 bytes .../__pycache__/check.cpython-312.pyc | Bin 7578 -> 0 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 10116 -> 0 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 25746 -> 0 bytes .../pip/_internal/operations/check.py | 187 - .../pip/_internal/operations/freeze.py | 255 - .../_internal/operations/install/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 265 -> 0 bytes .../editable_legacy.cpython-312.pyc | Bin 1816 -> 0 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 33858 -> 0 bytes .../operations/install/editable_legacy.py | 46 - .../pip/_internal/operations/install/wheel.py | 734 -- .../pip/_internal/operations/prepare.py | 730 -- .../site-packages/pip/_internal/pyproject.py | 179 - .../pip/_internal/req/__init__.py | 92 - .../req/__pycache__/__init__.cpython-312.pyc | Bin 3742 -> 0 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 21581 -> 0 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 21460 -> 0 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 38413 -> 0 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 7217 -> 0 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 32976 -> 0 bytes .../pip/_internal/req/constructors.py | 576 -- .../pip/_internal/req/req_file.py | 554 -- .../pip/_internal/req/req_install.py | 923 -- .../pip/_internal/req/req_set.py | 119 - .../pip/_internal/req/req_uninstall.py | 649 -- .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 196 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 1184 -> 0 bytes .../pip/_internal/resolution/base.py | 20 - .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 203 -> 0 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 22438 -> 0 bytes .../_internal/resolution/legacy/resolver.py | 598 -- .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 207 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 8336 -> 0 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 30397 -> 0 bytes .../__pycache__/factory.cpython-312.pyc | Bin 32113 -> 0 bytes .../found_candidates.cpython-312.pyc | Bin 6207 -> 0 bytes .../__pycache__/provider.cpython-312.pyc | Bin 10377 -> 0 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 4934 -> 0 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 11428 -> 0 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 12350 -> 0 bytes .../_internal/resolution/resolvelib/base.py | 141 - .../resolution/resolvelib/candidates.py | 597 -- .../resolution/resolvelib/factory.py | 812 -- .../resolution/resolvelib/found_candidates.py | 155 - .../resolution/resolvelib/provider.py | 255 - .../resolution/resolvelib/reporter.py | 80 - .../resolution/resolvelib/requirements.py | 166 - .../resolution/resolvelib/resolver.py | 317 - .../pip/_internal/self_outdated_check.py | 248 - .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 191 -> 0 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 4532 -> 0 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 1862 -> 0 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 2406 -> 0 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 2209 -> 0 bytes .../compatibility_tags.cpython-312.pyc | Bin 5557 -> 0 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 680 -> 0 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 4182 -> 0 bytes .../direct_url_helpers.cpython-312.pyc | Bin 3559 -> 0 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 3222 -> 0 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 2154 -> 0 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 3989 -> 0 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 7454 -> 0 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 1160 -> 0 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 2338 -> 0 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 7550 -> 0 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 13553 -> 0 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 34117 -> 0 bytes .../utils/__pycache__/models.cpython-312.pyc | Bin 2708 -> 0 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 2579 -> 0 bytes .../setuptools_build.cpython-312.pyc | Bin 4546 -> 0 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 8714 -> 0 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 12058 -> 0 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 11104 -> 0 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 2401 -> 0 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 4476 -> 0 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 5922 -> 0 bytes .../pip/_internal/utils/_jaraco_text.py | 109 - .../site-packages/pip/_internal/utils/_log.py | 38 - .../pip/_internal/utils/appdirs.py | 52 - .../pip/_internal/utils/compat.py | 63 - .../pip/_internal/utils/compatibility_tags.py | 165 - .../pip/_internal/utils/datetime.py | 11 - .../pip/_internal/utils/deprecation.py | 120 - .../pip/_internal/utils/direct_url_helpers.py | 87 - .../pip/_internal/utils/egg_link.py | 80 - .../pip/_internal/utils/encoding.py | 36 - .../pip/_internal/utils/entrypoints.py | 84 - .../pip/_internal/utils/filesystem.py | 153 - .../pip/_internal/utils/filetypes.py | 27 - .../pip/_internal/utils/glibc.py | 88 - .../pip/_internal/utils/hashes.py | 151 - .../pip/_internal/utils/logging.py | 348 - .../site-packages/pip/_internal/utils/misc.py | 783 -- .../pip/_internal/utils/models.py | 39 - .../pip/_internal/utils/packaging.py | 57 - .../pip/_internal/utils/setuptools_build.py | 146 - .../pip/_internal/utils/subprocess.py | 260 - .../pip/_internal/utils/temp_dir.py | 296 - .../pip/_internal/utils/unpacking.py | 257 - .../site-packages/pip/_internal/utils/urls.py | 62 - .../pip/_internal/utils/virtualenv.py | 104 - .../pip/_internal/utils/wheel.py | 134 - .../pip/_internal/vcs/__init__.py | 15 - .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 530 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 5022 -> 0 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 18991 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 7611 -> 0 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 12483 -> 0 bytes .../versioncontrol.cpython-312.pyc | Bin 29009 -> 0 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 - .../site-packages/pip/_internal/vcs/git.py | 526 - .../pip/_internal/vcs/mercurial.py | 163 - .../pip/_internal/vcs/subversion.py | 324 - .../pip/_internal/vcs/versioncontrol.py | 705 -- .../pip/_internal/wheel_builder.py | 354 - .../site-packages/pip/_vendor/__init__.py | 121 - .../__pycache__/__init__.cpython-312.pyc | Bin 4692 -> 0 bytes .../_vendor/__pycache__/six.cpython-312.pyc | Bin 41269 -> 0 bytes .../typing_extensions.cpython-312.pyc | Bin 122049 -> 0 bytes .../pip/_vendor/cachecontrol/__init__.py | 28 - .../__pycache__/__init__.cpython-312.pyc | Bin 902 -> 0 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 2646 -> 0 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 6464 -> 0 bytes .../__pycache__/cache.cpython-312.pyc | Bin 3809 -> 0 bytes .../__pycache__/controller.cpython-312.pyc | Bin 16167 -> 0 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 4347 -> 0 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 6694 -> 0 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 6405 -> 0 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 1674 -> 0 bytes .../pip/_vendor/cachecontrol/_cmd.py | 70 - .../pip/_vendor/cachecontrol/adapter.py | 161 - .../pip/_vendor/cachecontrol/cache.py | 74 - .../_vendor/cachecontrol/caches/__init__.py | 8 - .../__pycache__/__init__.cpython-312.pyc | Bin 435 -> 0 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 7710 -> 0 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 2738 -> 0 bytes .../_vendor/cachecontrol/caches/file_cache.py | 181 - .../cachecontrol/caches/redis_cache.py | 48 - .../pip/_vendor/cachecontrol/controller.py | 494 - .../pip/_vendor/cachecontrol/filewrapper.py | 119 - .../pip/_vendor/cachecontrol/heuristics.py | 154 - .../pip/_vendor/cachecontrol/serialize.py | 206 - .../pip/_vendor/cachecontrol/wrapper.py | 43 - .../pip/_vendor/certifi/__init__.py | 4 - .../pip/_vendor/certifi/__main__.py | 12 - .../__pycache__/__init__.cpython-312.pyc | Bin 318 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 645 -> 0 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 3327 -> 0 bytes .../pip/_vendor/certifi/cacert.pem | 4635 --------- .../site-packages/pip/_vendor/certifi/core.py | 119 - .../pip/_vendor/chardet/__init__.py | 115 - .../__pycache__/__init__.cpython-312.pyc | Bin 4568 -> 0 bytes .../__pycache__/big5freq.cpython-312.pyc | Bin 27199 -> 0 bytes .../__pycache__/big5prober.cpython-312.pyc | Bin 1387 -> 0 bytes .../chardistribution.cpython-312.pyc | Bin 9638 -> 0 bytes .../charsetgroupprober.cpython-312.pyc | Bin 4122 -> 0 bytes .../__pycache__/charsetprober.cpython-312.pyc | Bin 5018 -> 0 bytes .../codingstatemachine.cpython-312.pyc | Bin 3878 -> 0 bytes .../codingstatemachinedict.cpython-312.pyc | Bin 789 -> 0 bytes .../__pycache__/cp949prober.cpython-312.pyc | Bin 1396 -> 0 bytes .../chardet/__pycache__/enums.cpython-312.pyc | Bin 2996 -> 0 bytes .../__pycache__/escprober.cpython-312.pyc | Bin 4566 -> 0 bytes .../chardet/__pycache__/escsm.cpython-312.pyc | Bin 15310 -> 0 bytes .../__pycache__/eucjpprober.cpython-312.pyc | Bin 4383 -> 0 bytes .../__pycache__/euckrfreq.cpython-312.pyc | Bin 12082 -> 0 bytes .../__pycache__/euckrprober.cpython-312.pyc | Bin 1390 -> 0 bytes .../__pycache__/euctwfreq.cpython-312.pyc | Bin 27204 -> 0 bytes .../__pycache__/euctwprober.cpython-312.pyc | Bin 1390 -> 0 bytes .../__pycache__/gb2312freq.cpython-312.pyc | Bin 19126 -> 0 bytes .../__pycache__/gb2312prober.cpython-312.pyc | Bin 1403 -> 0 bytes .../__pycache__/hebrewprober.cpython-312.pyc | Bin 5822 -> 0 bytes .../__pycache__/jisfreq.cpython-312.pyc | Bin 22155 -> 0 bytes .../__pycache__/johabfreq.cpython-312.pyc | Bin 83003 -> 0 bytes .../__pycache__/johabprober.cpython-312.pyc | Bin 1394 -> 0 bytes .../__pycache__/jpcntx.cpython-312.pyc | Bin 39549 -> 0 bytes .../langbulgarianmodel.cpython-312.pyc | Bin 83122 -> 0 bytes .../langgreekmodel.cpython-312.pyc | Bin 76988 -> 0 bytes .../langhebrewmodel.cpython-312.pyc | Bin 77499 -> 0 bytes .../langhungarianmodel.cpython-312.pyc | Bin 83076 -> 0 bytes .../langrussianmodel.cpython-312.pyc | Bin 105251 -> 0 bytes .../__pycache__/langthaimodel.cpython-312.pyc | Bin 77677 -> 0 bytes .../langturkishmodel.cpython-312.pyc | Bin 77516 -> 0 bytes .../__pycache__/latin1prober.cpython-312.pyc | Bin 7002 -> 0 bytes .../macromanprober.cpython-312.pyc | Bin 7182 -> 0 bytes .../mbcharsetprober.cpython-312.pyc | Bin 3903 -> 0 bytes .../mbcsgroupprober.cpython-312.pyc | Bin 1588 -> 0 bytes .../__pycache__/mbcssm.cpython-312.pyc | Bin 38645 -> 0 bytes .../__pycache__/resultdict.cpython-312.pyc | Bin 632 -> 0 bytes .../sbcharsetprober.cpython-312.pyc | Bin 6387 -> 0 bytes .../sbcsgroupprober.cpython-312.pyc | Bin 2357 -> 0 bytes .../__pycache__/sjisprober.cpython-312.pyc | Bin 4495 -> 0 bytes .../universaldetector.cpython-312.pyc | Bin 12269 -> 0 bytes .../__pycache__/utf1632prober.cpython-312.pyc | Bin 9979 -> 0 bytes .../__pycache__/utf8prober.cpython-312.pyc | Bin 3175 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 488 -> 0 bytes .../pip/_vendor/chardet/big5freq.py | 386 - .../pip/_vendor/chardet/big5prober.py | 47 - .../pip/_vendor/chardet/chardistribution.py | 261 - .../pip/_vendor/chardet/charsetgroupprober.py | 106 - .../pip/_vendor/chardet/charsetprober.py | 147 - .../pip/_vendor/chardet/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-312.pyc | Bin 195 -> 0 bytes .../__pycache__/chardetect.cpython-312.pyc | Bin 4012 -> 0 bytes .../pip/_vendor/chardet/cli/chardetect.py | 112 - .../pip/_vendor/chardet/codingstatemachine.py | 90 - .../_vendor/chardet/codingstatemachinedict.py | 19 - .../pip/_vendor/chardet/cp949prober.py | 49 - .../pip/_vendor/chardet/enums.py | 85 - .../pip/_vendor/chardet/escprober.py | 102 - .../pip/_vendor/chardet/escsm.py | 261 - .../pip/_vendor/chardet/eucjpprober.py | 102 - .../pip/_vendor/chardet/euckrfreq.py | 196 - .../pip/_vendor/chardet/euckrprober.py | 47 - .../pip/_vendor/chardet/euctwfreq.py | 388 - .../pip/_vendor/chardet/euctwprober.py | 47 - .../pip/_vendor/chardet/gb2312freq.py | 284 - .../pip/_vendor/chardet/gb2312prober.py | 47 - .../pip/_vendor/chardet/hebrewprober.py | 316 - .../pip/_vendor/chardet/jisfreq.py | 325 - .../pip/_vendor/chardet/johabfreq.py | 2382 ----- .../pip/_vendor/chardet/johabprober.py | 47 - .../pip/_vendor/chardet/jpcntx.py | 238 - .../pip/_vendor/chardet/langbulgarianmodel.py | 4649 --------- .../pip/_vendor/chardet/langgreekmodel.py | 4397 -------- .../pip/_vendor/chardet/langhebrewmodel.py | 4380 -------- .../pip/_vendor/chardet/langhungarianmodel.py | 4649 --------- .../pip/_vendor/chardet/langrussianmodel.py | 5725 ----------- .../pip/_vendor/chardet/langthaimodel.py | 4380 -------- .../pip/_vendor/chardet/langturkishmodel.py | 4380 -------- .../pip/_vendor/chardet/latin1prober.py | 147 - .../pip/_vendor/chardet/macromanprober.py | 162 - .../pip/_vendor/chardet/mbcharsetprober.py | 95 - .../pip/_vendor/chardet/mbcsgroupprober.py | 57 - .../pip/_vendor/chardet/mbcssm.py | 661 -- .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 200 -> 0 bytes .../__pycache__/languages.cpython-312.pyc | Bin 9755 -> 0 bytes .../pip/_vendor/chardet/metadata/languages.py | 352 - .../pip/_vendor/chardet/resultdict.py | 16 - .../pip/_vendor/chardet/sbcharsetprober.py | 162 - .../pip/_vendor/chardet/sbcsgroupprober.py | 88 - .../pip/_vendor/chardet/sjisprober.py | 105 - .../pip/_vendor/chardet/universaldetector.py | 362 - .../pip/_vendor/chardet/utf1632prober.py | 225 - .../pip/_vendor/chardet/utf8prober.py | 82 - .../pip/_vendor/chardet/version.py | 9 - .../pip/_vendor/colorama/__init__.py | 7 - .../__pycache__/__init__.cpython-312.pyc | Bin 492 -> 0 bytes .../colorama/__pycache__/ansi.cpython-312.pyc | Bin 3950 -> 0 bytes .../__pycache__/ansitowin32.cpython-312.pyc | Bin 16421 -> 0 bytes .../__pycache__/initialise.cpython-312.pyc | Bin 3550 -> 0 bytes .../__pycache__/win32.cpython-312.pyc | Bin 8126 -> 0 bytes .../__pycache__/winterm.cpython-312.pyc | Bin 9088 -> 0 bytes .../pip/_vendor/colorama/ansi.py | 102 - .../pip/_vendor/colorama/ansitowin32.py | 277 - .../pip/_vendor/colorama/initialise.py | 121 - .../pip/_vendor/colorama/tests/__init__.py | 1 - .../__pycache__/__init__.cpython-312.pyc | Bin 198 -> 0 bytes .../__pycache__/ansi_test.cpython-312.pyc | Bin 5467 -> 0 bytes .../ansitowin32_test.cpython-312.pyc | Bin 18103 -> 0 bytes .../initialise_test.cpython-312.pyc | Bin 11748 -> 0 bytes .../__pycache__/isatty_test.cpython-312.pyc | Bin 4904 -> 0 bytes .../tests/__pycache__/utils.cpython-312.pyc | Bin 2488 -> 0 bytes .../__pycache__/winterm_test.cpython-312.pyc | Bin 6612 -> 0 bytes .../pip/_vendor/colorama/tests/ansi_test.py | 76 - .../colorama/tests/ansitowin32_test.py | 294 - .../_vendor/colorama/tests/initialise_test.py | 189 - .../pip/_vendor/colorama/tests/isatty_test.py | 57 - .../pip/_vendor/colorama/tests/utils.py | 49 - .../_vendor/colorama/tests/winterm_test.py | 131 - .../pip/_vendor/colorama/win32.py | 180 - .../pip/_vendor/colorama/winterm.py | 195 - .../pip/_vendor/distlib/__init__.py | 33 - .../__pycache__/__init__.cpython-312.pyc | Bin 1269 -> 0 bytes .../__pycache__/compat.cpython-312.pyc | Bin 45605 -> 0 bytes .../__pycache__/database.cpython-312.pyc | Bin 66027 -> 0 bytes .../distlib/__pycache__/index.cpython-312.pyc | Bin 24366 -> 0 bytes .../__pycache__/locators.cpython-312.pyc | Bin 60158 -> 0 bytes .../__pycache__/manifest.cpython-312.pyc | Bin 15125 -> 0 bytes .../__pycache__/markers.cpython-312.pyc | Bin 7682 -> 0 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 41799 -> 0 bytes .../__pycache__/resources.cpython-312.pyc | Bin 17325 -> 0 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 19580 -> 0 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 88256 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 30366 -> 0 bytes .../distlib/__pycache__/wheel.cpython-312.pyc | Bin 51861 -> 0 bytes .../pip/_vendor/distlib/compat.py | 1138 --- .../pip/_vendor/distlib/database.py | 1359 --- .../pip/_vendor/distlib/index.py | 508 - .../pip/_vendor/distlib/locators.py | 1303 --- .../pip/_vendor/distlib/manifest.py | 384 - .../pip/_vendor/distlib/markers.py | 167 - .../pip/_vendor/distlib/metadata.py | 1068 -- .../pip/_vendor/distlib/resources.py | 358 - .../pip/_vendor/distlib/scripts.py | 452 - .../site-packages/pip/_vendor/distlib/util.py | 2025 ---- .../pip/_vendor/distlib/version.py | 751 -- .../pip/_vendor/distlib/wheel.py | 1099 -- .../pip/_vendor/distro/__init__.py | 54 - .../pip/_vendor/distro/__main__.py | 4 - .../__pycache__/__init__.cpython-312.pyc | Bin 960 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 292 -> 0 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 53754 -> 0 bytes .../pip/_vendor/distro/distro.py | 1399 --- .../pip/_vendor/idna/__init__.py | 44 - .../idna/__pycache__/__init__.cpython-312.pyc | Bin 881 -> 0 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 4633 -> 0 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 887 -> 0 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 16023 -> 0 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 99497 -> 0 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 2638 -> 0 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 216 -> 0 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 158870 -> 0 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 - .../site-packages/pip/_vendor/idna/compat.py | 13 - .../site-packages/pip/_vendor/idna/core.py | 400 - .../pip/_vendor/idna/idnadata.py | 4246 -------- .../pip/_vendor/idna/intranges.py | 54 - .../pip/_vendor/idna/package_data.py | 2 - .../pip/_vendor/idna/uts46data.py | 8600 ---------------- .../pip/_vendor/msgpack/__init__.py | 57 - .../__pycache__/__init__.cpython-312.pyc | Bin 1831 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 2025 -> 0 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 8668 -> 0 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 43576 -> 0 bytes .../pip/_vendor/msgpack/exceptions.py | 48 - .../site-packages/pip/_vendor/msgpack/ext.py | 193 - .../pip/_vendor/msgpack/fallback.py | 1010 -- .../pip/_vendor/packaging/__about__.py | 26 - .../pip/_vendor/packaging/__init__.py | 25 - .../__pycache__/__about__.cpython-312.pyc | Bin 630 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 466 -> 0 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 12076 -> 0 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 6910 -> 0 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 3241 -> 0 bytes .../__pycache__/markers.cpython-312.pyc | Bin 14058 -> 0 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 6946 -> 0 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 31247 -> 0 bytes .../__pycache__/tags.cpython-312.pyc | Bin 18956 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 5868 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 19939 -> 0 bytes .../pip/_vendor/packaging/_manylinux.py | 301 - .../pip/_vendor/packaging/_musllinux.py | 136 - .../pip/_vendor/packaging/_structures.py | 61 - .../pip/_vendor/packaging/markers.py | 304 - .../pip/_vendor/packaging/requirements.py | 146 - .../pip/_vendor/packaging/specifiers.py | 802 -- .../pip/_vendor/packaging/tags.py | 487 - .../pip/_vendor/packaging/utils.py | 136 - .../pip/_vendor/packaging/version.py | 504 - .../pip/_vendor/pkg_resources/__init__.py | 3361 ------- .../__pycache__/__init__.cpython-312.pyc | Bin 146474 -> 0 bytes .../pip/_vendor/platformdirs/__init__.py | 566 -- .../pip/_vendor/platformdirs/__main__.py | 53 - .../__pycache__/__init__.cpython-312.pyc | Bin 18029 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 1946 -> 0 bytes .../__pycache__/android.cpython-312.pyc | Bin 9444 -> 0 bytes .../__pycache__/api.cpython-312.pyc | Bin 9672 -> 0 bytes .../__pycache__/macos.cpython-312.pyc | Bin 5637 -> 0 bytes .../__pycache__/unix.cpython-312.pyc | Bin 12441 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 311 -> 0 bytes .../__pycache__/windows.cpython-312.pyc | Bin 12999 -> 0 bytes .../pip/_vendor/platformdirs/android.py | 210 - .../pip/_vendor/platformdirs/api.py | 223 - .../pip/_vendor/platformdirs/macos.py | 91 - .../pip/_vendor/platformdirs/unix.py | 223 - .../pip/_vendor/platformdirs/version.py | 4 - .../pip/_vendor/platformdirs/windows.py | 255 - .../pip/_vendor/pygments/__init__.py | 82 - .../pip/_vendor/pygments/__main__.py | 17 - .../__pycache__/__init__.cpython-312.pyc | Bin 3489 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 735 -> 0 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 26606 -> 0 bytes .../__pycache__/console.cpython-312.pyc | Bin 2627 -> 0 bytes .../__pycache__/filter.cpython-312.pyc | Bin 3233 -> 0 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 4570 -> 0 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 38330 -> 0 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 1569 -> 0 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 3397 -> 0 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 4082 -> 0 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 4757 -> 0 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 11047 -> 0 bytes .../__pycache__/style.cpython-312.pyc | Bin 6675 -> 0 bytes .../__pycache__/token.cpython-312.pyc | Bin 8143 -> 0 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 32989 -> 0 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 13982 -> 0 bytes .../pip/_vendor/pygments/cmdline.py | 668 -- .../pip/_vendor/pygments/console.py | 70 - .../pip/_vendor/pygments/filter.py | 71 - .../pip/_vendor/pygments/filters/__init__.py | 940 -- .../__pycache__/__init__.cpython-312.pyc | Bin 37937 -> 0 bytes .../pip/_vendor/pygments/formatter.py | 124 - .../_vendor/pygments/formatters/__init__.py | 158 - .../__pycache__/__init__.cpython-312.pyc | Bin 6927 -> 0 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 4216 -> 0 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 4195 -> 0 bytes .../__pycache__/groff.cpython-312.pyc | Bin 7265 -> 0 bytes .../__pycache__/html.cpython-312.pyc | Bin 40573 -> 0 bytes .../__pycache__/img.cpython-312.pyc | Bin 27044 -> 0 bytes .../__pycache__/irc.cpython-312.pyc | Bin 6066 -> 0 bytes .../__pycache__/latex.cpython-312.pyc | Bin 19955 -> 0 bytes .../__pycache__/other.cpython-312.pyc | Bin 6885 -> 0 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 2931 -> 0 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 6127 -> 0 bytes .../__pycache__/svg.cpython-312.pyc | Bin 9067 -> 0 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 5830 -> 0 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 15158 -> 0 bytes .../_vendor/pygments/formatters/_mapping.py | 23 - .../pip/_vendor/pygments/formatters/bbcode.py | 108 - .../pip/_vendor/pygments/formatters/groff.py | 170 - .../pip/_vendor/pygments/formatters/html.py | 989 -- .../pip/_vendor/pygments/formatters/img.py | 645 -- .../pip/_vendor/pygments/formatters/irc.py | 154 - .../pip/_vendor/pygments/formatters/latex.py | 521 - .../pip/_vendor/pygments/formatters/other.py | 161 - .../pygments/formatters/pangomarkup.py | 83 - .../pip/_vendor/pygments/formatters/rtf.py | 146 - .../pip/_vendor/pygments/formatters/svg.py | 188 - .../_vendor/pygments/formatters/terminal.py | 127 - .../pygments/formatters/terminal256.py | 338 - .../pip/_vendor/pygments/lexer.py | 943 -- .../pip/_vendor/pygments/lexers/__init__.py | 362 - .../__pycache__/__init__.cpython-312.pyc | Bin 14653 -> 0 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 64405 -> 0 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 42640 -> 0 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 559 -- .../pip/_vendor/pygments/lexers/python.py | 1198 --- .../pip/_vendor/pygments/modeline.py | 43 - .../pip/_vendor/pygments/plugin.py | 88 - .../pip/_vendor/pygments/regexopt.py | 91 - .../pip/_vendor/pygments/scanner.py | 104 - .../pip/_vendor/pygments/sphinxext.py | 217 - .../pip/_vendor/pygments/style.py | 197 - .../pip/_vendor/pygments/styles/__init__.py | 103 - .../__pycache__/__init__.cpython-312.pyc | Bin 4449 -> 0 bytes .../pip/_vendor/pygments/token.py | 213 - .../pip/_vendor/pygments/unistring.py | 153 - .../pip/_vendor/pygments/util.py | 330 - .../pip/_vendor/pyparsing/__init__.py | 322 - .../__pycache__/__init__.cpython-312.pyc | Bin 7912 -> 0 bytes .../__pycache__/actions.cpython-312.pyc | Bin 8396 -> 0 bytes .../__pycache__/common.cpython-312.pyc | Bin 13415 -> 0 bytes .../__pycache__/core.cpython-312.pyc | Bin 267709 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 12995 -> 0 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 48502 -> 0 bytes .../__pycache__/results.cpython-312.pyc | Bin 34111 -> 0 bytes .../__pycache__/testing.cpython-312.pyc | Bin 17189 -> 0 bytes .../__pycache__/unicode.cpython-312.pyc | Bin 13185 -> 0 bytes .../__pycache__/util.cpython-312.pyc | Bin 14905 -> 0 bytes .../pip/_vendor/pyparsing/actions.py | 217 - .../pip/_vendor/pyparsing/common.py | 432 - .../pip/_vendor/pyparsing/core.py | 6115 ------------ .../pip/_vendor/pyparsing/diagram/__init__.py | 656 -- .../__pycache__/__init__.cpython-312.pyc | Bin 26814 -> 0 bytes .../pip/_vendor/pyparsing/exceptions.py | 299 - .../pip/_vendor/pyparsing/helpers.py | 1100 -- .../pip/_vendor/pyparsing/results.py | 796 -- .../pip/_vendor/pyparsing/testing.py | 331 - .../pip/_vendor/pyparsing/unicode.py | 361 - .../pip/_vendor/pyparsing/util.py | 284 - .../pip/_vendor/pyproject_hooks/__init__.py | 23 - .../__pycache__/__init__.cpython-312.pyc | Bin 614 -> 0 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 375 -> 0 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 14726 -> 0 bytes .../pip/_vendor/pyproject_hooks/_compat.py | 8 - .../pip/_vendor/pyproject_hooks/_impl.py | 330 - .../pyproject_hooks/_in_process/__init__.py | 18 - .../__pycache__/__init__.cpython-312.pyc | Bin 1081 -> 0 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 14398 -> 0 bytes .../_in_process/_in_process.py | 353 - .../pip/_vendor/requests/__init__.py | 182 - .../__pycache__/__init__.cpython-312.pyc | Bin 5454 -> 0 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 585 -> 0 bytes .../_internal_utils.cpython-312.pyc | Bin 2025 -> 0 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 21281 -> 0 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 7205 -> 0 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 13924 -> 0 bytes .../__pycache__/certs.cpython-312.pyc | Bin 923 -> 0 bytes .../__pycache__/compat.cpython-312.pyc | Bin 1508 -> 0 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 25247 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7048 -> 0 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 4313 -> 0 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 1053 -> 0 bytes .../__pycache__/models.cpython-312.pyc | Bin 35449 -> 0 bytes .../__pycache__/packages.cpython-312.pyc | Bin 773 -> 0 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 27758 -> 0 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 5960 -> 0 bytes .../__pycache__/structures.cpython-312.pyc | Bin 5618 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 36076 -> 0 bytes .../pip/_vendor/requests/__version__.py | 14 - .../pip/_vendor/requests/_internal_utils.py | 50 - .../pip/_vendor/requests/adapters.py | 538 - .../site-packages/pip/_vendor/requests/api.py | 157 - .../pip/_vendor/requests/auth.py | 315 - .../pip/_vendor/requests/certs.py | 24 - .../pip/_vendor/requests/compat.py | 67 - .../pip/_vendor/requests/cookies.py | 561 -- .../pip/_vendor/requests/exceptions.py | 141 - .../pip/_vendor/requests/help.py | 131 - .../pip/_vendor/requests/hooks.py | 33 - .../pip/_vendor/requests/models.py | 1034 -- .../pip/_vendor/requests/packages.py | 16 - .../pip/_vendor/requests/sessions.py | 833 -- .../pip/_vendor/requests/status_codes.py | 128 - .../pip/_vendor/requests/structures.py | 99 - .../pip/_vendor/requests/utils.py | 1088 -- .../pip/_vendor/resolvelib/__init__.py | 26 - .../__pycache__/__init__.cpython-312.pyc | Bin 635 -> 0 bytes .../__pycache__/providers.cpython-312.pyc | Bin 6852 -> 0 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 2655 -> 0 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 25898 -> 0 bytes .../__pycache__/structs.cpython-312.pyc | Bin 10507 -> 0 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 201 -> 0 bytes .../collections_abc.cpython-312.pyc | Bin 421 -> 0 bytes .../resolvelib/compat/collections_abc.py | 6 - .../pip/_vendor/resolvelib/providers.py | 133 - .../pip/_vendor/resolvelib/reporters.py | 43 - .../pip/_vendor/resolvelib/resolvers.py | 547 - .../pip/_vendor/resolvelib/structs.py | 170 - .../pip/_vendor/rich/__init__.py | 177 - .../pip/_vendor/rich/__main__.py | 274 - .../rich/__pycache__/__init__.cpython-312.pyc | Bin 7016 -> 0 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 10305 -> 0 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 7822 -> 0 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 205977 -> 0 bytes .../_emoji_replace.cpython-312.pyc | Bin 1730 -> 0 bytes .../_export_format.cpython-312.pyc | Bin 2322 -> 0 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 538 -> 0 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 856 -> 0 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 12078 -> 0 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 4148 -> 0 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 1886 -> 0 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 3621 -> 0 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 5161 -> 0 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 727 -> 0 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 6580 -> 0 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 13180 -> 0 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 966 -> 0 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 866 -> 0 bytes .../_win32_console.cpython-312.pyc | Bin 28977 -> 0 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 2491 -> 0 bytes .../_windows_renderer.cpython-312.pyc | Bin 3574 -> 0 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 2361 -> 0 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 1609 -> 0 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 12323 -> 0 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 9107 -> 0 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 4273 -> 0 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 11859 -> 0 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 5619 -> 0 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 26571 -> 0 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 1702 -> 0 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 8588 -> 0 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 113794 -> 0 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 2259 -> 0 bytes .../__pycache__/containers.cpython-312.pyc | Bin 9227 -> 0 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 10930 -> 0 bytes .../default_styles.cpython-312.pyc | Bin 10374 -> 0 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 1488 -> 0 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 4210 -> 0 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 1846 -> 0 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 3578 -> 0 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 3083 -> 0 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 9899 -> 0 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 6036 -> 0 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 5210 -> 0 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 20221 -> 0 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 19144 -> 0 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 4895 -> 0 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 13555 -> 0 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 9299 -> 0 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 6377 -> 0 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 7135 -> 0 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 1821 -> 0 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 5315 -> 0 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 12098 -> 0 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 40057 -> 0 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 75079 -> 0 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 10390 -> 0 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 14782 -> 0 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 1793 -> 0 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 568 -> 0 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 6627 -> 0 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 6569 -> 0 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 3831 -> 0 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 2485 -> 0 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 28162 -> 0 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 6065 -> 0 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 6069 -> 0 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 33515 -> 0 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 2140 -> 0 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 39613 -> 0 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 43585 -> 0 bytes .../terminal_theme.cpython-312.pyc | Bin 3349 -> 0 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 58964 -> 0 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 6341 -> 0 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 315 -> 0 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 31549 -> 0 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 11440 -> 0 bytes .../pip/_vendor/rich/_cell_widths.py | 451 - .../pip/_vendor/rich/_emoji_codes.py | 3610 ------- .../pip/_vendor/rich/_emoji_replace.py | 32 - .../pip/_vendor/rich/_export_format.py | 76 - .../pip/_vendor/rich/_extension.py | 10 - .../site-packages/pip/_vendor/rich/_fileno.py | 24 - .../pip/_vendor/rich/_inspect.py | 270 - .../pip/_vendor/rich/_log_render.py | 94 - .../site-packages/pip/_vendor/rich/_loop.py | 43 - .../pip/_vendor/rich/_null_file.py | 69 - .../pip/_vendor/rich/_palettes.py | 309 - .../site-packages/pip/_vendor/rich/_pick.py | 17 - .../site-packages/pip/_vendor/rich/_ratio.py | 160 - .../pip/_vendor/rich/_spinners.py | 482 - .../site-packages/pip/_vendor/rich/_stack.py | 16 - .../site-packages/pip/_vendor/rich/_timer.py | 19 - .../pip/_vendor/rich/_win32_console.py | 662 -- .../pip/_vendor/rich/_windows.py | 72 - .../pip/_vendor/rich/_windows_renderer.py | 56 - .../site-packages/pip/_vendor/rich/_wrap.py | 56 - .../site-packages/pip/_vendor/rich/abc.py | 33 - .../site-packages/pip/_vendor/rich/align.py | 311 - .../site-packages/pip/_vendor/rich/ansi.py | 240 - .../site-packages/pip/_vendor/rich/bar.py | 94 - .../site-packages/pip/_vendor/rich/box.py | 517 - .../site-packages/pip/_vendor/rich/cells.py | 154 - .../site-packages/pip/_vendor/rich/color.py | 622 -- .../pip/_vendor/rich/color_triplet.py | 38 - .../site-packages/pip/_vendor/rich/columns.py | 187 - .../site-packages/pip/_vendor/rich/console.py | 2633 ----- .../pip/_vendor/rich/constrain.py | 37 - .../pip/_vendor/rich/containers.py | 167 - .../site-packages/pip/_vendor/rich/control.py | 225 - .../pip/_vendor/rich/default_styles.py | 190 - .../pip/_vendor/rich/diagnose.py | 37 - .../site-packages/pip/_vendor/rich/emoji.py | 96 - .../site-packages/pip/_vendor/rich/errors.py | 34 - .../pip/_vendor/rich/file_proxy.py | 57 - .../pip/_vendor/rich/filesize.py | 89 - .../pip/_vendor/rich/highlighter.py | 232 - .../site-packages/pip/_vendor/rich/json.py | 140 - .../site-packages/pip/_vendor/rich/jupyter.py | 101 - .../site-packages/pip/_vendor/rich/layout.py | 443 - .../site-packages/pip/_vendor/rich/live.py | 375 - .../pip/_vendor/rich/live_render.py | 113 - .../site-packages/pip/_vendor/rich/logging.py | 289 - .../site-packages/pip/_vendor/rich/markup.py | 246 - .../site-packages/pip/_vendor/rich/measure.py | 151 - .../site-packages/pip/_vendor/rich/padding.py | 141 - .../site-packages/pip/_vendor/rich/pager.py | 34 - .../site-packages/pip/_vendor/rich/palette.py | 100 - .../site-packages/pip/_vendor/rich/panel.py | 308 - .../site-packages/pip/_vendor/rich/pretty.py | 994 -- .../pip/_vendor/rich/progress.py | 1702 ---- .../pip/_vendor/rich/progress_bar.py | 224 - .../site-packages/pip/_vendor/rich/prompt.py | 376 - .../pip/_vendor/rich/protocol.py | 42 - .../site-packages/pip/_vendor/rich/region.py | 10 - .../site-packages/pip/_vendor/rich/repr.py | 149 - .../site-packages/pip/_vendor/rich/rule.py | 130 - .../site-packages/pip/_vendor/rich/scope.py | 86 - .../site-packages/pip/_vendor/rich/screen.py | 54 - .../site-packages/pip/_vendor/rich/segment.py | 739 -- .../site-packages/pip/_vendor/rich/spinner.py | 137 - .../site-packages/pip/_vendor/rich/status.py | 132 - .../site-packages/pip/_vendor/rich/style.py | 796 -- .../site-packages/pip/_vendor/rich/styled.py | 42 - .../site-packages/pip/_vendor/rich/syntax.py | 948 -- .../site-packages/pip/_vendor/rich/table.py | 1002 -- .../pip/_vendor/rich/terminal_theme.py | 153 - .../site-packages/pip/_vendor/rich/text.py | 1307 --- .../site-packages/pip/_vendor/rich/theme.py | 115 - .../site-packages/pip/_vendor/rich/themes.py | 5 - .../pip/_vendor/rich/traceback.py | 756 -- .../site-packages/pip/_vendor/rich/tree.py | 251 - .../site-packages/pip/_vendor/six.py | 998 -- .../pip/_vendor/tenacity/__init__.py | 608 -- .../__pycache__/__init__.cpython-312.pyc | Bin 27087 -> 0 bytes .../__pycache__/_asyncio.cpython-312.pyc | Bin 4807 -> 0 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 2316 -> 0 bytes .../__pycache__/after.cpython-312.pyc | Bin 1625 -> 0 bytes .../__pycache__/before.cpython-312.pyc | Bin 1465 -> 0 bytes .../__pycache__/before_sleep.cpython-312.pyc | Bin 2303 -> 0 bytes .../tenacity/__pycache__/nap.cpython-312.pyc | Bin 1413 -> 0 bytes .../__pycache__/retry.cpython-312.pyc | Bin 14282 -> 0 bytes .../tenacity/__pycache__/stop.cpython-312.pyc | Bin 5569 -> 0 bytes .../__pycache__/tornadoweb.cpython-312.pyc | Bin 2587 -> 0 bytes .../tenacity/__pycache__/wait.cpython-312.pyc | Bin 12414 -> 0 bytes .../pip/_vendor/tenacity/_asyncio.py | 94 - .../pip/_vendor/tenacity/_utils.py | 76 - .../pip/_vendor/tenacity/after.py | 51 - .../pip/_vendor/tenacity/before.py | 46 - .../pip/_vendor/tenacity/before_sleep.py | 71 - .../site-packages/pip/_vendor/tenacity/nap.py | 43 - .../pip/_vendor/tenacity/retry.py | 272 - .../pip/_vendor/tenacity/stop.py | 103 - .../pip/_vendor/tenacity/tornadoweb.py | 59 - .../pip/_vendor/tenacity/wait.py | 228 - .../pip/_vendor/tomli/__init__.py | 11 - .../__pycache__/__init__.cpython-312.pyc | Bin 385 -> 0 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 26928 -> 0 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 3909 -> 0 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 367 -> 0 bytes .../pip/_vendor/tomli/_parser.py | 691 -- .../site-packages/pip/_vendor/tomli/_re.py | 107 - .../site-packages/pip/_vendor/tomli/_types.py | 10 - .../pip/_vendor/truststore/__init__.py | 13 - .../__pycache__/__init__.cpython-312.pyc | Bin 619 -> 0 bytes .../__pycache__/_api.cpython-312.pyc | Bin 15798 -> 0 bytes .../__pycache__/_macos.cpython-312.pyc | Bin 16663 -> 0 bytes .../__pycache__/_openssl.cpython-312.pyc | Bin 2216 -> 0 bytes .../_ssl_constants.cpython-312.pyc | Bin 1100 -> 0 bytes .../__pycache__/_windows.cpython-312.pyc | Bin 15507 -> 0 bytes .../pip/_vendor/truststore/_api.py | 302 - .../pip/_vendor/truststore/_macos.py | 501 - .../pip/_vendor/truststore/_openssl.py | 66 - .../pip/_vendor/truststore/_ssl_constants.py | 31 - .../pip/_vendor/truststore/_windows.py | 554 -- .../pip/_vendor/typing_extensions.py | 3072 ------ .../pip/_vendor/urllib3/__init__.py | 102 - .../__pycache__/__init__.cpython-312.pyc | Bin 3406 -> 0 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 16489 -> 0 bytes .../__pycache__/_version.cpython-312.pyc | Bin 219 -> 0 bytes .../__pycache__/connection.cpython-312.pyc | Bin 20408 -> 0 bytes .../connectionpool.cpython-312.pyc | Bin 36443 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 13494 -> 0 bytes .../__pycache__/fields.cpython-312.pyc | Bin 10414 -> 0 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 4019 -> 0 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 20801 -> 0 bytes .../__pycache__/request.cpython-312.pyc | Bin 7295 -> 0 bytes .../__pycache__/response.cpython-312.pyc | Bin 33969 -> 0 bytes .../pip/_vendor/urllib3/_collections.py | 355 - .../pip/_vendor/urllib3/_version.py | 2 - .../pip/_vendor/urllib3/connection.py | 572 -- .../pip/_vendor/urllib3/connectionpool.py | 1137 --- .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 199 -> 0 bytes .../_appengine_environ.cpython-312.pyc | Bin 1849 -> 0 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 11565 -> 0 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 5720 -> 0 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 24451 -> 0 bytes .../securetransport.cpython-312.pyc | Bin 35557 -> 0 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 7512 -> 0 bytes .../urllib3/contrib/_appengine_environ.py | 36 - .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 216 -> 0 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 17428 -> 0 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 14802 -> 0 bytes .../contrib/_securetransport/bindings.py | 519 - .../contrib/_securetransport/low_level.py | 397 - .../pip/_vendor/urllib3/contrib/appengine.py | 314 - .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 - .../pip/_vendor/urllib3/contrib/pyopenssl.py | 518 - .../urllib3/contrib/securetransport.py | 921 -- .../pip/_vendor/urllib3/contrib/socks.py | 216 - .../pip/_vendor/urllib3/exceptions.py | 323 - .../pip/_vendor/urllib3/fields.py | 274 - .../pip/_vendor/urllib3/filepost.py | 98 - .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 200 -> 0 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 41320 -> 0 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 210 -> 0 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 1826 -> 0 bytes .../weakref_finalize.cpython-312.pyc | Bin 7332 -> 0 bytes .../urllib3/packages/backports/makefile.py | 51 - .../packages/backports/weakref_finalize.py | 155 - .../pip/_vendor/urllib3/packages/six.py | 1076 -- .../pip/_vendor/urllib3/poolmanager.py | 556 -- .../pip/_vendor/urllib3/request.py | 191 - .../pip/_vendor/urllib3/response.py | 879 -- .../pip/_vendor/urllib3/util/__init__.py | 49 - .../util/__pycache__/__init__.cpython-312.pyc | Bin 1147 -> 0 bytes .../__pycache__/connection.cpython-312.pyc | Bin 4757 -> 0 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 1553 -> 0 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 1353 -> 0 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 4184 -> 0 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 2990 -> 0 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 21719 -> 0 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 15104 -> 0 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 5072 -> 0 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 10773 -> 0 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 11140 -> 0 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 15796 -> 0 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 4404 -> 0 bytes .../pip/_vendor/urllib3/util/connection.py | 149 - .../pip/_vendor/urllib3/util/proxy.py | 57 - .../pip/_vendor/urllib3/util/queue.py | 22 - .../pip/_vendor/urllib3/util/request.py | 137 - .../pip/_vendor/urllib3/util/response.py | 107 - .../pip/_vendor/urllib3/util/retry.py | 622 -- .../pip/_vendor/urllib3/util/ssl_.py | 495 - .../urllib3/util/ssl_match_hostname.py | 159 - .../pip/_vendor/urllib3/util/ssltransport.py | 221 - .../pip/_vendor/urllib3/util/timeout.py | 271 - .../pip/_vendor/urllib3/util/url.py | 435 - .../pip/_vendor/urllib3/util/wait.py | 152 - .../site-packages/pip/_vendor/vendor.txt | 24 - .../pip/_vendor/webencodings/__init__.py | 342 - .../__pycache__/__init__.cpython-312.pyc | Bin 12002 -> 0 bytes .../__pycache__/labels.cpython-312.pyc | Bin 7133 -> 0 bytes .../__pycache__/mklabels.cpython-312.pyc | Bin 2700 -> 0 bytes .../__pycache__/tests.cpython-312.pyc | Bin 9252 -> 0 bytes .../x_user_defined.cpython-312.pyc | Bin 3296 -> 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 - .../lib/python3.12/site-packages/pip/py.typed | 4 - .../proxmoxer-2.2.0.dist-info/INSTALLER | 1 - .../proxmoxer-2.2.0.dist-info/LICENSE.txt | 21 - .../proxmoxer-2.2.0.dist-info/METADATA | 139 - .../proxmoxer-2.2.0.dist-info/RECORD | 29 - .../proxmoxer-2.2.0.dist-info/REQUESTED | 0 .../proxmoxer-2.2.0.dist-info/WHEEL | 5 - .../proxmoxer-2.2.0.dist-info/top_level.txt | 1 - .../site-packages/proxmoxer/__init__.py | 6 - .../__pycache__/__init__.cpython-312.pyc | Bin 352 -> 0 bytes .../__pycache__/core.cpython-312.pyc | Bin 11044 -> 0 bytes .../proxmoxer/backends/__init__.py | 3 - .../__pycache__/__init__.cpython-312.pyc | Bin 303 -> 0 bytes .../__pycache__/command_base.cpython-312.pyc | Bin 8099 -> 0 bytes .../__pycache__/https.cpython-312.pyc | Bin 14386 -> 0 bytes .../__pycache__/local.cpython-312.pyc | Bin 1840 -> 0 bytes .../__pycache__/openssh.cpython-312.pyc | Bin 3207 -> 0 bytes .../__pycache__/ssh_paramiko.cpython-312.pyc | Bin 3996 -> 0 bytes .../proxmoxer/backends/command_base.py | 171 - .../site-packages/proxmoxer/backends/https.py | 386 - .../site-packages/proxmoxer/backends/local.py | 25 - .../proxmoxer/backends/openssh.py | 67 - .../proxmoxer/backends/ssh_paramiko.py | 77 - .../site-packages/proxmoxer/core.py | 231 - .../site-packages/proxmoxer/tools/__init__.py | 7 - .../__pycache__/__init__.cpython-312.pyc | Bin 362 -> 0 bytes .../tools/__pycache__/files.cpython-312.pyc | Bin 14063 -> 0 bytes .../tools/__pycache__/tasks.cpython-312.pyc | Bin 3774 -> 0 bytes .../site-packages/proxmoxer/tools/files.py | 279 - .../site-packages/proxmoxer/tools/tasks.py | 84 - .../requests-2.32.5.dist-info/INSTALLER | 1 - .../requests-2.32.5.dist-info/METADATA | 133 - .../requests-2.32.5.dist-info/RECORD | 43 - .../requests-2.32.5.dist-info/REQUESTED | 0 .../requests-2.32.5.dist-info/WHEEL | 5 - .../licenses/LICENSE | 175 - .../requests-2.32.5.dist-info/top_level.txt | 1 - .../site-packages/requests/__init__.py | 184 - .../__pycache__/__init__.cpython-312.pyc | Bin 5409 -> 0 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 573 -> 0 bytes .../_internal_utils.cpython-312.pyc | Bin 2013 -> 0 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 27800 -> 0 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 7193 -> 0 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 13912 -> 0 bytes .../__pycache__/certs.cpython-312.pyc | Bin 655 -> 0 bytes .../__pycache__/compat.cpython-312.pyc | Bin 2369 -> 0 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 25265 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7574 -> 0 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 4316 -> 0 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 1041 -> 0 bytes .../__pycache__/models.cpython-312.pyc | Bin 35490 -> 0 bytes .../__pycache__/packages.cpython-312.pyc | Bin 1128 -> 0 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 27879 -> 0 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 6020 -> 0 bytes .../__pycache__/structures.cpython-312.pyc | Bin 5606 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 36167 -> 0 bytes .../site-packages/requests/__version__.py | 14 - .../site-packages/requests/_internal_utils.py | 50 - .../site-packages/requests/adapters.py | 696 -- .../python3.12/site-packages/requests/api.py | 157 - .../python3.12/site-packages/requests/auth.py | 314 - .../site-packages/requests/certs.py | 17 - .../site-packages/requests/compat.py | 106 - .../site-packages/requests/cookies.py | 561 -- .../site-packages/requests/exceptions.py | 151 - .../python3.12/site-packages/requests/help.py | 134 - .../site-packages/requests/hooks.py | 33 - .../site-packages/requests/models.py | 1039 -- .../site-packages/requests/packages.py | 23 - .../site-packages/requests/sessions.py | 831 -- .../site-packages/requests/status_codes.py | 128 - .../site-packages/requests/structures.py | 99 - .../site-packages/requests/utils.py | 1086 -- .../urllib3-2.6.2.dist-info/INSTALLER | 1 - .../urllib3-2.6.2.dist-info/METADATA | 156 - .../urllib3-2.6.2.dist-info/RECORD | 79 - .../urllib3-2.6.2.dist-info/WHEEL | 4 - .../licenses/LICENSE.txt | 21 - .../site-packages/urllib3/__init__.py | 211 - .../__pycache__/__init__.cpython-312.pyc | Bin 7304 -> 0 bytes .../_base_connection.cpython-312.pyc | Bin 6842 -> 0 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 22993 -> 0 bytes .../_request_methods.cpython-312.pyc | Bin 10596 -> 0 bytes .../__pycache__/_version.cpython-312.pyc | Bin 787 -> 0 bytes .../__pycache__/connection.cpython-312.pyc | Bin 38914 -> 0 bytes .../connectionpool.cpython-312.pyc | Bin 39729 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 16605 -> 0 bytes .../__pycache__/fields.cpython-312.pyc | Bin 12016 -> 0 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 3483 -> 0 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 24332 -> 0 bytes .../__pycache__/response.cpython-312.pyc | Bin 57429 -> 0 bytes .../site-packages/urllib3/_base_connection.py | 165 - .../site-packages/urllib3/_collections.py | 487 - .../site-packages/urllib3/_request_methods.py | 278 - .../site-packages/urllib3/_version.py | 34 - .../site-packages/urllib3/connection.py | 1099 -- .../site-packages/urllib3/connectionpool.py | 1178 --- .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 187 -> 0 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 28210 -> 0 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 8165 -> 0 bytes .../urllib3/contrib/emscripten/__init__.py | 16 - .../__pycache__/__init__.cpython-312.pyc | Bin 895 -> 0 bytes .../__pycache__/connection.cpython-312.pyc | Bin 10306 -> 0 bytes .../__pycache__/fetch.cpython-312.pyc | Bin 28632 -> 0 bytes .../__pycache__/request.cpython-312.pyc | Bin 1415 -> 0 bytes .../__pycache__/response.cpython-312.pyc | Bin 12209 -> 0 bytes .../urllib3/contrib/emscripten/connection.py | 259 - .../emscripten/emscripten_fetch_worker.js | 110 - .../urllib3/contrib/emscripten/fetch.py | 726 -- .../urllib3/contrib/emscripten/request.py | 22 - .../urllib3/contrib/emscripten/response.py | 277 - .../urllib3/contrib/pyopenssl.py | 564 -- .../site-packages/urllib3/contrib/socks.py | 228 - .../site-packages/urllib3/exceptions.py | 335 - .../site-packages/urllib3/fields.py | 341 - .../site-packages/urllib3/filepost.py | 89 - .../site-packages/urllib3/http2/__init__.py | 53 - .../__pycache__/__init__.cpython-312.pyc | Bin 1740 -> 0 bytes .../__pycache__/connection.cpython-312.pyc | Bin 17047 -> 0 bytes .../http2/__pycache__/probe.cpython-312.pyc | Bin 3691 -> 0 bytes .../site-packages/urllib3/http2/connection.py | 356 - .../site-packages/urllib3/http2/probe.py | 87 - .../site-packages/urllib3/poolmanager.py | 651 -- .../python3.12/site-packages/urllib3/py.typed | 2 - .../site-packages/urllib3/response.py | 1476 --- .../site-packages/urllib3/util/__init__.py | 42 - .../util/__pycache__/__init__.cpython-312.pyc | Bin 1000 -> 0 bytes .../__pycache__/connection.cpython-312.pyc | Bin 4690 -> 0 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 1212 -> 0 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 8336 -> 0 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 2868 -> 0 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 20281 -> 0 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 17314 -> 0 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 5552 -> 0 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 13319 -> 0 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 11684 -> 0 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 16221 -> 0 bytes .../util/__pycache__/util.cpython-312.pyc | Bin 1989 -> 0 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 3435 -> 0 bytes .../site-packages/urllib3/util/connection.py | 137 - .../site-packages/urllib3/util/proxy.py | 43 - .../site-packages/urllib3/util/request.py | 263 - .../site-packages/urllib3/util/response.py | 101 - .../site-packages/urllib3/util/retry.py | 533 - .../site-packages/urllib3/util/ssl_.py | 527 - .../urllib3/util/ssl_match_hostname.py | 159 - .../urllib3/util/ssltransport.py | 271 - .../site-packages/urllib3/util/timeout.py | 275 - .../site-packages/urllib3/util/url.py | 469 - .../site-packages/urllib3/util/util.py | 42 - .../site-packages/urllib3/util/wait.py | 124 - .../werkzeug-3.1.4.dist-info/INSTALLER | 1 - .../werkzeug-3.1.4.dist-info/METADATA | 109 - .../werkzeug-3.1.4.dist-info/RECORD | 116 - .../werkzeug-3.1.4.dist-info/WHEEL | 4 - .../licenses/LICENSE.txt | 28 - .../site-packages/werkzeug/__init__.py | 4 - .../__pycache__/__init__.cpython-312.pyc | Bin 334 -> 0 bytes .../__pycache__/_internal.cpython-312.pyc | Bin 9747 -> 0 bytes .../__pycache__/_reloader.cpython-312.pyc | Bin 20918 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 34013 -> 0 bytes .../__pycache__/formparser.cpython-312.pyc | Bin 17020 -> 0 bytes .../werkzeug/__pycache__/http.cpython-312.pyc | Bin 50245 -> 0 bytes .../__pycache__/local.cpython-312.pyc | Bin 28475 -> 0 bytes .../__pycache__/security.cpython-312.pyc | Bin 7899 -> 0 bytes .../__pycache__/serving.cpython-312.pyc | Bin 46091 -> 0 bytes .../werkzeug/__pycache__/test.cpython-312.pyc | Bin 59864 -> 0 bytes .../__pycache__/testapp.cpython-312.pyc | Bin 8885 -> 0 bytes .../werkzeug/__pycache__/urls.cpython-312.pyc | Bin 8264 -> 0 bytes .../__pycache__/user_agent.cpython-312.pyc | Bin 2147 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 27724 -> 0 bytes .../werkzeug/__pycache__/wsgi.cpython-312.pyc | Bin 25210 -> 0 bytes .../site-packages/werkzeug/_internal.py | 211 - .../site-packages/werkzeug/_reloader.py | 465 - .../werkzeug/datastructures/__init__.py | 64 - .../__pycache__/__init__.cpython-312.pyc | Bin 2411 -> 0 bytes .../__pycache__/accept.cpython-312.pyc | Bin 15938 -> 0 bytes .../__pycache__/auth.cpython-312.pyc | Bin 14453 -> 0 bytes .../__pycache__/cache_control.cpython-312.pyc | Bin 12220 -> 0 bytes .../__pycache__/csp.cpython-312.pyc | Bin 6181 -> 0 bytes .../__pycache__/etag.cpython-312.pyc | Bin 5396 -> 0 bytes .../__pycache__/file_storage.cpython-312.pyc | Bin 8818 -> 0 bytes .../__pycache__/headers.cpython-312.pyc | Bin 30514 -> 0 bytes .../__pycache__/mixins.cpython-312.pyc | Bin 16394 -> 0 bytes .../__pycache__/range.cpython-312.pyc | Bin 10049 -> 0 bytes .../__pycache__/structures.cpython-312.pyc | Bin 59085 -> 0 bytes .../werkzeug/datastructures/accept.py | 350 - .../werkzeug/datastructures/auth.py | 317 - .../werkzeug/datastructures/cache_control.py | 273 - .../werkzeug/datastructures/csp.py | 100 - .../werkzeug/datastructures/etag.py | 106 - .../werkzeug/datastructures/file_storage.py | 209 - .../werkzeug/datastructures/headers.py | 662 -- .../werkzeug/datastructures/mixins.py | 317 - .../werkzeug/datastructures/range.py | 214 - .../werkzeug/datastructures/structures.py | 1239 --- .../site-packages/werkzeug/debug/__init__.py | 573 -- .../__pycache__/__init__.cpython-312.pyc | Bin 23582 -> 0 bytes .../debug/__pycache__/console.cpython-312.pyc | Bin 11631 -> 0 bytes .../debug/__pycache__/repr.cpython-312.pyc | Bin 13804 -> 0 bytes .../debug/__pycache__/tbtools.cpython-312.pyc | Bin 17036 -> 0 bytes .../site-packages/werkzeug/debug/console.py | 219 - .../site-packages/werkzeug/debug/repr.py | 282 - .../werkzeug/debug/shared/ICON_LICENSE.md | 6 - .../werkzeug/debug/shared/console.png | Bin 507 -> 0 bytes .../werkzeug/debug/shared/debugger.js | 344 - .../werkzeug/debug/shared/less.png | Bin 191 -> 0 bytes .../werkzeug/debug/shared/more.png | Bin 200 -> 0 bytes .../werkzeug/debug/shared/style.css | 150 - .../site-packages/werkzeug/debug/tbtools.py | 449 - .../site-packages/werkzeug/exceptions.py | 905 -- .../site-packages/werkzeug/formparser.py | 430 - .../python3.12/site-packages/werkzeug/http.py | 1405 --- .../site-packages/werkzeug/local.py | 653 -- .../werkzeug/middleware/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 191 -> 0 bytes .../__pycache__/dispatcher.cpython-312.pyc | Bin 3309 -> 0 bytes .../__pycache__/http_proxy.cpython-312.pyc | Bin 9401 -> 0 bytes .../__pycache__/lint.cpython-312.pyc | Bin 17771 -> 0 bytes .../__pycache__/profiler.cpython-312.pyc | Bin 7195 -> 0 bytes .../__pycache__/proxy_fix.cpython-312.pyc | Bin 7192 -> 0 bytes .../__pycache__/shared_data.cpython-312.pyc | Bin 12747 -> 0 bytes .../werkzeug/middleware/dispatcher.py | 81 - .../werkzeug/middleware/http_proxy.py | 236 - .../site-packages/werkzeug/middleware/lint.py | 439 - .../werkzeug/middleware/profiler.py | 155 - .../werkzeug/middleware/proxy_fix.py | 183 - .../werkzeug/middleware/shared_data.py | 283 - .../site-packages/werkzeug/py.typed | 0 .../werkzeug/routing/__init__.py | 134 - .../__pycache__/__init__.cpython-312.pyc | Bin 4664 -> 0 bytes .../__pycache__/converters.cpython-312.pyc | Bin 10904 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7907 -> 0 bytes .../routing/__pycache__/map.cpython-312.pyc | Bin 39832 -> 0 bytes .../__pycache__/matcher.cpython-312.pyc | Bin 8275 -> 0 bytes .../routing/__pycache__/rules.cpython-312.pyc | Bin 39166 -> 0 bytes .../werkzeug/routing/converters.py | 261 - .../werkzeug/routing/exceptions.py | 152 - .../site-packages/werkzeug/routing/map.py | 951 -- .../site-packages/werkzeug/routing/matcher.py | 202 - .../site-packages/werkzeug/routing/rules.py | 928 -- .../site-packages/werkzeug/sansio/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 187 -> 0 bytes .../sansio/__pycache__/http.cpython-312.pyc | Bin 5638 -> 0 bytes .../__pycache__/multipart.cpython-312.pyc | Bin 14287 -> 0 bytes .../__pycache__/request.cpython-312.pyc | Bin 21880 -> 0 bytes .../__pycache__/response.cpython-312.pyc | Bin 31735 -> 0 bytes .../sansio/__pycache__/utils.cpython-312.pyc | Bin 6177 -> 0 bytes .../site-packages/werkzeug/sansio/http.py | 170 - .../werkzeug/sansio/multipart.py | 333 - .../site-packages/werkzeug/sansio/request.py | 534 - .../site-packages/werkzeug/sansio/response.py | 763 -- .../site-packages/werkzeug/sansio/utils.py | 167 - .../site-packages/werkzeug/security.py | 181 - .../site-packages/werkzeug/serving.py | 1125 --- .../python3.12/site-packages/werkzeug/test.py | 1464 --- .../site-packages/werkzeug/testapp.py | 194 - .../python3.12/site-packages/werkzeug/urls.py | 203 - .../site-packages/werkzeug/user_agent.py | 47 - .../site-packages/werkzeug/utils.py | 684 -- .../werkzeug/wrappers/__init__.py | 3 - .../__pycache__/__init__.cpython-312.pyc | Bin 311 -> 0 bytes .../__pycache__/request.cpython-312.pyc | Bin 26141 -> 0 bytes .../__pycache__/response.cpython-312.pyc | Bin 34566 -> 0 bytes .../werkzeug/wrappers/request.py | 650 -- .../werkzeug/wrappers/response.py | 831 -- .../python3.12/site-packages/werkzeug/wsgi.py | 595 -- venv/lib64 | 1 - venv/pyvenv.cfg | 5 - 1544 files changed, 4 insertions(+), 296549 deletions(-) delete mode 100644 .gitignore.backup.20260103_171034 delete mode 100644 .phase1-event-status delete mode 100644 __pycache__/list_vms.cpython-312.pyc delete mode 100644 home/intlc/projects/proxmox/multi-chain-execution/src/api/mirror-routes.ts 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/flask delete mode 100755 venv/bin/normalizer delete mode 100755 venv/bin/pip delete mode 100755 venv/bin/pip3 delete mode 100755 venv/bin/pip3.12 delete mode 120000 venv/bin/python delete mode 120000 venv/bin/python3 delete mode 120000 venv/bin/python3.12 delete mode 100644 venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/LICENSE.txt delete mode 100644 venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/blinker/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/blinker/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/blinker/__pycache__/_utilities.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/blinker/__pycache__/base.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/blinker/_utilities.py delete mode 100644 venv/lib/python3.12/site-packages/blinker/base.py delete mode 100644 venv/lib/python3.12/site-packages/blinker/py.typed delete mode 100644 venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/certifi/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/certifi/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/certifi/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/certifi/cacert.pem delete mode 100644 venv/lib/python3.12/site-packages/certifi/core.py delete mode 100644 venv/lib/python3.12/site-packages/certifi/py.typed delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/md.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/api.py delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/cd.py delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/constant.py delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/legacy.py delete mode 100755 venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/md.py delete mode 100755 venv/lib/python3.12/site-packages/charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/models.py delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/py.typed delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/utils.py delete mode 100644 venv/lib/python3.12/site-packages/charset_normalizer/version.py delete mode 100644 venv/lib/python3.12/site-packages/click-8.3.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/click-8.3.1.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/click-8.3.1.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/click-8.3.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/click-8.3.1.dist-info/licenses/LICENSE.txt delete mode 100644 venv/lib/python3.12/site-packages/click/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/click/__pycache__/_textwrap.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/click/__pycache__/testing.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/click/_compat.py delete mode 100644 venv/lib/python3.12/site-packages/click/_termui_impl.py delete mode 100644 venv/lib/python3.12/site-packages/click/_textwrap.py delete mode 100644 venv/lib/python3.12/site-packages/click/_utils.py delete mode 100644 venv/lib/python3.12/site-packages/click/_winconsole.py delete mode 100644 venv/lib/python3.12/site-packages/click/core.py delete mode 100644 venv/lib/python3.12/site-packages/click/decorators.py delete mode 100644 venv/lib/python3.12/site-packages/click/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/click/formatting.py delete mode 100644 venv/lib/python3.12/site-packages/click/globals.py delete mode 100644 venv/lib/python3.12/site-packages/click/parser.py delete mode 100644 venv/lib/python3.12/site-packages/click/py.typed delete mode 100644 venv/lib/python3.12/site-packages/click/shell_completion.py delete mode 100644 venv/lib/python3.12/site-packages/click/termui.py delete mode 100644 venv/lib/python3.12/site-packages/click/testing.py delete mode 100644 venv/lib/python3.12/site-packages/click/types.py delete mode 100644 venv/lib/python3.12/site-packages/click/utils.py delete mode 100644 venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/REQUESTED delete mode 100644 venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/licenses/LICENSE.txt delete mode 100644 venv/lib/python3.12/site-packages/flask/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/flask/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/app.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/blueprints.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/cli.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/config.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/ctx.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/debughelpers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/globals.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/helpers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/logging.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/sessions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/signals.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/templating.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/testing.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/typing.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/views.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/__pycache__/wrappers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/app.py delete mode 100644 venv/lib/python3.12/site-packages/flask/blueprints.py delete mode 100644 venv/lib/python3.12/site-packages/flask/cli.py delete mode 100644 venv/lib/python3.12/site-packages/flask/config.py delete mode 100644 venv/lib/python3.12/site-packages/flask/ctx.py delete mode 100644 venv/lib/python3.12/site-packages/flask/debughelpers.py delete mode 100644 venv/lib/python3.12/site-packages/flask/globals.py delete mode 100644 venv/lib/python3.12/site-packages/flask/helpers.py delete mode 100644 venv/lib/python3.12/site-packages/flask/json/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/json/__pycache__/provider.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/json/__pycache__/tag.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/json/provider.py delete mode 100644 venv/lib/python3.12/site-packages/flask/json/tag.py delete mode 100644 venv/lib/python3.12/site-packages/flask/logging.py delete mode 100644 venv/lib/python3.12/site-packages/flask/py.typed delete mode 100644 venv/lib/python3.12/site-packages/flask/sansio/README.md delete mode 100644 venv/lib/python3.12/site-packages/flask/sansio/__pycache__/app.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/sansio/__pycache__/blueprints.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/sansio/__pycache__/scaffold.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/flask/sansio/app.py delete mode 100644 venv/lib/python3.12/site-packages/flask/sansio/blueprints.py delete mode 100644 venv/lib/python3.12/site-packages/flask/sansio/scaffold.py delete mode 100644 venv/lib/python3.12/site-packages/flask/sessions.py delete mode 100644 venv/lib/python3.12/site-packages/flask/signals.py delete mode 100644 venv/lib/python3.12/site-packages/flask/templating.py delete mode 100644 venv/lib/python3.12/site-packages/flask/testing.py delete mode 100644 venv/lib/python3.12/site-packages/flask/typing.py delete mode 100644 venv/lib/python3.12/site-packages/flask/views.py delete mode 100644 venv/lib/python3.12/site-packages/flask/wrappers.py delete mode 100644 venv/lib/python3.12/site-packages/idna-3.11.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/idna-3.11.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/idna-3.11.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/idna-3.11.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/idna-3.11.dist-info/licenses/LICENSE.md delete mode 100644 venv/lib/python3.12/site-packages/idna/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/idna/__pycache__/codec.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/idna/__pycache__/compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/idna/__pycache__/uts46data.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/idna/codec.py delete mode 100644 venv/lib/python3.12/site-packages/idna/compat.py delete mode 100644 venv/lib/python3.12/site-packages/idna/core.py delete mode 100644 venv/lib/python3.12/site-packages/idna/idnadata.py delete mode 100644 venv/lib/python3.12/site-packages/idna/intranges.py delete mode 100644 venv/lib/python3.12/site-packages/idna/package_data.py delete mode 100644 venv/lib/python3.12/site-packages/idna/py.typed delete mode 100644 venv/lib/python3.12/site-packages/idna/uts46data.py delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous/__pycache__/_json.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous/__pycache__/encoding.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous/__pycache__/exc.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous/__pycache__/serializer.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous/__pycache__/signer.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous/__pycache__/timed.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous/__pycache__/url_safe.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous/_json.py delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous/encoding.py delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous/exc.py delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous/py.typed delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous/serializer.py delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous/signer.py delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous/timed.py delete mode 100644 venv/lib/python3.12/site-packages/itsdangerous/url_safe.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/_identifier.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/async_utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/bccache.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/compiler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/constants.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/debug.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/defaults.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/environment.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/ext.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/filters.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/idtracking.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/lexer.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/loaders.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/meta.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/nativetypes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/nodes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/optimizer.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/parser.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/runtime.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/sandbox.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/tests.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/__pycache__/visitor.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/jinja2/_identifier.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/async_utils.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/bccache.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/compiler.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/constants.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/debug.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/defaults.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/environment.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/ext.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/filters.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/idtracking.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/lexer.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/loaders.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/meta.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/nativetypes.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/nodes.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/optimizer.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/parser.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/py.typed delete mode 100644 venv/lib/python3.12/site-packages/jinja2/runtime.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/sandbox.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/tests.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/utils.py delete mode 100644 venv/lib/python3.12/site-packages/jinja2/visitor.py delete mode 100644 venv/lib/python3.12/site-packages/markupsafe-3.0.3.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/markupsafe-3.0.3.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/markupsafe-3.0.3.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/markupsafe-3.0.3.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/markupsafe-3.0.3.dist-info/licenses/LICENSE.txt delete mode 100644 venv/lib/python3.12/site-packages/markupsafe-3.0.3.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/markupsafe/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/markupsafe/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/markupsafe/__pycache__/_native.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/markupsafe/_native.py delete mode 100644 venv/lib/python3.12/site-packages/markupsafe/_speedups.c delete mode 100755 venv/lib/python3.12/site-packages/markupsafe/_speedups.cpython-312-x86_64-linux-gnu.so delete mode 100644 venv/lib/python3.12/site-packages/markupsafe/_speedups.pyi delete mode 100644 venv/lib/python3.12/site-packages/markupsafe/py.typed delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/REQUESTED delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/pip/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/__pip-runner__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/build_env.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cache.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/main.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/check.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/download.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/help.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/index.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/install.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/list.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/search.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/show.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/configuration.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/collector.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/sources.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/base.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/main.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/index.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/link.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/auth.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/cache.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/download.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/session.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/utils.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/check.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/pyproject.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/models.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/_log.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/models.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/core.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/token.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/util.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/actions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/json.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/layout.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/markup.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/measure.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/padding.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/pager.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/palette.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/panel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/region.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/repr.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/rule.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/scope.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/screen.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/segment.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/status.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/styled.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/table.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/theme.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/themes.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/tree.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/six.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/vendor.txt delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/labels.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/x_user_defined.py delete mode 100644 venv/lib/python3.12/site-packages/pip/py.typed delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer-2.2.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer-2.2.0.dist-info/LICENSE.txt delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer-2.2.0.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer-2.2.0.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer-2.2.0.dist-info/REQUESTED delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer-2.2.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer-2.2.0.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/__pycache__/core.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/backends/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/backends/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/backends/__pycache__/command_base.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/backends/__pycache__/https.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/backends/__pycache__/local.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/backends/__pycache__/openssh.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/backends/__pycache__/ssh_paramiko.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/backends/command_base.py delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/backends/https.py delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/backends/local.py delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/backends/openssh.py delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/backends/ssh_paramiko.py delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/core.py delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/tools/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/tools/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/tools/__pycache__/files.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/tools/__pycache__/tasks.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/tools/files.py delete mode 100644 venv/lib/python3.12/site-packages/proxmoxer/tools/tasks.py delete mode 100644 venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/REQUESTED delete mode 100644 venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/requests/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/__version__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/_internal_utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/adapters.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/api.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/auth.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/certs.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/cookies.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/help.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/hooks.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/models.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/packages.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/sessions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/status_codes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/structures.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__pycache__/utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/requests/__version__.py delete mode 100644 venv/lib/python3.12/site-packages/requests/_internal_utils.py delete mode 100644 venv/lib/python3.12/site-packages/requests/adapters.py delete mode 100644 venv/lib/python3.12/site-packages/requests/api.py delete mode 100644 venv/lib/python3.12/site-packages/requests/auth.py delete mode 100644 venv/lib/python3.12/site-packages/requests/certs.py delete mode 100644 venv/lib/python3.12/site-packages/requests/compat.py delete mode 100644 venv/lib/python3.12/site-packages/requests/cookies.py delete mode 100644 venv/lib/python3.12/site-packages/requests/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/requests/help.py delete mode 100644 venv/lib/python3.12/site-packages/requests/hooks.py delete mode 100644 venv/lib/python3.12/site-packages/requests/models.py delete mode 100644 venv/lib/python3.12/site-packages/requests/packages.py delete mode 100644 venv/lib/python3.12/site-packages/requests/sessions.py delete mode 100644 venv/lib/python3.12/site-packages/requests/status_codes.py delete mode 100644 venv/lib/python3.12/site-packages/requests/structures.py delete mode 100644 venv/lib/python3.12/site-packages/requests/utils.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3-2.6.2.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/urllib3-2.6.2.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/urllib3-2.6.2.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/urllib3-2.6.2.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/urllib3-2.6.2.dist-info/licenses/LICENSE.txt delete mode 100644 venv/lib/python3.12/site-packages/urllib3/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/_base_connection.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/_collections.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/_request_methods.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/_version.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/connection.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/connectionpool.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/fields.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/filepost.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/poolmanager.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/response.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/_base_connection.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/_collections.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/_request_methods.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/_version.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/connection.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/connectionpool.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/socks.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/connection.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/fetch.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/request.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/response.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/connection.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/emscripten_fetch_worker.js delete mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/fetch.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/request.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/response.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/pyopenssl.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/socks.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/fields.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/filepost.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/http2/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/connection.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/probe.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/http2/connection.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/http2/probe.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/poolmanager.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/py.typed delete mode 100644 venv/lib/python3.12/site-packages/urllib3/response.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/connection.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/proxy.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/request.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/response.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/retry.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/timeout.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/url.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/util.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/wait.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/connection.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/proxy.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/request.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/response.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/retry.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/ssl_.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/ssl_match_hostname.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/ssltransport.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/timeout.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/url.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/util.py delete mode 100644 venv/lib/python3.12/site-packages/urllib3/util/wait.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug-3.1.4.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/werkzeug-3.1.4.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/werkzeug-3.1.4.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/werkzeug-3.1.4.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/werkzeug-3.1.4.dist-info/licenses/LICENSE.txt delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/__pycache__/_internal.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/__pycache__/_reloader.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/__pycache__/formparser.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/__pycache__/http.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/__pycache__/local.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/__pycache__/security.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/__pycache__/serving.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/__pycache__/test.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/__pycache__/testapp.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/__pycache__/urls.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/__pycache__/user_agent.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/__pycache__/utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/__pycache__/wsgi.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/_internal.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/_reloader.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/accept.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/auth.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/cache_control.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/csp.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/etag.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/file_storage.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/headers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/mixins.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/range.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/structures.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/accept.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/auth.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/cache_control.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/csp.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/etag.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/file_storage.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/headers.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/mixins.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/range.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/datastructures/structures.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/debug/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/debug/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/debug/__pycache__/console.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/debug/__pycache__/repr.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/debug/console.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/debug/repr.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/debug/shared/ICON_LICENSE.md delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/debug/shared/console.png delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/debug/shared/debugger.js delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/debug/shared/less.png delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/debug/shared/more.png delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/debug/shared/style.css delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/debug/tbtools.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/formparser.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/http.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/local.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/middleware/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/lint.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/middleware/dispatcher.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/middleware/http_proxy.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/middleware/lint.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/middleware/profiler.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/middleware/proxy_fix.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/middleware/shared_data.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/py.typed delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/routing/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/converters.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/map.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/matcher.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/rules.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/routing/converters.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/routing/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/routing/map.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/routing/matcher.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/routing/rules.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/sansio/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/http.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/request.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/response.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/sansio/http.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/sansio/multipart.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/sansio/request.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/sansio/response.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/sansio/utils.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/security.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/serving.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/test.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/testapp.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/urls.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/user_agent.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/utils.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/wrappers/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/wrappers/__pycache__/request.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/wrappers/__pycache__/response.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/wrappers/request.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/wrappers/response.py delete mode 100644 venv/lib/python3.12/site-packages/werkzeug/wsgi.py delete mode 120000 venv/lib64 delete mode 100644 venv/pyvenv.cfg diff --git a/.gitignore b/.gitignore index 0045c581..61d26329 100644 --- a/.gitignore +++ b/.gitignore @@ -54,6 +54,10 @@ venv/ __pycache__/ *.pyc +# Stray operator-home paste captures (never commit files that were dragged in +# from somebody's ~/projects/... path — place them in the real tree instead) +/home/ + # CoinGecko/CMC token logos (generated by prepare-token-logos-512x512.sh) docs/04-configuration/coingecko/logos/*.png diff --git a/.gitignore.backup.20260103_171034 b/.gitignore.backup.20260103_171034 deleted file mode 100644 index 32fb2280..00000000 --- a/.gitignore.backup.20260103_171034 +++ /dev/null @@ -1,37 +0,0 @@ -# Dependencies -node_modules/ -.pnpm-store/ - -# Package manager lock files (using pnpm as default) -package-lock.json -yarn.lock - -# Environment files -.env -.env.local -.env.*.local - -# Logs -*.log -logs/ - -# OS files -.DS_Store -Thumbs.db - -# IDE files -.vscode/ -.idea/ -*.swp -*.swo -*~ - -# Build outputs -dist/ -build/ -.next/ -out/ - -# Temporary files -*.tmp -*.temp diff --git a/.phase1-event-status b/.phase1-event-status deleted file mode 100644 index bcf5b366..00000000 --- a/.phase1-event-status +++ /dev/null @@ -1 +0,0 @@ -EVENT_STATUS=NOT_FOUND diff --git a/__pycache__/list_vms.cpython-312.pyc b/__pycache__/list_vms.cpython-312.pyc deleted file mode 100644 index 8b55ac49f81203483e4a3935d76cfb8678968ad8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18412 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 { - try { - const body = req.body as { chain_id: number; leaves: CommitmentLeaf[]; uri?: string }; - const chain_id = body.chain_id; - const leaves = body.leaves; - const uri = body.uri ?? ''; - if (!leaves?.length || chain_id == null) { - return res.status(400).json({ error: 'chain_id and leaves required' }); - } - const result = buildCommitment(leaves, chain_id); - const commitId = 'commit-' + uuidv4(); - const leavesByTxHash = new Map(); - leaves.forEach((leaf, i) => { - leavesByTxHash.set(leaf.txHash.toLowerCase(), { leafIndex: i, leafData: leaf }); - }); - saveCommit({ - commitId, - chainId: chain_id, - startBlock: result.startBlock, - endBlock: result.endBlock, - root: result.root, - uri, - timestamp: Math.floor(Date.now() / 1000), - leafHashes: result.leafHashes, - leavesByTxHash, - publicChainTxHashes: [], - createdAt: new Date().toISOString(), - }); - res.status(201).json({ - commit_id: commitId, - root: result.root, - start_block: result.startBlock, - end_block: result.endBlock, - chain_id: result.chainId, - schema_version: result.schemaVersion, - leaf_count: result.leafCount, - }); - } catch (e) { - res.status(400).json({ error: e instanceof Error ? e.message : 'Bad request' }); - } -}); - -router.get('/v1/mirror/commits/:commitId', (req: Request, res: Response) => { - const c = getCommit(req.params.commitId); - if (!c) return res.status(404).json({ error: 'Commit not found' }); - res.json({ - commit_id: c.commitId, - chain_id: c.chainId, - start_block: c.startBlock, - end_block: c.endBlock, - root: c.root, - uri: c.uri, - timestamp: c.timestamp, - leaf_count: c.leafHashes.length, - public_chain_tx_hashes: c.publicChainTxHashes, - created_at: c.createdAt, - }); -}); - -router.get('/v1/mirror/proof', (req: Request, res: Response) => { - const chainId = parseInt(req.query.chain_id as string, 10); - const txHash = req.query.tx_hash as string; - if (isNaN(chainId) || !txHash) { - return res.status(400).json({ error: 'chain_id and tx_hash query params required' }); - } - const proof = getProof(chainId, txHash); - if (!proof) return res.status(404).json({ error: 'No proof found for this tx' }); - res.json(proof); -}); - -export default router; diff --git a/venv/bin/Activate.ps1 b/venv/bin/Activate.ps1 deleted file mode 100644 index b49d77ba..00000000 --- a/venv/bin/Activate.ps1 +++ /dev/null @@ -1,247 +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. - -.Notes -On Windows, it may be required to enable this Activate.ps1 script by setting the -execution policy for the user. You can do this by issuing the following PowerShell -command: - -PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser - -For more information on Execution Policies: -https://go.microsoft.com/fwlink/?LinkID=135170 - -#> -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 VIRTUAL_ENV_PROMPT altogether. - if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { - Remove-Item -Path env:VIRTUAL_ENV_PROMPT - } - - # 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("\\/") - 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 virtual 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 - } - $env:VIRTUAL_ENV_PROMPT = $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 696b551b..00000000 --- a/venv/bin/activate +++ /dev/null @@ -1,70 +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 - - # Call hash to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - hash -r 2> /dev/null - - if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then - PS1="${_OLD_VIRTUAL_PS1:-}" - export PS1 - unset _OLD_VIRTUAL_PS1 - fi - - unset VIRTUAL_ENV - unset VIRTUAL_ENV_PROMPT - if [ ! "${1:-}" = "nondestructive" ] ; then - # Self destruct! - unset -f deactivate - fi -} - -# unset irrelevant variables -deactivate nondestructive - -# on Windows, a path can contain colons and backslashes and has to be converted: -if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then - # transform D:\path\to\venv to /d/path/to/venv on MSYS - # and to /cygdrive/d/path/to/venv on Cygwin - export VIRTUAL_ENV=$(cygpath /home/intlc/projects/proxmox/venv) -else - # use the path as-is - export VIRTUAL_ENV=/home/intlc/projects/proxmox/venv -fi - -_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:-}" - PS1='(venv) '"${PS1:-}" - export PS1 - VIRTUAL_ENV_PROMPT='(venv) ' - export VIRTUAL_ENV_PROMPT -fi - -# Call hash to forget past commands. Without forgetting -# past commands the $PATH changes we made may not be respected -hash -r 2> /dev/null diff --git a/venv/bin/activate.csh b/venv/bin/activate.csh deleted file mode 100644 index c90ad3de..00000000 --- a/venv/bin/activate.csh +++ /dev/null @@ -1,27 +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; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' - -# Unset irrelevant variables. -deactivate nondestructive - -setenv VIRTUAL_ENV /home/intlc/projects/proxmox/venv - -set _OLD_VIRTUAL_PATH="$PATH" -setenv PATH "$VIRTUAL_ENV/"bin":$PATH" - - -set _OLD_VIRTUAL_PROMPT="$prompt" - -if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then - set prompt = '(venv) '"$prompt" - setenv VIRTUAL_ENV_PROMPT '(venv) ' -endif - -alias pydoc python -m pydoc - -rehash diff --git a/venv/bin/activate.fish b/venv/bin/activate.fish deleted file mode 100644 index 0130bda2..00000000 --- a/venv/bin/activate.fish +++ /dev/null @@ -1,69 +0,0 @@ -# This file must be used with "source /bin/activate.fish" *from fish* -# (https://fishshell.com/). You cannot run it directly. - -function deactivate -d "Exit virtual environment 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" - set -e _OLD_FISH_PROMPT_OVERRIDE - # prevents error when using nested fish instances (Issue #93858) - if functions -q _old_fish_prompt - functions -e fish_prompt - functions -c _old_fish_prompt fish_prompt - functions -e _old_fish_prompt - end - end - - set -e VIRTUAL_ENV - set -e VIRTUAL_ENV_PROMPT - if test "$argv[1]" != "nondestructive" - # Self-destruct! - functions -e deactivate - end -end - -# Unset irrelevant variables. -deactivate nondestructive - -set -gx VIRTUAL_ENV /home/intlc/projects/proxmox/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 - - # Output the venv prompt; color taken from the blue of the Python logo. - printf "%s%s%s" (set_color 4B8BBE) '(venv) ' (set_color normal) - - # Restore the return status of the previous command. - echo "exit $old_status" | . - # Output the original/"old" prompt. - _old_fish_prompt - end - - set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" - set -gx VIRTUAL_ENV_PROMPT '(venv) ' -end diff --git a/venv/bin/flask b/venv/bin/flask deleted file mode 100755 index 28afb9f5..00000000 --- a/venv/bin/flask +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/intlc/projects/proxmox/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from flask.cli 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/normalizer b/venv/bin/normalizer deleted file mode 100755 index ae5768a6..00000000 --- a/venv/bin/normalizer +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/intlc/projects/proxmox/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from charset_normalizer.cli import cli_detect -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(cli_detect()) diff --git a/venv/bin/pip b/venv/bin/pip deleted file mode 100755 index 729847d8..00000000 --- a/venv/bin/pip +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/intlc/projects/proxmox/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main 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/pip3 b/venv/bin/pip3 deleted file mode 100755 index 729847d8..00000000 --- a/venv/bin/pip3 +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/intlc/projects/proxmox/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main 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/pip3.12 b/venv/bin/pip3.12 deleted file mode 100755 index 729847d8..00000000 --- a/venv/bin/pip3.12 +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/intlc/projects/proxmox/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main 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/python b/venv/bin/python deleted file mode 120000 index b8a0adbb..00000000 --- a/venv/bin/python +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/venv/bin/python3 b/venv/bin/python3 deleted file mode 120000 index ae65fdaa..00000000 --- a/venv/bin/python3 +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/python3 \ No newline at end of file diff --git a/venv/bin/python3.12 b/venv/bin/python3.12 deleted file mode 120000 index b8a0adbb..00000000 --- a/venv/bin/python3.12 +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/LICENSE.txt b/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/LICENSE.txt deleted file mode 100644 index 79c9825a..00000000 --- a/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright 2010 Jason Kirtland - -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.12/site-packages/blinker-1.9.0.dist-info/METADATA b/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/METADATA deleted file mode 100644 index 6d343f57..00000000 --- a/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/METADATA +++ /dev/null @@ -1,60 +0,0 @@ -Metadata-Version: 2.3 -Name: blinker -Version: 1.9.0 -Summary: Fast, simple object-to-object and broadcast signaling -Author: Jason Kirtland -Maintainer-email: Pallets Ecosystem -Requires-Python: >=3.9 -Description-Content-Type: text/markdown -Classifier: Development Status :: 5 - Production/Stable -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python -Classifier: Typing :: Typed -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://blinker.readthedocs.io -Project-URL: Source, https://github.com/pallets-eco/blinker/ - -# Blinker - -Blinker provides a fast dispatching system that allows any number of -interested parties to subscribe to events, or "signals". - - -## Pallets Community Ecosystem - -> [!IMPORTANT]\ -> This project is part of the Pallets Community Ecosystem. Pallets is the open -> source organization that maintains Flask; Pallets-Eco enables community -> maintenance of related projects. If you are interested in helping maintain -> this project, please reach out on [the Pallets Discord server][discord]. -> -> [discord]: https://discord.gg/pallets - - -## Example - -Signal receivers can subscribe to specific senders or receive signals -sent by any sender. - -```pycon ->>> from blinker import signal ->>> started = signal('round-started') ->>> def each(round): -... print(f"Round {round}") -... ->>> started.connect(each) - ->>> def round_two(round): -... print("This is round two.") -... ->>> started.connect(round_two, sender=2) - ->>> for round in range(1, 4): -... started.send(round) -... -Round 1! -Round 2! -This is round two. -Round 3! -``` - diff --git a/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/RECORD b/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/RECORD deleted file mode 100644 index 7cfb7148..00000000 --- a/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/RECORD +++ /dev/null @@ -1,12 +0,0 @@ -blinker-1.9.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -blinker-1.9.0.dist-info/LICENSE.txt,sha256=nrc6HzhZekqhcCXSrhvjg5Ykx5XphdTw6Xac4p-spGc,1054 -blinker-1.9.0.dist-info/METADATA,sha256=uIRiM8wjjbHkCtbCyTvctU37IAZk0kEe5kxAld1dvzA,1633 -blinker-1.9.0.dist-info/RECORD,, -blinker-1.9.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82 -blinker/__init__.py,sha256=I2EdZqpy4LyjX17Hn1yzJGWCjeLaVaPzsMgHkLfj_cQ,317 -blinker/__pycache__/__init__.cpython-312.pyc,, -blinker/__pycache__/_utilities.cpython-312.pyc,, -blinker/__pycache__/base.cpython-312.pyc,, -blinker/_utilities.py,sha256=0J7eeXXTUx0Ivf8asfpx0ycVkp0Eqfqnj117x2mYX9E,1675 -blinker/base.py,sha256=QpDuvXXcwJF49lUBcH5BiST46Rz9wSG7VW_p7N_027M,19132 -blinker/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/WHEEL b/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/WHEEL deleted file mode 100644 index e3c6feef..00000000 --- a/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.10.1 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.12/site-packages/blinker/__init__.py b/venv/lib/python3.12/site-packages/blinker/__init__.py deleted file mode 100644 index 1772fa4a..00000000 --- a/venv/lib/python3.12/site-packages/blinker/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import annotations - -from .base import ANY -from .base import default_namespace -from .base import NamedSignal -from .base import Namespace -from .base import Signal -from .base import signal - -__all__ = [ - "ANY", - "default_namespace", - "NamedSignal", - "Namespace", - "Signal", - "signal", -] diff --git a/venv/lib/python3.12/site-packages/blinker/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/blinker/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index fd7d873c7424b15e5f2ac08af4c06eda192cb259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 491 zcmaKoy-ve05XaBWXIoXM0}>Kq0HzMq0#-m`W9k4CS&ZAbt*PTgiCeWJPr=T{3-A)W zL8VNHp&O!GC(c1-xJH#s|XY_t1&&%p*+N7=IG}>%-$H^w^U3Yd2 zvE^2&nhHmV5)M^z;Lu8yDn!ry6ME?-C`d&MNR>(ty@3J(aq62{J8>vf>PUX`=Dj!L z-@LEc-_q#>f|35^oP9Zl(4TzK9&*Uwjc)K74DoqBn84DyAanEV5#Y$Wm@bTC%j2u+&Aln6Z*p z%8D;Wi`iNvm;Rfpb2vyEuIn*_*`Di;C7lGlr8ZFsTk>M67_;J56o4oICkCZ&`NKUi;?E+yoMyuf&|FRcq z*eT|EKg*wS4B!96pyQTpvT>i$q1Jg56M+)mz&BeV5&q*|gdg7c5}5Ds3Tog6niZ<; zY0 zy6%#Tx}K8*$#ncccEO2(1Wpg)x^D8j>blSK8yvjwe5^3zl}W*NnPV0z)Z?M?IWu4O z<_i~yd!gXiQ-w+m(#buZAAYmo+l;(XG0Zt*n)rn&$9CrkE$CHdJ2tb4pRd$t8ji1L z!Z77qfcApSe+S631#~BwT|T~Y;@XK@$^CbFc5`l(-Re2KmOA_()3Y?aDC+IuJ4-Aru25olXHxDQ1rcKYKSI*xq)dGrd%YDed3hF z!si<`jq+`Qs_V9EGhMG|H*tpo4b(n&G2q_0w<%wV(;irvtuO%#xd1-_;Wc0Y!b{U( zG=xHTfeql{{lMoNw-8WLq1zCIf&p%s0s;uKJy&Z>wKa9`e}L!%(^r8g;Z7Kor(q|E zjIK`;1{q|~X-Jg%u1#ljieKluG9jR@oh$Kc@n&O9-6tUBWZ~REf=UWvVMS9FY+DN2 z4?NuuB#=ium*gU1A;c}dzJpaO4jE_p({61@%jfeGxg?Je&t+W?61raYtg6HLl&*hX zHJp|PvfuJdT@OnltLq&t5~MsY=^jpaoGABGkZx6lNgM~t2GboN6)t&KWQM>l2#RD~iE*bj2t| z+V2sCb_Dhv7~1E+1Ayz3X9?2`4Lbjn18v(PF0)HE^!<`YK~9ND>u#s_mD83hg!qXAFSmRvMIsJIm4gfsS?7A2_TdwH9ZETe$dRH0Z`mxd>k;0 zk4;PrX}n`hXbmxkCqawhx?C4;3#BT2KtNld;8+x7P0w*4Tlfc3-k352i4$xJPXsYm ztJv;zfLWkigij`ZPwo@poj@6@RS0|)gotzKPEqb4UdsO4 zKpsjM2U6TL+ diff --git a/venv/lib/python3.12/site-packages/blinker/__pycache__/base.cpython-312.pyc b/venv/lib/python3.12/site-packages/blinker/__pycache__/base.cpython-312.pyc deleted file mode 100644 index ece787ffdc9561afe7b0cd9f5f04ec6d6965e6ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21995 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 diff --git a/venv/lib/python3.12/site-packages/blinker/_utilities.py b/venv/lib/python3.12/site-packages/blinker/_utilities.py deleted file mode 100644 index 000c902a..00000000 --- a/venv/lib/python3.12/site-packages/blinker/_utilities.py +++ /dev/null @@ -1,64 +0,0 @@ -from __future__ import annotations - -import collections.abc as c -import inspect -import typing as t -from weakref import ref -from weakref import WeakMethod - -T = t.TypeVar("T") - - -class Symbol: - """A constant symbol, nicer than ``object()``. Repeated calls return the - same instance. - - >>> Symbol('foo') is Symbol('foo') - True - >>> Symbol('foo') - foo - """ - - symbols: t.ClassVar[dict[str, Symbol]] = {} - - def __new__(cls, name: str) -> Symbol: - if name in cls.symbols: - return cls.symbols[name] - - obj = super().__new__(cls) - cls.symbols[name] = obj - return obj - - def __init__(self, name: str) -> None: - self.name = name - - def __repr__(self) -> str: - return self.name - - def __getnewargs__(self) -> tuple[t.Any, ...]: - return (self.name,) - - -def make_id(obj: object) -> c.Hashable: - """Get a stable identifier for a receiver or sender, to be used as a dict - key or in a set. - """ - if inspect.ismethod(obj): - # The id of a bound method is not stable, but the id of the unbound - # function and instance are. - return id(obj.__func__), id(obj.__self__) - - if isinstance(obj, (str, int)): - # Instances with the same value always compare equal and have the same - # hash, even if the id may change. - return obj - - # Assume other types are not hashable but will always be the same instance. - return id(obj) - - -def make_ref(obj: T, callback: c.Callable[[ref[T]], None] | None = None) -> ref[T]: - if inspect.ismethod(obj): - return WeakMethod(obj, callback) # type: ignore[arg-type, return-value] - - return ref(obj, callback) diff --git a/venv/lib/python3.12/site-packages/blinker/base.py b/venv/lib/python3.12/site-packages/blinker/base.py deleted file mode 100644 index d051b94a..00000000 --- a/venv/lib/python3.12/site-packages/blinker/base.py +++ /dev/null @@ -1,512 +0,0 @@ -from __future__ import annotations - -import collections.abc as c -import sys -import typing as t -import weakref -from collections import defaultdict -from contextlib import contextmanager -from functools import cached_property -from inspect import iscoroutinefunction - -from ._utilities import make_id -from ._utilities import make_ref -from ._utilities import Symbol - -F = t.TypeVar("F", bound=c.Callable[..., t.Any]) - -ANY = Symbol("ANY") -"""Symbol for "any sender".""" - -ANY_ID = 0 - - -class Signal: - """A notification emitter. - - :param doc: The docstring for the signal. - """ - - ANY = ANY - """An alias for the :data:`~blinker.ANY` sender symbol.""" - - set_class: type[set[t.Any]] = set - """The set class to use for tracking connected receivers and senders. - Python's ``set`` is unordered. If receivers must be dispatched in the order - they were connected, an ordered set implementation can be used. - - .. versionadded:: 1.7 - """ - - @cached_property - def receiver_connected(self) -> Signal: - """Emitted at the end of each :meth:`connect` call. - - The signal sender is the signal instance, and the :meth:`connect` - arguments are passed through: ``receiver``, ``sender``, and ``weak``. - - .. versionadded:: 1.2 - """ - return Signal(doc="Emitted after a receiver connects.") - - @cached_property - def receiver_disconnected(self) -> Signal: - """Emitted at the end of each :meth:`disconnect` call. - - The sender is the signal instance, and the :meth:`disconnect` arguments - are passed through: ``receiver`` and ``sender``. - - This signal is emitted **only** when :meth:`disconnect` is called - explicitly. This signal cannot be emitted by an automatic disconnect - when a weakly referenced receiver or sender goes out of scope, as the - instance is no longer be available to be used as the sender for this - signal. - - An alternative approach is available by subscribing to - :attr:`receiver_connected` and setting up a custom weakref cleanup - callback on weak receivers and senders. - - .. versionadded:: 1.2 - """ - return Signal(doc="Emitted after a receiver disconnects.") - - def __init__(self, doc: str | None = None) -> None: - if doc: - self.__doc__ = doc - - self.receivers: dict[ - t.Any, weakref.ref[c.Callable[..., t.Any]] | c.Callable[..., t.Any] - ] = {} - """The map of connected receivers. Useful to quickly check if any - receivers are connected to the signal: ``if s.receivers:``. The - structure and data is not part of the public API, but checking its - boolean value is. - """ - - self.is_muted: bool = False - self._by_receiver: dict[t.Any, set[t.Any]] = defaultdict(self.set_class) - self._by_sender: dict[t.Any, set[t.Any]] = defaultdict(self.set_class) - self._weak_senders: dict[t.Any, weakref.ref[t.Any]] = {} - - def connect(self, receiver: F, sender: t.Any = ANY, weak: bool = True) -> F: - """Connect ``receiver`` to be called when the signal is sent by - ``sender``. - - :param receiver: The callable to call when :meth:`send` is called with - the given ``sender``, passing ``sender`` as a positional argument - along with any extra keyword arguments. - :param sender: Any object or :data:`ANY`. ``receiver`` will only be - called when :meth:`send` is called with this sender. If ``ANY``, the - receiver will be called for any sender. A receiver may be connected - to multiple senders by calling :meth:`connect` multiple times. - :param weak: Track the receiver with a :mod:`weakref`. The receiver will - be automatically disconnected when it is garbage collected. When - connecting a receiver defined within a function, set to ``False``, - otherwise it will be disconnected when the function scope ends. - """ - receiver_id = make_id(receiver) - sender_id = ANY_ID if sender is ANY else make_id(sender) - - if weak: - self.receivers[receiver_id] = make_ref( - receiver, self._make_cleanup_receiver(receiver_id) - ) - else: - self.receivers[receiver_id] = receiver - - self._by_sender[sender_id].add(receiver_id) - self._by_receiver[receiver_id].add(sender_id) - - if sender is not ANY and sender_id not in self._weak_senders: - # store a cleanup for weakref-able senders - try: - self._weak_senders[sender_id] = make_ref( - sender, self._make_cleanup_sender(sender_id) - ) - except TypeError: - pass - - if "receiver_connected" in self.__dict__ and self.receiver_connected.receivers: - try: - self.receiver_connected.send( - self, receiver=receiver, sender=sender, weak=weak - ) - except TypeError: - # TODO no explanation or test for this - self.disconnect(receiver, sender) - raise - - return receiver - - def connect_via(self, sender: t.Any, weak: bool = False) -> c.Callable[[F], F]: - """Connect the decorated function to be called when the signal is sent - by ``sender``. - - The decorated function will be called when :meth:`send` is called with - the given ``sender``, passing ``sender`` as a positional argument along - with any extra keyword arguments. - - :param sender: Any object or :data:`ANY`. ``receiver`` will only be - called when :meth:`send` is called with this sender. If ``ANY``, the - receiver will be called for any sender. A receiver may be connected - to multiple senders by calling :meth:`connect` multiple times. - :param weak: Track the receiver with a :mod:`weakref`. The receiver will - be automatically disconnected when it is garbage collected. When - connecting a receiver defined within a function, set to ``False``, - otherwise it will be disconnected when the function scope ends.= - - .. versionadded:: 1.1 - """ - - def decorator(fn: F) -> F: - self.connect(fn, sender, weak) - return fn - - return decorator - - @contextmanager - def connected_to( - self, receiver: c.Callable[..., t.Any], sender: t.Any = ANY - ) -> c.Generator[None, None, None]: - """A context manager that temporarily connects ``receiver`` to the - signal while a ``with`` block executes. When the block exits, the - receiver is disconnected. Useful for tests. - - :param receiver: The callable to call when :meth:`send` is called with - the given ``sender``, passing ``sender`` as a positional argument - along with any extra keyword arguments. - :param sender: Any object or :data:`ANY`. ``receiver`` will only be - called when :meth:`send` is called with this sender. If ``ANY``, the - receiver will be called for any sender. - - .. versionadded:: 1.1 - """ - self.connect(receiver, sender=sender, weak=False) - - try: - yield None - finally: - self.disconnect(receiver) - - @contextmanager - def muted(self) -> c.Generator[None, None, None]: - """A context manager that temporarily disables the signal. No receivers - will be called if the signal is sent, until the ``with`` block exits. - Useful for tests. - """ - self.is_muted = True - - try: - yield None - finally: - self.is_muted = False - - def send( - self, - sender: t.Any | None = None, - /, - *, - _async_wrapper: c.Callable[ - [c.Callable[..., c.Coroutine[t.Any, t.Any, t.Any]]], c.Callable[..., t.Any] - ] - | None = None, - **kwargs: t.Any, - ) -> list[tuple[c.Callable[..., t.Any], t.Any]]: - """Call all receivers that are connected to the given ``sender`` - or :data:`ANY`. Each receiver is called with ``sender`` as a positional - argument along with any extra keyword arguments. Return a list of - ``(receiver, return value)`` tuples. - - The order receivers are called is undefined, but can be influenced by - setting :attr:`set_class`. - - If a receiver raises an exception, that exception will propagate up. - This makes debugging straightforward, with an assumption that correctly - implemented receivers will not raise. - - :param sender: Call receivers connected to this sender, in addition to - those connected to :data:`ANY`. - :param _async_wrapper: Will be called on any receivers that are async - coroutines to turn them into sync callables. For example, could run - the receiver with an event loop. - :param kwargs: Extra keyword arguments to pass to each receiver. - - .. versionchanged:: 1.7 - Added the ``_async_wrapper`` argument. - """ - if self.is_muted: - return [] - - results = [] - - for receiver in self.receivers_for(sender): - if iscoroutinefunction(receiver): - if _async_wrapper is None: - raise RuntimeError("Cannot send to a coroutine function.") - - result = _async_wrapper(receiver)(sender, **kwargs) - else: - result = receiver(sender, **kwargs) - - results.append((receiver, result)) - - return results - - async def send_async( - self, - sender: t.Any | None = None, - /, - *, - _sync_wrapper: c.Callable[ - [c.Callable[..., t.Any]], c.Callable[..., c.Coroutine[t.Any, t.Any, t.Any]] - ] - | None = None, - **kwargs: t.Any, - ) -> list[tuple[c.Callable[..., t.Any], t.Any]]: - """Await all receivers that are connected to the given ``sender`` - or :data:`ANY`. Each receiver is called with ``sender`` as a positional - argument along with any extra keyword arguments. Return a list of - ``(receiver, return value)`` tuples. - - The order receivers are called is undefined, but can be influenced by - setting :attr:`set_class`. - - If a receiver raises an exception, that exception will propagate up. - This makes debugging straightforward, with an assumption that correctly - implemented receivers will not raise. - - :param sender: Call receivers connected to this sender, in addition to - those connected to :data:`ANY`. - :param _sync_wrapper: Will be called on any receivers that are sync - callables to turn them into async coroutines. For example, - could call the receiver in a thread. - :param kwargs: Extra keyword arguments to pass to each receiver. - - .. versionadded:: 1.7 - """ - if self.is_muted: - return [] - - results = [] - - for receiver in self.receivers_for(sender): - if not iscoroutinefunction(receiver): - if _sync_wrapper is None: - raise RuntimeError("Cannot send to a non-coroutine function.") - - result = await _sync_wrapper(receiver)(sender, **kwargs) - else: - result = await receiver(sender, **kwargs) - - results.append((receiver, result)) - - return results - - def has_receivers_for(self, sender: t.Any) -> bool: - """Check if there is at least one receiver that will be called with the - given ``sender``. A receiver connected to :data:`ANY` will always be - called, regardless of sender. Does not check if weakly referenced - receivers are still live. See :meth:`receivers_for` for a stronger - search. - - :param sender: Check for receivers connected to this sender, in addition - to those connected to :data:`ANY`. - """ - if not self.receivers: - return False - - if self._by_sender[ANY_ID]: - return True - - if sender is ANY: - return False - - return make_id(sender) in self._by_sender - - def receivers_for( - self, sender: t.Any - ) -> c.Generator[c.Callable[..., t.Any], None, None]: - """Yield each receiver to be called for ``sender``, in addition to those - to be called for :data:`ANY`. Weakly referenced receivers that are not - live will be disconnected and skipped. - - :param sender: Yield receivers connected to this sender, in addition - to those connected to :data:`ANY`. - """ - # TODO: test receivers_for(ANY) - if not self.receivers: - return - - sender_id = make_id(sender) - - if sender_id in self._by_sender: - ids = self._by_sender[ANY_ID] | self._by_sender[sender_id] - else: - ids = self._by_sender[ANY_ID].copy() - - for receiver_id in ids: - receiver = self.receivers.get(receiver_id) - - if receiver is None: - continue - - if isinstance(receiver, weakref.ref): - strong = receiver() - - if strong is None: - self._disconnect(receiver_id, ANY_ID) - continue - - yield strong - else: - yield receiver - - def disconnect(self, receiver: c.Callable[..., t.Any], sender: t.Any = ANY) -> None: - """Disconnect ``receiver`` from being called when the signal is sent by - ``sender``. - - :param receiver: A connected receiver callable. - :param sender: Disconnect from only this sender. By default, disconnect - from all senders. - """ - sender_id: c.Hashable - - if sender is ANY: - sender_id = ANY_ID - else: - sender_id = make_id(sender) - - receiver_id = make_id(receiver) - self._disconnect(receiver_id, sender_id) - - if ( - "receiver_disconnected" in self.__dict__ - and self.receiver_disconnected.receivers - ): - self.receiver_disconnected.send(self, receiver=receiver, sender=sender) - - def _disconnect(self, receiver_id: c.Hashable, sender_id: c.Hashable) -> None: - if sender_id == ANY_ID: - if self._by_receiver.pop(receiver_id, None) is not None: - for bucket in self._by_sender.values(): - bucket.discard(receiver_id) - - self.receivers.pop(receiver_id, None) - else: - self._by_sender[sender_id].discard(receiver_id) - self._by_receiver[receiver_id].discard(sender_id) - - def _make_cleanup_receiver( - self, receiver_id: c.Hashable - ) -> c.Callable[[weakref.ref[c.Callable[..., t.Any]]], None]: - """Create a callback function to disconnect a weakly referenced - receiver when it is garbage collected. - """ - - def cleanup(ref: weakref.ref[c.Callable[..., t.Any]]) -> None: - # If the interpreter is shutting down, disconnecting can result in a - # weird ignored exception. Don't call it in that case. - if not sys.is_finalizing(): - self._disconnect(receiver_id, ANY_ID) - - return cleanup - - def _make_cleanup_sender( - self, sender_id: c.Hashable - ) -> c.Callable[[weakref.ref[t.Any]], None]: - """Create a callback function to disconnect all receivers for a weakly - referenced sender when it is garbage collected. - """ - assert sender_id != ANY_ID - - def cleanup(ref: weakref.ref[t.Any]) -> None: - self._weak_senders.pop(sender_id, None) - - for receiver_id in self._by_sender.pop(sender_id, ()): - self._by_receiver[receiver_id].discard(sender_id) - - return cleanup - - def _cleanup_bookkeeping(self) -> None: - """Prune unused sender/receiver bookkeeping. Not threadsafe. - - Connecting & disconnecting leaves behind a small amount of bookkeeping - data. Typical workloads using Blinker, for example in most web apps, - Flask, CLI scripts, etc., are not adversely affected by this - bookkeeping. - - With a long-running process performing dynamic signal routing with high - volume, e.g. connecting to function closures, senders are all unique - object instances. Doing all of this over and over may cause memory usage - to grow due to extraneous bookkeeping. (An empty ``set`` for each stale - sender/receiver pair.) - - This method will prune that bookkeeping away, with the caveat that such - pruning is not threadsafe. The risk is that cleanup of a fully - disconnected receiver/sender pair occurs while another thread is - connecting that same pair. If you are in the highly dynamic, unique - receiver/sender situation that has lead you to this method, that failure - mode is perhaps not a big deal for you. - """ - for mapping in (self._by_sender, self._by_receiver): - for ident, bucket in list(mapping.items()): - if not bucket: - mapping.pop(ident, None) - - def _clear_state(self) -> None: - """Disconnect all receivers and senders. Useful for tests.""" - self._weak_senders.clear() - self.receivers.clear() - self._by_sender.clear() - self._by_receiver.clear() - - -class NamedSignal(Signal): - """A named generic notification emitter. The name is not used by the signal - itself, but matches the key in the :class:`Namespace` that it belongs to. - - :param name: The name of the signal within the namespace. - :param doc: The docstring for the signal. - """ - - def __init__(self, name: str, doc: str | None = None) -> None: - super().__init__(doc) - - #: The name of this signal. - self.name: str = name - - def __repr__(self) -> str: - base = super().__repr__() - return f"{base[:-1]}; {self.name!r}>" # noqa: E702 - - -class Namespace(dict[str, NamedSignal]): - """A dict mapping names to signals.""" - - def signal(self, name: str, doc: str | None = None) -> NamedSignal: - """Return the :class:`NamedSignal` for the given ``name``, creating it - if required. Repeated calls with the same name return the same signal. - - :param name: The name of the signal. - :param doc: The docstring of the signal. - """ - if name not in self: - self[name] = NamedSignal(name, doc) - - return self[name] - - -class _PNamespaceSignal(t.Protocol): - def __call__(self, name: str, doc: str | None = None) -> NamedSignal: ... - - -default_namespace: Namespace = Namespace() -"""A default :class:`Namespace` for creating named signals. :func:`signal` -creates a :class:`NamedSignal` in this namespace. -""" - -signal: _PNamespaceSignal = default_namespace.signal -"""Return a :class:`NamedSignal` in :data:`default_namespace` with the given -``name``, creating it if required. Repeated calls with the same name return the -same signal. -""" diff --git a/venv/lib/python3.12/site-packages/blinker/py.typed b/venv/lib/python3.12/site-packages/blinker/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/METADATA b/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/METADATA deleted file mode 100644 index 6939bac7..00000000 --- a/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/METADATA +++ /dev/null @@ -1,78 +0,0 @@ -Metadata-Version: 2.4 -Name: certifi -Version: 2025.11.12 -Summary: Python package for providing Mozilla's CA Bundle. -Home-page: https://github.com/certifi/python-certifi -Author: Kenneth Reitz -Author-email: me@kennethreitz.com -License: MPL-2.0 -Project-URL: Source, https://github.com/certifi/python-certifi -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 :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3.14 -Requires-Python: >=3.7 -License-File: LICENSE -Dynamic: author -Dynamic: author-email -Dynamic: classifier -Dynamic: description -Dynamic: home-page -Dynamic: license -Dynamic: license-file -Dynamic: project-url -Dynamic: requires-python -Dynamic: summary - -Certifi: Python SSL Certificates -================================ - -Certifi provides Mozilla's 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/python3.7/site-packages/certifi/cacert.pem' - -Or from the command line:: - - $ python -m certifi - /usr/local/lib/python3.7/site-packages/certifi/cacert.pem - -Enjoy! - -.. _`Requests`: https://requests.readthedocs.io/en/master/ - -Addition/Removal of Certificates --------------------------------- - -Certifi does not support any addition/removal or other modification of the -CA trust store content. This project is intended to provide a reliable and -highly portable root of trust to python deployments. Look to upstream projects -for methods to use alternate trust. diff --git a/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/RECORD b/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/RECORD deleted file mode 100644 index 2a3994ca..00000000 --- a/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/RECORD +++ /dev/null @@ -1,14 +0,0 @@ -certifi-2025.11.12.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -certifi-2025.11.12.dist-info/METADATA,sha256=_JprGu_1lWSdHlruRBKcorXnrfvBDhvX_6KRr8HQbLc,2475 -certifi-2025.11.12.dist-info/RECORD,, -certifi-2025.11.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91 -certifi-2025.11.12.dist-info/licenses/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989 -certifi-2025.11.12.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 -certifi/__init__.py,sha256=1BRSxNMnZW7CZ2oJtYWLoJgfHfcB9i273exwiPwfjJM,94 -certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243 -certifi/__pycache__/__init__.cpython-312.pyc,, -certifi/__pycache__/__main__.cpython-312.pyc,, -certifi/__pycache__/core.cpython-312.pyc,, -certifi/cacert.pem,sha256=oa1dZD4hxDtb7XTH4IkdzbWPavUcis4eTwINZUqlKhY,283932 -certifi/core.py,sha256=XFXycndG5pf37ayeF8N32HUuDafsyhkVMbO4BAPWHa0,3394 -certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/WHEEL b/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/WHEEL deleted file mode 100644 index e7fa31b6..00000000 --- a/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (80.9.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/licenses/LICENSE b/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/licenses/LICENSE deleted file mode 100644 index 62b076cd..00000000 --- a/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/licenses/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -This package contains a modified version of ca-bundle.crt: - -ca-bundle.crt -- Bundle of CA Root Certificates - -This is a bundle of X.509 certificates of public Certificate Authorities -(CA). These were automatically extracted from Mozilla's root certificates -file (certdata.txt). This file can be found in the mozilla source tree: -https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt -It contains the certificates in PEM format and therefore -can be directly used with curl / libcurl / php_curl, or with -an Apache+mod_ssl webserver for SSL client authentication. -Just configure this file as the SSLCACertificateFile.# - -***** BEGIN LICENSE BLOCK ***** -This Source Code Form is subject to the terms of the Mozilla Public License, -v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain -one at http://mozilla.org/MPL/2.0/. - -***** END LICENSE BLOCK ***** -@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ diff --git a/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/top_level.txt deleted file mode 100644 index 963eac53..00000000 --- a/venv/lib/python3.12/site-packages/certifi-2025.11.12.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -certifi diff --git a/venv/lib/python3.12/site-packages/certifi/__init__.py b/venv/lib/python3.12/site-packages/certifi/__init__.py deleted file mode 100644 index f11f5ae4..00000000 --- a/venv/lib/python3.12/site-packages/certifi/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .core import contents, where - -__all__ = ["contents", "where"] -__version__ = "2025.11.12" diff --git a/venv/lib/python3.12/site-packages/certifi/__main__.py b/venv/lib/python3.12/site-packages/certifi/__main__.py deleted file mode 100644 index 8945b5da..00000000 --- a/venv/lib/python3.12/site-packages/certifi/__main__.py +++ /dev/null @@ -1,12 +0,0 @@ -import argparse - -from certifi import contents, where - -parser = argparse.ArgumentParser() -parser.add_argument("-c", "--contents", action="store_true") -args = parser.parse_args() - -if args.contents: - print(contents()) -else: - print(where()) diff --git a/venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index bf09c9ac9ce0a86f45b30e4dabd07fc06ae9b905..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306 zcmYjLyH3O~5VZ5)jzpnDNHjp1f|vx+A!;fL$`n|^HW!0qN4Ck`QE`7j$2af;`~(dp zN&^xV9ny7I;Yc7c#q8|Pu4Z47Bmxe}^C`b@^>b+c;Qfl_t`m=d0ty9aUDO-CFAPW1^&G(waV;)=V?)ySWY=-9^Pgag^nGmKSGf*at-YxBC&s zl@J*BF~%L!hAWBj6Ii-ausTPzY8c|u3W8d#t{Jgr5VJ+}27Sx&&mn zW&3SKZmJ10h%jyW6-O9z$t}iNJ70~D8%1vgJJGR=82&d~j=p^e;XBy-h&LamuhGu^ N=xt+r5$kp5{Q#Y6QUm}1 diff --git a/venv/lib/python3.12/site-packages/certifi/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/certifi/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index 74f17c0a88dfc003d8423baf332666a4db08e13b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 621 zcmZuuze^lJ6n?Y6cX3rb0*BRMkmN$nLDOm=kRp|cRk&u^>`w0XvcH&}Q%_PzASA)Y z&io0HOPznh#zVvDq%l}Xx`3TkX3kr$$-vC}=KH?)=FQBp>pCEY`{Pw~BjT0ZltUkb zn==6pA%qac(3DY$QKB@JL~W`F6d=&C%A`r`k6}|MddHpcB?{G03-#|tU%g`x2;WSp zPU3wXi&!0P!k36niwWCYDz@jXzJKXYVEB9$ZxET=2qPG#1_o1>;KK+8Wx``;eAsv(( zBPZokei(Wpaino)#L9iawb82QG)mbK$S;B0P2A2Bf&~)?IHy^M1gwx?C&_m37D=~o z9KFGLkF~S(+0ya~E+R%6xgWgqTcp6_zOd&dew2FNQr^3@R+B93#^gDj6GzDRDqf4_ zuZj@*1vA(1@Y1e*t`6n7(=KGpmOl?>(g)VPoQ!JtLLUWG^+!%dTP$^ hX_u<`Y3;+>g=T+wy#M5<_TaZbi~Em0uG3jj{2v+1mv8_8 diff --git a/venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc b/venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc deleted file mode 100644 index d554a26849cf369e6e3cdb703fe69b3cc9ebde55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2053 zcmbVN&u<$=6rTMRuN}J^l8`uc6{k%N*5Q449c>`vl!?Okhj zk|rRb95|E{xiyCh<-j3TIHUdvNN|X8k$3!BAz!KlzHE$;n`hz_L#`{ToACgDNKqX{w24Ce$oEP~LZ^RApOR*$it|A9* z-DpVnKS790K=nXXstuF|YLQZeLk6$OFrtQlV{5z-fgJ|@T!uWp%|k~NIufNTHKnBd zrz6(WG1%$IB|gJ39TRGD{+QNP-6eMtd6EBSgcs z3Y+aS0{}J9p})eRZIt7RIo=&q=Worwx4f#(uYT;xs*1Nvs;W;=oAsX;3uU{83#LV@ zdZAA23f8H^lC7G(RoKMVW}#|+TBvW+vTa?@zcF2KOp0HxYx;d{9Xkadp@MD`3^2Kh zw|(b*Rh@1TCI>d0QE)rxSX5eKvLPn-M)&Cc>M!Cegb|(NPuRgv2EE*kXpXvORInuPtOijNDLaH`G}K@PwA^op{zTY` zs1npvhJvgc>2Qz-9b6BkE9i+(bR#~V=drG2axpg^aQNY^)w_h9gKZK* z_P(y*P~t{`V$c>*Rd+z6j1E^Oc-?eh&SQfx96Z!XlyylD%9vm>0r~SVoCR<@=xhkZ zlShN;voVy)e*5AY3M6FdM36Qvs^STj_BiuOYz2iKIOp)e1_c?lfI zSQ*{D*HqFiWvZb}9b9WFH(JVELz(;G~~K|88nL4HZmTw`Uc`VV_;1%uv&ncwaF*QYI$P0t7EAlQ1>sWHJK5mDe#< zL(LH;88XJ)ICDwn*nRJV(vz3x-h@Tx9dJDwOQO^Z`)?gon^$N5x2nSL0z>+ustn#! z2SXcd1(6hl97kAX|2Y}a9^1>1I7~x~?d0CX{^HY{&y@KidEO_Mu>Fd;AvdC`hONVW z6P#_Q0|P_Ajc;P&z+ZuCT5GmDV%F+5q3|`$6YSUi#Nt0OB+YTXmB~&egwq*Ly5m>g I;XG*m1%L^hZ2$lO diff --git a/venv/lib/python3.12/site-packages/certifi/cacert.pem b/venv/lib/python3.12/site-packages/certifi/cacert.pem deleted file mode 100644 index ebcb66fe..00000000 --- a/venv/lib/python3.12/site-packages/certifi/cacert.pem +++ /dev/null @@ -1,4678 +0,0 @@ - -# 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=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: 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=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=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=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=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: 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=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=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=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=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=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: 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=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=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 - 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=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=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=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=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=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation -# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation -# Label: "Microsoft ECC Root Certificate Authority 2017" -# Serial: 136839042543790627607696632466672567020 -# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67 -# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5 -# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02 ------BEGIN CERTIFICATE----- -MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD -VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw -MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV -UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy -b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR -ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb -hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 -FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV -L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB -iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= ------END CERTIFICATE----- - -# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation -# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation -# Label: "Microsoft RSA Root Certificate Authority 2017" -# Serial: 40975477897264996090493496164228220339 -# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47 -# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74 -# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0 ------BEGIN CERTIFICATE----- -MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl -MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw -NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG -EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N -aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ -Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 -ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 -HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm -gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ -jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc -aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG -YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 -W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K -UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH -+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q -W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC -LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC -gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 -tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh -SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 -TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 -pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR -xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp -GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 -dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN -AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB -RA+GsCyRxj3qrg+E ------END CERTIFICATE----- - -# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd. -# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd. -# Label: "e-Szigno Root CA 2017" -# Serial: 411379200276854331539784714 -# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98 -# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1 -# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99 ------BEGIN CERTIFICATE----- -MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV -BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk -LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv -b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ -BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg -THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v -IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv -xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H -Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB -eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo -jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ -+efcMQ== ------END CERTIFICATE----- - -# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2 -# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2 -# Label: "certSIGN Root CA G2" -# Serial: 313609486401300475190 -# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7 -# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32 -# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05 ------BEGIN CERTIFICATE----- -MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV -BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g -Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ -BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ -R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF -dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw -vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ -uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp -n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs -cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW -xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P -rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF -DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx -DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy -LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C -eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ -d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq -kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC -b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl -qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 -OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c -NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk -ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO -pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj -03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk -PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE -1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX -QRBdJ3NghVdJIgc= ------END CERTIFICATE----- - -# Issuer: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. -# Subject: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. -# Label: "Trustwave Global Certification Authority" -# Serial: 1846098327275375458322922162 -# MD5 Fingerprint: f8:1c:18:2d:2f:ba:5f:6d:a1:6c:bc:c7:ab:91:c7:0e -# SHA1 Fingerprint: 2f:8f:36:4f:e1:58:97:44:21:59:87:a5:2a:9a:d0:69:95:26:7f:b5 -# SHA256 Fingerprint: 97:55:20:15:f5:dd:fc:3c:87:88:c0:06:94:45:55:40:88:94:45:00:84:f1:00:86:70:86:bc:1a:2b:b5:8d:c8 ------BEGIN CERTIFICATE----- -MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw -CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x -ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1 -c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx -OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI -SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI -b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn -swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu -7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8 -1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW -80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP -JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l -RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw -hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10 -coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc -BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n -twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud -DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W -0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe -uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q -lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB -aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE -sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT -MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe -qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh -VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8 -h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9 -EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK -yeC2nOnOcXHebD8WpHk= ------END CERTIFICATE----- - -# Issuer: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. -# Subject: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. -# Label: "Trustwave Global ECC P256 Certification Authority" -# Serial: 4151900041497450638097112925 -# MD5 Fingerprint: 5b:44:e3:8d:5d:36:86:26:e8:0d:05:d2:59:a7:83:54 -# SHA1 Fingerprint: b4:90:82:dd:45:0c:be:8b:5b:b1:66:d3:e2:a4:08:26:cd:ed:42:cf -# SHA256 Fingerprint: 94:5b:bc:82:5e:a5:54:f4:89:d1:fd:51:a7:3d:df:2e:a6:24:ac:70:19:a0:52:05:22:5c:22:a7:8c:cf:a8:b4 ------BEGIN CERTIFICATE----- -MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD -VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf -BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 -YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x -NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G -A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 -d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF -Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG -SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN -FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w -DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw -CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh -DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 ------END CERTIFICATE----- - -# Issuer: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. -# Subject: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. -# Label: "Trustwave Global ECC P384 Certification Authority" -# Serial: 2704997926503831671788816187 -# MD5 Fingerprint: ea:cf:60:c4:3b:b9:15:29:40:a1:97:ed:78:27:93:d6 -# SHA1 Fingerprint: e7:f3:a3:c8:cf:6f:c3:04:2e:6d:0e:67:32:c5:9e:68:95:0d:5e:d2 -# SHA256 Fingerprint: 55:90:38:59:c8:c0:c3:eb:b8:75:9e:ce:4e:25:57:22:5f:f5:75:8b:bd:38:eb:d4:82:76:60:1e:1b:d5:80:97 ------BEGIN CERTIFICATE----- -MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD -VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf -BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 -YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x -NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G -A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 -d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF -Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB -BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ -j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF -1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G -A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3 -AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC -MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu -Sw== ------END CERTIFICATE----- - -# Issuer: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. -# Subject: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. -# Label: "NAVER Global Root Certification Authority" -# Serial: 9013692873798656336226253319739695165984492813 -# MD5 Fingerprint: c8:7e:41:f6:25:3b:f5:09:b3:17:e8:46:3d:bf:d0:9b -# SHA1 Fingerprint: 8f:6b:f2:a9:27:4a:da:14:a0:c4:f4:8e:61:27:f9:c0:1e:78:5d:d1 -# SHA256 Fingerprint: 88:f4:38:dc:f8:ff:d1:fa:8f:42:91:15:ff:e5:f8:2a:e1:e0:6e:0c:70:c3:75:fa:ad:71:7b:34:a4:9e:72:65 ------BEGIN CERTIFICATE----- -MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM -BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG -T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx -CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD -b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA -iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH -38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE -HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz -kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP -szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq -vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf -nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG -YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo -0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a -CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K -AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I -36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB -Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN -qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj -cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm -+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL -hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe -lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7 -p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8 -piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR -LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX -5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO -dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul -9XXeifdy ------END CERTIFICATE----- - -# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres -# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres -# Label: "AC RAIZ FNMT-RCM SERVIDORES SEGUROS" -# Serial: 131542671362353147877283741781055151509 -# MD5 Fingerprint: 19:36:9c:52:03:2f:d2:d1:bb:23:cc:dd:1e:12:55:bb -# SHA1 Fingerprint: 62:ff:d9:9e:c0:65:0d:03:ce:75:93:d2:ed:3f:2d:32:c9:e3:e5:4a -# SHA256 Fingerprint: 55:41:53:b1:3d:2c:f9:dd:b7:53:bf:be:1a:4e:0a:e0:8d:0a:a4:18:70:58:fe:60:a2:b8:62:b2:e4:b8:7b:cb ------BEGIN CERTIFICATE----- -MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw -CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw -FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S -Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5 -MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL -DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS -QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH -sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK -Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu -SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC -MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy -v+c= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign Root R46 O=GlobalSign nv-sa -# Subject: CN=GlobalSign Root R46 O=GlobalSign nv-sa -# Label: "GlobalSign Root R46" -# Serial: 1552617688466950547958867513931858518042577 -# MD5 Fingerprint: c4:14:30:e4:fa:66:43:94:2a:6a:1b:24:5f:19:d0:ef -# SHA1 Fingerprint: 53:a2:b0:4b:ca:6b:d6:45:e6:39:8a:8e:c4:0d:d2:bf:77:c3:a2:90 -# SHA256 Fingerprint: 4f:a3:12:6d:8d:3a:11:d1:c4:85:5a:4f:80:7c:ba:d6:cf:91:9d:3a:5a:88:b0:3b:ea:2c:63:72:d9:3c:40:c9 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA -MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD -VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy -MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt -c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ -OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG -vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud -316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo -0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE -y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF -zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE -+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN -I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs -x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa -ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC -4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4 -7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg -JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti -2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk -pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF -FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt -rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk -ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5 -u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP -4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6 -N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3 -vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6 ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign Root E46 O=GlobalSign nv-sa -# Subject: CN=GlobalSign Root E46 O=GlobalSign nv-sa -# Label: "GlobalSign Root E46" -# Serial: 1552617690338932563915843282459653771421763 -# MD5 Fingerprint: b5:b8:66:ed:de:08:83:e3:c9:e2:01:34:06:ac:51:6f -# SHA1 Fingerprint: 39:b4:6c:d5:fe:80:06:eb:e2:2f:4a:bb:08:33:a0:af:db:b9:dd:84 -# SHA256 Fingerprint: cb:b9:c4:4d:84:b8:04:3e:10:50:ea:31:a6:9f:51:49:55:d7:bf:d2:e2:c6:b4:93:01:01:9a:d6:1d:9f:50:58 ------BEGIN CERTIFICATE----- -MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx -CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD -ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw -MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex -HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq -R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd -yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ -7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8 -+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= ------END CERTIFICATE----- - -# Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz -# Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz -# Label: "ANF Secure Server Root CA" -# Serial: 996390341000653745 -# MD5 Fingerprint: 26:a6:44:5a:d9:af:4e:2f:b2:1d:b6:65:b0:4e:e8:96 -# SHA1 Fingerprint: 5b:6e:68:d0:cc:15:b6:a0:5f:1e:c1:5f:ae:02:fc:6b:2f:5d:6f:74 -# SHA256 Fingerprint: fb:8f:ec:75:91:69:b9:10:6b:1e:51:16:44:c6:18:c5:13:04:37:3f:6c:06:43:08:8d:8b:ef:fd:1b:99:75:99 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Subject: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Label: "Certum EC-384 CA" -# Serial: 160250656287871593594747141429395092468 -# MD5 Fingerprint: b6:65:b3:96:60:97:12:a1:ec:4e:e1:3d:a3:c6:c9:f1 -# SHA1 Fingerprint: f3:3e:78:3c:ac:df:f4:a2:cc:ac:67:55:69:56:d7:e5:16:3c:e1:ed -# SHA256 Fingerprint: 6b:32:80:85:62:53:18:aa:50:d1:73:c9:8d:8b:da:09:d5:7e:27:41:3d:11:4c:f7:87:a0:f5:d0:6c:03:0c:f6 ------BEGIN CERTIFICATE----- -MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw -CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw -JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT -EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0 -WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT -LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX -BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE -KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm -Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8 -EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J -UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn -nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Root CA" -# Serial: 40870380103424195783807378461123655149 -# MD5 Fingerprint: 51:e1:c2:e7:fe:4c:84:af:59:0e:2f:f4:54:6f:ea:29 -# SHA1 Fingerprint: c8:83:44:c0:18:ae:9f:cc:f1:87:b7:8f:22:d1:c5:d7:45:84:ba:e5 -# SHA256 Fingerprint: fe:76:96:57:38:55:77:3e:37:a9:5e:7a:d4:d9:cc:96:c3:01:57:c1:5d:31:76:5b:a9:b1:57:04:e1:ae:78:fd ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique -# Subject: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique -# Label: "TunTrust Root CA" -# Serial: 108534058042236574382096126452369648152337120275 -# MD5 Fingerprint: 85:13:b9:90:5b:36:5c:b6:5e:b8:5a:f8:e0:31:57:b4 -# SHA1 Fingerprint: cf:e9:70:84:0f:e0:73:0f:9d:f6:0c:7f:2c:4b:ee:20:46:34:9c:bb -# SHA256 Fingerprint: 2e:44:10:2a:b5:8c:b8:54:19:45:1c:8e:19:d9:ac:f3:66:2c:af:bc:61:4b:6a:53:96:0a:30:f7:d0:e2:eb:41 ------BEGIN CERTIFICATE----- -MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL -BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg -Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv -b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG -EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u -IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ -n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd -2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF -VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ -GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF -li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU -r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2 -eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb -MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg -jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB -7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW -5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE -ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 -90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z -xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu -QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4 -FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH -22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP -xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn -dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5 -Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b -nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ -CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH -u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj -d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= ------END CERTIFICATE----- - -# Issuer: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Subject: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Label: "HARICA TLS RSA Root CA 2021" -# Serial: 76817823531813593706434026085292783742 -# MD5 Fingerprint: 65:47:9b:58:86:dd:2c:f0:fc:a2:84:1f:1e:96:c4:91 -# SHA1 Fingerprint: 02:2d:05:82:fa:88:ce:14:0c:06:79:de:7f:14:10:e9:45:d7:a5:6d -# SHA256 Fingerprint: d9:5d:0e:8e:da:79:52:5b:f9:be:b1:1b:14:d2:10:0d:32:94:98:5f:0c:62:d9:fa:bd:9c:d9:99:ec:cb:7b:1d ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs -MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg -Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL -MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl -YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv -b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l -mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE -4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv -a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M -pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw -Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b -LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY -AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB -AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq -E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr -W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ -CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU -X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3 -f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja -H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP -JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P -zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt -jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0 -/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT -BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79 -aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW -xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU -63ZTGI0RmLo= ------END CERTIFICATE----- - -# Issuer: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Subject: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Label: "HARICA TLS ECC Root CA 2021" -# Serial: 137515985548005187474074462014555733966 -# MD5 Fingerprint: ae:f7:4c:e5:66:35:d1:b7:9b:8c:22:93:74:d3:4b:b0 -# SHA1 Fingerprint: bc:b0:c1:9d:e9:98:92:70:19:38:57:e9:8d:a7:b4:5d:6e:ee:01:48 -# SHA256 Fingerprint: 3f:99:cc:47:4a:cf:ce:4d:fe:d5:87:94:66:5e:47:8d:15:47:73:9f:2e:78:0f:1b:b4:ca:9b:13:30:97:d4:01 ------BEGIN CERTIFICATE----- -MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw -CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh -cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v -dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG -A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj -aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg -Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7 -KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y -STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD -AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw -SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN -nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps ------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: 1977337328857672817 -# MD5 Fingerprint: 4e:6e:9b:54:4c:ca:b7:fa:48:e4:90:b1:15:4b:1c:a3 -# SHA1 Fingerprint: 0b:be:c2:27:22:49:cb:39:aa:db:35:5c:53:e3:8c:ae:78:ff:b6:fe -# SHA256 Fingerprint: 57:de:05:83:ef:d2:b2:6e:03:61:da:99:da:9d:f4:64:8d:ef:7e:e8:44:1c:3b:72:8a:fa:9b:cd:e0:f9:b2:6a ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1 -MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -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+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4APn7VdMAc -tHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd -IAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j -b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABC -AG8AbgBhAG4AbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAw -ADEANzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9m -iWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL4QjbEwj4KKE1soCzC1HA01aajTNF -Sa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDbLIpgD7dvlAceHabJ -hfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1ilI45P -Vf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZE -EAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV -1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2t -CsvMo2ebKHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR -5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqw -f9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9 -ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNK -GbqEZycPvEJdvSRUDewdcAZfpLz6IHxV ------END CERTIFICATE----- - -# Issuer: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. -# Subject: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. -# Label: "vTrus ECC Root CA" -# Serial: 630369271402956006249506845124680065938238527194 -# MD5 Fingerprint: de:4b:c1:f5:52:8c:9b:43:e1:3e:8f:55:54:17:8d:85 -# SHA1 Fingerprint: f6:9c:db:b0:fc:f6:02:13:b6:52:32:a6:a3:91:3f:16:70:da:c3:e1 -# SHA256 Fingerprint: 30:fb:ba:2c:32:23:8e:2a:98:54:7a:f9:79:31:e5:50:42:8b:9b:3f:1c:8e:eb:66:33:dc:fa:86:c5:b2:7d:d3 ------BEGIN CERTIFICATE----- -MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw -RzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY -BgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz -MTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u -LEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0 -v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd -e4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw -V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA -AjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG -GJTO ------END CERTIFICATE----- - -# Issuer: CN=vTrus Root CA O=iTrusChina Co.,Ltd. -# Subject: CN=vTrus Root CA O=iTrusChina Co.,Ltd. -# Label: "vTrus Root CA" -# Serial: 387574501246983434957692974888460947164905180485 -# MD5 Fingerprint: b8:c9:37:df:fa:6b:31:84:64:c5:ea:11:6a:1b:75:fc -# SHA1 Fingerprint: 84:1a:69:fb:f5:cd:1a:25:34:13:3d:e3:f8:fc:b8:99:d0:c9:14:b7 -# SHA256 Fingerprint: 8a:71:de:65:59:33:6f:42:6c:26:e5:38:80:d0:0d:88:a1:8d:a4:c6:a9:1f:0d:cb:61:94:e2:06:c5:c9:63:87 ------BEGIN CERTIFICATE----- -MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL -BQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x -FjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx -MDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s -THRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc -IrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU -AyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+ -GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9 -8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH -flqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt -J8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim -0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN -pGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ -UqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW -OXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB -AAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet -8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd -nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j -bhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM -Kar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv -TDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS -S8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr -I8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9 -b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB -UvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P -Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven -sBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s= ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X2 O=Internet Security Research Group -# Subject: CN=ISRG Root X2 O=Internet Security Research Group -# Label: "ISRG Root X2" -# Serial: 87493402998870891108772069816698636114 -# MD5 Fingerprint: d3:9e:c4:1e:23:3c:a6:df:cf:a3:7e:6d:e0:14:e6:e5 -# SHA1 Fingerprint: bd:b1:b9:3c:d5:97:8d:45:c6:26:14:55:f8:db:95:c7:5a:d1:53:af -# SHA256 Fingerprint: 69:72:9b:8e:15:a8:6e:fc:17:7a:57:af:b7:17:1d:fc:64:ad:d2:8c:2f:ca:8c:f1:50:7e:34:45:3c:cb:14:70 ------BEGIN CERTIFICATE----- -MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw -CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg -R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 -MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT -ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW -+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 -ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI -zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW -tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 -/q4AaOeMSQ+2b1tbFfLn ------END CERTIFICATE----- - -# Issuer: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. -# Subject: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. -# Label: "HiPKI Root CA - G1" -# Serial: 60966262342023497858655262305426234976 -# MD5 Fingerprint: 69:45:df:16:65:4b:e8:68:9a:8f:76:5f:ff:80:9e:d3 -# SHA1 Fingerprint: 6a:92:e4:a8:ee:1b:ec:96:45:37:e3:29:57:49:cd:96:e3:e5:d2:60 -# SHA256 Fingerprint: f0:15:ce:3c:c2:39:bf:ef:06:4b:e9:f1:d2:c4:17:e1:a0:26:4a:0a:94:be:1f:0c:8d:12:18:64:eb:69:49:cc ------BEGIN CERTIFICATE----- -MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBP -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xGzAZBgNVBAMMEkhpUEtJIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRa -Fw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3 -YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kgUm9vdCBDQSAtIEcx -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0o9Qw -qNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twv -Vcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6 -lZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnz -Qs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZ -KILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfdhSi8MEyr48KxRURHH+CK -FgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj1jOXTyFj -HluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDr -y+K49a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ -/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgM -a/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6 -fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQDAgGGMA0GCSqG -SIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi -7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqc -SE5XCV0vrPSltJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6Fza -ZsT0pPBWGTMpWmWSBUdGSquEwx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9Tc -XzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07QJNBAsNB1CI69aO4I1258EHBGG3zg -iLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv5wiZqAxeJoBF1Pho -L5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+GpzjLrF -Ne85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wr -kkVbbiVghUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+ -vhV4nYWBSipX3tUZQ9rbyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQU -YDksswBVLuT1sw5XxJFBAJw/6KXf6vb/yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== ------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: 159662223612894884239637590694 -# MD5 Fingerprint: 26:29:f8:6d:e1:88:bf:a2:65:7f:aa:c4:cd:0f:7f:fc -# SHA1 Fingerprint: 6b:a0:b0:98:e1:71:ef:5a:ad:fe:48:15:80:77:10:f4:bd:6f:0b:28 -# SHA256 Fingerprint: b0:85:d7:0b:96:4f:19:1a:73:e4:af:0d:54:ae:7a:0e:07:aa:fd:af:9b:71:dd:08:62:13:8a:b7:32:5a:24:a2 ------BEGIN CERTIFICATE----- -MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD -VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw -MTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g -UjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT -BgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx -uYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV -HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/ -+wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147 -bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm ------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: 159662320309726417404178440727 -# MD5 Fingerprint: 05:fe:d0:bf:71:a8:a3:76:63:da:01:e0:d8:52:dc:40 -# SHA1 Fingerprint: e5:8c:1c:c4:91:3b:38:63:4b:e9:10:6e:e3:ad:8e:6b:9d:d9:81:4a -# SHA256 Fingerprint: d9:47:43:2a:bd:e7:b7:fa:90:fc:2e:6b:59:10:1b:12:80:e0:e1:c7:e4:e4:0f:a3:c6:88:7f:ff:57:a7:f4:cf ------BEGIN CERTIFICATE----- -MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo -27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w -Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw -TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl -qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH -szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 -Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk -MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 -wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p -aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN -VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID -AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb -C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe -QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy -h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 -7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J -ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef -MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ -Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT -6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ -0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm -2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb -bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c ------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: 159662449406622349769042896298 -# MD5 Fingerprint: 1e:39:c0:53:e6:1e:29:82:0b:ca:52:55:36:5d:57:dc -# SHA1 Fingerprint: 9a:44:49:76:32:db:de:fa:d0:bc:fb:5a:7b:17:bd:9e:56:09:24:94 -# SHA256 Fingerprint: 8d:25:cd:97:22:9d:bf:70:35:6b:da:4e:b3:cc:73:40:31:e2:4c:f0:0f:af:cf:d3:2d:c7:6e:b5:84:1c:7e:a8 ------BEGIN CERTIFICATE----- -MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt -nfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY -6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu -MC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k -RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg -f9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV -+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo -dDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW -Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa -G73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq -gc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID -AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H -vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 -0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC -B19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u -NmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg -yALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev -HyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6 -xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR -TOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg -JPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV -7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl -6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL ------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: 159662495401136852707857743206 -# MD5 Fingerprint: 3e:e7:9d:58:02:94:46:51:94:e5:e0:22:4a:8b:e7:73 -# SHA1 Fingerprint: ed:e5:71:80:2b:c8:92:b9:5b:83:3c:d2:32:68:3f:09:cd:a0:1e:46 -# SHA256 Fingerprint: 34:d8:a7:3e:e2:08:d9:bc:db:0d:95:65:20:93:4b:4e:40:e6:94:82:59:6e:8b:6f:73:c8:42:6b:01:0a:6f:48 ------BEGIN CERTIFICATE----- -MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD -VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG -A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw -WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz -IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G -jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2 -4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7 -VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm -ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X ------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: 159662532700760215368942768210 -# MD5 Fingerprint: 43:96:83:77:19:4d:76:b3:9d:65:52:e4:1d:22:a5:e8 -# SHA1 Fingerprint: 77:d3:03:67:b5:e0:0c:15:f6:0c:38:61:df:7c:e1:3b:92:46:4d:47 -# SHA256 Fingerprint: 34:9d:fa:40:58:c5:e2:63:12:3b:39:8a:e7:95:57:3c:4e:13:13:c8:3f:e6:8f:93:55:6c:d5:e8:03:1b:3c:7d ------BEGIN CERTIFICATE----- -MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD -VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG -A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw -WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz -IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi -QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR -HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D -9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8 -p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD ------END CERTIFICATE----- - -# Issuer: CN=Telia Root CA v2 O=Telia Finland Oyj -# Subject: CN=Telia Root CA v2 O=Telia Finland Oyj -# Label: "Telia Root CA v2" -# Serial: 7288924052977061235122729490515358 -# MD5 Fingerprint: 0e:8f:ac:aa:82:df:85:b1:f4:dc:10:1c:fc:99:d9:48 -# SHA1 Fingerprint: b9:99:cd:d1:73:50:8a:c4:47:05:08:9c:8c:88:fb:be:a0:2b:40:cd -# SHA256 Fingerprint: 24:2b:69:74:2f:cb:1e:5b:2a:bf:98:89:8b:94:57:21:87:54:4e:5b:4d:99:11:78:65:73:62:1f:6a:74:b8:2c ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQx -CzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UE -AwwQVGVsaWEgUm9vdCBDQSB2MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1 -NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZ -MBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ76zBq -AMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9 -vVYiQJ3q9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9 -lRdU2HhE8Qx3FZLgmEKnpNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTOD -n3WhUidhOPFZPY5Q4L15POdslv5e2QJltI5c0BE0312/UqeBAMN/mUWZFdUXyApT -7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW5olWK8jjfN7j/4nlNW4o -6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNrRBH0pUPC -TEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6 -WT0EBXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63R -DolUK5X6wK0dmBR4M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZI -pEYslOqodmJHixBTB0hXbOKSTbauBcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGj -YzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7Wxy+G2CQ5MB0GA1UdDgQWBBRy -rOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ -8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi -0f6X+J8wfBj5tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMM -A8iZGok1GTzTyVR8qPAs5m4HeW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBS -SRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+Cy748fdHif64W1lZYudogsYMVoe+K -TTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygCQMez2P2ccGrGKMOF -6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15h2Er -3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMt -Ty3EHD70sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pT -VmBds9hCG1xLEooc6+t9xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAW -ysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQraVplI/owd8k+BsHMYeB2F326CjYSlKA -rBPuUBQemMc= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH -# Subject: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH -# Label: "D-TRUST BR Root CA 1 2020" -# Serial: 165870826978392376648679885835942448534 -# MD5 Fingerprint: b5:aa:4b:d5:ed:f7:e3:55:2e:8f:72:0a:f3:75:b8:ed -# SHA1 Fingerprint: 1f:5b:98:f0:e3:b5:f7:74:3c:ed:e6:b0:36:7d:32:cd:f4:09:41:67 -# SHA256 Fingerprint: e5:9a:aa:81:60:09:c2:2b:ff:5b:25:ba:d3:7d:f3:06:f0:49:79:7c:1f:81:d8:5a:b0:89:e6:57:bd:8f:00:44 ------BEGIN CERTIFICATE----- -MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQsw -CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS -VVNUIEJSIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5 -NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG -A1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB -BAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7dPYS -zuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0 -QVK5buXuQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/ -VbNafAkl1bK6CKBrqx9tMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g -PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2JyX3Jvb3Rf -Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l -dC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 -c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO -PQQDAwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFW -wKrY7RjEsK70PvomAjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHV -dWNbFJWcHwHP2NVypw87 ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH -# Subject: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH -# Label: "D-TRUST EV Root CA 1 2020" -# Serial: 126288379621884218666039612629459926992 -# MD5 Fingerprint: 8c:2d:9d:70:9f:48:99:11:06:11:fb:e9:cb:30:c0:6e -# SHA1 Fingerprint: 61:db:8c:21:59:69:03:90:d8:7c:9c:12:86:54:cf:9d:3d:f4:dd:07 -# SHA256 Fingerprint: 08:17:0d:1a:a3:64:53:90:1a:2f:95:92:45:e3:47:db:0c:8d:37:ab:aa:bc:56:b8:1a:a1:00:dc:95:89:70:db ------BEGIN CERTIFICATE----- -MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQsw -CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS -VVNUIEVWIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5 -NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG -A1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB -BAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8ZRCC -/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rD -wpdhQntJraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3 -OqQo5FD4pPfsazK2/umLMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g -PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2V2X3Jvb3Rf -Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l -dC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 -c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO -PQQDAwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CA -y/m0sRtW9XLS/BnRAjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJb -gfM0agPnIjhQW+0ZT0MW ------END CERTIFICATE----- - -# Issuer: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. -# Subject: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. -# Label: "DigiCert TLS ECC P384 Root G5" -# Serial: 13129116028163249804115411775095713523 -# MD5 Fingerprint: d3:71:04:6a:43:1c:db:a6:59:e1:a8:a3:aa:c5:71:ed -# SHA1 Fingerprint: 17:f3:de:5e:9f:0f:19:e9:8e:f6:1f:32:26:6e:20:c4:07:ae:30:ee -# SHA256 Fingerprint: 01:8e:13:f0:77:25:32:cf:80:9b:d1:b1:72:81:86:72:83:fc:48:c6:e1:3b:e9:c6:98:12:85:4a:49:0c:1b:05 ------BEGIN CERTIFICATE----- -MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURp -Z2lDZXJ0IFRMUyBFQ0MgUDM4NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2 -MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ -bmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQgUm9vdCBHNTB2MBAG -ByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1TzvdlHJS -7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp -0zVozptjn4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICIS -B4CIfBFqMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49 -BAMDA2gAMGUCMQCJao1H5+z8blUD2WdsJk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQ -LgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIxAJSdYsiJvRmEFOml+wG4 -DXZDjC5Ty3zfDBeWUA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. -# Subject: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. -# Label: "DigiCert TLS RSA4096 Root G5" -# Serial: 11930366277458970227240571539258396554 -# MD5 Fingerprint: ac:fe:f7:34:96:a9:f2:b3:b4:12:4b:e4:27:41:6f:e1 -# SHA1 Fingerprint: a7:88:49:dc:5d:7c:75:8c:8c:de:39:98:56:b3:aa:d0:b2:a5:71:35 -# SHA256 Fingerprint: 37:1a:00:dc:05:33:b3:72:1a:7e:eb:40:e8:41:9e:70:79:9d:2b:0a:0f:2c:1d:80:69:31:65:f7:ce:c4:ad:75 ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBN -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMT -HERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcN -NDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs -IEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS87IE+ -ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG0 -2C+JFvuUAT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgp -wgscONyfMXdcvyej/Cestyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZM -pG2T6T867jp8nVid9E6P/DsjyG244gXazOvswzH016cpVIDPRFtMbzCe88zdH5RD -nU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnVDdXifBBiqmvwPXbzP6Po -sMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9qTXeXAaDx -Zre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cd -Lvvyz6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvX -KyY//SovcfXWJL5/MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNe -XoVPzthwiHvOAbWWl9fNff2C+MIkwcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPL -tgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4EFgQUUTMc7TZArxfTJc1paPKv -TiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN -AQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw -GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7H -PNtQOa27PShNlnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLF -O4uJ+DQtpBflF+aZfTCIITfNMBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQ -REtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/u4cnYiWB39yhL/btp/96j1EuMPik -AdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9GOUrYU9DzLjtxpdRv -/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh47a+ -p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilw -MUc/dNAUFvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WF -qUITVuwhd4GTWgzqltlJyqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCK -ovfepEWFJqgejF0pW8hL2JpqA15w8oVPbEtoL8pU9ozaMv7Da4M/OMZ+ ------END CERTIFICATE----- - -# Issuer: CN=Certainly Root R1 O=Certainly -# Subject: CN=Certainly Root R1 O=Certainly -# Label: "Certainly Root R1" -# Serial: 188833316161142517227353805653483829216 -# MD5 Fingerprint: 07:70:d4:3e:82:87:a0:fa:33:36:13:f4:fa:33:e7:12 -# SHA1 Fingerprint: a0:50:ee:0f:28:71:f4:27:b2:12:6d:6f:50:96:25:ba:cc:86:42:af -# SHA256 Fingerprint: 77:b8:2c:d8:64:4c:43:05:f7:ac:c5:cb:15:6b:45:67:50:04:03:3d:51:c6:0c:62:02:a8:e0:c3:34:67:d3:a0 ------BEGIN CERTIFICATE----- -MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAw -PTELMAkGA1UEBhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2Vy -dGFpbmx5IFJvb3QgUjEwHhcNMjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9 -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0 -YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANA2 -1B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O5MQT -vqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbed -aFySpvXl8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b0 -1C7jcvk2xusVtyWMOvwlDbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5 -r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGIXsXwClTNSaa/ApzSRKft43jvRl5tcdF5 -cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkNKPl6I7ENPT2a/Z2B7yyQ -wHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQAjeZjOVJ -6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA -2CnbrlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyH -Wyf5QBGenDPBt+U1VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMR -eiFPCyEQtkA6qyI6BJyLm4SGcprSp6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB -/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTgqj8ljZ9EXME66C6u -d0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAszHQNTVfSVcOQr -PbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d -8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi -1wrykXprOQ4vMMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrd -rRT90+7iIgXr0PK3aBLXWopBGsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9di -taY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+gjwN/KUD+nsa2UUeYNrEjvn8K8l7 -lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgHJBu6haEaBQmAupVj -yTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7fpYn -Kx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLy -yCwzk5Iwx06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5n -wXARPbv0+Em34yaXOp/SX3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6 -OV+KmalBWQewLK8= ------END CERTIFICATE----- - -# Issuer: CN=Certainly Root E1 O=Certainly -# Subject: CN=Certainly Root E1 O=Certainly -# Label: "Certainly Root E1" -# Serial: 8168531406727139161245376702891150584 -# MD5 Fingerprint: 0a:9e:ca:cd:3e:52:50:c6:36:f3:4b:a3:ed:a7:53:e9 -# SHA1 Fingerprint: f9:e1:6d:dc:01:89:cf:d5:82:45:63:3e:c5:37:7d:c2:eb:93:6f:2b -# SHA256 Fingerprint: b4:58:5f:22:e4:ac:75:6a:4e:86:12:a1:36:1c:5d:9d:03:1a:93:fd:84:fe:bb:77:8f:a3:06:8b:0f:c4:2d:c2 ------BEGIN CERTIFICATE----- -MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQsw -CQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlu -bHkgUm9vdCBFMTAeFw0yMTA0MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJ -BgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlubHkxGjAYBgNVBAMTEUNlcnRhaW5s -eSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4fxzf7flHh4axpMCK -+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9YBk2 -QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4 -hevIIgcwCgYIKoZIzj0EAwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozm -ut6Dacpps6kFtZaSF4fC0urQe87YQVt8rgIwRt7qy12a7DLCZRawTDBcMPPaTnOG -BtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR ------END CERTIFICATE----- - -# Issuer: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. -# Subject: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. -# Label: "Security Communication ECC RootCA1" -# Serial: 15446673492073852651 -# MD5 Fingerprint: 7e:43:b0:92:68:ec:05:43:4c:98:ab:5d:35:2e:7e:86 -# SHA1 Fingerprint: b8:0e:26:a9:bf:d2:b2:3b:c0:ef:46:c9:ba:c7:bb:f6:1d:0d:41:41 -# SHA256 Fingerprint: e7:4f:bd:a5:5b:d5:64:c4:73:a3:6b:44:1a:a7:99:c8:a6:8e:07:74:40:e8:28:8b:9f:a1:e5:0e:4b:ba:ca:11 ------BEGIN CERTIFICATE----- -MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYT -AkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYD -VQQDEyJTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYx -NjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTELMAkGA1UEBhMCSlAxJTAjBgNVBAoT -HFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNVBAMTIlNlY3VyaXR5 -IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+Cnnfdl -dB9sELLo5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpK -ULGjQjBAMB0GA1UdDgQWBBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu -9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3LsnNdo4gIxwwCMQDAqy0O -be0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70eN9k= ------END CERTIFICATE----- - -# Issuer: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY -# Subject: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY -# Label: "BJCA Global Root CA1" -# Serial: 113562791157148395269083148143378328608 -# MD5 Fingerprint: 42:32:99:76:43:33:36:24:35:07:82:9b:28:f9:d0:90 -# SHA1 Fingerprint: d5:ec:8d:7b:4c:ba:79:f4:e7:e8:cb:9d:6b:ae:77:83:10:03:21:6a -# SHA256 Fingerprint: f3:89:6f:88:fe:7c:0a:88:27:66:a7:fa:6a:d2:74:9f:b5:7a:7f:3e:98:fb:76:9c:1f:a7:b0:9c:2c:44:d5:ae ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBU -MQswCQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRI -T1JJVFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAz -MTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJF -SUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2Jh -bCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFmCL3Z -xRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZ -spDyRhySsTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O5 -58dnJCNPYwpj9mZ9S1WnP3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgR -at7GGPZHOiJBhyL8xIkoVNiMpTAK+BcWyqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll -5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRjeulumijWML3mG90Vr4Tq -nMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNnMoH1V6XK -V0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/ -pj+bOT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZO -z2nxbkRs1CTqjSShGL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXn -jSXWgXSHRtQpdaJCbPdzied9v3pKH9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+ -WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMBAAGjQjBAMB0GA1UdDgQWBBTF -7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 -YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3Kli -awLwQ8hOnThJdMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u -+2D2/VnGKhs/I0qUJDAnyIm860Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88 -X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuhTaRjAv04l5U/BXCga99igUOLtFkN -SoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW4AB+dAb/OMRyHdOo -P2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmpGQrI -+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRz -znfSxqxx4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9 -eVzYH6Eze9mCUAyTF6ps3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2 -YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4SSPfSKcOYKMryMguTjClPPGAyzQWWYezy -r/6zcCwupvI= ------END CERTIFICATE----- - -# Issuer: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY -# Subject: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY -# Label: "BJCA Global Root CA2" -# Serial: 58605626836079930195615843123109055211 -# MD5 Fingerprint: 5e:0a:f6:47:5f:a6:14:e8:11:01:95:3f:4d:01:eb:3c -# SHA1 Fingerprint: f4:27:86:eb:6e:b8:6d:88:31:67:02:fb:ba:66:a4:53:00:aa:7a:a6 -# SHA256 Fingerprint: 57:4d:f6:93:1e:27:80:39:66:7b:72:0a:fd:c1:60:0f:c2:7e:b6:6d:d3:09:29:79:fb:73:85:64:87:21:28:82 ------BEGIN CERTIFICATE----- -MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQsw -CQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJ -VFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgy -MVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJ -TkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2JhbCBS -b290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jlSR9B -IgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK+ -+kpRuDCK/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJK -sVF/BvDRgh9Obl+rg/xI1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA -94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8gUXOQwKhbYdDFUDn9hf7B -43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== ------END CERTIFICATE----- - -# Issuer: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited -# Subject: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited -# Label: "Sectigo Public Server Authentication Root E46" -# Serial: 88989738453351742415770396670917916916 -# MD5 Fingerprint: 28:23:f8:b2:98:5c:37:16:3b:3e:46:13:4e:b0:b3:01 -# SHA1 Fingerprint: ec:8a:39:6c:40:f0:2e:bc:42:75:d4:9f:ab:1c:1a:5b:67:be:d2:9a -# SHA256 Fingerprint: c9:0f:26:f0:fb:1b:40:18:b2:22:27:51:9b:5c:a2:b5:3e:2c:a5:b3:be:5c:f1:8e:fe:1b:ef:47:38:0c:53:83 ------BEGIN CERTIFICATE----- -MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQsw -CQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T -ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcN -MjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYG -A1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT -ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccC -WvkEN/U0NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+ -6xnOQ6OjQjBAMB0GA1UdDgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8B -Af8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNnADBkAjAn7qRa -qCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RHlAFWovgzJQxC36oCMB3q -4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21USAGKcw== ------END CERTIFICATE----- - -# Issuer: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited -# Subject: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited -# Label: "Sectigo Public Server Authentication Root R46" -# Serial: 156256931880233212765902055439220583700 -# MD5 Fingerprint: 32:10:09:52:00:d5:7e:6c:43:df:15:c0:b1:16:93:e5 -# SHA1 Fingerprint: ad:98:f9:f3:e4:7d:75:3b:65:d4:82:b3:a4:52:17:bb:6e:f5:e4:38 -# SHA256 Fingerprint: 7b:b6:47:a6:2a:ee:ac:88:bf:25:7a:a5:22:d0:1f:fe:a3:95:e0:ab:45:c7:3f:93:f6:56:54:ec:38:f2:5a:06 ------BEGIN CERTIFICATE----- -MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBf -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQD -Ey1TZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYw -HhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEY -MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1Ymxp -YyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDa -ef0rty2k1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnz -SDBh+oF8HqcIStw+KxwfGExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xf -iOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMPFF1bFOdLvt30yNoDN9HWOaEhUTCDsG3X -ME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vuZDCQOc2TZYEhMbUjUDM3 -IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5QazYw6A3OAS -VYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgE -SJ/AwSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu -+Zd4KKTIRJLpfSYFplhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt -8uaZFURww3y8nDnAtOFr94MlI1fZEoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+L -HaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW6aWWrL3DkJiy4Pmi1KZHQ3xt -zwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWIIUkwDgYDVR0P -AQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c -mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQ -YKlJfp/imTYpE0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52 -gDY9hAaLMyZlbcp+nv4fjFg4exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZA -Fv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M0ejf5lG5Nkc/kLnHvALcWxxPDkjB -JYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI84HxZmduTILA7rpX -DhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9mpFui -TdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5 -dHn5HrwdVw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65 -LvKRRFHQV80MNNVIIb/bE/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp -0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmmJ1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAY -QqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL ------END CERTIFICATE----- - -# Issuer: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation -# Subject: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation -# Label: "SSL.com TLS RSA Root CA 2022" -# Serial: 148535279242832292258835760425842727825 -# MD5 Fingerprint: d8:4e:c6:59:30:d8:fe:a0:d6:7a:5a:2c:2c:69:78:da -# SHA1 Fingerprint: ec:2c:83:40:72:af:26:95:10:ff:0e:f2:03:ee:31:70:f6:78:9d:ca -# SHA256 Fingerprint: 8f:af:7d:2e:2c:b4:70:9b:b8:e0:b3:36:66:bf:75:a5:dd:45:b5:de:48:0f:8e:a8:d4:bf:e6:be:bc:17:f2:ed ------BEGIN CERTIFICATE----- -MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBO -MQswCQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQD -DBxTU0wuY29tIFRMUyBSU0EgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloX -DTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jw -b3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJvb3QgQ0EgMjAyMjCC -AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u9nTP -L3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OY -t6/wNr/y7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0ins -S657Lb85/bRi3pZ7QcacoOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3 -PnxEX4MN8/HdIGkWCVDi1FW24IBydm5MR7d1VVm0U3TZlMZBrViKMWYPHqIbKUBO -L9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDGD6C1vBdOSHtRwvzpXGk3 -R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEWTO6Af77w -dr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS -+YCk8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYS -d66UNHsef8JmAOSqg+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoG -AtUjHBPW6dvbxrB6y3snm/vg1UYk7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2f -gTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j -BBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsuN+7jhHonLs0Z -NbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt -hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsM -QtfhWsSWTVTNj8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvf -R4iyrT7gJ4eLSYwfqUdYe5byiB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJ -DPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjUo3KUQyxi4U5cMj29TH0ZR6LDSeeW -P4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqoENjwuSfr98t67wVy -lrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7EgkaibMOlq -bLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2w -AgDHbICivRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3q -r5nsLFR+jM4uElZI7xc7P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sji -Mho6/4UIyYOf8kpIEFR3N+2ivEC+5BB09+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU -98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation -# Subject: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation -# Label: "SSL.com TLS ECC Root CA 2022" -# Serial: 26605119622390491762507526719404364228 -# MD5 Fingerprint: 99:d7:5c:f1:51:36:cc:e9:ce:d9:19:2e:77:71:56:c5 -# SHA1 Fingerprint: 9f:5f:d9:1a:54:6d:f5:0c:71:f0:ee:7a:bd:17:49:98:84:73:e2:39 -# SHA256 Fingerprint: c3:2f:fd:9f:46:f9:36:d1:6c:36:73:99:09:59:43:4b:9a:d6:0a:af:bb:9e:7c:f3:36:54:f1:44:cc:1b:a1:43 ------BEGIN CERTIFICATE----- -MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQsw -CQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxT -U0wuY29tIFRMUyBFQ0MgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2 -MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3Jh -dGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3QgQ0EgMjAyMjB2MBAG -ByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWyJGYm -acCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFN -SeR7T5v15wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME -GDAWgBSJjy+j6CugFFR781a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NW -uCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp -15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w7deedWo1dlJF4AIxAMeN -b0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5Zn6g6g== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos -# Subject: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos -# Label: "Atos TrustedRoot Root CA ECC TLS 2021" -# Serial: 81873346711060652204712539181482831616 -# MD5 Fingerprint: 16:9f:ad:f1:70:ad:79:d6:ed:29:b4:d1:c5:79:70:a8 -# SHA1 Fingerprint: 9e:bc:75:10:42:b3:02:f3:81:f4:f7:30:62:d4:8f:c3:a7:51:b2:dd -# SHA256 Fingerprint: b2:fa:e5:3e:14:cc:d7:ab:92:12:06:47:01:ae:27:9c:1d:89:88:fa:cb:77:5f:a8:a0:08:91:4e:66:39:88:a8 ------BEGIN CERTIFICATE----- -MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4w -LAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0w -CwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0 -MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBF -Q0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMHYwEAYHKoZI -zj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6KDP/X -tXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4 -AjJn8ZQSb+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2 -KCXWfeBmmnoJsmo7jjPXNtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMD -aAAwZQIwW5kp85wxtolrbNa9d+F851F+uDrNozZffPc8dz7kUK2o59JZDCaOMDtu -CCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGYa3cpetskz2VAv9LcjBHo -9H1/IISpQuQo ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos -# Subject: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos -# Label: "Atos TrustedRoot Root CA RSA TLS 2021" -# Serial: 111436099570196163832749341232207667876 -# MD5 Fingerprint: d4:d3:46:b8:9a:c0:9c:76:5d:9e:3a:c3:b9:99:31:d2 -# SHA1 Fingerprint: 18:52:3b:0d:06:37:e4:d6:3a:df:23:e4:98:fb:5b:16:fb:86:74:48 -# SHA256 Fingerprint: 81:a9:08:8e:a5:9f:b3:64:c5:48:a6:f8:55:59:09:9b:6f:04:05:ef:bf:18:e5:32:4e:c9:f4:57:ba:00:11:2f ------BEGIN CERTIFICATE----- -MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBM -MS4wLAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIx -MQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00 -MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBD -QSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BBl01Z -4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYv -Ye+W/CBGvevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZ -kmGbzSoXfduP9LVq6hdKZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDs -GY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt0xU6kGpn8bRrZtkh68rZYnxGEFzedUln -nkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVKPNe0OwANwI8f4UDErmwh -3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMYsluMWuPD -0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzy -geBYBr3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8 -ANSbhqRAvNncTFd+rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezB -c6eUWsuSZIKmAMFwoW4sKeFYV+xafJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lI -pw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -dEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -DAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS -4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPs -o0UvFJ/1TCplQ3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJ -qM7F78PRreBrAwA0JrRUITWXAdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuyw -xfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9GslA9hGCZcbUztVdF5kJHdWoOsAgM -rr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2VktafcxBPTy+av5EzH4 -AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9qTFsR -0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuY -o7Ey7Nmj1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5 -dDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcE -oji2jbDwN/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ== ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. -# Label: "TrustAsia Global Root CA G3" -# Serial: 576386314500428537169965010905813481816650257167 -# MD5 Fingerprint: 30:42:1b:b7:bb:81:75:35:e4:16:4f:53:d2:94:de:04 -# SHA1 Fingerprint: 63:cf:b6:c1:27:2b:56:e4:88:8e:1c:23:9a:b6:2e:81:47:24:c3:c7 -# SHA256 Fingerprint: e0:d3:22:6a:eb:11:63:c2:e4:8f:f9:be:3b:50:b4:c6:43:1b:e7:bb:1e:ac:c5:c3:6b:5d:5e:c5:09:03:9a:08 ------BEGIN CERTIFICATE----- -MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEM -BQAwWjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dp -ZXMsIEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAe -Fw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEwMTlaMFoxCzAJBgNVBAYTAkNOMSUw -IwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtU -cnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNS -T1QY4SxzlZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqK -AtCWHwDNBSHvBm3dIZwZQ0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1 -nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/VP68czH5GX6zfZBCK70bwkPAPLfSIC7Ep -qq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1AgdB4SQXMeJNnKziyhWTXA -yB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm9WAPzJMs -hH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gX -zhqcD0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAv -kV34PmVACxmZySYgWmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msT -f9FkPz2ccEblooV7WIQn3MSAPmeamseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jA -uPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCFTIcQcf+eQxuulXUtgQIDAQAB -o2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj7zjKsK5Xf/Ih -MBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E -BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4 -wM8zAQLpw6o1D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2 -XFNFV1pF1AWZLy4jVe5jaN/TG3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1 -JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNjduMNhXJEIlU/HHzp/LgV6FL6qj6j -ITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstlcHboCoWASzY9M/eV -VHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys+TIx -xHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1on -AX1daBli2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d -7XB4tmBZrOFdRWOPyN9yaFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2Ntjj -gKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsASZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV -+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFRJQJ6+N1rZdVtTTDIZbpo -FGWsJwt0ivKH ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. -# Label: "TrustAsia Global Root CA G4" -# Serial: 451799571007117016466790293371524403291602933463 -# MD5 Fingerprint: 54:dd:b2:d7:5f:d8:3e:ed:7c:e0:0b:2e:cc:ed:eb:eb -# SHA1 Fingerprint: 57:73:a5:61:5d:80:b2:e6:ac:38:82:fc:68:07:31:ac:9f:b5:92:5a -# SHA256 Fingerprint: be:4b:56:cb:50:56:c0:13:6a:52:6d:f4:44:50:8d:aa:36:a0:b5:4f:42:e4:ac:38:f7:2a:f4:70:e4:79:65:4c ------BEGIN CERTIFICATE----- -MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMw -WjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs -IEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0y -MTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJaMFoxCzAJBgNVBAYTAkNOMSUwIwYD -VQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtUcnVz -dEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATx -s8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbw -LxYI+hW8m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJij -YzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mD -pm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/pDHel4NZg6ZvccveMA4GA1UdDwEB/wQE -AwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AAbbd+NvBNEU/zy4k6LHiR -UKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xkdUfFVZDj -/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== ------END CERTIFICATE----- - -# Issuer: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH -# Subject: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH -# Label: "Telekom Security TLS ECC Root 2020" -# Serial: 72082518505882327255703894282316633856 -# MD5 Fingerprint: c1:ab:fe:6a:10:2c:03:8d:bc:1c:22:32:c0:85:a7:fd -# SHA1 Fingerprint: c0:f8:96:c5:a9:3b:01:06:21:07:da:18:42:48:bc:e9:9d:88:d5:ec -# SHA256 Fingerprint: 57:8a:f4:de:d0:85:3f:4e:59:98:db:4a:ea:f9:cb:ea:8d:94:5f:60:b6:20:a3:8d:1a:3c:13:b2:bc:7b:a8:e1 ------BEGIN CERTIFICATE----- -MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQsw -CQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBH -bWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIw -MB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIzNTk1OVowYzELMAkGA1UEBhMCREUx -JzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkGA1UE -AwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/O -tdKPD/M12kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDP -f8iAC8GXs7s1J8nCG6NCMEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6f -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cA -MGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZMo7k+5Dck2TOrbRBR2Di -z6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdUga/sf+Rn -27iQ7t0l ------END CERTIFICATE----- - -# Issuer: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH -# Subject: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH -# Label: "Telekom Security TLS RSA Root 2023" -# Serial: 44676229530606711399881795178081572759 -# MD5 Fingerprint: bf:5b:eb:54:40:cd:48:71:c4:20:8d:7d:de:0a:42:f2 -# SHA1 Fingerprint: 54:d3:ac:b3:bd:57:56:f6:85:9d:ce:e5:c3:21:e2:d4:ad:83:d0:93 -# SHA256 Fingerprint: ef:c6:5c:ad:bb:59:ad:b6:ef:e8:4d:a2:23:11:b3:56:24:b7:1b:3b:1e:a0:da:8b:66:55:17:4e:c8:97:86:46 ------BEGIN CERTIFICATE----- -MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBj -MQswCQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0 -eSBHbWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAy -MDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMyNzIzNTk1OVowYzELMAkGA1UEBhMC -REUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkG -A1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9 -cUD/h3VCKSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHV -cp6R+SPWcHu79ZvB7JPPGeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMA -U6DksquDOFczJZSfvkgdmOGjup5czQRxUX11eKvzWarE4GC+j4NSuHUaQTXtvPM6 -Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWol8hHD/BeEIvnHRz+sTug -BTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9FIS3R/qy -8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73J -co4vzLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg -8qKrBC7m8kwOFjQgrIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8 -rFEz0ciD0cmfHdRHNCk+y7AO+oMLKFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12 -mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7SWWO/gLCMk3PLNaaZlSJhZQNg -+y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtqeX -gj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2 -p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQ -pGv7qHBFfLp+sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm -9S3ul0A8Yute1hTWjOKWi0FpkzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErw -M807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy/SKE8YXJN3nptT+/XOR0so8RYgDd -GGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4mZqTuXNnQkYRIer+ -CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtzaL1t -xKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+ -w6jv/naaoqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aK -L4x35bcF7DvB7L6Gs4a8wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+lj -X273CXE2whJdV/LItM3z7gLfEdxquVeEHVlNjM7IDiPCtyaaEBRx/pOyiriA8A4Q -ntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0o82bNSQ3+pCTE4FCxpgm -dTdmQRCsu/WU48IxK63nI1bMNSWSs1A= ------END CERTIFICATE----- - -# Issuer: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA -# Subject: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA -# Label: "FIRMAPROFESIONAL CA ROOT-A WEB" -# Serial: 65916896770016886708751106294915943533 -# MD5 Fingerprint: 82:b2:ad:45:00:82:b0:66:63:f8:5f:c3:67:4e:ce:a3 -# SHA1 Fingerprint: a8:31:11:74:a6:14:15:0d:ca:77:dd:0e:e4:0c:5d:58:fc:a0:72:a5 -# SHA256 Fingerprint: be:f2:56:da:f2:6e:9c:69:bd:ec:16:02:35:97:98:f3:ca:f7:18:21:a0:3e:01:82:57:c5:3c:65:61:7f:3d:4a ------BEGIN CERTIFICATE----- -MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQsw -CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE -YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB -IFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2WhcNNDcwMzMxMDkwMTM2WjBuMQsw -CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE -YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB -IFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zf -e9MEkVz6iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6C -cyvHZpsKjECcfIr28jlgst7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FDY1w8ndYn81LsF7Kpryz3dvgwHQYDVR0O -BBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO -PQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgLcFBTApFw -hVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dG -XSaQpYXFuXqUPoeovQA= ------END CERTIFICATE----- - -# Issuer: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA CYBER Root CA" -# Serial: 85076849864375384482682434040119489222 -# MD5 Fingerprint: 0b:33:a0:97:52:95:d4:a9:fd:bb:db:6e:a3:55:5b:51 -# SHA1 Fingerprint: f6:b1:1c:1a:83:38:e9:7b:db:b3:a8:c8:33:24:e0:2d:9c:7f:26:66 -# SHA256 Fingerprint: 3f:63:bb:28:14:be:17:4e:c8:b6:43:9c:f0:8d:6d:56:f0:b7:c4:05:88:3a:56:48:a3:34:42:4d:6b:3e:c5:58 ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQ -MQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290 -IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5 -WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FO -LUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3Qg -Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1sTs6P -40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxF -avcokPFhV8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/ -34bKS1PE2Y2yHer43CdTo0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684i -JkXXYJndzk834H/nY62wuFm40AZoNWDTNq5xQwTxaWV4fPMf88oon1oglWa0zbfu -j3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK/c/WMw+f+5eesRycnupf -Xtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkHIuNZW0CP -2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDA -S9TMfAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDA -oS/xUgXJP+92ZuJF2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzC -kHDXShi8fgGwsOsVHkQGzaRP6AzRwyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW -5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83QOGt4A1WNzAd -BgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB -AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0t -tGlTITVX1olNc79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn -68xDiBaiA9a5F/gZbG0jAn/xX9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNn -TKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDRIG4kqIQnoVesqlVYL9zZyvpoBJ7t -RCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq/p1hvIbZv97Tujqx -f36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0RFxbI -Qh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz -8ppy6rBePm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4 -NxKfKjLji7gh7MMrZQzvIt6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzX -xeSDwWrruoBa3lwtcHb4yOWHh8qgnaHlIhInD0Q9HWzq1MKLL295q39QpsQZp6F6 -t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X ------END CERTIFICATE----- - -# Issuer: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. -# Subject: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. -# Label: "SecureSign Root CA12" -# Serial: 587887345431707215246142177076162061960426065942 -# MD5 Fingerprint: c6:89:ca:64:42:9b:62:08:49:0b:1e:7f:e9:07:3d:e8 -# SHA1 Fingerprint: 7a:22:1e:3d:de:1b:06:ac:9e:c8:47:70:16:8e:3c:e5:f7:6b:06:f4 -# SHA256 Fingerprint: 3f:03:4b:b5:70:4d:44:b2:d0:85:45:a0:20:57:de:93:eb:f3:90:5f:ce:72:1a:cb:c7:30:c0:6d:da:ee:90:4e ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u -LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgw -NTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD -eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS -b290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3emhF -KxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mt -p7JIKwccJ/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zd -J1M3s6oYwlkm7Fsf0uZlfO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gur -FzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBFEaCeVESE99g2zvVQR9wsMJvuwPWW0v4J -hscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1UefNzFJM3IFTQy2VYzxV4+K -h9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsF -AAOCAQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6Ld -mmQOmFxv3Y67ilQiLUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJ -mBClnW8Zt7vPemVV2zfrPIpyMpcemik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA -8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPSvWKErI4cqc1avTc7bgoitPQV -55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhgaaaI5gdka9at/ -yOPiZwud9AzqVN/Ssq+xIvEg37xEHA== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. -# Subject: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. -# Label: "SecureSign Root CA14" -# Serial: 575790784512929437950770173562378038616896959179 -# MD5 Fingerprint: 71:0d:72:fa:92:19:65:5e:89:04:ac:16:33:f0:bc:d5 -# SHA1 Fingerprint: dd:50:c0:f7:79:b3:64:2e:74:a2:b8:9d:9f:d3:40:dd:bb:f0:f2:4f -# SHA256 Fingerprint: 4b:00:9c:10:34:49:4f:9a:b5:6b:ba:3b:a1:d6:27:31:fc:4d:20:d8:95:5a:dc:ec:10:a9:25:60:72:61:e3:38 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEM -BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u -LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgw -NzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD -eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS -b290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh1oq/ -FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOg -vlIfX8xnbacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy -6pJxaeQp8E+BgQQ8sqVb1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo -/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9J -kdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOEkJTRX45zGRBdAuVwpcAQ -0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSxjVIHvXib -y8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac -18izju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs -0Wq2XSqypWa9a4X0dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIAB -SMbHdPTGrMNASRZhdCyvjG817XsYAFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVL -ApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeqYR3r6/wtbyPk -86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E -rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ib -ed87hwriZLoAymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopT -zfFP7ELyk+OZpDc8h7hi2/DsHzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHS -DCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPGFrojutzdfhrGe0K22VoF3Jpf1d+4 -2kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6qnsb58Nn4DSEC5MUo -FlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/OfVy -K4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6 -dB7h7sxaOgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtl -Lor6CZpO2oYofaphNdgOpygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB -365jJ6UeTo3cKXhZ+PmhIIynJkBugnLNeLLIjzwec+fBH7/PzqUqm9tEZDKgu39c -JRNItX+S ------END CERTIFICATE----- - -# Issuer: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. -# Subject: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. -# Label: "SecureSign Root CA15" -# Serial: 126083514594751269499665114766174399806381178503 -# MD5 Fingerprint: 13:30:fc:c4:62:a6:a9:de:b5:c1:68:af:b5:d2:31:47 -# SHA1 Fingerprint: cb:ba:83:c8:c1:5a:5d:f1:f9:73:6f:ca:d7:ef:28:13:06:4a:07:7d -# SHA256 Fingerprint: e7:78:f0:f0:95:fe:84:37:29:cd:1a:00:82:17:9e:53:14:a9:c2:91:44:28:05:e1:fb:1d:8f:b6:b8:88:6c:3a ------BEGIN CERTIFICATE----- -MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMw -UTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBM -dGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMy -NTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpDeWJl -cnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBSb290 -IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5GdCx4 -wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSR -ZHX+AezB2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT -9DAKBggqhkjOPQQDAwNoADBlAjEA2S6Jfl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp -4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJSwdLZrWeqrqgHkHZAXQ6 -bkU6iYAZezKYVWOr62Nuk22rGwlgMU4= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH -# Subject: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH -# Label: "D-TRUST BR Root CA 2 2023" -# Serial: 153168538924886464690566649552453098598 -# MD5 Fingerprint: e1:09:ed:d3:60:d4:56:1b:47:1f:b7:0c:5f:1b:5f:85 -# SHA1 Fingerprint: 2d:b0:70:ee:71:94:af:69:68:17:db:79:ce:58:9f:a0:6b:96:f7:87 -# SHA256 Fingerprint: 05:52:e6:f8:3f:df:65:e8:fa:96:70:e6:66:df:28:a4:e2:13:40:b5:10:cb:e5:25:66:f9:7c:4f:b9:4b:2b:d1 ------BEGIN CERTIFICATE----- -MIIFqTCCA5GgAwIBAgIQczswBEhb2U14LnNLyaHcZjANBgkqhkiG9w0BAQ0FADBI -MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE -LVRSVVNUIEJSIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA4NTYzMVoXDTM4MDUw -OTA4NTYzMFowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi -MCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAK7/CVmRgApKaOYkP7in5Mg6CjoWzckjYaCTcfKr -i3OPoGdlYNJUa2NRb0kz4HIHE304zQaSBylSa053bATTlfrdTIzZXcFhfUvnKLNE -gXtRr90zsWh81k5M/itoucpmacTsXld/9w3HnDY25QdgrMBM6ghs7wZ8T1soegj8 -k12b9py0i4a6Ibn08OhZWiihNIQaJZG2tY/vsvmA+vk9PBFy2OMvhnbFeSzBqZCT -Rphny4NqoFAjpzv2gTng7fC5v2Xx2Mt6++9zA84A9H3X4F07ZrjcjrqDy4d2A/wl -2ecjbwb9Z/Pg/4S8R7+1FhhGaRTMBffb00msa8yr5LULQyReS2tNZ9/WtT5PeB+U -cSTq3nD88ZP+npNa5JRal1QMNXtfbO4AHyTsA7oC9Xb0n9Sa7YUsOCIvx9gvdhFP -/Wxc6PWOJ4d/GUohR5AdeY0cW/jPSoXk7bNbjb7EZChdQcRurDhaTyN0dKkSw/bS -uREVMweR2Ds3OmMwBtHFIjYoYiMQ4EbMl6zWK11kJNXuHA7e+whadSr2Y23OC0K+ -0bpwHJwh5Q8xaRfX/Aq03u2AnMuStIv13lmiWAmlY0cL4UEyNEHZmrHZqLAbWt4N -DfTisl01gLmB1IRpkQLLddCNxbU9CZEJjxShFHR5PtbJFR2kWVki3PaKRT08EtY+ -XTIvAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUZ5Dw1t61 -GNVGKX5cq/ieCLxklRAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG -OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfYnJfcm9vdF9jYV8y -XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQA097N3U9swFrktpSHxQCF16+tI -FoE9c+CeJyrrd6kTpGoKWloUMz1oH4Guaf2Mn2VsNELZLdB/eBaxOqwjMa1ef67n -riv6uvw8l5VAk1/DLQOj7aRvU9f6QA4w9QAgLABMjDu0ox+2v5Eyq6+SmNMW5tTR -VFxDWy6u71cqqLRvpO8NVhTaIasgdp4D/Ca4nj8+AybmTNudX0KEPUUDAxxZiMrc -LmEkWqTqJwtzEr5SswrPMhfiHocaFpVIbVrg0M8JkiZmkdijYQ6qgYF/6FKC0ULn -4B0Y+qSFNueG4A3rvNTJ1jxD8V1Jbn6Bm2m1iWKPiFLY1/4nwSPFyysCu7Ff/vtD -hQNGvl3GyiEm/9cCnnRK3PgTFbGBVzbLZVzRHTF36SXDw7IyN9XxmAnkbWOACKsG -koHU6XCPpz+y7YaMgmo1yEJagtFSGkUPFaUA8JR7ZSdXOUPPfH/mvTWze/EZTN46 -ls/pdu4D58JDUjxqgejBWoC9EV2Ta/vH5mQ/u2kc6d0li690yVRAysuTEwrt+2aS -Ecr1wPrYg1UDfNPFIkZ1cGt5SAYqgpq/5usWDiJFAbzdNpQ0qTUmiteXue4Icr80 -knCDgKs4qllo3UCkGJCy89UDyibK79XH4I9TjvAA46jtn/mtd+ArY0+ew+43u3gJ -hJ65bvspmZDogNOfJA== ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia TLS ECC Root CA O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia TLS ECC Root CA O=TrustAsia Technologies, Inc. -# Label: "TrustAsia TLS ECC Root CA" -# Serial: 310892014698942880364840003424242768478804666567 -# MD5 Fingerprint: 09:48:04:77:d2:fc:65:93:71:66:b1:11:95:4f:06:8c -# SHA1 Fingerprint: b5:ec:39:f3:a1:66:37:ae:c3:05:94:57:e2:be:11:be:b7:a1:7f:36 -# SHA256 Fingerprint: c0:07:6b:9e:f0:53:1f:b1:a6:56:d6:7c:4e:be:97:cd:5d:ba:a4:1e:f4:45:98:ac:c2:48:98:78:c9:2d:87:11 ------BEGIN CERTIFICATE----- -MIICMTCCAbegAwIBAgIUNnThTXxlE8msg1UloD5Sfi9QaMcwCgYIKoZIzj0EAwMw -WDELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs -IEluYy4xIjAgBgNVBAMTGVRydXN0QXNpYSBUTFMgRUNDIFJvb3QgQ0EwHhcNMjQw -NTE1MDU0MTU2WhcNNDQwNTE1MDU0MTU1WjBYMQswCQYDVQQGEwJDTjElMCMGA1UE -ChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAGA1UEAxMZVHJ1c3RB -c2lhIFRMUyBFQ0MgUm9vdCBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABLh/pVs/ -AT598IhtrimY4ZtcU5nb9wj/1WrgjstEpvDBjL1P1M7UiFPoXlfXTr4sP/MSpwDp -guMqWzJ8S5sUKZ74LYO1644xST0mYekdcouJtgq7nDM1D9rs3qlKH8kzsaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQULIVTu7FDzTLqnqOH/qKYqKaT6RAw -DgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMFRH18MtYYZI9HlaVQ01 -L18N9mdsd0AaRuf4aFtOJx24mH1/k78ITcTaRTChD15KeAIxAKORh/IRM4PDwYqR -OkwrULG9IpRdNYlzg8WbGf60oenUoWa2AaU2+dhoYSi3dOGiMQ== ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia TLS RSA Root CA O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia TLS RSA Root CA O=TrustAsia Technologies, Inc. -# Label: "TrustAsia TLS RSA Root CA" -# Serial: 160405846464868906657516898462547310235378010780 -# MD5 Fingerprint: 3b:9e:c3:86:0f:34:3c:6b:c5:46:c4:8e:1d:e7:19:12 -# SHA1 Fingerprint: a5:46:50:c5:62:ea:95:9a:1a:a7:04:6f:17:58:c7:29:53:3d:03:fa -# SHA256 Fingerprint: 06:c0:8d:7d:af:d8:76:97:1e:b1:12:4f:e6:7f:84:7e:c0:c7:a1:58:d3:ea:53:cb:e9:40:e2:ea:97:91:f4:c3 ------BEGIN CERTIFICATE----- -MIIFgDCCA2igAwIBAgIUHBjYz+VTPyI1RlNUJDxsR9FcSpwwDQYJKoZIhvcNAQEM -BQAwWDELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dp -ZXMsIEluYy4xIjAgBgNVBAMTGVRydXN0QXNpYSBUTFMgUlNBIFJvb3QgQ0EwHhcN -MjQwNTE1MDU0MTU3WhcNNDQwNTE1MDU0MTU2WjBYMQswCQYDVQQGEwJDTjElMCMG -A1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAGA1UEAxMZVHJ1 -c3RBc2lhIFRMUyBSU0EgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC -AgoCggIBAMMWuBtqpERz5dZO9LnPWwvB0ZqB9WOwj0PBuwhaGnrhB3YmH49pVr7+ -NmDQDIPNlOrnxS1cLwUWAp4KqC/lYCZUlviYQB2srp10Zy9U+5RjmOMmSoPGlbYJ -Q1DNDX3eRA5gEk9bNb2/mThtfWza4mhzH/kxpRkQcwUqwzIZheo0qt1CHjCNP561 -HmHVb70AcnKtEj+qpklz8oYVlQwQX1Fkzv93uMltrOXVmPGZLmzjyUT5tUMnCE32 -ft5EebuyjBza00tsLtbDeLdM1aTk2tyKjg7/D8OmYCYozza/+lcK7Fs/6TAWe8Tb -xNRkoDD75f0dcZLdKY9BWN4ArTr9PXwaqLEX8E40eFgl1oUh63kd0Nyrz2I8sMeX -i9bQn9P+PN7F4/w6g3CEIR0JwqH8uyghZVNgepBtljhb//HXeltt08lwSUq6HTrQ -UNoyIBnkiz/r1RYmNzz7dZ6wB3C4FGB33PYPXFIKvF1tjVEK2sUYyJtt3LCDs3+j -TnhMmCWr8n4uIF6CFabW2I+s5c0yhsj55NqJ4js+k8UTav/H9xj8Z7XvGCxUq0DT -bE3txci3OE9kxJRMT6DNrqXGJyV1J23G2pyOsAWZ1SgRxSHUuPzHlqtKZFlhaxP8 -S8ySpg+kUb8OWJDZgoM5pl+z+m6Ss80zDoWo8SnTq1mt1tve1CuBAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLgHkXlcBvRG/XtZylomkadFK/hT -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQwFAAOCAgEAIZtqBSBdGBanEqT3 -Rz/NyjuujsCCztxIJXgXbODgcMTWltnZ9r96nBO7U5WS/8+S4PPFJzVXqDuiGev4 -iqME3mmL5Dw8veWv0BIb5Ylrc5tvJQJLkIKvQMKtuppgJFqBTQUYo+IzeXoLH5Pt -7DlK9RME7I10nYEKqG/odv6LTytpEoYKNDbdgptvT+Bz3Ul/KD7JO6NXBNiT2Twp -2xIQaOHEibgGIOcberyxk2GaGUARtWqFVwHxtlotJnMnlvm5P1vQiJ3koP26TpUJ -g3933FEFlJ0gcXax7PqJtZwuhfG5WyRasQmr2soaB82G39tp27RIGAAtvKLEiUUj -pQ7hRGU+isFqMB3iYPg6qocJQrmBktwliJiJ8Xw18WLK7nn4GS/+X/jbh87qqA8M -pugLoDzga5SYnH+tBuYc6kIQX+ImFTw3OffXvO645e8D7r0i+yiGNFjEWn9hongP -XvPKnbwbPKfILfanIhHKA9jnZwqKDss1jjQ52MjqjZ9k4DewbNfFj8GQYSbbJIwe -SsCI3zWQzj8C9GRh3sfIB5XeMhg6j6JCQCTl1jNdfK7vsU1P1FeQNWrcrgSXSYk0 -ly4wBOeY99sLAZDBHwo/+ML+TvrbmnNzFrwFuHnYWa8G5z9nODmxfKuU4CkUpijy -323imttUQ/hHWKNddBWcwauwxzQ= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH -# Subject: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH -# Label: "D-TRUST EV Root CA 2 2023" -# Serial: 139766439402180512324132425437959641711 -# MD5 Fingerprint: 96:b4:78:09:f0:09:cb:77:eb:bb:1b:4d:6f:36:bc:b6 -# SHA1 Fingerprint: a5:5b:d8:47:6c:8f:19:f7:4c:f4:6d:6b:b6:c2:79:82:22:df:54:8b -# SHA256 Fingerprint: 8e:82:21:b2:e7:d4:00:78:36:a1:67:2f:0d:cc:29:9c:33:bc:07:d3:16:f1:32:fa:1a:20:6d:58:71:50:f1:ce ------BEGIN CERTIFICATE----- -MIIFqTCCA5GgAwIBAgIQaSYJfoBLTKCnjHhiU19abzANBgkqhkiG9w0BAQ0FADBI -MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE -LVRSVVNUIEVWIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA5MTAzM1oXDTM4MDUw -OTA5MTAzMlowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi -MCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBANiOo4mAC7JXUtypU0w3uX9jFxPvp1sjW2l1sJkK -F8GLxNuo4MwxusLyzV3pt/gdr2rElYfXR8mV2IIEUD2BCP/kPbOx1sWy/YgJ25yE -7CUXFId/MHibaljJtnMoPDT3mfd/06b4HEV8rSyMlD/YZxBTfiLNTiVR8CUkNRFe -EMbsh2aJgWi6zCudR3Mfvc2RpHJqnKIbGKBv7FD0fUDCqDDPvXPIEysQEx6Lmqg6 -lHPTGGkKSv/BAQP/eX+1SH977ugpbzZMlWGG2Pmic4ruri+W7mjNPU0oQvlFKzIb -RlUWaqZLKfm7lVa/Rh3sHZMdwGWyH6FDrlaeoLGPaxK3YG14C8qKXO0elg6DpkiV -jTujIcSuWMYAsoS0I6SWhjW42J7YrDRJmGOVxcttSEfi8i4YHtAxq9107PncjLgc -jmgjutDzUNzPZY9zOjLHfP7KgiJPvo5iR2blzYfi6NUPGJ/lBHJLRjwQ8kTCZFZx -TnXonMkmdMV9WdEKWw9t/p51HBjGGjp82A0EzM23RWV6sY+4roRIPrN6TagD4uJ+ -ARZZaBhDM7DS3LAaQzXupdqpRlyuhoFBAUp0JuyfBr/CBTdkdXgpaP3F9ev+R/nk -hbDhezGdpn9yo7nELC7MmVcOIQxFAZRl62UJxmMiCzNJkkg8/M3OsD6Onov4/knF -NXJHAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqvyREBuH -kV8Wub9PS5FeAByxMoAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG -OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfZXZfcm9vdF9jYV8y -XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQCTy6UfmRHsmg1fLBWTxj++EI14 -QvBukEdHjqOSMo1wj/Zbjb6JzkcBahsgIIlbyIIQbODnmaprxiqgYzWRaoUlrRc4 -pZt+UPJ26oUFKidBK7GB0aL2QHWpDsvxVUjY7NHss+jOFKE17MJeNRqrphYBBo7q -3C+jisosketSjl8MmxfPy3MHGcRqwnNU73xDUmPBEcrCRbH0O1P1aa4846XerOhU -t7KR/aypH/KH5BfGSah82ApB9PI+53c0BFLd6IHyTS9URZ0V4U/M5d40VxDJI3IX -cI1QcB9WbMy5/zpaT2N6w25lBx2Eof+pDGOJbbJAiDnXH3dotfyc1dZnaVuodNv8 -ifYbMvekJKZ2t0dT741Jj6m2g1qllpBFYfXeA08mD6iL8AOWsKwV0HFaanuU5nCT -2vFp4LJiTZ6P/4mdm13NRemUAiKN4DV/6PEEeXFsVIP4M7kFMhtYVRFP0OUnR3Hs -7dpn1mKmS00PaaLJvOwiS5THaJQXfuKOKD62xur1NGyfN4gHONuGcfrNlUhDbqNP -gofXNJhuS5N5YHVpD/Aa1VP6IQzCP+k/HxiMkl14p3ZnGbuy6n/pcAlWVqOwDAst -Nl7F6cTVg8uGF5csbBNvh1qvSaYd2804BC5f4ko1Di1L+KIkBI3Y4WNeApI02phh -XBxvWHZks/wCuPWdCg== ------END CERTIFICATE----- - -# Issuer: CN=SwissSign RSA TLS Root CA 2022 - 1 O=SwissSign AG -# Subject: CN=SwissSign RSA TLS Root CA 2022 - 1 O=SwissSign AG -# Label: "SwissSign RSA TLS Root CA 2022 - 1" -# Serial: 388078645722908516278762308316089881486363258315 -# MD5 Fingerprint: 16:2e:e4:19:76:81:85:ba:8e:91:58:f1:15:ef:72:39 -# SHA1 Fingerprint: 81:34:0a:be:4c:cd:ce:cc:e7:7d:cc:8a:d4:57:e2:45:a0:77:5d:ce -# SHA256 Fingerprint: 19:31:44:f4:31:e0:fd:db:74:07:17:d4:de:92:6a:57:11:33:88:4b:43:60:d3:0e:27:29:13:cb:e6:60:ce:41 ------BEGIN CERTIFICATE----- -MIIFkzCCA3ugAwIBAgIUQ/oMX04bgBhE79G0TzUfRPSA7cswDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzErMCkGA1UE -AxMiU3dpc3NTaWduIFJTQSBUTFMgUm9vdCBDQSAyMDIyIC0gMTAeFw0yMjA2MDgx -MTA4MjJaFw00NzA2MDgxMTA4MjJaMFExCzAJBgNVBAYTAkNIMRUwEwYDVQQKEwxT -d2lzc1NpZ24gQUcxKzApBgNVBAMTIlN3aXNzU2lnbiBSU0EgVExTIFJvb3QgQ0Eg -MjAyMiAtIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDLKmjiC8NX -vDVjvHClO/OMPE5Xlm7DTjak9gLKHqquuN6orx122ro10JFwB9+zBvKK8i5VUXu7 -LCTLf5ImgKO0lPaCoaTo+nUdWfMHamFk4saMla+ju45vVs9xzF6BYQ1t8qsCLqSX -5XH8irCRIFucdFJtrhUnWXjyCcplDn/L9Ovn3KlMd/YrFgSVrpxxpT8q2kFC5zyE -EPThPYxr4iuRR1VPuFa+Rd4iUU1OKNlfGUEGjw5NBuBwQCMBauTLE5tzrE0USJIt -/m2n+IdreXXhvhCxqohAWVTXz8TQm0SzOGlkjIHRI36qOTw7D59Ke4LKa2/KIj4x -0LDQKhySio/YGZxH5D4MucLNvkEM+KRHBdvBFzA4OmnczcNpI/2aDwLOEGrOyvi5 -KaM2iYauC8BPY7kGWUleDsFpswrzd34unYyzJ5jSmY0lpx+Gs6ZUcDj8fV3oT4MM -0ZPlEuRU2j7yrTrePjxF8CgPBrnh25d7mUWe3f6VWQQvdT/TromZhqwUtKiE+shd -OxtYk8EXlFXIC+OCeYSf8wCENO7cMdWP8vpPlkwGqnj73mSiI80fPsWMvDdUDrta -clXvyFu1cvh43zcgTFeRc5JzrBh3Q4IgaezprClG5QtO+DdziZaKHG29777YtvTK -wP1H8K4LWCDFyB02rpeNUIMmJCn3nTsPBQIDAQABo2MwYTAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBRvjmKLk0Ow4UD2p8P98Q+4 -DxU4pTAdBgNVHQ4EFgQUb45ii5NDsOFA9qfD/fEPuA8VOKUwDQYJKoZIhvcNAQEL -BQADggIBAKwsKUF9+lz1GpUYvyypiqkkVHX1uECry6gkUSsYP2OprphWKwVDIqO3 -10aewCoSPY6WlkDfDDOLazeROpW7OSltwAJsipQLBwJNGD77+3v1dj2b9l4wBlgz -Hqp41eZUBDqyggmNzhYzWUUo8aWjlw5DI/0LIICQ/+Mmz7hkkeUFjxOgdg3XNwwQ -iJb0Pr6VvfHDffCjw3lHC1ySFWPtUnWK50Zpy1FVCypM9fJkT6lc/2cyjlUtMoIc -gC9qkfjLvH4YoiaoLqNTKIftV+Vlek4ASltOU8liNr3CjlvrzG4ngRhZi0Rjn9UM -ZfQpZX+RLOV/fuiJz48gy20HQhFRJjKKLjpHE7iNvUcNCfAWpO2Whi4Z2L6MOuhF -LhG6rlrnub+xzI/goP+4s9GFe3lmozm1O2bYQL7Pt2eLSMkZJVX8vY3PXtpOpvJp -zv1/THfQwUY1mFwjmwJFQ5Ra3bxHrSL+ul4vkSkphnsh3m5kt8sNjzdbowhq6/Td -Ao9QAwKxuDdollDruF/UKIqlIgyKhPBZLtU30WHlQnNYKoH3dtvi4k0NX/a3vgW0 -rk4N3hY9A4GzJl5LuEsAz/+MF7psYC0nhzck5npgL7XTgwSqT0N1osGDsieYK7EO -gLrAhV5Cud+xYJHT6xh+cHiudoO+cVrQkOPKwRYlZ0rwtnu64ZzZ ------END CERTIFICATE----- - -# Issuer: CN=OISTE Server Root ECC G1 O=OISTE Foundation -# Subject: CN=OISTE Server Root ECC G1 O=OISTE Foundation -# Label: "OISTE Server Root ECC G1" -# Serial: 47819833811561661340092227008453318557 -# MD5 Fingerprint: 42:a7:d2:35:ae:02:92:db:19:76:08:de:2f:05:b4:d4 -# SHA1 Fingerprint: 3b:f6:8b:09:ae:2a:92:7b:ba:e3:8d:3f:11:95:d9:e6:44:0c:45:e2 -# SHA256 Fingerprint: ee:c9:97:c0:c3:0f:21:6f:7e:3b:8b:30:7d:2b:ae:42:41:2d:75:3f:c8:21:9d:af:d1:52:0b:25:72:85:0f:49 ------BEGIN CERTIFICATE----- -MIICNTCCAbqgAwIBAgIQI/nD1jWvjyhLH/BU6n6XnTAKBggqhkjOPQQDAzBLMQsw -CQYDVQQGEwJDSDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UEAwwY -T0lTVEUgU2VydmVyIFJvb3QgRUNDIEcxMB4XDTIzMDUzMTE0NDIyOFoXDTQ4MDUy -NDE0NDIyN1owSzELMAkGA1UEBhMCQ0gxGTAXBgNVBAoMEE9JU1RFIEZvdW5kYXRp -b24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IEVDQyBHMTB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABBcv+hK8rBjzCvRE1nZCnrPoH7d5qVi2+GXROiFPqOujvqQy -cvO2Ackr/XeFblPdreqqLiWStukhEaivtUwL85Zgmjvn6hp4LrQ95SjeHIC6XG4N -2xml4z+cKrhAS93mT6NjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBQ3 -TYhlz/w9itWj8UnATgwQb0K0nDAdBgNVHQ4EFgQUN02IZc/8PYrVo/FJwE4MEG9C -tJwwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2kAMGYCMQCpKjAd0MKfkFFR -QD6VVCHNFmb3U2wIFjnQEnx/Yxvf4zgAOdktUyBFCxxgZzFDJe0CMQCSia7pXGKD -YmH5LVerVrkR3SW+ak5KGoJr3M/TvEqzPNcum9v4KGm8ay3sMaE641c= ------END CERTIFICATE----- - -# Issuer: CN=OISTE Server Root RSA G1 O=OISTE Foundation -# Subject: CN=OISTE Server Root RSA G1 O=OISTE Foundation -# Label: " OISTE Server Root RSA G1" -# Serial: 113845518112613905024960613408179309848 -# MD5 Fingerprint: 23:a7:9e:d4:70:b8:b9:14:57:41:8a:7e:44:59:e2:68 -# SHA1 Fingerprint: f7:00:34:25:94:88:68:31:e4:34:87:3f:70:fe:86:b3:86:9f:f0:6e -# SHA256 Fingerprint: 9a:e3:62:32:a5:18:9f:fd:db:35:3d:fd:26:52:0c:01:53:95:d2:27:77:da:c5:9d:b5:7b:98:c0:89:a6:51:e6 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIQVaXZZ5Qoxu0M+ifdWwFNGDANBgkqhkiG9w0BAQwFADBL -MQswCQYDVQQGEwJDSDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UE -AwwYT0lTVEUgU2VydmVyIFJvb3QgUlNBIEcxMB4XDTIzMDUzMTE0MzcxNloXDTQ4 -MDUyNDE0MzcxNVowSzELMAkGA1UEBhMCQ0gxGTAXBgNVBAoMEE9JU1RFIEZvdW5k -YXRpb24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IFJTQSBHMTCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAKqu9KuCz/vlNwvn1ZatkOhLKdxVYOPM -vLO8LZK55KN68YG0nnJyQ98/qwsmtO57Gmn7KNByXEptaZnwYx4M0rH/1ow00O7b -rEi56rAUjtgHqSSY3ekJvqgiG1k50SeH3BzN+Puz6+mTeO0Pzjd8JnduodgsIUzk -ik/HEzxux9UTl7Ko2yRpg1bTacuCErudG/L4NPKYKyqOBGf244ehHa1uzjZ0Dl4z -O8vbUZeUapU8zhhabkvG/AePLhq5SvdkNCncpo1Q4Y2LS+VIG24ugBA/5J8bZT8R -tOpXaZ+0AOuFJJkk9SGdl6r7NH8CaxWQrbueWhl/pIzY+m0o/DjH40ytas7ZTpOS -jswMZ78LS5bOZmdTaMsXEY5Z96ycG7mOaES3GK/m5Q9l3JUJsJMStR8+lKXHiHUh -sd4JJCpM4rzsTGdHwimIuQq6+cF0zowYJmXa92/GjHtoXAvuY8BeS/FOzJ8vD+Ho -mnqT8eDI278n5mUpezbgMxVz8p1rhAhoKzYHKyfMeNhqhw5HdPSqoBNdZH702xSu -+zrkL8Fl47l6QGzwBrd7KJvX4V84c5Ss2XCTLdyEr0YconosP4EmQufU2MVshGYR -i3drVByjtdgQ8K4p92cIiBdcuJd5z+orKu5YM+Vt6SmqZQENghPsJQtdLEByFSnT -kCz3GkPVavBpAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU -8snBDw1jALvsRQ5KH7WxszbNDo0wHQYDVR0OBBYEFPLJwQ8NYwC77EUOSh+1sbM2 -zQ6NMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQwFAAOCAgEANGd5sjrG5T33 -I3K5Ce+SrScfoE4KsvXaFwyihdJ+klH9FWXXXGtkFu6KRcoMQzZENdl//nk6HOjG -5D1rd9QhEOP28yBOqb6J8xycqd+8MDoX0TJD0KqKchxRKEzdNsjkLWd9kYccnbz8 -qyiWXmFcuCIzGEgWUOrKL+mlSdx/PKQZvDatkuK59EvV6wit53j+F8Bdh3foZ3dP -AGav9LEDOr4SfEE15fSmG0eLy3n31r8Xbk5l8PjaV8GUgeV6Vg27Rn9vkf195hfk -gSe7BYhW3SCl95gtkRlpMV+bMPKZrXJAlszYd2abtNUOshD+FKrDgHGdPY3ofRRs -YWSGRqbXVMW215AWRqWFyp464+YTFrYVI8ypKVL9AMb2kI5Wj4kI3Zaq5tNqqYY1 -9tVFeEJKRvwDyF7YZvZFZSS0vod7VSCd9521Kvy5YhnLbDuv0204bKt7ph6N/Ome -/msVuduCmsuY33OhkKCgxeDoAaijFJzIwZqsFVAzje18KotzlUBDJvyBpCpfOZC3 -J8tRd/iWkx7P8nd9H0aTolkelUTFLXVksNb54Dxp6gS1HAviRkRNQzuXSXERvSS2 -wq1yVAb+axj5d9spLFKebXd7Yv0PTY6YMjAwcRLWJTXjn/hvnLXrahut6hDTlhZy -BiElxky8j3C7DOReIoMt0r7+hVu05L0= ------END CERTIFICATE----- diff --git a/venv/lib/python3.12/site-packages/certifi/core.py b/venv/lib/python3.12/site-packages/certifi/core.py deleted file mode 100644 index 1c9661cc..00000000 --- a/venv/lib/python3.12/site-packages/certifi/core.py +++ /dev/null @@ -1,83 +0,0 @@ -""" -certifi.py -~~~~~~~~~~ - -This module returns the installation location of cacert.pem or its contents. -""" -import sys -import atexit - -def exit_cacert_ctx() -> None: - _CACERT_CTX.__exit__(None, None, None) # type: ignore[union-attr] - - -if sys.version_info >= (3, 11): - - from importlib.resources import as_file, files - - _CACERT_CTX = None - _CACERT_PATH = None - - def where() -> str: - # This is slightly terrible, but we want to delay extracting the file - # in cases where we're inside of a zipimport situation until someone - # actually calls where(), but we don't want to re-extract the file - # on every call of where(), so we'll do it once then store it in a - # global variable. - global _CACERT_CTX - global _CACERT_PATH - if _CACERT_PATH is None: - # This is slightly janky, the importlib.resources API wants you to - # manage the cleanup of this file, so it doesn't actually return a - # path, it returns a context manager that will give you the path - # when you enter it and will do any cleanup when you leave it. In - # the common case of not needing a temporary file, it will just - # return the file system location and the __exit__() is a no-op. - # - # We also have to hold onto the actual context manager, because - # it will do the cleanup whenever it gets garbage collected, so - # we will also store that at the global level as well. - _CACERT_CTX = as_file(files("certifi").joinpath("cacert.pem")) - _CACERT_PATH = str(_CACERT_CTX.__enter__()) - atexit.register(exit_cacert_ctx) - - return _CACERT_PATH - - def contents() -> str: - return files("certifi").joinpath("cacert.pem").read_text(encoding="ascii") - -else: - - from importlib.resources import path as get_path, read_text - - _CACERT_CTX = None - _CACERT_PATH = None - - def where() -> str: - # This is slightly terrible, but we want to delay extracting the - # file in cases where we're inside of a zipimport situation until - # someone actually calls where(), but we don't want to re-extract - # the file on every call of where(), so we'll do it once then store - # it in a global variable. - global _CACERT_CTX - global _CACERT_PATH - if _CACERT_PATH is None: - # This is slightly janky, the importlib.resources API wants you - # to manage the cleanup of this file, so it doesn't actually - # return a path, it returns a context manager that will give - # you the path when you enter it and will do any cleanup when - # you leave it. In the common case of not needing a temporary - # file, it will just return the file system location and the - # __exit__() is a no-op. - # - # We also have to hold onto the actual context manager, because - # it will do the cleanup whenever it gets garbage collected, so - # we will also store that at the global level as well. - _CACERT_CTX = get_path("certifi", "cacert.pem") - _CACERT_PATH = str(_CACERT_CTX.__enter__()) - atexit.register(exit_cacert_ctx) - - return _CACERT_PATH - - def contents() -> str: - return read_text("certifi", "cacert.pem", encoding="ascii") diff --git a/venv/lib/python3.12/site-packages/certifi/py.typed b/venv/lib/python3.12/site-packages/certifi/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/METADATA b/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/METADATA deleted file mode 100644 index 8d32edcc..00000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/METADATA +++ /dev/null @@ -1,764 +0,0 @@ -Metadata-Version: 2.4 -Name: charset-normalizer -Version: 3.4.4 -Summary: The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. -Author-email: "Ahmed R. TAHRI" -Maintainer-email: "Ahmed R. TAHRI" -License: MIT -Project-URL: Changelog, https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md -Project-URL: Documentation, https://charset-normalizer.readthedocs.io/ -Project-URL: Code, https://github.com/jawah/charset_normalizer -Project-URL: Issue tracker, https://github.com/jawah/charset_normalizer/issues -Keywords: encoding,charset,charset-detector,detector,normalization,unicode,chardet,detect -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3.14 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Text Processing :: Linguistic -Classifier: Topic :: Utilities -Classifier: Typing :: Typed -Requires-Python: >=3.7 -Description-Content-Type: text/markdown -License-File: LICENSE -Provides-Extra: unicode-backport -Dynamic: license-file - -

Charset Detection, for Everyone 👋

- -

- The Real First Universal Charset Detector
-
- - - - Download Count Total - - - - -

-

- Featured Packages
- - Static Badge - - - Static Badge - -

-

- In other language (unofficial port - by the community)
- - Static Badge - -

- -> A library that helps you read text from an unknown charset encoding.
Motivated by `chardet`, -> I'm trying to resolve the issue by taking a new approach. -> All IANA character set names for which the Python core library provides codecs are supported. - -

- >>>>> 👉 Try Me Online Now, Then Adopt Me 👈 <<<<< -

- -This project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**. - -| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) | -|--------------------------------------------------|:---------------------------------------------:|:--------------------------------------------------------------------------------------------------:|:-----------------------------------------------:| -| `Fast` | ❌ | ✅ | ✅ | -| `Universal**` | ❌ | ✅ | ❌ | -| `Reliable` **without** distinguishable standards | ❌ | ✅ | ✅ | -| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ | -| `License` | LGPL-2.1
_restrictive_ | MIT | MPL-1.1
_restrictive_ | -| `Native Python` | ✅ | ✅ | ❌ | -| `Detect spoken language` | ❌ | ✅ | N/A | -| `UnicodeDecodeError Safety` | ❌ | ✅ | ❌ | -| `Whl Size (min)` | 193.6 kB | 42 kB | ~200 kB | -| `Supported Encoding` | 33 | 🎉 [99](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) | 40 | - -

-Reading Normalized TextCat Reading Text -

- -*\*\* : They are clearly using specific code for a specific encoding even if covering most of used one*
- -## ⚡ Performance - -This package offer better performance than its counterpart Chardet. Here are some numbers. - -| Package | Accuracy | Mean per file (ms) | File per sec (est) | -|-----------------------------------------------|:--------:|:------------------:|:------------------:| -| [chardet](https://github.com/chardet/chardet) | 86 % | 63 ms | 16 file/sec | -| charset-normalizer | **98 %** | **10 ms** | 100 file/sec | - -| Package | 99th percentile | 95th percentile | 50th percentile | -|-----------------------------------------------|:---------------:|:---------------:|:---------------:| -| [chardet](https://github.com/chardet/chardet) | 265 ms | 71 ms | 7 ms | -| charset-normalizer | 100 ms | 50 ms | 5 ms | - -_updated as of december 2024 using CPython 3.12_ - -Chardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload. - -> Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows. -> And yes, these results might change at any time. The dataset can be updated to include more files. -> The actual delays heavily depends on your CPU capabilities. The factors should remain the same. -> Keep in mind that the stats are generous and that Chardet accuracy vs our is measured using Chardet initial capability -> (e.g. Supported Encoding) Challenge-them if you want. - -## ✨ Installation - -Using pip: - -```sh -pip install charset-normalizer -U -``` - -## 🚀 Basic Usage - -### CLI -This package comes with a CLI. - -``` -usage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD] - file [file ...] - -The Real First Universal Charset Detector. Discover originating encoding used -on text file. Normalize text to unicode. - -positional arguments: - files File(s) to be analysed - -optional arguments: - -h, --help show this help message and exit - -v, --verbose Display complementary information about file if any. - Stdout will contain logs about the detection process. - -a, --with-alternative - Output complementary possibilities if any. Top-level - JSON WILL be a list. - -n, --normalize Permit to normalize input file. If not set, program - does not write anything. - -m, --minimal Only output the charset detected to STDOUT. Disabling - JSON output. - -r, --replace Replace file when trying to normalize it instead of - creating a new one. - -f, --force Replace file without asking if you are sure, use this - flag with caution. - -t THRESHOLD, --threshold THRESHOLD - Define a custom maximum amount of chaos allowed in - decoded content. 0. <= chaos <= 1. - --version Show version information and exit. -``` - -```bash -normalizer ./data/sample.1.fr.srt -``` - -or - -```bash -python -m charset_normalizer ./data/sample.1.fr.srt -``` - -🎉 Since version 1.4.0 the CLI produce easily usable stdout result in JSON format. - -```json -{ - "path": "/home/default/projects/charset_normalizer/data/sample.1.fr.srt", - "encoding": "cp1252", - "encoding_aliases": [ - "1252", - "windows_1252" - ], - "alternative_encodings": [ - "cp1254", - "cp1256", - "cp1258", - "iso8859_14", - "iso8859_15", - "iso8859_16", - "iso8859_3", - "iso8859_9", - "latin_1", - "mbcs" - ], - "language": "French", - "alphabets": [ - "Basic Latin", - "Latin-1 Supplement" - ], - "has_sig_or_bom": false, - "chaos": 0.149, - "coherence": 97.152, - "unicode_path": null, - "is_preferred": true -} -``` - -### Python -*Just print out normalized text* -```python -from charset_normalizer import from_path - -results = from_path('./my_subtitle.srt') - -print(str(results.best())) -``` - -*Upgrade your code without effort* -```python -from charset_normalizer import detect -``` - -The above code will behave the same as **chardet**. We ensure that we offer the best (reasonable) BC result possible. - -See the docs for advanced usage : [readthedocs.io](https://charset-normalizer.readthedocs.io/en/latest/) - -## 😇 Why - -When I started using Chardet, I noticed that it was not suited to my expectations, and I wanted to propose a -reliable alternative using a completely different method. Also! I never back down on a good challenge! - -I **don't care** about the **originating charset** encoding, because **two different tables** can -produce **two identical rendered string.** -What I want is to get readable text, the best I can. - -In a way, **I'm brute forcing text decoding.** How cool is that ? 😎 - -Don't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair Unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode. - -## 🍰 How - - - Discard all charset encoding table that could not fit the binary content. - - Measure noise, or the mess once opened (by chunks) with a corresponding charset encoding. - - Extract matches with the lowest mess detected. - - Additionally, we measure coherence / probe for a language. - -**Wait a minute**, what is noise/mess and coherence according to **YOU ?** - -*Noise :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then -**I established** some ground rules about **what is obvious** when **it seems like** a mess (aka. defining noise in rendered text). - I know that my interpretation of what is noise is probably incomplete, feel free to contribute in order to - improve or rewrite it. - -*Coherence :* For each language there is on earth, we have computed ranked letter appearance occurrences (the best we can). So I thought -that intel is worth something here. So I use those records against decoded text to check if I can detect intelligent design. - -## ⚡ Known limitations - - - Language detection is unreliable when text contains two or more languages sharing identical letters. (eg. HTML (english tags) + Turkish content (Sharing Latin characters)) - - Every charset detector heavily depends on sufficient content. In common cases, do not bother run detection on very tiny content. - -## ⚠️ About Python EOLs - -**If you are running:** - -- Python >=2.7,<3.5: Unsupported -- Python 3.5: charset-normalizer < 2.1 -- Python 3.6: charset-normalizer < 3.1 -- Python 3.7: charset-normalizer < 4.0 - -Upgrade your Python interpreter as soon as possible. - -## 👤 Contributing - -Contributions, issues and feature requests are very much welcome.
-Feel free to check [issues page](https://github.com/ousret/charset_normalizer/issues) if you want to contribute. - -## 📝 License - -Copyright © [Ahmed TAHRI @Ousret](https://github.com/Ousret).
-This project is [MIT](https://github.com/Ousret/charset_normalizer/blob/master/LICENSE) licensed. - -Characters frequencies used in this project © 2012 [Denny Vrandečić](http://simia.net/letters/) - -## 💼 For Enterprise - -Professional support for charset-normalizer is available as part of the [Tidelift -Subscription][1]. 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. - -[1]: https://tidelift.com/subscription/pkg/pypi-charset-normalizer?utm_source=pypi-charset-normalizer&utm_medium=readme - -[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/7297/badge)](https://www.bestpractices.dev/projects/7297) - -# Changelog -All notable changes to charset-normalizer will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - -## [3.4.4](https://github.com/Ousret/charset_normalizer/compare/3.4.2...3.4.4) (2025-10-13) - -### Changed -- Bound `setuptools` to a specific constraint `setuptools>=68,<=81`. -- Raised upper bound of mypyc for the optional pre-built extension to v1.18.2 - -### Removed -- `setuptools-scm` as a build dependency. - -### Misc -- Enforced hashes in `dev-requirements.txt` and created `ci-requirements.txt` for security purposes. -- Additional pre-built wheels for riscv64, s390x, and armv7l architectures. -- Restore ` multiple.intoto.jsonl` in GitHub releases in addition to individual attestation file per wheel. - -## [3.4.3](https://github.com/Ousret/charset_normalizer/compare/3.4.2...3.4.3) (2025-08-09) - -### Changed -- mypy(c) is no longer a required dependency at build time if `CHARSET_NORMALIZER_USE_MYPYC` isn't set to `1`. (#595) (#583) -- automatically lower confidence on small bytes samples that are not Unicode in `detect` output legacy function. (#391) - -### Added -- Custom build backend to overcome inability to mark mypy as an optional dependency in the build phase. -- Support for Python 3.14 - -### Fixed -- sdist archive contained useless directories. -- automatically fallback on valid UTF-16 or UTF-32 even if the md says it's noisy. (#633) - -### Misc -- SBOM are automatically published to the relevant GitHub release to comply with regulatory changes. - Each published wheel comes with its SBOM. We choose CycloneDX as the format. -- Prebuilt optimized wheel are no longer distributed by default for CPython 3.7 due to a change in cibuildwheel. - -## [3.4.2](https://github.com/Ousret/charset_normalizer/compare/3.4.1...3.4.2) (2025-05-02) - -### Fixed -- Addressed the DeprecationWarning in our CLI regarding `argparse.FileType` by backporting the target class into the package. (#591) -- Improved the overall reliability of the detector with CJK Ideographs. (#605) (#587) - -### Changed -- Optional mypyc compilation upgraded to version 1.15 for Python >= 3.8 - -## [3.4.1](https://github.com/Ousret/charset_normalizer/compare/3.4.0...3.4.1) (2024-12-24) - -### Changed -- Project metadata are now stored using `pyproject.toml` instead of `setup.cfg` using setuptools as the build backend. -- Enforce annotation delayed loading for a simpler and consistent types in the project. -- Optional mypyc compilation upgraded to version 1.14 for Python >= 3.8 - -### Added -- pre-commit configuration. -- noxfile. - -### Removed -- `build-requirements.txt` as per using `pyproject.toml` native build configuration. -- `bin/integration.py` and `bin/serve.py` in favor of downstream integration test (see noxfile). -- `setup.cfg` in favor of `pyproject.toml` metadata configuration. -- Unused `utils.range_scan` function. - -### Fixed -- Converting content to Unicode bytes may insert `utf_8` instead of preferred `utf-8`. (#572) -- Deprecation warning "'count' is passed as positional argument" when converting to Unicode bytes on Python 3.13+ - -## [3.4.0](https://github.com/Ousret/charset_normalizer/compare/3.3.2...3.4.0) (2024-10-08) - -### Added -- Argument `--no-preemptive` in the CLI to prevent the detector to search for hints. -- Support for Python 3.13 (#512) - -### Fixed -- Relax the TypeError exception thrown when trying to compare a CharsetMatch with anything else than a CharsetMatch. -- Improved the general reliability of the detector based on user feedbacks. (#520) (#509) (#498) (#407) (#537) -- Declared charset in content (preemptive detection) not changed when converting to utf-8 bytes. (#381) - -## [3.3.2](https://github.com/Ousret/charset_normalizer/compare/3.3.1...3.3.2) (2023-10-31) - -### Fixed -- Unintentional memory usage regression when using large payload that match several encoding (#376) -- Regression on some detection case showcased in the documentation (#371) - -### Added -- Noise (md) probe that identify malformed arabic representation due to the presence of letters in isolated form (credit to my wife) - -## [3.3.1](https://github.com/Ousret/charset_normalizer/compare/3.3.0...3.3.1) (2023-10-22) - -### Changed -- Optional mypyc compilation upgraded to version 1.6.1 for Python >= 3.8 -- Improved the general detection reliability based on reports from the community - -## [3.3.0](https://github.com/Ousret/charset_normalizer/compare/3.2.0...3.3.0) (2023-09-30) - -### Added -- Allow to execute the CLI (e.g. normalizer) through `python -m charset_normalizer.cli` or `python -m charset_normalizer` -- Support for 9 forgotten encoding that are supported by Python but unlisted in `encoding.aliases` as they have no alias (#323) - -### Removed -- (internal) Redundant utils.is_ascii function and unused function is_private_use_only -- (internal) charset_normalizer.assets is moved inside charset_normalizer.constant - -### Changed -- (internal) Unicode code blocks in constants are updated using the latest v15.0.0 definition to improve detection -- Optional mypyc compilation upgraded to version 1.5.1 for Python >= 3.8 - -### Fixed -- Unable to properly sort CharsetMatch when both chaos/noise and coherence were close due to an unreachable condition in \_\_lt\_\_ (#350) - -## [3.2.0](https://github.com/Ousret/charset_normalizer/compare/3.1.0...3.2.0) (2023-06-07) - -### Changed -- Typehint for function `from_path` no longer enforce `PathLike` as its first argument -- Minor improvement over the global detection reliability - -### Added -- Introduce function `is_binary` that relies on main capabilities, and optimized to detect binaries -- Propagate `enable_fallback` argument throughout `from_bytes`, `from_path`, and `from_fp` that allow a deeper control over the detection (default True) -- Explicit support for Python 3.12 - -### Fixed -- Edge case detection failure where a file would contain 'very-long' camel cased word (Issue #289) - -## [3.1.0](https://github.com/Ousret/charset_normalizer/compare/3.0.1...3.1.0) (2023-03-06) - -### Added -- Argument `should_rename_legacy` for legacy function `detect` and disregard any new arguments without errors (PR #262) - -### Removed -- Support for Python 3.6 (PR #260) - -### Changed -- Optional speedup provided by mypy/c 1.0.1 - -## [3.0.1](https://github.com/Ousret/charset_normalizer/compare/3.0.0...3.0.1) (2022-11-18) - -### Fixed -- Multi-bytes cutter/chunk generator did not always cut correctly (PR #233) - -### Changed -- Speedup provided by mypy/c 0.990 on Python >= 3.7 - -## [3.0.0](https://github.com/Ousret/charset_normalizer/compare/2.1.1...3.0.0) (2022-10-20) - -### Added -- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results -- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES -- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio -- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl) - -### Changed -- Build with static metadata using 'build' frontend -- Make the language detection stricter -- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1 - -### Fixed -- CLI with opt --normalize fail when using full path for files -- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it -- Sphinx warnings when generating the documentation - -### Removed -- Coherence detector no longer return 'Simple English' instead return 'English' -- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese' -- Breaking: Method `first()` and `best()` from CharsetMatch -- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII) -- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches -- Breaking: Top-level function `normalize` -- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch -- Support for the backport `unicodedata2` - -## [3.0.0rc1](https://github.com/Ousret/charset_normalizer/compare/3.0.0b2...3.0.0rc1) (2022-10-18) - -### Added -- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results -- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES -- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio - -### Changed -- Build with static metadata using 'build' frontend -- Make the language detection stricter - -### Fixed -- CLI with opt --normalize fail when using full path for files -- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it - -### Removed -- Coherence detector no longer return 'Simple English' instead return 'English' -- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese' - -## [3.0.0b2](https://github.com/Ousret/charset_normalizer/compare/3.0.0b1...3.0.0b2) (2022-08-21) - -### Added -- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl) - -### Removed -- Breaking: Method `first()` and `best()` from CharsetMatch -- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII) - -### Fixed -- Sphinx warnings when generating the documentation - -## [3.0.0b1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...3.0.0b1) (2022-08-15) - -### Changed -- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1 - -### Removed -- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches -- Breaking: Top-level function `normalize` -- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch -- Support for the backport `unicodedata2` - -## [2.1.1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...2.1.1) (2022-08-19) - -### Deprecated -- Function `normalize` scheduled for removal in 3.0 - -### Changed -- Removed useless call to decode in fn is_unprintable (#206) - -### Fixed -- Third-party library (i18n xgettext) crashing not recognizing utf_8 (PEP 263) with underscore from [@aleksandernovikov](https://github.com/aleksandernovikov) (#204) - -## [2.1.0](https://github.com/Ousret/charset_normalizer/compare/2.0.12...2.1.0) (2022-06-19) - -### Added -- Output the Unicode table version when running the CLI with `--version` (PR #194) - -### Changed -- Re-use decoded buffer for single byte character sets from [@nijel](https://github.com/nijel) (PR #175) -- Fixing some performance bottlenecks from [@deedy5](https://github.com/deedy5) (PR #183) - -### Fixed -- Workaround potential bug in cpython with Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space (PR #175) -- CLI default threshold aligned with the API threshold from [@oleksandr-kuzmenko](https://github.com/oleksandr-kuzmenko) (PR #181) - -### Removed -- Support for Python 3.5 (PR #192) - -### Deprecated -- Use of backport unicodedata from `unicodedata2` as Python is quickly catching up, scheduled for removal in 3.0 (PR #194) - -## [2.0.12](https://github.com/Ousret/charset_normalizer/compare/2.0.11...2.0.12) (2022-02-12) - -### Fixed -- ASCII miss-detection on rare cases (PR #170) - -## [2.0.11](https://github.com/Ousret/charset_normalizer/compare/2.0.10...2.0.11) (2022-01-30) - -### Added -- Explicit support for Python 3.11 (PR #164) - -### Changed -- The logging behavior have been completely reviewed, now using only TRACE and DEBUG levels (PR #163 #165) - -## [2.0.10](https://github.com/Ousret/charset_normalizer/compare/2.0.9...2.0.10) (2022-01-04) - -### Fixed -- Fallback match entries might lead to UnicodeDecodeError for large bytes sequence (PR #154) - -### Changed -- Skipping the language-detection (CD) on ASCII (PR #155) - -## [2.0.9](https://github.com/Ousret/charset_normalizer/compare/2.0.8...2.0.9) (2021-12-03) - -### Changed -- Moderating the logging impact (since 2.0.8) for specific environments (PR #147) - -### Fixed -- Wrong logging level applied when setting kwarg `explain` to True (PR #146) - -## [2.0.8](https://github.com/Ousret/charset_normalizer/compare/2.0.7...2.0.8) (2021-11-24) -### Changed -- Improvement over Vietnamese detection (PR #126) -- MD improvement on trailing data and long foreign (non-pure latin) data (PR #124) -- Efficiency improvements in cd/alphabet_languages from [@adbar](https://github.com/adbar) (PR #122) -- call sum() without an intermediary list following PEP 289 recommendations from [@adbar](https://github.com/adbar) (PR #129) -- Code style as refactored by Sourcery-AI (PR #131) -- Minor adjustment on the MD around european words (PR #133) -- Remove and replace SRTs from assets / tests (PR #139) -- Initialize the library logger with a `NullHandler` by default from [@nmaynes](https://github.com/nmaynes) (PR #135) -- Setting kwarg `explain` to True will add provisionally (bounded to function lifespan) a specific stream handler (PR #135) - -### Fixed -- Fix large (misleading) sequence giving UnicodeDecodeError (PR #137) -- Avoid using too insignificant chunk (PR #137) - -### Added -- Add and expose function `set_logging_handler` to configure a specific StreamHandler from [@nmaynes](https://github.com/nmaynes) (PR #135) -- Add `CHANGELOG.md` entries, format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) (PR #141) - -## [2.0.7](https://github.com/Ousret/charset_normalizer/compare/2.0.6...2.0.7) (2021-10-11) -### Added -- Add support for Kazakh (Cyrillic) language detection (PR #109) - -### Changed -- Further, improve inferring the language from a given single-byte code page (PR #112) -- Vainly trying to leverage PEP263 when PEP3120 is not supported (PR #116) -- Refactoring for potential performance improvements in loops from [@adbar](https://github.com/adbar) (PR #113) -- Various detection improvement (MD+CD) (PR #117) - -### Removed -- Remove redundant logging entry about detected language(s) (PR #115) - -### Fixed -- Fix a minor inconsistency between Python 3.5 and other versions regarding language detection (PR #117 #102) - -## [2.0.6](https://github.com/Ousret/charset_normalizer/compare/2.0.5...2.0.6) (2021-09-18) -### Fixed -- Unforeseen regression with the loss of the backward-compatibility with some older minor of Python 3.5.x (PR #100) -- Fix CLI crash when using --minimal output in certain cases (PR #103) - -### Changed -- Minor improvement to the detection efficiency (less than 1%) (PR #106 #101) - -## [2.0.5](https://github.com/Ousret/charset_normalizer/compare/2.0.4...2.0.5) (2021-09-14) -### Changed -- The project now comply with: flake8, mypy, isort and black to ensure a better overall quality (PR #81) -- The BC-support with v1.x was improved, the old staticmethods are restored (PR #82) -- The Unicode detection is slightly improved (PR #93) -- Add syntax sugar \_\_bool\_\_ for results CharsetMatches list-container (PR #91) - -### Removed -- The project no longer raise warning on tiny content given for detection, will be simply logged as warning instead (PR #92) - -### Fixed -- In some rare case, the chunks extractor could cut in the middle of a multi-byte character and could mislead the mess detection (PR #95) -- Some rare 'space' characters could trip up the UnprintablePlugin/Mess detection (PR #96) -- The MANIFEST.in was not exhaustive (PR #78) - -## [2.0.4](https://github.com/Ousret/charset_normalizer/compare/2.0.3...2.0.4) (2021-07-30) -### Fixed -- The CLI no longer raise an unexpected exception when no encoding has been found (PR #70) -- Fix accessing the 'alphabets' property when the payload contains surrogate characters (PR #68) -- The logger could mislead (explain=True) on detected languages and the impact of one MBCS match (PR #72) -- Submatch factoring could be wrong in rare edge cases (PR #72) -- Multiple files given to the CLI were ignored when publishing results to STDOUT. (After the first path) (PR #72) -- Fix line endings from CRLF to LF for certain project files (PR #67) - -### Changed -- Adjust the MD to lower the sensitivity, thus improving the global detection reliability (PR #69 #76) -- Allow fallback on specified encoding if any (PR #71) - -## [2.0.3](https://github.com/Ousret/charset_normalizer/compare/2.0.2...2.0.3) (2021-07-16) -### Changed -- Part of the detection mechanism has been improved to be less sensitive, resulting in more accurate detection results. Especially ASCII. (PR #63) -- According to the community wishes, the detection will fall back on ASCII or UTF-8 in a last-resort case. (PR #64) - -## [2.0.2](https://github.com/Ousret/charset_normalizer/compare/2.0.1...2.0.2) (2021-07-15) -### Fixed -- Empty/Too small JSON payload miss-detection fixed. Report from [@tseaver](https://github.com/tseaver) (PR #59) - -### Changed -- Don't inject unicodedata2 into sys.modules from [@akx](https://github.com/akx) (PR #57) - -## [2.0.1](https://github.com/Ousret/charset_normalizer/compare/2.0.0...2.0.1) (2021-07-13) -### Fixed -- Make it work where there isn't a filesystem available, dropping assets frequencies.json. Report from [@sethmlarson](https://github.com/sethmlarson). (PR #55) -- Using explain=False permanently disable the verbose output in the current runtime (PR #47) -- One log entry (language target preemptive) was not show in logs when using explain=True (PR #47) -- Fix undesired exception (ValueError) on getitem of instance CharsetMatches (PR #52) - -### Changed -- Public function normalize default args values were not aligned with from_bytes (PR #53) - -### Added -- You may now use charset aliases in cp_isolation and cp_exclusion arguments (PR #47) - -## [2.0.0](https://github.com/Ousret/charset_normalizer/compare/1.4.1...2.0.0) (2021-07-02) -### Changed -- 4x to 5 times faster than the previous 1.4.0 release. At least 2x faster than Chardet. -- Accent has been made on UTF-8 detection, should perform rather instantaneous. -- The backward compatibility with Chardet has been greatly improved. The legacy detect function returns an identical charset name whenever possible. -- The detection mechanism has been slightly improved, now Turkish content is detected correctly (most of the time) -- The program has been rewritten to ease the readability and maintainability. (+Using static typing)+ -- utf_7 detection has been reinstated. - -### Removed -- This package no longer require anything when used with Python 3.5 (Dropped cached_property) -- Removed support for these languages: Catalan, Esperanto, Kazakh, Baque, Volapük, Azeri, Galician, Nynorsk, Macedonian, and Serbocroatian. -- The exception hook on UnicodeDecodeError has been removed. - -### Deprecated -- Methods coherence_non_latin, w_counter, chaos_secondary_pass of the class CharsetMatch are now deprecated and scheduled for removal in v3.0 - -### Fixed -- The CLI output used the relative path of the file(s). Should be absolute. - -## [1.4.1](https://github.com/Ousret/charset_normalizer/compare/1.4.0...1.4.1) (2021-05-28) -### Fixed -- Logger configuration/usage no longer conflict with others (PR #44) - -## [1.4.0](https://github.com/Ousret/charset_normalizer/compare/1.3.9...1.4.0) (2021-05-21) -### Removed -- Using standard logging instead of using the package loguru. -- Dropping nose test framework in favor of the maintained pytest. -- Choose to not use dragonmapper package to help with gibberish Chinese/CJK text. -- Require cached_property only for Python 3.5 due to constraint. Dropping for every other interpreter version. -- Stop support for UTF-7 that does not contain a SIG. -- Dropping PrettyTable, replaced with pure JSON output in CLI. - -### Fixed -- BOM marker in a CharsetNormalizerMatch instance could be False in rare cases even if obviously present. Due to the sub-match factoring process. -- Not searching properly for the BOM when trying utf32/16 parent codec. - -### Changed -- Improving the package final size by compressing frequencies.json. -- Huge improvement over the larges payload. - -### Added -- CLI now produces JSON consumable output. -- Return ASCII if given sequences fit. Given reasonable confidence. - -## [1.3.9](https://github.com/Ousret/charset_normalizer/compare/1.3.8...1.3.9) (2021-05-13) - -### Fixed -- In some very rare cases, you may end up getting encode/decode errors due to a bad bytes payload (PR #40) - -## [1.3.8](https://github.com/Ousret/charset_normalizer/compare/1.3.7...1.3.8) (2021-05-12) - -### Fixed -- Empty given payload for detection may cause an exception if trying to access the `alphabets` property. (PR #39) - -## [1.3.7](https://github.com/Ousret/charset_normalizer/compare/1.3.6...1.3.7) (2021-05-12) - -### Fixed -- The legacy detect function should return UTF-8-SIG if sig is present in the payload. (PR #38) - -## [1.3.6](https://github.com/Ousret/charset_normalizer/compare/1.3.5...1.3.6) (2021-02-09) - -### Changed -- Amend the previous release to allow prettytable 2.0 (PR #35) - -## [1.3.5](https://github.com/Ousret/charset_normalizer/compare/1.3.4...1.3.5) (2021-02-08) - -### Fixed -- Fix error while using the package with a python pre-release interpreter (PR #33) - -### Changed -- Dependencies refactoring, constraints revised. - -### Added -- Add python 3.9 and 3.10 to the supported interpreters - -MIT License - -Copyright (c) 2025 TAHRI Ahmed R. - -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.12/site-packages/charset_normalizer-3.4.4.dist-info/RECORD b/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/RECORD deleted file mode 100644 index 5b271d28..00000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/RECORD +++ /dev/null @@ -1,35 +0,0 @@ -../../../bin/normalizer,sha256=Q0vpl-AcLfGWDjwvR4IFxmRZalHvsi_OqVtI-9A7TzM,262 -charset_normalizer-3.4.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -charset_normalizer-3.4.4.dist-info/METADATA,sha256=jVuUFBti8dav19YLvWissTihVdF2ozUY4KKMw7jdkBQ,37303 -charset_normalizer-3.4.4.dist-info/RECORD,, -charset_normalizer-3.4.4.dist-info/WHEEL,sha256=DxRnWQz-Kp9-4a4hdDHsSv0KUC3H7sN9Nbef3-8RjXU,190 -charset_normalizer-3.4.4.dist-info/entry_points.txt,sha256=ADSTKrkXZ3hhdOVFi6DcUEHQRS0xfxDIE_pEz4wLIXA,65 -charset_normalizer-3.4.4.dist-info/licenses/LICENSE,sha256=bQ1Bv-FwrGx9wkjJpj4lTQ-0WmDVCoJX0K-SxuJJuIc,1071 -charset_normalizer-3.4.4.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19 -charset_normalizer/__init__.py,sha256=OKRxRv2Zhnqk00tqkN0c1BtJjm165fWXLydE52IKuHc,1590 -charset_normalizer/__main__.py,sha256=yzYxMR-IhKRHYwcSlavEv8oGdwxsR89mr2X09qXGdps,109 -charset_normalizer/__pycache__/__init__.cpython-312.pyc,, -charset_normalizer/__pycache__/__main__.cpython-312.pyc,, -charset_normalizer/__pycache__/api.cpython-312.pyc,, -charset_normalizer/__pycache__/cd.cpython-312.pyc,, -charset_normalizer/__pycache__/constant.cpython-312.pyc,, -charset_normalizer/__pycache__/legacy.cpython-312.pyc,, -charset_normalizer/__pycache__/md.cpython-312.pyc,, -charset_normalizer/__pycache__/models.cpython-312.pyc,, -charset_normalizer/__pycache__/utils.cpython-312.pyc,, -charset_normalizer/__pycache__/version.cpython-312.pyc,, -charset_normalizer/api.py,sha256=V07i8aVeCD8T2fSia3C-fn0i9t8qQguEBhsqszg32Ns,22668 -charset_normalizer/cd.py,sha256=WKTo1HDb-H9HfCDc3Bfwq5jzS25Ziy9SE2a74SgTq88,12522 -charset_normalizer/cli/__init__.py,sha256=D8I86lFk2-py45JvqxniTirSj_sFyE6sjaY_0-G1shc,136 -charset_normalizer/cli/__main__.py,sha256=dMaXG6IJXRvqq8z2tig7Qb83-BpWTln55ooiku5_uvg,12646 -charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc,, -charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc,, -charset_normalizer/constant.py,sha256=7UVY4ldYhmQMHUdgQ_sgZmzcQ0xxYxpBunqSZ-XJZ8U,42713 -charset_normalizer/legacy.py,sha256=sYBzSpzsRrg_wF4LP536pG64BItw7Tqtc3SMQAHvFLM,2731 -charset_normalizer/md.cpython-312-x86_64-linux-gnu.so,sha256=sZ7umtJLjKfA83NFJ7npkiDyr06zDT8cWtl6uIx2MsM,15912 -charset_normalizer/md.py,sha256=-_oN3h3_X99nkFfqamD3yu45DC_wfk5odH0Tr_CQiXs,20145 -charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so,sha256=J2WWgLBQiO8sqdFsENp9u5V9uEH0tTwvTLszPdqhsv0,290584 -charset_normalizer/models.py,sha256=lKXhOnIPtiakbK3i__J9wpOfzx3JDTKj7Dn3Rg0VaRI,12394 -charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -charset_normalizer/utils.py,sha256=sTejPgrdlNsKNucZfJCxJ95lMTLA0ShHLLE3n5wpT9Q,12170 -charset_normalizer/version.py,sha256=nKE4qBNk5WA4LIJ_yIH_aSDfvtsyizkWMg-PUG-UZVk,115 diff --git a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/WHEEL b/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/WHEEL deleted file mode 100644 index f3e8a970..00000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/WHEEL +++ /dev/null @@ -1,7 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (80.9.0) -Root-Is-Purelib: false -Tag: cp312-cp312-manylinux_2_17_x86_64 -Tag: cp312-cp312-manylinux2014_x86_64 -Tag: cp312-cp312-manylinux_2_28_x86_64 - diff --git a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/entry_points.txt b/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/entry_points.txt deleted file mode 100644 index 65619e73..00000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[console_scripts] -normalizer = charset_normalizer.cli:cli_detect diff --git a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/licenses/LICENSE b/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/licenses/LICENSE deleted file mode 100644 index 9725772c..00000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/licenses/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2025 TAHRI Ahmed R. - -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.12/site-packages/charset_normalizer-3.4.4.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/top_level.txt deleted file mode 100644 index 66958f0a..00000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -charset_normalizer diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__init__.py b/venv/lib/python3.12/site-packages/charset_normalizer/__init__.py deleted file mode 100644 index 0d3a3799..00000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/__init__.py +++ /dev/null @@ -1,48 +0,0 @@ -""" -Charset-Normalizer -~~~~~~~~~~~~~~ -The Real First Universal Charset Detector. -A library that helps you read text from an unknown charset encoding. -Motivated by chardet, This package is trying to resolve the issue by taking a new approach. -All IANA character set names for which the Python core library provides codecs are supported. - -Basic usage: - >>> from charset_normalizer import from_bytes - >>> results = from_bytes('Bсеки човек има право на образование. Oбразованието!'.encode('utf_8')) - >>> best_guess = results.best() - >>> str(best_guess) - 'Bсеки човек има право на образование. Oбразованието!' - -Others methods and usages are available - see the full documentation -at . -:copyright: (c) 2021 by Ahmed TAHRI -:license: MIT, see LICENSE for more details. -""" - -from __future__ import annotations - -import logging - -from .api import from_bytes, from_fp, from_path, is_binary -from .legacy import detect -from .models import CharsetMatch, CharsetMatches -from .utils import set_logging_handler -from .version import VERSION, __version__ - -__all__ = ( - "from_fp", - "from_path", - "from_bytes", - "is_binary", - "detect", - "CharsetMatch", - "CharsetMatches", - "__version__", - "VERSION", - "set_logging_handler", -) - -# Attach a NullHandler to the top level logger by default -# https://docs.python.org/3.3/howto/logging.html#configuring-logging-for-a-library - -logging.getLogger("charset_normalizer").addHandler(logging.NullHandler()) diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__main__.py b/venv/lib/python3.12/site-packages/charset_normalizer/__main__.py deleted file mode 100644 index e0e76f7b..00000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/__main__.py +++ /dev/null @@ -1,6 +0,0 @@ -from __future__ import annotations - -from .cli import cli_detect - -if __name__ == "__main__": - cli_detect() diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 1d5ed6b8a68bf346794d208c523e8c5fddac0dfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1772 zcmcIkPiq@T6rYu3$y(V?Z66AS(kX@5YHe*|Lt8{@a8er^V!1d@4+~`(?T)o;&;DU% zRj=4=7c z;{N;)$ms9X9%{L?|ItW0e6>^_2?`z8S zZ~pV?yDr5$lrX&RaUt>j!0S>jKpvRl !g40%Ie#msAS!h2Y{L}Hh+NZ?)=V@`>K zB|VaOkB2@c0gi)%AUq7PoyW&CutUcSIt_g*lwOxe>fm-SJ9emCz`L#|a763_(xDhw z$$M}c%Mg5vkaa19R0kra%1)94bxd$T4>5@%9unIHfQ;eI)z)g}m)MeW49Vkw_*CG% zkmEzwv)#Afin?DQOE&qL)UK;;n_GAfU&7#j8|4x z@`MLjTESJ7vF9tZ?AU7eBo#vg$R}n};Llz;o1eSg|2BD){F^> zoZ#e-{&8{wx-*>ouH>`i$4v7}cJl<3r^%xR-hPw1{~$Sgf3A_$pU%(4a?kp7u3jIa zX;UGsPE3UYG=SDn%K57+Lh||1wM_kg!`1a|Xg3$wr_dz_IuST|-Sei9F7X&?Gm00X z!TD_L#n5~wv}2zJl1MKMbePdwu9T5z8b-&HZrpCzp>J%*f>UX{-n5m5-n7H0$Gwg# zn|R)?xC^Uhl9-dZ+ez8WbQYJeyj z`ZKkhbuF!tAP93@qV-H|dA*eCYF+a2NGln?7p2vViHLO5swb?r7r@4WhcfttMXVRn ziNR`a5ox>W)T}h?ZqR&eb_%HM)A|JSVA@P;FSUP9FIb#A``|Sa{S)S}+^~;Ro~rOwh}(3^(+t;RTY}25kO5)K)0w$PbTOQSasWEl46}bcMeM(Nw?1eIS=bP1BwiX0_5kA0q98r)cVL z)I3Mc$LO6W=*DAo{RygHmTI-aape*tZRWUgfu{RtI+?kCj^-}VQXefP%j+kfTr98m Qm)FmiH~vDK{9W+;FZY5S_iflW^heRcx%h!YnFSiM56J0|K(Fx2svRAIIKa$fXzj2mS`J_fOc_ zc_0X4kuH!fm3zcYG4tNco0<2XWhsQn-Y%sM^`|47h}Hlt&jNS`4jd`aXowK-h+`FL zJj4h@%;WJPfa^sd@az9Jf+lH_d~4qE9JPIBjP=Y*YpOX~_tHX1%7qt&Z+nz#CJm+6 zdD5no-qpT#f>MWrw#7l|k`4u(VLA+6U>P{9Zpg@LL8S4jAf>Yp;ab&!skT!x5oSV^ zyd`DhN7kGUj!#G>y*MgaF=qFoBE^WgN_c9l(@e>kaAad;P&TXHxwgDk;=*O&TW7r5 h4{3oBLSJz33wz(V|1|r+JD>6Ph*tw>f&gFOqxpbH@BxZ?KP*d>D9Id4lx<4ZnqwK$M1v$mJm~I* zCDM%@*}JuoYP4l4&c>X?AKV&MqLlQZRHhQAvLE`$V^gWx0z`V)>Y^)jt*Ul3n-56h zX0rB2a?Wiu0Ljp6_ECYw?%TKTJ@?%6zW3br|8P3(6#Sh3{*Bnx-=nC%#0ULn)(VEl zhl~{U1;tamAx69xm8jdA0I5$;v-s)T96MCwd&bE0~p8p>wAI&Mi=C#(tEge_s8 zuqPZ74pMK4(+THqdTYEU;hFG|vMpYl@J@IWz6l?Bw#Vxd^%M1p zhKYtm<3wYkX`(6NpYSJ|Cz=y26Dm{DnVe5ATW&6Q@e9aH*o>jwpc;_FQC%S(4{*|EA@-Bc9_&Y-J z@@{~#r2-V+59^*)!`JZ)K>4Ts0iy!FU}WJYzBKSjl$MXlqK^I>r=8i`HCqI?liwKkHL z!eaEpG?`swCY_uWRa=Zpa^WPGh^n8-B4r&syI47ue z@R&%)rC4}!UW%4r*NZc$bes>1k`Tkz#r~d%hHN;Q5)xcIwh$E-f`J}Rj7YIWG$^t% z8|aBgKZ?c?hr%;X7YH2`Bg9w~6o7_%6-5~ych#YJkP3=MQ8Fcg!O(t^NiR(qZx(9B zPRXLz@`m#^yx^g{z|I{E`gu@bIL4N05dZ~2J*vsD6l7M3-6fc-_ABersMnRS%{XKSZ=CI+DB;60hCRV`Ai<0dm9=guwbDzkj`2_J z7Y!nqSgBQqah}ynrF#hnsZ+0&0(wcNcoUlRX^OYptk!C$4SJt(N;Z8mQigZ8-mi2o z(T%t9_VdBg8@(i(ba*#Gs_TDB8MEgtAik1z~({WRG#T4(% z7-UBVpz+Sx5r9<(unh~KFS2nK^hC zB|C-Qm!5;Gl7_>a3id+hp@B;F$u1%I(s11`3l}89EmsQ;X}dm)lAb0Fyfwqf%qRV_ z`}|J*ed#VUI-XBhhUZH-z$?kHv|EREvrx#?07f48tA(+>@aKcSx{}@%+tpX7YmoNp z@Jh3IA34{UX_6a1+4YQhH2x0rs40_$CcVGhc(Y*BK|d?fjQ8kmA$T*%?vD&Y%`;jS zbsk|!`}CPDKw*ShG@ttk%*!vE1hWiRfMdAokj>=D{1F9D9;mM&rFyyM`~kgx=`Q=r zaIt2Z+Q=rd9UywE(wOZV{VbS|Yswp=i6V{sdt7UKvK+ z6EHrtQPOY){Mu|3=*nKXjjv8q!cOUUu}v$fae>9QmMj6^pi`lVO4fmYF4=)1Un{qk z{kIy+G_>spBN=5X>8uQqw>DAb{WHycb*5de9ih&F-_3MLCyQA7sI>mI3W;*3IkQgsW zYBO(58=&k0=_ygNS??h`h$Zcky9EDBRmKM2HZj#&N=9`5$47f85-078jD%!(deO#bJ zuu==@OmU1}xk|S1{xk)&Y6M$Q?punQA2D7uqF01AW@yuf<)krUG*CL_%SYr{B)D8P z3w{Xfz!u)Q-~?>9$Xnz9)`?coSi{vxndkwOrVDb^Ep~y%bjWQY3%Wy>N^Y43 zd6$`6{WmQd>`Xt@GbFODlKV4tNjpL+K6{f!sP!!xuWr1w><`HP7hqoUIBg;=oh#0= zXx%ddNrx1!R4)$*+g}=!P{o+SUuN|NbZ!@^T3FQ>DA2JGp#^w+VUOGcngkI?rdQ&M zc=gIwz^8^EtQY|oVPjOHOMhli4po$rK^+qVb#_XooT2MYvwx+5;s*G|o&gKaT8j|ZP&S*%-8+5E3#=P9e z56uD&f&?Wqk+l!Xcv@*ywM`y6&+8N^-AglowN|JM#^2Lgt2BdB>?RMD)=FsCV7=7v zqWPEElA`YxWQbEiV@bsG5$_>)0dyE6pd`QqyZ!X97)x#|n`>oyZTtU*UfX^^FTdP~ zTo;Xt=BxAzX0p8`uOLVNcwDZR{pg#X#vL@X6eHB@@=@3u_^+~0G|67kDAx&1W%KHO znvWD!wu0VKCdGBai#WSeu6qGzD{Et&jw^UjLH2e_)B0>&IcY#Q=X9`a)T$ladbW9G76{LHkV^yC|XU72*`o zlG422qZX^LZeE}+R=r1EFu(|J=y0VU=_NA4+ZncOe~~S{)ips3lu_{c+S3Hl#&I3G z%<7aats7)dMeAIQH4M~yu)4~yzt1jOu8wP^3x-Ow0NU&T%u9Qe&&RC&g_s2(qW5RI zi{qQGCSEZ9@GFcTc;Wc3LYa-HF$?bFrXY~Bv+z3}`zV@ZIac5b^rqY+6A5%{B1*k6dU zF_BGTGZA*l#eOy>VGV~JQpssHmgHj*PD%;Tnv=+oVk#{}NWV#vix`At1uI1_N*dt9 z^DG~o;s9DdX+9^UBCtKqUWmoxEVL51h{Wz>C*!HetjMOO*quY$Qf!oq%pkg)C}Lxr z8g8nyT#{#t`3Y>zvD1VyIyJOGhoKo60AI4{IcPS=2~sSQh9m$0;G^(79c8&G35c<6 zYXCtdqMVo(qC6QX#Gal>iBUEp#GpxxV>zHrBrQs*L~MZ&6Q++tgzSWVrvbw`AsS80 zNjT(WbcXvV24osJb#$B^J9Qc;Iv3}FPB;~qG#|r!4i^XFNWcXsvlmjr>{L8;fe?L8 zfZot%0g$YSI~jE{EwM>RJ^(woS>S=hPQjSd0+*Dce26{5CD~X4C=M9mxN}hf-X}Q7 z4i(UTFO_B!+&p^$dLX^0QZPq$9$3n9l7#6LKn&`|R05`7q+3cDL{1>5Qvg^1K}jRA z=E5;C6(^}Gja75u=*37pEg~314W)))K9?3iOm#F)&w!9krIQ6hplFax48eMQ^f<_! zHUVxvp5pjHo!czVeV)Zs49HR>ItTb9*)yk)4Git-C-?2!o)$v_C?1;>AaBOg)9Y>p+n$t0!J z^t7gSr-d|O4-rZ(j#7sVi9-V@MpDVC*mRmC>B&bY)6>(C-P2}yga{}B3w22G1av}H>9dN!bS9$&Uyy?|7mv?tT^F_=y$Crskeh;G zK$Vc@=RlT;xq-p3zzG63-_K5`q> z72X5#!mKI(=EzBcnK@K%*QkwLX zkV=3gNih)YxfEDH;0q9?=i^LJ2OC-#JtJcGIJYoQ90MQKGR7b%5f1g5*bYtg&>MUR z5(u)(L9)32DNu(-h&hA#0}yBdrT}bDf)i#@g>|(Jv2SVSZJzBLDj0B-W@OB05dtUx zXg*XQK6O$9fkq@I0AEW)c@8Mm3|ZP(>~)k;wHl>tXqR^1zHQCG zRg@i09Dr%+vj;8+kadoM1K<#s5PKF4lmzC3m_;!?IY6WgH2K8Q!NW&GuVbo46YSj! z@4Wm-C0_u;r;|c79wVB5Atph3TEf8xfhM7aZRIeFHVh3tiW;c+Xfh&16JWo&_y}?n z68nG>b?FaVhw;<^K^J(wu=hyOrUM;{kWlh8zxrgX0ZxI16n_Xfb$a0}^Z-10aC$&9 zDFs$g%d(>&mV5=YLIZSxBN8qGf&$D9tr$`|4knJD2Ui8cA4{eIr}l-pCy;_6IF{t> ziNuy-MiP*WgD*#406q!w_Yh*hpooFSCmu`*N_=vFOfU2Rx62-& zoILoy@LS+cfGU9XWlw;!frk6oVG<~u9072kwof!?971!II9OU$K_hY&X<3mt%0fhjf+2tB~9qz6@Sfr(ilXq=8oqJSB7 zp-ro-D@9A;qOC|J7Y+b+a~SpkTPq`T62~hBYZ|8dzzbVG&am294hV_BK%w`W2V12b zeL*V9Jn_a6@~go^rBR8e#zDE^5Q2wEIY zrnIC{i zh>!7{6b+KdwBUWwxJxtWU`UjfBn}MR(t%3g&m{F_71CLN_y&zHxCK2#E3Cgl!JVo- z1|~<8F!ok$#Yjpu6APr;PD7-16!l-N)}l7mgu$0ut%ZoHnVd0F?GPCj0z%bYh&987 z*iN-Vlym}*A_;i3N3DuSld73Sh^iC30fZuYR|`S~aZxR2hu;|+9Xl@IVIP6fx}~O7 z)A>{^DR{{<#A*WMj3@z@K7!j}&8t}0mA8Svh_;fr9 zqDlCmP0ul!z(7QMr~>1sdd?(cXihapRcLjBm^tzw;1MF#42zoSs9KfaE(*0cgd1zC zHA@VLq!Z8t*)3S{Ehgs#3tsRDme39t)r5Rk9biWx=!OMWQVMQYZMqVPs+q)Ss-4() z5}T{mQK-$s;9!yx@s-( zQR}sP7}k{_RRRy##p19ge&U6gnv#kyTsr#dlF&H40&sDT6hcN~T4%1|&4BiO@8- z&2V~7Wy+=+0U4E49|qfa+VDv-+Y-Fi6%IB+kt_&7E(tW%jgB^4I!dXQXb*v&Ft0M2 z$16MNX^RwrxHXh?NfcG4_zqx#r{q;-SM=I*$j&ov?5*k-9ht`&u6j!g_pgZXTlCR~enI$5ke`Jx`fz_J=fOb*~5d{`LER`hM2hvTk*)SsQcK#xDm~ zt-bK{nfr?SOY^F=^}ffq82dbQ>DY$Fxmfe*$M}xELT7#BtJc%^9G-RBvqrNyn!Vn( zN)N%)XQ!^5$~F((Z65jM+5Zs!x8YU#=(@Y*OZmp=?F)CR?wtAa!`ZjqS!o;3ww_*b zpUGO!Y*=cumNtZIzhYmfYw|{ebLR%ld^UPzbTPg{cW&CuHhZ3?_KX;QRX=ju^QCRM zV>$YDLw~k@BDA{w zXs+XE*3`IOc-}FR>llIOZ!OK`Bb`{I$8+?!!qgF_{f!x>5B##1(MX}suF)Ul=nwQp zo7f0&>gfe|538xrVFNI4X@1ojyd&kSD06+@N?Dt-mVjbyS+jQKtXe6(y>WX4gSy5myRjHzO2cwT{n6|m&TOtzDsW^p>0`H-Tl`7mDbRuAmb$0zCT4#I;lT?@%Ad}OTw^L4^0)vd^9D!WuaCsyCiAH&o z)#h98J#?pKrT0{pZqIv~ZN7W%u59r2JAqvA_&QUYucn&&Z=`en9l)-}j^)1VM{byY zF`8=#ZM1B;F5cL`(!Kl7I=|xoQ!v{yveDA}znzvE&!&g!+*0cK5PO!IXS?@iTlPWQ zO{b;Pv*^xmq58IFfdF0mA5m4dx-8AEyPKEJW&00(?H*S8w`Q5(J;s-}z`KWbiVl=d zCze%S~j>FfaN zIztN6wk&0tzDHn)Lid^4#ZxOx*YZa>W*~2&Y>fbtZZ3@nMxbV31L%yyZMvwA!1eJP zo?o23@!_BTc%^+PYi+#W+?HjBZV#H=umwl^D_Xg9bJ*|6N zm4+6jpKad;p}Z|i?_4{u zJbJfwK=F3nFyy?!thZ~!+m-Fvd)K>H_4Z^34&3qG9XR%_w=usPMt}IOfvVYZj|trK z2J$S`8{i5}kowsBE zE_Ap3Pt>ZjcvXvX`o16>q!Z^)H>xZrSry4-8&=@?n+1H)i;@Vc>o{%&mnqfNKvB zT=8})eFrw()(+32EAOGa?b)tfcWZYk!QDCU7RA@GJbl+UpaiyG8{6pEy7=Zj+Izof z_7(a~&_1yLi-XHYa-QznHLLV?Viz8|C?>Gp``TCMR(jve(arbUcHBO<(sm?EH-GE! zm*%4|d)AnPIp!eXbbWiad-qD`9?)jc5;F)9NTRPEL;}@%>G)kor_u<5X>o2_G_Q9I zDc(lKyXD@t!;440c;ng|*_MG-Z|KiWz*M3*bV)GUzGjB(<-dU+vDe9Ldo~P{}&) zGWdp++<|qb?hE=Ft$0U(Dr?@}oVRz=Tvg+FXr;XVb#K#}w+j%YYkgU84gzIl@khc2(VmZdU8w;U;=VxrI>m^bB*cB zFZH`}pqrFQ>adVl_>HuNH!hwYTrae4P2$crD|wKUvw)crh^>wmpmwm1!0 zFpI6lnT#q-#~Ra@WBSNT;HA_1+1Qn_tbgEZI`plxVd;Zx%l2;>|2=Pq;%!^=_T{{N zH-3L@a5OhKde=L;!T7UG_kE2p*~T-g^t%dOix8Ife@%Daa}wzWqCNTU^;Np}TZ;>w zDTHDQJ&T>7)z8M(=*}G7iFVlXvlB~0pe%n=@aHzS7Pg&UwVu)Xu34LN*5)t6;8GD1 z1bo?sfmLg0!{NC!_P39YyQqevhQEDOhqwQ;Iax*3bY1^();;uyss>+H<_|}7SN910 zVcrR^zu(+N)pTBeGwa^^h_XTR+Lk5mx_`BH09k9lW?x5rI|U-S?yX-ke0~fR9SkS9 zm98>V^$qR)K3@ynzu$}-DQDZGD!VO+(pOvb#UhLi&U112^J?NM00cV(hC%7-`4!#% zeclH>zTfPnyjvboR%c`R=+X~IujyH1LOCXMBeTjJ_=aitK3@Z!z7x|BYyaoL+Uai7 zf7x9--EaDf0mt-^@h|ocH_dbyS89iMoHrZ4wwmzjtio%3+pO96S3|usZRTIM8t~fT zK5sPtdT6*hcEJ4LfEgZsW46u0)fGH{!2Fv7W+?x)*%o)3|Jt=HZa4ogyBW%rKdQnH z4xjv}>Ul1Vy>0@Vq!2Li7>Sb@8AUwC<~|Yg2#x3ckzNpas~J}l@f7IrPZ47DLkqc zf;m9?C-Bq`o8ID1D8Pb=g$0vhwSQ*0V)>a(u{ss2N3qr@RxkP2tXSQOwMntoKlVB3 z>OAEzS3ic1)D!H$eIg*c;c*fQPqKqI=x0xMQt+KwkvX#c+02N*33U8V?}=vtJE?%gNM%g73tS8mW}~Ob&XraT`vj9?@ZF;+1#k(~gAUa+2T)##nZh3d zNk!aeD{++7SZX6IB@q7@-XBD!z6k}wRJ-dkzc{jDYs^!$*}nA7x*OJOE`8w!ez$@A z1HW4fOC9jRz+cAx+bU@MTkP=&FW-r{tMyKtB0f!9OnP^&oG@P=`^HA;9q48gIz;S--T;1`Uj|C{|ySDVI7p!ll64p>b!OFM%$`o@45$~*mlKJ zuhh3Ib!`enxA3ohCoCD1wjrgtZ`0?fwO_X6CkzmoUEU9y1e-?;lpV}$%YC|Lo%ZF; zRj}P)uC`Z0a9rE+a?o}Zf%&Q0rkCr}r1udn!(4*42l(0K1NffVs(SJZX{g+2%$+75b0;4AP@k=OOla@ zt1OO5fIfdnVF|%wdIZM13b%zim;+2fC&ODHb@(;@KMD#q;h!QppX249!KKKaV}RXf zh+Vsm51^;a>&P*ctB`pDkc3n$w854XV3xqy6E|UBeVHKXeh(QG=tF&wp zrn0n5RUMY<@q(Eu)do4@6XY0{upOVB(^{eIa^cKKe%GsdZ}9RbT4+VdAebL zV8s)>xNfMhc~N?0K-LjYL&W1rM^iC1o2;c09X2K zr_#*keHn|PR&lfWDlBX`TzNAVVC`Jv&09zjmZrYEjTG%vZD-y=iZm9Tr0AmjZFx5- zGL*}cuOUSb)!3S^B}Ff+-?fqQbyT(YaXqOWVRXd&l@RkAsue4fuYx;43+@H1u%sb{ zB@HJmX((Yy!w5?nLRix9!IFj!mNaazbja{rWSR|j#STP*J3$8S1!S!C!X`~Lw`ZiIvY diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc deleted file mode 100644 index 934b1aa9ce9f34b98e1efbe213287b3e12cde2b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13288 zcmd6OX>c4@eqZ;TJ?NeTCvg#I49)?Gi{LF1Ji${0S0Z&`&4mZk4PeMQpzZ-lz=JHZ ztEz=|Sy{?)EZ8eoVI3xhEIG!;TPbdpKWH~!#gLef9# zPX3-(85#}IIxbP3tQf7Jd0(P3Sv6Wk^JR(ZWX)(za?j|VWbJ5evTn34SwC8j zx>|{U%Qe~{)ky+=8y$?yePFI1b^f zY0q13d%f+mj!5fgWHAv|=cB1qIup&r(b#C;M(GRnUadk|cQK#dvczQ-n z%;F^$lT|f-R~}QMsYw}aLg&&`vLdHq^0jCNi&3$V0QyDIGL@N$W@Jg{@SecdQhE(? z$(ckZJ~lp^k;l+2EyYuldOgZ#QgO0PW8^UvdrnDFWmfm^sEC>8M?M?l#h;U5*zG^3 z^h>DNc(ROj&I+GF3*(VktMq$p#%-0}_E@>%ujI%wKVkmFVYR=_73-|rJnLYxtmORA zWwn}j#F=@gQ>pg*n zjtAu~w3@fqaRYBGExE@;__+&ZBA%D!%#4x}qpF&Y#R;j1=2?rByi_rcN>K%cBxI3L zj7TU%oQ_V)y>x)N-U~CS7-1R_+#{+p)6;2%jDrG7XFWT6&6Qasr}pZe_+%=r5F+-- zijr1Tg`Cr8r%Ce9NG>RZz9t9h^Pf*ec!hj>-FyAUFlny);z=@FB0jGBjqF%5EzKlk zh2X00rhCvm66IdqO;(~RumF1Md4yqoE zO+}Sx47@)UBN(8waoru8nn~R$tuj6vAy)Ev$@A4~eN*YA+!s$}60yE%C4F0tWmJ;6 zpG@EHyDO*e_F)Ho)3ceWbZW47;6R@m&&WN~(bye)X0?yZtIC-%e5zzL5ucNlzL?ZI zJ*(GPpK>SXDiO@yfIpQ1J1#I^a17V96kqdpJq=WAH5c-MiyC+FSzyn4pgk98UnyHX zwz^O27|I7utp{Gt1zujb_;-!1D@WHF4=$W3gxeOb78)8Cu0QivJUqBmmG?JoF@AUZ zB3r1gdH3~qUVl$serfsKPj2U{Ba808=R;4sk34qgyN4F9Zv>mPU`HWT`z#n)>B|R? zKbD^a&lM`eEBkVlhYEuSA6{J!=BoM&p@yaF`OyAVHWwPeZz0sYJdg{uy%XGQz)W8> zF+#TRb-@N6<3x97_( z2i{czF26cdbuPs1KrVtl6uEvMnRl50 zht)YNtC!gnuj;;Ho_sk<*$Vc?=zDfZ2Z$MSeaZpUp2na0Z6piKCdV{3EnI#k?pqfJ za^gT<9Nc1D?wTCexX3;1F4VPdF-~92;^n8o#-%s%!OoSF`QXt)sBS$Z=0f6f?OLe& z(@^#2UNqWtqT{B(2-TXaY8%5dJI)s8YMkvTGVe0Qb1h1xc~)ZQ9a$Eq2ki_p!$Hs) zC&gu*^T5dzi*s-+I3?#KPNOKniYJCMa?QO*&*%olM+50Bp0p3j23KHYuXqDcP{dF% zs>tG$9K9P)%!-M4>JCmclLovhnRsj_5moF_y3~kqtT(6PsyJa`u9OBLWTwcFpbm8! z5*rIJv3W#yzet4sS3La@&qhHp5eLNwdO9Ex5no6T>^MSI0ev%iP@R@z@rk%BnFvTQ zm7KeA>=o8VOHTY4T3pAUdJPGHM_^ixtj^}eGYcaHv2EenMneQ=?5>Kkh3H?*)hP_6lf7S0dMkyUq=kz9nM73dg*F213Mtrw_VmdV&ya+mb;{+526 zJrn6izBhenKOgBg$$;w0=6*t{?ix|!{=XwSNY$zML}pAci>v7a{Ra+=-JaIn@=R>( zHpJ!hvB3j6cO^OEk0)8g-GTz#?f#Wina z<&D4Y%JrOu=v$oAxVjDAzi^q7FjO6HGJ0Qy6yHJ3_8UyDxR0F71h#foTDN&1;B zC*&xUT4;J#(BwX83!R^weHqizp}F=Hn!=i^`dKwZO0K$_$e@lz->1Rwqkpj)U+X+w z2zO{gv(7g@s$GfXTMj;UKWRBx5ZiOY-c29c60y^)i33^*Fxf1QiHOjpN4Ws%q>6>3 zD1apPEr7;(#!@CMhM#v9kMlO!+OEfH4+5Anl@HgvJ7cR9MU{gpCLS0DFg3DX$uYwy z?1P4^hvuNJ;4PdXJVc+Y+g<@zS_(76XPOykJMYW-vdmqg$Z%O7Obecx7CyUgS+*?8 z5d&nN&+?L!7$Io;D$FdD?S8VZEI(nxF4P`uI0NIyc(M-3^%f(!KlFTnuSgz|K6m=gBa4IPVwL99jV2f}v}#&t?8syhbR zevMlpkl1aa;#_4|Du1XwR-!{@Z42@b*>_oN6ZY6F^B2y0?E5VI3zYmL4&Bk)ZxA%0 zAyc@1a3+_FUNXMcHb*R^F_6|C$#7z8e%x@N$Cwp%` zzWiQl<&E{GBe}gdzog9az3M&eg~>nuBl7&ssU7>O$WM!dQ+nwm9mVjp@@Ue=unIi>6;ugypzeg*C{Mh_WQB?CaL8#i`o0i*id}nU| zDZD*v4r{H4^UX&VgU{N#3bp(GRyg%=VCBu#D}VmoAHMWNIJNC`bd+h_UMT6cJuBbM z?HO8hZ}6dq=YDjeAXKjljX9xlX==rdc|H;PHrug~FS?lWJr8GpntCj)h0ZNp-Wa<0 zxBMlo^El9RnavB~CwOyR`f{t9@t~-Tt!KclL1EFC#9bzv>juzTk?L z0w@7B3ZO@k5^5|;LHJJsMW7@eB8e^fh`wjYOxv$i>}N<%8?Kxsz-eju1?2LyRa;F2xzHaP&r=5DOt^UOo`R;LNu-g(aS1hEf<-Sa%pE0wi9IDlcd;pdqz zEAdrv*|It8+1?!wuy+CWD@r_7eAYJy?z7rRZn6i6f@^5&LEHLoZi^jz3AEqAt`ra8 znIoPm=nr>xuO2p(uO8sMyFBZYNVy-rI!Bg6E&#oQqh-O8Z*HGkHeju@M28WqvN?!V zD?cB4ZhzayT+-if_1V$Cyx2c$&mcLdj?ZU9_)hh^cKu&Vde~#yJ<6Zcx&dZJ}R(T)l38mA}|rdJ;zwJELB-V zQ&=f*W1}I(O%amp9=vK|f3MgT9aqzdnT!nMH=d0Lr3pM0i8*3Q+D}hKe1;#U z?A2&uMm8LmPWbZ_;+)W(bMa}Vk>uQQ*zWgrC;WsEe&cGS!jM)K=6RI}E4|h}yD=P& zlD-Qg-Ed0QmV_W|xddN+Mz8()IA$NwRGcj_Rx*>>A^=y!By@696`=}?9w;sX#BoQj z-}yckC*s%;jCviE8GL0d({zBs83MNg5u|myx)mFgY*QT@mnUEnju}E--(z<|pkspg zWX+25k_w}X9x5rKZS@Lsuu`#JZVXdWL}isN$?c3G()X4OI-Q;-zM6Pu7M}}Bfg&r! z+WZiI>I*1b`}=;*KfaXfAI|T;pt;&M8eVujo@+S0FhYbmSO4Dda*Nh} zGT%5v#JFdhIqI&?aV?9!heL3i!bjG4FvlMxYC!j))u~+fsrByRT=(!t@qG8UG%ma$ z?AQ7(=7fuzPR1Ah!ozg;tb9isdM(%UT0Zi+#PkLz z_2cN1(DeXdoiyM|mx=o&^|Uoha``c{6%<9e>>Nctq>G3X{6farAN1<7Tbnvc}au3%5TN zf?B8rTF0XsTI5W={cKJ+i?7j&uJv$$n+?Rg(DLY<)^#f1b~-1VMuRXK)S&^o2Rrk8 z*UFhEe2;eE{KxE*1D6XzTj_fF0NmMmzH?>Z3BO+(IQvob$-u>(ZO9&*A61gmXc@{0 zLm#z15rzvv@zJ2xIh1dO)B4m$gKNPH8^w`7#rJ!Y#gT2oOcdH4#kB4d`Hqu0{-owQ z`E|b+ac2W%*zNt)yhOZgN;D|j3?rUwM6lZ6KX6g6 zXcfkDm&i{wxrkoxuBpZB?!jP$S!z7+tV81Meyq7HsZV?yQLiNtFH##XDjKmK_*~`th+WBV&JfAB zA5zPRiWzb-Jt3+YrB{5#2#*?(F|kjy&=4KL^90LMhTt2%-wSa^$21)yM5YWQh89<+ z`V3#J>9-$;^CT)>lE)SK9(?(Ugf(~OUK)-SIPOUVjz};=l9GXluzrEcqwDa~l*~Yy zC9sZ^n24B`p;hUrBn^lM051$G2W zole9v$`8=!f8kI48zj^?Y7!SNY*e>zG4<}Fi$3b8Ys~SDdDF}xaMCfjdO6=Qv>4pr z>oq=%qK!xo*ndOp*kU}s8ck??7V6gq&U|z#AG%SftR<*a2afGHtcAh|Eo}PH3Q#RH zX?%O3rC$@8Hu$~EujcrDg~)-wY<|BvA345wL92u>sDlj80T5d9TzEPDXX&4&^BqTW z+>tddym<(V{NgAhgdTd{^}pl)*TFn5YA*5X%uEQEGV}jN=3T~S<{pEY!PXtffiO zH+6j=s*UKgq&wA_Bvl~|Ux=4DP>8Or>Xp!yZOzNrld5}+TDa3^#>b32RWFs_#n8H& zE>R_zZR$A&bJje6=?ZZ-wUX8T3K{BI9Xv!ls}*(NG%%>AP%myVZr{D3NdPe68m#ad+_`uI^Xvbds`1RbeSM!Hn%Y|Mmgvz(wPJdv_ z?eUduI?;Jyc$2};7c~eaKWzV_@2uWj57Dj!K296( z(fHdoqr8Vcr^xb&q4XPsi_4gvfe$VqOiW+Yv8@^%on1KJDq;r06NTz&V-q1AA{ z{?KCC24B5&E5~;iy1EyyEp_LF_6@H3;ceJG>s(ik>sqP)gzMW3Vwf)~7>>{5!z9s_s#xgIrLj>cK0LMjGbb^ ztnl1rJ&5;Kk~?f!&vRkKzFopHC8F9UNih4Lf@r-(h$!(Oa#`-SEs%?AvEXdpSK`U^ zAXMf1I;hMe*pm^gzSKX)J~&QV{+LIQ#z~b5kUs@O9-$iE2-3{^=gFJrKC22?If?$! zC+jbIOtJQ}SbLzv8yU#@ZO{y6gIV?tzAmho>TFQ*(%WvtCu{g5VWZqe9Ao#B4V2uV z3rap~yi#z(81(KO!d7Piv409h=@DRdk2O|?a6NsBP>g%ABv2*nQfHj=!aNU!#y_`0 zk&L+C;E6gj@`inz1K5CH5zzxCmuMU&{_$3TOSy)oR3kE>Px%fCbT(}Qo)NM)057~tFDg-sER1`T zfCTJOGq@E#`F_<(`O29`1G(@?Gqx2hXHAFOXQwFkQvFStK&Ks>0qs0L()E8+;#$6W znWpykL$XRE!u9y2$8Y}P=7OQU8OobqcT>}bC}KoBQ4>cYQb*^Bla+XmlIfK4Ba|pS zNybS+{742q|B&QJ*o)$3B&2*FdEJLw5wbd!PDr|tn1stMmY7j-)CPo;i&uJ$Ix{hW z3&bF@9dWGk()MH2-g8r0(yJ_b8=FuJ%8MhK{)o)oMiO$E$}$qY&UAehJ%(eZm$4{0 zR1)GhwMzTPkPpFKA5|feV3d4E@F3AEE10hCg^Pu~2-sI`gj+RN{l?%aZSd-nuwL7p ztLV!~8rN8;>0YlnoU1vUuQ|HNBTfdIT5VVhpUgL(q?Y7bQ~wjbpICcCm)HBQ z{7hPnJ}&={tk!o0p0Qltm5o~5X>!z+t@R+#)~NrvD%&MEvl@><#ntKu zQQR0<97cdGRQ+)FNl+x3Z+Xp9>+j>fQ^!h6F0@Yzb!-TgKOT8|Wa-i)d1ZKY;NPaT zhQn*Zk&R&cN_jp=@4q!;f?4N(|?tv zcOQRwQaJYlXI=Gj!j(a2kXS=s`N*k%8zr|;4V#lu{(>a`fh2#4#JreMES)RQ%uFZb zZ;z+biTxr;Z$;P(5f2T-(k=?6ITxua8OLLg106kSjZW)z_e3Hc&0r=%&&8Rn`H3nr zS3}piTZg=5Ob{>@N*XF8UsCEYG2s`dMj~9v1pkgS`x#08J(4+GF;c{=IFe4uC7nC; zvazv=8FH0mY)m02s1Q%T?jbjzW2$k*n2)6s2_t-<8rZE&wCl`$gRL?SB$It2|GkWiL0j8}j>L-`W1ed8MSkn-0k11mCW z9a5-5Ec}ecoY~ma_q~6uHm4P^wk#TVwZcIs8WZo=uY53^Rw0Z#qTx zGK;HMW~OJr$ZWU++ip^|d4avgvO|SH`KFU*I{S^xhP!OrO-i%*Y>D) AX#fBK diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc deleted file mode 100644 index cedb797e4a094f2fb6baac35d567fbb8ed93aaf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40802 zcma)l30zc1p8snEycG{T;)Q24YQ!_3Sju9wNqfAUGcs^9lpuj==H z^{c91)$7K;>)W@NhX49rU2NPtuW7A9@c%b}Gq#7ZlQiv^wo21A-Ik?g+fr;ckq^oW z%I=oZEju_RI6EXIBs(-EG`o9BcjCHb^~mm-(v$MRS-rA*r}Uqy~l}=lzw_oM}NK7b7)@gof4+^fz($>L7HQL-tPk&>yc|HcWp^ z!A21Fm_Aa$MiDkrAFW_x2pg?ODA-uSBJ^*d%?jf=wZ8 zvi^jEO(pCJeVT$zCv2Mjq=L;L>`6UR!DbQ`sm}^vu<2|za>-7x^mPXhH zT~{y%VYqNx?D++oWeHST^iZ%O}jK z7buvEumXK^03*9@A$+sGHGu2e2-~U`D%cx@73yy)*jt3XslTmY?-2I3UZh~fgca!} z3RX&3iN0OIb`Z8*->G1`2-~TbDOfpSW%_Of+e6rHeXoM;BW$m}U%?I#wqLJMu!DqE z=&cNA=18Ms}?tyi$KJfa}Kzdrv>1U?&MXp`TK)(}bPU zs}-z?6WH)aw=O z5@GdvgMu{@)}Vi^V3!H|SihoRpAdFMzp7xL5_VN@Qm|`;HR;U(jO==y@Mir+0M~C4 zc0<3VV7CdorGKViKOpQg{jU`4hlKr={<(sELD=W|j}+{$3Hy=$V+H#g!hWp(t%Cg> zVSlUty@LG%VSlgxM8SSa*iZC33ic&ocl4hrn47Sl=|5MnUl8_l{g(>%E5d%M-&L@C zgx%FW3ifNlJo-NdFtY1!2>(a@p8~l4&xHMx-lAZ?C9FmN7X@o2>|gXY1v3e2)4dAT zPFRQDsbIe&tW*C=!M-N!EB*Hh_OFEfUjH`*^AYxM`h5j^K-hi#p@Mxw*hBqW1^aix zzSaLj!Tyu5|Iq)SV2=pZ7G9h5PTbLe_=?Gr+=7G$~Mg23eTF@}5Cp!Y#}Y$%KO$YGH;+W+<597UnU@36c~Uad!OXBQk&>AKW~POiC7GFEW?Ps!l9>%=u7#N=nYmz|vM}={ z^Awn;EzC2Lc^b^K7Unt0JPYP|3-f|xo(J=yg;^k(7r{hXm}tpFfr$w)viD*o8v`~j zz(QImnKtH8W$VP28U%V5@6m=wvZ0khV^yegTsVAfff*CewJOsa)hFPT&@ zb_=sXGIlU&7Dks$8W=}_k-fK3vJSB60Txn*WDMk$I2ux>WHuqMMAMKco)#!RN=yxj zqH2NSqeRw_D7F?TK1zHIi6U%);-f^_kSNX;C_YN84T&Ocf#Rb?+mI;UMp}r^8H>;SXN!jws-9E=i) z%ih}~+1+53m>d#Cwv(<7MwrG%px@l!zV@#q>z8 z;PZ(^zpGM)i^HVTiT9}_n=1VYc3-fcyxWW7)z{uYFrDT5r_E!NG(p|~?3i*2$#v_?~V18|3 z{!uc&0i)~=AkqFnp!g_z1W2??5GX#%P5~0_6_B>!V_Mqr%63dJ?G~m(GM!+4XJNjQ z%dnXke8tA+VD$^0uApM|+EnFnAVT9|Jn^DUTvw=n-9ng0ay2MhB^GJgQ` zM+@^`lKF2i{}W(j@BOc2|ED5I*8(gg8!7G|Dg=7LdU{2-lU{2={lFwa=-c~;)@92hl{57If357J)*v%qpsl)PsF zm}mn)63GV8%?urO(o(ZM(@%tpyLz@%H449TQ}F)Yj`$rxZVElieVvcafvcaV&` zfr3%v?jRX=2O+u+((^5~70BB1!MFm9?7hvBb%EUyU?FXl%r@i;EzBE|c@vBpVF&3P zVFLxDM%Y0*N7zAnF_;odZKbld?O=9Tn4OZ@0cMwlDU(b&7$uH|v_~>~k>6*zXTM|) zfT^%B2PN|^m_rukuw;&aIci~!N#-aRHBt_ekup#)?^*6SF7J5{j2bBi$w(O}m{XQ} zPRn~vfvFBKviE8vTMhP1fQ58cGG~ylwJ_%-Qw!$2g}ES^^I(*7Z%B0VEl_;aI66qi z(LlkdadeQ3qk)1^`Ckj!6!QDf*Jonz=A{R=QZ3fyzfChzzW z@W1xs68kZ*uGm>(e+#TDYL?jF1M7;HCH4=%e&VkW`JbK$IcG}=NA8Y8L>XU-x7g_# zaz8s`OBsUHP595{TkyU>e&OhfUs8rr*MdTx4#-+Qaq z52WCKPwr10!wSLpHT0t?B9>rH?n+I@I7WA|5#kLzO5Edj@W^>cuV0_B9kN0CN0NRc zrGEnQ&*{vx5c6Bf{0o>?$+RJF;^R#ZqB`2CWQQ!-3FddQ1K4T~sf!tWibw_R-<;Ej7fpQa(n?$+C zk(*4pDabv696SfPsf0~KZaU?jL~aJLze6sPu$josqTFoc=1^`fa`Pzn6ms(^_cU_P zQ0`gep2O#Pd|trkMSK?E6NOJSJ~8;j;uD9@LVOnCvlyRve3qQ(kLMqU+){e}W#aiW zgkL0_wWWw>TTXbQz#%22Ou+S}6!EMpQbgn}?3BDIQ4UxoaZGSbbWBR`<{yXtG-Wc? zzY_He>u~+6y4qb0{E067W!dg4DN|__chlDh1isx(PoZ94D?R5`lGaJ-HIh=Lw4Nlp zls1r*CMBIDhmS{9II&r&%^%i>UFcYBs$ z&v)b_+be$2^28N!F;U4xq~&Jk8Ci}gA^E{*ed>(O^Zl8p{h6u$%#8dHS!Oyx+h-n` z4FyA71shZ6bMlm@d-{f%^CM?RdO`&}dlsiN=M|3DjkJQb`325t5gWD@IPxRjjL0(b z3)YgbZk?xJ-13;j*!bm(QWK(9EKTl=KwF+}Moxie;L60r)Z~PyWy?~N<6c^Ya&hS( zwL1gTqC8=OjE-N_MH$+EhH0Lm!eXfDm3Z8jidz$7qE^NyE-xGqlbciE%*~2O%dk7` zX$1~vVee>rzL6HO3?|R%EJDSF11Ud!W<;_pFE7iH?Z_$U)bQ=P!Z0Et;XhCR(`6c}mttcV1=Gc(`F6D7hHIUSD72z!nm5tEw-+R)H}og7!^VcUF_K4bZjxSP$5J)?HfcD-Gz{h8lh_vgu(&L zsI?VQp_LhSdyd`sObFeUFU>Wy9?11fwrAU+JX%>GQ=^1#QYRa#0<%r%N3cUMD*flFR-H0Fw zy18<4bBzT;3W;`Q7`m}u6gjx7-cxEw}{K>AYKc);upxmg%bj|ugn zU3hFqzQc%sSO{&62=r67(ICVLe`d5PdW@io;8#>pkq~<(yWr3ye78aF)Jb_!^nhZ2r)1&yPQ16s1VEmzc&OL{!HM5yINAa{f?l*Ry#1O zs#A&jEK^8Oj)^bG(#H$ zz8}w4{)aWR2!MkYIdU9M_+pYPC#}FmYn_oNm=UNSb0Oxvyn=k1wymq5?+EzuKd1D@TxVBlZ7fO;LX%39897nDzKVqdLEd#?zSYiU$ zF#pPvgoV)MbmSWg1UxEH%;Bgk#=js%tZ<~|rst3ujrF3;khq+*tlWGI=%}o`42(oE z#4v!hi6DDN=WdONb=tRJ%`l1t(l0tIH!U+Fj#sXHqgsGraIb7f0q%=P&amg9c@5uQ zFATTp+%O4Akk9#hd>V|s>1@5@bp-0II(yjDySxLshAptsLd2?bZ%a5 zcJ9VpBNAfaaJlMX{N`a;ZNM^Iu#MNi3Q;^1DsRBDR4ob*@ZYP{jhBgaD#&nG;akq@ZsQsqn5CbR`xHzX^;8!F@N>jWx83 zfcrq7+yWzFIiAHZA_X)Y*2#vq#OH{`$TER05PXlM410S1^gO#!1kuwg+3s@M^D_!C z4YUY;P#}s6bgNb;?p%s!Dc@jbkl{Qd_e2CYWy%=aZbvK(o& z_J#?j-)e`G*HK=&BLp}&5ELx7XKj?bs7OK4JZTx$eod&I#jXdpdSNA);Jd)&_e%bdH2nI55WUO2Z~!Y=nT*<~L6i z>#^D>$jEfPZWy15ay?`}z}rI6ViA6__b20aA-1}J2gGd4a~in?N{?whaL)o<3d7>F z5gDR?5&B>sj3-Z(xHX6#onW_S2}gd(>t}K5h6R z6%L8d>53y@ha@{{5sI%DWcYWzT%!DnpK4>xt zm%_e6@x?A|`N=!PNPB4y<#$QvEF5i zr*EP1aar5QDYP)rD8k{4Y&<*(OYLw-!?*(hOD*n0zrdHU=xGB);g}42ChkoVLXQM{ zh8+tc?iHdK8cuOk(E_P(s63iLkEUUa``2Ym9|J`_OEYpeVN04MgzgEhEYWX95hSBQ zKs}dcxODp#gpr0eNEBHFzbrsKMM4V3&KooTU|~00#2JS(!&QKmNlG?!T`a3b;i5Z+ zh#N$lVXQ|MKI=adP#3%+Q7UAmJrgm-9l9ebBNsu+P}Gowizg&j1gJPx5CATPy7H*y&5tZq3x{UQeJiV9W~ftX5Hl1 zU3RC#NCGVSavKida&bI>LXrOX?$4g11fmK=eB!p=Np=?$%ZXTQM_@JrNci`JI9Sux zgY)!^hFvrBUFZ&NB-G2pMVyzR-!Sw)gH+fz0dtuM9T(-|SqyCyimk_`uRA{Ha|O*bk4 zd3q-}bjL=!p*wMcyC4S@R^tNqH^gyZu8?sl9N!fj!7TsRPO3!|*Yf;YxUdSA;obp4 zC6{>K>^#KmA}-PP03Wn8!@wYp;J_uB4p0njpK?cF-)IyGTL^N#Vf%1ebcjaeb1YAbGN31I^D;KAqhIT{P0hhwz$(R{2 ztKcMC#71f_HV~hZW5-c-&bEjI7f$H0j4YQgMhxwzsN@bVg~Ow_6=H5e0M%8>KeKCh z!~=aPRQFfVMg0uuXn#z^@shtxS0hQH(14}(%!1s_My7w^z-b6@qeYPYunU0E<&uJ~ za03h%XN<47fG-jIK7W(ziHpf~31!o-a$2FD^mNss{aifJT@)Ue>?$b0 zrYqS<&v{uyQSiYA4~XyXGZq=zKZ~1Mgl2)W4Au1`1@}D%ld(pHV1_K;X4o^a2I08Q zo|fTqNSD`si+YoA!O3@SL9S8pFOWaO#S{9nJtr*#F5imVF#+Rchd3=2lY5)c#T4!R z$;rp`XrrZF&>f)rCWtpI5lf9sd#1}UT7Y>%qI7Zeu63f&dRz(z@s=|g=lHMtCnF>8 zYoP`%h2e=X5duUQNiCrL9tDzcDV#*%P8#+F%AuaJQSo=3_OC*%eolc7C8vB1%UWvWn0 zJw&OA|Mv-&IAi1^9W?y!C_5xB8{76YyoQPp>!xEeC5V~U{AkX}Y z1T%akO6TWcnDW7hJul#k{{enrR2G&gg!H)6Z>=Ih4FB$NW7kZB7j)pi_k<83)*rx4 z2+TZzYI%`SAL|i{_Qm!&ALm^1$UjeDKc3;L#7q}~T_4`>8ZGC8{*uyoLVQcjSn%mzR65p(z<0p@0wv;%2K?CI zFDSUs@O_1XkN>$1yE-*!{|Rj)@U`~8pl-}Gc!g;s4Z@{iJT4kui(wy&i)O>cCoUS^ zis2F_E(5eFA%8)=i!s080I6{F_iX+ZT?>^wHqbal2pn#Rql)QK|KAePg<*lW)HF=i z;Z5@Lc)Xa7OI;DQd{JC-YD{86bo}zT*eU&SlGQaJ@v2U~6ZZ6?9GwXvM3*mlJt6c4 z*V9`GlMrmO+j>IiXu#96>xA0V*D|!R6Xx@MoZg9}eY~2bBYaPvfCly~XSs&sho1CS z9q-xKdB*rvPmYU8Tpk;>Vhuk;>e9G1FDI^uEqrbAi_hSHyiI|cIq6g0gn-?GGv86b zd4{I|Ui<1Z&qu6#W9GD(k#Dg)?$yWFy*Op^TKn|EsOc$@)1Q8Idg{8VDmSI4CnPQJ zsacVf%zjEF^XJZ^cK`w2p%^7S%Nxj=dY-jojKbRT7XjxLwr%92iBkbE!d4AZ`+zLYK(ZaZU(j`jv4q?LRQ)ggs+=$1eGr` zTeEYw&e-h8**qi5*f1k+TLIp{&3qVg5@z)2S;-WfRKfo2;t z>u#UEcfx1h=`+*U4QE0RQBd>ri;r3!m72UNDJgNq%D7n1V5skoJ@m>uArl90cWr<5vYlR6gt=yB*t@T_xSi|+I&(35-=UuS`<&SPobOqOPG zLgtx2Z!Q_)Pb(!GeE}PQ`dpZbDtyZMBVm@m6PLdiWH+ZMqo9J9w=gA&@eO}1s1T~n z`D20pjkx@67cVeBFUo$G7sV|+RT8*g z;*KAP3*9T~asEtP+~U&JDq(1Vc+r6K(?2bQp1LYfy8ows9_9+%MO2_xQ3yRrO;d#d zO5~>W3g{=DcD|w~=@C$tS`;QyZ*%@!=n;6f@4H7d<>{GiPfK-*7}(QWWbxiP)5yzuFI9+5c?z*4$rI{urHRs^ajRlbu(12e_~hxL|ND#9L-9?n>Ee52 zq7-hWQcIGY)kH2$jGsS!MZg(m7WNWtiiu{rnx7RYGFK_0OfK^jSj|5bxO2WzWWF=3 zOS_r8q|L=z79X83A88+9>@@j>EF25i)BNvqJ)!9vX3d_7=UEg@Y4=6Z{DrxYn53u0 zbBZeF%_|gNtD8Q*u%~$Z`O}l*7vU=>i{lrrOkEP6>RrwO-8;acmtH=*Dd3SNf9ERI?c8@Ccm z)`}Hz$w>%c#5ez57=Vf%*~UGxO?qUT{Kz)tk!{)|+w@1a8INqwJhDCe$oAYL+w+fX zFFdlXePmnr$o9q~+nbMUZx!}HP$Ry6xXv>YAzVV@^3>$0g>k7-$uaTqsiLi@n3ZuW zl3n*gG_C!;?QKm(-pWhniHmJb``Vg!dQX&_@9u4DZtl2U)zdI&SYWKdR`sbfvBN zLi>e%ohQ$96z%mMy=GSIH*4QB>)-3B*=v4u-h26ox4g*PaL~MUto`}{b6;^=Q+eAp z+Tru|^?fjs!W7qp_&3oG`c6NO7 zso8L#y}Yh{e}h?n%G_Pux$8iu(4@BQ<{`7}s`o^*dGk=)&D-rI*V?Y{Z)w5@5sx#O}~vAuKG zKJU?n_U7B>&K=$(4c?E=nzu{M1N+);R(mV=x1ZQ!?mulFC~Lb`W|q}?FCF%l9c{b0 zv*XG|Z^PmC4?i?34t5qFG7sMLepG87sPvw!F%P`&{kW$6`k{^sXFHG8d$%7juQz*7 zl$kp|^d75jzkJ=?dEC5J<}KaPQMAK*qNx3YJ#E*|dP^^xpMKm~^qzU`s`o%e`|&HC zXDZDd@3mjtV>TXXYd-8fb;5hJs-v;SJXqOzvaapsK6A%8v#H5@beFg2y7$8x^H8yQ zm=7HVq^)>C~Fy__HBe%VcB^^b@X6+U8baTfi+dFPu^L|p?@#&@Z<_jh| z_xLTdv9bO7Y484X?WfOm+$uF2cD7&N-f^M0qrS#0`@lSR&0D^w_kOa!v+}C<<7?ic zlim}Tyr+uWn$aW2I*JdsT`%gWuQhjkWbSD6o-FkqzS?oA*n9Yzw`qs@X=D4X{pQYn zox65*-2Bjc{EE5nNaxx8X4x)p`Jwizo8BW;okgcRb~l<$@bhx>L~}>;2OT%hx82&) ze&V#byT;rBU)trpbfEoseaEiL9k*_EeA3W<;Zl2Tb4Pu>dA7m3`<(aaF|&Sed*gL; z#|Q1_ubcb!n-%-oYwEq_``RxYG;dV5-LC1Z`>$^J6?l5mQw$~qPySd-Hx4854<+dBg+OC~9n@Y{v zeP;bNbNlVin(LiaJIo_HJ5QeKe1C7p?Ni>PA9+7*?0oN5$L)jdr*E74O3i~8%?pRy zuT*b+iL?!Rp|7ParVU>+!GZ$8t0eW!Wjh*^PK&UGHboQ$qN z*Lka|^Xw_t@3DGd;=$~WX(>aEC=g~u$_`N3^F^7q6-*r%oEsXMy&SN$;ckaZTE#|o$AHbI}i(@tLHXOsu zit&LF+)>wPp1X|EW9}=%=<$jPuMCc6etHu9CT8V*yW07S8kMZXnjME%{W$MvpDeV@vngws>sY zJhlxU+h&g~(^)4fwr%p*3O%;hUA-X5+W)2K@RY}#1F$7`4iuL`;xbrV@Rn0^;+>`D z#EVMJiC2-D6R#OHCtd|=PQ2mMoFl~rZ{sv4UeIYyylm5)5#lmdT*iqD-k535@#2D) zW14f4xI8W{LL=v7k(+`G!bW_9!k**Th1w-Gs9n;4R3jy+angm_C55O-(m9|NHBMSl zyQB~`NlFTZz7>BP_=h(*spaGE>um%;rvB5o-i3+7P|@p3XvLQj)0v=p@0UYZooR!40S`G&&V)j zG18ROAv;kgk+Dcm>O#?Htkwsf?(~J2K#!3Uq)xzbsOf-_NF8d6>_g`2vJd+VX%{dI zwclkO=S*0^87VHLw$O>y`PdVhgx8{Cu&^5kJeXXYY(*VKHPQnHv>^?s7d zJLEe7J5k5X7dGj#6Sw~nk2CSW4AgkKuW;pyZwpO%jF3CGIBDSI6Hb~qxk<^F#hjFI zQpDWHoLuLmnG+sFcdoE>o02a}S-Q;90Z#TX_$eoioLpmWFDJV=*}>dZmUfEoKf- zs1Iu<%lo)KtPNbQ=_=!wnq=BcDb@()uT^o{bX&@dBYNj@4aX=ocQS5%dW*|7S2Nzk zIHEh2w{tyMz**k$!M8#`EMqM1`h?Q<6Ran!8@+1_o<2bsU|9^u{-?~{y}gk*#dl$tv~VE!D-?ZsSw=XrlS zvfmoG-#Ra_-(c@W_jMGp{jpd2R_Ko%GvS?;CrQRGlI0I7DK+<-L5d2EgeH+LQ-88I2j9X0H~9p&sF2&9O|-q+O| z`uc~9SmoE#9j&D|WXdhKmT=9jrQC9BDO;?ylzX(b^nEU0QY+Il^8PxRa*wu_T#|CR zEcdCD+0v~gZ0Xh#wnS^`5y`V>wU+qXWec~Ko|5(O6SkH#$ntEt)>5``YblSQ))K#- z^0`WP$?`l>T1(hst)(@xULGl}rH5oW9{H`M?7^+2{&snUw3f1GwU+V>&|2cxn?0ws zls&z*lxLRKQuf%^5}uJ-OZ_R2)YcNey?KUcEs=IA_1l*{qP3JqMr$d1R%;1+Tx%(N zXlsdlp3*DwIsE-_Qp!9+T1$DxX)WQA-dZBdm$2uwmhi}GEj=#n^RZ0*{Ve;x^j%r6 z-=2Q^@Caxv@%z_adB3z<3D0b;rT%t!WVDvbc1n5VwU+w(Me14V?{}%E9C58B{{HvZ z>-RUme@TBU_4{|TOC0toBSH*{b*yButh`t{VTp8_V%dqs@*#_*af_wX70XU4kwz(& zom?!9Q!I^8>~~JT>~~5zSc>IfDE2#@bjD)o9L3UDB{D6RPFpM=zE}>LV!w0A!CNey zr$m-7kPV*~!JyxFz!Wiv9ITXDE^F6ieqTmPRj@&QmO%p;&favFwau zIXH`@Q?#{Ld?$so3w_axyBGgR@vVQ?Z;hishgw zmQGqCovv6qX|Wvq#d7kI%SCIk9DK#nDU0PGES64JEC*AuzkR=*rM|^-k|^=lD+hV8 zzyGBkB~s54*&ijce@gs=(mx5v=P2<%x8I)rNyk5_NWUsMimzPb%P#o+uLz!GkW4`- z#iJC82DT9tg;LB+p=e;YKtU-5suYg~LeaoZOGKd*uKn;V?d+U0x_}GLXGNS!A^0=M zAwb@OA9{W#Kn}#})ObL(K!8j-lU5Y92h^Ytn6?jr&BZj)CMixzPVZ9ZTwrU(`{VBT zJu3&7G%Mh=+_?s&Nx-2wr8qWsru#u0qdQ;m3ph&Wl4aa!I5Q_1C+qS~o&<1y?o7o^ z&W++CUi3Rt{B_{)oyy`&p3~#(XgGghxr|es%9D&UbV_kJ&+>V8JRHY6*NK`P{+e+j zPbF{&&*@Db;yAK*>i$AFp66pVf>+?-?_=2MDS3eK#q!sknz8C^n!RAj%j^i7^JahT3E?3N0i;0ADT>%xs8w;-F+)d}JeiCml7~H{6g_j8={;j`$g`KjrDUDidEi7e5!lRPem0?gep)!i9HQ zN1Y1<5GyWm;u0e+FN#aFxGWNvh2pYQT;j!LvA8S|mqc+%5SJC=k|Zw6#N{P%Nfwut z;<6eSm)K8#dCb!jzsK0(5Pvklf8atp_DM+ZCRGFZCsLp6C$# zA|)5!(SuWy-M&7_)8bcqIMDj~7%%u=pX7<+tKGbye^tZNhpOLpSqD%$pgrsWLh#j*@z5Jb|b?F+>)F&;Cs{$WZFP) zlXKH(Ak&fyQCHD1GMylIr=L*;jsOFCkXodSZ~%6iMm|C$bx1|hj&!0{Nn_H4I)1AE z#xG7QC%B{mX-fLhBjou@etz21V}S;!wroxl*G=Eyy%O{y+nFREDR#=4jC zNxLw@w{(78A2^Pr5FxQe8713 zL%!h*CHMGz^6p1ezoG# zuv1+2iA#mJl;OgalsXUj^LNiWj|lRxxEv6dqvCQ57cN`weAl19d(IOYYdPlqPS;X* zQ^yB7G|N@{0eRHGQEdM2k4B?zE-{o{YvCc`mv1Y83vK z7WOhvuVwhIDSkAMN7_)!fhmjh3MfLZMB0!E z$ven_NNZAwlzUb*F4`sY{P3pp83CLY7qRe78BRw06;C9;I>ORnPEK%gk&}a*ywAxg zPAWL5dUw;(5unh5vILOCjuHA(E$)&x>G|8v1fKN4(_!$)b?(bq;J-brmY7_!fG6 z$E5<@Nj*tjLe53q8Sr`P(}1T3`josW;9S(Z)MwPiU0y}1e!h#GOGX|owR{xNQp*uR zOD(VHEw#K0X{qIvy`{FEB88S(K6+`X?i+lssa*ZRdmL}d1w=~J;Y~uZ7OOv!i(*?F$6GwtAP12rC zvLBjcKg!6irHOZqEls@tY-!?%t)=M$uICz`2(&cuPPnCskDywbcFT77NU`NwDV|6? z^G_Nn`RR6+ZgX;tlTSFgNy$%nLH}tfgUy_L%3KjAC7kf9(VyJlBG);&#N1w%cJEp4a@krWY4f=_)XEOs6}ysUu^I%G?q_!($gz7b)ySk*mk6*I>kFR ze0x^>Y$e|*z9!=o-+*z3ic5EK>4A%9fd7X)`A^#U4}Lm(3OvZ^aEh<8IK`_jPcPJ% zhF`hi2aHbfWm-@F)Kuk9j-oaE2|;|pMO?zg1%DY3&q6o-9h)YdMOiqrE zUKW?y^|w3Ym&eBQU)uEar!R;vPsCr}jK^OaP4BrV zTubu-9$t}g-J&jtf-W9wl*U0gN`>S2DR3V)`MX&c2m;T~XCob>fQl~jT6e_)s3x2Va zovXXD94|OO1BL&!{L$kz&DYIlv;C7cu3bz1g_isqZQ^gV;lI%)_Y9mJ7(FRt;xV4e@hK;CK(< z7FIFdt&MFNGx?4-v~rMJo9qjX51AfxH+X1Oc%}3Ba9=kewgeA2IJa_OW%8jHd?5nx zg=!(gt0q==t4=;X!`Gdl9$LuIs*uXG>emKj^58sUCDF*VmVz zep<+wnvm+Wi?h%6_w^?zObZ!TGxy@4i)m+H^bH_rpues;?qQRCg9sa}h4eodQlVGI zy2Hl$!U-Fqg*;X@w|a1OfqTR>-%!GaS;`G3>@h8*Z@Hr)wsL~I-x%Kr!bV!KQG|`Q zU}Ff2&_ag6J_Xe)-NT>ojU{ZHTJHXM!X{`Ty~^iS46Z0}_a5n+NZ2GTB8>=_I8EMd>7Ht;=9*bA0+ zUnC4OrD}vI8=;tARWrmeim)-HcX?dJgvwxdpHUCu7{%1AnsyPRn4Hxb;u*zUtD;L8 z#pJ6xPXeP@3ql6M*9TV?xCc$}B{GWXT`l_(qbq8-Gz+LQz_J<50jk(Hm(e_+gAcB%oKrp69X`qT zI-^dYioW@b7Fbaiqnm+Ft&3}z&=l;R_PlQkqg$H1KS`HyC{rsL~g2G5R)8 z)Tda*=xU&1Mjm{zz&(DB?`1|`0UFTP zw}#OapikDh8df&VanD%bTgxc^@gZ6=f~$4+V^e+W7<~=spo4Lh6RLyVgD3h@8C?%l zvAUg6{4<~-qpBR$u@@(}N6+x3F{%R{UFE7?d2x<=Or+1j=tiK5X6cOLpC1aDP_ydd zoQA>fiSv90qnj-CKFDMg|LlNyt&yGK3g z%V!k-0Fm_SICt1MpNmoa!$ai16Pv=_(_Zv#VRWmkVeZ9=?opAxZHyKI6|Fg{SGk8x z^}WI9o7S>#F^YeJNUirBMi+F`LY}Cb+YsIq;-30~FNzjq0I%8dkX{KkJKO zG#02>OhPJM?tv41af~hms_3wY(ZxVTzr|I~b@vakNMLk1P%&Cu)eiUYX}&~8ldLto#OMm3B5-hAT;-0K?Mr5KB~alHt1ia5 z$ISArVstgoAqQQRtE%JNL!a=y%;+mXr_@bs2x)M+pLpK4hS3zD!q>waLfqr$`PMS} zD$szwzIBYgW<^sOU2jG0jBWrbMxpDX!##G6FO5+hsA4k*qZ@%Lc1UM51E`oi!>dEw zgC_Y5MmGT+UlVt6Vneul!c)FXMzerUs&QRh)ez@?{25<1qdAs(ALJ5xAAbp+?a)Ye zc%4z~6NDveR@IRu^BFAwicwe-S2x!^dZy3C=w_f8$5j(+!rg-(_ibTxD^TcL6<$O7 zZez3%C|2}?6RX1Aea86SVDwF(2$l|pSB1EHkM_OA=-WWyJ2l~T9;$KGQ4hs4x&$bC z{-C2uc&cwHqsxF|T%cwe7YU3m2de0s$Y_$Kh6gV(x&kPA9#*5#lFaBzpo)E0F}m7P zgYRWVUjd3Rye6c^<$i3sZw;d#M*X011s(e*%;p0_i)0jTn9X^iSX z75h3E-DoYF&S(Zu#p(v5o2)ftGMWWcu|qbaIY2Rv(aSWBa~aJ8iV<5E-bf?%bw;tZ z6?1h}T+LkfkSP!H87%;+=<8y1Gf<47x`~Z6hPE)e6)4t=y19)L-4o~gwlP`=RB7!E zM&AUgSm!N9-v%1c!S@cM3qol1ubEgE?jAYA7e#xj`_VuZtH&@J3sk8$j?slc6&)5a zx)`XUZ#<(*fU5q>=rW*+?<6p~+=?bLngmpNikBE&0aO`p$&9W98t9=1s~BAk6cHXq z@arR9M2Kw?my0FFuKW#W-^*(MY9>r0g5QoKXc_WnrAKhI-@w1QF|z# z(E^}~zAi>LThIqv7~Kj~@%3$t76QfEf|;Gx*f$t`(^~c|M&AaCSQ#VE;T|x-_YR{A zu>DuiC^|E^9}QIL%@{^wfhs)|$LK<9*+q;l2CDRNJflm1Do?SL(Ph?p6Bu0%RC%^U zMw6`QON_3t){xBTN}x&~uVQpHP-QlHnbB8(21dYxHH@YJ4U7QaT1H<5s@P#2qptx~ z#ziWl>#a4|8QlO>u}&JJI#9*x4n{WuRqT+?Xa-Qls|`js0aczjlhG`oioV&5=2+2O zM)RySyv`^N6jjag87;7)E=D&4RaS;AjBd4--NtAk(7*_I@CKuA0#%;kEk@r4s?4eH zFuI_-MYAY6z`7p|RH-3`(O960ug5XE&{}p8qlBpbyqD`WjGWY^E~0 z9;jkTJEI$bK6NeRn&Stn-1C?E(iqh(_4*u)ZUh<_S-x~eGk_|6VKBN0sM1;{qggx|+oT z%2TXjbTv@cVV=9+IN!^Rz5-Ota+_;5yN5sNTf=AyP!TZ=sT<-R5$RjY=&RPU>ll3v zsOZhrHLKl2r}hpbzYfZm^)fG)8rxVpg71H_1J6rq99XMxbJB&a0Z|?mNzx z&S(ZuF>`IK+UO3O=rb7I1XS!gHrH)-kDcesWHif)W;2>&MROU&KX;|*>wBG1yv7kH zM0E=r7rG}s>&s`f0H|U!7o(ejiU@CE%|iE(slF|YZUriQXI|Yr_o!LEZHyLL(Ki@< z6R7a&&5fJgQ(o}B#pv5WMU)v@7wUd&hVLCl7xZNB+gP*FJ#4x!iryC7j|LiO?LiEq zu|SpHjAL{mP_Z5_tXt?FJ=?d4(ZxW8M@_1l2S%3w6~42uYN5Ly_HT?X11fxS zNX-!Upvk@jMwbIsT1#X!38w)4Vr*328M)&0B zeRf7S0L6(w-Rj2G?#G|=r7@}l#mRKzyleB^)1x0a7~Kd|v2Qw~89){57>sTLs`@XZ zSwNMZ&t^2oS~i!_JfMnoUS|}q8^zgG zuvf1^K}G%V57S1CzZcx=L6EKItl#$NQ=VKgx?2o#*lX&gz<+#gTU1eSagNtz_3$4Qzjr70vmLDDMURFd#I zuTObKS&DBuiFlJYz&$Y8H-jX4hxc^FRNqVz@%nDS!TA+W_-2!cH+KUbYTXBg`sR`> z-jV_62_Vi!hzTpyuAr?55T!M%i_Ha*4*ulvakNI*L z5U**%9%{V@hT;_sH6mVE_&e%;e2~B%E(z)#77E7-kEj`SXV8p$1IHj8Fyr3fu{F;M zIc!+ft<;~V@_3qkjv z&_-H*3ur_2?QIGP;Ki6jdI{azQJ&l|D^)Cu3%HQ74*DGbnMA*OYLv2J@sIQxl z?&D=Id}#!{>sgY;t2t4if2c3tMu>QcB9Y7>Ld0=*AC$q@6VkXAaWL7Bt6dvRWyBGZ zyem0`5V6^pWtN5#LfbOFE2cXkB2@1GP;=M@g!X>Tf(gzgW2 zsJ&(z8tQwgA3@6pbUjDn074eR7i4pb1`_f%BMuuL{vC#v2*-d1@cX4hs8IA!KXN~2 zC?SPFWJPZ<;)DxHqva2yGMk2XStN5fAsd8iam{Iu5t1^Z%OYz>5V8U;C+kTbNyw5> zU2QELMMyMU5f&K%gT#y`q)<2~5Lo{WLVV6KT{Y*Ap)#A`wEjMeAY{YXuA0-v5|RRE zmaVTHN63otU1gHT6S4#opsZ)<1cCUXClc}){3B)}mDvh}pY;AVLLTN#g1QgqLql9B z*Viu&2Q~-J_3*8!;^v~>U-ljQjg~S517PbkZR~{VrS6DG_NHD@aAndIHa1&`r6AWYuc|qWC$OxHY zUNoh=*d=qNbdeJvd^-%y>R-w&Ys`L`2#Syip@zCi6)Fh0q&FlW!m` zMv|MNuP>j9AuSO@kAGTHi{A+6TPrQ;)R&wrEx0YJW!X$+x@|e>kei&mb~UFAU&;+% zxjg!YD_*cFKqM`x)cR8JIpQ(i@8ZWme-3qqv4gZHu@vu?n`PTSZrdRaZ7tt5{Zxq?(v9 zY?TFM@q%s5=o%1{(X`~siejlIQ4}|>D5kBI4Gt$1WudGZ&7D?7dCX~w@)_FW$9Q-> zJ8PRHt6R({WJ}bZBL(JgVA-^nvx~%9%o_T1wp3xWwsj`+;!9aaXJoLX7Usb&CtH|R zsY94z+0;}Gy-H}-AVsxM$&@NI2^zeK15PJQKS1@4zPoZ?y`$@cWc>)Ye4ZlWg6^*liUs3mCO6$$o_!TvLc_qE9UD-cM|{ghqc zj;@4(yH%5cqVF(&70QdJBT|dJo2f;#*!*`vUb-e}@kN0?3tYz!b7?JQM2|ie_XGbi z98k}L&uJJWCaQ4ul?YhT4N{Zy1F+uybh$t;X{jotB%E3Bw6xbGb~2E;h-mB)R+D;R z11O~$*VFp3IDyh_>YJcAj$!cp*9gOY(qogrJ<+_Ki-f^l!fck{;8tUM#>0y`TrAA1 z5r%6H*FA$TGwjUTWkbW$1e>tqagXJENu{dk zc~k+9p68Llli+#Z$7G?*YbCdhEUTt&HT~FR^Bu2H;?+t&k|1KjkH-=LWuAkYF%F{X zc&a^B|91k7a2B0HNGXr2Mku&_p{#@LaByeHlTjULmeIjSWfW_=L!pvV@G>oWZgTMR z4~5g!{^!9pLBbsb29glcZ6IBJF}GX-2>fJE^J?xT9lT(kFB}ZM<4#d2RUsNho1Mp_ zZgk3;w;*X;RP?VwW2pGIzw+_lq1Sj_bHl1r&~-OlW;4pUk>byO%EzCFD8IO_q&Rvp zEmB?$X&aw-1x$CiA{>%NJd!zEw_M549p*~&q~f@7-O(+FsSp@9c3_el=Ah$0x;aX1 z>Pif(r?Mwynm~9D)VN{ro9(#bv~5z}%}`$9(@|IELU<;)N1hg3H^T2#(QyU(NSJ4{ z!=H<0G$}8YZp3#i{VE{5mOGR1`mCb;J|wrSoxSnBT{%%toxSaRzWl4@KS;m()*r9` z{`wd1+$5-a{Y7pIzqHeGW;b=To*DwC?|hNk z8XDV5T-_5xt?>r(iRF&TPNDQk|o>7Jga%toqw)cd{e?&Y!*kJ10+lI=J4szHoEtM@v8MzdgD7 zW+Q=Oom=wpdZK&d)SX0sJ#nNF65HYrL@60>#8EQ!VeY-$`qX=)yNT9y`GdE2`Z9MC znfqWxVO#E9i#KE>$5vN1dOrR3o!-;8+duF6byr<(TOZk$pIMXdM~`ikx1(RV)wA>R zmF@JE-Olu_f$h#SYjPuky87!!`s&^IK~zda8b}I9ygpzwEsUgP%3CV>9G?bZa;0h8 zHfV<9{E2rXl&~_jyw)P!#=D-GGAuyXLwQ5sMj&IL^ik=6L*~sOEIEEQifT#sGfL+5 z2$GO_spBP)+wQX~WSJ4m;Y}vxufN~U@I0X1eDeAho+A(CSN*Q*HTpF`d3WNB!_*K3 zLAZxb{s%pK5B2^V9s37*{Xqmt?f0Y?_9ZcVV*T1af?p$r&YWwAUl$_vRHy%cA?yE# QN4)?2aO-{;_C1~d16%?U9{>OV diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/md.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/md.cpython-312.pyc deleted file mode 100644 index e03104680c8a248925b0d5a8eb0efcba377786a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24339 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 Pt$5E$-!tKkskQ$X962W+ diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc deleted file mode 100644 index c4d20341556dd4fd88c4fb794ca4868ab6e83907..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17119 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 diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index c4200caf1f8cbe42fd996eb9cde678b488c737ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13748 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 BAfEsL diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc deleted file mode 100644 index 051be3b752404dc2e686e3f7f36ccaccdf9d76bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 374 zcmYLEze~eF6uwKEwqA(1bm~&jrGq)NokUzpL6-^&4na6#a@woOUAViJwv+x9`Y(vP z|Adn`D47H&H>J3A@?tH%;l1yBKfd?gqvs)D%zM~p%Eb4AEX`g3INLGc2E-r$F^sJQ zrdD7<5Zi%G?ZL{j{XfQ~d$?eMGjW>b=^E;eGoff>M5SVaqmQE8gt;4XE_A3(PEDPb z-}c*c==YlCyh2DUB0_RR$oWtYB_%`_7v(M?e=?@(s4QVRubgy`jt>rdcVJd1&rfk* zq!cr*lL%*03}~cP0mi8q;}PW}oUk*TO>|%ImcO-)71MMx3!}^Mf+`&KL#e1HT*x#` z*px~$^n1FWP3G0zRK&xC?n%!qD_&I_#(mll!Y|8$rSB?$>u;;IEB6)EUQqoB)o(k` LsBvA9u4()Mu_0zJ diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/api.py b/venv/lib/python3.12/site-packages/charset_normalizer/api.py deleted file mode 100644 index ebd96390..00000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/api.py +++ /dev/null @@ -1,669 +0,0 @@ -from __future__ import annotations - -import logging -from os import PathLike -from typing import BinaryIO - -from .cd import ( - coherence_ratio, - encoding_languages, - mb_encoding_languages, - merge_coherence_ratios, -) -from .constant import IANA_SUPPORTED, TOO_BIG_SEQUENCE, TOO_SMALL_SEQUENCE, TRACE -from .md import mess_ratio -from .models import CharsetMatch, CharsetMatches -from .utils import ( - any_specified_encoding, - cut_sequence_chunks, - iana_name, - identify_sig_or_bom, - is_cp_similar, - is_multi_byte_encoding, - should_strip_sig_or_bom, -) - -logger = logging.getLogger("charset_normalizer") -explain_handler = logging.StreamHandler() -explain_handler.setFormatter( - logging.Formatter("%(asctime)s | %(levelname)s | %(message)s") -) - - -def from_bytes( - sequences: bytes | bytearray, - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.2, - cp_isolation: list[str] | None = None, - cp_exclusion: list[str] | None = None, - preemptive_behaviour: bool = True, - explain: bool = False, - language_threshold: float = 0.1, - enable_fallback: bool = True, -) -> CharsetMatches: - """ - Given a raw bytes sequence, return the best possibles charset usable to render str objects. - If there is no results, it is a strong indicator that the source is binary/not text. - By default, the process will extract 5 blocks of 512o each to assess the mess and coherence of a given sequence. - And will give up a particular code page after 20% of measured mess. Those criteria are customizable at will. - - The preemptive behavior DOES NOT replace the traditional detection workflow, it prioritize a particular code page - but never take it for granted. Can improve the performance. - - You may want to focus your attention to some code page or/and not others, use cp_isolation and cp_exclusion for that - purpose. - - This function will strip the SIG in the payload/sequence every time except on UTF-16, UTF-32. - By default the library does not setup any handler other than the NullHandler, if you choose to set the 'explain' - toggle to True it will alter the logger configuration to add a StreamHandler that is suitable for debugging. - Custom logging format and handler can be set manually. - """ - - if not isinstance(sequences, (bytearray, bytes)): - raise TypeError( - "Expected object of type bytes or bytearray, got: {}".format( - type(sequences) - ) - ) - - if explain: - previous_logger_level: int = logger.level - logger.addHandler(explain_handler) - logger.setLevel(TRACE) - - length: int = len(sequences) - - if length == 0: - logger.debug("Encoding detection on empty bytes, assuming utf_8 intention.") - if explain: # Defensive: ensure exit path clean handler - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level or logging.WARNING) - return CharsetMatches([CharsetMatch(sequences, "utf_8", 0.0, False, [], "")]) - - if cp_isolation is not None: - logger.log( - TRACE, - "cp_isolation is set. use this flag for debugging purpose. " - "limited list of encoding allowed : %s.", - ", ".join(cp_isolation), - ) - cp_isolation = [iana_name(cp, False) for cp in cp_isolation] - else: - cp_isolation = [] - - if cp_exclusion is not None: - logger.log( - TRACE, - "cp_exclusion is set. use this flag for debugging purpose. " - "limited list of encoding excluded : %s.", - ", ".join(cp_exclusion), - ) - cp_exclusion = [iana_name(cp, False) for cp in cp_exclusion] - else: - cp_exclusion = [] - - if length <= (chunk_size * steps): - logger.log( - TRACE, - "override steps (%i) and chunk_size (%i) as content does not fit (%i byte(s) given) parameters.", - steps, - chunk_size, - length, - ) - steps = 1 - chunk_size = length - - if steps > 1 and length / steps < chunk_size: - chunk_size = int(length / steps) - - is_too_small_sequence: bool = len(sequences) < TOO_SMALL_SEQUENCE - is_too_large_sequence: bool = len(sequences) >= TOO_BIG_SEQUENCE - - if is_too_small_sequence: - logger.log( - TRACE, - "Trying to detect encoding from a tiny portion of ({}) byte(s).".format( - length - ), - ) - elif is_too_large_sequence: - logger.log( - TRACE, - "Using lazy str decoding because the payload is quite large, ({}) byte(s).".format( - length - ), - ) - - prioritized_encodings: list[str] = [] - - specified_encoding: str | None = ( - any_specified_encoding(sequences) if preemptive_behaviour else None - ) - - if specified_encoding is not None: - prioritized_encodings.append(specified_encoding) - logger.log( - TRACE, - "Detected declarative mark in sequence. Priority +1 given for %s.", - specified_encoding, - ) - - tested: set[str] = set() - tested_but_hard_failure: list[str] = [] - tested_but_soft_failure: list[str] = [] - - fallback_ascii: CharsetMatch | None = None - fallback_u8: CharsetMatch | None = None - fallback_specified: CharsetMatch | None = None - - results: CharsetMatches = CharsetMatches() - - early_stop_results: CharsetMatches = CharsetMatches() - - sig_encoding, sig_payload = identify_sig_or_bom(sequences) - - if sig_encoding is not None: - prioritized_encodings.append(sig_encoding) - logger.log( - TRACE, - "Detected a SIG or BOM mark on first %i byte(s). Priority +1 given for %s.", - len(sig_payload), - sig_encoding, - ) - - prioritized_encodings.append("ascii") - - if "utf_8" not in prioritized_encodings: - prioritized_encodings.append("utf_8") - - for encoding_iana in prioritized_encodings + IANA_SUPPORTED: - if cp_isolation and encoding_iana not in cp_isolation: - continue - - if cp_exclusion and encoding_iana in cp_exclusion: - continue - - if encoding_iana in tested: - continue - - tested.add(encoding_iana) - - decoded_payload: str | None = None - bom_or_sig_available: bool = sig_encoding == encoding_iana - strip_sig_or_bom: bool = bom_or_sig_available and should_strip_sig_or_bom( - encoding_iana - ) - - if encoding_iana in {"utf_16", "utf_32"} and not bom_or_sig_available: - logger.log( - TRACE, - "Encoding %s won't be tested as-is because it require a BOM. Will try some sub-encoder LE/BE.", - encoding_iana, - ) - continue - if encoding_iana in {"utf_7"} and not bom_or_sig_available: - logger.log( - TRACE, - "Encoding %s won't be tested as-is because detection is unreliable without BOM/SIG.", - encoding_iana, - ) - continue - - try: - is_multi_byte_decoder: bool = is_multi_byte_encoding(encoding_iana) - except (ModuleNotFoundError, ImportError): - logger.log( - TRACE, - "Encoding %s does not provide an IncrementalDecoder", - encoding_iana, - ) - continue - - try: - if is_too_large_sequence and is_multi_byte_decoder is False: - str( - ( - sequences[: int(50e4)] - if strip_sig_or_bom is False - else sequences[len(sig_payload) : int(50e4)] - ), - encoding=encoding_iana, - ) - else: - decoded_payload = str( - ( - sequences - if strip_sig_or_bom is False - else sequences[len(sig_payload) :] - ), - encoding=encoding_iana, - ) - except (UnicodeDecodeError, LookupError) as e: - if not isinstance(e, LookupError): - logger.log( - TRACE, - "Code page %s does not fit given bytes sequence at ALL. %s", - encoding_iana, - str(e), - ) - tested_but_hard_failure.append(encoding_iana) - continue - - similar_soft_failure_test: bool = False - - for encoding_soft_failed in tested_but_soft_failure: - if is_cp_similar(encoding_iana, encoding_soft_failed): - similar_soft_failure_test = True - break - - if similar_soft_failure_test: - logger.log( - TRACE, - "%s is deemed too similar to code page %s and was consider unsuited already. Continuing!", - encoding_iana, - encoding_soft_failed, - ) - continue - - r_ = range( - 0 if not bom_or_sig_available else len(sig_payload), - length, - int(length / steps), - ) - - multi_byte_bonus: bool = ( - is_multi_byte_decoder - and decoded_payload is not None - and len(decoded_payload) < length - ) - - if multi_byte_bonus: - logger.log( - TRACE, - "Code page %s is a multi byte encoding table and it appear that at least one character " - "was encoded using n-bytes.", - encoding_iana, - ) - - max_chunk_gave_up: int = int(len(r_) / 4) - - max_chunk_gave_up = max(max_chunk_gave_up, 2) - early_stop_count: int = 0 - lazy_str_hard_failure = False - - md_chunks: list[str] = [] - md_ratios = [] - - try: - for chunk in cut_sequence_chunks( - sequences, - encoding_iana, - r_, - chunk_size, - bom_or_sig_available, - strip_sig_or_bom, - sig_payload, - is_multi_byte_decoder, - decoded_payload, - ): - md_chunks.append(chunk) - - md_ratios.append( - mess_ratio( - chunk, - threshold, - explain is True and 1 <= len(cp_isolation) <= 2, - ) - ) - - if md_ratios[-1] >= threshold: - early_stop_count += 1 - - if (early_stop_count >= max_chunk_gave_up) or ( - bom_or_sig_available and strip_sig_or_bom is False - ): - break - except ( - UnicodeDecodeError - ) as e: # Lazy str loading may have missed something there - logger.log( - TRACE, - "LazyStr Loading: After MD chunk decode, code page %s does not fit given bytes sequence at ALL. %s", - encoding_iana, - str(e), - ) - early_stop_count = max_chunk_gave_up - lazy_str_hard_failure = True - - # We might want to check the sequence again with the whole content - # Only if initial MD tests passes - if ( - not lazy_str_hard_failure - and is_too_large_sequence - and not is_multi_byte_decoder - ): - try: - sequences[int(50e3) :].decode(encoding_iana, errors="strict") - except UnicodeDecodeError as e: - logger.log( - TRACE, - "LazyStr Loading: After final lookup, code page %s does not fit given bytes sequence at ALL. %s", - encoding_iana, - str(e), - ) - tested_but_hard_failure.append(encoding_iana) - continue - - mean_mess_ratio: float = sum(md_ratios) / len(md_ratios) if md_ratios else 0.0 - if mean_mess_ratio >= threshold or early_stop_count >= max_chunk_gave_up: - tested_but_soft_failure.append(encoding_iana) - logger.log( - TRACE, - "%s was excluded because of initial chaos probing. Gave up %i time(s). " - "Computed mean chaos is %f %%.", - encoding_iana, - early_stop_count, - round(mean_mess_ratio * 100, ndigits=3), - ) - # Preparing those fallbacks in case we got nothing. - if ( - enable_fallback - and encoding_iana - in ["ascii", "utf_8", specified_encoding, "utf_16", "utf_32"] - and not lazy_str_hard_failure - ): - fallback_entry = CharsetMatch( - sequences, - encoding_iana, - threshold, - bom_or_sig_available, - [], - decoded_payload, - preemptive_declaration=specified_encoding, - ) - if encoding_iana == specified_encoding: - fallback_specified = fallback_entry - elif encoding_iana == "ascii": - fallback_ascii = fallback_entry - else: - fallback_u8 = fallback_entry - continue - - logger.log( - TRACE, - "%s passed initial chaos probing. Mean measured chaos is %f %%", - encoding_iana, - round(mean_mess_ratio * 100, ndigits=3), - ) - - if not is_multi_byte_decoder: - target_languages: list[str] = encoding_languages(encoding_iana) - else: - target_languages = mb_encoding_languages(encoding_iana) - - if target_languages: - logger.log( - TRACE, - "{} should target any language(s) of {}".format( - encoding_iana, str(target_languages) - ), - ) - - cd_ratios = [] - - # We shall skip the CD when its about ASCII - # Most of the time its not relevant to run "language-detection" on it. - if encoding_iana != "ascii": - for chunk in md_chunks: - chunk_languages = coherence_ratio( - chunk, - language_threshold, - ",".join(target_languages) if target_languages else None, - ) - - cd_ratios.append(chunk_languages) - - cd_ratios_merged = merge_coherence_ratios(cd_ratios) - - if cd_ratios_merged: - logger.log( - TRACE, - "We detected language {} using {}".format( - cd_ratios_merged, encoding_iana - ), - ) - - current_match = CharsetMatch( - sequences, - encoding_iana, - mean_mess_ratio, - bom_or_sig_available, - cd_ratios_merged, - ( - decoded_payload - if ( - is_too_large_sequence is False - or encoding_iana in [specified_encoding, "ascii", "utf_8"] - ) - else None - ), - preemptive_declaration=specified_encoding, - ) - - results.append(current_match) - - if ( - encoding_iana in [specified_encoding, "ascii", "utf_8"] - and mean_mess_ratio < 0.1 - ): - # If md says nothing to worry about, then... stop immediately! - if mean_mess_ratio == 0.0: - logger.debug( - "Encoding detection: %s is most likely the one.", - current_match.encoding, - ) - if explain: # Defensive: ensure exit path clean handler - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - return CharsetMatches([current_match]) - - early_stop_results.append(current_match) - - if ( - len(early_stop_results) - and (specified_encoding is None or specified_encoding in tested) - and "ascii" in tested - and "utf_8" in tested - ): - probable_result: CharsetMatch = early_stop_results.best() # type: ignore[assignment] - logger.debug( - "Encoding detection: %s is most likely the one.", - probable_result.encoding, - ) - if explain: # Defensive: ensure exit path clean handler - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - - return CharsetMatches([probable_result]) - - if encoding_iana == sig_encoding: - logger.debug( - "Encoding detection: %s is most likely the one as we detected a BOM or SIG within " - "the beginning of the sequence.", - encoding_iana, - ) - if explain: # Defensive: ensure exit path clean handler - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - return CharsetMatches([results[encoding_iana]]) - - if len(results) == 0: - if fallback_u8 or fallback_ascii or fallback_specified: - logger.log( - TRACE, - "Nothing got out of the detection process. Using ASCII/UTF-8/Specified fallback.", - ) - - if fallback_specified: - logger.debug( - "Encoding detection: %s will be used as a fallback match", - fallback_specified.encoding, - ) - results.append(fallback_specified) - elif ( - (fallback_u8 and fallback_ascii is None) - or ( - fallback_u8 - and fallback_ascii - and fallback_u8.fingerprint != fallback_ascii.fingerprint - ) - or (fallback_u8 is not None) - ): - logger.debug("Encoding detection: utf_8 will be used as a fallback match") - results.append(fallback_u8) - elif fallback_ascii: - logger.debug("Encoding detection: ascii will be used as a fallback match") - results.append(fallback_ascii) - - if results: - logger.debug( - "Encoding detection: Found %s as plausible (best-candidate) for content. With %i alternatives.", - results.best().encoding, # type: ignore - len(results) - 1, - ) - else: - logger.debug("Encoding detection: Unable to determine any suitable charset.") - - if explain: - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - - return results - - -def from_fp( - fp: BinaryIO, - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.20, - cp_isolation: list[str] | None = None, - cp_exclusion: list[str] | None = None, - preemptive_behaviour: bool = True, - explain: bool = False, - language_threshold: float = 0.1, - enable_fallback: bool = True, -) -> CharsetMatches: - """ - Same thing than the function from_bytes but using a file pointer that is already ready. - Will not close the file pointer. - """ - return from_bytes( - fp.read(), - steps, - chunk_size, - threshold, - cp_isolation, - cp_exclusion, - preemptive_behaviour, - explain, - language_threshold, - enable_fallback, - ) - - -def from_path( - path: str | bytes | PathLike, # type: ignore[type-arg] - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.20, - cp_isolation: list[str] | None = None, - cp_exclusion: list[str] | None = None, - preemptive_behaviour: bool = True, - explain: bool = False, - language_threshold: float = 0.1, - enable_fallback: bool = True, -) -> CharsetMatches: - """ - Same thing than the function from_bytes but with one extra step. Opening and reading given file path in binary mode. - Can raise IOError. - """ - with open(path, "rb") as fp: - return from_fp( - fp, - steps, - chunk_size, - threshold, - cp_isolation, - cp_exclusion, - preemptive_behaviour, - explain, - language_threshold, - enable_fallback, - ) - - -def is_binary( - fp_or_path_or_payload: PathLike | str | BinaryIO | bytes, # type: ignore[type-arg] - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.20, - cp_isolation: list[str] | None = None, - cp_exclusion: list[str] | None = None, - preemptive_behaviour: bool = True, - explain: bool = False, - language_threshold: float = 0.1, - enable_fallback: bool = False, -) -> bool: - """ - Detect if the given input (file, bytes, or path) points to a binary file. aka. not a string. - Based on the same main heuristic algorithms and default kwargs at the sole exception that fallbacks match - are disabled to be stricter around ASCII-compatible but unlikely to be a string. - """ - if isinstance(fp_or_path_or_payload, (str, PathLike)): - guesses = from_path( - fp_or_path_or_payload, - steps=steps, - chunk_size=chunk_size, - threshold=threshold, - cp_isolation=cp_isolation, - cp_exclusion=cp_exclusion, - preemptive_behaviour=preemptive_behaviour, - explain=explain, - language_threshold=language_threshold, - enable_fallback=enable_fallback, - ) - elif isinstance( - fp_or_path_or_payload, - ( - bytes, - bytearray, - ), - ): - guesses = from_bytes( - fp_or_path_or_payload, - steps=steps, - chunk_size=chunk_size, - threshold=threshold, - cp_isolation=cp_isolation, - cp_exclusion=cp_exclusion, - preemptive_behaviour=preemptive_behaviour, - explain=explain, - language_threshold=language_threshold, - enable_fallback=enable_fallback, - ) - else: - guesses = from_fp( - fp_or_path_or_payload, - steps=steps, - chunk_size=chunk_size, - threshold=threshold, - cp_isolation=cp_isolation, - cp_exclusion=cp_exclusion, - preemptive_behaviour=preemptive_behaviour, - explain=explain, - language_threshold=language_threshold, - enable_fallback=enable_fallback, - ) - - return not guesses diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/cd.py b/venv/lib/python3.12/site-packages/charset_normalizer/cd.py deleted file mode 100644 index 71a3ed51..00000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/cd.py +++ /dev/null @@ -1,395 +0,0 @@ -from __future__ import annotations - -import importlib -from codecs import IncrementalDecoder -from collections import Counter -from functools import lru_cache -from typing import Counter as TypeCounter - -from .constant import ( - FREQUENCIES, - KO_NAMES, - LANGUAGE_SUPPORTED_COUNT, - TOO_SMALL_SEQUENCE, - ZH_NAMES, -) -from .md import is_suspiciously_successive_range -from .models import CoherenceMatches -from .utils import ( - is_accentuated, - is_latin, - is_multi_byte_encoding, - is_unicode_range_secondary, - unicode_range, -) - - -def encoding_unicode_range(iana_name: str) -> list[str]: - """ - Return associated unicode ranges in a single byte code page. - """ - if is_multi_byte_encoding(iana_name): - raise OSError("Function not supported on multi-byte code page") - - decoder = importlib.import_module(f"encodings.{iana_name}").IncrementalDecoder - - p: IncrementalDecoder = decoder(errors="ignore") - seen_ranges: dict[str, int] = {} - character_count: int = 0 - - for i in range(0x40, 0xFF): - chunk: str = p.decode(bytes([i])) - - if chunk: - character_range: str | None = unicode_range(chunk) - - if character_range is None: - continue - - if is_unicode_range_secondary(character_range) is False: - if character_range not in seen_ranges: - seen_ranges[character_range] = 0 - seen_ranges[character_range] += 1 - character_count += 1 - - return sorted( - [ - character_range - for character_range in seen_ranges - if seen_ranges[character_range] / character_count >= 0.15 - ] - ) - - -def unicode_range_languages(primary_range: str) -> list[str]: - """ - Return inferred languages used with a unicode range. - """ - languages: list[str] = [] - - for language, characters in FREQUENCIES.items(): - for character in characters: - if unicode_range(character) == primary_range: - languages.append(language) - break - - return languages - - -@lru_cache() -def encoding_languages(iana_name: str) -> list[str]: - """ - Single-byte encoding language association. Some code page are heavily linked to particular language(s). - This function does the correspondence. - """ - unicode_ranges: list[str] = encoding_unicode_range(iana_name) - primary_range: str | None = None - - for specified_range in unicode_ranges: - if "Latin" not in specified_range: - primary_range = specified_range - break - - if primary_range is None: - return ["Latin Based"] - - return unicode_range_languages(primary_range) - - -@lru_cache() -def mb_encoding_languages(iana_name: str) -> list[str]: - """ - Multi-byte encoding language association. Some code page are heavily linked to particular language(s). - This function does the correspondence. - """ - if ( - iana_name.startswith("shift_") - or iana_name.startswith("iso2022_jp") - or iana_name.startswith("euc_j") - or iana_name == "cp932" - ): - return ["Japanese"] - if iana_name.startswith("gb") or iana_name in ZH_NAMES: - return ["Chinese"] - if iana_name.startswith("iso2022_kr") or iana_name in KO_NAMES: - return ["Korean"] - - return [] - - -@lru_cache(maxsize=LANGUAGE_SUPPORTED_COUNT) -def get_target_features(language: str) -> tuple[bool, bool]: - """ - Determine main aspects from a supported language if it contains accents and if is pure Latin. - """ - target_have_accents: bool = False - target_pure_latin: bool = True - - for character in FREQUENCIES[language]: - if not target_have_accents and is_accentuated(character): - target_have_accents = True - if target_pure_latin and is_latin(character) is False: - target_pure_latin = False - - return target_have_accents, target_pure_latin - - -def alphabet_languages( - characters: list[str], ignore_non_latin: bool = False -) -> list[str]: - """ - Return associated languages associated to given characters. - """ - languages: list[tuple[str, float]] = [] - - source_have_accents = any(is_accentuated(character) for character in characters) - - for language, language_characters in FREQUENCIES.items(): - target_have_accents, target_pure_latin = get_target_features(language) - - if ignore_non_latin and target_pure_latin is False: - continue - - if target_have_accents is False and source_have_accents: - continue - - character_count: int = len(language_characters) - - character_match_count: int = len( - [c for c in language_characters if c in characters] - ) - - ratio: float = character_match_count / character_count - - if ratio >= 0.2: - languages.append((language, ratio)) - - languages = sorted(languages, key=lambda x: x[1], reverse=True) - - return [compatible_language[0] for compatible_language in languages] - - -def characters_popularity_compare( - language: str, ordered_characters: list[str] -) -> float: - """ - Determine if a ordered characters list (by occurrence from most appearance to rarest) match a particular language. - The result is a ratio between 0. (absolutely no correspondence) and 1. (near perfect fit). - Beware that is function is not strict on the match in order to ease the detection. (Meaning close match is 1.) - """ - if language not in FREQUENCIES: - raise ValueError(f"{language} not available") - - character_approved_count: int = 0 - FREQUENCIES_language_set = set(FREQUENCIES[language]) - - ordered_characters_count: int = len(ordered_characters) - target_language_characters_count: int = len(FREQUENCIES[language]) - - large_alphabet: bool = target_language_characters_count > 26 - - for character, character_rank in zip( - ordered_characters, range(0, ordered_characters_count) - ): - if character not in FREQUENCIES_language_set: - continue - - character_rank_in_language: int = FREQUENCIES[language].index(character) - expected_projection_ratio: float = ( - target_language_characters_count / ordered_characters_count - ) - character_rank_projection: int = int(character_rank * expected_projection_ratio) - - if ( - large_alphabet is False - and abs(character_rank_projection - character_rank_in_language) > 4 - ): - continue - - if ( - large_alphabet is True - and abs(character_rank_projection - character_rank_in_language) - < target_language_characters_count / 3 - ): - character_approved_count += 1 - continue - - characters_before_source: list[str] = FREQUENCIES[language][ - 0:character_rank_in_language - ] - characters_after_source: list[str] = FREQUENCIES[language][ - character_rank_in_language: - ] - characters_before: list[str] = ordered_characters[0:character_rank] - characters_after: list[str] = ordered_characters[character_rank:] - - before_match_count: int = len( - set(characters_before) & set(characters_before_source) - ) - - after_match_count: int = len( - set(characters_after) & set(characters_after_source) - ) - - if len(characters_before_source) == 0 and before_match_count <= 4: - character_approved_count += 1 - continue - - if len(characters_after_source) == 0 and after_match_count <= 4: - character_approved_count += 1 - continue - - if ( - before_match_count / len(characters_before_source) >= 0.4 - or after_match_count / len(characters_after_source) >= 0.4 - ): - character_approved_count += 1 - continue - - return character_approved_count / len(ordered_characters) - - -def alpha_unicode_split(decoded_sequence: str) -> list[str]: - """ - Given a decoded text sequence, return a list of str. Unicode range / alphabet separation. - Ex. a text containing English/Latin with a bit a Hebrew will return two items in the resulting list; - One containing the latin letters and the other hebrew. - """ - layers: dict[str, str] = {} - - for character in decoded_sequence: - if character.isalpha() is False: - continue - - character_range: str | None = unicode_range(character) - - if character_range is None: - continue - - layer_target_range: str | None = None - - for discovered_range in layers: - if ( - is_suspiciously_successive_range(discovered_range, character_range) - is False - ): - layer_target_range = discovered_range - break - - if layer_target_range is None: - layer_target_range = character_range - - if layer_target_range not in layers: - layers[layer_target_range] = character.lower() - continue - - layers[layer_target_range] += character.lower() - - return list(layers.values()) - - -def merge_coherence_ratios(results: list[CoherenceMatches]) -> CoherenceMatches: - """ - This function merge results previously given by the function coherence_ratio. - The return type is the same as coherence_ratio. - """ - per_language_ratios: dict[str, list[float]] = {} - for result in results: - for sub_result in result: - language, ratio = sub_result - if language not in per_language_ratios: - per_language_ratios[language] = [ratio] - continue - per_language_ratios[language].append(ratio) - - merge = [ - ( - language, - round( - sum(per_language_ratios[language]) / len(per_language_ratios[language]), - 4, - ), - ) - for language in per_language_ratios - ] - - return sorted(merge, key=lambda x: x[1], reverse=True) - - -def filter_alt_coherence_matches(results: CoherenceMatches) -> CoherenceMatches: - """ - We shall NOT return "English—" in CoherenceMatches because it is an alternative - of "English". This function only keeps the best match and remove the em-dash in it. - """ - index_results: dict[str, list[float]] = dict() - - for result in results: - language, ratio = result - no_em_name: str = language.replace("—", "") - - if no_em_name not in index_results: - index_results[no_em_name] = [] - - index_results[no_em_name].append(ratio) - - if any(len(index_results[e]) > 1 for e in index_results): - filtered_results: CoherenceMatches = [] - - for language in index_results: - filtered_results.append((language, max(index_results[language]))) - - return filtered_results - - return results - - -@lru_cache(maxsize=2048) -def coherence_ratio( - decoded_sequence: str, threshold: float = 0.1, lg_inclusion: str | None = None -) -> CoherenceMatches: - """ - Detect ANY language that can be identified in given sequence. The sequence will be analysed by layers. - A layer = Character extraction by alphabets/ranges. - """ - - results: list[tuple[str, float]] = [] - ignore_non_latin: bool = False - - sufficient_match_count: int = 0 - - lg_inclusion_list = lg_inclusion.split(",") if lg_inclusion is not None else [] - if "Latin Based" in lg_inclusion_list: - ignore_non_latin = True - lg_inclusion_list.remove("Latin Based") - - for layer in alpha_unicode_split(decoded_sequence): - sequence_frequencies: TypeCounter[str] = Counter(layer) - most_common = sequence_frequencies.most_common() - - character_count: int = sum(o for c, o in most_common) - - if character_count <= TOO_SMALL_SEQUENCE: - continue - - popular_character_ordered: list[str] = [c for c, o in most_common] - - for language in lg_inclusion_list or alphabet_languages( - popular_character_ordered, ignore_non_latin - ): - ratio: float = characters_popularity_compare( - language, popular_character_ordered - ) - - if ratio < threshold: - continue - elif ratio >= 0.8: - sufficient_match_count += 1 - - results.append((language, round(ratio, 4))) - - if sufficient_match_count >= 3: - break - - return sorted( - filter_alt_coherence_matches(results), key=lambda x: x[1], reverse=True - ) diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py b/venv/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py deleted file mode 100644 index 543a5a4d..00000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import annotations - -from .__main__ import cli_detect, query_yes_no - -__all__ = ( - "cli_detect", - "query_yes_no", -) diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py b/venv/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py deleted file mode 100644 index cb64156a..00000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py +++ /dev/null @@ -1,381 +0,0 @@ -from __future__ import annotations - -import argparse -import sys -import typing -from json import dumps -from os.path import abspath, basename, dirname, join, realpath -from platform import python_version -from unicodedata import unidata_version - -import charset_normalizer.md as md_module -from charset_normalizer import from_fp -from charset_normalizer.models import CliDetectionResult -from charset_normalizer.version import __version__ - - -def query_yes_no(question: str, default: str = "yes") -> bool: - """Ask a yes/no question via input() and return their answer. - - "question" is a string that is presented to the user. - "default" is the presumed answer if the user just hits . - It must be "yes" (the default), "no" or None (meaning - an answer is required of the user). - - The "answer" return value is True for "yes" or False for "no". - - Credit goes to (c) https://stackoverflow.com/questions/3041986/apt-command-line-interface-like-yes-no-input - """ - valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False} - if default is None: - prompt = " [y/n] " - elif default == "yes": - prompt = " [Y/n] " - elif default == "no": - prompt = " [y/N] " - else: - raise ValueError("invalid default answer: '%s'" % default) - - while True: - sys.stdout.write(question + prompt) - choice = input().lower() - if default is not None and choice == "": - return valid[default] - elif choice in valid: - return valid[choice] - else: - sys.stdout.write("Please respond with 'yes' or 'no' (or 'y' or 'n').\n") - - -class FileType: - """Factory for creating file object types - - Instances of FileType are typically passed as type= arguments to the - ArgumentParser add_argument() method. - - Keyword Arguments: - - mode -- A string indicating how the file is to be opened. Accepts the - same values as the builtin open() function. - - bufsize -- The file's desired buffer size. Accepts the same values as - the builtin open() function. - - encoding -- The file's encoding. Accepts the same values as the - builtin open() function. - - errors -- A string indicating how encoding and decoding errors are to - be handled. Accepts the same value as the builtin open() function. - - Backported from CPython 3.12 - """ - - def __init__( - self, - mode: str = "r", - bufsize: int = -1, - encoding: str | None = None, - errors: str | None = None, - ): - self._mode = mode - self._bufsize = bufsize - self._encoding = encoding - self._errors = errors - - def __call__(self, string: str) -> typing.IO: # type: ignore[type-arg] - # the special argument "-" means sys.std{in,out} - if string == "-": - if "r" in self._mode: - return sys.stdin.buffer if "b" in self._mode else sys.stdin - elif any(c in self._mode for c in "wax"): - return sys.stdout.buffer if "b" in self._mode else sys.stdout - else: - msg = f'argument "-" with mode {self._mode}' - raise ValueError(msg) - - # all other arguments are used as file names - try: - return open(string, self._mode, self._bufsize, self._encoding, self._errors) - except OSError as e: - message = f"can't open '{string}': {e}" - raise argparse.ArgumentTypeError(message) - - def __repr__(self) -> str: - args = self._mode, self._bufsize - kwargs = [("encoding", self._encoding), ("errors", self._errors)] - args_str = ", ".join( - [repr(arg) for arg in args if arg != -1] - + [f"{kw}={arg!r}" for kw, arg in kwargs if arg is not None] - ) - return f"{type(self).__name__}({args_str})" - - -def cli_detect(argv: list[str] | None = None) -> int: - """ - CLI assistant using ARGV and ArgumentParser - :param argv: - :return: 0 if everything is fine, anything else equal trouble - """ - parser = argparse.ArgumentParser( - description="The Real First Universal Charset Detector. " - "Discover originating encoding used on text file. " - "Normalize text to unicode." - ) - - parser.add_argument( - "files", type=FileType("rb"), nargs="+", help="File(s) to be analysed" - ) - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - dest="verbose", - help="Display complementary information about file if any. " - "Stdout will contain logs about the detection process.", - ) - parser.add_argument( - "-a", - "--with-alternative", - action="store_true", - default=False, - dest="alternatives", - help="Output complementary possibilities if any. Top-level JSON WILL be a list.", - ) - parser.add_argument( - "-n", - "--normalize", - action="store_true", - default=False, - dest="normalize", - help="Permit to normalize input file. If not set, program does not write anything.", - ) - parser.add_argument( - "-m", - "--minimal", - action="store_true", - default=False, - dest="minimal", - help="Only output the charset detected to STDOUT. Disabling JSON output.", - ) - parser.add_argument( - "-r", - "--replace", - action="store_true", - default=False, - dest="replace", - help="Replace file when trying to normalize it instead of creating a new one.", - ) - parser.add_argument( - "-f", - "--force", - action="store_true", - default=False, - dest="force", - help="Replace file without asking if you are sure, use this flag with caution.", - ) - parser.add_argument( - "-i", - "--no-preemptive", - action="store_true", - default=False, - dest="no_preemptive", - help="Disable looking at a charset declaration to hint the detector.", - ) - parser.add_argument( - "-t", - "--threshold", - action="store", - default=0.2, - type=float, - dest="threshold", - help="Define a custom maximum amount of noise allowed in decoded content. 0. <= noise <= 1.", - ) - parser.add_argument( - "--version", - action="version", - version="Charset-Normalizer {} - Python {} - Unicode {} - SpeedUp {}".format( - __version__, - python_version(), - unidata_version, - "OFF" if md_module.__file__.lower().endswith(".py") else "ON", - ), - help="Show version information and exit.", - ) - - args = parser.parse_args(argv) - - if args.replace is True and args.normalize is False: - if args.files: - for my_file in args.files: - my_file.close() - print("Use --replace in addition of --normalize only.", file=sys.stderr) - return 1 - - if args.force is True and args.replace is False: - if args.files: - for my_file in args.files: - my_file.close() - print("Use --force in addition of --replace only.", file=sys.stderr) - return 1 - - if args.threshold < 0.0 or args.threshold > 1.0: - if args.files: - for my_file in args.files: - my_file.close() - print("--threshold VALUE should be between 0. AND 1.", file=sys.stderr) - return 1 - - x_ = [] - - for my_file in args.files: - matches = from_fp( - my_file, - threshold=args.threshold, - explain=args.verbose, - preemptive_behaviour=args.no_preemptive is False, - ) - - best_guess = matches.best() - - if best_guess is None: - print( - 'Unable to identify originating encoding for "{}". {}'.format( - my_file.name, - ( - "Maybe try increasing maximum amount of chaos." - if args.threshold < 1.0 - else "" - ), - ), - file=sys.stderr, - ) - x_.append( - CliDetectionResult( - abspath(my_file.name), - None, - [], - [], - "Unknown", - [], - False, - 1.0, - 0.0, - None, - True, - ) - ) - else: - x_.append( - CliDetectionResult( - abspath(my_file.name), - best_guess.encoding, - best_guess.encoding_aliases, - [ - cp - for cp in best_guess.could_be_from_charset - if cp != best_guess.encoding - ], - best_guess.language, - best_guess.alphabets, - best_guess.bom, - best_guess.percent_chaos, - best_guess.percent_coherence, - None, - True, - ) - ) - - if len(matches) > 1 and args.alternatives: - for el in matches: - if el != best_guess: - x_.append( - CliDetectionResult( - abspath(my_file.name), - el.encoding, - el.encoding_aliases, - [ - cp - for cp in el.could_be_from_charset - if cp != el.encoding - ], - el.language, - el.alphabets, - el.bom, - el.percent_chaos, - el.percent_coherence, - None, - False, - ) - ) - - if args.normalize is True: - if best_guess.encoding.startswith("utf") is True: - print( - '"{}" file does not need to be normalized, as it already came from unicode.'.format( - my_file.name - ), - file=sys.stderr, - ) - if my_file.closed is False: - my_file.close() - continue - - dir_path = dirname(realpath(my_file.name)) - file_name = basename(realpath(my_file.name)) - - o_: list[str] = file_name.split(".") - - if args.replace is False: - o_.insert(-1, best_guess.encoding) - if my_file.closed is False: - my_file.close() - elif ( - args.force is False - and query_yes_no( - 'Are you sure to normalize "{}" by replacing it ?'.format( - my_file.name - ), - "no", - ) - is False - ): - if my_file.closed is False: - my_file.close() - continue - - try: - x_[0].unicode_path = join(dir_path, ".".join(o_)) - - with open(x_[0].unicode_path, "wb") as fp: - fp.write(best_guess.output()) - except OSError as e: - print(str(e), file=sys.stderr) - if my_file.closed is False: - my_file.close() - return 2 - - if my_file.closed is False: - my_file.close() - - if args.minimal is False: - print( - dumps( - [el.__dict__ for el in x_] if len(x_) > 1 else x_[0].__dict__, - ensure_ascii=True, - indent=4, - ) - ) - else: - for my_file in args.files: - print( - ", ".join( - [ - el.encoding or "undefined" - for el in x_ - if el.path == abspath(my_file.name) - ] - ) - ) - - return 0 - - -if __name__ == "__main__": - cli_detect() diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 8b39ba96488c718195e70648975dd5a5805cf035..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335 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 O&Tk$CyGvh3hW", - "=", - ":", - "/", - "&", - ";", - "{", - "}", - "[", - "]", - ",", - "|", - '"', - "-", - "(", - ")", -} - -# Sample character sets — replace with full lists if needed -COMMON_CHINESE_CHARACTERS = "的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严龙飞" - -COMMON_JAPANESE_CHARACTERS = "日一国年大十二本中長出三時行見月分後前生五間上東四今金九入学高円子外八六下来気小七山話女北午百書先名川千水半男西電校語土木聞食車何南万毎白天母火右読友左休父雨" - -COMMON_KOREAN_CHARACTERS = "一二三四五六七八九十百千萬上下左右中人女子大小山川日月火水木金土父母天地國名年時文校學生" - -# Combine all into a set -COMMON_CJK_CHARACTERS = set( - "".join( - [ - COMMON_CHINESE_CHARACTERS, - COMMON_JAPANESE_CHARACTERS, - COMMON_KOREAN_CHARACTERS, - ] - ) -) - -KO_NAMES: set[str] = {"johab", "cp949", "euc_kr"} -ZH_NAMES: set[str] = {"big5", "cp950", "big5hkscs", "hz"} - -# Logging LEVEL below DEBUG -TRACE: int = 5 - - -# Language label that contain the em dash "—" -# character are to be considered alternative seq to origin -FREQUENCIES: dict[str, list[str]] = { - "English": [ - "e", - "a", - "t", - "i", - "o", - "n", - "s", - "r", - "h", - "l", - "d", - "c", - "u", - "m", - "f", - "p", - "g", - "w", - "y", - "b", - "v", - "k", - "x", - "j", - "z", - "q", - ], - "English—": [ - "e", - "a", - "t", - "i", - "o", - "n", - "s", - "r", - "h", - "l", - "d", - "c", - "m", - "u", - "f", - "p", - "g", - "w", - "b", - "y", - "v", - "k", - "j", - "x", - "z", - "q", - ], - "German": [ - "e", - "n", - "i", - "r", - "s", - "t", - "a", - "d", - "h", - "u", - "l", - "g", - "o", - "c", - "m", - "b", - "f", - "k", - "w", - "z", - "p", - "v", - "ü", - "ä", - "ö", - "j", - ], - "French": [ - "e", - "a", - "s", - "n", - "i", - "t", - "r", - "l", - "u", - "o", - "d", - "c", - "p", - "m", - "é", - "v", - "g", - "f", - "b", - "h", - "q", - "à", - "x", - "è", - "y", - "j", - ], - "Dutch": [ - "e", - "n", - "a", - "i", - "r", - "t", - "o", - "d", - "s", - "l", - "g", - "h", - "v", - "m", - "u", - "k", - "c", - "p", - "b", - "w", - "j", - "z", - "f", - "y", - "x", - "ë", - ], - "Italian": [ - "e", - "i", - "a", - "o", - "n", - "l", - "t", - "r", - "s", - "c", - "d", - "u", - "p", - "m", - "g", - "v", - "f", - "b", - "z", - "h", - "q", - "è", - "à", - "k", - "y", - "ò", - ], - "Polish": [ - "a", - "i", - "o", - "e", - "n", - "r", - "z", - "w", - "s", - "c", - "t", - "k", - "y", - "d", - "p", - "m", - "u", - "l", - "j", - "ł", - "g", - "b", - "h", - "ą", - "ę", - "ó", - ], - "Spanish": [ - "e", - "a", - "o", - "n", - "s", - "r", - "i", - "l", - "d", - "t", - "c", - "u", - "m", - "p", - "b", - "g", - "v", - "f", - "y", - "ó", - "h", - "q", - "í", - "j", - "z", - "á", - ], - "Russian": [ - "о", - "а", - "е", - "и", - "н", - "с", - "т", - "р", - "в", - "л", - "к", - "м", - "д", - "п", - "у", - "г", - "я", - "ы", - "з", - "б", - "й", - "ь", - "ч", - "х", - "ж", - "ц", - ], - # Jap-Kanji - "Japanese": [ - "人", - "一", - "大", - "亅", - "丁", - "丨", - "竹", - "笑", - "口", - "日", - "今", - "二", - "彳", - "行", - "十", - "土", - "丶", - "寸", - "寺", - "時", - "乙", - "丿", - "乂", - "气", - "気", - "冂", - "巾", - "亠", - "市", - "目", - "儿", - "見", - "八", - "小", - "凵", - "県", - "月", - "彐", - "門", - "間", - "木", - "東", - "山", - "出", - "本", - "中", - "刀", - "分", - "耳", - "又", - "取", - "最", - "言", - "田", - "心", - "思", - "刂", - "前", - "京", - "尹", - "事", - "生", - "厶", - "云", - "会", - "未", - "来", - "白", - "冫", - "楽", - "灬", - "馬", - "尸", - "尺", - "駅", - "明", - "耂", - "者", - "了", - "阝", - "都", - "高", - "卜", - "占", - "厂", - "广", - "店", - "子", - "申", - "奄", - "亻", - "俺", - "上", - "方", - "冖", - "学", - "衣", - "艮", - "食", - "自", - ], - # Jap-Katakana - "Japanese—": [ - "ー", - "ン", - "ス", - "・", - "ル", - "ト", - "リ", - "イ", - "ア", - "ラ", - "ッ", - "ク", - "ド", - "シ", - "レ", - "ジ", - "タ", - "フ", - "ロ", - "カ", - "テ", - "マ", - "ィ", - "グ", - "バ", - "ム", - "プ", - "オ", - "コ", - "デ", - "ニ", - "ウ", - "メ", - "サ", - "ビ", - "ナ", - "ブ", - "ャ", - "エ", - "ュ", - "チ", - "キ", - "ズ", - "ダ", - "パ", - "ミ", - "ェ", - "ョ", - "ハ", - "セ", - "ベ", - "ガ", - "モ", - "ツ", - "ネ", - "ボ", - "ソ", - "ノ", - "ァ", - "ヴ", - "ワ", - "ポ", - "ペ", - "ピ", - "ケ", - "ゴ", - "ギ", - "ザ", - "ホ", - "ゲ", - "ォ", - "ヤ", - "ヒ", - "ユ", - "ヨ", - "ヘ", - "ゼ", - "ヌ", - "ゥ", - "ゾ", - "ヶ", - "ヂ", - "ヲ", - "ヅ", - "ヵ", - "ヱ", - "ヰ", - "ヮ", - "ヽ", - "゠", - "ヾ", - "ヷ", - "ヿ", - "ヸ", - "ヹ", - "ヺ", - ], - # Jap-Hiragana - "Japanese——": [ - "の", - "に", - "る", - "た", - "と", - "は", - "し", - "い", - "を", - "で", - "て", - "が", - "な", - "れ", - "か", - "ら", - "さ", - "っ", - "り", - "す", - "あ", - "も", - "こ", - "ま", - "う", - "く", - "よ", - "き", - "ん", - "め", - "お", - "け", - "そ", - "つ", - "だ", - "や", - "え", - "ど", - "わ", - "ち", - "み", - "せ", - "じ", - "ば", - "へ", - "び", - "ず", - "ろ", - "ほ", - "げ", - "む", - "べ", - "ひ", - "ょ", - "ゆ", - "ぶ", - "ご", - "ゃ", - "ね", - "ふ", - "ぐ", - "ぎ", - "ぼ", - "ゅ", - "づ", - "ざ", - "ぞ", - "ぬ", - "ぜ", - "ぱ", - "ぽ", - "ぷ", - "ぴ", - "ぃ", - "ぁ", - "ぇ", - "ぺ", - "ゞ", - "ぢ", - "ぉ", - "ぅ", - "ゐ", - "ゝ", - "ゑ", - "゛", - "゜", - "ゎ", - "ゔ", - "゚", - "ゟ", - "゙", - "ゕ", - "ゖ", - ], - "Portuguese": [ - "a", - "e", - "o", - "s", - "i", - "r", - "d", - "n", - "t", - "m", - "u", - "c", - "l", - "p", - "g", - "v", - "b", - "f", - "h", - "ã", - "q", - "é", - "ç", - "á", - "z", - "í", - ], - "Swedish": [ - "e", - "a", - "n", - "r", - "t", - "s", - "i", - "l", - "d", - "o", - "m", - "k", - "g", - "v", - "h", - "f", - "u", - "p", - "ä", - "c", - "b", - "ö", - "å", - "y", - "j", - "x", - ], - "Chinese": [ - "的", - "一", - "是", - "不", - "了", - "在", - "人", - "有", - "我", - "他", - "这", - "个", - "们", - "中", - "来", - "上", - "大", - "为", - "和", - "国", - "地", - "到", - "以", - "说", - "时", - "要", - "就", - "出", - "会", - "可", - "也", - "你", - "对", - "生", - "能", - "而", - "子", - "那", - "得", - "于", - "着", - "下", - "自", - "之", - "年", - "过", - "发", - "后", - "作", - "里", - "用", - "道", - "行", - "所", - "然", - "家", - "种", - "事", - "成", - "方", - "多", - "经", - "么", - "去", - "法", - "学", - "如", - "都", - "同", - "现", - "当", - "没", - "动", - "面", - "起", - "看", - "定", - "天", - "分", - "还", - "进", - "好", - "小", - "部", - "其", - "些", - "主", - "样", - "理", - "心", - "她", - "本", - "前", - "开", - "但", - "因", - "只", - "从", - "想", - "实", - ], - "Ukrainian": [ - "о", - "а", - "н", - "і", - "и", - "р", - "в", - "т", - "е", - "с", - "к", - "л", - "у", - "д", - "м", - "п", - "з", - "я", - "ь", - "б", - "г", - "й", - "ч", - "х", - "ц", - "ї", - ], - "Norwegian": [ - "e", - "r", - "n", - "t", - "a", - "s", - "i", - "o", - "l", - "d", - "g", - "k", - "m", - "v", - "f", - "p", - "u", - "b", - "h", - "å", - "y", - "j", - "ø", - "c", - "æ", - "w", - ], - "Finnish": [ - "a", - "i", - "n", - "t", - "e", - "s", - "l", - "o", - "u", - "k", - "ä", - "m", - "r", - "v", - "j", - "h", - "p", - "y", - "d", - "ö", - "g", - "c", - "b", - "f", - "w", - "z", - ], - "Vietnamese": [ - "n", - "h", - "t", - "i", - "c", - "g", - "a", - "o", - "u", - "m", - "l", - "r", - "à", - "đ", - "s", - "e", - "v", - "p", - "b", - "y", - "ư", - "d", - "á", - "k", - "ộ", - "ế", - ], - "Czech": [ - "o", - "e", - "a", - "n", - "t", - "s", - "i", - "l", - "v", - "r", - "k", - "d", - "u", - "m", - "p", - "í", - "c", - "h", - "z", - "á", - "y", - "j", - "b", - "ě", - "é", - "ř", - ], - "Hungarian": [ - "e", - "a", - "t", - "l", - "s", - "n", - "k", - "r", - "i", - "o", - "z", - "á", - "é", - "g", - "m", - "b", - "y", - "v", - "d", - "h", - "u", - "p", - "j", - "ö", - "f", - "c", - ], - "Korean": [ - "이", - "다", - "에", - "의", - "는", - "로", - "하", - "을", - "가", - "고", - "지", - "서", - "한", - "은", - "기", - "으", - "년", - "대", - "사", - "시", - "를", - "리", - "도", - "인", - "스", - "일", - ], - "Indonesian": [ - "a", - "n", - "e", - "i", - "r", - "t", - "u", - "s", - "d", - "k", - "m", - "l", - "g", - "p", - "b", - "o", - "h", - "y", - "j", - "c", - "w", - "f", - "v", - "z", - "x", - "q", - ], - "Turkish": [ - "a", - "e", - "i", - "n", - "r", - "l", - "ı", - "k", - "d", - "t", - "s", - "m", - "y", - "u", - "o", - "b", - "ü", - "ş", - "v", - "g", - "z", - "h", - "c", - "p", - "ç", - "ğ", - ], - "Romanian": [ - "e", - "i", - "a", - "r", - "n", - "t", - "u", - "l", - "o", - "c", - "s", - "d", - "p", - "m", - "ă", - "f", - "v", - "î", - "g", - "b", - "ș", - "ț", - "z", - "h", - "â", - "j", - ], - "Farsi": [ - "ا", - "ی", - "ر", - "د", - "ن", - "ه", - "و", - "م", - "ت", - "ب", - "س", - "ل", - "ک", - "ش", - "ز", - "ف", - "گ", - "ع", - "خ", - "ق", - "ج", - "آ", - "پ", - "ح", - "ط", - "ص", - ], - "Arabic": [ - "ا", - "ل", - "ي", - "م", - "و", - "ن", - "ر", - "ت", - "ب", - "ة", - "ع", - "د", - "س", - "ف", - "ه", - "ك", - "ق", - "أ", - "ح", - "ج", - "ش", - "ط", - "ص", - "ى", - "خ", - "إ", - ], - "Danish": [ - "e", - "r", - "n", - "t", - "a", - "i", - "s", - "d", - "l", - "o", - "g", - "m", - "k", - "f", - "v", - "u", - "b", - "h", - "p", - "å", - "y", - "ø", - "æ", - "c", - "j", - "w", - ], - "Serbian": [ - "а", - "и", - "о", - "е", - "н", - "р", - "с", - "у", - "т", - "к", - "ј", - "в", - "д", - "м", - "п", - "л", - "г", - "з", - "б", - "a", - "i", - "e", - "o", - "n", - "ц", - "ш", - ], - "Lithuanian": [ - "i", - "a", - "s", - "o", - "r", - "e", - "t", - "n", - "u", - "k", - "m", - "l", - "p", - "v", - "d", - "j", - "g", - "ė", - "b", - "y", - "ų", - "š", - "ž", - "c", - "ą", - "į", - ], - "Slovene": [ - "e", - "a", - "i", - "o", - "n", - "r", - "s", - "l", - "t", - "j", - "v", - "k", - "d", - "p", - "m", - "u", - "z", - "b", - "g", - "h", - "č", - "c", - "š", - "ž", - "f", - "y", - ], - "Slovak": [ - "o", - "a", - "e", - "n", - "i", - "r", - "v", - "t", - "s", - "l", - "k", - "d", - "m", - "p", - "u", - "c", - "h", - "j", - "b", - "z", - "á", - "y", - "ý", - "í", - "č", - "é", - ], - "Hebrew": [ - "י", - "ו", - "ה", - "ל", - "ר", - "ב", - "ת", - "מ", - "א", - "ש", - "נ", - "ע", - "ם", - "ד", - "ק", - "ח", - "פ", - "ס", - "כ", - "ג", - "ט", - "צ", - "ן", - "ז", - "ך", - ], - "Bulgarian": [ - "а", - "и", - "о", - "е", - "н", - "т", - "р", - "с", - "в", - "л", - "к", - "д", - "п", - "м", - "з", - "г", - "я", - "ъ", - "у", - "б", - "ч", - "ц", - "й", - "ж", - "щ", - "х", - ], - "Croatian": [ - "a", - "i", - "o", - "e", - "n", - "r", - "j", - "s", - "t", - "u", - "k", - "l", - "v", - "d", - "m", - "p", - "g", - "z", - "b", - "c", - "č", - "h", - "š", - "ž", - "ć", - "f", - ], - "Hindi": [ - "क", - "र", - "स", - "न", - "त", - "म", - "ह", - "प", - "य", - "ल", - "व", - "ज", - "द", - "ग", - "ब", - "श", - "ट", - "अ", - "ए", - "थ", - "भ", - "ड", - "च", - "ध", - "ष", - "इ", - ], - "Estonian": [ - "a", - "i", - "e", - "s", - "t", - "l", - "u", - "n", - "o", - "k", - "r", - "d", - "m", - "v", - "g", - "p", - "j", - "h", - "ä", - "b", - "õ", - "ü", - "f", - "c", - "ö", - "y", - ], - "Thai": [ - "า", - "น", - "ร", - "อ", - "ก", - "เ", - "ง", - "ม", - "ย", - "ล", - "ว", - "ด", - "ท", - "ส", - "ต", - "ะ", - "ป", - "บ", - "ค", - "ห", - "แ", - "จ", - "พ", - "ช", - "ข", - "ใ", - ], - "Greek": [ - "α", - "τ", - "ο", - "ι", - "ε", - "ν", - "ρ", - "σ", - "κ", - "η", - "π", - "ς", - "υ", - "μ", - "λ", - "ί", - "ό", - "ά", - "γ", - "έ", - "δ", - "ή", - "ω", - "χ", - "θ", - "ύ", - ], - "Tamil": [ - "க", - "த", - "ப", - "ட", - "ர", - "ம", - "ல", - "ன", - "வ", - "ற", - "ய", - "ள", - "ச", - "ந", - "இ", - "ண", - "அ", - "ஆ", - "ழ", - "ங", - "எ", - "உ", - "ஒ", - "ஸ", - ], - "Kazakh": [ - "а", - "ы", - "е", - "н", - "т", - "р", - "л", - "і", - "д", - "с", - "м", - "қ", - "к", - "о", - "б", - "и", - "у", - "ғ", - "ж", - "ң", - "з", - "ш", - "й", - "п", - "г", - "ө", - ], -} - -LANGUAGE_SUPPORTED_COUNT: int = len(FREQUENCIES) diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/legacy.py b/venv/lib/python3.12/site-packages/charset_normalizer/legacy.py deleted file mode 100644 index 360a3107..00000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/legacy.py +++ /dev/null @@ -1,80 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any -from warnings import warn - -from .api import from_bytes -from .constant import CHARDET_CORRESPONDENCE, TOO_SMALL_SEQUENCE - -# TODO: remove this check when dropping Python 3.7 support -if TYPE_CHECKING: - from typing_extensions import TypedDict - - class ResultDict(TypedDict): - encoding: str | None - language: str - confidence: float | None - - -def detect( - byte_str: bytes, should_rename_legacy: bool = False, **kwargs: Any -) -> ResultDict: - """ - chardet legacy method - Detect the encoding of the given byte string. It should be mostly backward-compatible. - Encoding name will match Chardet own writing whenever possible. (Not on encoding name unsupported by it) - This function is deprecated and should be used to migrate your project easily, consult the documentation for - further information. Not planned for removal. - - :param byte_str: The byte sequence to examine. - :param should_rename_legacy: Should we rename legacy encodings - to their more modern equivalents? - """ - if len(kwargs): - warn( - f"charset-normalizer disregard arguments '{','.join(list(kwargs.keys()))}' in legacy function detect()" - ) - - if not isinstance(byte_str, (bytearray, bytes)): - raise TypeError( # pragma: nocover - f"Expected object of type bytes or bytearray, got: {type(byte_str)}" - ) - - if isinstance(byte_str, bytearray): - byte_str = bytes(byte_str) - - r = from_bytes(byte_str).best() - - encoding = r.encoding if r is not None else None - language = r.language if r is not None and r.language != "Unknown" else "" - confidence = 1.0 - r.chaos if r is not None else None - - # automatically lower confidence - # on small bytes samples. - # https://github.com/jawah/charset_normalizer/issues/391 - if ( - confidence is not None - and confidence >= 0.9 - and encoding - not in { - "utf_8", - "ascii", - } - and r.bom is False # type: ignore[union-attr] - and len(byte_str) < TOO_SMALL_SEQUENCE - ): - confidence -= 0.2 - - # Note: CharsetNormalizer does not return 'UTF-8-SIG' as the sig get stripped in the detection/normalization process - # but chardet does return 'utf-8-sig' and it is a valid codec name. - if r is not None and encoding == "utf_8" and r.bom: - encoding += "_sig" - - if should_rename_legacy is False and encoding in CHARDET_CORRESPONDENCE: - encoding = CHARDET_CORRESPONDENCE[encoding] - - return { - "encoding": encoding, - "language": language, - "confidence": confidence, - } diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 857d7474b7a5a0c5b81989346cf9d845174eed68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15912 zcmeHOYit}>6~4QU>E?m$LY@oYG8fH%?PpH|zK{20L*b8?}nUc)T;Vx7vp_ zJDb`eKqMy>CXHA{LZ}r#0^~&LRv*U3__xR5SCETnl^2!0!op{a?ZWy ztjCjenjZ)um}~8vbH4MsbLP(Y&hEWm?iuKfMk0b+m3Ts|NJ7L((fkNoAht)WhvQb! zC~eoRsBYnk)e2%N>XeK*q>5z5nbt>@9aF~9Pv+BMFr zKkVn7HZJ=xClVVaZaY{txamg||OF#AUa zP1|vu$z;xR+>ybqR5s&`SmP;2=_+f?#EfN5Br{ejdDIa@v;CQ*XQplB($iUptjJ*2 z&O@M~*#qOxI0?_}bG%N^a}RoMGBXKqmo=RO1H^~2$qaNrm_xH>w_~MJ*#yTm%_N35 zMJhQy?M=CkW$U@D-hy%hx!s~~pnqSN*`~MY?RdJ8Rew<_sXCzMm%#Eh$!|%*@QI4w zE4ASJmhZDT)wM|XCF6qd>j9kQH}MAg@=SNPA+)S(xNeUDRxm-rqq4~;L`SAz_E5) z95|GxP`A8Pg0}rNlyM5ZyeQ?Lpo~-AfdJQZ6(CkxnyB5@z2cAOf4pNm_=^0eMvb|SD_|*%`K#V02>mN~-77u~ z-74B}xLo~DP(}_z?s9(gUw#&p)SprCI$tBiK`3fN@tvD+M$qpG<8=EE05#@cH|8%E ze~j?_&y7=6Cl_Yc8*{~oF<<5FGEQFe9tTVGH|F0hE~43~QE~FOGaHP#zkt!G@N|r~ z87@%6p~I!6f-(Qc;*894Eq@8o)`dfdFHY#S+fHDaFpe?b-4rVxl)->|>t_=y>ca9N zz`?FO4$4wGYDU0$LEso@OtO6~HQMy85`Z}8;4_mFGK(Uxsvf%~5o5{A4 z4Ufe-8k3c5I7dIN2d-pO&1|BT~yj)>SSTH*@faoZ*Fy9M93N-M-Oz+m3;^Mn*fq++snE+)5_0?L^eI0ay-X|T>}*@a5F>Fv|QJkHJyy-&WZ`wN;{^VPp4%{9@l0J=im1j&$xD=z)OvW#?_TYpk)$!oQ&+u=!)H-5UKXyE){> z3*LWGdBX|Ihi`9uRQO#Qr?5Vj6?{85`zB zmi>9Y69)`qvp>(%nBsHM-zZ!eGJwN568rPKi0NjsfAQ`|>|b1s&7-o;cS|6uvpc06xnTJZVT10VFC0Ss%x^V;&mpZ*E({F%bYzA}## z2cq9!BR{6oeq-QCU8Y|O`1AaMX+Chl*q_6m2>A2=U8ekg!1h>cfBPy3n4*nAjToXw z87Ip1<8GY+9C^Ne$24Wgv`LBOV=(_&(D?n&YRZ&pL5bxf=V#z0U~rDb_6w{`OWnY@#lEI1_s9-`|~`A_qFo=RjwQ7 z<#F&P`1Te z=8?VyAIwkY2+79&_I>1=QG3!MEJMsOGUtCXyU)Rnj6U u@x2+}Rr$R6`HSzLeD2Ca9f$A-PH3+O@&`mY{jcPI?{4M4A>a@Y#lHYyFIRj3 diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/md.py b/venv/lib/python3.12/site-packages/charset_normalizer/md.py deleted file mode 100644 index 12ce024b..00000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/md.py +++ /dev/null @@ -1,635 +0,0 @@ -from __future__ import annotations - -from functools import lru_cache -from logging import getLogger - -from .constant import ( - COMMON_SAFE_ASCII_CHARACTERS, - TRACE, - UNICODE_SECONDARY_RANGE_KEYWORD, -) -from .utils import ( - is_accentuated, - is_arabic, - is_arabic_isolated_form, - is_case_variable, - is_cjk, - is_emoticon, - is_hangul, - is_hiragana, - is_katakana, - is_latin, - is_punctuation, - is_separator, - is_symbol, - is_thai, - is_unprintable, - remove_accent, - unicode_range, - is_cjk_uncommon, -) - - -class MessDetectorPlugin: - """ - Base abstract class used for mess detection plugins. - All detectors MUST extend and implement given methods. - """ - - def eligible(self, character: str) -> bool: - """ - Determine if given character should be fed in. - """ - raise NotImplementedError # pragma: nocover - - def feed(self, character: str) -> None: - """ - The main routine to be executed upon character. - Insert the logic in witch the text would be considered chaotic. - """ - raise NotImplementedError # pragma: nocover - - def reset(self) -> None: # pragma: no cover - """ - Permit to reset the plugin to the initial state. - """ - raise NotImplementedError - - @property - def ratio(self) -> float: - """ - Compute the chaos ratio based on what your feed() has seen. - Must NOT be lower than 0.; No restriction gt 0. - """ - raise NotImplementedError # pragma: nocover - - -class TooManySymbolOrPunctuationPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._punctuation_count: int = 0 - self._symbol_count: int = 0 - self._character_count: int = 0 - - self._last_printable_char: str | None = None - self._frenzy_symbol_in_word: bool = False - - def eligible(self, character: str) -> bool: - return character.isprintable() - - def feed(self, character: str) -> None: - self._character_count += 1 - - if ( - character != self._last_printable_char - and character not in COMMON_SAFE_ASCII_CHARACTERS - ): - if is_punctuation(character): - self._punctuation_count += 1 - elif ( - character.isdigit() is False - and is_symbol(character) - and is_emoticon(character) is False - ): - self._symbol_count += 2 - - self._last_printable_char = character - - def reset(self) -> None: # Abstract - self._punctuation_count = 0 - self._character_count = 0 - self._symbol_count = 0 - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - ratio_of_punctuation: float = ( - self._punctuation_count + self._symbol_count - ) / self._character_count - - return ratio_of_punctuation if ratio_of_punctuation >= 0.3 else 0.0 - - -class TooManyAccentuatedPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._character_count: int = 0 - self._accentuated_count: int = 0 - - def eligible(self, character: str) -> bool: - return character.isalpha() - - def feed(self, character: str) -> None: - self._character_count += 1 - - if is_accentuated(character): - self._accentuated_count += 1 - - def reset(self) -> None: # Abstract - self._character_count = 0 - self._accentuated_count = 0 - - @property - def ratio(self) -> float: - if self._character_count < 8: - return 0.0 - - ratio_of_accentuation: float = self._accentuated_count / self._character_count - return ratio_of_accentuation if ratio_of_accentuation >= 0.35 else 0.0 - - -class UnprintablePlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._unprintable_count: int = 0 - self._character_count: int = 0 - - def eligible(self, character: str) -> bool: - return True - - def feed(self, character: str) -> None: - if is_unprintable(character): - self._unprintable_count += 1 - self._character_count += 1 - - def reset(self) -> None: # Abstract - self._unprintable_count = 0 - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - return (self._unprintable_count * 8) / self._character_count - - -class SuspiciousDuplicateAccentPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._successive_count: int = 0 - self._character_count: int = 0 - - self._last_latin_character: str | None = None - - def eligible(self, character: str) -> bool: - return character.isalpha() and is_latin(character) - - def feed(self, character: str) -> None: - self._character_count += 1 - if ( - self._last_latin_character is not None - and is_accentuated(character) - and is_accentuated(self._last_latin_character) - ): - if character.isupper() and self._last_latin_character.isupper(): - self._successive_count += 1 - # Worse if its the same char duplicated with different accent. - if remove_accent(character) == remove_accent(self._last_latin_character): - self._successive_count += 1 - self._last_latin_character = character - - def reset(self) -> None: # Abstract - self._successive_count = 0 - self._character_count = 0 - self._last_latin_character = None - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - return (self._successive_count * 2) / self._character_count - - -class SuspiciousRange(MessDetectorPlugin): - def __init__(self) -> None: - self._suspicious_successive_range_count: int = 0 - self._character_count: int = 0 - self._last_printable_seen: str | None = None - - def eligible(self, character: str) -> bool: - return character.isprintable() - - def feed(self, character: str) -> None: - self._character_count += 1 - - if ( - character.isspace() - or is_punctuation(character) - or character in COMMON_SAFE_ASCII_CHARACTERS - ): - self._last_printable_seen = None - return - - if self._last_printable_seen is None: - self._last_printable_seen = character - return - - unicode_range_a: str | None = unicode_range(self._last_printable_seen) - unicode_range_b: str | None = unicode_range(character) - - if is_suspiciously_successive_range(unicode_range_a, unicode_range_b): - self._suspicious_successive_range_count += 1 - - self._last_printable_seen = character - - def reset(self) -> None: # Abstract - self._character_count = 0 - self._suspicious_successive_range_count = 0 - self._last_printable_seen = None - - @property - def ratio(self) -> float: - if self._character_count <= 13: - return 0.0 - - ratio_of_suspicious_range_usage: float = ( - self._suspicious_successive_range_count * 2 - ) / self._character_count - - return ratio_of_suspicious_range_usage - - -class SuperWeirdWordPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._word_count: int = 0 - self._bad_word_count: int = 0 - self._foreign_long_count: int = 0 - - self._is_current_word_bad: bool = False - self._foreign_long_watch: bool = False - - self._character_count: int = 0 - self._bad_character_count: int = 0 - - self._buffer: str = "" - self._buffer_accent_count: int = 0 - self._buffer_glyph_count: int = 0 - - def eligible(self, character: str) -> bool: - return True - - def feed(self, character: str) -> None: - if character.isalpha(): - self._buffer += character - if is_accentuated(character): - self._buffer_accent_count += 1 - if ( - self._foreign_long_watch is False - and (is_latin(character) is False or is_accentuated(character)) - and is_cjk(character) is False - and is_hangul(character) is False - and is_katakana(character) is False - and is_hiragana(character) is False - and is_thai(character) is False - ): - self._foreign_long_watch = True - if ( - is_cjk(character) - or is_hangul(character) - or is_katakana(character) - or is_hiragana(character) - or is_thai(character) - ): - self._buffer_glyph_count += 1 - return - if not self._buffer: - return - if ( - character.isspace() or is_punctuation(character) or is_separator(character) - ) and self._buffer: - self._word_count += 1 - buffer_length: int = len(self._buffer) - - self._character_count += buffer_length - - if buffer_length >= 4: - if self._buffer_accent_count / buffer_length >= 0.5: - self._is_current_word_bad = True - # Word/Buffer ending with an upper case accentuated letter are so rare, - # that we will consider them all as suspicious. Same weight as foreign_long suspicious. - elif ( - is_accentuated(self._buffer[-1]) - and self._buffer[-1].isupper() - and all(_.isupper() for _ in self._buffer) is False - ): - self._foreign_long_count += 1 - self._is_current_word_bad = True - elif self._buffer_glyph_count == 1: - self._is_current_word_bad = True - self._foreign_long_count += 1 - if buffer_length >= 24 and self._foreign_long_watch: - camel_case_dst = [ - i - for c, i in zip(self._buffer, range(0, buffer_length)) - if c.isupper() - ] - probable_camel_cased: bool = False - - if camel_case_dst and (len(camel_case_dst) / buffer_length <= 0.3): - probable_camel_cased = True - - if not probable_camel_cased: - self._foreign_long_count += 1 - self._is_current_word_bad = True - - if self._is_current_word_bad: - self._bad_word_count += 1 - self._bad_character_count += len(self._buffer) - self._is_current_word_bad = False - - self._foreign_long_watch = False - self._buffer = "" - self._buffer_accent_count = 0 - self._buffer_glyph_count = 0 - elif ( - character not in {"<", ">", "-", "=", "~", "|", "_"} - and character.isdigit() is False - and is_symbol(character) - ): - self._is_current_word_bad = True - self._buffer += character - - def reset(self) -> None: # Abstract - self._buffer = "" - self._is_current_word_bad = False - self._foreign_long_watch = False - self._bad_word_count = 0 - self._word_count = 0 - self._character_count = 0 - self._bad_character_count = 0 - self._foreign_long_count = 0 - - @property - def ratio(self) -> float: - if self._word_count <= 10 and self._foreign_long_count == 0: - return 0.0 - - return self._bad_character_count / self._character_count - - -class CjkUncommonPlugin(MessDetectorPlugin): - """ - Detect messy CJK text that probably means nothing. - """ - - def __init__(self) -> None: - self._character_count: int = 0 - self._uncommon_count: int = 0 - - def eligible(self, character: str) -> bool: - return is_cjk(character) - - def feed(self, character: str) -> None: - self._character_count += 1 - - if is_cjk_uncommon(character): - self._uncommon_count += 1 - return - - def reset(self) -> None: # Abstract - self._character_count = 0 - self._uncommon_count = 0 - - @property - def ratio(self) -> float: - if self._character_count < 8: - return 0.0 - - uncommon_form_usage: float = self._uncommon_count / self._character_count - - # we can be pretty sure it's garbage when uncommon characters are widely - # used. otherwise it could just be traditional chinese for example. - return uncommon_form_usage / 10 if uncommon_form_usage > 0.5 else 0.0 - - -class ArchaicUpperLowerPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._buf: bool = False - - self._character_count_since_last_sep: int = 0 - - self._successive_upper_lower_count: int = 0 - self._successive_upper_lower_count_final: int = 0 - - self._character_count: int = 0 - - self._last_alpha_seen: str | None = None - self._current_ascii_only: bool = True - - def eligible(self, character: str) -> bool: - return True - - def feed(self, character: str) -> None: - is_concerned = character.isalpha() and is_case_variable(character) - chunk_sep = is_concerned is False - - if chunk_sep and self._character_count_since_last_sep > 0: - if ( - self._character_count_since_last_sep <= 64 - and character.isdigit() is False - and self._current_ascii_only is False - ): - self._successive_upper_lower_count_final += ( - self._successive_upper_lower_count - ) - - self._successive_upper_lower_count = 0 - self._character_count_since_last_sep = 0 - self._last_alpha_seen = None - self._buf = False - self._character_count += 1 - self._current_ascii_only = True - - return - - if self._current_ascii_only is True and character.isascii() is False: - self._current_ascii_only = False - - if self._last_alpha_seen is not None: - if (character.isupper() and self._last_alpha_seen.islower()) or ( - character.islower() and self._last_alpha_seen.isupper() - ): - if self._buf is True: - self._successive_upper_lower_count += 2 - self._buf = False - else: - self._buf = True - else: - self._buf = False - - self._character_count += 1 - self._character_count_since_last_sep += 1 - self._last_alpha_seen = character - - def reset(self) -> None: # Abstract - self._character_count = 0 - self._character_count_since_last_sep = 0 - self._successive_upper_lower_count = 0 - self._successive_upper_lower_count_final = 0 - self._last_alpha_seen = None - self._buf = False - self._current_ascii_only = True - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - return self._successive_upper_lower_count_final / self._character_count - - -class ArabicIsolatedFormPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._character_count: int = 0 - self._isolated_form_count: int = 0 - - def reset(self) -> None: # Abstract - self._character_count = 0 - self._isolated_form_count = 0 - - def eligible(self, character: str) -> bool: - return is_arabic(character) - - def feed(self, character: str) -> None: - self._character_count += 1 - - if is_arabic_isolated_form(character): - self._isolated_form_count += 1 - - @property - def ratio(self) -> float: - if self._character_count < 8: - return 0.0 - - isolated_form_usage: float = self._isolated_form_count / self._character_count - - return isolated_form_usage - - -@lru_cache(maxsize=1024) -def is_suspiciously_successive_range( - unicode_range_a: str | None, unicode_range_b: str | None -) -> bool: - """ - Determine if two Unicode range seen next to each other can be considered as suspicious. - """ - if unicode_range_a is None or unicode_range_b is None: - return True - - if unicode_range_a == unicode_range_b: - return False - - if "Latin" in unicode_range_a and "Latin" in unicode_range_b: - return False - - if "Emoticons" in unicode_range_a or "Emoticons" in unicode_range_b: - return False - - # Latin characters can be accompanied with a combining diacritical mark - # eg. Vietnamese. - if ("Latin" in unicode_range_a or "Latin" in unicode_range_b) and ( - "Combining" in unicode_range_a or "Combining" in unicode_range_b - ): - return False - - keywords_range_a, keywords_range_b = ( - unicode_range_a.split(" "), - unicode_range_b.split(" "), - ) - - for el in keywords_range_a: - if el in UNICODE_SECONDARY_RANGE_KEYWORD: - continue - if el in keywords_range_b: - return False - - # Japanese Exception - range_a_jp_chars, range_b_jp_chars = ( - unicode_range_a - in ( - "Hiragana", - "Katakana", - ), - unicode_range_b in ("Hiragana", "Katakana"), - ) - if (range_a_jp_chars or range_b_jp_chars) and ( - "CJK" in unicode_range_a or "CJK" in unicode_range_b - ): - return False - if range_a_jp_chars and range_b_jp_chars: - return False - - if "Hangul" in unicode_range_a or "Hangul" in unicode_range_b: - if "CJK" in unicode_range_a or "CJK" in unicode_range_b: - return False - if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": - return False - - # Chinese/Japanese use dedicated range for punctuation and/or separators. - if ("CJK" in unicode_range_a or "CJK" in unicode_range_b) or ( - unicode_range_a in ["Katakana", "Hiragana"] - and unicode_range_b in ["Katakana", "Hiragana"] - ): - if "Punctuation" in unicode_range_a or "Punctuation" in unicode_range_b: - return False - if "Forms" in unicode_range_a or "Forms" in unicode_range_b: - return False - if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": - return False - - return True - - -@lru_cache(maxsize=2048) -def mess_ratio( - decoded_sequence: str, maximum_threshold: float = 0.2, debug: bool = False -) -> float: - """ - Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier. - """ - - detectors: list[MessDetectorPlugin] = [ - md_class() for md_class in MessDetectorPlugin.__subclasses__() - ] - - length: int = len(decoded_sequence) + 1 - - mean_mess_ratio: float = 0.0 - - if length < 512: - intermediary_mean_mess_ratio_calc: int = 32 - elif length <= 1024: - intermediary_mean_mess_ratio_calc = 64 - else: - intermediary_mean_mess_ratio_calc = 128 - - for character, index in zip(decoded_sequence + "\n", range(length)): - for detector in detectors: - if detector.eligible(character): - detector.feed(character) - - if ( - index > 0 and index % intermediary_mean_mess_ratio_calc == 0 - ) or index == length - 1: - mean_mess_ratio = sum(dt.ratio for dt in detectors) - - if mean_mess_ratio >= maximum_threshold: - break - - if debug: - logger = getLogger("charset_normalizer") - - logger.log( - TRACE, - "Mess-detector extended-analysis start. " - f"intermediary_mean_mess_ratio_calc={intermediary_mean_mess_ratio_calc} mean_mess_ratio={mean_mess_ratio} " - f"maximum_threshold={maximum_threshold}", - ) - - if len(decoded_sequence) > 16: - logger.log(TRACE, f"Starting with: {decoded_sequence[:16]}") - logger.log(TRACE, f"Ending with: {decoded_sequence[-16::]}") - - for dt in detectors: - logger.log(TRACE, f"{dt.__class__}: {dt.ratio}") - - return round(mean_mess_ratio, 3) diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index b21e77b522ce460c689d283cd4387a97e4d6ee7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290584 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 atVq$C}Kp=3Au6~ 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 bool: - if not isinstance(other, CharsetMatch): - if isinstance(other, str): - return iana_name(other) == self.encoding - return False - return self.encoding == other.encoding and self.fingerprint == other.fingerprint - - def __lt__(self, other: object) -> bool: - """ - Implemented to make sorted available upon CharsetMatches items. - """ - if not isinstance(other, CharsetMatch): - raise ValueError - - chaos_difference: float = abs(self.chaos - other.chaos) - coherence_difference: float = abs(self.coherence - other.coherence) - - # Below 1% difference --> Use Coherence - if chaos_difference < 0.01 and coherence_difference > 0.02: - return self.coherence > other.coherence - elif chaos_difference < 0.01 and coherence_difference <= 0.02: - # When having a difficult decision, use the result that decoded as many multi-byte as possible. - # preserve RAM usage! - if len(self._payload) >= TOO_BIG_SEQUENCE: - return self.chaos < other.chaos - return self.multi_byte_usage > other.multi_byte_usage - - return self.chaos < other.chaos - - @property - def multi_byte_usage(self) -> float: - return 1.0 - (len(str(self)) / len(self.raw)) - - def __str__(self) -> str: - # Lazy Str Loading - if self._string is None: - self._string = str(self._payload, self._encoding, "strict") - return self._string - - def __repr__(self) -> str: - return f"" - - def add_submatch(self, other: CharsetMatch) -> None: - if not isinstance(other, CharsetMatch) or other == self: - raise ValueError( - "Unable to add instance <{}> as a submatch of a CharsetMatch".format( - other.__class__ - ) - ) - - other._string = None # Unload RAM usage; dirty trick. - self._leaves.append(other) - - @property - def encoding(self) -> str: - return self._encoding - - @property - def encoding_aliases(self) -> list[str]: - """ - Encoding name are known by many name, using this could help when searching for IBM855 when it's listed as CP855. - """ - also_known_as: list[str] = [] - for u, p in aliases.items(): - if self.encoding == u: - also_known_as.append(p) - elif self.encoding == p: - also_known_as.append(u) - return also_known_as - - @property - def bom(self) -> bool: - return self._has_sig_or_bom - - @property - def byte_order_mark(self) -> bool: - return self._has_sig_or_bom - - @property - def languages(self) -> list[str]: - """ - Return the complete list of possible languages found in decoded sequence. - Usually not really useful. Returned list may be empty even if 'language' property return something != 'Unknown'. - """ - return [e[0] for e in self._languages] - - @property - def language(self) -> str: - """ - Most probable language found in decoded sequence. If none were detected or inferred, the property will return - "Unknown". - """ - if not self._languages: - # Trying to infer the language based on the given encoding - # Its either English or we should not pronounce ourselves in certain cases. - if "ascii" in self.could_be_from_charset: - return "English" - - # doing it there to avoid circular import - from charset_normalizer.cd import encoding_languages, mb_encoding_languages - - languages = ( - mb_encoding_languages(self.encoding) - if is_multi_byte_encoding(self.encoding) - else encoding_languages(self.encoding) - ) - - if len(languages) == 0 or "Latin Based" in languages: - return "Unknown" - - return languages[0] - - return self._languages[0][0] - - @property - def chaos(self) -> float: - return self._mean_mess_ratio - - @property - def coherence(self) -> float: - if not self._languages: - return 0.0 - return self._languages[0][1] - - @property - def percent_chaos(self) -> float: - return round(self.chaos * 100, ndigits=3) - - @property - def percent_coherence(self) -> float: - return round(self.coherence * 100, ndigits=3) - - @property - def raw(self) -> bytes: - """ - Original untouched bytes. - """ - return self._payload - - @property - def submatch(self) -> list[CharsetMatch]: - return self._leaves - - @property - def has_submatch(self) -> bool: - return len(self._leaves) > 0 - - @property - def alphabets(self) -> list[str]: - if self._unicode_ranges is not None: - return self._unicode_ranges - # list detected ranges - detected_ranges: list[str | None] = [unicode_range(char) for char in str(self)] - # filter and sort - self._unicode_ranges = sorted(list({r for r in detected_ranges if r})) - return self._unicode_ranges - - @property - def could_be_from_charset(self) -> list[str]: - """ - The complete list of encoding that output the exact SAME str result and therefore could be the originating - encoding. - This list does include the encoding available in property 'encoding'. - """ - return [self._encoding] + [m.encoding for m in self._leaves] - - def output(self, encoding: str = "utf_8") -> bytes: - """ - Method to get re-encoded bytes payload using given target encoding. Default to UTF-8. - Any errors will be simply ignored by the encoder NOT replaced. - """ - if self._output_encoding is None or self._output_encoding != encoding: - self._output_encoding = encoding - decoded_string = str(self) - if ( - self._preemptive_declaration is not None - and self._preemptive_declaration.lower() - not in ["utf-8", "utf8", "utf_8"] - ): - patched_header = sub( - RE_POSSIBLE_ENCODING_INDICATION, - lambda m: m.string[m.span()[0] : m.span()[1]].replace( - m.groups()[0], - iana_name(self._output_encoding).replace("_", "-"), # type: ignore[arg-type] - ), - decoded_string[:8192], - count=1, - ) - - decoded_string = patched_header + decoded_string[8192:] - - self._output_payload = decoded_string.encode(encoding, "replace") - - return self._output_payload # type: ignore - - @property - def fingerprint(self) -> str: - """ - Retrieve the unique SHA256 computed using the transformed (re-encoded) payload. Not the original one. - """ - return sha256(self.output()).hexdigest() - - -class CharsetMatches: - """ - Container with every CharsetMatch items ordered by default from most probable to the less one. - Act like a list(iterable) but does not implements all related methods. - """ - - def __init__(self, results: list[CharsetMatch] | None = None): - self._results: list[CharsetMatch] = sorted(results) if results else [] - - def __iter__(self) -> Iterator[CharsetMatch]: - yield from self._results - - def __getitem__(self, item: int | str) -> CharsetMatch: - """ - Retrieve a single item either by its position or encoding name (alias may be used here). - Raise KeyError upon invalid index or encoding not present in results. - """ - if isinstance(item, int): - return self._results[item] - if isinstance(item, str): - item = iana_name(item, False) - for result in self._results: - if item in result.could_be_from_charset: - return result - raise KeyError - - def __len__(self) -> int: - return len(self._results) - - def __bool__(self) -> bool: - return len(self._results) > 0 - - def append(self, item: CharsetMatch) -> None: - """ - Insert a single match. Will be inserted accordingly to preserve sort. - Can be inserted as a submatch. - """ - if not isinstance(item, CharsetMatch): - raise ValueError( - "Cannot append instance '{}' to CharsetMatches".format( - str(item.__class__) - ) - ) - # We should disable the submatch factoring when the input file is too heavy (conserve RAM usage) - if len(item.raw) < TOO_BIG_SEQUENCE: - for match in self._results: - if match.fingerprint == item.fingerprint and match.chaos == item.chaos: - match.add_submatch(item) - return - self._results.append(item) - self._results = sorted(self._results) - - def best(self) -> CharsetMatch | None: - """ - Simply return the first match. Strict equivalent to matches[0]. - """ - if not self._results: - return None - return self._results[0] - - def first(self) -> CharsetMatch | None: - """ - Redundant method, call the method best(). Kept for BC reasons. - """ - return self.best() - - -CoherenceMatch = Tuple[str, float] -CoherenceMatches = List[CoherenceMatch] - - -class CliDetectionResult: - def __init__( - self, - path: str, - encoding: str | None, - encoding_aliases: list[str], - alternative_encodings: list[str], - language: str, - alphabets: list[str], - has_sig_or_bom: bool, - chaos: float, - coherence: float, - unicode_path: str | None, - is_preferred: bool, - ): - self.path: str = path - self.unicode_path: str | None = unicode_path - self.encoding: str | None = encoding - self.encoding_aliases: list[str] = encoding_aliases - self.alternative_encodings: list[str] = alternative_encodings - self.language: str = language - self.alphabets: list[str] = alphabets - self.has_sig_or_bom: bool = has_sig_or_bom - self.chaos: float = chaos - self.coherence: float = coherence - self.is_preferred: bool = is_preferred - - @property - def __dict__(self) -> dict[str, Any]: # type: ignore - return { - "path": self.path, - "encoding": self.encoding, - "encoding_aliases": self.encoding_aliases, - "alternative_encodings": self.alternative_encodings, - "language": self.language, - "alphabets": self.alphabets, - "has_sig_or_bom": self.has_sig_or_bom, - "chaos": self.chaos, - "coherence": self.coherence, - "unicode_path": self.unicode_path, - "is_preferred": self.is_preferred, - } - - def to_json(self) -> str: - return dumps(self.__dict__, ensure_ascii=True, indent=4) diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/py.typed b/venv/lib/python3.12/site-packages/charset_normalizer/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/utils.py b/venv/lib/python3.12/site-packages/charset_normalizer/utils.py deleted file mode 100644 index 6bf0384c..00000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/utils.py +++ /dev/null @@ -1,414 +0,0 @@ -from __future__ import annotations - -import importlib -import logging -import unicodedata -from codecs import IncrementalDecoder -from encodings.aliases import aliases -from functools import lru_cache -from re import findall -from typing import Generator - -from _multibytecodec import ( # type: ignore[import-not-found,import] - MultibyteIncrementalDecoder, -) - -from .constant import ( - ENCODING_MARKS, - IANA_SUPPORTED_SIMILAR, - RE_POSSIBLE_ENCODING_INDICATION, - UNICODE_RANGES_COMBINED, - UNICODE_SECONDARY_RANGE_KEYWORD, - UTF8_MAXIMAL_ALLOCATION, - COMMON_CJK_CHARACTERS, -) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_accentuated(character: str) -> bool: - try: - description: str = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - return ( - "WITH GRAVE" in description - or "WITH ACUTE" in description - or "WITH CEDILLA" in description - or "WITH DIAERESIS" in description - or "WITH CIRCUMFLEX" in description - or "WITH TILDE" in description - or "WITH MACRON" in description - or "WITH RING ABOVE" in description - ) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def remove_accent(character: str) -> str: - decomposed: str = unicodedata.decomposition(character) - if not decomposed: - return character - - codes: list[str] = decomposed.split(" ") - - return chr(int(codes[0], 16)) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def unicode_range(character: str) -> str | None: - """ - Retrieve the Unicode range official name from a single character. - """ - character_ord: int = ord(character) - - for range_name, ord_range in UNICODE_RANGES_COMBINED.items(): - if character_ord in ord_range: - return range_name - - return None - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_latin(character: str) -> bool: - try: - description: str = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - return "LATIN" in description - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_punctuation(character: str) -> bool: - character_category: str = unicodedata.category(character) - - if "P" in character_category: - return True - - character_range: str | None = unicode_range(character) - - if character_range is None: - return False - - return "Punctuation" in character_range - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_symbol(character: str) -> bool: - character_category: str = unicodedata.category(character) - - if "S" in character_category or "N" in character_category: - return True - - character_range: str | None = unicode_range(character) - - if character_range is None: - return False - - return "Forms" in character_range and character_category != "Lo" - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_emoticon(character: str) -> bool: - character_range: str | None = unicode_range(character) - - if character_range is None: - return False - - return "Emoticons" in character_range or "Pictographs" in character_range - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_separator(character: str) -> bool: - if character.isspace() or character in {"|", "+", "<", ">"}: - return True - - character_category: str = unicodedata.category(character) - - return "Z" in character_category or character_category in {"Po", "Pd", "Pc"} - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_case_variable(character: str) -> bool: - return character.islower() != character.isupper() - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_cjk(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - - return "CJK" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_hiragana(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - - return "HIRAGANA" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_katakana(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - - return "KATAKANA" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_hangul(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - - return "HANGUL" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_thai(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - - return "THAI" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_arabic(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - - return "ARABIC" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_arabic_isolated_form(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - - return "ARABIC" in character_name and "ISOLATED FORM" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_cjk_uncommon(character: str) -> bool: - return character not in COMMON_CJK_CHARACTERS - - -@lru_cache(maxsize=len(UNICODE_RANGES_COMBINED)) -def is_unicode_range_secondary(range_name: str) -> bool: - return any(keyword in range_name for keyword in UNICODE_SECONDARY_RANGE_KEYWORD) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_unprintable(character: str) -> bool: - return ( - character.isspace() is False # includes \n \t \r \v - and character.isprintable() is False - and character != "\x1a" # Why? Its the ASCII substitute character. - and character != "\ufeff" # bug discovered in Python, - # Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space. - ) - - -def any_specified_encoding(sequence: bytes, search_zone: int = 8192) -> str | None: - """ - Extract using ASCII-only decoder any specified encoding in the first n-bytes. - """ - if not isinstance(sequence, bytes): - raise TypeError - - seq_len: int = len(sequence) - - results: list[str] = findall( - RE_POSSIBLE_ENCODING_INDICATION, - sequence[: min(seq_len, search_zone)].decode("ascii", errors="ignore"), - ) - - if len(results) == 0: - return None - - for specified_encoding in results: - specified_encoding = specified_encoding.lower().replace("-", "_") - - encoding_alias: str - encoding_iana: str - - for encoding_alias, encoding_iana in aliases.items(): - if encoding_alias == specified_encoding: - return encoding_iana - if encoding_iana == specified_encoding: - return encoding_iana - - return None - - -@lru_cache(maxsize=128) -def is_multi_byte_encoding(name: str) -> bool: - """ - Verify is a specific encoding is a multi byte one based on it IANA name - """ - return name in { - "utf_8", - "utf_8_sig", - "utf_16", - "utf_16_be", - "utf_16_le", - "utf_32", - "utf_32_le", - "utf_32_be", - "utf_7", - } or issubclass( - importlib.import_module(f"encodings.{name}").IncrementalDecoder, - MultibyteIncrementalDecoder, - ) - - -def identify_sig_or_bom(sequence: bytes) -> tuple[str | None, bytes]: - """ - Identify and extract SIG/BOM in given sequence. - """ - - for iana_encoding in ENCODING_MARKS: - marks: bytes | list[bytes] = ENCODING_MARKS[iana_encoding] - - if isinstance(marks, bytes): - marks = [marks] - - for mark in marks: - if sequence.startswith(mark): - return iana_encoding, mark - - return None, b"" - - -def should_strip_sig_or_bom(iana_encoding: str) -> bool: - return iana_encoding not in {"utf_16", "utf_32"} - - -def iana_name(cp_name: str, strict: bool = True) -> str: - """Returns the Python normalized encoding name (Not the IANA official name).""" - cp_name = cp_name.lower().replace("-", "_") - - encoding_alias: str - encoding_iana: str - - for encoding_alias, encoding_iana in aliases.items(): - if cp_name in [encoding_alias, encoding_iana]: - return encoding_iana - - if strict: - raise ValueError(f"Unable to retrieve IANA for '{cp_name}'") - - return cp_name - - -def cp_similarity(iana_name_a: str, iana_name_b: str) -> float: - if is_multi_byte_encoding(iana_name_a) or is_multi_byte_encoding(iana_name_b): - return 0.0 - - decoder_a = importlib.import_module(f"encodings.{iana_name_a}").IncrementalDecoder - decoder_b = importlib.import_module(f"encodings.{iana_name_b}").IncrementalDecoder - - id_a: IncrementalDecoder = decoder_a(errors="ignore") - id_b: IncrementalDecoder = decoder_b(errors="ignore") - - character_match_count: int = 0 - - for i in range(255): - to_be_decoded: bytes = bytes([i]) - if id_a.decode(to_be_decoded) == id_b.decode(to_be_decoded): - character_match_count += 1 - - return character_match_count / 254 - - -def is_cp_similar(iana_name_a: str, iana_name_b: str) -> bool: - """ - Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using - the function cp_similarity. - """ - return ( - iana_name_a in IANA_SUPPORTED_SIMILAR - and iana_name_b in IANA_SUPPORTED_SIMILAR[iana_name_a] - ) - - -def set_logging_handler( - name: str = "charset_normalizer", - level: int = logging.INFO, - format_string: str = "%(asctime)s | %(levelname)s | %(message)s", -) -> None: - logger = logging.getLogger(name) - logger.setLevel(level) - - handler = logging.StreamHandler() - handler.setFormatter(logging.Formatter(format_string)) - logger.addHandler(handler) - - -def cut_sequence_chunks( - sequences: bytes, - encoding_iana: str, - offsets: range, - chunk_size: int, - bom_or_sig_available: bool, - strip_sig_or_bom: bool, - sig_payload: bytes, - is_multi_byte_decoder: bool, - decoded_payload: str | None = None, -) -> Generator[str, None, None]: - if decoded_payload and is_multi_byte_decoder is False: - for i in offsets: - chunk = decoded_payload[i : i + chunk_size] - if not chunk: - break - yield chunk - else: - for i in offsets: - chunk_end = i + chunk_size - if chunk_end > len(sequences) + 8: - continue - - cut_sequence = sequences[i : i + chunk_size] - - if bom_or_sig_available and strip_sig_or_bom is False: - cut_sequence = sig_payload + cut_sequence - - chunk = cut_sequence.decode( - encoding_iana, - errors="ignore" if is_multi_byte_decoder else "strict", - ) - - # multi-byte bad cutting detector and adjustment - # not the cleanest way to perform that fix but clever enough for now. - if is_multi_byte_decoder and i > 0: - chunk_partial_size_chk: int = min(chunk_size, 16) - - if ( - decoded_payload - and chunk[:chunk_partial_size_chk] not in decoded_payload - ): - for j in range(i, i - 4, -1): - cut_sequence = sequences[j:chunk_end] - - if bom_or_sig_available and strip_sig_or_bom is False: - cut_sequence = sig_payload + cut_sequence - - chunk = cut_sequence.decode(encoding_iana, errors="ignore") - - if chunk[:chunk_partial_size_chk] in decoded_payload: - break - - yield chunk diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/version.py b/venv/lib/python3.12/site-packages/charset_normalizer/version.py deleted file mode 100644 index c843e533..00000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/version.py +++ /dev/null @@ -1,8 +0,0 @@ -""" -Expose version -""" - -from __future__ import annotations - -__version__ = "3.4.4" -VERSION = __version__.split(".") diff --git a/venv/lib/python3.12/site-packages/click-8.3.1.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/click-8.3.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/venv/lib/python3.12/site-packages/click-8.3.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/click-8.3.1.dist-info/METADATA b/venv/lib/python3.12/site-packages/click-8.3.1.dist-info/METADATA deleted file mode 100644 index 3f433afb..00000000 --- a/venv/lib/python3.12/site-packages/click-8.3.1.dist-info/METADATA +++ /dev/null @@ -1,84 +0,0 @@ -Metadata-Version: 2.4 -Name: click -Version: 8.3.1 -Summary: Composable command line interface toolkit -Maintainer-email: Pallets -Requires-Python: >=3.10 -Description-Content-Type: text/markdown -License-Expression: BSD-3-Clause -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Typing :: Typed -License-File: LICENSE.txt -Requires-Dist: colorama; platform_system == 'Windows' -Project-URL: Changes, https://click.palletsprojects.com/page/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://click.palletsprojects.com/ -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Source, https://github.com/pallets/click/ - -
- -# Click - -Click is a Python package for creating beautiful command line interfaces -in a composable way with as little code as necessary. It's the "Command -Line Interface Creation Kit". It's highly configurable but comes with -sensible defaults out of the box. - -It aims to make the process of writing command line tools quick and fun -while also preventing any frustration caused by the inability to -implement an intended CLI API. - -Click in three points: - -- Arbitrary nesting of commands -- Automatic help page generation -- Supports lazy loading of subcommands at runtime - - -## A Simple Example - -```python -import click - -@click.command() -@click.option("--count", default=1, help="Number of greetings.") -@click.option("--name", prompt="Your name", help="The person to greet.") -def hello(count, name): - """Simple program that greets NAME for a total of COUNT times.""" - for _ in range(count): - click.echo(f"Hello, {name}!") - -if __name__ == '__main__': - hello() -``` - -``` -$ python hello.py --count=3 -Your name: Click -Hello, Click! -Hello, Click! -Hello, Click! -``` - - -## Donate - -The Pallets organization develops and supports Click and other popular -packages. In order to grow the community of contributors and users, and -allow the maintainers to devote more time to the projects, [please -donate today][]. - -[please donate today]: https://palletsprojects.com/donate - -## Contributing - -See our [detailed contributing documentation][contrib] for many ways to -contribute, including reporting issues, requesting features, asking or answering -questions, and making PRs. - -[contrib]: https://palletsprojects.com/contributing/ - diff --git a/venv/lib/python3.12/site-packages/click-8.3.1.dist-info/RECORD b/venv/lib/python3.12/site-packages/click-8.3.1.dist-info/RECORD deleted file mode 100644 index 77e5c989..00000000 --- a/venv/lib/python3.12/site-packages/click-8.3.1.dist-info/RECORD +++ /dev/null @@ -1,40 +0,0 @@ -click-8.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -click-8.3.1.dist-info/METADATA,sha256=XZeBrMAE0ghTE88SjfrSDuSyNCpBPplxJR1tbwD9oZg,2621 -click-8.3.1.dist-info/RECORD,, -click-8.3.1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82 -click-8.3.1.dist-info/licenses/LICENSE.txt,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 -click/__init__.py,sha256=6YyS1aeyknZ0LYweWozNZy0A9nZ_11wmYIhv3cbQrYo,4473 -click/__pycache__/__init__.cpython-312.pyc,, -click/__pycache__/_compat.cpython-312.pyc,, -click/__pycache__/_termui_impl.cpython-312.pyc,, -click/__pycache__/_textwrap.cpython-312.pyc,, -click/__pycache__/_utils.cpython-312.pyc,, -click/__pycache__/_winconsole.cpython-312.pyc,, -click/__pycache__/core.cpython-312.pyc,, -click/__pycache__/decorators.cpython-312.pyc,, -click/__pycache__/exceptions.cpython-312.pyc,, -click/__pycache__/formatting.cpython-312.pyc,, -click/__pycache__/globals.cpython-312.pyc,, -click/__pycache__/parser.cpython-312.pyc,, -click/__pycache__/shell_completion.cpython-312.pyc,, -click/__pycache__/termui.cpython-312.pyc,, -click/__pycache__/testing.cpython-312.pyc,, -click/__pycache__/types.cpython-312.pyc,, -click/__pycache__/utils.cpython-312.pyc,, -click/_compat.py,sha256=v3xBZkFbvA1BXPRkFfBJc6-pIwPI7345m-kQEnpVAs4,18693 -click/_termui_impl.py,sha256=rgCb3On8X5A4200rA5L6i13u5iapmFer7sru57Jy6zA,27093 -click/_textwrap.py,sha256=BOae0RQ6vg3FkNgSJyOoGzG1meGMxJ_ukWVZKx_v-0o,1400 -click/_utils.py,sha256=kZwtTf5gMuCilJJceS2iTCvRvCY-0aN5rJq8gKw7p8g,943 -click/_winconsole.py,sha256=_vxUuUaxwBhoR0vUWCNuHY8VUefiMdCIyU2SXPqoF-A,8465 -click/core.py,sha256=U6Bfxt8GkjNDqyJ0HqXvluJHtyZ4sY5USAvM1Cdq7mQ,132105 -click/decorators.py,sha256=5P7abhJtAQYp_KHgjUvhMv464ERwOzrv2enNknlwHyQ,18461 -click/exceptions.py,sha256=8utf8w6V5hJXMnO_ic1FNrtbwuEn1NUu1aDwV8UqnG4,9954 -click/formatting.py,sha256=RVfwwr0rwWNpgGr8NaHodPzkIr7_tUyVh_nDdanLMNc,9730 -click/globals.py,sha256=gM-Nh6A4M0HB_SgkaF5M4ncGGMDHc_flHXu9_oh4GEU,1923 -click/parser.py,sha256=Q31pH0FlQZEq-UXE_ABRzlygEfvxPTuZbWNh4xfXmzw,19010 -click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -click/shell_completion.py,sha256=Cc4GQUFuWpfQBa9sF5qXeeYI7n3tI_1k6ZdSn4BZbT0,20994 -click/termui.py,sha256=hqCEjNndU-nzW08nRAkBaVgfZp_FdCA9KxfIWlKYaMc,31037 -click/testing.py,sha256=EERbzcl1br0mW0qBS9EqkknfNfXB9WQEW0ELIpkvuSs,19102 -click/types.py,sha256=ek54BNSFwPKsqtfT7jsqcc4WHui8AIFVMKM4oVZIXhc,39927 -click/utils.py,sha256=gCUoewdAhA-QLBUUHxrLh4uj6m7T1WjZZMNPvR0I7YA,20257 diff --git a/venv/lib/python3.12/site-packages/click-8.3.1.dist-info/WHEEL b/venv/lib/python3.12/site-packages/click-8.3.1.dist-info/WHEEL deleted file mode 100644 index d8b9936d..00000000 --- a/venv/lib/python3.12/site-packages/click-8.3.1.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.12.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.12/site-packages/click-8.3.1.dist-info/licenses/LICENSE.txt b/venv/lib/python3.12/site-packages/click-8.3.1.dist-info/licenses/LICENSE.txt deleted file mode 100644 index d12a8491..00000000 --- a/venv/lib/python3.12/site-packages/click-8.3.1.dist-info/licenses/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2014 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. 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. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 -HOLDER 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. diff --git a/venv/lib/python3.12/site-packages/click/__init__.py b/venv/lib/python3.12/site-packages/click/__init__.py deleted file mode 100644 index 1aa547c5..00000000 --- a/venv/lib/python3.12/site-packages/click/__init__.py +++ /dev/null @@ -1,123 +0,0 @@ -""" -Click is a simple Python module inspired by the stdlib optparse to make -writing command line scripts fun. Unlike other modules, it's based -around a simple API that does not come with too much magic and is -composable. -""" - -from __future__ import annotations - -from .core import Argument as Argument -from .core import Command as Command -from .core import CommandCollection as CommandCollection -from .core import Context as Context -from .core import Group as Group -from .core import Option as Option -from .core import Parameter as Parameter -from .decorators import argument as argument -from .decorators import command as command -from .decorators import confirmation_option as confirmation_option -from .decorators import group as group -from .decorators import help_option as help_option -from .decorators import make_pass_decorator as make_pass_decorator -from .decorators import option as option -from .decorators import pass_context as pass_context -from .decorators import pass_obj as pass_obj -from .decorators import password_option as password_option -from .decorators import version_option as version_option -from .exceptions import Abort as Abort -from .exceptions import BadArgumentUsage as BadArgumentUsage -from .exceptions import BadOptionUsage as BadOptionUsage -from .exceptions import BadParameter as BadParameter -from .exceptions import ClickException as ClickException -from .exceptions import FileError as FileError -from .exceptions import MissingParameter as MissingParameter -from .exceptions import NoSuchOption as NoSuchOption -from .exceptions import UsageError as UsageError -from .formatting import HelpFormatter as HelpFormatter -from .formatting import wrap_text as wrap_text -from .globals import get_current_context as get_current_context -from .termui import clear as clear -from .termui import confirm as confirm -from .termui import echo_via_pager as echo_via_pager -from .termui import edit as edit -from .termui import getchar as getchar -from .termui import launch as launch -from .termui import pause as pause -from .termui import progressbar as progressbar -from .termui import prompt as prompt -from .termui import secho as secho -from .termui import style as style -from .termui import unstyle as unstyle -from .types import BOOL as BOOL -from .types import Choice as Choice -from .types import DateTime as DateTime -from .types import File as File -from .types import FLOAT as FLOAT -from .types import FloatRange as FloatRange -from .types import INT as INT -from .types import IntRange as IntRange -from .types import ParamType as ParamType -from .types import Path as Path -from .types import STRING as STRING -from .types import Tuple as Tuple -from .types import UNPROCESSED as UNPROCESSED -from .types import UUID as UUID -from .utils import echo as echo -from .utils import format_filename as format_filename -from .utils import get_app_dir as get_app_dir -from .utils import get_binary_stream as get_binary_stream -from .utils import get_text_stream as get_text_stream -from .utils import open_file as open_file - - -def __getattr__(name: str) -> object: - import warnings - - if name == "BaseCommand": - from .core import _BaseCommand - - warnings.warn( - "'BaseCommand' is deprecated and will be removed in Click 9.0. Use" - " 'Command' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _BaseCommand - - if name == "MultiCommand": - from .core import _MultiCommand - - warnings.warn( - "'MultiCommand' is deprecated and will be removed in Click 9.0. Use" - " 'Group' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _MultiCommand - - if name == "OptionParser": - from .parser import _OptionParser - - warnings.warn( - "'OptionParser' is deprecated and will be removed in Click 9.0. The" - " old parser is available in 'optparse'.", - DeprecationWarning, - stacklevel=2, - ) - return _OptionParser - - if name == "__version__": - import importlib.metadata - import warnings - - warnings.warn( - "The '__version__' attribute is deprecated and will be removed in" - " Click 9.1. Use feature detection or" - " 'importlib.metadata.version(\"click\")' instead.", - DeprecationWarning, - stacklevel=2, - ) - return importlib.metadata.version("click") - - raise AttributeError(name) diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 01b1d89c6ac9d664bcbd70194dce9f452ff917e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4063 zcmbW4NpBm;6~~(r_eIp=MYgrHB-<2iiIikpwrqLPYHKnh36_jODu+gs-IChwg{W>y zmSGKoAcy3XLk`JDNH96)O9Ti!Glv<_ATYqp9DH+N=Q5}K-ybtktEyL3 zubS_*{*lQf6@1cve`Fo@D9U%#Xni^w5PBExRFpp{h9VRrWOUder$cmv6rratQDzl9 zCdQaY?2FDNafx}Gyed|iAAlc3@%Hn68P#))h(z`T-$nPsvf+^rgwirwSt_lmUQ1V zlDhP&n0dUBh0QfAsRydznZD|J0Xa9-11s3WvRJoT-oxU%R#~MLEkB9=is$Pk+bksC z(9b;|s-<)nQ}w{|T>nj|VT&)w-Kt}{0s3Q0jU5Afnz-cIwppebjea*UpVQFDL+r2u zh;CGxy@^d->W&$h66Uzx<`#RQK)~Er_S_vyI=lxBk!v`P>^8ln_Ds8SV(+7PY8Bo0 zHNz}>QV%?G9zC9z<~}%WZY$1huk;k7vcw0TG*0|=?VHlak|&nPLdlbKpzcN8Xocd5 zukV_$b-~s+Udxh(rTv&){LHL8FPp8SBvvikT#=GD+Wm>;`*;-Er=-`tE!@^|*plqK zH6!x~0a*1YLXAKs4y0bun#b$gH3O|&l@j-*ot!#SwoRP^6KjT-_HLHDd;LxU_v8vm` z@Z!eC$1p{g_B^Xho$+NoFt;s-I7~6YcVzYBjfHJMa@F?q;IZyL{i_88sTe!RB+kQ{AS@$&?vo~&;^-dI}M+FDsgGyLSq8hD1>^Yq8S!NtcRK<%hlzf<_FT$9T>A@q>!JO5?;l0*-x2%IIT|vfD#&d_Zh4x zq#;AGm7~y0#prl8t|(IFQi`&AgtGcF^fcC*c=ByTf_STCME@519RBEo@f}+VJjIVa zB~YLvN1Y$^l>DHlPWF^K_LR1xPV5Nf{R4Z-e9%*vJ$13CJAB^wQRMjCKYhaN2fam} z_BKx2u1`<5w;F78f8LDymJ*z8^}keF*58EkJ?oO*Yig-Qq|j#il3`eIqiLW1g35j-q7M$ zD(MG$`I&9*n|3YzN!1Rl=1}xyw06Ubtz3Ka|J(>C;*)LE(v8f5l;iWyKBKi8URb&I z=FeYq8->ra4Yk7lxmxb)mQ96*!j$ux)i776r8KRTZ?zYHq=~sUOHM_KlUAu3VB*iY zf$7E#?3j8`l_st(XcQ>blWGoi8~Ge%xqwQf8+xD@ntK=@EmM6T&9}u0i4&%Lx)wjs zrHe%E*TN_>rd**1DNM#%?{f3mK;8JXF-opcceD`#`3q|F{`bPQcxwx_SaT1xu7%c_ z8wo#J3sYW_>+r#gvg?M+#IZ|1if)xZKW-NHQ2C3N8`$L{lJip>-Y0nOc+ZRbrn_In z>5CP9bGcTSo+Orj3>MLuy+(=68tG_6oMq-#RHqs!1VDX`K<`0sxQ`L*&o z-1luP^}C}lV*~a0lCDTndY6>VWrBqM0Fx<5EqVO< z;>$EyGbCLkS(0uN{FSCi%7?O#3|~?Ll>H>PTBpD(Z zhSZXcB1o^KQYGsMS!27lSJG`?j#4X%mkpT#E*b8T+$VWJ zvOuy(LJ#X-75OXTUqXJ2&o^Gx?@0?yDj5DhA#XcFq0qlNBBAiVyOhw_56b1baF@Fy!*!cLA;hA01_m)e2UbAq6CnHNKpbMk`hVC^m4iPf?N>5Lia96 z0$#+BtyX{}n`A5-P@-61qpu<@r(x23iJC7DNqv0o=RdO0!r|%~PMKJ3lYVIm8BDFv z$(R1l+{fNsE@j7UzozYwn3aHv1TbCPE;Y;>Lv2iN4|Moe_R!)x*Wihn>YmszV)wDnhsZmC)ncA+5~ zCkcaHM(g=d^q4hjJ)DOVA0q$mf8s9D`=YbIPJCGOz3Aw#7k7((gsW`aW1JXxkrRWG zYj8)tT_g4mAWN>lk(CUgWZ645J*`Q6M0`{%N4w1|R)JWH*ezC~9>1~vLuhAQI#C>8N`e;YVM~t+5DE5l=$nCgC?qlLAiw)>+ z9l}P0od}x{t``r8kBiMHv4O=}5bI*GFk&0?z2sx!L2)%|MvN5k2_se*icgBIXk!zD z;2J=%&4l1)u}^GA8(YLfVh6&l82f>IZSg5_EoyH2c`!(BmMY~&ah=#Xw0-!#{`-K* zPmAl(#}439=pAhdx&EEv2H;p1;h1<>JR)vHe^n!8C>x=&`LSp*@u;{7>Gz4xh?^1K zk8y87_<*&X_^h}UX%C{G2gPkKa?%EKz7Mgq?MUk~({{16`;fNLOnX>bCv{5e#T{?h z`*({wF~a+4gwh77OWMd%9}yow>VuRzZtFbu7c`$vUiHOBMv|#mDv=yf`tUn&RF1`^ z)3NxuqvNB}bzUt$CdJMjl*aca;#4RmkE^cu_?Zid5!DWFVr?q2CpI(`J3S;l_gpG+ zRJxctaOh-L*o=nL;lAXEq*lbnQpxBAIW`&{NXpUJh?1D7`P}Ah+dlW)a}PbTdE)~o z*FP8AIMKba|72VzR5V6Tz#ldhztW4yESKh|d?}q&a9o-*w(}&PwoTbYe$tlGw;<)F zkt*8K_O#>M_IF&=9LF8uIvstgTb4$LFx8`-b~QMZ7?Gl<#|8!@IWclZ4Pt+Lmz91)3^t;ohmYMJ^5}FK#+7jhx>! zlsLUkH%7w(Q&mrIvhJEMN?Rt zs5TP08ogCgw-3Xc;+BJ)P?mAmE>*V8Kbx)Wnig{Iz|=3~%2!RhmV9e+LNF(kkzd=8 zt8K^s+X1)VwamGlt`#)E#myDL4+s9(iVYw#3o?~ouR)y@BExj~H5{axMNZ_;t)n$t z!=?1~#6UO}K9c~L!UnX%2_+m;;)z5= zb+WLx(*Z0_ic(xrT|>#_xv^2zF%lb=RNoWq*FIXEPF}9SXcU@TSgwMvmM4@bYr$N1 zxe4hQA*XDE2S_^X&g!L5^`*&~$+_d%P{+;ChK10EYZn$mJ2JwKPnUc(KjL_2^+%zq zWjn$-=VW0W1kC7%W9ZW-X9RgLR8GgWX)@l`5XgV}2<}8YFCz zPr1<;b7|h#KQcdVPxG`lCbk@wQe*On5>B0!!lE<~8yiZ6HN3HabRZ1E5gtg6jffEj zr@jg2SZZM7{eZ0-+as1r$*Nr$SJVpp(wi|>gh8#-CYNIrs!cwx5MG2eAj=`dnYS4c zB?51X``A-=EV@DcFY;+Fs!x&Q zu)OG5b2IKV_mw&jLXg3-<72;=A&%TRsX_Q##bza_x zJS$moN28)N6pc=VKLZl1#A8&m6&@&!&F(4B`O7XHoH_WFCqG>Z)q${h%0Kd#fv|YW zb;43s$$ib!V*e)JQb<^6=!~$C5DT`-4I(UdgD6q#3=kaQ^eM{gQABkm6zuqMnW&&; zYBDuH(Q?meX|P%~0z?s5KjE%Lr|3wXWNGdpm;++3t8#5d&Kp z;@$CrI_YwThJ=JK3=>ty>11+xHbilMH2VBlY)H#th%9fX2581=Ku7wxG=y~pC)tEl2A4-Q z#3z!$=*In&@p*WkzQ`^6xo~@~rENLjcka4XwrbglaM{IGHZ8j;CUE5q%N~k(x%#GM zAI1C>qw?V46}8JDij{HR;9r*`w$kWumjBpqbG9=eYJ>`XnND9|jWXuxqR98#8Ey3B z>7nQa{d0o;`84_``b7umpi2yhPK0iRE`$O?H$u<2fc5G`PqC-5la7Lyj7S&4iDVdp zjU*31_CkUrD&gUzEQJT;tCIA#k1rmmf%6+&DHGCe}_&e?*E)iUP8RK3O{o1gmg7A;-stl~im5xe+hRpy83! z2jMN890(htUpO`*h7GwdJTMeH14#m-1!shRT8hWU6e-MFO##mo*4F4)DttO7VxW+} z;%6l>oIK5BxNs7)8dt*WfNpHm=xRV35ha;58kgi$EHM&3FUbn%1ZxXp861P8hazCN z5|H^^XN2X%O^Oc?o4c9Nn}lR=1apl+`?;t|%peSNQIl|u>$}*l?cxy0=2p?yNHAc~ z>0rc5Bl>yamBvErWFhL+RyJZ1^3S25(f|+i%g@y{6P?brY@Bv13XLrMp3taKXLE=s zOwBW5rA;p{Pl9Y&%b^%KNHuzDo=CMIoy`$@o5-(BgRqJnsxKPV#TF3ax}wpWIV966 z#OS8DrBKb~)NJ}n8d6DUeMVS+_rOUeU<3aaB33D&^uQs~aRzsvw54q?gj42GXpq_} zaw%e{%-J}svMJ2vr(e3CK~q97>NB9}I0BKz)~7mY4{Ygl$tL9F4wRPH!c(26fs%^q zpfa6y22e-?i3v&N2Na?yCN3PrkBN!`XtIVANLTj2104O8m-o&-apj5mwb!<1{hO!x zTR#8v!%LM_vpcTrc%%Jl`TX`@t<6?;X8fHddk8Ot!t+&-uQNi226q#~(Wogle~cgZ z;%*Rm`Mk&sND-P9IT89Wb4BQ@)xZ; zLVg-q6NUTO=;3)}DQDqLaXDY;rmy8gUrVmCHouhXuZdazwrM_RUCOqr{IA-xm2DY+ z8%ZzqB)vQ_^TbVm(}KTgF1F|ogV~i;eR|u;mDQ6pQ~yzA9Z56wcN98`z3*=5Uc`kLp0J&EGon%gXXjCMcCAfCAcRx zsZJ^{F?^B_6M7I58Z6-%#EVeLXnvB)ejVP=k4i32lZi^r3;yOgWzoL|{Dn}-$56@P zX#&OtnsQ}Tv;Hgon`NyFWv%nuzE`%^#JH*^U|gU{t!)Ix1)ANY`pcoYD#211MWPd>bWU}oAT{3uk&XkDMTlfH{VK8) z;wx5`@^jE3@y(&vhi*1+T4>&sZQioz-)f@BT||lW7r(o$JHovm@pM0EfByj5xnE0cV$9g5lcgJ?LL>vabcL7*Z@$=b=|A*$t&`w*yh2+3ON6I5Y0WqIXCDE=sU z-SAX8HYVfIsCM``Km1v_nrKGyI1|d*4y7tDa-Z1TPGPxDKYDls zXM`O+5MtsuT(~JFAhtqzD^TvDa^xa|Zqga+}tZtG+G4|*tX0@_$j(3csrW5Coo z9<7e*))iA$Vg-FE)O@FzK7=WOp{tcpcou)kW_axE?W|o2)z5Xjx#9H<^RZu!e7ijx z+ME$KL%~-?3cgxsqh1b@imz5bi8rt2uKG6F{{;`ORT4m#Ss(XOJ>#B0txHkD&G^=gQIAZq%n#Kuak`Lyo z+);Q0Gyz}{f|vX={>w)eg?gM*{birt4srhKA8{^c?Xt~58jT8)382yQH-h`$t=G84 z02@I0J4!nm{!)1r_nN2MY5!*V7Ta%l9(Mk&4L^R5f7to^PDI{!@bF91(G(g^0Hwm$uJMaQj$58+Il-jxReLoFbAb=u{^oia+u*E@%^vq-JHb{()2m{dR3Qp zy>YY?ay`b9m*wSk^phwuq(HVO>?m5Ww3X3;#E4k5BSui;*YLN}4-Z;7FDKMP%T~SU zUb_@3yL5i${A;nDoBHBnL)WzT+p~o`tt?+DO4S}=;!=RZybYKxc}X% zY}4)!n-09UHtTyl<9J+~xs~fUQH9N%c&v5ibbAPLpqHJrLvdoGyC~eXc)@jW*Eoi_ z3?VvgN1X0XY!hEKAwc&ZiPK{#rijw+;u4U5G(eDYN+RuHIF%%264U62l9C`$osSKT zN#UeS8MuG3CZgKdh$5w!UW&5KURVofV^B|N^))3Cu5=kRAy%-h?O?YuPS%6!*TKnt zDGp2@r*=(+qt+0RwNV>Tr>gQeN~!qM`5<#WM8`nIb&9XWd5~;Iy!yQ^e1{ykpG6gfhN|1o+gTR`<{V33V zsH^foq@^#ofc*mM{Sbc&2}~Nwwt_ca_Rj6cEr#FqBhKc3=wokqzUErpjU8F~&mC#gKS}Nd&bTehF zvK(TU`##Kyx%|bj0uAO7nwuk^HYucqDVClVCf)4v--gS7Q;(8%vs*7`+J&os+T?IV zr22Yg>H)Ndin5!5PInPuRbAQ*zD%pcs0+I=@ARlX>m|C04ywl#7*(HzSLVA=0|oM= zS~Hqd6owQ9=?aMoglfz&ksVm1>15+ch@tUR0Tz83#s3O_%0GiQ#eGu23FVg?=A=b; z+frTqo37VgZ#@6z#Oo8+9?I73oC$nfQ#(6wW#Emc-#q^M@%b-gYqm}Ma7X6vm_K*p z{&$~U^zF_0t1|w^#nlhIyJ2y4@2$$_jKBF47uUM++H={}4`hU9Fm8Wq#@Cr+S-0vU z(*fe;LETv3HnN*?LbYKoz-$G4F0vJHIb9k7AWCC60TEDGeub`13JCx$UtY+{p9RwP zZ}S#g4qG2C)MzQO83`Pkctg?&4glJ6kte3=E9S3P@8xtPz)| zk~|FSoUpb{4DkXxf^JeGN(#0&5pXwJZ#fJP_tcc8`VWtdq!PoDZplG+eS`#7d7=zT zeM6{amEBECp9(8jfUxM>E3FoUeT9$^Rp8 z+WB+9DLIxRKoQ1hfPztyh(!4kQef!i(y+h^AkE52I|u89zk$MgXe(GDwCd`rY@o{u zp`+R0Ga2ET|GOXr5^*<#kjNk;zlNEA25_j{FQLfew1G%dpdp5SoWpO9BeuwB-2@^( z`vxL8)L@b9QV60C4wdFc`t0qeNwMFyy`xiI5|;Xo%KrpI0DWwrE3YW*_{8J|lJ`cG zB;*uLeqvZ6e-#B~B7oQJ76RIeghE*-NDb-C5&KX6CQ8t~uR??!TglV*){(bQTs?6^ zc()_#>7MGzxjo<+q4H_ZlCS-(_}huAi5qqA?#LVl8#h=R($0)!3n967e=JDzbI z|3?cPc^*?M0L<%1_?ZAhJLoMGrmJe19Wd}WqAF~j1)BJf(_U8ptwpa8$ zhdqLpG)L)V0#&#VCLY<3gTaub@tjfEDAD!*sZ)lP+No3QoP`8ttcjnvo!1!=%s`}w z%AbbP#ALXzpLHZhr4ei_$3OyxqYf&S&oAP|0nHjVk&IF$nH1{-7_ojLAd^hrwD`go zmO{85ooma6S~5b*$G*^I$7ON;_>F-@-@_Tl!y1ru`Ib$V2m>QCe~i?ZV0$L=GXT@1 zGY^hZCjpCOZ2?> z^6vz`#Eag$a(%{}kn2Y-Ur;w-$qkC!kayB0Qs|p>7Z}5m&ZEfXVLQ00C<{L)g_M~% z*lb44h$S~{CYq56V1}gx(eNTiB_=(9byeDvYBw_Tb;OVuG+5C@6_v$&jAGm%$pl4i zkdC)S?x)n)P*fa0^H34X((b{Hcb5>$4Va4+zwG!Gn}I!(-U5h6?yi~krag3$6e~yg zv|!9`(g!`f@IsAc&yaqo$f2%a^aTAx9?N`%ST-3*bsJUFfwcFhKwytiHXr68V2&`D z+Gpes_8PH#nA&T^2lpGXd}zsiJfCXB>Jdo?jhShC1osAwMn3KhT=ddsQaHg~=3hN% zT)h;Pxi;xf`v-w1#V+j{qPYVilE=&)>7%?RVE|qHUwoG|lkq{6UTfmrQdf1u_dx^E0;d+&B1Hp66cmI&d-YYxWB~ zGvbt^D36B_w#a6cAC|v`U%CV{#dHvNJiE?FBhtlDdG|y!F)Lj}jO-dp#$!Xu?ueN` zMI4MwIY0e#GS>YtxOML7>E|!+eRX^xxb<%s2mErd90vO;e?jGA@(~p6mEVScRQ{Ln zC;q4#k0wUwNd+AMVFxH(OeiV(Ni3CF_2GaBW8~4KoRY*Y(+UqpgQ@U^nGGM39<~gb$%OQvhncjo>&c4?|CT z>cXjw#LbyRKrKD*zI9{MZj3>v|!aOiGfWvEq&2XaQ8Q2Mu!uC`W z=6&p_bqX&wWSEtbZ6DoI;(QvBf0IDa)tyQXC*sWT5W-1v1YOVzjg-T$NxXj;P++Eb zRuu*myobOHReNk?T&9B_lT+EDn2GaDLQ%cXl6ra{Nkp*lmgSKo&ejm4lEb*YhtTSUFb96^p~96Lx9GqK6Ku&iGl3 z19p8HID1JVBNM41>M*bIQ*AJMx5FN|GbDePW=-gy7ur;p22I?cv6Ha;dzAhAG$;p9 zX;^hKvryHa8pg{eVB!f7eo|Y5wB7uEo$J?^S0)y&0hwnm>QVQmAq6_A=i^H*9ZuU-vHfTi-fNXUGMA zWNP1^x&t{O@LKH~6?6U9%CqGg7K9Dc&RgE#Qf>Y0g)0}xFmuTty!6=2W0wxi9Gcso z^|$AOO>+Y`nH&MqwLhX#wi9zIL%{>whe(!~A}-T#gRzC|iJr|Ju{Czn%Mcwub#Xx$m_5_HVa; zXB$ucPS3%0_J7ayG#*@I|86T!{u(Ee;;3Xgo#yZ>r;ubZEBD|jjicW#IhZlI!;s_q zoiHl*6d4_Y8Ib1%%y%j7>oH>C}tiOc>&45D$S zxouRHLwMeHl1;q8-!?6?9igOIE~H_gZ{fy4T%fVY=O=EIO(I0;$rB} zP)Gg`@W4)JedXVw1Rr^~$RpU{E{T?$-ueuIom(&C<^P0?iE=9#Su=k`a3rab89iQl z=;eoC_mUI*m)tY%OM#idt05vX-Wl)Z?Kdmi7eJ&_H`hM6u=c@4;h|j3s{FEBVQ0de zjyYBZV`&&et*F;FP{GDHGMlcvA8i!O@TUW;bga|lm>R(x*VwYJQv$h7x+!lt{oHjyT_ue6!u&mg7O z*qDpC!ep~QDr-xOqe6j78-u0Hy9cYKeoTWcV}oTnDdH`!OlI^48-1|rBys1CFBLg( z2v5NwQJrK2Q2rc}@`qbsl7v0h(Dy=HFt;&mk8(jMXAKkAD6V!Ne+p z{&PJsMKYh(oirYS{Z}ebRgh<7{T0h9c;;?onFH(e6`5KxGOY@DgAI`nuiS_@GIWq> zSIGZ`y#GetkI19b6k9na;xXpLynjOg>__H{+=|WNY=ofX3jWB(JJ+n(5nHC%ZI{#8 zuoC2*9V;#{{$&_iZoXB~wd_O)nX78uvYTR%j8-puDCWgmuN5C+x662Elh!R`hdLIc zySpFIutf4o8(>1)U{VI`0Qn3`;w_`VUhM-%V6-}R8XMvQ(yezQ^bRjE%1X(1koV^_ zVVx@YDlhGt*)?aI+XrDM~U^fTXcoI=BR;CUG@6y?d#; zZuZ2L6Vts*l`!S~+U`tf^@pK@i|hBi*PC5`Fw=1`BOJ_ys-_>vI5hL-zaV@C;=h3) zjz81U7#QxZM}$=FQ1@c`z$gM-kuwAt5ak%M=#?@ab_VleD!C$GnCbLR(r*pTwGo4aYP~H!7i9(eq?cfz4DPz|rtP*ZGyh zhX9YbK1T7m8B!lY zbp@=%lOxqnACoaLlr~&=N>f}y`J==JB(2=U+PgnNlhWQdxw2|l=LKr+un!!3+3n+AY3Q(nc7e!Q zWuB905~2lE=TOCAr!z}>RWLv=6Qxpp-I&bLBvx+Q*1VERoE*zj3u#iPal9&voh z1RofXM7f-L6Ub|&!ub9c9-fdFglDxZd-PFFFrk|`nLIB|_zw~J8%$WRdsZz~ufJIx zS*VU&JD;uIG2Kg6Ulkc&Q?9ap`pF*(wI7$Qp6|HUo-Nxv?abA-+^pTOP`lw;@4M}p z+6~#-N2mQuf#9WQXP$kndv^bo{d0Itvt^-qOE$1|+LnWUrS3}IwCle+oSqtJxT;#F zZLbPY0>SpbE3)WE%M1Qa^jKCg?fLZfPW>t1s$6yb%f0j%aMe$4Z`Kp(`vDg-kU<(gFj$)=W#SRfkR5bd+>rmgb@SJnQ*|=i$IVTbeZRHYBi98RERKbf?nF7|Hbko5qcsU9KMjnDKuqv z=z2|=9ltU@PY<3#+dd2({w?L^&Zic3K9${hI3pa^I6CbOtHW=8g*Njn&N|ks08M>C zG?Cf67T7arRu9Aix6%N#gBRFpnZ_dv2!#n;jW6bpD^|O5l^Z(DF0d2g#5~B3>QJ@#w(VNL=+Z_6HpT z{Za@k!{8A*lWo9=MnVl04?Dc&;XdjN9FZj!xyq{kt~VV&qTv& za^*F%^;hcWc4W(2r+Y}w4pL_I^ns58^{;$>+D0#*%X5v*)B7%W%sff^hS9l7our|G z>X&ZlhL^*^#7IeE!?-9-8Swwe2>`wfPcjPzRlAevcDhX;p+$H zJ0ascY{nUvrVhf>OkisvFHBw&Jf^ugbtVuP;B_L z7~3tkp=tW4g+kKT6!%-o?~MP(_*4la*8iCyd<|_E4S{vcyi@3XMeF_d?0@L}SKj~C zy)!$iBFzF#oAn+;?{WwIs=**(BK%bvD;qG?o7kuc{kpUdd5#4A{CE4<_xgJD4?vwf zsRp&HE`1Xy6WyO(9qsAp)kOxndffUEz>~Nh%YS`N(H_Y9wGB&m?AmqP0~7-l;$#*J zP>c?3me2Q)5Pe55kQ#{0Sk&jJ5M{CANM)2@#Y|=Se~q8Uqg<9H8WldH>O^_|TSNN1 zjON!9xbvL~TBj`aJhjX^B@Kx-o6;rO@Qdc1FIgu40@Y`uEmiW1$en1nuB1ixhMRGG zk_M~50(pwccHN_F0RkB7r@dY%u>dkn63>zU>1PfuzkF;$dYxB3vko2HEc!oIM_2t3 znm`xThb1fp3Tq$NQFNkF!^ET#c?#FPPbAJs&mo00g!HufTh!6#$h&7_1a;i}@Nysf zej~nr+1u%7H^dV)rQ7}~t!Ak^22L96L|tkOpE1JG+tiloO9cdDXv2ob=0!0B?HDq! zRBB2`=!ptTGy3|;e~fg7(Zp*8eod>(mi*qZT1^Py zU?Q4D$9qy6An}?zEmq94kOmXkh#3JU#Z*aqh;vfgXc6k>QThtkz!*MJh_7(TB+<(C z@YE2_QA2njL!UB@K*s?)26*_o9ei6N$u4g2twC5@P-z#m$IyJR6PD^ERk9+J5Tv>< z;De`7!N?@TL*+XZOX0P_u>7~I)}9lO9Xrsc+TpR2lNy4xMg9}2_$-*4UXwwFmp?@X z_H0Od)EJ`r0c|?^mq9gEU?-K6$U95k2zk$wNBogJGt-_SeVKl~MBc09T_Nuq$33^FW1W-c|FvVavts3Oo_8MMmtC-j$@wam?G(0jYT>qrS$NA+2Wu64cf-%~%`~3s zUPEHWkd2J-os>cpI4_HNt)d|B-bBS^iA$&~3_MGUxvQ5%Glt diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc deleted file mode 100644 index 08d7e601acf7d2267b6f714ddc79e7ecca6931ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31607 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 diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/_textwrap.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/_textwrap.cpython-312.pyc deleted file mode 100644 index 2a9199c156176e597dad142bd04effe439b0f7b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2416 zcmaJ@TWH%>7(TjKmM@7D=hC`~Q#Wa{Xl>)($J(-yHf#%nWMzXfcSR_c+Q^Y5_ef6c zRE9G0;B15DX~`&q>}eZeuY2$71|v=y?5QgRw!!*lnhr`BZ2z&9)JeM?!>{i@|LvTk zPyg{xO-+6TBlyERYR-euZ$#M{pp!vuB|t7B8OfA}(o}+?2&OeU%_LYCdlDX)V>B-9 zO?W9pqqmXF&LP>Ocv3C3G<(DfQ&$swo));rL=h+_AnCecNtSBp<{0SBNkg}koRyYz z>865{jVas&)YfH~T|^2>P%=u;KJ?;G_Q=#6n_v`H=45(~U2*fklD#qm7B0^Uyc75U zN_~i>Oa@B1d#`!2AfX(!^<%A+MY-|FW^HB`&QGRR==xm2W22Odcf80G57?AUM*tN# zo0F04IfM#co3r860P!}RYOLsn+TInn7KLn{WVi&DJhEvs_8$>c%IgLJ z2+Y`HlK$~OFa*|N(o)W8nZSxPC2EF#Q=BodY&sk{5M6edjFAz14r?mf4JU+^X$6~# zEG8$j`jqML$t)H%RaYEu4Jo?gnNekH((#)aDXEB>a>H_1O)@QqNoGM{#Wa0TKDINq zuf`{hv=Uc!OH0Nx*hnc!%OoI|HgfT4MW2pq>O?$~w)od|f~Ttt3Ln~nswmk=9zwi6LcCuAyo)H{Inax^ z?HdL9<+Lj>Hp)>ii?FHLCQ?n@%~bPjtnONNJ$GsEgU|m9dJ)=y4RsqbKs9mKD-TQm zKl=>IF(08B>U(B}5~wkOcA8aPwNyzHRb5te%V{;U6Q*)23)r0!SlkTDayZu`Y-lo= z_C$4%xfdc$a+ZW?_y9=|1dd?I%{qIqkrIuTF7P#{K>UfG-9ektBjxDHQuO31f2a~W zT8^DB#m=wt(Fz|d^IdCv*V1%}@896NY7;$ce9!Vgi67kHd#Wt!yZA8Jy4icSIPxHP zxYB>2IIyL|SWH@|*!z3=RLBH+@42|e0ICx7^kBdftrsJ8;EIBU-pIlM zz(O%$zY|Itng*8%`Cl;vdv_QjSaJ*wPbfmJ3&-#N+kiW!zM0yx&p?9bTiNC>)z9D! ud;tuk*_qIxQI(-6>JjSw1NA&ap+~6yDR+#DE)15#1Eui5UkH?1l79hcfHn&N diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc deleted file mode 100644 index efed46514328364c5ac9071203b815bef8b2cab6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1191 zcmZ`&%}d-s6rah*ez{uRtx8*LQ*SAnXg^e}NCmel$WrhF%w>$ps9CegHj@=sdhj5n z(u0*AJV@_~2X8&~Kj>vWX;TVNbO;_oz`z{Fjea`GyiFi@#a841)&Uaa>>bE!QDg zqdq4WDzNgLf?a@t22DU4gc{G$0uFC{HSr%UVhSd=DQM9WFN;BJ3Ol~#V0-<2#wq5d zBEhEQyON0)sZ}C3thB1zMNE`LLZVAiD1mjGxPybCg<0p{WZp=9eZ5k*R7)z&R>P#B zW#2E5K~*i_0#OPjf7x{u*IQzGcMpwGhv$(}&27NC7TFQd4^}3t9lis(IIQDmoQNc+cH*ERP-&I zO@RH)!vzna^_JSSl$wd%9MVa}1~^T%?J7IUNlHFW$>o+O`;YfWk0uT#_FtCo^p|7( z71mW&=7NZa{i5dtJn=m_=EbQwNFbDV&7#eEN+R^OsM|LkMiDYygPJ4m0_!9YXR=e7 z>7e=blI}WAca=f&1t&n^A_*Fj+wzwDDRZ2-zY#qJ aFV0%qcIS5H%8%6J)}As*oq|`@BK`oiiWU?A diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc deleted file mode 100644 index cf8823d56614ab9bf2ce46a45a692c7e2df677f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11761 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 diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc deleted file mode 100644 index 334f432fcec29e886b4ead39056e9c191b6d1e46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134657 zcmd443v?XUc_!FTpn-0n8$jbt5RC@`Gzm1{6bVw4KoF!TQjj82R0LT8n&>9kAkYn0 zH%Ji%9a2`-fJ{fEA0afBBRcU}Q)5j`@0l4ZGiP_KadzXA%%fYN((Mj+7T#!QlAN6l zWGbte$?Vzh|8L!@>PCT-d)Ru`-9v@@Moz z9wj1Sz4xE(7RwDw#1gSiTBfWcRx71#leQ`Qh(k>~N1S}GWTb?zr6Z+$b&a_AS~gO~ z*YXiJuJ%a}-nH|)4x}qaDmd+&teoNxG5te?uqzUPYNabYnRO3h^r@fQwrdmc?IPF7v{m6Pw zS53A~1x5m#u130Tq>a-xNVku)bJ~w|$4CdKYmx38>Ev`B(i=uLaJnApu8}TIH%xX< z^^Ejzx)JH%NRZP_lN+Ztjcnp{Gt#{yy_{Y***6s$330jw>CGdXIlX>z%hcA9t(Yg|+!9c$%CFsNM$$e9gjy!6$*eKVW{#2$SJ(1u$8^3E4zegThGvB7~TGc#{ zms#|GktZX4uR2Bs$}Ewi`dyid9E)su)j4t?@>FCiat%g($TuvXBK>q^+pEs+s*M>r zs6WB8XCmA2&XCP=*b>?CswJ{B>YTVL+pS-}3wWnvKlM+Px!u zZ#VAki9V^leU$I^+p^c3DdadA5O7X&xB>rCNC@@;G0cj(x_;nCrtp@YXqPYxV=ZipT}H++2P1RgpE zP9+p7#B(4Vc_yrcr=sEmDhDTHq2cw<9`!Hi2vXRQOyJ@0`eG;)>J6kq z1M!P5p$O+Gz)U1>JxS2Rpfau^2c8a2oI5NQ>%EVWIBKzi)TC6zV6jXXb8>czC8bUy zi)GF-p%N+e5ntpaxMZ8NO_Uj*i1eIABA$bmm-bmKm+W))3Aaf;tIU_QUadu06()Hs zb9Svh$DHG`_3Fks$3*4ooQn18BXjmS$7$PdS#N-ZUfu7oT(tf(`vq&zHoJ5zmP`fE zeSy^3XdpRrYCJK8*%L_y5~l;TmUNc?NxZ6V_u zdJX-7lU&8AD5eMA6!k_zfv3V31E->aD4_D9cy~DH%3D);$9OoI$~zC!ClCnpcjYT4 z@xcIn@s;^<{;VW@R^AN+AfMz*#0LbOc{`e&FV|a=cTNFtV|fR`xv~o#o+L=34hh^p zw)t#gD!MrqPfd<*#)O!_#7I)&<*CHWo6kq%=QmHrPHmpPm^zz?Zx3zVwmBI~Mf;|K zU@)JPo5u+=Y#vW2(a`k8d=oW?J9zYbEExlY%l0Le$5AI&K7quaTmI&<<>P8gMdj;< z77l%F=VHfOo8H*8y6#){TPK$4w#^@2_SR**?YAEJ-v00I&($?89=pzjaPr3Y(RCd43rP- zw!T;4r*pf9&YR0{R(9ecO*Zb`ac#QbE_D&8oAutiNZg$~kbT+D}vuL(nOeDM_fk@^~rxF${Un zvmmdrDV3x+^PW@Tqy}wy*Z5R~@j7P1R3z_GqGvFTqDsDWDw-rpq)!3mF)FTRbo^{| z{M=|fifj@5z}G5A@#F~pCttj;%UgbTi$oKe0$`!{hvQ~XT#o{tMaF%-sQ?| zw|C#}U9ngntIO533-C46TIDFS6aQl&Db zWA-_#1lEW(VvAXSQ^V!QEkXNmz68`QHl8{ZbmSd`it_f^*tFt7L3sx-ffBUkU34XK zmM=dQPK}=(O~z)UNuo!AfaqN(-&aoH)=T)GY{%)c<*wWNHT&02zIpIw!#9R+J-Jl- zNZNPkht7=e(31Ob+HqJphHM32OB1w%CgmR?At)f2RqJorh)!Izc34ulFOE)&5@Nb$ zLKiQW&SAQaYP56CdZh+bi%Ks#kkg8sS{bjPwoA6p+b&pB8a+i#ji0tA{rwA;m+dcD zE=anzUnTefl@%0|1?*86aG4B%h(c2?eX zRs79ecReBG%ADKt`p$)&^N;5I_45N)hjMOT+P&^()pzQ@Re!S;2pTsJ=Uf$kd)Hn2 zGmG8i1w30R#e=^~hEU5Z)`1S|tBx|uJS7&&1_Ji41oztiwFim!O8o=P_V=2dln&VO zd=*IW1lWjjzDUxyecp1~8nM3Wxn$GXBO1ncY!cJ~+K#XXqxx(#HKW9n%uqz4C=-a zJ_24n9wDxPhEXdW*!9BM*!WpyC%CE$QM?%g`*AKB=_LevAqu_+S9&Rm5mSJznDL1M zN({|5G>BeTxfk^#z|1Dm_UL#N{LVPO?Y#Ijwe14BIBzI$BormIEx0G~zHBBpVg}qd z^~3pC1RsWsQv{dPyuo8f2&XI2$VA;S4$h8* zmq3&lG|?8k0fs#sqrMBL`niA3rc%?%{>_5@2uB&Sm z1^k;FWpD`E87EKSmB`C^pFZ}Z{FUnDzbq!dD@lUPx#-2&Uc%p_4E4!TU>FjN2(kg9 zp?#A8pULF@kj(umzBzdaCopg;HhWoXt}&Qx+?;9LeA}_qxO0AR#bxm~+<5f*qiJv8 zW=Gn)A?@1mHy@W;d`&;ISj$@PR@W~&zuNoSAZT1!>-{8Ak}p(sSbo>vZ~uL3za27@ z9gPA$8^e=)*)viO%|png$vRt|ngNUX;;BSpvNymzK(bQ_H82_hzB@(lRf(C%5G1}{ z8OMF@f-#Bzn%4esh1fl!Cd@zLTmL#x;_Uj^XYo|0t2=Hr+;MM9JGKc5gZWdGRbqw$%k&=5{zzyJ`y0IxBi9$*_n2uXgKr8J&x z8j|f!3Smq|TF)h;fqp0+&i0S7Y!OlkV~B(u?WIvs9BN7g@PKOIQq@{WKnv>#F>vZ) zfP^2licly3oRW72wyla%X*U`~@`RFK^?iol@qtH-{ zes(52NuPpWrK6*f#5fWT>iN7QJd;Y~-Gfg*_0+)d!DB~;hw|>B;gd(6eR}w*q2Uwx z(t|^X2A(^1BJWlcqfZSylP?i1c-z9D%$Px$1ZeWth?5E zBX~Xd)lHX=<{bUG>Sp8b{kh8e`N-?Bh1i$QT|S(1>?(RbkgKShKk@nt3om@>#mk3s zj>ko%BS5Cw&$@2kvXc9(6#4Zi|*g?ECP7QEj<89qC+s?-#uj*${C; zky;vcMYHaFu=E3WHs4Mg@vT5xS!t3JIpN=5cX)*HUK-TbY{qmfo)uEH`< z%Kk_Ib+$(yi?rd|5qUh)j%#ORAku;BhKr8i0c9&XD*Tq8a9&i?0D&h72Z*(ag(rdN zKtJP1Buz=A;8q(mpdal}(Ry`}OfIj+Q}Q()qw<1@_B17${mm%w6z z@Ipw(JJHEdAaEoF6d5PRe{%97@qt<$MZ;JeXI zRG-vtONmM2Orb{u-%Pqcu*<~raUB{_NhG6V%z8(|N+fZiSm!5nLH&&6)xHfdF;LZh z=qa_+3N(KpO=!J%O{7h;kqF1AUF4*nOq%qF#e>fV4Xiejuf|i88gGfZ-fff-( zno2-38i@+Hik*)d%LV-v;FeIV@w=%{-JKbh!P+eD|mw_ zcdO8O6F11pmX>Q;>ZY$*^L3=!40L?X;sttw?xtO%{{pc?IjSVN_fH+hX zm*D@fl4xQWYt|f9*V4tzKoDqwmQ zGgE4PVj6NLfFk5cQg@tMYcfl~X6s*|hv9jAMj<>0gp`QmBtR+|AbZ$@z5zu|lh!q; z!mJztCP=%tkan32q^xo|{g8qPlu2o!2#XCyA|4QW>kANbll??RpobKt4F_fw zbU)CjU`T*cNPg)Ji0|f3N1YET3SA3?fj2>Hp{apFL@lfE>mJ(KDrlmg@L5pO$E3DT zv`JLM9W@m@bM|4aA}xOs2A)7Nd^(!C2<_tZG;sr}=1HL<3cv`oItJJR5CPzc5$P8_ zi4HnF89qbkCmLt$BY;=$qlfel6&FRnKv0?iDvA>)gU`UA$Ii#lG9nNlETsH-NJ#|* z@}N4CS$?8^Ck@$TG66>6Va1#QPo*JI`Y@FNqDc}XD;BXM=z)inqmH;_a6skA07lbQ zHD(m_FFrAG0fuG}EVeW2-HQegLIx2UJE6=-f*};Y0L>X{%>&U@0NODc6bw*AbOg;5 zB^*P)1EyKKi-h{@Vf}LswtfjFlHVbEV?>_JO$sFW;7(!;N==ho24`21x9Adv25{7X z5@CTi?U_RuTiG?Lx4?sIR&f}8w$_Qnw^G*tlTO86Rzcul;35jr35Vg^1%X)W^I{BV zqcibyaWI?G#{pjlo0c*IYb&@**igAV&PvQXzz4ho*g4SdPxFEFIaEH6@40Ann#s)+ z)67YTAZu}b62NeS{RFgq#gBd}*q~LQNHa@ZpyfilUVs~F371sUI*jT~zOF@?&9~HtBj8vniXX4|` zM9MD;&>ewtS%<|~0os}eQfSeOTB*p5T9Sbtbs&2|-V!m0U%e0M3zQR0jfXTM$(Tqr zeG<@W($A-9j)ubUCdotbB-#XO0>MBk;0wBDJTaM2`kA4DEC=Wl9K1#%Rcw|F3=AJX zf^5hQ+k--!rQoVeKF%;G#N`OT8^E^Y0x($2M#Q5qM!*(unhQ56XdLg7=&4G7B-#Qq zs<0+#&@`YAci4tP*xZ!T$_CMV;R%bbk&P+n?F($>5$uggdl*td$fjos$tSEs7o@9D zf8aQNaW%49rcwpM5Ns?$QqU?9c?kB=Mo@%a#sh-PF}pHR@f(Sc`sGMO;^R zff>yz>IEV|vo+-8`Qj5GdxxZF2ZWb}iO1h}Rl91uOwTE` z>?m3HT5(*ioU>i=pcJ31Tfbg{S0Qq{fhNE^nH%UkRer zZj@Rl-_WmDn$7P|H0pU|3LcK?ms~2DD?vSO`6NO;r1wIp_8seF4*hzmbPoP0qgp@B zxwPEt^;|M_$u;LfZm;}3SAN+uXPpSh-}?1Z`CK`2YCSjS=A7+%4w<^-o^vCo1}SqM z&e(@)3IS+DH%R6%wm#fj273i}rc~8Gys)*YowlmgC6>}AMOCO&~?F)PK+%k2k za;_4&p@A32Tp50mvkM<{&dUc;el_y8%6k_r!II&;0|YZX zTOxSxymj=xwND|G5e&c&oAu-Dewr`SwBUR{Je7p?5`;bPCD#K3(~!4=0m@g9^r0$j zqshD-%ELT4!V^D{caBn}dACXpN1@@!+wm}8O?m=&&W!3#!ud+c%?cG+zG@YD$@_{4 zM819v%8;)!Ct~@kRY*PWH$&q2s#QcGU%gsKop-`1l3W+zI_n!0 zTGWudg9S{M$^^NdWDX}zD zxvsn2pOO$q<#1!EXh?fnbH2v3Z$r*km-e;eob|P5eC=spXt^nnZR*W5 z^=6y4WSX|zZd_{GJAZU}aF}XpSZT0q-cG63Wp`uR-FEYIx@&i?r6b$2Ez`1Xei+qm z+C$Hqm)+~q?#^3v>EPa6peq~LoeAttds*~vP4Q0B9(w+`H3k_N6Vdt{DE$t5GHuPpU3}!YArakQ|eoNmV zKkN|I=Df9OZ(FW&W43c&27kV`E8Xhj$pQ9f2L!9 z+7mzn4_bef3u{B?_wd)ON6NE4?cT5~`pe&x_4j4`eQE!m9GrrNuMemFAr#%PK3l&f zQ@|?JNUzzr8a!_`sL8$)L8VkZ~oE6lj)YtIe*iQW7m((523n_9vabQ zcYWI3dh<}ab62jpE!!N*G>7Jo;qk^@^lszwquk*wxw?8}cjv^<^>>>)zp;1T@qw#> zofXDa3JoaMAADDGQnWV{_|SI6q{A|}71^2*naGw(ELxdl!MD@J%MjhcE=s1IHw8xSftz?;#t>BN+a+?qg zw9Fik#jq!+7pSWoVA5FSu@x*4gzGZ;v6w0m^$L~>#=~PQUQoCq8b-O_wle%CX{HNL zY2_A@vwjJ##!~)}fb}RIgH$zH8rI#IyFMq7+im|+{jOYN%UkQ;Sf2}YW&=Ajft|VT zP1)|jO!r`}Yh$)+Ak#IFYwyao@5!|9`KY4QSH5B?Eh}FQ$b?Q9kje9s0QqI>1X9IE z#5xNhW89_-ar!a<9i$229Jjn}8&*ihz-;{|xG2QSDR1Ls`0jk!DD356nn0whfXkyjy&X1KH%EEv+GT;(;GiU-&T* z3uHXgg*Xx0IYXK4cSb6f`vAkbSimSbcuu4J8+i>rq#~t{3RanK#PT=RqPYZY;ap$Mh zy9ZDK0Lx=3t1$F$uA_V2O-rKoF6>=wd*9uhYg(Ue+LLM8^KQ=%kNj9!YI=75=v`OM z)rw_rQ`*%ehJbLoJW7!0AjEhV39*o3&YGk)r^Oc$tZs^E{`Kfi zYqIVEr4>Xno!xp^u$lJQl#}m=-L6z@ZcpY4~R&F_14AKPD~9VET`d} zAAsdNqWf*pC$erEy{fjIzKfg>r2p%8>I}A4it!3N-czuPnF;e}$ z3{+|8 zEeB^Kfokqy3l~5WVcud9z%qZP z4OnbIj4l@IifnnCa=vhdm6L&OwnEZQ{`psg*{AR#FRuEi-{Py!d3>)QeeLMt){JM} zmyfR4oMmmfs#+`!tY}=U&eb)1#q|l61U7zDV(~ZUeEu8muecXKoACvH%Z-(V{^n0g z@sM->?OIv>E=g*qR~iO-u@ZH_Yx$;gz;6E?7gGPU5%=D+I|n?a@3~5G<2`TFK+yhP z(2n~B;ttv^xDe7Gt;J4*j9SBA2d$Meq`>`4GtVXA@q;1cS&2?J!h~+|W>Yd*{lv0N zf->@$g~1ul5`=|`8)oY{TxhZWKL#$AARw87YX>{NX!AsP;)0)s^@%N;SP}rMBe1L} z6|e(q9Xa4~Q$Vh#VS|sIqGI8lqB|vtO2PaRf)+RkZ{T%ZL=wUX^gcbnTqc~GiptY0= zq=SeGDIs5!4S5N#a>1)BrxLZwP3jeEoXjicN@yKSkF2OS&<%Hn=Z<$jP*Ng#AzB&; z0CUY_@)k4t${cRadL){nuc-yUm?QxK{O1mc*{{zo%%)w9t7Q{n?J?c0_rwxpu;7Fz ziVoa0@}KHc+@-gRj(4;r$t(&Zf{tYnES6kJq%AlSAX;GX8q3JxX5#lZLs=F1e^LKp*RhBHhBa)f6FgwPfFuc-!Mus&Kri~|I3*-J3Sh4hn- zx_?Y7OBmq{rf>s{>xABXSrQGQZcY6ZC2M1D%RAX6G+##gZcc)9(aJ`HMz>h>tK`@w zTFZ51P2v5m1SWkb3Si>bv@yBrx@`4^O!bD_{_NJnnXQLGrhJ|EEH;vGZBoKDLIfa4 zK+$d_)}k%u!rgaOcw@@*6BP8Uy4pVwhHrqnBn+%0@IJVAURBG33A7l7;g`nLVC7{( zLC$uhAEC7yY5~$ifoVNZHF)t0 z?l>rwI$Y;!Rfm^=d5E!2b(bqmffRRBzBgJESlnItR8i4pi086QO7X zh<#y*)p_H70e1b&elRCBCi__y1q+V=a{(wSoEjiSM}nq$KAZ9;&_lkWV6Le8=Db&J zqO7by_gqoX3A43>;u{P51|iriNiv55neAd^)|&CQX1#qGZ{MxNl6QaFwSToT#r_Y3 zx_$$A%z(P2aHTSegbRRnR^c2t8o?3Iu#kx$jCpTW7Ghk7(c+n{;WO}D2t$AZBQxZ- z$!JWh*3rOBTgDX%JgZ_sLJVN=RA0crGaMEOxTpv?v?55cpMbeiMIyqhPOjl9z`tUt z9N}F(#DZ3gL>~10fMq%H3x;%z*=1;A4A7*)^JxLW#ts$V2A-EZ3FSI4>Nz?9Pz+`+ zX-t(6W<6a9Q}kTJJUUDj-2RLKrUZc$Fx8Xs_S~vk@@`7IHmzo=G#%+iNe)ezD%hLw zPwF)(0tzBzy?KP~-q56A@f&F_nTn8KJ+0FbVQ|!b)cRMFCFAD^S1gjYM7*t{A*OWz zPz*)HcnS~(*D1Y*z{SMD)Uor_QT{nPi`@*A?;%yB_GS>6 zZI>u`Z3TOR03d_{000e^dc^(e%G7mb>o#ZVHs5x=8~ow3OLb4oyFU~rTG-u<`flTd zA$>Q{wDsP%ahD9W9IOL3iw`)LnHm^4KU!0KT=|B%WMd}R!12ju48de35t$hfQ=0iu z#;;MHT%%SK^P_n%zVE8NgTQ|69N5n`;Vu3)7%A-&GQwHz#r zeyAuCL{eA?lmvX^waJ&a+_wgTZeeyL7n{6C{U|u-z=&`Vw}csUfF72Us(@Wi;mQNg zU8v3TKDsA@HBHA5!3UOj3Y?iQnIy&0G=iqE;r$2nevR1mv(ICx^v&DI=CprdKO8)uoxHLB`uh0;su?QnZiiLsJA1#i zH`}o{)3G<*z7NhbA9@=XJ1MeXwy7`E)c4MXJKjffEp2bT_{NLbmMxixh8a{lhDKa}x@Zp~yj4`ntF{V=k$`RE7!V+a_74Di>eZMgBo^(WFT zTbBG=(>2>}x7|K)dq=uzHyY!udi~tMGkO`30HqlToIrv^Oa?=wi;pXf0MFu^ z_`PO+>s7o#;^*wTLm&r2e1e_;%Tj4kwh9*^7?x?=B{$)S)2aqSDl#BV8CHr$MhR?m zbE|giYcw32ko&S_8HQCyuCn^|a|`Fvl^b$3^*8oj-#dR0Qnt5-Ze}VsP#)FzN>#{% z2A?}2js$lCY* z?8kfP$JUN{$8u$Lx^n$p2GyQ7dTt)Qku z#!f(&if(-Z307YiArJTHKqsnqsZ%aj+USmW1cN>}4DB6y&hT{k7%i7p83@Bij0Lce zg49d`)?yIp1gxpu2@IqQ&+#ah+sk!C=;$#+4}xuGwTQM#9Mqj;T|y9a09b#5CbB1> zYVS~Tbc2vgVb4P_VS)5fs!GSY7gC=o#-5mFUe3wjS< zBD@YOCliTtGt+XBj;_`!ynh?byhrXsXeRvCnmZgkxedyHLaLxzWf^zYs_S1A z)U{>%>bmG7`D@9$axLZ9m0jkni#fl$I#?;9``VOh1B0S@vn!>5RJ(*!OmzEkLu_GI zyRpBLs`QjbZ6eFYC`>~AA~d3E9&*>k3OxMN@WFx7*To! zDV9}(Gk_KcPiUz!*54roPCOJiC_*QIKxP8^xu#+M*oR*K zyk|9{(?C(!01b2l2u$*)uUJ6}uW~qXfuA&0f;OHa_O@#O6Om(Rp&74I*2YE+*18%% z)CVHcgIL+D-Xh-XG=c?k$$F0~)LfPDDo-L^KzAMVhHn0#U;lwRk(gh^DfU=E9O`d& zE>(7?UEQKjG*pc&$SS5M$*RU6ta8e5e^eX#Lugt;3h~RUW#KTzVb^70{`n`=o-$;= zZ27RV=1XVhD^`yUAv#7AnhxFAN<5@Pw#jNS_=ahOiCg*?Ly+*qz;UPvEYqX)>@46* zB27Xd7#oBG)@QHz1ku+8(o`D+oC{?HDXLY@NJc$13az3#Q_X}1A5emE@gOzEFPE zbGNek+Kw+xq|JPVR}T)}E`9(D(v(A8Z z{lZsC>p0o(VhmV7DCm@3Xjr~XlQxP$RQW4B*I868--pyIv=oJjJ8Xt?3v*fThKzT^ z&B$7su79Y0`L&1iizfH|a-HI$kEOC!^~p!nC)!d5ne8u4yQDMY?Ywzn$-6P_+PHci zYicYa0yltO3|LkJ1~@fZ&G_&+3+$)VsW<>Iw%PN-cp3=9;o*Wd<5bx-Ni>!iZgS3L z6Q&9py~JQ@@FGaLcwdDU?HNrzka-1eP^qZy?DV!xmvj*%+Ch~tS0=GA!B_znt^zlJ zoffcOM_N2)8zuj~>d^}It8hMD0ZZO=HFfRamu45cZ$1CL&%FJaA9mjH9!|RqA*7LA zJD};X-gDq5F^)Rh_O>cM{|HZ%S8&RgoP(qLnPegD&6fzbyxB_GIPv>$s6`sfSmD#h z^;6WXe1iH4>rsA=Tg8?9H>!l-13tGWo?l%B)z6=I5*dx8XwIrfpOs`<`S){HS~Y1V zwq17XoFE)KRYLNLRS!~c=GBhXbEc)q8d;477v!ZmizNoSHC=WJM|Xa6>$ zwvVH|Yz%?da0;yVp{NJ04M<0lYmnCU7bQBOZ7}fWjh8Dpd7o5h~9y;opZ)ma5-HL1V}&PA{F7 zoS)iDP-c(=AR9{2y}a)UIRx_xriZn5d#I389VnoeRIpGDbBF>&4&ngW2Dl-Q1Sx+C zkxhq@;n~Lk^s0VKf`g`VK{#}Pfj)m!*kF(rv?UU{UtPRy(8-sAUZElz0FF?IYURsL zfXWV09Dijy-P}Q^zoyd_IuSpS_h2H@N>Og3*hEHcwh%?VM5(ck6x+^-EG1$aD&80% z=n^VsjYcYeLuHn6h>KC|wPDz9ph61yqBqDkK~O-4P(7OwI1*rzeIPfGyLv31x@%{@ zU3$melWPdfA6fP`WW8+}FLucY-mPoR`JcOIx7Am}qo}I-W0z%J%UiqN*p+VI^=?^q z_mi33PcAhdz2;gbSEQayb*-yr$OS{$;QmZ-f3Bf< z@g=ljW8Jkwi#y-yf203>f7ePQ%3bNSRQO(ha^cCWrzPWQSv>uLX9HR?Klouq8wAOU z?vLOGwKZ4e{|G+5TYpmDdefh--*T%Ciz3O>cPlybZvDiLJe=_ptbP;s?(0uJp(6P4 z{bVOP_eY!T2V3nw3b_uJIe)aP4Cy~8a~`ZN`-93-O1C->_LTD836dWnK7yGAverF} zSxCC|WixuX`d1+Jn=M`hxrQ9TAsGZ|Mvwxtd~*&G7ihaDCYa3*B5UT$=&WZz?taJm z&q^f8Bkndl3s5;8n~EWPAE9Vf5)`vWC`k!v(ZU05a;hj#!zdb7Gz9We*LFxb37Cec zjtJx;=dVi8v~t+>R(f7g^d8X)ZC;a$uvpd5E5aTX6!$RnWQG9~Bbc2-T%xNU~$IE+8QTAKJKSIx_jha5YuKXgV@hc>gMp=;8m5 z2UOx3UPmCJcVlt@&xtS>B9Vqr3qD^ke{#wo12r_11+Q+mj%jNIp$=fq|#SUFq-8zFTI0*b>8AwghQtsDW>1jLXbM5y8v z6a#S`J*$j`LG}0x!?r?PPJf`NVGq+~7V@*ts=Eh`i4f0hN~7-50GMYYVMXEagP!LJ zjOeG@$5Qu;nV?TRXh>+fC}bXx+7g;G1=$#730gAjqcH8?N-rG{% z`Wk(d2Lzj~ANRY)u~lm5sTtm;=P41H_C=H+cf^#h(K6xt*w8Q~Z+w}`@lrVyh9vKx ztzdZB_kA}dWwzHT8-)@P;Ym1k9rtE^6ta?PdP!y_yV`7vfy3sf@Z&e+xuF%esHM&z zm3L4FV4Ud3{W7iWx79m7S{P*fE;TFfEC7D`HeQ=;B5-{10OY|Txx`p&-1jMizu=i{ z_y53;P8j!mm5-=3{Pk~JPr#`3FX<$vZa08xaoR_a9+!M-G$whp=R(hqT& zZ8YD$_QjJgaZ$<^k@pX9QOH+I+@+K(ts2#;y@7~6*e%t;Cgl62{LyMTv#yhB)78fc zwx3oD<0?v6d{MAjwJ?m`_ohO}cK0fFS=N^Q~r)Bcm=2XPHwW`nOdnkI4^gSns-3vRroo{Xd=Zq>7H6D(N<>H z(D#N8;C*Q^FjSpc5wm5o*G{4!X5&6ZmBt|{rFKtJ@!TW=5p<$HWOR47t_VF#0O?X_ z`J@u3Q-V&@bRwYTRV|1kHEP(Ed303yZ9K}mgw`Z=QTgvF=Pf$DLnjh{lu|mqOQ$(H z{f~5dk52zHo&JzczelHkN2fob(@*I1r*tA&JMW@JLD-Nh!p45(&*{Nm(&@j_>96QS zCITUj6Bn#FsSjLqDyP%Sbnh6Q9-|YDJ)d}G4w+Vd1KaS7S+Nh#lXgq*p36_CYkQU) zyWtw!-UX&Mw=R$i_T}~;$ZZHhOwF}-(|PmuTxc8p;eHE3{q(GKoV7W-m#Z39oRolf zLsjcaDJQXW*ZP$*PL^9Ln^xSM^jKQDS1LGJX{p<{;^m~z(%7+5#mQ>Rx~`QPPWmnD z0xPwgtg|$Ct<-a}!P4Hh(#XjsOIzB)WCqb8*SK2t)ZmDk< zt%WpQUU_c=-#y{9lvMuAR_5%yXGdy84@zIx?0oEAf4Q^w zUW3!wzf$Q_>%mp6hf<;*N{MbI)gU)_v@9IUDc!9rz-T!@236r^NY$6`BrFELGymHEg7^e7RkF#q}_} z@bG)NtendBX=VGg=HwmE^WB`|`4z`*=hj@qjuksyA0HCeUpdLw<+AE~PTaqjvR2{T zRq70VTgVY`xgnA-F@)ANL!>7TNaf^ z+Ql|ckq)t~Q=}7HIypuvut5|yavG_`_E5BelNTF1(FRUFTxkQRDs0C@8#q;CJ1E+) zsRr+1yQUF8Zwgh7l56oMZPZkUD{a(Nk83Ti4Y=0f+6eW0@9H*UqbS;BsRD7aK{f$CEZ}B!w-VM%piy1otQd__XjDI7O&5Oz7^313wi` z!kOgMOl*>O8{#lUB)1kwI24OQL1ZL&@~Yv6S?vw|{D4}3%&tbZD105fH@nl5rGfWi zfO;nhPhNEk&na>^ka?h)QpO$33+$ReLoGv6KZP zRwYdw{HkmP^zmep5zacKoo53LUKIK<^tbfpmTeQFkorE$IB0u;WW|;uxtv9~im29W zp?p%ygk8w&D`5AC;*%j0OGU=h9CIJ?sD5iewZq^hyQo4zM;)NHid+Cho7k}cTrG*) z>Hv`xUeFxlo6+gmWCHtYOp<3OeUz~PGVai}NMuh3ctTXy_jC{@d$aH163C|=8?peV z#Xe$a09q8qh6x1?NB9ry`>8jde~UJ()p~7!%<85-p-7Z~EV&p~Fq9++Q42(~X)4g- zE)|punuMi(+#q$Afqq)kqCz9~xg9?%U((huk=1c*OvD*Ac>7aRiVp!&62??Jp$rcq z7SBM*!7xT@lY(}|6TC;qDE3#C{Y7RVtQ_PB`5Y4AEaX-=xRMS7+X3mS4FZy?LEqV9b4=`X!m}=(i1#7F3u0}Esf5MI$>a=hS{Q0a z-m-nocB?v5o_~b81U?e&q5jk=WlQK;?0GXu``#22Ix!SjD=Ae@GO>Ig{5Pbs!U^5mr4Q5EvULp@&xrW{^;{S-^jO(;t~+90Zx^3 zB-zVq_^~n47Yqv7PHuuhO&J@LUlxtP2CIGpC-l)c$zj zXK112(EtJu5&c}CLN(+$p6IwqH4m!+Oc2*!ZnmxOp+O&wk0-Y`8hRRO=wXD$Qve^| zXJDk=B1FfKQWH^U4aIa(3w2&b9FtTh}b~r z3gLSd6hOFAfGSZ<0i{IiA5fklGQS}L#MoF7enQ~}JjO$122*QAs4wOg3X3DynXO=j z&7fF1{ZhU{zQT}r=)~~2(X|KMy0DP^5fZSF&;kdI7sc`ixUSGL2jj8_*Z~be=I0zQ zTa$6czs>0#bmG|&pIUdflsIfz}aD}+6b)hAt~OZX9T2zy&M{p_I=`RFS_ zI&Gp88QHlcC4^LxhK>eVJA@X3G$-WM$bhN^X#Ng{BT0G^7+tz7wT%dvTP6b)w^4}V z63YSWvm70mLK!!qZ0vwuG z`>p1tTwnICHtx{yqGi^5{}&Q#t&@PEP6H-nQxAP@&OyuTwsG4T_)onAUoryG2@Swx zZrzRgy6vjpfxO6PZs0aIX8!^)VNq_SUaw3cQf%pQ)JuL|muwfHYaK?EQwD%5$fFbu zJ3$POGt_mQ>EF{0R)MXVQ(Z~3mvWxODM{T1@DPAO@6x(K0T{-Rs7nMKFW@m2SRv~3 zk?TitdmjBat-s&;*CPyI>V@NMU{nQVP9Qy=`Ge$)GP!xS5ua@956ICuRVf?2+` z`HjtmzdrK1D0Gagto-Nyd)+V_iQlRp*j6$Q(A5qaCLaE0kf2q*<~CU~uUTH3Y8s7* zwgmX56Y)|V!}qQGls`t%_pSTiwo`0W#(PjNPT{8LR@T)~o7Ck-2=GaGUj#Xqb4c9z zPiX4BE@Xu(XBGU$Z|uLmKU=dgQ?oH$z3JB0TPMEv!rL$0I(qxFY44u2T86+OcHtATSOe(J3B2!pmzR ztF?#iyXs(L*_QoE31}pIW9IDFvBsR8IW3bmc;DE7%$%>6jN2KV!2y;wp)m8qfxiyG ziQH?i+pm^5ELZCtmP@6VoR>;;hhI3o$~s*U+pCs2*MvqT@h$2h0q&r-(&SRvT$$<* zR1W7}BafiI1GnLF%rnO~?GfiYB|11>g+CB2gk&^lzf^L`2}D;af}$79d>Te5;jQBuwAI24LQ@){o#WUHs0F4RJVEF zz3i@|)#IbXw# zit822O+B|-Zh7IMxBF=;&W$*iSORS;ZcEkrzqXWARj=5QAKHFj-F(H*?=@TegI1?%!%(*{eHACgP1G+u~FWL}^A^AMEL53(! z!cZ|zr+XSYRb?0&J1MPVf5^mzKCzLw8lg;e(1lQ}dh2PJ*5EV5gmxIa4)_s1Xp-Vp zam}M@+ynOoYLd7oOmb;-4u}E!l`(AYC(tVq`HNOo^y87vyBH~l9au0)<~+vra2>7M zn5iO2s@e?5a#dwrEg4tK;&^s_D6>9v+x`RB_g(MSEp2)H1J}T6epDMoVwToI@e1}r znkXJw{61riTh9>x`A~jU3*lkHry_)h3DwpCN1}8Q!b4qkepY(6kc>?uEP4@1h|gz8 zaSLi*1P!DHS82LN&f)b>il^c&LUjU;0b_xLxzYcCk5>L8P6fmG1G>xXCx*sCpe0bk zFpZ(KUc<|1HITSzET6?o7)yvAz1i-)?|1K=k7O&`Gx)3M_+jDG+Wo3sq4LUe5r2h2cB(+KLIbn5{s`|E=V_0b7~ysuk{|mVWBUr z8NVsJorjm+EjmCicY|`#tTr1yyIGtVSthe_=5J{-u3nw~*42K8Mc;r;kK022ZnIqy zBxu-4Um-M4^o!8HYE}q=qP&W-mFsl6f>XXK62rdp(EW~Mx=te|Y*Y}1$|N)?@d);W zXELBXjm*Y@&zAxC#D=pb!=JA$B3UBmY>Sab80eCCT!)@cK97p9h}K`fXwNqEWg7aH z{2_31y07Sd_=P6K8COLtlM=vxwLLC!tegn8@S~F0KVU|4^dxMJiNSrU4}Q2`ae9Ifu1UQ z7mlVIH>N$CZXLYi*{XUwf5-bR?^0mvJZ`lhGECMR$an*3S70^7YC`lR+E9qdBs6_0 zngo|z5>3o>Cs6unA$~!3Fe_EMvr8;hRXGjp6QE39q>%!jNQ!1KwdBVNdJW=((H&PM zHTV?=&{&12NWOxA3hD@v**G4&*>mLnm%tdMe(bs4+qWG~C=n!?Fhz0CiNYUra7l zb$}r#A|8E&IjXXr){Lk1X2~u42cBM{8hy*&TC?@~DDwYz0{rPi1_7R@^DiN~)BEO< zyRrv!0E5G_yIbYJD7&&350rg$qQK7uq8Iy5>B>k+0UoEJd4PQ0fK6!@YZha7Ts^;t ze6EeoB-*hi^A<>HT)P=+2I9mZ7a#gWif=#;ViSuFrQRTSo957`&?Q@(7ON7YXoBLE zCk!;*G)GEPFG{{&@gY*1XRqmj|-0an3030S%5sqY9G=AP)v&VN}!+yz)nA`~8ZZ zgG0|eJ2W_OV(4H$v`NAH9>bmB{pQb+;pkG}bGoV>`g^uUUV59>wBu>Mdi6ud$fVTC zmm=yCEqXF z*Z45cktCwb|L$iqH3R>c^x-2Hq#c&SH)K2;?s(wD-juEC z%2ahNRrSz1>P^_JH|y)n_&RT%xZ~SM3#m8Ja_LQ=Kpx*GCGzL}B!T(AeWZG@#{Q!k z=is_hbJeQ@J#+)^2RxsUEKH)IJ9S2AGhJ`>-+M;bXLqYJLMjARgsf`<1^lSA4b$Wz1=~U($>DtI z(=5Fuv4(~PG~L($UoeE;$d|AST_j%$jSx=*W`$e=s3VhjuTZJW`XgauAmw0^a4*BP zsu`Rnz{cLPLWWZTTW#B!PB^`wloV_dn39brSUxKQe5b`#0P}zmg=V;Td z>+Zz^U-zz*BHKsU=-8Jd_-oHpwSRl-%@=-m-%`~Ug2Es}A#D?VbH^QD4?$s&pfCtt z2T+KW{Nks8!uOi02X@)t+vOa1Yz-*ikyyNR7py(r@ z=)-2lp88K*@}~+Ep6Y=f`+Ggkfvu(Es9QS-)G@KG_x>Lw)&dGM6eNcXh)P;TVcUf- zm4gE(x#36Um~)a4O;%Bk!CidRWW@vvN8No$kWz~oe1iNDGveZ#&K_I|F zBxcT>H8SmM?LejamZ^T8Z2qMPhkuX#r=*t}`>UAmKBc;~QT==%@JqR=^ly3Bi zA}Rs;;4tquO*@2=LQd-jfsKu4XzQp`I2<;DUXQ~iBZXkkVwHm^8_Uf3_Jg*h#Aa*i z{1iLnQJJX(Lj0VMVmmqUI=j!$BzfWZ16o9{8rN8ew|iN;s8*81!g|_yflB-ZN|H^~ zUQzoN0H`iw&_NMAB`Y1tPDT#%B(2Ph>n^bL++0JiyTMW(;R;Lr zuB!jn2209LhjI^?=Mdti)AHqEFt_a7_yl3_PCC(g&3rlcAiL_ryN!8;%eXHVuTtdj zypz9OA+5UdpXo&GF}qxdYNRH`!wO%uS-OGPc=xx76nq)4LwmBz(%hPD+MH?HoNd~f zY1+Be^a#Zo=~#Gje(+jt&Re~>;eBswuBH8&^V;}V%E?^R0VRjGjckyCOl1H;e=3jP zZv5e{Oy%((KZn!2eHmecURZcxac2I7rHT#UC(62MbI_+3o`x*yzvJlw=_u=7_EyiA zf8vxWm1@-13~aN%x6L`QuaK1>tsqdP_1^EnpaZI5OLjn{!_DGDsW*=)X^j1&GqW7~ z$IQ;CMam!n&lK<55Tg>~N5^N-vP+IjHiWwaWfKSa_?nrf^tvUL06lBK`xF*X6G3Gu z6mT6>%_gH^vM*5SCEL{|u+~QCe%kERq19O9TEuOe?`jWXw4OjTRS z$e~Q2-a7f7eog+`8vXt(?vq?!bflW)4Kn;0!USr88s#@nw91_NHR70P(|^fSszXb4 z%9Ku>)_PvA3&N&`KgBm8h6s_RMl1jn zHYM6K2RrJq%}-%e1UF#|$Da_3z6p%;c5DgFvb#bK0eL$Dor~xI^exJ7(8-EQg5?I` zh97-~s%Ez-H;MaGqY#l)o0UR>k?=DmES98sEfJWM>Z#?rr<9Hve?)j|Cmvq5{KQ+c z=*TwozTeP$`*?Qelke|*@@{p<&B3MWp0uZDxvDl>)t0GhyV1&frS)V!v?I_%V%9HMN7*zZ^|@pT59eiwAr(8bpGJA4G7cprt`JW zV>gj&_8aBb%NKXN?+Xy>>|yzzjP}Ns=RDrmpICU}uCF2I-md{2H^L`){QjFOg1m)m0P`tsJU?{QpN0|4ub)`K< z-MYS~BGzyb=b_NbFA6oPb4iQ`SZOzV=%Bh*49d9Y!wT7x9AleuiB}A1 z>&il(V_c+}h7jpJ+-=0Mx?dd1g$OhqypiLOGk(djfWG{np`J(lUwl6xq=p@Jfh;7m`Wql0_I?~Q9 z*p%-tzywP8+sxlU3ctzU1~8g1EDIVl0wVvK#qyd{*RL%&Q-o&ukdr_eTyRcknsWIR z{rU**YsOT={oVzunKm4`O(u*afI5R=#xfv6vGwZnAffcpMF-HcZQgm>9Wg|$^#@LdCugvxHAeH%VL(RIV2~VGBq`yC442>yFFvM*ZED#{u$958d&LZ)3yS79i2;qSO>0^M4j|Gji zDs?u?0+`$dhnXwqJKDA<>av1Oa#_LKHb}1BD0&za0q&e)RTiY!0Ycb}-+SpU2?)X| zNtkFZU%o7STn{4OY;aIT;7Qm;Cuu)7?jVze27bKG&dYzpD-C{TakN%1H>{)0tbYCa zuiu=#Q@`yar=_;z=8jv@?@hctk@fFM`}cfgN4B3c>G;CtZPtQrBQA%#Z5oNM+q7=$ zGpwwjZo$*yFJv+O?QEBJi$+!s)^GDT@)&+VeS+W!)F`t6zZ+wZL3nQLr$tM!f6TQy6KVDf!f zEaCjHq5bC0ce?I0Y|YiLyD|5bx#e|jZw>#G;oQ2`?7AJ9bvtf9_k)q|k1VZw{BHBc zZ1b*6^RAEV)|N-0IjL<~_SN60yk7a&4BCN%H#dA|tYl7RhiQ>&?q`N$0z2Ti9pLOm9>IorYcNP^=b; zRKzwBpY{=2g0vr}X&Z(Tl3aFT)f|}28tt)`Fs`1Pb0pn!F0&09U`=^|v%{xzWVl)` zEF>KkeM5^Bv}EEqZR^BR@JnU74#_YwCJZ5DMF0RD*fC1eCdnS0D|>}}56eDZcEOqo za5kJ!!#?Q997*ddmbtQt4tZa{%J)&GS~^&F6KN1{n=pTRi(Y^*K($|lgNNFRE?Em& z@xPF!&P>ac(lk#K8)bg|%24*(DNs3aOoU`gzorP0^D(hSru1tHR8t&=-rXVZ=~wwB zk_Fatk7`W&KX^M#M)?8l&;*(XkCg6+fbB~#?yE=Uf@-+~ToUo-17q|kK?;mZzZ4wA ztIQ!~+$P&`+@wV*O`t(L9)oU!A=WT6_Q-bX9k(9x! zu?@Sr$@oJeXwanCgavzv#^PA1qm@Of6T?etm?@MBe-JW-lJyjg#UF)Exe$iBCejPG z;`qfR7LE>K!!$#frg$_;TjVB)xgQV17>cN6T1{-vRTm1PxbP(87tOTAfuYnG`dl|j z4AeHm?xtEvVJ*0qN+69ZN>nMt)FelX+~6{+3RrA+B?~3#Qc<7yTzsZhk?e53%D7JS z^~sCL5NbI8;@19`z+&NZs4!jgq&7lh0#wtUx-}vjCwawPVPnvM16q76^G0w>s9&gP z=#Yh>6ZLDxJLu2hHjS{_vIntCfUoel(Dh) z(S2HX?;jm}`l)A*4V@Tj$LR2E(w+gL9^4?*A601oo>d)C#JY(-km1ZuMX}jS4A6wZ z(5EyFm9RfQxKexq^q6`Du%}}K#(>zaN5uU?Q4eW33K8ZESWw2J!Z%AeJS5_XV9W8d zrch7O9;tY3)d3YIIpPbCc*Z_F8+CUK+Ak;$dYRF?T>LaV+CHvk6+rw0tk>&B=Vyl5GbwtzzEr)cg&+rlv@ zLnu$XqkfREP0)vEYASSx12+Fbe8L2D^>CwpOlXbs@u`!cA1a4qM z96=z>S&+QMg@Tb65&Kl_m4V7C2){_(pG2z)x=wq0jRtDZsd>+1MoUaBt(|}+B{5|n zF=(VdHoZLD1%<3J^!jkq_z1u$*fYeef!jj`ejUc{(@_(Pt;Vj?0Y)sY%-iCrpf&Fx z!ZYjQy>X+FwqOe)#9vJ29Yi$%v=t6~f8}r1Evx4l)+UniqpYjC3ns01qi_ zB>$DNxrUxTG(;#WUv)Hk@l*mkx*Z{GqRdRE6w(goOOh!vt}1>ipA7SP2Z-&3d>QTW z3RPPq3is9Hq6{Z8#uItx&@)G#8Pd1c%9oq~=pT7nAvuBzgo74uD9h$rY2ans?l-A@ zzfGsNaLU)1KpRW??4QCrtShuy+0@XxS}gA;vHZ_aFl2wM74rDz_uZ|jyRrNF?!|${ z1K0M=ANlcc~#Xe*~*Z z%PO+2j*P40=FqJ@wuuMaZ3qA0_#ckEH?p+tnWg`ix;Fujr} z00amS1Xpo^xCkV;ii8$YwoF+eAT&rq;v!drlGp-lO7?pOWZ42`DFhQa0{#3(&{!G6 zS)S?lGGoPZVr83jv+1CPVZOi_B{O-M1rlgWrYDp6|8r~WMv;=7d^4GnSg5YLb?dI@ zo_m)6EWPigoiFYG$mgL7R$=14m+zhnRo#GOHT=tYKR)!!8-?&>dfyfBH@*|BPb(5C z0jW`C)y1bTJpGfRh8tzB;^tr8D0dZ=p*H@?cS;*lMP=6mMK2YPcYeL@TZdjda{0(l z0;{hpE%*3+U%PwWk90Sq{~qJw4;w=}wz&RqW7&??o*xGMxc*^z5wDwlyk70yu{rmL zcjWSVOK`8(^H%<{ovS@>tq$;d%i8XBo*#8&@AbKUw2pUvw0*~xy)Ms>@8qqwU0&RJ z+w0-A&%Zz9dAoS!KELPfZEjruiNDK-KYv=vA87`v6#RH7`O3jKgy6?>egnk6xXwIi zxMFO29iL}g&qr`QoDF{y?>9WR6D32L4Y8y;oWw_tDsofGPuqO@*hg|AxhK7+az;=E z2z>xBND($X>b>8_1miK1YpKeel;M`B$IZ}BzP=C906R|%Ff^vJGZo539??!rT@u5@%cVXRiRl3x{qU!qV>Fj@64!7I}oH%nbV%3vt9=Ri{ zEl^lxa>&&^+&yrt5B4|YpUtxKo!;J~Pv3k0J$sJ!bRFC^V)FLfqL}HNma|PAc0^3( z)O`lIFUO0$y{+VfdV9@%0ai4wlt6Gh3E=RE+BKY|r+Souj^wqYc+F~;9_{lOGO`xj zbawzX&e(JaOHTI%?g_8)oTQm5NJ!q0T* zDPjCHbEzRpr_vZHK{Gsu%*K>&%Q~~z7*d-;=CS&nx^UTf#pR5MK7|5c$!T&0D&zS} zQnkxwYF8#|S5Ea$uS?c$oT=TOsNMdi=gmXO+I^!3Q+4$dBNJz)J`=CmI8(DVQL{B! zvwifyyXBP^AHDGC#nTr~PkuI8zIHVKr@`t}pycm->wj8MGtoV{d}`nH@S6`M3+@}u zy6($=!8hg`FZpUf$+uBb^WYqXNY^dUdJLWoajf~!x)`PbN|rJ<0lY~?*U3T1NjMMf zlc)pz!-dv>kCRpWL*$a?mp%)WKkg6GQU27OKVu6~_)3S9O2n5tH+F8K2>~o8n-O&> z?rW7AwC1ZoOELdL_uPAU-#tBt9zMK#_wLqe#r_1?&tm#o$g8)I-A#M6A_>icil5$1Mm795b#3hU= zE0W9W*@}aa5GKb_60M9mRp7Mv5xt*b&LSRb<_kB28AX3R$Cg4|I4H%u-6u<(@{JWJ zHJcGhCiA;m7`e8(|AC@k6zU|4UC)!$LL9aKnve3d^Z29MPzD9RrZjQ+yrRCw7IBC5 zN~?kOj%3WY7q<-K^rXE-C7vzDP)OPcGgMzQ_CeP6aBDV((qXt6@)I|!B+k>JfzO>K z08d)XE1?k5&BBq&71>g)nx~8k)Zw1w+@a^J{TWl;G7lLb8F{ceu;)bS4!0I6>+Fw_ z$?x(zx6IC`eIL(bOFkl$m@24rpH*3Dc?mp}qe{a9W=2(#LN_|b8r#}PN(QZg_ei9KVr%~cuSk-GuqZo%F8<_c5WHFRPqI`fp_Pav6mh$nR-8XLzBQTM z26n%)E}k92-zAOlY=*U|$KPszUUs|px>IX6FuqU?4BD5bmM%**6I&(~UIs00YH9O) zO`CVwTp^+g;V<5-fthD6FJXhZdfv~gJXdkcd_J!Nu3*)C0j~;O#WnLmUKP2@mdqFP zs>D^@G+)ZAkgK|WzKmDpysF?;rK`AXzKU1Xe1o4wBp-was>9X7gKj@!^_084oeMd+ zh$~Z4;VoZSo8#T#UMTW=OBTv=yh|2}su1&MgBMQ*B8nYVVKBZv?<4dpnk&hxf1 zD$h!MprLu*-{>u!E3KRN;xFnItenr~m5*VQ_zcx5shH2_Rlt>3yikCvh5haZg!b9% zF7)2H5MJr6nEy4z6_N-)$YRARHe6#%YQ?Jg{9JFLuilngr!;5k9q0ESKQy zk*&YpTQ*m+X5Ndx%(P-YmscuJULmeh;X*#HZrtV0^0sLQFs%FW&pa@?dAJw2Kv?mD z;9KTKvueiu+gB|k)io4U`w8-uDiAv&$safPRiWryD{yy)cZH%` zcfFZ({2CLbc*>xdf5Ce^#ql|D7ypuLABerZ-#D`B)d=4dPCKnj`Zss1?g&2+WoQDOKgYg= z?KIG*tCxDfO`Jk0GGpXrRCAWq?1i5??7%OhwKY}`69XaC2le4A)q3)>A#(RMe0W3 zgo*%M1xNgmdb!T~QUJlZmPEn`!{t4aKM-)TcSR5{1m`l$4vrK$r?P($;l2>Y%X%a2 zS)+vZxQ`$X_IhaC6P91 zhcdK7X=H_5m*YAVS%Cmy*$6MzF83;NuRO9+uB&iek@l4i2^v-zStZYF@Vsi&^_2Ta zH7sCPYqTuu``<7~y7Zt^lwFt#0#W8Mt`#%{*t%=R18j$>A7Ugd2~`!vzF0=RE-au{ zQ5o2aeo>DUq@r43*Gf^k+DKc%1>S=fCBnsuQd6{OmRdkwu>v+hIC7d3NEz+6!##LV zkIu!ZCn|4fLJW6AW2?)uV4JUWGzb>2dt&NkP=b@Ax+gBpF&l2L(kGSYw@I&cjXYYCN^|jAPOEK3)CUQflNn=3y#^~^NUcR`VtktzI%&!s%8b&4 zCzAXO)TmJ)=~BJa+v{96L&>W*fK_xOmPKcHFTZ|~6 zVI(w^qtYQ(9*A8ngQ>SyOq)sKfC+|3H5gN9v9z|56o^qy-3-(>;}CQmN*zhV4%<*n>s2E z0=+?%QKm=`RGhRfOH+tO ztWJSFM_Qu~oTlIp6<`5WhSFE&)Z*}w`%$#X&{++E=V4!9mX9^ytNM^f$>a;S8gA_8 z#h)~DGd^t<#`aD5j?qTO1Z?M!0Vz-cro_*B@R*sOQ&rPC=rQ<5({=kEd=dHRap8<+ zK)%hr^qqFIG4+96C z?i%8|atvn;nZ~D1NL27<%m}hIJydl%5&}b95E{BHmoJ`r^U$oRR_=GkF zJ;dW#Hw^UgpB{V0kB|)6J+U^3wGVdnbgv0N)OG)!Lk~kF8GcB=x7NDH`v|e2(ptA; zcbI$y%ns`ZE&=1`!gp#FLq0BZjAX5m# zFiIKIhv!{4s$KrVv0S2_h7!KzljT=^%jfb-i@S&wcNS?>>>(xNpM!YR;vcN%tjxykh_8UYxKE-_ng(PR|$2^`6$%`Mv$$GKrWA1+CiRU?Ny zu=BZ2T~AD1Zuz+PdTHInz_%X!NofZ{GJO7bKYzWtIaPTNoDOTs=UrK4n z<-d4;m8CR0zAE8dWKM2dj$UIr33dT%k#R)aZypJQiTkxZwRE}i8lOI%T)J)CHxar}NT8?f1bW&&UyLt6jOH(y@ez@D za`|-A_u9VO7WY+N^KAt%F)lvv8>w|fk0oV0>byU!^X_Q&_hTfR2NxX~*)d!Y(F2k4 zAi&31Gm}^sMBF`}Z+W6ymdDS!ZHohP8FoiJuwXVe_EdbkoD}K9SsZClZF^&1yno<0 z?2MuRG}+)xW=OFgVwNXtfSB>k|kosxzDReW6aonGm}+n;k8< z6rG8|O2OTfYz;dOLwUCk<%BRuhSNXcTDzMkj#hw%%kbOF8+@Lw(#wZ)p|QD(6|3Q8 zyY(rKuI+eB+^CB}z7nviKAHx_sj2 zxcIVi z@j>N`zec$a;TJ?Gd3{0jau+x1+E70YT#XO{qIAZulQ50ep~n=ef&4P|Om=GrZhZ8a zBFQotvT9{kVF$A`Yf+l6{SNZb=6%K z;n1vj*IB>W0kLoznX=rO%@kiIVWF25R`68Kx=R};yW=(MrgkT4)=hUMYc`DT1Txl4 zpf(Yxoj7zYuryU#KDuA14=BDAi*8#=DbR&06!t-sSrzf`_~_sB=il)3oO&)Rg4E+f z+<nrGx>E_^Xn#?>FGN4 zK(b+7yy4DNZFr`(BT?Hix_kVNv4bCEd;AsiE}n=>3Qqr>(%Ol`U*8@NG{EWvoP{FF zpg?Jdun-P(|9#ZhzOKxAh1|sQRhP++3#_QVu58m|U*Wa1%~fS% z=WSM%O?da;&Z_cE*GH}@tDRRB3w#^k9zn}nb|eFbX%m@Ckp+pIt}iTs*)e#_ME@9ckl|Mb~p`__2-E+C`L1eYX&OTM)} z5p2002I~5M$Q#cYKl@_AT)1f_ygCtH&7T(vewFo!+g(|oDB2`>2kuiA*lickecWKR zv8e@H?dkhZNCei4>PRI}v(#>2l*kn8%oMhrmfxi4a?DAb`670heJ2qnEMoD+U=fA? z73G7HP$KVBbXYU9kpwzlseFPA**lBTs|(+4?nEfkVLVZvH?uLc7ToA6Nu@5qXD&+B zp(|l@g{dXBH1nX|mB~fdfn@gAbmt)|Wvn;xsbfm=3TEES1|`rHF|FK8JPCgrLoo_Q z8Ji8Y@s~{lyz2~~S*1@hbJ6=jbY({6Y)09;p6a6oW2Y@T2?^3&3P44X9}CFM_DD&D zm$$4OY-ta-tXw&G`th?vxYYHDTi32je+~Dc-WXgi=~_F@@-a&udLyl0YZ;95HVe{` zA*@}#IA`$W{jk^9Ma9e23s4%eP`Cb=KJ-?obk>JW-Jlqncd~a3hsML&S?Z^uchtuy zRJ&1$XqPdNSa|zkw7sFAM1@bCdEz7ez3lKx%ce07=))siVxx|2N~fd+-K2H?By)(v&H~odmPwO-*o?W zj$vy)0%mIr!hy{D`mRbgaaaNV9+@bURN01j2Tz}dj)Pko#8N&9xfJFuRmCPEjIq7) z87`)=PPMkF&M{wbSmmr+#=HMuTle0nY?^!^Ub$uJ@YTvK)1OLIZW;H!Q&Bll7Oz-6 z8M<1rda688u{vI~TJ5`hs_0^N^(-qPSFD816pQx&<@CSck4DkB%trGo zA2@QT%0I%~Q}$w7>XlY&`SOoj-@j$;dhpqs+*K}_sac(KU+Bkm|gu7T6P0 zrLiUfGb1)o9dEqZ+uH+_Bg4jo^u%D)P+;YU{l=Jw0P%_5u$4PSzKhO#h?<(REt4*MCz7tI4cIejbY4# zdU~CvK^7wlA+dOWnsc5iP}~(ZSNipPctfdoD2u=d&=sA0C04C!>lEPm|6-+E@d^Y) z*9%IGbOEwlGba!wiLp>_*G-D0gQuR#BcY)eq7wD zF)SQxRO}WSLVFrrXpcEBRi_dEY*0CaT4cSPv z0cB?0eFaqaA}ZV-`{GKY-BhKy_xRWmjxhK{@o8^9WW>W! z@#%F6hzY9#B6m`HcB~aI%!-&kwco{zS*wH+q0`@NHd_OVhv0@r$sU0oszY%Kd1woRQ^=^LmsN5j z3t9F;<)gk-b^T0rd!m{_?5o$j@ACOqjqXpCl+TnjBuW}4*G=U?MLD{Y;Uu1hk{cl_ zUWh#xqq;i~l9&@mrb^?rD}NH`m@me=a8wTjN1u9rYbsPni0H|_M5yJBMzq$O4_;f@ zlWglrgnCAINr=!?Bb4e{1*cR!$8hE7p%^8}YP`OoigL9X}~r z1%&s4)j)VJ3Z=^G6{^6uJ~vhUA4Za8cR;&dyb_<(_4Py7LJXi(%m7L_dGOABu`5vZ zL5XosY0uxvE!o-Rd8^60b7gLt_S~fTSf_;M|LaA>unf__=DWU%=}+fzV<#c@B@U!Z ztA_Q4+cG6Pj<;+EWNs%b4d@j;S{abqVQgQGYY+ujHH@N)le9$&oZUgHj;S*!xe_#YVqQ9=UCO(Z@wNYQmYqDYzM?Oc_~Nf=aCXC z*X=_Qyc-OSJ(&n162at9GT1(vZP*MoG>`7Q7FYsvrqP|x?}c+vQRxd$jXgCQd@t8k zSdwaAJzX-rbZYN(@p`H zMI%w>5&bj-`Xo^qhqh)6fRF%!72}%@x)7A~DmQ>j6w~$D#I3_eeJ1v4*7lGAiYAE`4-F)gDhBR>3iw zsg#6(K{zsS7dhv%_QS$(*o&``_{nj*_5(wf;{=(>&}L(9m@?_y3Imm~FWA~x#mkMn zt-p>uiD?R8wBF)ASbT@QA}e{e1|)KXY+&1c%-Vo2@c|C;!C$G>ZqpKQd&_wv*Fvxu z_BkQP+qn$1l7n&BagZ4FQ?4}@P+Ir%4@#6wANVP9iF#W*BeefZS|5fY88d)fqV%b0 zaN*P+nPKF{-Oqo+07+egHS@_VH{c=N`0unw-S;p4(m!VA^85|wJf8oe^Zj#1=sLd= z9vNegWK)#%kK=;EBWMtfXSTo3EQj#O?L=st(<53R)%3FS$NU1H z6Wdk*9{fG8Wq&487tW)wA!iC6O_z4YmMJQ)#MKtJm62>UNk3H~ApN2}Xi8v@8eE;K zY?$!8ns+I0a{Wx>rbOc=APH6Wyt(ejoqyPgi*awNv~u)-Q0!RILHJS9;KUH?YuAwB zth?>-ZtSlN^7;SDldx^Fw$VoS%*iJP zj9r`d6+ZtWmqjsjAp2(^JV{ekVi{0EE55Jo;b|{V{|8di4p{=3MAdRhP5=@hb?9p* zixLaiTXPi~?GfY)fz{8mJbwBF7eVvVa5dNF zSJu6moowEfC~AZqWaGpT_`mTl#EY88zmRHOGw!)o)O@|D>_YB^!ing$qQ+Ep-Ar{` zqPlHr)AZpt8{^e&$?DzXxv8>RvVI5LfRCEm_?_*qZ=YGwl~~dBW=nF#{$$PFWC9Pk z$ps#8e^9{ht5QHfR#^O=tIFTaRim=u3T{t@$}jG_uy5k{t7k5qnW16%ZYoTqdBMnG#f`Q2P_uvxUIJq`i+Wf&f)K4n;!B(qFZ+_5jwaHC;(|jNuq#Eev z2m9Sdwl_amg^cFeS~sH)Vf6jSWqVpYKWysC-J9omYsJz%>%Bh;_;LNCrCl5LHhBKH z($DkK6?@Bbe;g>r^^aS;d)DOsc)fSeR{xJT^R>70yn9P?-!Av=U6TKHO)k>B-QeB3 zBAp8-)f0A$LXI?n8x(xxL5(GsQRHqTcrdM%#o~GuY+y}x3z_K0GmW^GTb0xgF z&Mepyfqzf`!l#fEH@X=|bib3ZLe)eofz-%>O|$O}Xk6uFrENh?S$4Zl3>5;an@gb4 za>&!G0lJDT2pA$TBith#lb|NLj=!o0@j=e^3%IH{7#SgsIcE%Pr zg8zxzp zW@^^Kcr0GCUACjE5*4eaeaVW=qkHXJVqdak&FD_xQOG;dnI-G5E?F;L^vPi3WY^VT zGdHiC>K+L*u16pv4PBcoTQ^hInJDXw-*sQStP>H@t_2RgQ&T_o)MWQmZuoducK#Q#o=1E_GT@j)IZplxRuCldoWS(7m%=vQatc>!3AC4n={I6%t0Nw?Ag^9N3MT&a{9wrK&>o^8=QDq)54(Lh9&R)_=oM zY_zX)KILjJbCyvxq20yPDgOK)c_j?YZ!nP_`&1^~7Cw^XGKYm(xx{xw$jqH?I@`ev z3_)`m*4V(;IOC4t1@LS?3n9`6^kEHKuIzlXI=S?~2VPHU-cO6_xX8VSIAJvt>nD%T zG~bnIzAM?hT+6hdwO>B|JD*khy)ee=;Sc{R>Rn!5eay zDe;z2M+YrwY~@hLPTl7Bp@(eOHmt9Q+rvh+ZkN+W+uI+V6IxEsba9!*is?3GUh%QM zB+Tu@w=40wPmmAFD;d7--i-o_dR01(jT|enXS5sbwfo`M?LcCC*d3MZ7)fr#%0r$q zNdAaVe#Fy{d3qZs6k8_P8onu=SIS57di&5>5H*5q=^2>)WB#VnPEfcW*8YUK)i|Pb zm>U>noE+vC=6L!oeszkcdH#fGUB`ct2~JZmO$O{{J`hp0sNEjt0}77SV$D5Q7rpHBk+prF0~%B+XVsQZ?FbM-@=m*|DEf-tQz1)b-F5R0U4Dd zP*e?=;1#RRAB>l_B(pmJ)UwH;< zw_ISO@OM5Zt28*D%d3EE>9Y9(UKP5km(2%xRphE`nJ?y52}Qo8yaGbhM#%%7Ri%~l z6}(pogrJ{Q;p%6-?jmp1jV7PB0SOiU(rosw1)?UUvUkmSbH04!nIrRAS>7#hPXvFB zzs)P;@0@?b`(FH(w31@p*W#^`Wcd^G5cDLHV~0M$?_2>r$pWYh{CJ=^%m!?YU+!fC2qhK`9QI;;#7D81H+J3}3ILSbO;j@q1xfNn| zE9i*hv_w_72&SEdv@b01=mCA~3_wPi+;YNc2LdekcEfQ823gTFXSIItQ9vFcSQPHS z=s*k(l#=dV%VZBZ^%?02Xv%MhjTXI2?B7t9A1Y@XxP-lIri~(@Y2^pSGlKww>DTpU zz_*muaqHSg+_krlTydG1zbHHnVg@+Wi&bAyn?S1&6S(8xHFcRnSj5Y?uORQJM4t z`B!gUcmcuC6U9V_qoBtIwJ0!B)KHOT;yjfB#&#!sFvksyLfJ)nTc`@9Y00?Xz@F8; zKweTTBXj}*^#yfXm}NRNgU5hofEOwRsnA}zj$$6DBf}PgD;RuwWu!(8Ws)#VZFog7 zS+f4{^DMY77vp=eYQ4(VgfkuBzYm&V*hAb1I5@yJt@!4_DQz^{z>GBuh>ShzpL>Bi z-A`mUW$JMR={YOb1XEm{C%y(n=2=1GpzH#_-3z~iiwuhwm@F#u zpER8%tSuP`6*3H+vKm?OFGT)eLm;2Yb~G$Y*M52ctWoJ~I;0iY|bDU}{`vqw(gfk6d?ug>VK3@X64V@nqIRhlhaioJCZDcM^U z)vw%fX(LQLr%RJHcO)w|pu>!Aa{Jeyn*xO|>>JxRer%?^Em7V!wJuq{3W)oRRKEry zrlRukN4^q+U`cwVHLIrw`)r|CvcY3bVkN@W3tcu4Z=80E*q#W7F6{JiwutN@8<2&@ zod%3VPVw$(p3d+@eURe$+nLDX>Kpm938yHVT4&Rt9&%|sz0L->2M<2{64>+tu;~q8 zzaiB( ze!YkB4HssmPEfjWktWD>S)OP!W-J(R2mR17F+5DrzU>#*{+G@1NPub#iNDQ&0&*du_U-nArwcNVvg%zX0 zck_ee-mlyl&n{OJ8>!3#rT{$L3;zuoG#xQg!6!yMk?a94&iIRe08>=g#|qLp*pK@w zQWMDmgkVmjHj)c2H#brTzjZ(|+TV}V170!vh<_jtPxEZBg!uqj%*T_!K!For5cue@ zm5%@}n*R7lg13C9!S+rgAQx@#WaLQDMemWIf>%6JWW9%U0-y*;Lu0<5mBkhq&{H{WctMIovvQpp?Yk(Ttp&dh) z^)Wk&oA7qk$Vlh_}cA8*a}vk^vi+dcelTXbiX38I@JFH7i7H0gM<2na zCM~wP2}zKS|0u0@l-LKVacs@Wn`m2mcy-KwW&Da3l5)x_o^dk1B(7DY7$ga#&#XH3 z8z?T?*GP5CY`CRJ$9*JOQL)^3g|1u_B@mz7CH;yo8XYKGuEThtck!oKj_|$bV2p`z zf+V^(nCyupKpeEi49F(?IN1V82(432(bW3R4xM56D|&{U6K5e6AkTnFG2Mw2OjRdF zs2+L`cKNayGg}u3TPPWNJ#CYt`&6Yzv(xD^;@F=W#6}J=+u_fKjOYU=ksBW&_9n|j zqTRl@3D9|%Bm&EcWI#R`9Kt3uZ9_@TfB_JRtQkDgCfT?5z7EL=GH=6ZOsj<9H^ZHu z;qAhSd+e;n`Dlb(Vf|6H!3dx+IA@hQ!YsXR0?SdLdWf?dTihYpd84xEFwD2!-eb$5 zSU?~b(uj7INvkamCb!n7&SGRLR|xA%8F|r87r7c+HLDq+FgbZP!kG(ej8l&fr4QKC z807l2LZtCWP(925W8lMM?+iBCz@uuytj7^1Tn0yDv()WtC7ux7|SeWo#-k7 z9cI=fA-JQ~Q{~ub^c!m6keL*aZKgiFT!ka#;AI(Pmf@lPC4KA4@!^maUjTf{&^d#^ zN$Fa3oJsl6)|IFo)I(@U1>1?@I^-msrMoqfx+>95#xx=xvV^xZP*=@%fsZFNmY|+8 zX{929#ENKwdZb8wCc*~!3=AUWMe*)4CSk8~??a8agE!zd(Gbe15*vG zI;Fr8B>G%q%!^_y3f2cD6XAf2-XX*;vj$XJKKvoVsVBi$sfmeTMQ~P0$K)MEz(G__ zL+C&LQT?yh1l>jmAJk(JoyLb%DoAp;qLErSbOOGt$2{fY10q7#N0|l&^dF}v+=;{+ z7vusftjtvByp+!khNxa3^n4mwK&Tz*O{YMm%cHI62GDx0wS=8w`ywA=RAFoyBU}vt z`#6{WG)EJ$SkZ^Nb8w%|waQY2%BkoaGKqwnH3Wg?6I&|@PB6II)1dPlA4=SVmR+gP zO`R&iNhW1y8}cQqT+(9tm`qpvr4vaufg%g21&9`+4@z>g#WCItjjmvmQ}}4o2J@Ss z?lQ5h)R^yP9ts0Fd|2>|0E}v*o|bYLG%AyFsukYM20d-8zn@o5#A!7nwccr#b{~SK z05O_tvCbx#`KYZ$I#sm^yA_D7OjpUk>I3y6e1C!XFMAR_M5>u{=0rnGO)TBw!z+W0 z?PZW^cAoWBsr!k+<0nqy-_R{453;9h&v*+J<}$l-r9dx>%eh`4V?e4NC4+a%B7&DZ ztGGmC@M4W)Idy{HWquBG#2jC@%nma_pW6m>CTMf`Q++4T4(yVsvIfep#(f<~7Cxns z65U>UY70$?P>|LW5JJG+@3z# z7zvCcjP#d*g-@O|n*oahFn8G-eJBv{HMCFnX{YfCjOs@Q_$eZJ8!=4(|5!Q;6idRU z_0uI@h6rkizrs`zC0a3})=0sU0eN#wqu(wwhZ&|tVSaF7G+?iuc7)-%g*OwVZ zr_h*Yv)jh0&|z=^@UfBMYp#!=>qhy~`6*6TFmq?29n}{QvqG4f=|1$%J!Wqca_ScK zL!(F@%A+1dKzMD;QdmeS0tLrdHRCbaP7hdNXQMzK#}=)hlbn&GAHfvqdjvua1^Nvq zaT%Wuv?FaeVrkXO∓~V+}$BBU|zPqOin73V2eZo2o2+!Zot#%+^K0j1DDuH3+6W z`lz5hGyaPH^0sI&}WAPHavKvHf~FMH_4ohn8%HWJ5A_W?v+ zeb-@{qX@?CQfG?oqtSf9nhNF|M@2Av)u;w!2KEBbM?TgrVaGGOSQZ|P6tLSQ(5yK5 zlkmASXK@!MW(cUpo2Ld5Q&Zn4GGZ_|+~^>Jl}iK7`px3>>^|IIDB?bKGOhjo6aqvl zouKD1|Ivyv^B8t3{aVC5>^H=zbe(~=%}j0Ayx|&8)nVyYoLpz2Z833+@s_D7fIH4A zXlnvSF4kWs*AT7Z7HJ7yka3LU2>5x9fTNqr2Z2I2{o@1*-BK$M3f(Npuphs4=_y(O z`pBbZ+Yaa9m+8nm?87g!1j7K8KWe%o4F~WGay)em7vLBCFx26vzRUccao6Q?toZ?! z)iJgCWh;lrpvBPE4Ye9~5Zv}-zl$KasH@YLelsfq+f6*r`G)DV1V<{5wqdv+?Q3Yq zN85~VTYvE;TI$hu>yB}SCur?kypw1D8e!oP%2F9_us>o&Eke*+l%N9yJQk9eFeI6+ zLRVxv5G%0eAXYl<_c5Sj*@v+J#InLIu{A9Y3z?d~2FXS!4?6>j&n)IJJ6bD%or?*H zjkgFLl_F;kKBgV!iGyY~po`s(vSfnEH5 zc_UXR?HXZYW^;9M!EBD&Xd-;M;` zO$1S-rgJu5B~~?(I9O7&%^)jMK5Y}Pq;#FUViBce+MWDK(@*(yls!gf$2yeZjp*J> z?lnZ+rp_I)pepf0`aWzmkv36n@$YOWoC46gu z0Pi1P|I+4($hCSZ*P2(%EZdk^w(&~#mE*}}yZM;5+Qp;5!!Bi{)S2M2tHEWd%Gy`` zm;A2=F9k1n=PIklaS9`GK}!Flu;qdHyW6j}?YLeZP5}~p=(Tf~&%O4A%U_5$Z-i&XraA;d zeDyPzJ~MG}s&4x1^zkeAL1|camwUnEsVD&&XK~4UaFMCJv|rw@o>)Iqvno-uDqg*M zI%|6U%(}Z1>+X)PJ%FqZx_7(hDr#mbRwOD`#LL^`?RUW+x(q=JJ=x4EySM~y&UG!L zPbn1=n%q1{AVKEc3k>CYE87K3UvzcmfxFq6_qd!mxi{c0dOP!Qa%%Xto(OL^kWbt- z3AL3Q?m7@k+%<`_m3D}x4sx7zYarlGY2ffc=<;$SrS&(G^-3NzjGn&x&|G^IheYgo z@&(){%l5n905XHn1bn{|Jz=dsb23c$0IDTyn+qh;Rvzo?CzB94(=P#BBr~1w;dH`I z&p=345{aG46Rg7ySr6eWjIT5VyU@j1VDg3#Rl;Pob{^Qr%{TV6;Ers$J9FB0tSy$| zejTKyS4Z4Yv6mQgam{S zt)kaeYDweFl68qC>)_iZzv~-j>enRd*XX}zLT!mqTQby6GE{J>AcfbCTsWft0=-(^ z{@U>6;Xk+|(Q?=L(8b{whu@4Kj=;soE%K2nh@EcS8S+`i_yzZVY?Kv~FkAgsM1P3A_%F&^(X1!{K;_?$^_85|CeOZqW z*n7;rME`f}F*17M@DprE7BVRpI7s59_uj?Dty<<85>n$0+h4Kzvgf8hb2JTt>Cqb| zex5{~XhN<|Z<{*|>r+l9NXGaQ1157{V7(K`5?-2~ZJrngiH^;e-Sc{uilQSXMQo&- z9{5ebG)x#EQlr^?+IQ)lqv+4exGlVrK46sz8Q(}7uCoDdkd0UEs(Bj^`nofE~+ZBGSC$Ik-y95?AYvv|tl!>ZHS`x#Lr?2u}IgU4yL z)BYKEVrACQV>9V1!`rBn_ES9nMBmd6X13t%zVR3Q#{ca24OT@4@;ELqkll`(WXAy~ z!F2S2NOw}p1_@Bx9QqCel6G-giM4UITt&59y4RV56Zr{8@%#9|9u>mClv`19LMrgM z$vlS-Yl8!p++GixV6X!;<30Ph(cryGyQAwqna{~HkYyOT+m>ZrgCmY?JC#LPKZ7smmfqN2t=+#Pl=l26ht|+TNjzIStFKL|2W`qDL^8N1fA~_e3!C& za)F}qrE2w~3z(Mk0r3%lfJ$^<9r}lkp6YuXvP4nzeZmZ(zM#++{fr#ZPsqj^iRPzw z!{>*D0EU=z_@k(yFj&H){T(0K@%orn*~D>5vPslBejCzpmE>>-Qe(C1a21DUiW(3i zY;yf;n=fykz5{OZ$)e4p-nsmumv)V9Bja`8!hz9UDr~|7FWvJ_sOsx`Mt98xL!*Jk z#D^1G2*XG4C)!S=d|fAhj1D6dKArqMgxj$Si~P~d8XP1?#elZJTI5SDt`{z~vm*Gs zd6;yH(WODBvOYeYvgnc_;LD&^Zmr0Im~z^YoetWbJ1m(n)J~^<%Rv21L7G_yn-wwL z>YphY_KtXLIXmp(7Ug^gD6}bRv*qkap}&o`;=yoeRx4nKS2CQF_GO11;i50EK%L4| ze)h9vyG(?djIZRTedQJ{H=KQpsN?RwCs15FA8F1iB}u0O393iTJ*Z7}`j7Ero4v5P zvF?W>gV5IqA(7WW;Y4MoAeOnm1dRfWv@8VrBM?fP6(J{~@)gi=nVGqhia=#yP<>Dq zF_6`ZqD&cW7B)sYDGjM13JvmPGpHCqB?ll0Pp=wCxT*k3DXvTO%SIhwFAGCLY$>s? zJw0&JN~BbFG%Ycy5?97PH00nDkgi)`-N4{`4xMTvQYZN{%F|h#W{c&^N9m?>R0-U) zAwHbr=?R`lr_#KoWuyA{e3XlRoeikhl$LL{*hYrcEzN^eQP2Vxo1KTyKSo789mV!v zrLt3zvYSpExZ|zDJwT*ho&zHTj3&>|T;8R^Y6KJ^_ zXnD6dJX5?pQM`OU*X0k+2OuUBT1g1wHHn%v(~S&?b09?=nmA$6ZC($=&5)Bo-YLe3hw+yHUor3%kh+SIpc8R`!pZi{Zzhi_bidujawth8o4aa10lOv+}!aV4o(e3j<49{sB$E9khd7Se^k9)5mJeJ(h)_nEF~9 zaXp*$q=BgA>4{Z;ipC?RqJi{A_ZH~Dc2IVLpF)Aa$MCs~ z>rF^i)H_vCbMf4TbCYG<+>W11R&0qEIfMo@#|k~~UIyg9HBt~(PXYOJRzNyta0pJb z0`*C27-qYUL$I6KW|_#d6<{#jV;)C_4EM*(!KGu+R?*|^w>?iP`Ih!;Y_e>DpPh9- zrN$IhFj110uz`-I2@vhpkKbSsbXp9QB`}b_TKM5 z`gU1z+da5SR@@sex>wPB``E)PYHZR^D!pgZ`_t&x5tkLN!Rl>vmIK`uvCnRcMp%@T zkU38I7-Qc_W8wS_r(7(^9Ly+&O4Vr*Jekb8>*Ln@C8$#!$7)VbY?(4~1lAI)T}Bie z6csCkHLy2`ilM>jj#%3*lRbTM;PeRMvA{?|8BM~aR3zkrMf?!@_y4W=pb?txUw;DJ zpE&`#9VS5cFSH204!Pa{{-|(%(h5S?xlz+N)wN@05r5?=(9QCYzvL9Cth@B+R9Uiq zRkCvRxc6Oz^E>g$!^RPD}G?cVFPOD4U)xql%yyQ=yFpQ~o+ zCF&7lmt(&dy>iFz#wMDR)jLwPOH%a>H-bI}x%QQn-w3%X>#o&yUm3tDSRvp( zI4Oj}b>QMY3D@>1yppb{bSHE zlWaY}R$}ApWUF%fl>1V}Wbv!jiOTH?QTvM}Wp0B=3GNL&A!8vy>wzsUbZcicpwx7o zKKHOzjUquPA*yTXSJ5MFU}@RmX^x{7)su>FY3%I{-*uM~O}J3aSk*17vXtefSn-!w zv3;fndgQs0$?VtiF6T`>ay7gfaKm#Iwc~-GXZ!uNP#*<~Ug%Wf*onxigO>&Y+;_Ep z{Ri3Zg01kaEG&89$k>sIwO0%3cx!uJ6d0?pZqxYYOg$)y~mw=-pCNp)Dpu*$_lyHo_ zU~CPG)TR`6Bzo(`s;$A8`Rp?sjVtgr24l$B=ap8>VaV(s+dr}NxqBvtULE<3k?Cbu z*8a{4C>5~xTDshNtiPZYfA$h08<==9Bn9dux4^O84o=3*BNyK&LO_5@ooJE zu=G4HWcPapiKPd@61xF=;mzxX9zY?7l_jMkJt|VXvGoFlj<68J&Da>IxsU+Dp+L@ zr?u#sdsVzOAsRA+lVU>3JunO~P!rR-&3tQ}__V?0fFV2) z*Be58n!bw}IS5$0p}8?grme2f^PlXqWRhla-BvDXOeq*UjR4GcUkML9Weys!Tpd>uf~2SJj-?9%WSe{|!0eh-2|yX%HM zUp`J-V@zS(QB8LUWUH7wym zl{2B`iO}+?Qbg4Vt%rUDnr1K+6NhK&)+XxKPTz5@Zu51-`G`(8T`Sob4{VeKV_W0- zP2f-YmGy$-b%LH@p74?1xx%CJtX} ziC5h-x<65M&reJ1bn}_RoZtB|^(4 zAH5b@Gglja_28w0f`s}&vi8pLU1@1hisscn_vTbp&xM!bM|kPv&e!%|-hb%})9b$1 z`Q6Sdec#<0U$=MO@2abRZm?{=v^z3Nh7Ykcm)%Uu8@qQap zd=RuA-jsFqhvh}P3Uhwg;>GzbUzcxJmFGuAD|UtQespIpuKy_H<+;kct1*|Xv3Zbl zk|nho9fT#-QLYyS2W8(oI?4Vl-Gf06wGNwh#bM!eTr?fO|810w2NxTF|AK4^PpEFD zoq_+-LX!V0eAy)H{0f%DWy4t}M31{QtM5N(BfsN}c6`;kRVN1@(fYJ=tIk9_P7Iwo*@(Y-xwrKmwUt9TPDo%S{Zn*nR*oUy zdu6R$XLl*H_*uw&;kZ{0guvO0mTuyz9C_-g0Bp&`p?CA^P@0mPXE|2AaQ zj^Bz}6-2=RK6fj3Sv4?`voSzyoeGt}!3kGyS&{nNYJ3ZwTMrgIu@&zI{ZQ~YuYt;F-{Xne zI0)5c-(x{IF}W@kGWI|ra2XOzL5+G{OIB}|i!pW=J^yX4hm^ZuJzUFx15ZEqG>8bBeKi46OdaBW(8=Utuc0- zl9}E>)6bSj1$B+F8k=c$fZs!+bW@ST$RJi@4PPmdUGF^0vAY%TVeFPbAT(3ZoG56X zj3x_K=&*4R96btAV%Kk+p=sde3!7(3S0zeUO=l%b*Tn;;kKkw;haIUto@Gbsz^-V&gl#I_vMTtS8*skQF)+bH?GTmTQ1fJ}oGw(hg~V)AfxkxCwYha)zK4QU`XY z`fPR#j^uij#>E*2N>ZC~3qOZ*-td~c{@kG@Mv9@O#?^4H1Z2|NG2(l}^yza$VTxQE zjg;13^sl*p9?6d6@js)c(i6+Aw8oWo40+`kzpTIL?>6g~arJ~dy2Sa3b1vNZ+xpq1 z(O=NvYv=R!qfYQq%l}4}A#Zus{e|pL@~tiS7T$nTP*lfFMwy{HE=TR%k3xQtc|_gM z+R8VQ{TbKuuNX?>ObNsDmv#9OahXzEVt9>k%omtIx%S<+|Yn1p)hF8n_!i=(x;JI3+#ZKby3~3inoh6`-%8L?3c*mDC?wdUR5&P2(Lte zCGIqI3ed1&1M(wJpTo~t|E{O{2P6=yipWCe3K3Q;wr_ftk0`8ASg2CX{rI`qkV*S@ z_(9#)t9y_NX02G_O$9v?l^5Yi1o{gd(G_yJ4i}%^aOSe4z?~E*<%#7DpQxL4U?an=$hz5^m6wr%M(=_ z^hnG_C2la}VyY>WFpf9u9Qv%E`5z@dNE)9$TbN#gSmmwCww481jcmcM`*iQXtD!q5 zn`Rn16Ahj5rFV|{Q$fVM8;hY>Q~Rz}ZAb<;#C;nUE8jSlWsDV}jcz3=eC9J4dmR25 zM~2b}Dj7%zk()Xg>Q~q<_MjXF3#ipdz$nkD?2&AYT@O?{-hRZ8g=&ZW%AinCRef9k zB7#1lU!lJ8TG-7_9=m`iFaw~8JD7v*x1*hRn(9ke^JI;9B`DN53ZZtJm=QXp3mjHV z2r-!iWIrt2FMT;B>QE_{PnYuSt}{;CXuJ%8_LG-qAgzb@*U+pzVo zs<%xSU)nac^d~j#@#<~kxj4OB8oIdQ!Up=_w_Aka?BR?@S2r?JZSV_*}&?r#k!urX*qil1zq7?4t5{Pn; zMS46e+%vJtCHPm*N0o_hw98z5Xs0<*iJr%NIE7VQBcrgw-@eJh9%pd`>YO$uS_Mw8 z=V-fFw35YzQt%W~dcGKI5wpg$pi1V)^y08&4{JYU=GX|PhiLj6ew^wWRSc}@khnP} zGC!%YqfkQe5DN2s5o@mDm01@`M0rE*a#6ZjDRnsroGj29me=S$dFf`Is)zJ!yVci+ zBoan?R4QT8P1`6HvvyG=TNW2~R8}FRXdDR;#%A38BH9`o0_(1EVYjkMXl&)xeZdXJj&x_>!Oh()yODn=XsCgTXB;IcyBvT$BffI=7P{H zLo#CJKj;QnK8(^U8qVJX7GUj$)T(uaTG~9n zahKa$GFR3y@8ty;`QXa=T)70ee#N|BF6&(-8|IhDW!P1^*FC>ft{YrM)$@&V*~G-l zlvFJnNf8opP=fLS$Y8vT{lb|zV;zp^gX&@8{_{44p& zI`frv_m&*PHgwK=@ORGNyx_&(g-^LR zc-2dss7xEDxiG9yk|NdB;Y5d?oA`qLK1!1b43$BHvC>3{X# zkrIhlm4kRzIgwJih9e5l{zG!@!*x31f0;u3kCYSd|43e>LU8``BbAW=eg`5|kplcJ zh*Zn_g?PUZ_ky?=w3jkcBhQQQyeLvD*TuLlmY7*3&{x!H7tug{KZYb&;oU1G?b+yA zn4AE-StJ>75EID>klK}`3VfkJ8J~pD7{o(kd5 z8G_L28wej}VLhht4exVdMZG+eej!-ot|=rrd! zouLIcs4B_b9W)*$Q)syiD-cxGFw`3gAgF@!Kh_8EP(n1G#E#H>Rp(Z9J_4MmRT?o1 z>Q#`^04NkWA&Q`6dbqF{Y19nMmTpo?#P=gs=O9fpY zXBXW+5vsZ2~ZGb^JIX%)pxgSWdvWFqFO)cRiei)u!x1&4XaARt%J26|#v*34D! zcoWCS_zJ5EQ$F-B>aSN68LHN@hP9cG*}nXapk70N&o3D=nY3c7uR!c&1X;j*Gh0(1 zfNJ>K`@#H}y^yLult5mv4{S}%eQgxFR3$>95rxbQGaoY!f<6`Hfj;ChPX>-kU+V}E zn4$RJs;2=vFKG+{tV(A407xhrP@ioZ;+K?aw^Ns!sexk7YdcCh z%E9!YDInA~pJ?Md`rm=mRIi(%FYuN*t_-@B8Jxqh*vQV-$NG@O*dC($CPzI&v_fIT zs14d<5?4mGQaU`jp;}K1DPW92BJ2WV%;;icjpP96>!%vQ2E3eBOCwjAb4ZNYr)0b7 z^&UJm2r{qel2YM2L_J}~SWmb}((n`TtIF|748Mf8MYUSf<5fXurouZnHLe4*_l)bLVxprBCoZgO$Ss z0+qWZ=vBMzB=qz(o8+qvKJ{L5T;gdwpqh+-XRlB!WjNyc1R;!0GDKiEQKCN6X zCF9u~)!0OLrc}c?AXRX|&&9p)60R7s5h%Q6mXoNHJ=k!;x3M|mF;Xx@g_#^<@GSW% z_DhVl3cOcfr1Z2OiisSQ#S?Mi7vgu0lnxhbONaEmF=|jeWVVozr1-d*!3w(3T=ivz421C4Ni}?G*J7 z`?cH%k+sb}91fg6p4J+Kv}iSQaeMbKFvJ9;<5)PXf+IUWFn;iD%7&T1*tguG6BX;%>wX1SCwg<$HJdAmdZeEEr{=?72a?jFwX<$?PGxG5*bG%|BZmH-Ocg% zF>8uzWgkwS6WwbS{aQ7d`JVblmkF~4i&g)f_QHB$6Zxd^>7N2@It(kllF@{B$A z;7dd{>@S=wcyl;dSE?p16eC=8ue9&W6i*;KQ$n5 z^Tsw_agHr&4=hniS~`?z)}P_!-C7@B)E?ofpQopoBj+_BIXtj^i?#Mz_GgF)A|g(S z1V(O#9AvM`y0=68(_+oCbwa!lljAW$If|f0&!8i==8(uixKUF3RK*{G1p=5DMLKkm zHnyNl(GlCM*P=zQlO+w18nZyw>*=p9YmtprMmk}tTa4{tOGm8fHp%p@eoIGdvvz__ zHOSN7@+7LDZEU%J;_26Mn$5GMNj4pHBOjIOG9TfObpa7D^F=^pieF~)tmMGzIOXl%*m%ogl`(D7axu~5CQ#))VM??B(q=IV8k$N+38$$2)< z+FfWnk?E{&-|3f zM+?zJ^Hq%vqFq3tv=@2$I#0jO(}bM(2^K~B4gQqjE}vzCXurvOukggtkH7}pm?55k zYDjKGwBvmD4xFN-klY8$?KsU43v&;p9|9DG1!cPUC5m)E}JQCxmw(ks$Qc1YPwq7B+rn( zux!GcD5#r^%rtMg+Po#Tto60eUjFRwJrG~kIof?K(D2jz6525gj}5s-ce|YCRr8TL>W#ip19Y8)sq0!;F(mH&%wE6m)4Kr)H6KlGYYj%%!zr63= zvL%ywZ**TPTXQ|UY$m)e5nh)J-@zwnt)14}qK8ywlTyJOw zBJtJ0j#u&&q~{w0GaX%tj;>_o4%jv}=1D*Xe7~U`$%AYF7-sAUozSK+C7)=0mORKT`9QnY`?U9wEKBh2x+#DZGUAT0dQqz_1rKt zhU3{U2j}?bC4Q>B2H(tkC%*^@Mu)H0E`7De4YpcZe@NkSsqKFFMFhfOXi!{a1ra(uQbh#Y}0_ z)zYS^&`j%=tF2q);h|*tVOW3SrI}#(YA`%`__d?oJbEScgPQNx#5doIG^x-%Xg`L4 z$U+DRAN`+V&&B8~vh~HS*Q*=jO?M}&55z+U=7=o);ug8JKUsZuJOp*7D-?#WY>|rF z&c(?*xckGTbT7P*3+_&b%tt_uaeWoLPlHzM&a$dS^>E#tslhn*$vn)^5F z1>D8HHuD%VcWl^Q5w64`jUL{?!A}I~O}@;^8K7}`S?MPLJ)|f0M4my%oJ9klG0UWL}KK6|26p>h)DWDoeEOhNc>w_Rw{lfvQ7Uvj1d&RVTX(deqbQH97`@3AgvQ2 zhq78)VMilfAvPqkO46JPcVz{pG0iN1rx?#sEs)u`gMQXqoo~g;^j1%|K;6Z5zYD3+ z?$?XUFH|IoVR=TM#T;P8&*ax!&96~@jPdZsRG?%c0Lt*t<%cE@PM5^X*Czt&M|Y=! zWupa)?M^9nl8Ie}GmWW7JouLlk&G9Af${^N?_WT`1pHek%Tr_0Yaw9%1}&RYw4+zG znZ-m8=Z<)vr|<$XC#nJNAsZ0{p~B?M9`RxOnhVH~34F(ic=#ZWLId#-2Q>dk-mw2s zmOkS!N;ECk+#Z`AOLU3y%5Glnx7`Zy|8hO3gy%1;V((O3rS(z%BY^T4U4tfP2ZN2 zeWxCY^lghRGZ<`0<&7|AHk*1q*{OVtH7<|mU2jCE*G%8{-Syu-H}&Xw6}dr+;EC)} zwa@d4enznkJH@tvD;CAy8n&(j%Fl^a)LTOKdko`(jS>B?qTyIu&lz)5YqaPi@Fjye z0$ZBOYTdAAd2BBtvUg*5$`FdD*ubKxWo|T?FpYK$4afFHiJ4QlW#vkc=k2Ze+U|DW2v1-OmtJa<6=BuIb&NB|`G2KW#OlA=gGXi@J6 zMT?e1#}X~uQ8bh+P%>p%suq-O(PAXIX$q?Ch;(kRsEKk7r|vaf>yDVI??ma%ZQQgo zb=yfVKrjUiOEYxG?exyvxkE+tIPpw7{r>;#1E7{prcGAV*@NA)XV2L^`=9^(kME}* zCMY?IBx8x3lSjn@(+V};unZ6wrsrgjDr`?5r^|RvNGsBeQw@X3LDwP~3-v!!B;17& z*Fer#8Ja(nFANhRc=j|8sGG1iBj&}837DtvZ;hATFeb?QCq^1XcS#^~Nj#g2L6_&3dvrqxV6t`7yq6h_eN+2lmY;f?7T2KHaQb(+qg!qcq#czhM_mGcjT;d_W!}+~_5@?W zgr_m~RKnA&I8K{q4<$YDqTZhH084Kto*8rAC^hd{g(ov<0R&ET%SWC%{Fok$ZHt$8 z#ob-^N~_YPdq4DjSQvL71jp@hvWwOO;<#@P@YyYQ2k-Xb=x$TXLQ8w><(Y$o)7ymz zZB*D&>|Au9@Z{k1wzw-4w}rlBZZ5@GSji^@Dg)EF`7DW3QEK_d>IO4HXPN=jWy}q| zbIFXE+VUNMXc_Z9@^KtDVAAEM!RXW2UA6(h%#aDkQH@pCFM$%sdOQC;WzHvdd&N2p z+OT4s1=)38{IXgNmJ2J@isJ@Lh~LnijFu%f{W&3UX5oOKShN-Z9Rm*La3&vdC!y{g z1k~j>@sQd5i6~HHG?Ne87?9wMl}q$xmyrLIh}rv;kk0_t6znj-iws_K+@MoL;xa`P z;6hM$#kY!X!?Gj3RN;2n7M|_Lsn%Rz4>rpl^C}ZlPQZ-UiMah7HHs)mz@|$3Y9{*9 z#U4#kHuvSc%MpN2YBw z>X}3TD;#AkeA^9a1%!ChMKB82Y%u4wDG2j<-*AlQ!H+A?7?WOQDBz(;c=#6Wu383) zKeG{^t<-67g<7Y&H&JU1zFj3aF@XGV-hhrwXn?e0ErLL{R;&=VfFCvB`*jdVD4;P= zX){tlhYh*eOE9U=f-S;C3+hZJ^w$8y#h zb}M;$e>OQUT#R*GiD6CJYDI~L;u+}6VS9=8Gu!+7$mAk_>$u*$>VqFGVU%HvnSUA-X2dO%^UAZD802%wxD>6b5 z5Os}=wJGG0Bmra?r8r0Htb11BJ47`HP$kJ_@};`Anf1xq&WR_ZyC&_QxGK}DTI22p zMdCMOxl{BfMQL~Gv}w9ARoRxPY@0R5E8CKl>*Ez0;$__lclTu8g2xx_7rqOBOWi6E z%7w_7Qxkc-2EoVp7kTXg(pw?V3X!o=#j<8o;58*Tj)zCOl8jX*#Rj7#j^%9*jF|(0 zBVU+~eqlNyU!uoo5s&eAkQZ)KglPb$Le@O!JT^1wBoY&Ty8LX|qCX4%AdWWUO6Jpf z68c|MDZL;e9ebTFxARp)c;YWbGKJy?Y}VvIL)i$>3Z!Gl1WUd{aOC79G*)K(THd8M za1;f;5EIwtYn#DHF4Q9SWYy;udtupwO376@-S}qcW+>@wj2AZ%pbtbhwR85`w8MG5 zf1-ctMRFY8kf`5~Eb9i=0m+6Dqw(71>0MFFf*T>Q8WQe?*zTmeC2CEV`J?u<-3u|l zy#~6Fl%qD`sJ-VdiI*ZYRzu3&nsB$yjNZBU?!~*lyB8BZ{mC^?#NDk)_dbM;0P_h^ zIOzzoF1~d>9^8rT~eP1J4uVEDuSMBm|f-PUB?GxLsT)ArIyNX@IXdre=6J#+Kx z^Nxy@2r4n|$}@#PCg-ZKbvz&cDR#VODWTRVNjZHoEMd@3 zOwq5J#tX*t&yp33L9I9gGH-MS(Mk=EL%>-OabC)wG|3PLg{4uy+D5{U!cp_30=Wbh zXNLE~dxaI+xb5u!&3Z%D(Mq+BQEjnsGEaR@az(iCG)*GQHuzCN;PxmG1Zw}YoZ4&E z3r`2soW9rYQVbEA!FWS$-x_UD%Ntn&>F)lrW3*W<8Mdoq2Q|oe8ZGJ>eGeNN$;f6& zZXI2%mbzqR4NZsoTi>6BO^ngixr|G=nAjM!p>u^c&@#AHuT{-OATErU!%kf3!Fv`q zFy^oezwNqsRqs2Aqh%{Z(s^MweN|a+Ksw#2)~fGE*Q$9Vt1IoTd=0JZR!i!8wp}r( z_4G!)jG7BOUc|EpvbJG6PSaeuY`aR9dq%ZyT~-i3RZ79ab1Q5|^TH+6f7C#tt!0~R z4VR)sDVJc3ty~(Q;%0?B17dFeA&5l|=SQ3xTy{+l>G^4xB9M2FXT?X+H988qNJ&m$ zig!&6Hh_>#J84!og&zeMX<0sL^JK5HQd&5Qf3ag4CtDMy>LPNd6Q3$%k+wt3R#%v&V0*n>l}{JJH(z z3;AzR`B-6#;#e0F0$vi)2;8i^`g&pH@*`>qS-OM*!uW&KTEaf$zffr!8uA}f(n|@k zZ6dzPx9BH3VzcE5O*ZnAl*B1Hk0fK+1E&qP?#UF5L{umaFvn(32opP2Wwrdv8<7a_$B&3PL?ZEnZdzI%AS zy*Jt1O9vBP^6K^hDx4&((Ch{pqvm;A&7#Fz*uh9$BDmk|g?M#)vU+Ruz(V8d=YrkSntB|Yh2(>oP!RbZIk-8$depA7b^CDz~RdADc2WJ5aGkqWL$ z1lQ3Cf2yP*QPL1QFkiCvUa&s4`HyO+oX}*aO6uoI>SLp+=1p_Wo3OO1Z~v%%&E(*X z=iYd3b}+SJZ(_sV4}%Hseu#kUOBYH#53G6hzA56aOUuN?GwV}r+veJ~{l$1X*g%!m z#!zP?8aU*m?f~vnTrTju-fl|OZ%ov0g!Fm=qvES? zd=-{0{crWZbKtE5vro-6b_>j~A8q}?*7)YHEC@C`TOBt zvolcJorPWwj`1g<+k%G-JmI0aBwtMu7E>Tq^1)<3C-`BXDN@Os@SB0%AIuLq`t=Ao z0x-}2PS^DWz;)}w)9a^{KHpr&jq6(O#n_!ID> z9(oY~pr;}%!9R9Ph30lI@7P%R3O#P6{@ugZ5{}TPE?*i}fcqw3@Md?D zt!Pc-+ZPb8cB*%_S+!n5Fv`nQmsuImny6^S9GD7hOawOGE8qOULsxkvSM>uQ_{(QA3WR5X zi?>FKHWAaf=@^?{lO2K~Dm>!Sl8pfzF=2IaPJ{`Qv(Pk_L1K^_uZrv~v*)k<3q1ShR>YrpvybpPcSUEgvQ|ujtCAE zI6!gNr0HM<)O4}rgAn!~iJzu5jNyvm9XhLr1+Zpu=Pa(}r3Ramlc^UA|`K{H*u;72m7)e%<%#l3lyvox9_{-e_NTID!0RNwXeG z05aS!p$-3x&i`s50j{hVr%xstU_dh>`*B?3qEyNNQHJ*Q!(6tC+>MM%v5atgwzn^>?N1@mnr{4I%ovqKOBEr-ASxL1E41{H zvGOVr(!WRbVBjj3N2MTk%^BSUWfz173zdUjI?cs#0Z8mQ< z{QYy^J2%(42bNUCUB%t2u+sHbq&%zOU6S&wO?cMMu1$Kn#x2sHZ>M|YU=Xs zMkunz-yKi3ZcUVJCAC-Cbjh{tR1F}nQ|0Rt;%(@(|ufn=qUrVw^nu0l+_2^t! z*&Q{enpeBPlWDY9y(OM3DKj7mTE6L0Ppnt*2E=Bx2Bj7V&AKr)%DLWPU72&e0nG(i z09N1V**4T~KxHFq5xPTfp;q_3HE0_Z$hhQU9&xn#MH;{1iyg=HtU) z0alnt)!-9~2;;;#0Ojamw!o?rdJje3B8i7s!D^IU%v-A6GR;`ROO|CK>;Z}+V(#O( z6*S=}vw^5dXYMfrY1LvT%AON;hQlLdga^(acy8GaD{%0GIbstcl&q?0M@CcCVEB^1*Qh!gqzjU9 z^l&%#8 z&m*FJzJUrt1zC#~R!;mg6)<)J5UsLk34Y)v5~@YL908nA6$sQqTSeE~gcXA3+*! z7Qm)@=EUs!q<`Z?anu@p8PW!>bIy62U{-nSa;mO7QP=%LS8C&-#KuGM+Q9_e5)rQA$*Cu!dw?UW-)l8h zbKu$mRCDX;gu8yl%kQ~8cz*~%>gkzx_bdz?`Umgehb1$n`PEw!En6XTA9`cxgRX?H zH|`yb?m=?T*O>BkCVZXIzD0`UsrJq%m6Y9r5I*gxxOFa7yCG4#;r+|0#||bQI~cDy zl<*vaEzJ%4ls)cdaZk+~HDq_wJy+kI_Lf8IG3O1j&V|$;ST1@yqI>vOZ3$l+>14dh zjeha72FdrdiOsnF%3JezK0-m`WviRUP5c-~7|_R1HZAW4oy3q>zC|9xaf5Xoe4274 z$qghKM_B{j0v>IWp%)U&QI-dp*4K0s72hn*3NX9i@kjTA#dP~7UV)Qy?9fb8($yKa zb@GxNpaMEPJBdZdN{GV-969)H6_mVzy7mEm(IjpaIr{bmS~?43nHlHDQbOgJmM|7K zGw6I4-;#0#JJs_s=G{vA4|<9+K;=|85bzCmZd zNy+aafnb*{;JT>pQ`AkLK%p1pmJr1DP&i8YL%NpKk&hsik5xa4RIZ8JjtX17DBW*@ zuJ-)ODBkQRNq#N@r<*~zNna{6d1jFjtxN=fH;ov%fs#ff5j0lXAylk{5X>;aPeCjZ zc^kiePSD)jfy})N$lP@*GIwi7x~4wex(34BbQOH@8{ou3pxkBfcW)-#?kf0rR1;D+ zjsu~)=}4Y+zlkBbIfpe#dCOvf$RiF>)ncK@7fH1(i*}KBNR_pV#Uk%SNRUOB$h)P| zn#B^4FNNpqqDSPt1kddgc@8^SF7kep6`!rLSj!e28?3F2^-X)i z`o^BIzOjFJ*3@KmJ{&N$Ssyn69Qz<4WxtTuX)XFJY^nra_Qn>#We=LRDNx(Auiv(4 z#vV}HpINd0d`F(k+Vwy}!rvgjwi9@j+NMxE)59w`WCV;|D20o%A*Au!&cM-TfLB|G z^TUp?v0SXO4$Z-{)5PGk{7ltneh;5OH-D8#zr0!+H zK0G-LPqG{cYSnpAfLjs=%YfA*0JcRG5`r1bM#v=L3AIDRoO%8txhE3bvm*G|NeVZ; zY20Wy!;zTdEHpY{NSG*GG6}TdFCt$!0rwG-hN$8x?E_aJkTW)@f%pkLGRuL>H$8kG zPn>7DyesSBF@Ptwd<&aK@#Tt5m5}L2u)Zu?;W~IPspa7{+zXa74<1cc#8iT26S`r$ z4t^Kb?Dk(bjcT^u6OhyW0XR^C#Df)o-U$3b1stC6qG9zKd9UcAnLhS_8S5DW`0dE( z&`?V#a0)6-yp{{ZhKgkc;mFS;#iRV8+VPZUt)0zoP46n*49bsj?cLgLpz^ zs%|9ers88I>HyTBQvQu*N}}jAQ#vJwH*T*YnTwCChNmmu-jj5--iGJ}ge~x9&&{6L zGc(7NRh_e4iK_KeHk7OmLLQk;GR? zS0HW+h~8(nmq-=&o??jnCVLNN&2(Ff(n`v-NF|=B!Q$PB*;Ah#Gl`nuUU}Hq!Oju3 z!|e1xY$OKN@-32&kWP6}9$H}SN@WZbfMF}gCZ@XbmAYUN7%CW$_u`p-VG7EBL2v8> zO6YRAA31~=;rGbA&=Yh@f1}Lp@OMEUW_H{z`Ok46f+tV>q+kK|;mDXzd)JW1!T2#nU`sgX#vQCT*i=Cf70SxY$I=)M>e1swX#mg7JVk=-ei=mVS-$2O`jhD7s(MvX}b zwi+DvayTqBvzpNe&w9cayhA6)*?#A0ZJ5FEo>2`1Iur{6?&sQshsjX$Id5mmJ(jmA zApcK1Q82_zi78|&`*q8ILIX_EJnCNEG!(JohwX!^c~k})ajaQ`E!#J{nFibMEtCCyfKkIoGg7N?s(>&-5I^`dt#te)J~tj>5n^t(cVc!Jz*LYGsobW z91?EINl({A@290zh*VkPz2_~Twtnl0$t}}ztSMGLV_GzuO4{HjO@75@xOR{eGLOhz z(aUjL?W2^7Mi7s@Rml8u1>`B14zU3YOl|2)do-fs|3N)t73z!WAfKh|5Q`h>v5@2# z-yr$1kW*%?AqhpRt2u6KezbuaX>I2QvipSgG2oE0=^p?FqUk%pfWRtM{yH`B{~5NE zF;>cR+R0HDIMU!|YGn@*P%xA+U88zFy~i6eFEdj*~ag;eyql$@jFwHhgZQwKp)1!_pZNs=`)>iFz#tRQ7N~DcZtWTBoo@4;~JPS&cCu7Au_p zrL`33I*VnsX!0cJ`@!LhP4~xq-4wD7uog38C+lm3cq3T$vBBo7UyS~!qgk@fSB(V% zOntzEvw7ieM2LPd(9_Y`5qKK-md#3CxEf0nFl`-j47ZoxLXvSDz#3;nz1yMY?4SR^ z+dYoh+P|gW4DydZqT9Vq$sbdap;5I8V=&{~3BztTB-+feQ2A_$He5M} zKm-XMacD?h!j-$|GkXEWu1FtSJPQT(==fYgb=u~>UOZ6@vR+*OsRL1Z{lH%ou*Z%xztoA}rXNrb~PF{e$ z!Z2PbeUKTKqF^Fin~vkppOA@`XDrkpc5aaGP_-{m!e&l?j9exk(l=n%bELYAJ*x(p z2mwG$1w8(lk>_Rlj^zSM=v&MbvUdbTlo6S%pk?Cag`)(0o|!^O3FJ{e4caHkY(Rif zC%icT3~>Qgwh@^%A*{_P8dgJrM`SORBPTzZrfIpH5>n*K%_CW15Q9`AAI*B{!iZc?=Nc$!q{CLxoF+Q3ijrnZS||xo z(uyQgJowyK_6+UbyJz>l{(;BkyYwiDCCC&I$m(G@9j~Ucos{gLWFI9o4~r1$rz!Un zdd+7j$1>2Jl;ai0PpCTnws~yR2QIfz(n-llD#x-#o>b@~7FfOe>BM#G7 z;capO1_Wx8A`*&$A2XTmOZERG)qX75Kb9OHOU{p_!jGk*kEPQ4Qq_H_?!L78zSMMI z3fz|(Ijz1g;jiwWBo7~{xG&XkW)&ZAxi5uKAzvcO2k%SxtL54%?@K7(%+;3Pms?rn{18b&q$mm$MOqTgh&(xh%mS7>17N|$ zF5I&q33zFPI=O^Z>?3$*g;Xq+kgK~KS#qwJO3GGME{St-rBca13jr>!)>IW-r~GmM zq##2+JIp`%z3!RW*~Nn5<>X2-5@&j6x?jJ3{rY|NYy7v`+8PO0=qINVn@&m6-_Q^1 z@`!@GGUAq`TaqSea#9+T`(>HRuB5Bq#h*&Q8&4(a8T0mg`8RjcH|Fd2qwLYV$-r1m ze+@7DP!9G7dD)M0s6WKZ0hDX|Yk9c_<+}blUJjxh?ho^FC|N(&(BHtzwaLb@rv4^b z(%qxo7P_S;YvFjU>u+&Mddq0E^u;P^bsx&2+`k@m+@t%fFQumzw(GR5S*PBv(+((y zORcSv)`0iD*00iY$h84K`Zuo$xlwESar1{R(V~Bgwntm{rn_I&p3qwG>g?Axyy@-Vwq`GFdeG5JCvg2*2}i4>9njj}bbo06?B7wn zR;gD}(w@{dK29s`V0laJkhbYf&zJY69j<8il(yN~j=pNW6?LB0wt!AM)})83*E;CY zRehw|5v{{9vhM1&%6kSbN42ew(`pqxp3$~B#vXoON{?r??Vv}uc3j&5 zu8M$vx}5yO+dQXrgNJrj{nn>N@NJiNLfeVpu~J*|qWnrxJ|8W*PWDZ;3>;5Q_QjIP*u|u-X4O)Eo{Q;; zlomGy3|}=6ppqg<@(M|-w@8?}W~3omliv(olQVYBtelgqC4WweC{q_+jNsSrml~^j1NDZr*w953jp17>5nGszz(N;~gYgAn6i=%oxLyd+K%s{~;P?Ud- zbKJ}uN&78?Vh;-M$hRbylyj9(v)1FVoR$7m{+Hf_l$HNX{v-Ju2!Dpvqs?8V=mvbF z=)H7>Kjk3jPDs|X~N2&!qu_#)jgN>)a5}<8Lt^l>0KAwOl1`}gGBY9%0NS@7;<97w&NASHCk~4 z62GaDJx_h%l|pT|yXTHC1b5`!I~Za4mGI18olA@*k}*d7(M$B{9du$d*rQ&Y$f)U5 za#E%DoOet^Q*E4DsIZ!oc2kS3xH&oLe#6fBhMoEFkvr!<4j;Mq z>U{V}-hYJ8C!@NYQ&=Z8b+U-x>V`$|sf#{a>=BYZN2{`jbD*@e@K0V@kHTBhTUfCW zDl){1i;ERk)`q%;Y%93`|>`>6i|ZF!tgS6L=+&OsZGX>=K_t zqdH3w6L4-yq%egsji!}`#ibKOlHdY*YqOP*t(K7LQ4<-JcQuqqX;e#1q*6K?OG8+h zf{Zr@!WD&kcm$lEOk5Ha=rE^q5L3 zCX-Gl!PR5qX_isT)lR9lrVo{f);$#Iy*Xfy^1zN;Cvyvy5pIvJ?c&p zHhAn5a;5?jwZnMTqbe##iB1Dz_}vaFM9Mm+CPG&6Hi^{b^d-G}sE6RJ?yjt<*{pof z-4?z*>QJdCv#QNFf;7G3q)*MM=QGsH=auuE-~@{=AfSj!V&$9d^pr8d^j;DqhMplA zHh7**=#W|@FRoZkInP{#(&PNAfw#4?VGspyF?~!QyQnir86n$jrULv#rpr)aVi0;v zS10w1DT8c%jFm-VzKNC@c@gipOx+FbJ);aMU#7p$#L>vUYz_OL@#-Drmb6;CUUTK# ztTF2v#iFgea^4S3#I7l+2GlYAGiN<#ovbpwA>*^YYI4py>bHKCo#4fk8R=3Bb%1Q%Kk+*FoYHrz_zOwV0fXxTTbEQK3qzWtzO z>#|E;*H!4+cfafD`L3t)JDw>ttIHnOx{eja-P*V;xf>dnLsIkR+5NYAZ}#4f%{Aql z4$fshZaR49@_f_5eCS|>+KISJ1`68`yx0N4keGT9V;06rz#h=lj>jALO9X_p)&HE9 ze(S0a9QvYDs^5Hj=D)_ReP=m&5kW~r{|88HCXV>yhDYP!{ zZsw@L>ZLYhr^0ZfT({$+Tk8H6vu8yQAxAApBq6G^fW)9O|lPZyBwvf)@H zf}2&M$X0W7(WrV^X9k8F(==V{?Ntv)pWsdHS*1y_MY-^BEH`Y%Wm-&+aKzRSAiZepaVPSxg~wHMb^%L&W7#BzcM zW3JAry^p!lHuu+|Bn)BtmUd*?>G!tI-O2Lk~EqQhCvLx@@fm>k5vLbov7TxQX z{SJYLaLAZ;9tyW?L7)R6=7c$dRJgDj9~ zsnD~BOVxNKzXwT#R)MXs=g|=QIcXF<WQogtaPFDuaWwyb$) zgy*Pe9t5Nyg0A}^pzyTtIEP>GCVer6DHr;Td`2?Jd*eyyF$xUucpJ17963Y-gs!r+ zlD#~zoP=mLBU)Arfm`&5+oaXlL?%6kxF5y5CROl9EIy*5T%qDDSCFgk!EXW|bZowa zL&XDu{I!9#Y=-!_dLf};va;MC)&rP9o=~z&oLUFKB2Jm>}SVHC;(K5avvNJr#GDLc&}k zhaPfSrPv+3dNM>}tJ#)97%{ZwGsrbS903!!n8LHbxQXMfAte(j3^kKTCNh&M#)Nu; zQ3WAlg2ly>u>0b{XN#n!Nk%Nyizr$-bD789sd>(xKvS5t z7lBIbB3PizzlO{e-B}~ylS5XQaHY$;tX$ly46gV{ECt_>n_T<&pa~Hgj>W*7T}|2W z*vxA~GMQMtGJ*h>8Qme)A_~xOABoUj8w?K)nXHA`GG`WSl}vz2mX`{SLzohaQAbRI zw=G$g&Vf4NR%K|msAJi(gCVHNkI`9VuOk#7+x-p4I@h{R% zB9itWB3(3t2J|~PgxHj1a&+oYSt~ofRM8A!_{#|m3~Vjz=)+oa&R;ieh6`mz11UEi z5ZMQHSsum6N*P;)TH1vLGj^OplRq@|8njnnlps}H*e|j-K(5JI`8vFq;(o&7FDyJyCeN;u@v>hlDw zR$Q7}^H_9;7I%+!R8+uE)G){QO$CmK=bHDLFY9IAtWWb^mY6H+x#q^sPmSh>{zoiG z^S!6!0<_a}&0n1!S^q%5>L=?zCvB55b=L1ri7B%5n)LmjUXiXUuSr+rNZ`!WlgF`b zH#RObrlmfKYr)NYlgpIRmWaw+NyPPN(JPiu(LJIk$BXj7LwWZzWaGe)9Mg&lG+)uf z)giYXVRdsW({Dj#ub?hBZX*rFngoK>Lf|usb`=9;9gC=vGM*kU)(;GD7aUO_*bWAT znBa(Gbr$_hCvQ{Nigg$VOJFy}YKYxK_AEh@GsW8Tubq8jCa}X4IC_NQSWcrJHKUb zKC}_;Nke14erqArc;n^V%kOpPx9wkOJFpmfaw%AUw4_dd(xqtYbd}w>VY5P(zoDa4aTHAA{mRi@} znz}i4zqM<=wQHd@a=&%&eCytO+wK_)txwOKDs=YT?>sc$dFUf$q4UUmsAJ~TZ2b1Y zUxgcIFXub@=3Dy;?b~Mkzp87<*PWQXdZ**w$@#hyAL+QwD20|*8t07i{a^usyPDs9 zu@}DQui<<(d=jc(R`7gikZAcy=tPb5^P0ek7Uk#bWZcbgTruR_J7(KZl|6?WK5JCI zh+EMO12V&TGveX%CT5W4vgjt|FI-6yu7j|mDqW{LcyEm1_7J|)OR{vZclyLV#O*3xuhPY$i|4M%2D+~TtX1@JN)B3#sT)yqxg8$sia zHoQ<5ol$=4?(j4%pOhtkDDP|iB)tB1^FR4+-oJS%*lb1DioO@v_}|CbWG4t&5=-VN z{xOP-Zb&Dxz0B@ie=jeyikD`CMb?qTUZhSsaI@7LVL%sDNj1OqQ4rS=M2h}?WjJmD z#F8f&=~)e!JUNc)EDE=<9}n-(8iG_U_@v1h+b6X3gk0Jq$d>%hCYO}4rMjkQ(8CEi z>mof+s&&p$2f9KYav>{#*MYC-jv@bR4PQ|h!ooR<*_JF>*p{$1y}}xjQM3zbsA(8x z>`DS=5ZQhPd26U|`g^9>8dOIouyM$(cd9iABWaMs;8L8DJZP`l+*q=V+cLBK%Pl?t zu!W*!=snVsq%oKlmANo3h_!qe^M=Ju%blg^Mv_^G01B}@ir+{O8x)4e>RvDTgU*Gj zFVywSDE4CS{{EHuFyeIiaQEDHlsbu%E_7_0IldU$yyOqu z_qWaa+wS{2=KURW+kfHj<_kO`bJmChB)@1q6G_7~2^6=sB1SoB+DlB5^sEgrjCVt>h45Y^yql>n=<@6`5cYFfJzr28bMBwm}nWhy(Y3h(F-#!WD`mFTRjN53_-$FqXWftc;^<9XRVObAkn~d*?A}nqK>jCtcaEA ziJIX8P(*B}TVxbnQ=ek6nFKc0teBc3e#JW{Nn~9XBKB03g$a27*dOElou!Q`G4s_J z#3UcWU@%xFkUYUK0=qwR7R#X1TEjR>a978cssgoGLIAV%Hmw2L+U9O4-={CzT+i}U zwwy8~ClE#@6=q2o8S>?vh>Au~7u75Z;H9CToc@ zuP3Lei79WnpUevSsmg>@Gl! z!pg)`NK%S+8|Be??g#;yq}a3|%?`_Gfgm$J1prz&5YK9agZCY`JiAT}7lU zd>b%|9*(y`od8>rtneCsOl=3rk?%s=f$7wMK&iA;EN}69#PPrgX80%J=0YfZ<8Oxlte*04iWGebV_+y58$Qnnelet9h2YT#c>gC6V&wBZwf;m}olH;gRC^+c zIq~{2c8+7!C$Qr48WX!q_9g;{fLV#&^@|b0N0%54lVN#D><73N-4~H!$`yUleI}jK z@4AXLa7#^tjW1&aFt1a63IcOv%g9q~szMp|Pf<5Z#4u2pmR1^Fp7ozY-?tW8)S2Lt zyXL-o-Mo9Q!{~n#|UUcs&{Z7s4i|(G%?~%OPyXbzp^kOK#`T0fn$p^uP z*{Act$lQ+kU?lI3aAL>Nw|&`C<@#QLKys;-h zsge|+1wb2|m7+kf1Wr(3K|&yywR+T%goat>%PWx@rzA)6D~wAd9l$bhP{(27y$>3jt*3W61DKp=g9lZO2e)sTB{ z^E1zcx4i1G1rq~rsOi50dsfLweA~80mYvg>>xf^u;TUilXas6IZ97expL zu?p-}i&JbA%|$Tg5>jA=iNhm3R)Rlmp*x0Y;b)GcM@7C6hCW7NUl<9n+(_c`L1p`ZT~qr8{JXg|bx zB%-%We8kfeNsX^g2N6yFufEYC(x!>2N#GHsD-~NolOd1`H;oq7jX%dkNnb1_ew0lQ1X14yh(Pp~+-aeSgn2$(F+oiUP=;Gv61%(IUJ zIhRL|br^_jHzouXQDQs|X)dyjI2WDer&K`)E>6VCst`c7(6KRb*2Xz3o-syt4^ZJb zg5_jBYB_FarZzp2nM5`L&cTeqx#8PeQc}5wBj8!3n*CDEV#$@P z5Fg-#GqwexDLD_0UAUbGmP%SX=gxU^o}5qfyr)b-WdrXj={rC6I&{A@y3R4+ijk4m zx@|4IX{)Z{Lb6M}ES0e3xVqlA?Ltj@!)2$z_|EXTnL23cPn%`H!O-l)8{|oJS<^{6 zt;=Hl=u~H)y|zg@vN1|XER*Wsv8ix*GHn#5ubU)a(Px4!`b_DDgl|tgolLVxu-Jh0 zgv>^)0^08)G>QR!2#clDnPMQ38cGXmxpDRCEcz*HpKJ~G=b%rq`K(~aGwIApIu_4U zY}g)rVl+AIFQ}56%%OM;N65gExobuX zJ_F|)pQ7>ac(~xUa)15qkJs-;CJK_w5gHF}EUa(;p!VI`ABFF)-#fp4@673?VB^fO z+u8h(S zwsWMWovcKTEe}}nFa*1aR*?WZj|ajj!jdb7%s)TCjkuzBXn+#Az%~QJ$@E2}b+Z^% z4}hOUmJ@pizeSv*hEJzscKKvqr|%T|D0(hf)V0n^t=I|^> z@~5ct=QP`t@bSN}7xF6dR>ITYebCsHZ{EMqcwol2>%-J6k6BjNV>vod#dJDrYhWu&GuGBY~Yx#;dH`MpE$#q#Qrh0RA7-Om&@ zbWER|>794CRP}@7ppJdnKJNd(D@1>TUtRPU{vxR%T-a}`9wGKUMikj!@}?07#)Q)K zrI2f!vFB1MYFRuu6vLkzlFl-HHxJDW;{dXzQec=84Ik6bqpA?v!@_;CR!lV)@Ann& zB@Dhg+cNG{`EF1e;Z=Es#0EDR`l_1@#=+7gp#}y2DlW@xz}G6_jvtq8&5qg`NF^Xv zdnjiY{f9r2a-`478x;q)$ob~-%bpWD{5?2$#K>qkjQk9l@uoyGqU>J)_8Da1+`*Hp zq@thx2n@C5%8C6YeW2)NdHgj%-VCocwV5ifQaAQ@{DmpW*b4yD(yxN`x0~*7h<>~w z`XE$4+jMK=&5eJudCvHY$$viii_l(*T%XFF`oY(hJyP4AnJ2B-wO6pBQ);t&gcgrR zx0?bRMy}=cSmTR2B(@?%E{W~c@#TNJYJ5S*px9sGbC`y41qF&LyFIO+hq$!r_yXTY#M$9d zRJQW@EJ!5+SAoR-Q`J7J5x2v^P?e+O>53Pu9{-x~bP&+OXbl4H=dJPa%Q`?63lw;n zuelaSn`ksjTn|>f;Mm&YY((P$cGn59e{W;Aj!&VIdJmf&UA%s>4}6T^`!aGyj*cYq(+qCYJ|rzj;x`cGKVZaN#tNZX0zL^9n)GH4x@$p6J3 zJ2MSwic%LnboR^;E>xUeG>D!C_#p*43U3r$8QuKrX6F!WWlbE)c^q?iHO9o>up;NT z=qL3_;jE%Ul7)*Ro_w?&U-=&=;(t+rA57+H>P0^em9b|0ci=T>K_^gX)G z(2aH@`DPCLDV0cx@becUpJ5ArKJ*_!lxHHTKf^x8Pgr4+u>kTRiC&gJmA3wkRQF4% z@l&buQ%U{rQroA}2L6BRr_%aQrS?yy?oXxGCB^;Lu{VzW(!F)b-#p{G5z2*Tk-)xT z`uLK&cKY~Rr>~!$iT~l5X}M7GGhBaTDmQg|+wE_CF!Aoh?Va=C?bD%xr*8Tmz4hAl z*Jd*L_Wg^V1JkY*uV3z3X$i<(%WcxmJX*;2OV|Jf~JXcrI(Q^u&SB zmCdLU2rcvH)*k-kRq%fKIavxe&ve{~6lhuY;0gDmu4&mvCBNj2{5pUVZ^>)pz_@6;)Ua+@@lf+R z{zS8y)@2{wpcw!Js8mA$f+(2)=v|`)pd0AB%>L=wv0eN=bc8>bJl((c;Jw)tCH#q! zu3ZJSbJ_C^8Dyy0wyaQLDX>YrF)^oig!<8y059U~n1d{TuvoLJj4ZoMvh4bQiYz^R zT3m9ENtT|1AWP4ZX9tm`$0kcpi7btB7pDrIoG5sjG@%km^3+NIrInpNIkMa$J^9q< z$_5a!5i?28jeEtj?-YM7c{Z$g@P4^h+JC5`CYY6496woBbLH?ldFRR#b@EOm2exln zR)%F1y^@N_FU~9LW$`y*{x_;r8u{HH*`$Kmk*?TPrm^>Ez3(}j7s^a{W7W1iz~ za}p=<32vMp=6R|+5{_}_uwc|(!*0-=iK_9cVGpATsC$RKsJkS0!Z%($T+QlL3IBLt zIKb+jM9p|`ILPW=)N6-pc}{kZb(%vco|Ss^<4e?!hlWF}eKqP0!wszNN4;^l5%q2< za6=ewa&X5vspbYJ1?A=kPQ91m7DlZFwN7rasI81z4{AtmwWw{3+5l>!+-6bR8MO)2 zW?S2JjM@TftBtyzQQJUmw^27R>N-%@+o&Ckx&hP<+sH&l6+zu7Z?wkH$*7&6cG;+1 zQ;zVaU(tt#`9gIxnM`R>EuKoML%6QGC~KO0RYTR2H0r;?no`>!t|N3aqH26Y7Cpt5qY0qBfxT5AJu@xer_W7otDtp1*u| z^I~iNf2uU`-)L;+!_I;)uEvw97EQ+Ff>YI$f6 z+fiKS@>O-&s`Wn^d)W4OXCL<*$_E>6rf1W5@4bP?t^K)Rf7a9gw7M}XG_IgM7o);F z3=!p54ukSdtclDG^Ab1gkoaMzM6-7E9uS2Fuv@3@YE{Z*v;X`Z4R6=Dq_)owgW==QN9PO*Wn8BE|<(OI*>q zuw#l-YEcQh3NCeWLRJc%NF<(&YmtcJ0lna(;puW&s2Z156^w($6jV7eqI6OVZzK{+ zL{&8sQRy9`c%7}EBH|+5TskSeX6JNM?Lq;bdEyDoRxNs3=9?dTHmylHXpKFT2mPVd6xuQ*8`ZV<;8ltJ3Ss##(xN zGoD`YqX6FpLpP^qr?Z~+|J%?M*gsC8j_t#$!bECHB$93_8;?QXN)LspVDn<<6Ji`T zFW*B2^TJ>E6;+JM3s5^~qaQ_1ku3fht1|Bv&zNCv@ye{3J-*{Gl^5~W7_;wY8~yx_ z)3hc$)LK{=dR}`}QBul)c+Hso88#XB9R-1Oe8I&mLD;R(U=(_HfsYj2`jRMHh`15O zeFs}rr4MyODeB5YAhu11%4U#=FHzG&D6o#z!OZ?Aq0U^WJ2UvH$N$71$kvEC|HdW% zmPP-ThYd?R2N!n^=5`*-`nTl#$MbcK`TC~YeYg64TP1jXZ2rRnV=tu{Jr>-GtW7G( zf-say${5=pfynMK8M`mAai;6F-jk=ls`Va9PJKquL%6g@7TPF*%WlL?8s+pfYaz zf-a@&sVNmCN-8nr?{07(3x}88TwVS3lb;DLSI0^X?^?IwM)Az;aru@x6zt>KgE2f~ z9fn@vSLp2()he)=p;!Y@tS+evsufs{Dbgw^QcuD61}PcFAJJ`)SLjjL9$8676Xgn3 zjb8*+6{FCcct!-ANGZLdcy2VVirUmf9L6d!gtLRENp1j!W zV=V@l9TE+O9AFBWb!d`EOG|NeA`zYHwLcNlt`3MPW)yK@wf>$D&Z|66zS0 zIYh>q;#=`Vf^|hhG!IBX0-s#cPjpgC0RibBL^oAfei7z;Qb%3-fPO{VAZCd-E~t(_ zeq|1oGSlIF(R571oJ1^@0%0~56c1a6vaT|HjMPurQEF-=sOk!)N9n**jC~7E%w?e} zrb9bijY|-)F1k&&Mj51nu`rDb^JTX+p(5W{cIF70slMht*9=CV5wGd$V`j4m6DN+!iHTl?7CG!tj^b2s>-V4Y zKBX7e3Ry8`F~fe{L^8=>O__g1Jw)_pl%3R;oR5Ovcpo6WHd?5&HDVS=Rd!HQW^KLX zr7@+-Oo}OmWN2Bdg1{UCLkvaTn2?~QgElcFgL?u*brnUK!Ohn;WL)`RT}F87uf2I< z_C(e%f_B?;%d=D~F4l@mwL2DTcRXx(x8>(8x!Qqj?Xgco4cW$*bD@Ey(4oc9p?u4_ zyPi9qrIwc#TV8r7y*v8z(WU+~i~VP^fBgDl|Jh|H*Kn9$;T#P$nL*gI=JvTS&+nRh zB{K-ae{#670hE21t*}RV87F0cidU%EPsOWL zh*Z#ID+j1Jh{A5u3Ee1EP(LauSJ?DlJKQeMaxJs!zZIOWQ~Wbu0~vD^x-q9GV)(NT zT3j6b$}yDX#@x%%KS|Kf_EK^&1Mj#IfEVS42PF)H0zb(O^Ilc(AC5|vmmUqkIKAj7 z={QdnQ-cii!@Rk|aw51LCgU9VG~aJ*eZ4VjrmsEFiHBc027$l;?jtOV2$;u@D?^=@{loT2Ac3}G{MlH7QZ6XoS$cJJWn7f7FA_^ z(MrFVU17-;S&U7pKu+S7Xd*5#s6-C;WI_V^o0yQ37|F>IeSy{*4KX15sJOP7@smU! zq)x_0w~Lq*MvaPzxJs)dS6Toz9GN%?;g@mnf_Ql{rGc55|1Z<`;7Xs>nB}}f=tu$~ zAbOOd486Hb^fv7yb&f9SmJYcH z-mx#SgRVxqG+VIiGMcKLC;+=wYdCL>;ovWHJ@)kE8`}WAeEGI+fUKYnvJCKoCpeBK zfPM5AKwZnbe>(sGz?zp9Gko$Zm7&4gJ(cN|!hC310n9!yMu~T9vH^vn=Uf?NRRB~) zkNGTT>&a=pp%UcK5Hi${Vyp+_tkk;&zo2kkL+O^2Nyh#p1e0>P&z%mJ+-3meT2ZKH zZ0&(Y7(39)!alJ&F-f6@&;rxUOcCff-NGF@OOb<#4j7NolPcjG(LfI5wx-)lcuCi@ z5yKsurYF9Ef}x0;2WJmvt9$aT>+g2l>6ks057gZpo*m8xx`@5+ueRtw?Q3xuq2xtt zdZRypSiT;OlZOp;9HS_#s9=KQ3e&KLXHHf=s$85Lmy?=!0k{H2`7P*i>{~F!kEr>T zIP9^G6ynJ%sY|*cgO?ps;uG4M=6g>i^Bo~XQEm|9NeK?TCL=b1U@yZQsS#FZ^2U(M zT2|;Bo-j5>$bb;`NW#G3E2uB)dA(OcIBRu8%`d`~CQU;M6ZmDaj=Fk)xrNm{e}1#o z<>vF}x3AS1+UZ^f8qo~n+MHxi42x!0rBv6IJ1S)s&23t=tGw#K)*8Gt*fZgQ$ynSp zY+lj2!IyFjDdb*+oi>wZY$wp{hO5>#X@7?2bh}0&MrPMaq6w|#d}bN9@1ngKyI!p= z8n^GQUpRcvdGC#fryhF_u4&yYlYS5S?+>tUdn#M8|5xkgKmda;+NGksnc=5-#f638 z;YK@>yyO6-V#IgGG3~hCxyD$VD$^_3GW5fZRR}b!8BRF0M&A{}31e0;0V`@8m7fOH z&csGrM77C=;g}Jo1tl=;RJ_wp33ZyCbO3Z`(lISi5QNPd1t0WTb51)X*Cl9h#jjZ* z3(5V!L>R8*t7uX6LJKRfFyl&YM+@%@Eqt~<+HHMToAj{?feVB~{O0``*R<>V*gHVD z1Yd*^3qTPyL(h3pmo*2oZ_LD}9lc_~V+wrQRLz#2RZe1V(lv%88H%{zwKPk*&b(D5 zHJBs=gOD80gn5PJ^*P^*c!vc$6f!hA)*x`fniPVpE2e%~P=i_Mf zg-amJz=8Ms-s}535awy?`pl_M8+#VgxyD@?-^bzIbC>7a=KYI}n;z9?d`}x&Z%1xL zGQK>vJge6)bpLegkG5tz_gRQ&_hRer%&Dg}^*0lH6qt+wTww$C2_lpg5KHT5ku^)EK{f3P*%)Sqj5Epz;7ed}E7{J{M7 zh3Gx!!elo1Qr7d*i!KB#jBaHfqOz8fRS#Acc4aN~WY{5eX&q33q$;f~Gut+r6@|4L zL#XV)A8#+-vT6`EWD%IWR5a{>;W}rN{|tdJx6SD??9y>4!{P!_Y+P+X?n`(>3FO`e zLb~Mzo;7wEe?iR;qX4tgcIUUI^V@g)?9^YKnr|R{eYfL#9ghYxr=Czmu0I#ryA(RG z7&`Eat=Z6lT0Odgd%WO{)8@>48BP< zW~axgR*H<*h>wZXlEhJ=@2eai`%}6@#Vr0*!mtb;djXHz2p(_f)Dd!i|pJeYX~j}@#IQVkE{3D8Q$d*^%xtywK8ZvhC7u(^B)pp8%mu;eBw0QlS+@2 zqho}%^YJivkW;%2l>PDobE z4!fKn=5NW}EX6!vR)GsG7Z)*)l7t2p0kL8zz=)8hrlAyz*BD<2Q8I)`N#M=U`$bo^ zxD{2c16yW93IRRz6;H&qxU8C%g2EiSl_%z zAIcnLif~7+Y3EYYzQv|}k1l1K_T`#RWsZMpWlHFQl=hyC@YvImU%xdYeB^0+Q4f+{ z!u;|p|BcF;deC2451s`AuM`|9YP-rB%mfnV*$yQohvd|(FvpC@aFx|D~j1l5ASVbkZ z%Sgu3&xDbMRb3=aDQxM_R9 zJvrZ(mf@z?A|8NVx8K@6w_*PBLi2(*8{C@pY}FOpSMYv>LzqMmz|_Tp>1~>nbZf=9 z2g`k6V#5L_r5autrhdvdH&R5TB8$IbY(s$Zt|#TadoT3&a<$*J?P+7nvI}S6kb1;6 zsOI5Xb}oCV=A(EAwK8HGs6AWfb8XYVhWd};&pHIX#;;Ih=0!CvIg4=&s!2j|3xvfk zToj2b)F8m6>twb^7HuhsT!0;Ql|%kLCE+P7n*eE96NxxRijjmhoaYXe!Ap&8uC5HQxzCk~Sx9jKKhuHb4H}K4b`@iN;=;NinN+iMXQ27=5lG3zEWCS}4wV0zrMx2dt zc{*2wAK)sJ)jmIyn@{}T*__3{OL*Mun@00_xV#^+KH`cYBy&|*nfrQDp02oOFhL3x zPRyA~ruYW;8;8rK=asNKB{K^Kr-NVFin2t0g?I`Tka(8893W$pVF&F5(*YI%9 zBkldG?_GWW>+gO2pFKlt9`H)`BH9wNc}paydP>0y+C-#VG=j?7$v}c_~Rr25dLXbS*5eLh+&JLiJ?a`YA)fL!ZRFcq7y8TWF%3 zrlK2#O7jSfW4A-~*5p|7LQp~_=7PK!d94j|kz8mKWwsjm)eVn58=i=L4?Q{YW!-UT z5wQgu(1pnOY;9 zvr#GAhh&pPCL2s&^xnv!*OBLD)NEPRObpX4#d#}*&?3zq$tMJjwgM02f(Ms^#}=t}cB=sTCxxm7aK$3g)U2hljfH>1R^`D`*Cbc-~%%U-CypNZ;>n@oG_{JXP+&n})-OP{HtN-D{UV2D ztFyc~wl~fqfXtI*fSKVjX6%?K7W}VICbjsuZi5)7v#BbRgXf<8dWQZ1<;Qp%38eZD zD3+Z(&ws*o{*v49FI@d6ocIa1?w4HmC*0OgxMt9wI)!f@{Kmmgg!Sxy$BJ9vn^tSu zdEeZds~k?N`@2!!u*%`II>c|r#lR|u)9N{Xkmtp@=~a%-t3!?sejDAxX?2jV;Wy6> zuW~r8cDi}bTzZwmX|>+XpXTR%ba9$rt*=3MHPp(t+R5`L_{^79IXbU;e0*1C|7RRd HY~lY0Rhyct diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc deleted file mode 100644 index 04272ff540c6b8902308d5e1a1699ea68dfdbe1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13663 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

4Y+Ap@RF#)axwZ0Xo> zS)}7!)8JE_jWpmyJb6-U<+XY`5g!-k11{FhQ*mkZ;i|2Q@Mdg@2uqC8ebtT_94*4I zMIO#L*>|kF<;sWs5Bfj!etPid&;R84k6Sm79KThb-O11X<8JBjkKf)YzV=sQ1LL2{ z2kuVI?7VpD*3{hZp4lnAy_+GGgAa40RQcz_apZUuq4dkIR>}49$x7xolP8Or-xjkl zeF9Jr9t@zgU~-LU7!!ILoU9`J>?3Zi>;cFsG_w7)Np7StVG(EnnT^-qh4d6yk%3qn zX2Y=lhR9$XT~h}@+CtS)XiA)KHo52OW-~58%B6`B=U5nufI}0>xO#mARO1rX!LW+e ziy-1C{GuZ;Y?05L!qs!z=WaVQH=UUut$l3Ya^AS@%-(cnfA!`k&Q}xU1oE{t>)ZvS!*=b-~w z+oetGX{m7mt#USgF^?z~Fh7Mqj4L!yW6`jb6IhUKv*}77aINjL6#&=yc3RSV$bmqN zfT&-KQdEHzpf94M;76$hSE)6`0>k1@LAVFyg0K<22gAdRWm)&gOP`Xdd*t)? zGtSi$mrvYtUii!SX>TkINR%Q2?ZGCOG PU|Y}qy)a=_OdS3V->K7I diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc deleted file mode 100644 index b5a42d63f251972afd0553e64e265e56817cbf9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20433 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 diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc deleted file mode 100644 index 9e6cfba279aae3396e3e7593e8585ef01840f1ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34642 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 diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 7739f51e7419d489081165a741317cd27f923e1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24870 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 t.TextIO: - if encoding is None: - encoding = get_best_encoding(stream) - if errors is None: - errors = "replace" - return _NonClosingTextIOWrapper( - stream, - encoding, - errors, - line_buffering=True, - force_readable=force_readable, - force_writable=force_writable, - ) - - -def is_ascii_encoding(encoding: str) -> bool: - """Checks if a given encoding is ascii.""" - try: - return codecs.lookup(encoding).name == "ascii" - except LookupError: - return False - - -def get_best_encoding(stream: t.IO[t.Any]) -> str: - """Returns the default stream encoding if not found.""" - rv = getattr(stream, "encoding", None) or sys.getdefaultencoding() - if is_ascii_encoding(rv): - return "utf-8" - return rv - - -class _NonClosingTextIOWrapper(io.TextIOWrapper): - def __init__( - self, - stream: t.BinaryIO, - encoding: str | None, - errors: str | None, - force_readable: bool = False, - force_writable: bool = False, - **extra: t.Any, - ) -> None: - self._stream = stream = t.cast( - t.BinaryIO, _FixupStream(stream, force_readable, force_writable) - ) - super().__init__(stream, encoding, errors, **extra) - - def __del__(self) -> None: - try: - self.detach() - except Exception: - pass - - def isatty(self) -> bool: - # https://bitbucket.org/pypy/pypy/issue/1803 - return self._stream.isatty() - - -class _FixupStream: - """The new io interface needs more from streams than streams - traditionally implement. As such, this fix-up code is necessary in - some circumstances. - - The forcing of readable and writable flags are there because some tools - put badly patched objects on sys (one such offender are certain version - of jupyter notebook). - """ - - def __init__( - self, - stream: t.BinaryIO, - force_readable: bool = False, - force_writable: bool = False, - ): - self._stream = stream - self._force_readable = force_readable - self._force_writable = force_writable - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._stream, name) - - def read1(self, size: int) -> bytes: - f = getattr(self._stream, "read1", None) - - if f is not None: - return t.cast(bytes, f(size)) - - return self._stream.read(size) - - def readable(self) -> bool: - if self._force_readable: - return True - x = getattr(self._stream, "readable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.read(0) - except Exception: - return False - return True - - def writable(self) -> bool: - if self._force_writable: - return True - x = getattr(self._stream, "writable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.write(b"") - except Exception: - try: - self._stream.write(b"") - except Exception: - return False - return True - - def seekable(self) -> bool: - x = getattr(self._stream, "seekable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.seek(self._stream.tell()) - except Exception: - return False - return True - - -def _is_binary_reader(stream: t.IO[t.Any], default: bool = False) -> bool: - try: - return isinstance(stream.read(0), bytes) - except Exception: - return default - # This happens in some cases where the stream was already - # closed. In this case, we assume the default. - - -def _is_binary_writer(stream: t.IO[t.Any], default: bool = False) -> bool: - try: - stream.write(b"") - except Exception: - try: - stream.write("") - return False - except Exception: - pass - return default - return True - - -def _find_binary_reader(stream: t.IO[t.Any]) -> t.BinaryIO | None: - # We need to figure out if the given stream is already binary. - # This can happen because the official docs recommend detaching - # the streams to get binary streams. Some code might do this, so - # we need to deal with this case explicitly. - if _is_binary_reader(stream, False): - return t.cast(t.BinaryIO, stream) - - buf = getattr(stream, "buffer", None) - - # Same situation here; this time we assume that the buffer is - # actually binary in case it's closed. - if buf is not None and _is_binary_reader(buf, True): - return t.cast(t.BinaryIO, buf) - - return None - - -def _find_binary_writer(stream: t.IO[t.Any]) -> t.BinaryIO | None: - # We need to figure out if the given stream is already binary. - # This can happen because the official docs recommend detaching - # the streams to get binary streams. Some code might do this, so - # we need to deal with this case explicitly. - if _is_binary_writer(stream, False): - return t.cast(t.BinaryIO, stream) - - buf = getattr(stream, "buffer", None) - - # Same situation here; this time we assume that the buffer is - # actually binary in case it's closed. - if buf is not None and _is_binary_writer(buf, True): - return t.cast(t.BinaryIO, buf) - - return None - - -def _stream_is_misconfigured(stream: t.TextIO) -> bool: - """A stream is misconfigured if its encoding is ASCII.""" - # If the stream does not have an encoding set, we assume it's set - # to ASCII. This appears to happen in certain unittest - # environments. It's not quite clear what the correct behavior is - # but this at least will force Click to recover somehow. - return is_ascii_encoding(getattr(stream, "encoding", None) or "ascii") - - -def _is_compat_stream_attr(stream: t.TextIO, attr: str, value: str | None) -> bool: - """A stream attribute is compatible if it is equal to the - desired value or the desired value is unset and the attribute - has a value. - """ - stream_value = getattr(stream, attr, None) - return stream_value == value or (value is None and stream_value is not None) - - -def _is_compatible_text_stream( - stream: t.TextIO, encoding: str | None, errors: str | None -) -> bool: - """Check if a stream's encoding and errors attributes are - compatible with the desired values. - """ - return _is_compat_stream_attr( - stream, "encoding", encoding - ) and _is_compat_stream_attr(stream, "errors", errors) - - -def _force_correct_text_stream( - text_stream: t.IO[t.Any], - encoding: str | None, - errors: str | None, - is_binary: t.Callable[[t.IO[t.Any], bool], bool], - find_binary: t.Callable[[t.IO[t.Any]], t.BinaryIO | None], - force_readable: bool = False, - force_writable: bool = False, -) -> t.TextIO: - if is_binary(text_stream, False): - binary_reader = t.cast(t.BinaryIO, text_stream) - else: - text_stream = t.cast(t.TextIO, text_stream) - # If the stream looks compatible, and won't default to a - # misconfigured ascii encoding, return it as-is. - if _is_compatible_text_stream(text_stream, encoding, errors) and not ( - encoding is None and _stream_is_misconfigured(text_stream) - ): - return text_stream - - # Otherwise, get the underlying binary reader. - possible_binary_reader = find_binary(text_stream) - - # If that's not possible, silently use the original reader - # and get mojibake instead of exceptions. - if possible_binary_reader is None: - return text_stream - - binary_reader = possible_binary_reader - - # Default errors to replace instead of strict in order to get - # something that works. - if errors is None: - errors = "replace" - - # Wrap the binary stream in a text stream with the correct - # encoding parameters. - return _make_text_stream( - binary_reader, - encoding, - errors, - force_readable=force_readable, - force_writable=force_writable, - ) - - -def _force_correct_text_reader( - text_reader: t.IO[t.Any], - encoding: str | None, - errors: str | None, - force_readable: bool = False, -) -> t.TextIO: - return _force_correct_text_stream( - text_reader, - encoding, - errors, - _is_binary_reader, - _find_binary_reader, - force_readable=force_readable, - ) - - -def _force_correct_text_writer( - text_writer: t.IO[t.Any], - encoding: str | None, - errors: str | None, - force_writable: bool = False, -) -> t.TextIO: - return _force_correct_text_stream( - text_writer, - encoding, - errors, - _is_binary_writer, - _find_binary_writer, - force_writable=force_writable, - ) - - -def get_binary_stdin() -> t.BinaryIO: - reader = _find_binary_reader(sys.stdin) - if reader is None: - raise RuntimeError("Was not able to determine binary stream for sys.stdin.") - return reader - - -def get_binary_stdout() -> t.BinaryIO: - writer = _find_binary_writer(sys.stdout) - if writer is None: - raise RuntimeError("Was not able to determine binary stream for sys.stdout.") - return writer - - -def get_binary_stderr() -> t.BinaryIO: - writer = _find_binary_writer(sys.stderr) - if writer is None: - raise RuntimeError("Was not able to determine binary stream for sys.stderr.") - return writer - - -def get_text_stdin(encoding: str | None = None, errors: str | None = None) -> t.TextIO: - rv = _get_windows_console_stream(sys.stdin, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_reader(sys.stdin, encoding, errors, force_readable=True) - - -def get_text_stdout(encoding: str | None = None, errors: str | None = None) -> t.TextIO: - rv = _get_windows_console_stream(sys.stdout, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_writer(sys.stdout, encoding, errors, force_writable=True) - - -def get_text_stderr(encoding: str | None = None, errors: str | None = None) -> t.TextIO: - rv = _get_windows_console_stream(sys.stderr, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_writer(sys.stderr, encoding, errors, force_writable=True) - - -def _wrap_io_open( - file: str | os.PathLike[str] | int, - mode: str, - encoding: str | None, - errors: str | None, -) -> t.IO[t.Any]: - """Handles not passing ``encoding`` and ``errors`` in binary mode.""" - if "b" in mode: - return open(file, mode) - - return open(file, mode, encoding=encoding, errors=errors) - - -def open_stream( - filename: str | os.PathLike[str], - mode: str = "r", - encoding: str | None = None, - errors: str | None = "strict", - atomic: bool = False, -) -> tuple[t.IO[t.Any], bool]: - binary = "b" in mode - filename = os.fspath(filename) - - # Standard streams first. These are simple because they ignore the - # atomic flag. Use fsdecode to handle Path("-"). - if os.fsdecode(filename) == "-": - if any(m in mode for m in ["w", "a", "x"]): - if binary: - return get_binary_stdout(), False - return get_text_stdout(encoding=encoding, errors=errors), False - if binary: - return get_binary_stdin(), False - return get_text_stdin(encoding=encoding, errors=errors), False - - # Non-atomic writes directly go out through the regular open functions. - if not atomic: - return _wrap_io_open(filename, mode, encoding, errors), True - - # Some usability stuff for atomic writes - if "a" in mode: - raise ValueError( - "Appending to an existing file is not supported, because that" - " would involve an expensive `copy`-operation to a temporary" - " file. Open the file in normal `w`-mode and copy explicitly" - " if that's what you're after." - ) - if "x" in mode: - raise ValueError("Use the `overwrite`-parameter instead.") - if "w" not in mode: - raise ValueError("Atomic writes only make sense with `w`-mode.") - - # Atomic writes are more complicated. They work by opening a file - # as a proxy in the same folder and then using the fdopen - # functionality to wrap it in a Python file. Then we wrap it in an - # atomic file that moves the file over on close. - import errno - import random - - try: - perm: int | None = os.stat(filename).st_mode - except OSError: - perm = None - - flags = os.O_RDWR | os.O_CREAT | os.O_EXCL - - if binary: - flags |= getattr(os, "O_BINARY", 0) - - while True: - tmp_filename = os.path.join( - os.path.dirname(filename), - f".__atomic-write{random.randrange(1 << 32):08x}", - ) - try: - fd = os.open(tmp_filename, flags, 0o666 if perm is None else perm) - break - except OSError as e: - if e.errno == errno.EEXIST or ( - os.name == "nt" - and e.errno == errno.EACCES - and os.path.isdir(e.filename) - and os.access(e.filename, os.W_OK) - ): - continue - raise - - if perm is not None: - os.chmod(tmp_filename, perm) # in case perm includes bits in umask - - f = _wrap_io_open(fd, mode, encoding, errors) - af = _AtomicFile(f, tmp_filename, os.path.realpath(filename)) - return t.cast(t.IO[t.Any], af), True - - -class _AtomicFile: - def __init__(self, f: t.IO[t.Any], tmp_filename: str, real_filename: str) -> None: - self._f = f - self._tmp_filename = tmp_filename - self._real_filename = real_filename - self.closed = False - - @property - def name(self) -> str: - return self._real_filename - - def close(self, delete: bool = False) -> None: - if self.closed: - return - self._f.close() - os.replace(self._tmp_filename, self._real_filename) - self.closed = True - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._f, name) - - def __enter__(self) -> _AtomicFile: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.close(delete=exc_type is not None) - - def __repr__(self) -> str: - return repr(self._f) - - -def strip_ansi(value: str) -> str: - return _ansi_re.sub("", value) - - -def _is_jupyter_kernel_output(stream: t.IO[t.Any]) -> bool: - while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): - stream = stream._stream - - return stream.__class__.__module__.startswith("ipykernel.") - - -def should_strip_ansi( - stream: t.IO[t.Any] | None = None, color: bool | None = None -) -> bool: - if color is None: - if stream is None: - stream = sys.stdin - return not isatty(stream) and not _is_jupyter_kernel_output(stream) - return not color - - -# On Windows, wrap the output streams with colorama to support ANSI -# color codes. -# NOTE: double check is needed so mypy does not analyze this on Linux -if sys.platform.startswith("win") and WIN: - from ._winconsole import _get_windows_console_stream - - def _get_argv_encoding() -> str: - import locale - - return locale.getpreferredencoding() - - _ansi_stream_wrappers: cabc.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() - - def auto_wrap_for_ansi(stream: t.TextIO, color: bool | None = None) -> t.TextIO: - """Support ANSI color and style codes on Windows by wrapping a - stream with colorama. - """ - try: - cached = _ansi_stream_wrappers.get(stream) - except Exception: - cached = None - - if cached is not None: - return cached - - import colorama - - strip = should_strip_ansi(stream, color) - ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) - rv = t.cast(t.TextIO, ansi_wrapper.stream) - _write = rv.write - - def _safe_write(s: str) -> int: - try: - return _write(s) - except BaseException: - ansi_wrapper.reset_all() - raise - - rv.write = _safe_write # type: ignore[method-assign] - - try: - _ansi_stream_wrappers[stream] = rv - except Exception: - pass - - return rv - -else: - - def _get_argv_encoding() -> str: - return getattr(sys.stdin, "encoding", None) or sys.getfilesystemencoding() - - def _get_windows_console_stream( - f: t.TextIO, encoding: str | None, errors: str | None - ) -> t.TextIO | None: - return None - - -def term_len(x: str) -> int: - return len(strip_ansi(x)) - - -def isatty(stream: t.IO[t.Any]) -> bool: - try: - return stream.isatty() - except Exception: - return False - - -def _make_cached_stream_func( - src_func: t.Callable[[], t.TextIO | None], - wrapper_func: t.Callable[[], t.TextIO], -) -> t.Callable[[], t.TextIO | None]: - cache: cabc.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() - - def func() -> t.TextIO | None: - stream = src_func() - - if stream is None: - return None - - try: - rv = cache.get(stream) - except Exception: - rv = None - if rv is not None: - return rv - rv = wrapper_func() - try: - cache[stream] = rv - except Exception: - pass - return rv - - return func - - -_default_text_stdin = _make_cached_stream_func(lambda: sys.stdin, get_text_stdin) -_default_text_stdout = _make_cached_stream_func(lambda: sys.stdout, get_text_stdout) -_default_text_stderr = _make_cached_stream_func(lambda: sys.stderr, get_text_stderr) - - -binary_streams: cabc.Mapping[str, t.Callable[[], t.BinaryIO]] = { - "stdin": get_binary_stdin, - "stdout": get_binary_stdout, - "stderr": get_binary_stderr, -} - -text_streams: cabc.Mapping[str, t.Callable[[str | None, str | None], t.TextIO]] = { - "stdin": get_text_stdin, - "stdout": get_text_stdout, - "stderr": get_text_stderr, -} diff --git a/venv/lib/python3.12/site-packages/click/_termui_impl.py b/venv/lib/python3.12/site-packages/click/_termui_impl.py deleted file mode 100644 index ee8225c4..00000000 --- a/venv/lib/python3.12/site-packages/click/_termui_impl.py +++ /dev/null @@ -1,852 +0,0 @@ -""" -This module contains implementations for the termui module. To keep the -import time of Click down, some infrequently used functionality is -placed in this module and only imported as needed. -""" - -from __future__ import annotations - -import collections.abc as cabc -import contextlib -import math -import os -import shlex -import sys -import time -import typing as t -from gettext import gettext as _ -from io import StringIO -from pathlib import Path -from types import TracebackType - -from ._compat import _default_text_stdout -from ._compat import CYGWIN -from ._compat import get_best_encoding -from ._compat import isatty -from ._compat import open_stream -from ._compat import strip_ansi -from ._compat import term_len -from ._compat import WIN -from .exceptions import ClickException -from .utils import echo - -V = t.TypeVar("V") - -if os.name == "nt": - BEFORE_BAR = "\r" - AFTER_BAR = "\n" -else: - BEFORE_BAR = "\r\033[?25l" - AFTER_BAR = "\033[?25h\n" - - -class ProgressBar(t.Generic[V]): - def __init__( - self, - iterable: cabc.Iterable[V] | None, - length: int | None = None, - fill_char: str = "#", - empty_char: str = " ", - bar_template: str = "%(bar)s", - info_sep: str = " ", - hidden: bool = False, - show_eta: bool = True, - show_percent: bool | None = None, - show_pos: bool = False, - item_show_func: t.Callable[[V | None], str | None] | None = None, - label: str | None = None, - file: t.TextIO | None = None, - color: bool | None = None, - update_min_steps: int = 1, - width: int = 30, - ) -> None: - self.fill_char = fill_char - self.empty_char = empty_char - self.bar_template = bar_template - self.info_sep = info_sep - self.hidden = hidden - self.show_eta = show_eta - self.show_percent = show_percent - self.show_pos = show_pos - self.item_show_func = item_show_func - self.label: str = label or "" - - if file is None: - file = _default_text_stdout() - - # There are no standard streams attached to write to. For example, - # pythonw on Windows. - if file is None: - file = StringIO() - - self.file = file - self.color = color - self.update_min_steps = update_min_steps - self._completed_intervals = 0 - self.width: int = width - self.autowidth: bool = width == 0 - - if length is None: - from operator import length_hint - - length = length_hint(iterable, -1) - - if length == -1: - length = None - if iterable is None: - if length is None: - raise TypeError("iterable or length is required") - iterable = t.cast("cabc.Iterable[V]", range(length)) - self.iter: cabc.Iterable[V] = iter(iterable) - self.length = length - self.pos: int = 0 - self.avg: list[float] = [] - self.last_eta: float - self.start: float - self.start = self.last_eta = time.time() - self.eta_known: bool = False - self.finished: bool = False - self.max_width: int | None = None - self.entered: bool = False - self.current_item: V | None = None - self._is_atty = isatty(self.file) - self._last_line: str | None = None - - def __enter__(self) -> ProgressBar[V]: - self.entered = True - self.render_progress() - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.render_finish() - - def __iter__(self) -> cabc.Iterator[V]: - if not self.entered: - raise RuntimeError("You need to use progress bars in a with block.") - self.render_progress() - return self.generator() - - def __next__(self) -> V: - # Iteration is defined in terms of a generator function, - # returned by iter(self); use that to define next(). This works - # because `self.iter` is an iterable consumed by that generator, - # so it is re-entry safe. Calling `next(self.generator())` - # twice works and does "what you want". - return next(iter(self)) - - def render_finish(self) -> None: - if self.hidden or not self._is_atty: - return - self.file.write(AFTER_BAR) - self.file.flush() - - @property - def pct(self) -> float: - if self.finished: - return 1.0 - return min(self.pos / (float(self.length or 1) or 1), 1.0) - - @property - def time_per_iteration(self) -> float: - if not self.avg: - return 0.0 - return sum(self.avg) / float(len(self.avg)) - - @property - def eta(self) -> float: - if self.length is not None and not self.finished: - return self.time_per_iteration * (self.length - self.pos) - return 0.0 - - def format_eta(self) -> str: - if self.eta_known: - t = int(self.eta) - seconds = t % 60 - t //= 60 - minutes = t % 60 - t //= 60 - hours = t % 24 - t //= 24 - if t > 0: - return f"{t}d {hours:02}:{minutes:02}:{seconds:02}" - else: - return f"{hours:02}:{minutes:02}:{seconds:02}" - return "" - - def format_pos(self) -> str: - pos = str(self.pos) - if self.length is not None: - pos += f"/{self.length}" - return pos - - def format_pct(self) -> str: - return f"{int(self.pct * 100): 4}%"[1:] - - def format_bar(self) -> str: - if self.length is not None: - bar_length = int(self.pct * self.width) - bar = self.fill_char * bar_length - bar += self.empty_char * (self.width - bar_length) - elif self.finished: - bar = self.fill_char * self.width - else: - chars = list(self.empty_char * (self.width or 1)) - if self.time_per_iteration != 0: - chars[ - int( - (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) - * self.width - ) - ] = self.fill_char - bar = "".join(chars) - return bar - - def format_progress_line(self) -> str: - show_percent = self.show_percent - - info_bits = [] - if self.length is not None and show_percent is None: - show_percent = not self.show_pos - - if self.show_pos: - info_bits.append(self.format_pos()) - if show_percent: - info_bits.append(self.format_pct()) - if self.show_eta and self.eta_known and not self.finished: - info_bits.append(self.format_eta()) - if self.item_show_func is not None: - item_info = self.item_show_func(self.current_item) - if item_info is not None: - info_bits.append(item_info) - - return ( - self.bar_template - % { - "label": self.label, - "bar": self.format_bar(), - "info": self.info_sep.join(info_bits), - } - ).rstrip() - - def render_progress(self) -> None: - if self.hidden: - return - - if not self._is_atty: - # Only output the label once if the output is not a TTY. - if self._last_line != self.label: - self._last_line = self.label - echo(self.label, file=self.file, color=self.color) - return - - buf = [] - # Update width in case the terminal has been resized - if self.autowidth: - import shutil - - old_width = self.width - self.width = 0 - clutter_length = term_len(self.format_progress_line()) - new_width = max(0, shutil.get_terminal_size().columns - clutter_length) - if new_width < old_width and self.max_width is not None: - buf.append(BEFORE_BAR) - buf.append(" " * self.max_width) - self.max_width = new_width - self.width = new_width - - clear_width = self.width - if self.max_width is not None: - clear_width = self.max_width - - buf.append(BEFORE_BAR) - line = self.format_progress_line() - line_len = term_len(line) - if self.max_width is None or self.max_width < line_len: - self.max_width = line_len - - buf.append(line) - buf.append(" " * (clear_width - line_len)) - line = "".join(buf) - # Render the line only if it changed. - - if line != self._last_line: - self._last_line = line - echo(line, file=self.file, color=self.color, nl=False) - self.file.flush() - - def make_step(self, n_steps: int) -> None: - self.pos += n_steps - if self.length is not None and self.pos >= self.length: - self.finished = True - - if (time.time() - self.last_eta) < 1.0: - return - - self.last_eta = time.time() - - # self.avg is a rolling list of length <= 7 of steps where steps are - # defined as time elapsed divided by the total progress through - # self.length. - if self.pos: - step = (time.time() - self.start) / self.pos - else: - step = time.time() - self.start - - self.avg = self.avg[-6:] + [step] - - self.eta_known = self.length is not None - - def update(self, n_steps: int, current_item: V | None = None) -> None: - """Update the progress bar by advancing a specified number of - steps, and optionally set the ``current_item`` for this new - position. - - :param n_steps: Number of steps to advance. - :param current_item: Optional item to set as ``current_item`` - for the updated position. - - .. versionchanged:: 8.0 - Added the ``current_item`` optional parameter. - - .. versionchanged:: 8.0 - Only render when the number of steps meets the - ``update_min_steps`` threshold. - """ - if current_item is not None: - self.current_item = current_item - - self._completed_intervals += n_steps - - if self._completed_intervals >= self.update_min_steps: - self.make_step(self._completed_intervals) - self.render_progress() - self._completed_intervals = 0 - - def finish(self) -> None: - self.eta_known = False - self.current_item = None - self.finished = True - - def generator(self) -> cabc.Iterator[V]: - """Return a generator which yields the items added to the bar - during construction, and updates the progress bar *after* the - yielded block returns. - """ - # WARNING: the iterator interface for `ProgressBar` relies on - # this and only works because this is a simple generator which - # doesn't create or manage additional state. If this function - # changes, the impact should be evaluated both against - # `iter(bar)` and `next(bar)`. `next()` in particular may call - # `self.generator()` repeatedly, and this must remain safe in - # order for that interface to work. - if not self.entered: - raise RuntimeError("You need to use progress bars in a with block.") - - if not self._is_atty: - yield from self.iter - else: - for rv in self.iter: - self.current_item = rv - - # This allows show_item_func to be updated before the - # item is processed. Only trigger at the beginning of - # the update interval. - if self._completed_intervals == 0: - self.render_progress() - - yield rv - self.update(1) - - self.finish() - self.render_progress() - - -def pager(generator: cabc.Iterable[str], color: bool | None = None) -> None: - """Decide what method to use for paging through text.""" - stdout = _default_text_stdout() - - # There are no standard streams attached to write to. For example, - # pythonw on Windows. - if stdout is None: - stdout = StringIO() - - if not isatty(sys.stdin) or not isatty(stdout): - return _nullpager(stdout, generator, color) - - # Split and normalize the pager command into parts. - pager_cmd_parts = shlex.split(os.environ.get("PAGER", ""), posix=False) - if pager_cmd_parts: - if WIN: - if _tempfilepager(generator, pager_cmd_parts, color): - return - elif _pipepager(generator, pager_cmd_parts, color): - return - - if os.environ.get("TERM") in ("dumb", "emacs"): - return _nullpager(stdout, generator, color) - if (WIN or sys.platform.startswith("os2")) and _tempfilepager( - generator, ["more"], color - ): - return - if _pipepager(generator, ["less"], color): - return - - import tempfile - - fd, filename = tempfile.mkstemp() - os.close(fd) - try: - if _pipepager(generator, ["more"], color): - return - return _nullpager(stdout, generator, color) - finally: - os.unlink(filename) - - -def _pipepager( - generator: cabc.Iterable[str], cmd_parts: list[str], color: bool | None -) -> bool: - """Page through text by feeding it to another program. Invoking a - pager through this might support colors. - - Returns `True` if the command was found, `False` otherwise and thus another - pager should be attempted. - """ - # Split the command into the invoked CLI and its parameters. - if not cmd_parts: - return False - - import shutil - - cmd = cmd_parts[0] - cmd_params = cmd_parts[1:] - - cmd_filepath = shutil.which(cmd) - if not cmd_filepath: - return False - - # Produces a normalized absolute path string. - # multi-call binaries such as busybox derive their identity from the symlink - # less -> busybox. resolve() causes them to misbehave. (eg. less becomes busybox) - cmd_path = Path(cmd_filepath).absolute() - cmd_name = cmd_path.name - - import subprocess - - # Make a local copy of the environment to not affect the global one. - env = dict(os.environ) - - # If we're piping to less and the user hasn't decided on colors, we enable - # them by default we find the -R flag in the command line arguments. - if color is None and cmd_name == "less": - less_flags = f"{os.environ.get('LESS', '')}{' '.join(cmd_params)}" - if not less_flags: - env["LESS"] = "-R" - color = True - elif "r" in less_flags or "R" in less_flags: - color = True - - c = subprocess.Popen( - [str(cmd_path)] + cmd_params, - shell=False, - stdin=subprocess.PIPE, - env=env, - errors="replace", - text=True, - ) - assert c.stdin is not None - try: - for text in generator: - if not color: - text = strip_ansi(text) - - c.stdin.write(text) - except BrokenPipeError: - # In case the pager exited unexpectedly, ignore the broken pipe error. - pass - except Exception as e: - # In case there is an exception we want to close the pager immediately - # and let the caller handle it. - # Otherwise the pager will keep running, and the user may not notice - # the error message, or worse yet it may leave the terminal in a broken state. - c.terminate() - raise e - finally: - # We must close stdin and wait for the pager to exit before we continue - try: - c.stdin.close() - # Close implies flush, so it might throw a BrokenPipeError if the pager - # process exited already. - except BrokenPipeError: - pass - - # Less doesn't respect ^C, but catches it for its own UI purposes (aborting - # search or other commands inside less). - # - # That means when the user hits ^C, the parent process (click) terminates, - # but less is still alive, paging the output and messing up the terminal. - # - # If the user wants to make the pager exit on ^C, they should set - # `LESS='-K'`. It's not our decision to make. - while True: - try: - c.wait() - except KeyboardInterrupt: - pass - else: - break - - return True - - -def _tempfilepager( - generator: cabc.Iterable[str], cmd_parts: list[str], color: bool | None -) -> bool: - """Page through text by invoking a program on a temporary file. - - Returns `True` if the command was found, `False` otherwise and thus another - pager should be attempted. - """ - # Split the command into the invoked CLI and its parameters. - if not cmd_parts: - return False - - import shutil - - cmd = cmd_parts[0] - - cmd_filepath = shutil.which(cmd) - if not cmd_filepath: - return False - # Produces a normalized absolute path string. - # multi-call binaries such as busybox derive their identity from the symlink - # less -> busybox. resolve() causes them to misbehave. (eg. less becomes busybox) - cmd_path = Path(cmd_filepath).absolute() - - import subprocess - import tempfile - - fd, filename = tempfile.mkstemp() - # TODO: This never terminates if the passed generator never terminates. - text = "".join(generator) - if not color: - text = strip_ansi(text) - encoding = get_best_encoding(sys.stdout) - with open_stream(filename, "wb")[0] as f: - f.write(text.encode(encoding)) - try: - subprocess.call([str(cmd_path), filename]) - except OSError: - # Command not found - pass - finally: - os.close(fd) - os.unlink(filename) - - return True - - -def _nullpager( - stream: t.TextIO, generator: cabc.Iterable[str], color: bool | None -) -> None: - """Simply print unformatted text. This is the ultimate fallback.""" - for text in generator: - if not color: - text = strip_ansi(text) - stream.write(text) - - -class Editor: - def __init__( - self, - editor: str | None = None, - env: cabc.Mapping[str, str] | None = None, - require_save: bool = True, - extension: str = ".txt", - ) -> None: - self.editor = editor - self.env = env - self.require_save = require_save - self.extension = extension - - def get_editor(self) -> str: - if self.editor is not None: - return self.editor - for key in "VISUAL", "EDITOR": - rv = os.environ.get(key) - if rv: - return rv - if WIN: - return "notepad" - - from shutil import which - - for editor in "sensible-editor", "vim", "nano": - if which(editor) is not None: - return editor - return "vi" - - def edit_files(self, filenames: cabc.Iterable[str]) -> None: - import subprocess - - editor = self.get_editor() - environ: dict[str, str] | None = None - - if self.env: - environ = os.environ.copy() - environ.update(self.env) - - exc_filename = " ".join(f'"{filename}"' for filename in filenames) - - try: - c = subprocess.Popen( - args=f"{editor} {exc_filename}", env=environ, shell=True - ) - exit_code = c.wait() - if exit_code != 0: - raise ClickException( - _("{editor}: Editing failed").format(editor=editor) - ) - except OSError as e: - raise ClickException( - _("{editor}: Editing failed: {e}").format(editor=editor, e=e) - ) from e - - @t.overload - def edit(self, text: bytes | bytearray) -> bytes | None: ... - - # We cannot know whether or not the type expected is str or bytes when None - # is passed, so str is returned as that was what was done before. - @t.overload - def edit(self, text: str | None) -> str | None: ... - - def edit(self, text: str | bytes | bytearray | None) -> str | bytes | None: - import tempfile - - if text is None: - data: bytes | bytearray = b"" - elif isinstance(text, (bytes, bytearray)): - data = text - else: - if text and not text.endswith("\n"): - text += "\n" - - if WIN: - data = text.replace("\n", "\r\n").encode("utf-8-sig") - else: - data = text.encode("utf-8") - - fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) - f: t.BinaryIO - - try: - with os.fdopen(fd, "wb") as f: - f.write(data) - - # If the filesystem resolution is 1 second, like Mac OS - # 10.12 Extended, or 2 seconds, like FAT32, and the editor - # closes very fast, require_save can fail. Set the modified - # time to be 2 seconds in the past to work around this. - os.utime(name, (os.path.getatime(name), os.path.getmtime(name) - 2)) - # Depending on the resolution, the exact value might not be - # recorded, so get the new recorded value. - timestamp = os.path.getmtime(name) - - self.edit_files((name,)) - - if self.require_save and os.path.getmtime(name) == timestamp: - return None - - with open(name, "rb") as f: - rv = f.read() - - if isinstance(text, (bytes, bytearray)): - return rv - - return rv.decode("utf-8-sig").replace("\r\n", "\n") - finally: - os.unlink(name) - - -def open_url(url: str, wait: bool = False, locate: bool = False) -> int: - import subprocess - - def _unquote_file(url: str) -> str: - from urllib.parse import unquote - - if url.startswith("file://"): - url = unquote(url[7:]) - - return url - - if sys.platform == "darwin": - args = ["open"] - if wait: - args.append("-W") - if locate: - args.append("-R") - args.append(_unquote_file(url)) - null = open("/dev/null", "w") - try: - return subprocess.Popen(args, stderr=null).wait() - finally: - null.close() - elif WIN: - if locate: - url = _unquote_file(url) - args = ["explorer", f"/select,{url}"] - else: - args = ["start"] - if wait: - args.append("/WAIT") - args.append("") - args.append(url) - try: - return subprocess.call(args) - except OSError: - # Command not found - return 127 - elif CYGWIN: - if locate: - url = _unquote_file(url) - args = ["cygstart", os.path.dirname(url)] - else: - args = ["cygstart"] - if wait: - args.append("-w") - args.append(url) - try: - return subprocess.call(args) - except OSError: - # Command not found - return 127 - - try: - if locate: - url = os.path.dirname(_unquote_file(url)) or "." - else: - url = _unquote_file(url) - c = subprocess.Popen(["xdg-open", url]) - if wait: - return c.wait() - return 0 - except OSError: - if url.startswith(("http://", "https://")) and not locate and not wait: - import webbrowser - - webbrowser.open(url) - return 0 - return 1 - - -def _translate_ch_to_exc(ch: str) -> None: - if ch == "\x03": - raise KeyboardInterrupt() - - if ch == "\x04" and not WIN: # Unix-like, Ctrl+D - raise EOFError() - - if ch == "\x1a" and WIN: # Windows, Ctrl+Z - raise EOFError() - - return None - - -if sys.platform == "win32": - import msvcrt - - @contextlib.contextmanager - def raw_terminal() -> cabc.Iterator[int]: - yield -1 - - def getchar(echo: bool) -> str: - # The function `getch` will return a bytes object corresponding to - # the pressed character. Since Windows 10 build 1803, it will also - # return \x00 when called a second time after pressing a regular key. - # - # `getwch` does not share this probably-bugged behavior. Moreover, it - # returns a Unicode object by default, which is what we want. - # - # Either of these functions will return \x00 or \xe0 to indicate - # a special key, and you need to call the same function again to get - # the "rest" of the code. The fun part is that \u00e0 is - # "latin small letter a with grave", so if you type that on a French - # keyboard, you _also_ get a \xe0. - # E.g., consider the Up arrow. This returns \xe0 and then \x48. The - # resulting Unicode string reads as "a with grave" + "capital H". - # This is indistinguishable from when the user actually types - # "a with grave" and then "capital H". - # - # When \xe0 is returned, we assume it's part of a special-key sequence - # and call `getwch` again, but that means that when the user types - # the \u00e0 character, `getchar` doesn't return until a second - # character is typed. - # The alternative is returning immediately, but that would mess up - # cross-platform handling of arrow keys and others that start with - # \xe0. Another option is using `getch`, but then we can't reliably - # read non-ASCII characters, because return values of `getch` are - # limited to the current 8-bit codepage. - # - # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` - # is doing the right thing in more situations than with `getch`. - - if echo: - func = t.cast(t.Callable[[], str], msvcrt.getwche) - else: - func = t.cast(t.Callable[[], str], msvcrt.getwch) - - rv = func() - - if rv in ("\x00", "\xe0"): - # \x00 and \xe0 are control characters that indicate special key, - # see above. - rv += func() - - _translate_ch_to_exc(rv) - return rv - -else: - import termios - import tty - - @contextlib.contextmanager - def raw_terminal() -> cabc.Iterator[int]: - f: t.TextIO | None - fd: int - - if not isatty(sys.stdin): - f = open("/dev/tty") - fd = f.fileno() - else: - fd = sys.stdin.fileno() - f = None - - try: - old_settings = termios.tcgetattr(fd) - - try: - tty.setraw(fd) - yield fd - finally: - termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) - sys.stdout.flush() - - if f is not None: - f.close() - except termios.error: - pass - - def getchar(echo: bool) -> str: - with raw_terminal() as fd: - ch = os.read(fd, 32).decode(get_best_encoding(sys.stdin), "replace") - - if echo and isatty(sys.stdout): - sys.stdout.write(ch) - - _translate_ch_to_exc(ch) - return ch diff --git a/venv/lib/python3.12/site-packages/click/_textwrap.py b/venv/lib/python3.12/site-packages/click/_textwrap.py deleted file mode 100644 index 97fbee3d..00000000 --- a/venv/lib/python3.12/site-packages/click/_textwrap.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import textwrap -from contextlib import contextmanager - - -class TextWrapper(textwrap.TextWrapper): - def _handle_long_word( - self, - reversed_chunks: list[str], - cur_line: list[str], - cur_len: int, - width: int, - ) -> None: - space_left = max(width - cur_len, 1) - - if self.break_long_words: - last = reversed_chunks[-1] - cut = last[:space_left] - res = last[space_left:] - cur_line.append(cut) - reversed_chunks[-1] = res - elif not cur_line: - cur_line.append(reversed_chunks.pop()) - - @contextmanager - def extra_indent(self, indent: str) -> cabc.Iterator[None]: - old_initial_indent = self.initial_indent - old_subsequent_indent = self.subsequent_indent - self.initial_indent += indent - self.subsequent_indent += indent - - try: - yield - finally: - self.initial_indent = old_initial_indent - self.subsequent_indent = old_subsequent_indent - - def indent_only(self, text: str) -> str: - rv = [] - - for idx, line in enumerate(text.splitlines()): - indent = self.initial_indent - - if idx > 0: - indent = self.subsequent_indent - - rv.append(f"{indent}{line}") - - return "\n".join(rv) diff --git a/venv/lib/python3.12/site-packages/click/_utils.py b/venv/lib/python3.12/site-packages/click/_utils.py deleted file mode 100644 index 09fb0085..00000000 --- a/venv/lib/python3.12/site-packages/click/_utils.py +++ /dev/null @@ -1,36 +0,0 @@ -from __future__ import annotations - -import enum -import typing as t - - -class Sentinel(enum.Enum): - """Enum used to define sentinel values. - - .. seealso:: - - `PEP 661 - Sentinel Values `_. - """ - - UNSET = object() - FLAG_NEEDS_VALUE = object() - - def __repr__(self) -> str: - return f"{self.__class__.__name__}.{self.name}" - - -UNSET = Sentinel.UNSET -"""Sentinel used to indicate that a value is not set.""" - -FLAG_NEEDS_VALUE = Sentinel.FLAG_NEEDS_VALUE -"""Sentinel used to indicate an option was passed as a flag without a -value but is not a flag option. - -``Option.consume_value`` uses this to prompt or use the ``flag_value``. -""" - -T_UNSET = t.Literal[UNSET] # type: ignore[valid-type] -"""Type hint for the :data:`UNSET` sentinel value.""" - -T_FLAG_NEEDS_VALUE = t.Literal[FLAG_NEEDS_VALUE] # type: ignore[valid-type] -"""Type hint for the :data:`FLAG_NEEDS_VALUE` sentinel value.""" diff --git a/venv/lib/python3.12/site-packages/click/_winconsole.py b/venv/lib/python3.12/site-packages/click/_winconsole.py deleted file mode 100644 index e56c7c6a..00000000 --- a/venv/lib/python3.12/site-packages/click/_winconsole.py +++ /dev/null @@ -1,296 +0,0 @@ -# This module is based on the excellent work by Adam Bartoš who -# provided a lot of what went into the implementation here in -# the discussion to issue1602 in the Python bug tracker. -# -# There are some general differences in regards to how this works -# compared to the original patches as we do not need to patch -# the entire interpreter but just work in our little world of -# echo and prompt. -from __future__ import annotations - -import collections.abc as cabc -import io -import sys -import time -import typing as t -from ctypes import Array -from ctypes import byref -from ctypes import c_char -from ctypes import c_char_p -from ctypes import c_int -from ctypes import c_ssize_t -from ctypes import c_ulong -from ctypes import c_void_p -from ctypes import POINTER -from ctypes import py_object -from ctypes import Structure -from ctypes.wintypes import DWORD -from ctypes.wintypes import HANDLE -from ctypes.wintypes import LPCWSTR -from ctypes.wintypes import LPWSTR - -from ._compat import _NonClosingTextIOWrapper - -assert sys.platform == "win32" -import msvcrt # noqa: E402 -from ctypes import windll # noqa: E402 -from ctypes import WINFUNCTYPE # noqa: E402 - -c_ssize_p = POINTER(c_ssize_t) - -kernel32 = windll.kernel32 -GetStdHandle = kernel32.GetStdHandle -ReadConsoleW = kernel32.ReadConsoleW -WriteConsoleW = kernel32.WriteConsoleW -GetConsoleMode = kernel32.GetConsoleMode -GetLastError = kernel32.GetLastError -GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32)) -CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( - ("CommandLineToArgvW", windll.shell32) -) -LocalFree = WINFUNCTYPE(c_void_p, c_void_p)(("LocalFree", windll.kernel32)) - -STDIN_HANDLE = GetStdHandle(-10) -STDOUT_HANDLE = GetStdHandle(-11) -STDERR_HANDLE = GetStdHandle(-12) - -PyBUF_SIMPLE = 0 -PyBUF_WRITABLE = 1 - -ERROR_SUCCESS = 0 -ERROR_NOT_ENOUGH_MEMORY = 8 -ERROR_OPERATION_ABORTED = 995 - -STDIN_FILENO = 0 -STDOUT_FILENO = 1 -STDERR_FILENO = 2 - -EOF = b"\x1a" -MAX_BYTES_WRITTEN = 32767 - -if t.TYPE_CHECKING: - try: - # Using `typing_extensions.Buffer` instead of `collections.abc` - # on Windows for some reason does not have `Sized` implemented. - from collections.abc import Buffer # type: ignore - except ImportError: - from typing_extensions import Buffer - -try: - from ctypes import pythonapi -except ImportError: - # On PyPy we cannot get buffers so our ability to operate here is - # severely limited. - get_buffer = None -else: - - class Py_buffer(Structure): - _fields_ = [ # noqa: RUF012 - ("buf", c_void_p), - ("obj", py_object), - ("len", c_ssize_t), - ("itemsize", c_ssize_t), - ("readonly", c_int), - ("ndim", c_int), - ("format", c_char_p), - ("shape", c_ssize_p), - ("strides", c_ssize_p), - ("suboffsets", c_ssize_p), - ("internal", c_void_p), - ] - - PyObject_GetBuffer = pythonapi.PyObject_GetBuffer - PyBuffer_Release = pythonapi.PyBuffer_Release - - def get_buffer(obj: Buffer, writable: bool = False) -> Array[c_char]: - buf = Py_buffer() - flags: int = PyBUF_WRITABLE if writable else PyBUF_SIMPLE - PyObject_GetBuffer(py_object(obj), byref(buf), flags) - - try: - buffer_type = c_char * buf.len - out: Array[c_char] = buffer_type.from_address(buf.buf) - return out - finally: - PyBuffer_Release(byref(buf)) - - -class _WindowsConsoleRawIOBase(io.RawIOBase): - def __init__(self, handle: int | None) -> None: - self.handle = handle - - def isatty(self) -> t.Literal[True]: - super().isatty() - return True - - -class _WindowsConsoleReader(_WindowsConsoleRawIOBase): - def readable(self) -> t.Literal[True]: - return True - - def readinto(self, b: Buffer) -> int: - bytes_to_be_read = len(b) - if not bytes_to_be_read: - return 0 - elif bytes_to_be_read % 2: - raise ValueError( - "cannot read odd number of bytes from UTF-16-LE encoded console" - ) - - buffer = get_buffer(b, writable=True) - code_units_to_be_read = bytes_to_be_read // 2 - code_units_read = c_ulong() - - rv = ReadConsoleW( - HANDLE(self.handle), - buffer, - code_units_to_be_read, - byref(code_units_read), - None, - ) - if GetLastError() == ERROR_OPERATION_ABORTED: - # wait for KeyboardInterrupt - time.sleep(0.1) - if not rv: - raise OSError(f"Windows error: {GetLastError()}") - - if buffer[0] == EOF: - return 0 - return 2 * code_units_read.value - - -class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): - def writable(self) -> t.Literal[True]: - return True - - @staticmethod - def _get_error_message(errno: int) -> str: - if errno == ERROR_SUCCESS: - return "ERROR_SUCCESS" - elif errno == ERROR_NOT_ENOUGH_MEMORY: - return "ERROR_NOT_ENOUGH_MEMORY" - return f"Windows error {errno}" - - def write(self, b: Buffer) -> int: - bytes_to_be_written = len(b) - buf = get_buffer(b) - code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2 - code_units_written = c_ulong() - - WriteConsoleW( - HANDLE(self.handle), - buf, - code_units_to_be_written, - byref(code_units_written), - None, - ) - bytes_written = 2 * code_units_written.value - - if bytes_written == 0 and bytes_to_be_written > 0: - raise OSError(self._get_error_message(GetLastError())) - return bytes_written - - -class ConsoleStream: - def __init__(self, text_stream: t.TextIO, byte_stream: t.BinaryIO) -> None: - self._text_stream = text_stream - self.buffer = byte_stream - - @property - def name(self) -> str: - return self.buffer.name - - def write(self, x: t.AnyStr) -> int: - if isinstance(x, str): - return self._text_stream.write(x) - try: - self.flush() - except Exception: - pass - return self.buffer.write(x) - - def writelines(self, lines: cabc.Iterable[t.AnyStr]) -> None: - for line in lines: - self.write(line) - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._text_stream, name) - - def isatty(self) -> bool: - return self.buffer.isatty() - - def __repr__(self) -> str: - return f"" - - -def _get_text_stdin(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -def _get_text_stdout(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -def _get_text_stderr(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -_stream_factories: cabc.Mapping[int, t.Callable[[t.BinaryIO], t.TextIO]] = { - 0: _get_text_stdin, - 1: _get_text_stdout, - 2: _get_text_stderr, -} - - -def _is_console(f: t.TextIO) -> bool: - if not hasattr(f, "fileno"): - return False - - try: - fileno = f.fileno() - except (OSError, io.UnsupportedOperation): - return False - - handle = msvcrt.get_osfhandle(fileno) - return bool(GetConsoleMode(handle, byref(DWORD()))) - - -def _get_windows_console_stream( - f: t.TextIO, encoding: str | None, errors: str | None -) -> t.TextIO | None: - if ( - get_buffer is None - or encoding not in {"utf-16-le", None} - or errors not in {"strict", None} - or not _is_console(f) - ): - return None - - func = _stream_factories.get(f.fileno()) - if func is None: - return None - - b = getattr(f, "buffer", None) - - if b is None: - return None - - return func(b) diff --git a/venv/lib/python3.12/site-packages/click/core.py b/venv/lib/python3.12/site-packages/click/core.py deleted file mode 100644 index 57f549c7..00000000 --- a/venv/lib/python3.12/site-packages/click/core.py +++ /dev/null @@ -1,3415 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import enum -import errno -import inspect -import os -import sys -import typing as t -from collections import abc -from collections import Counter -from contextlib import AbstractContextManager -from contextlib import contextmanager -from contextlib import ExitStack -from functools import update_wrapper -from gettext import gettext as _ -from gettext import ngettext -from itertools import repeat -from types import TracebackType - -from . import types -from ._utils import FLAG_NEEDS_VALUE -from ._utils import UNSET -from .exceptions import Abort -from .exceptions import BadParameter -from .exceptions import ClickException -from .exceptions import Exit -from .exceptions import MissingParameter -from .exceptions import NoArgsIsHelpError -from .exceptions import UsageError -from .formatting import HelpFormatter -from .formatting import join_options -from .globals import pop_context -from .globals import push_context -from .parser import _OptionParser -from .parser import _split_opt -from .termui import confirm -from .termui import prompt -from .termui import style -from .utils import _detect_program_name -from .utils import _expand_args -from .utils import echo -from .utils import make_default_short_help -from .utils import make_str -from .utils import PacifyFlushWrapper - -if t.TYPE_CHECKING: - from .shell_completion import CompletionItem - -F = t.TypeVar("F", bound="t.Callable[..., t.Any]") -V = t.TypeVar("V") - - -def _complete_visible_commands( - ctx: Context, incomplete: str -) -> cabc.Iterator[tuple[str, Command]]: - """List all the subcommands of a group that start with the - incomplete value and aren't hidden. - - :param ctx: Invocation context for the group. - :param incomplete: Value being completed. May be empty. - """ - multi = t.cast(Group, ctx.command) - - for name in multi.list_commands(ctx): - if name.startswith(incomplete): - command = multi.get_command(ctx, name) - - if command is not None and not command.hidden: - yield name, command - - -def _check_nested_chain( - base_command: Group, cmd_name: str, cmd: Command, register: bool = False -) -> None: - if not base_command.chain or not isinstance(cmd, Group): - return - - if register: - message = ( - f"It is not possible to add the group {cmd_name!r} to another" - f" group {base_command.name!r} that is in chain mode." - ) - else: - message = ( - f"Found the group {cmd_name!r} as subcommand to another group " - f" {base_command.name!r} that is in chain mode. This is not supported." - ) - - raise RuntimeError(message) - - -def batch(iterable: cabc.Iterable[V], batch_size: int) -> list[tuple[V, ...]]: - return list(zip(*repeat(iter(iterable), batch_size), strict=False)) - - -@contextmanager -def augment_usage_errors( - ctx: Context, param: Parameter | None = None -) -> cabc.Iterator[None]: - """Context manager that attaches extra information to exceptions.""" - try: - yield - except BadParameter as e: - if e.ctx is None: - e.ctx = ctx - if param is not None and e.param is None: - e.param = param - raise - except UsageError as e: - if e.ctx is None: - e.ctx = ctx - raise - - -def iter_params_for_processing( - invocation_order: cabc.Sequence[Parameter], - declaration_order: cabc.Sequence[Parameter], -) -> list[Parameter]: - """Returns all declared parameters in the order they should be processed. - - The declared parameters are re-shuffled depending on the order in which - they were invoked, as well as the eagerness of each parameters. - - The invocation order takes precedence over the declaration order. I.e. the - order in which the user provided them to the CLI is respected. - - This behavior and its effect on callback evaluation is detailed at: - https://click.palletsprojects.com/en/stable/advanced/#callback-evaluation-order - """ - - def sort_key(item: Parameter) -> tuple[bool, float]: - try: - idx: float = invocation_order.index(item) - except ValueError: - idx = float("inf") - - return not item.is_eager, idx - - return sorted(declaration_order, key=sort_key) - - -class ParameterSource(enum.Enum): - """This is an :class:`~enum.Enum` that indicates the source of a - parameter's value. - - Use :meth:`click.Context.get_parameter_source` to get the - source for a parameter by name. - - .. versionchanged:: 8.0 - Use :class:`~enum.Enum` and drop the ``validate`` method. - - .. versionchanged:: 8.0 - Added the ``PROMPT`` value. - """ - - COMMANDLINE = enum.auto() - """The value was provided by the command line args.""" - ENVIRONMENT = enum.auto() - """The value was provided with an environment variable.""" - DEFAULT = enum.auto() - """Used the default specified by the parameter.""" - DEFAULT_MAP = enum.auto() - """Used a default provided by :attr:`Context.default_map`.""" - PROMPT = enum.auto() - """Used a prompt to confirm a default or provide a value.""" - - -class Context: - """The context is a special internal object that holds state relevant - for the script execution at every single level. It's normally invisible - to commands unless they opt-in to getting access to it. - - The context is useful as it can pass internal objects around and can - control special execution features such as reading data from - environment variables. - - A context can be used as context manager in which case it will call - :meth:`close` on teardown. - - :param command: the command class for this context. - :param parent: the parent context. - :param info_name: the info name for this invocation. Generally this - is the most descriptive name for the script or - command. For the toplevel script it is usually - the name of the script, for commands below it it's - the name of the script. - :param obj: an arbitrary object of user data. - :param auto_envvar_prefix: the prefix to use for automatic environment - variables. If this is `None` then reading - from environment variables is disabled. This - does not affect manually set environment - variables which are always read. - :param default_map: a dictionary (like object) with default values - for parameters. - :param terminal_width: the width of the terminal. The default is - inherit from parent context. If no context - defines the terminal width then auto - detection will be applied. - :param max_content_width: the maximum width for content rendered by - Click (this currently only affects help - pages). This defaults to 80 characters if - not overridden. In other words: even if the - terminal is larger than that, Click will not - format things wider than 80 characters by - default. In addition to that, formatters might - add some safety mapping on the right. - :param resilient_parsing: if this flag is enabled then Click will - parse without any interactivity or callback - invocation. Default values will also be - ignored. This is useful for implementing - things such as completion support. - :param allow_extra_args: if this is set to `True` then extra arguments - at the end will not raise an error and will be - kept on the context. The default is to inherit - from the command. - :param allow_interspersed_args: if this is set to `False` then options - and arguments cannot be mixed. The - default is to inherit from the command. - :param ignore_unknown_options: instructs click to ignore options it does - not know and keeps them for later - processing. - :param help_option_names: optionally a list of strings that define how - the default help parameter is named. The - default is ``['--help']``. - :param token_normalize_func: an optional function that is used to - normalize tokens (options, choices, - etc.). This for instance can be used to - implement case insensitive behavior. - :param color: controls if the terminal supports ANSI colors or not. The - default is autodetection. This is only needed if ANSI - codes are used in texts that Click prints which is by - default not the case. This for instance would affect - help output. - :param show_default: Show the default value for commands. If this - value is not set, it defaults to the value from the parent - context. ``Command.show_default`` overrides this default for the - specific command. - - .. versionchanged:: 8.2 - The ``protected_args`` attribute is deprecated and will be removed in - Click 9.0. ``args`` will contain remaining unparsed tokens. - - .. versionchanged:: 8.1 - The ``show_default`` parameter is overridden by - ``Command.show_default``, instead of the other way around. - - .. versionchanged:: 8.0 - The ``show_default`` parameter defaults to the value from the - parent context. - - .. versionchanged:: 7.1 - Added the ``show_default`` parameter. - - .. versionchanged:: 4.0 - Added the ``color``, ``ignore_unknown_options``, and - ``max_content_width`` parameters. - - .. versionchanged:: 3.0 - Added the ``allow_extra_args`` and ``allow_interspersed_args`` - parameters. - - .. versionchanged:: 2.0 - Added the ``resilient_parsing``, ``help_option_names``, and - ``token_normalize_func`` parameters. - """ - - #: The formatter class to create with :meth:`make_formatter`. - #: - #: .. versionadded:: 8.0 - formatter_class: type[HelpFormatter] = HelpFormatter - - def __init__( - self, - command: Command, - parent: Context | None = None, - info_name: str | None = None, - obj: t.Any | None = None, - auto_envvar_prefix: str | None = None, - default_map: cabc.MutableMapping[str, t.Any] | None = None, - terminal_width: int | None = None, - max_content_width: int | None = None, - resilient_parsing: bool = False, - allow_extra_args: bool | None = None, - allow_interspersed_args: bool | None = None, - ignore_unknown_options: bool | None = None, - help_option_names: list[str] | None = None, - token_normalize_func: t.Callable[[str], str] | None = None, - color: bool | None = None, - show_default: bool | None = None, - ) -> None: - #: the parent context or `None` if none exists. - self.parent = parent - #: the :class:`Command` for this context. - self.command = command - #: the descriptive information name - self.info_name = info_name - #: Map of parameter names to their parsed values. Parameters - #: with ``expose_value=False`` are not stored. - self.params: dict[str, t.Any] = {} - #: the leftover arguments. - self.args: list[str] = [] - #: protected arguments. These are arguments that are prepended - #: to `args` when certain parsing scenarios are encountered but - #: must be never propagated to another arguments. This is used - #: to implement nested parsing. - self._protected_args: list[str] = [] - #: the collected prefixes of the command's options. - self._opt_prefixes: set[str] = set(parent._opt_prefixes) if parent else set() - - if obj is None and parent is not None: - obj = parent.obj - - #: the user object stored. - self.obj: t.Any = obj - self._meta: dict[str, t.Any] = getattr(parent, "meta", {}) - - #: A dictionary (-like object) with defaults for parameters. - if ( - default_map is None - and info_name is not None - and parent is not None - and parent.default_map is not None - ): - default_map = parent.default_map.get(info_name) - - self.default_map: cabc.MutableMapping[str, t.Any] | None = default_map - - #: This flag indicates if a subcommand is going to be executed. A - #: group callback can use this information to figure out if it's - #: being executed directly or because the execution flow passes - #: onwards to a subcommand. By default it's None, but it can be - #: the name of the subcommand to execute. - #: - #: If chaining is enabled this will be set to ``'*'`` in case - #: any commands are executed. It is however not possible to - #: figure out which ones. If you require this knowledge you - #: should use a :func:`result_callback`. - self.invoked_subcommand: str | None = None - - if terminal_width is None and parent is not None: - terminal_width = parent.terminal_width - - #: The width of the terminal (None is autodetection). - self.terminal_width: int | None = terminal_width - - if max_content_width is None and parent is not None: - max_content_width = parent.max_content_width - - #: The maximum width of formatted content (None implies a sensible - #: default which is 80 for most things). - self.max_content_width: int | None = max_content_width - - if allow_extra_args is None: - allow_extra_args = command.allow_extra_args - - #: Indicates if the context allows extra args or if it should - #: fail on parsing. - #: - #: .. versionadded:: 3.0 - self.allow_extra_args = allow_extra_args - - if allow_interspersed_args is None: - allow_interspersed_args = command.allow_interspersed_args - - #: Indicates if the context allows mixing of arguments and - #: options or not. - #: - #: .. versionadded:: 3.0 - self.allow_interspersed_args: bool = allow_interspersed_args - - if ignore_unknown_options is None: - ignore_unknown_options = command.ignore_unknown_options - - #: Instructs click to ignore options that a command does not - #: understand and will store it on the context for later - #: processing. This is primarily useful for situations where you - #: want to call into external programs. Generally this pattern is - #: strongly discouraged because it's not possibly to losslessly - #: forward all arguments. - #: - #: .. versionadded:: 4.0 - self.ignore_unknown_options: bool = ignore_unknown_options - - if help_option_names is None: - if parent is not None: - help_option_names = parent.help_option_names - else: - help_option_names = ["--help"] - - #: The names for the help options. - self.help_option_names: list[str] = help_option_names - - if token_normalize_func is None and parent is not None: - token_normalize_func = parent.token_normalize_func - - #: An optional normalization function for tokens. This is - #: options, choices, commands etc. - self.token_normalize_func: t.Callable[[str], str] | None = token_normalize_func - - #: Indicates if resilient parsing is enabled. In that case Click - #: will do its best to not cause any failures and default values - #: will be ignored. Useful for completion. - self.resilient_parsing: bool = resilient_parsing - - # If there is no envvar prefix yet, but the parent has one and - # the command on this level has a name, we can expand the envvar - # prefix automatically. - if auto_envvar_prefix is None: - if ( - parent is not None - and parent.auto_envvar_prefix is not None - and self.info_name is not None - ): - auto_envvar_prefix = ( - f"{parent.auto_envvar_prefix}_{self.info_name.upper()}" - ) - else: - auto_envvar_prefix = auto_envvar_prefix.upper() - - if auto_envvar_prefix is not None: - auto_envvar_prefix = auto_envvar_prefix.replace("-", "_") - - self.auto_envvar_prefix: str | None = auto_envvar_prefix - - if color is None and parent is not None: - color = parent.color - - #: Controls if styling output is wanted or not. - self.color: bool | None = color - - if show_default is None and parent is not None: - show_default = parent.show_default - - #: Show option default values when formatting help text. - self.show_default: bool | None = show_default - - self._close_callbacks: list[t.Callable[[], t.Any]] = [] - self._depth = 0 - self._parameter_source: dict[str, ParameterSource] = {} - self._exit_stack = ExitStack() - - @property - def protected_args(self) -> list[str]: - import warnings - - warnings.warn( - "'protected_args' is deprecated and will be removed in Click 9.0." - " 'args' will contain remaining unparsed tokens.", - DeprecationWarning, - stacklevel=2, - ) - return self._protected_args - - def to_info_dict(self) -> dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. This traverses the entire CLI - structure. - - .. code-block:: python - - with Context(cli) as ctx: - info = ctx.to_info_dict() - - .. versionadded:: 8.0 - """ - return { - "command": self.command.to_info_dict(self), - "info_name": self.info_name, - "allow_extra_args": self.allow_extra_args, - "allow_interspersed_args": self.allow_interspersed_args, - "ignore_unknown_options": self.ignore_unknown_options, - "auto_envvar_prefix": self.auto_envvar_prefix, - } - - def __enter__(self) -> Context: - self._depth += 1 - push_context(self) - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> bool | None: - self._depth -= 1 - exit_result: bool | None = None - if self._depth == 0: - exit_result = self._close_with_exception_info(exc_type, exc_value, tb) - pop_context() - - return exit_result - - @contextmanager - def scope(self, cleanup: bool = True) -> cabc.Iterator[Context]: - """This helper method can be used with the context object to promote - it to the current thread local (see :func:`get_current_context`). - The default behavior of this is to invoke the cleanup functions which - can be disabled by setting `cleanup` to `False`. The cleanup - functions are typically used for things such as closing file handles. - - If the cleanup is intended the context object can also be directly - used as a context manager. - - Example usage:: - - with ctx.scope(): - assert get_current_context() is ctx - - This is equivalent:: - - with ctx: - assert get_current_context() is ctx - - .. versionadded:: 5.0 - - :param cleanup: controls if the cleanup functions should be run or - not. The default is to run these functions. In - some situations the context only wants to be - temporarily pushed in which case this can be disabled. - Nested pushes automatically defer the cleanup. - """ - if not cleanup: - self._depth += 1 - try: - with self as rv: - yield rv - finally: - if not cleanup: - self._depth -= 1 - - @property - def meta(self) -> dict[str, t.Any]: - """This is a dictionary which is shared with all the contexts - that are nested. It exists so that click utilities can store some - state here if they need to. It is however the responsibility of - that code to manage this dictionary well. - - The keys are supposed to be unique dotted strings. For instance - module paths are a good choice for it. What is stored in there is - irrelevant for the operation of click. However what is important is - that code that places data here adheres to the general semantics of - the system. - - Example usage:: - - LANG_KEY = f'{__name__}.lang' - - def set_language(value): - ctx = get_current_context() - ctx.meta[LANG_KEY] = value - - def get_language(): - return get_current_context().meta.get(LANG_KEY, 'en_US') - - .. versionadded:: 5.0 - """ - return self._meta - - def make_formatter(self) -> HelpFormatter: - """Creates the :class:`~click.HelpFormatter` for the help and - usage output. - - To quickly customize the formatter class used without overriding - this method, set the :attr:`formatter_class` attribute. - - .. versionchanged:: 8.0 - Added the :attr:`formatter_class` attribute. - """ - return self.formatter_class( - width=self.terminal_width, max_width=self.max_content_width - ) - - def with_resource(self, context_manager: AbstractContextManager[V]) -> V: - """Register a resource as if it were used in a ``with`` - statement. The resource will be cleaned up when the context is - popped. - - Uses :meth:`contextlib.ExitStack.enter_context`. It calls the - resource's ``__enter__()`` method and returns the result. When - the context is popped, it closes the stack, which calls the - resource's ``__exit__()`` method. - - To register a cleanup function for something that isn't a - context manager, use :meth:`call_on_close`. Or use something - from :mod:`contextlib` to turn it into a context manager first. - - .. code-block:: python - - @click.group() - @click.option("--name") - @click.pass_context - def cli(ctx): - ctx.obj = ctx.with_resource(connect_db(name)) - - :param context_manager: The context manager to enter. - :return: Whatever ``context_manager.__enter__()`` returns. - - .. versionadded:: 8.0 - """ - return self._exit_stack.enter_context(context_manager) - - def call_on_close(self, f: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: - """Register a function to be called when the context tears down. - - This can be used to close resources opened during the script - execution. Resources that support Python's context manager - protocol which would be used in a ``with`` statement should be - registered with :meth:`with_resource` instead. - - :param f: The function to execute on teardown. - """ - return self._exit_stack.callback(f) - - def close(self) -> None: - """Invoke all close callbacks registered with - :meth:`call_on_close`, and exit all context managers entered - with :meth:`with_resource`. - """ - self._close_with_exception_info(None, None, None) - - def _close_with_exception_info( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> bool | None: - """Unwind the exit stack by calling its :meth:`__exit__` providing the exception - information to allow for exception handling by the various resources registered - using :meth;`with_resource` - - :return: Whatever ``exit_stack.__exit__()`` returns. - """ - exit_result = self._exit_stack.__exit__(exc_type, exc_value, tb) - # In case the context is reused, create a new exit stack. - self._exit_stack = ExitStack() - - return exit_result - - @property - def command_path(self) -> str: - """The computed command path. This is used for the ``usage`` - information on the help page. It's automatically created by - combining the info names of the chain of contexts to the root. - """ - rv = "" - if self.info_name is not None: - rv = self.info_name - if self.parent is not None: - parent_command_path = [self.parent.command_path] - - if isinstance(self.parent.command, Command): - for param in self.parent.command.get_params(self): - parent_command_path.extend(param.get_usage_pieces(self)) - - rv = f"{' '.join(parent_command_path)} {rv}" - return rv.lstrip() - - def find_root(self) -> Context: - """Finds the outermost context.""" - node = self - while node.parent is not None: - node = node.parent - return node - - def find_object(self, object_type: type[V]) -> V | None: - """Finds the closest object of a given type.""" - node: Context | None = self - - while node is not None: - if isinstance(node.obj, object_type): - return node.obj - - node = node.parent - - return None - - def ensure_object(self, object_type: type[V]) -> V: - """Like :meth:`find_object` but sets the innermost object to a - new instance of `object_type` if it does not exist. - """ - rv = self.find_object(object_type) - if rv is None: - self.obj = rv = object_type() - return rv - - @t.overload - def lookup_default( - self, name: str, call: t.Literal[True] = True - ) -> t.Any | None: ... - - @t.overload - def lookup_default( - self, name: str, call: t.Literal[False] = ... - ) -> t.Any | t.Callable[[], t.Any] | None: ... - - def lookup_default(self, name: str, call: bool = True) -> t.Any | None: - """Get the default for a parameter from :attr:`default_map`. - - :param name: Name of the parameter. - :param call: If the default is a callable, call it. Disable to - return the callable instead. - - .. versionchanged:: 8.0 - Added the ``call`` parameter. - """ - if self.default_map is not None: - value = self.default_map.get(name, UNSET) - - if call and callable(value): - return value() - - return value - - return UNSET - - def fail(self, message: str) -> t.NoReturn: - """Aborts the execution of the program with a specific error - message. - - :param message: the error message to fail with. - """ - raise UsageError(message, self) - - def abort(self) -> t.NoReturn: - """Aborts the script.""" - raise Abort() - - def exit(self, code: int = 0) -> t.NoReturn: - """Exits the application with a given exit code. - - .. versionchanged:: 8.2 - Callbacks and context managers registered with :meth:`call_on_close` - and :meth:`with_resource` are closed before exiting. - """ - self.close() - raise Exit(code) - - def get_usage(self) -> str: - """Helper method to get formatted usage string for the current - context and command. - """ - return self.command.get_usage(self) - - def get_help(self) -> str: - """Helper method to get formatted help page for the current - context and command. - """ - return self.command.get_help(self) - - def _make_sub_context(self, command: Command) -> Context: - """Create a new context of the same type as this context, but - for a new command. - - :meta private: - """ - return type(self)(command, info_name=command.name, parent=self) - - @t.overload - def invoke( - self, callback: t.Callable[..., V], /, *args: t.Any, **kwargs: t.Any - ) -> V: ... - - @t.overload - def invoke(self, callback: Command, /, *args: t.Any, **kwargs: t.Any) -> t.Any: ... - - def invoke( - self, callback: Command | t.Callable[..., V], /, *args: t.Any, **kwargs: t.Any - ) -> t.Any | V: - """Invokes a command callback in exactly the way it expects. There - are two ways to invoke this method: - - 1. the first argument can be a callback and all other arguments and - keyword arguments are forwarded directly to the function. - 2. the first argument is a click command object. In that case all - arguments are forwarded as well but proper click parameters - (options and click arguments) must be keyword arguments and Click - will fill in defaults. - - .. versionchanged:: 8.0 - All ``kwargs`` are tracked in :attr:`params` so they will be - passed if :meth:`forward` is called at multiple levels. - - .. versionchanged:: 3.2 - A new context is created, and missing arguments use default values. - """ - if isinstance(callback, Command): - other_cmd = callback - - if other_cmd.callback is None: - raise TypeError( - "The given command does not have a callback that can be invoked." - ) - else: - callback = t.cast("t.Callable[..., V]", other_cmd.callback) - - ctx = self._make_sub_context(other_cmd) - - for param in other_cmd.params: - if param.name not in kwargs and param.expose_value: - default_value = param.get_default(ctx) - # We explicitly hide the :attr:`UNSET` value to the user, as we - # choose to make it an implementation detail. And because ``invoke`` - # has been designed as part of Click public API, we return ``None`` - # instead. Refs: - # https://github.com/pallets/click/issues/3066 - # https://github.com/pallets/click/issues/3065 - # https://github.com/pallets/click/pull/3068 - if default_value is UNSET: - default_value = None - kwargs[param.name] = param.type_cast_value( # type: ignore - ctx, default_value - ) - - # Track all kwargs as params, so that forward() will pass - # them on in subsequent calls. - ctx.params.update(kwargs) - else: - ctx = self - - with augment_usage_errors(self): - with ctx: - return callback(*args, **kwargs) - - def forward(self, cmd: Command, /, *args: t.Any, **kwargs: t.Any) -> t.Any: - """Similar to :meth:`invoke` but fills in default keyword - arguments from the current context if the other command expects - it. This cannot invoke callbacks directly, only other commands. - - .. versionchanged:: 8.0 - All ``kwargs`` are tracked in :attr:`params` so they will be - passed if ``forward`` is called at multiple levels. - """ - # Can only forward to other commands, not direct callbacks. - if not isinstance(cmd, Command): - raise TypeError("Callback is not a command.") - - for param in self.params: - if param not in kwargs: - kwargs[param] = self.params[param] - - return self.invoke(cmd, *args, **kwargs) - - def set_parameter_source(self, name: str, source: ParameterSource) -> None: - """Set the source of a parameter. This indicates the location - from which the value of the parameter was obtained. - - :param name: The name of the parameter. - :param source: A member of :class:`~click.core.ParameterSource`. - """ - self._parameter_source[name] = source - - def get_parameter_source(self, name: str) -> ParameterSource | None: - """Get the source of a parameter. This indicates the location - from which the value of the parameter was obtained. - - This can be useful for determining when a user specified a value - on the command line that is the same as the default value. It - will be :attr:`~click.core.ParameterSource.DEFAULT` only if the - value was actually taken from the default. - - :param name: The name of the parameter. - :rtype: ParameterSource - - .. versionchanged:: 8.0 - Returns ``None`` if the parameter was not provided from any - source. - """ - return self._parameter_source.get(name) - - -class Command: - """Commands are the basic building block of command line interfaces in - Click. A basic command handles command line parsing and might dispatch - more parsing to commands nested below it. - - :param name: the name of the command to use unless a group overrides it. - :param context_settings: an optional dictionary with defaults that are - passed to the context object. - :param callback: the callback to invoke. This is optional. - :param params: the parameters to register with this command. This can - be either :class:`Option` or :class:`Argument` objects. - :param help: the help string to use for this command. - :param epilog: like the help string but it's printed at the end of the - help page after everything else. - :param short_help: the short help to use for this command. This is - shown on the command listing of the parent command. - :param add_help_option: by default each command registers a ``--help`` - option. This can be disabled by this parameter. - :param no_args_is_help: this controls what happens if no arguments are - provided. This option is disabled by default. - If enabled this will add ``--help`` as argument - if no arguments are passed - :param hidden: hide this command from help outputs. - :param deprecated: If ``True`` or non-empty string, issues a message - indicating that the command is deprecated and highlights - its deprecation in --help. The message can be customized - by using a string as the value. - - .. versionchanged:: 8.2 - This is the base class for all commands, not ``BaseCommand``. - ``deprecated`` can be set to a string as well to customize the - deprecation message. - - .. versionchanged:: 8.1 - ``help``, ``epilog``, and ``short_help`` are stored unprocessed, - all formatting is done when outputting help text, not at init, - and is done even if not using the ``@command`` decorator. - - .. versionchanged:: 8.0 - Added a ``repr`` showing the command name. - - .. versionchanged:: 7.1 - Added the ``no_args_is_help`` parameter. - - .. versionchanged:: 2.0 - Added the ``context_settings`` parameter. - """ - - #: The context class to create with :meth:`make_context`. - #: - #: .. versionadded:: 8.0 - context_class: type[Context] = Context - - #: the default for the :attr:`Context.allow_extra_args` flag. - allow_extra_args = False - - #: the default for the :attr:`Context.allow_interspersed_args` flag. - allow_interspersed_args = True - - #: the default for the :attr:`Context.ignore_unknown_options` flag. - ignore_unknown_options = False - - def __init__( - self, - name: str | None, - context_settings: cabc.MutableMapping[str, t.Any] | None = None, - callback: t.Callable[..., t.Any] | None = None, - params: list[Parameter] | None = None, - help: str | None = None, - epilog: str | None = None, - short_help: str | None = None, - options_metavar: str | None = "[OPTIONS]", - add_help_option: bool = True, - no_args_is_help: bool = False, - hidden: bool = False, - deprecated: bool | str = False, - ) -> None: - #: the name the command thinks it has. Upon registering a command - #: on a :class:`Group` the group will default the command name - #: with this information. You should instead use the - #: :class:`Context`\'s :attr:`~Context.info_name` attribute. - self.name = name - - if context_settings is None: - context_settings = {} - - #: an optional dictionary with defaults passed to the context. - self.context_settings: cabc.MutableMapping[str, t.Any] = context_settings - - #: the callback to execute when the command fires. This might be - #: `None` in which case nothing happens. - self.callback = callback - #: the list of parameters for this command in the order they - #: should show up in the help page and execute. Eager parameters - #: will automatically be handled before non eager ones. - self.params: list[Parameter] = params or [] - self.help = help - self.epilog = epilog - self.options_metavar = options_metavar - self.short_help = short_help - self.add_help_option = add_help_option - self._help_option = None - self.no_args_is_help = no_args_is_help - self.hidden = hidden - self.deprecated = deprecated - - def to_info_dict(self, ctx: Context) -> dict[str, t.Any]: - return { - "name": self.name, - "params": [param.to_info_dict() for param in self.get_params(ctx)], - "help": self.help, - "epilog": self.epilog, - "short_help": self.short_help, - "hidden": self.hidden, - "deprecated": self.deprecated, - } - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.name}>" - - def get_usage(self, ctx: Context) -> str: - """Formats the usage line into a string and returns it. - - Calls :meth:`format_usage` internally. - """ - formatter = ctx.make_formatter() - self.format_usage(ctx, formatter) - return formatter.getvalue().rstrip("\n") - - def get_params(self, ctx: Context) -> list[Parameter]: - params = self.params - help_option = self.get_help_option(ctx) - - if help_option is not None: - params = [*params, help_option] - - if __debug__: - import warnings - - opts = [opt for param in params for opt in param.opts] - opts_counter = Counter(opts) - duplicate_opts = (opt for opt, count in opts_counter.items() if count > 1) - - for duplicate_opt in duplicate_opts: - warnings.warn( - ( - f"The parameter {duplicate_opt} is used more than once. " - "Remove its duplicate as parameters should be unique." - ), - stacklevel=3, - ) - - return params - - def format_usage(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the usage line into the formatter. - - This is a low-level method called by :meth:`get_usage`. - """ - pieces = self.collect_usage_pieces(ctx) - formatter.write_usage(ctx.command_path, " ".join(pieces)) - - def collect_usage_pieces(self, ctx: Context) -> list[str]: - """Returns all the pieces that go into the usage line and returns - it as a list of strings. - """ - rv = [self.options_metavar] if self.options_metavar else [] - - for param in self.get_params(ctx): - rv.extend(param.get_usage_pieces(ctx)) - - return rv - - def get_help_option_names(self, ctx: Context) -> list[str]: - """Returns the names for the help option.""" - all_names = set(ctx.help_option_names) - for param in self.params: - all_names.difference_update(param.opts) - all_names.difference_update(param.secondary_opts) - return list(all_names) - - def get_help_option(self, ctx: Context) -> Option | None: - """Returns the help option object. - - Skipped if :attr:`add_help_option` is ``False``. - - .. versionchanged:: 8.1.8 - The help option is now cached to avoid creating it multiple times. - """ - help_option_names = self.get_help_option_names(ctx) - - if not help_option_names or not self.add_help_option: - return None - - # Cache the help option object in private _help_option attribute to - # avoid creating it multiple times. Not doing this will break the - # callback odering by iter_params_for_processing(), which relies on - # object comparison. - if self._help_option is None: - # Avoid circular import. - from .decorators import help_option - - # Apply help_option decorator and pop resulting option - help_option(*help_option_names)(self) - self._help_option = self.params.pop() # type: ignore[assignment] - - return self._help_option - - def make_parser(self, ctx: Context) -> _OptionParser: - """Creates the underlying option parser for this command.""" - parser = _OptionParser(ctx) - for param in self.get_params(ctx): - param.add_to_parser(parser, ctx) - return parser - - def get_help(self, ctx: Context) -> str: - """Formats the help into a string and returns it. - - Calls :meth:`format_help` internally. - """ - formatter = ctx.make_formatter() - self.format_help(ctx, formatter) - return formatter.getvalue().rstrip("\n") - - def get_short_help_str(self, limit: int = 45) -> str: - """Gets short help for the command or makes it by shortening the - long help string. - """ - if self.short_help: - text = inspect.cleandoc(self.short_help) - elif self.help: - text = make_default_short_help(self.help, limit) - else: - text = "" - - if self.deprecated: - deprecated_message = ( - f"(DEPRECATED: {self.deprecated})" - if isinstance(self.deprecated, str) - else "(DEPRECATED)" - ) - text = _("{text} {deprecated_message}").format( - text=text, deprecated_message=deprecated_message - ) - - return text.strip() - - def format_help(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the help into the formatter if it exists. - - This is a low-level method called by :meth:`get_help`. - - This calls the following methods: - - - :meth:`format_usage` - - :meth:`format_help_text` - - :meth:`format_options` - - :meth:`format_epilog` - """ - self.format_usage(ctx, formatter) - self.format_help_text(ctx, formatter) - self.format_options(ctx, formatter) - self.format_epilog(ctx, formatter) - - def format_help_text(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the help text to the formatter if it exists.""" - if self.help is not None: - # truncate the help text to the first form feed - text = inspect.cleandoc(self.help).partition("\f")[0] - else: - text = "" - - if self.deprecated: - deprecated_message = ( - f"(DEPRECATED: {self.deprecated})" - if isinstance(self.deprecated, str) - else "(DEPRECATED)" - ) - text = _("{text} {deprecated_message}").format( - text=text, deprecated_message=deprecated_message - ) - - if text: - formatter.write_paragraph() - - with formatter.indentation(): - formatter.write_text(text) - - def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes all the options into the formatter if they exist.""" - opts = [] - for param in self.get_params(ctx): - rv = param.get_help_record(ctx) - if rv is not None: - opts.append(rv) - - if opts: - with formatter.section(_("Options")): - formatter.write_dl(opts) - - def format_epilog(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the epilog into the formatter if it exists.""" - if self.epilog: - epilog = inspect.cleandoc(self.epilog) - formatter.write_paragraph() - - with formatter.indentation(): - formatter.write_text(epilog) - - def make_context( - self, - info_name: str | None, - args: list[str], - parent: Context | None = None, - **extra: t.Any, - ) -> Context: - """This function when given an info name and arguments will kick - off the parsing and create a new :class:`Context`. It does not - invoke the actual command callback though. - - To quickly customize the context class used without overriding - this method, set the :attr:`context_class` attribute. - - :param info_name: the info name for this invocation. Generally this - is the most descriptive name for the script or - command. For the toplevel script it's usually - the name of the script, for commands below it's - the name of the command. - :param args: the arguments to parse as list of strings. - :param parent: the parent context if available. - :param extra: extra keyword arguments forwarded to the context - constructor. - - .. versionchanged:: 8.0 - Added the :attr:`context_class` attribute. - """ - for key, value in self.context_settings.items(): - if key not in extra: - extra[key] = value - - ctx = self.context_class(self, info_name=info_name, parent=parent, **extra) - - with ctx.scope(cleanup=False): - self.parse_args(ctx, args) - return ctx - - def parse_args(self, ctx: Context, args: list[str]) -> list[str]: - if not args and self.no_args_is_help and not ctx.resilient_parsing: - raise NoArgsIsHelpError(ctx) - - parser = self.make_parser(ctx) - opts, args, param_order = parser.parse_args(args=args) - - for param in iter_params_for_processing(param_order, self.get_params(ctx)): - _, args = param.handle_parse_result(ctx, opts, args) - - # We now have all parameters' values into `ctx.params`, but the data may contain - # the `UNSET` sentinel. - # Convert `UNSET` to `None` to ensure that the user doesn't see `UNSET`. - # - # Waiting until after the initial parse to convert allows us to treat `UNSET` - # more like a missing value when multiple params use the same name. - # Refs: - # https://github.com/pallets/click/issues/3071 - # https://github.com/pallets/click/pull/3079 - for name, value in ctx.params.items(): - if value is UNSET: - ctx.params[name] = None - - if args and not ctx.allow_extra_args and not ctx.resilient_parsing: - ctx.fail( - ngettext( - "Got unexpected extra argument ({args})", - "Got unexpected extra arguments ({args})", - len(args), - ).format(args=" ".join(map(str, args))) - ) - - ctx.args = args - ctx._opt_prefixes.update(parser._opt_prefixes) - return args - - def invoke(self, ctx: Context) -> t.Any: - """Given a context, this invokes the attached callback (if it exists) - in the right way. - """ - if self.deprecated: - extra_message = ( - f" {self.deprecated}" if isinstance(self.deprecated, str) else "" - ) - message = _( - "DeprecationWarning: The command {name!r} is deprecated.{extra_message}" - ).format(name=self.name, extra_message=extra_message) - echo(style(message, fg="red"), err=True) - - if self.callback is not None: - return ctx.invoke(self.callback, **ctx.params) - - def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: - """Return a list of completions for the incomplete value. Looks - at the names of options and chained multi-commands. - - Any command could be part of a chained multi-command, so sibling - commands are valid at any point during command completion. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results: list[CompletionItem] = [] - - if incomplete and not incomplete[0].isalnum(): - for param in self.get_params(ctx): - if ( - not isinstance(param, Option) - or param.hidden - or ( - not param.multiple - and ctx.get_parameter_source(param.name) # type: ignore - is ParameterSource.COMMANDLINE - ) - ): - continue - - results.extend( - CompletionItem(name, help=param.help) - for name in [*param.opts, *param.secondary_opts] - if name.startswith(incomplete) - ) - - while ctx.parent is not None: - ctx = ctx.parent - - if isinstance(ctx.command, Group) and ctx.command.chain: - results.extend( - CompletionItem(name, help=command.get_short_help_str()) - for name, command in _complete_visible_commands(ctx, incomplete) - if name not in ctx._protected_args - ) - - return results - - @t.overload - def main( - self, - args: cabc.Sequence[str] | None = None, - prog_name: str | None = None, - complete_var: str | None = None, - standalone_mode: t.Literal[True] = True, - **extra: t.Any, - ) -> t.NoReturn: ... - - @t.overload - def main( - self, - args: cabc.Sequence[str] | None = None, - prog_name: str | None = None, - complete_var: str | None = None, - standalone_mode: bool = ..., - **extra: t.Any, - ) -> t.Any: ... - - def main( - self, - args: cabc.Sequence[str] | None = None, - prog_name: str | None = None, - complete_var: str | None = None, - standalone_mode: bool = True, - windows_expand_args: bool = True, - **extra: t.Any, - ) -> t.Any: - """This is the way to invoke a script with all the bells and - whistles as a command line application. This will always terminate - the application after a call. If this is not wanted, ``SystemExit`` - needs to be caught. - - This method is also available by directly calling the instance of - a :class:`Command`. - - :param args: the arguments that should be used for parsing. If not - provided, ``sys.argv[1:]`` is used. - :param prog_name: the program name that should be used. By default - the program name is constructed by taking the file - name from ``sys.argv[0]``. - :param complete_var: the environment variable that controls the - bash completion support. The default is - ``"__COMPLETE"`` with prog_name in - uppercase. - :param standalone_mode: the default behavior is to invoke the script - in standalone mode. Click will then - handle exceptions and convert them into - error messages and the function will never - return but shut down the interpreter. If - this is set to `False` they will be - propagated to the caller and the return - value of this function is the return value - of :meth:`invoke`. - :param windows_expand_args: Expand glob patterns, user dir, and - env vars in command line args on Windows. - :param extra: extra keyword arguments are forwarded to the context - constructor. See :class:`Context` for more information. - - .. versionchanged:: 8.0.1 - Added the ``windows_expand_args`` parameter to allow - disabling command line arg expansion on Windows. - - .. versionchanged:: 8.0 - When taking arguments from ``sys.argv`` on Windows, glob - patterns, user dir, and env vars are expanded. - - .. versionchanged:: 3.0 - Added the ``standalone_mode`` parameter. - """ - if args is None: - args = sys.argv[1:] - - if os.name == "nt" and windows_expand_args: - args = _expand_args(args) - else: - args = list(args) - - if prog_name is None: - prog_name = _detect_program_name() - - # Process shell completion requests and exit early. - self._main_shell_completion(extra, prog_name, complete_var) - - try: - try: - with self.make_context(prog_name, args, **extra) as ctx: - rv = self.invoke(ctx) - if not standalone_mode: - return rv - # it's not safe to `ctx.exit(rv)` here! - # note that `rv` may actually contain data like "1" which - # has obvious effects - # more subtle case: `rv=[None, None]` can come out of - # chained commands which all returned `None` -- so it's not - # even always obvious that `rv` indicates success/failure - # by its truthiness/falsiness - ctx.exit() - except (EOFError, KeyboardInterrupt) as e: - echo(file=sys.stderr) - raise Abort() from e - except ClickException as e: - if not standalone_mode: - raise - e.show() - sys.exit(e.exit_code) - except OSError as e: - if e.errno == errno.EPIPE: - sys.stdout = t.cast(t.TextIO, PacifyFlushWrapper(sys.stdout)) - sys.stderr = t.cast(t.TextIO, PacifyFlushWrapper(sys.stderr)) - sys.exit(1) - else: - raise - except Exit as e: - if standalone_mode: - sys.exit(e.exit_code) - else: - # in non-standalone mode, return the exit code - # note that this is only reached if `self.invoke` above raises - # an Exit explicitly -- thus bypassing the check there which - # would return its result - # the results of non-standalone execution may therefore be - # somewhat ambiguous: if there are codepaths which lead to - # `ctx.exit(1)` and to `return 1`, the caller won't be able to - # tell the difference between the two - return e.exit_code - except Abort: - if not standalone_mode: - raise - echo(_("Aborted!"), file=sys.stderr) - sys.exit(1) - - def _main_shell_completion( - self, - ctx_args: cabc.MutableMapping[str, t.Any], - prog_name: str, - complete_var: str | None = None, - ) -> None: - """Check if the shell is asking for tab completion, process - that, then exit early. Called from :meth:`main` before the - program is invoked. - - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. Defaults to - ``_{PROG_NAME}_COMPLETE``. - - .. versionchanged:: 8.2.0 - Dots (``.``) in ``prog_name`` are replaced with underscores (``_``). - """ - if complete_var is None: - complete_name = prog_name.replace("-", "_").replace(".", "_") - complete_var = f"_{complete_name}_COMPLETE".upper() - - instruction = os.environ.get(complete_var) - - if not instruction: - return - - from .shell_completion import shell_complete - - rv = shell_complete(self, ctx_args, prog_name, complete_var, instruction) - sys.exit(rv) - - def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Any: - """Alias for :meth:`main`.""" - return self.main(*args, **kwargs) - - -class _FakeSubclassCheck(type): - def __subclasscheck__(cls, subclass: type) -> bool: - return issubclass(subclass, cls.__bases__[0]) - - def __instancecheck__(cls, instance: t.Any) -> bool: - return isinstance(instance, cls.__bases__[0]) - - -class _BaseCommand(Command, metaclass=_FakeSubclassCheck): - """ - .. deprecated:: 8.2 - Will be removed in Click 9.0. Use ``Command`` instead. - """ - - -class Group(Command): - """A group is a command that nests other commands (or more groups). - - :param name: The name of the group command. - :param commands: Map names to :class:`Command` objects. Can be a list, which - will use :attr:`Command.name` as the keys. - :param invoke_without_command: Invoke the group's callback even if a - subcommand is not given. - :param no_args_is_help: If no arguments are given, show the group's help and - exit. Defaults to the opposite of ``invoke_without_command``. - :param subcommand_metavar: How to represent the subcommand argument in help. - The default will represent whether ``chain`` is set or not. - :param chain: Allow passing more than one subcommand argument. After parsing - a command's arguments, if any arguments remain another command will be - matched, and so on. - :param result_callback: A function to call after the group's and - subcommand's callbacks. The value returned by the subcommand is passed. - If ``chain`` is enabled, the value will be a list of values returned by - all the commands. If ``invoke_without_command`` is enabled, the value - will be the value returned by the group's callback, or an empty list if - ``chain`` is enabled. - :param kwargs: Other arguments passed to :class:`Command`. - - .. versionchanged:: 8.0 - The ``commands`` argument can be a list of command objects. - - .. versionchanged:: 8.2 - Merged with and replaces the ``MultiCommand`` base class. - """ - - allow_extra_args = True - allow_interspersed_args = False - - #: If set, this is used by the group's :meth:`command` decorator - #: as the default :class:`Command` class. This is useful to make all - #: subcommands use a custom command class. - #: - #: .. versionadded:: 8.0 - command_class: type[Command] | None = None - - #: If set, this is used by the group's :meth:`group` decorator - #: as the default :class:`Group` class. This is useful to make all - #: subgroups use a custom group class. - #: - #: If set to the special value :class:`type` (literally - #: ``group_class = type``), this group's class will be used as the - #: default class. This makes a custom group class continue to make - #: custom groups. - #: - #: .. versionadded:: 8.0 - group_class: type[Group] | type[type] | None = None - # Literal[type] isn't valid, so use Type[type] - - def __init__( - self, - name: str | None = None, - commands: cabc.MutableMapping[str, Command] - | cabc.Sequence[Command] - | None = None, - invoke_without_command: bool = False, - no_args_is_help: bool | None = None, - subcommand_metavar: str | None = None, - chain: bool = False, - result_callback: t.Callable[..., t.Any] | None = None, - **kwargs: t.Any, - ) -> None: - super().__init__(name, **kwargs) - - if commands is None: - commands = {} - elif isinstance(commands, abc.Sequence): - commands = {c.name: c for c in commands if c.name is not None} - - #: The registered subcommands by their exported names. - self.commands: cabc.MutableMapping[str, Command] = commands - - if no_args_is_help is None: - no_args_is_help = not invoke_without_command - - self.no_args_is_help = no_args_is_help - self.invoke_without_command = invoke_without_command - - if subcommand_metavar is None: - if chain: - subcommand_metavar = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." - else: - subcommand_metavar = "COMMAND [ARGS]..." - - self.subcommand_metavar = subcommand_metavar - self.chain = chain - # The result callback that is stored. This can be set or - # overridden with the :func:`result_callback` decorator. - self._result_callback = result_callback - - if self.chain: - for param in self.params: - if isinstance(param, Argument) and not param.required: - raise RuntimeError( - "A group in chain mode cannot have optional arguments." - ) - - def to_info_dict(self, ctx: Context) -> dict[str, t.Any]: - info_dict = super().to_info_dict(ctx) - commands = {} - - for name in self.list_commands(ctx): - command = self.get_command(ctx, name) - - if command is None: - continue - - sub_ctx = ctx._make_sub_context(command) - - with sub_ctx.scope(cleanup=False): - commands[name] = command.to_info_dict(sub_ctx) - - info_dict.update(commands=commands, chain=self.chain) - return info_dict - - def add_command(self, cmd: Command, name: str | None = None) -> None: - """Registers another :class:`Command` with this group. If the name - is not provided, the name of the command is used. - """ - name = name or cmd.name - if name is None: - raise TypeError("Command has no name.") - _check_nested_chain(self, name, cmd, register=True) - self.commands[name] = cmd - - @t.overload - def command(self, __func: t.Callable[..., t.Any]) -> Command: ... - - @t.overload - def command( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], Command]: ... - - def command( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], Command] | Command: - """A shortcut decorator for declaring and attaching a command to - the group. This takes the same arguments as :func:`command` and - immediately registers the created command with this group by - calling :meth:`add_command`. - - To customize the command class used, set the - :attr:`command_class` attribute. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.0 - Added the :attr:`command_class` attribute. - """ - from .decorators import command - - func: t.Callable[..., t.Any] | None = None - - if args and callable(args[0]): - assert len(args) == 1 and not kwargs, ( - "Use 'command(**kwargs)(callable)' to provide arguments." - ) - (func,) = args - args = () - - if self.command_class and kwargs.get("cls") is None: - kwargs["cls"] = self.command_class - - def decorator(f: t.Callable[..., t.Any]) -> Command: - cmd: Command = command(*args, **kwargs)(f) - self.add_command(cmd) - return cmd - - if func is not None: - return decorator(func) - - return decorator - - @t.overload - def group(self, __func: t.Callable[..., t.Any]) -> Group: ... - - @t.overload - def group( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], Group]: ... - - def group( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], Group] | Group: - """A shortcut decorator for declaring and attaching a group to - the group. This takes the same arguments as :func:`group` and - immediately registers the created group with this group by - calling :meth:`add_command`. - - To customize the group class used, set the :attr:`group_class` - attribute. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.0 - Added the :attr:`group_class` attribute. - """ - from .decorators import group - - func: t.Callable[..., t.Any] | None = None - - if args and callable(args[0]): - assert len(args) == 1 and not kwargs, ( - "Use 'group(**kwargs)(callable)' to provide arguments." - ) - (func,) = args - args = () - - if self.group_class is not None and kwargs.get("cls") is None: - if self.group_class is type: - kwargs["cls"] = type(self) - else: - kwargs["cls"] = self.group_class - - def decorator(f: t.Callable[..., t.Any]) -> Group: - cmd: Group = group(*args, **kwargs)(f) - self.add_command(cmd) - return cmd - - if func is not None: - return decorator(func) - - return decorator - - def result_callback(self, replace: bool = False) -> t.Callable[[F], F]: - """Adds a result callback to the command. By default if a - result callback is already registered this will chain them but - this can be disabled with the `replace` parameter. The result - callback is invoked with the return value of the subcommand - (or the list of return values from all subcommands if chaining - is enabled) as well as the parameters as they would be passed - to the main callback. - - Example:: - - @click.group() - @click.option('-i', '--input', default=23) - def cli(input): - return 42 - - @cli.result_callback() - def process_result(result, input): - return result + input - - :param replace: if set to `True` an already existing result - callback will be removed. - - .. versionchanged:: 8.0 - Renamed from ``resultcallback``. - - .. versionadded:: 3.0 - """ - - def decorator(f: F) -> F: - old_callback = self._result_callback - - if old_callback is None or replace: - self._result_callback = f - return f - - def function(value: t.Any, /, *args: t.Any, **kwargs: t.Any) -> t.Any: - inner = old_callback(value, *args, **kwargs) - return f(inner, *args, **kwargs) - - self._result_callback = rv = update_wrapper(t.cast(F, function), f) - return rv # type: ignore[return-value] - - return decorator - - def get_command(self, ctx: Context, cmd_name: str) -> Command | None: - """Given a context and a command name, this returns a :class:`Command` - object if it exists or returns ``None``. - """ - return self.commands.get(cmd_name) - - def list_commands(self, ctx: Context) -> list[str]: - """Returns a list of subcommand names in the order they should appear.""" - return sorted(self.commands) - - def collect_usage_pieces(self, ctx: Context) -> list[str]: - rv = super().collect_usage_pieces(ctx) - rv.append(self.subcommand_metavar) - return rv - - def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: - super().format_options(ctx, formatter) - self.format_commands(ctx, formatter) - - def format_commands(self, ctx: Context, formatter: HelpFormatter) -> None: - """Extra format methods for multi methods that adds all the commands - after the options. - """ - commands = [] - for subcommand in self.list_commands(ctx): - cmd = self.get_command(ctx, subcommand) - # What is this, the tool lied about a command. Ignore it - if cmd is None: - continue - if cmd.hidden: - continue - - commands.append((subcommand, cmd)) - - # allow for 3 times the default spacing - if len(commands): - limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) - - rows = [] - for subcommand, cmd in commands: - help = cmd.get_short_help_str(limit) - rows.append((subcommand, help)) - - if rows: - with formatter.section(_("Commands")): - formatter.write_dl(rows) - - def parse_args(self, ctx: Context, args: list[str]) -> list[str]: - if not args and self.no_args_is_help and not ctx.resilient_parsing: - raise NoArgsIsHelpError(ctx) - - rest = super().parse_args(ctx, args) - - if self.chain: - ctx._protected_args = rest - ctx.args = [] - elif rest: - ctx._protected_args, ctx.args = rest[:1], rest[1:] - - return ctx.args - - def invoke(self, ctx: Context) -> t.Any: - def _process_result(value: t.Any) -> t.Any: - if self._result_callback is not None: - value = ctx.invoke(self._result_callback, value, **ctx.params) - return value - - if not ctx._protected_args: - if self.invoke_without_command: - # No subcommand was invoked, so the result callback is - # invoked with the group return value for regular - # groups, or an empty list for chained groups. - with ctx: - rv = super().invoke(ctx) - return _process_result([] if self.chain else rv) - ctx.fail(_("Missing command.")) - - # Fetch args back out - args = [*ctx._protected_args, *ctx.args] - ctx.args = [] - ctx._protected_args = [] - - # If we're not in chain mode, we only allow the invocation of a - # single command but we also inform the current context about the - # name of the command to invoke. - if not self.chain: - # Make sure the context is entered so we do not clean up - # resources until the result processor has worked. - with ctx: - cmd_name, cmd, args = self.resolve_command(ctx, args) - assert cmd is not None - ctx.invoked_subcommand = cmd_name - super().invoke(ctx) - sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) - with sub_ctx: - return _process_result(sub_ctx.command.invoke(sub_ctx)) - - # In chain mode we create the contexts step by step, but after the - # base command has been invoked. Because at that point we do not - # know the subcommands yet, the invoked subcommand attribute is - # set to ``*`` to inform the command that subcommands are executed - # but nothing else. - with ctx: - ctx.invoked_subcommand = "*" if args else None - super().invoke(ctx) - - # Otherwise we make every single context and invoke them in a - # chain. In that case the return value to the result processor - # is the list of all invoked subcommand's results. - contexts = [] - while args: - cmd_name, cmd, args = self.resolve_command(ctx, args) - assert cmd is not None - sub_ctx = cmd.make_context( - cmd_name, - args, - parent=ctx, - allow_extra_args=True, - allow_interspersed_args=False, - ) - contexts.append(sub_ctx) - args, sub_ctx.args = sub_ctx.args, [] - - rv = [] - for sub_ctx in contexts: - with sub_ctx: - rv.append(sub_ctx.command.invoke(sub_ctx)) - return _process_result(rv) - - def resolve_command( - self, ctx: Context, args: list[str] - ) -> tuple[str | None, Command | None, list[str]]: - cmd_name = make_str(args[0]) - original_cmd_name = cmd_name - - # Get the command - cmd = self.get_command(ctx, cmd_name) - - # If we can't find the command but there is a normalization - # function available, we try with that one. - if cmd is None and ctx.token_normalize_func is not None: - cmd_name = ctx.token_normalize_func(cmd_name) - cmd = self.get_command(ctx, cmd_name) - - # If we don't find the command we want to show an error message - # to the user that it was not provided. However, there is - # something else we should do: if the first argument looks like - # an option we want to kick off parsing again for arguments to - # resolve things like --help which now should go to the main - # place. - if cmd is None and not ctx.resilient_parsing: - if _split_opt(cmd_name)[0]: - self.parse_args(ctx, args) - ctx.fail(_("No such command {name!r}.").format(name=original_cmd_name)) - return cmd_name if cmd else None, cmd, args[1:] - - def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: - """Return a list of completions for the incomplete value. Looks - at the names of options, subcommands, and chained - multi-commands. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results = [ - CompletionItem(name, help=command.get_short_help_str()) - for name, command in _complete_visible_commands(ctx, incomplete) - ] - results.extend(super().shell_complete(ctx, incomplete)) - return results - - -class _MultiCommand(Group, metaclass=_FakeSubclassCheck): - """ - .. deprecated:: 8.2 - Will be removed in Click 9.0. Use ``Group`` instead. - """ - - -class CommandCollection(Group): - """A :class:`Group` that looks up subcommands on other groups. If a command - is not found on this group, each registered source is checked in order. - Parameters on a source are not added to this group, and a source's callback - is not invoked when invoking its commands. In other words, this "flattens" - commands in many groups into this one group. - - :param name: The name of the group command. - :param sources: A list of :class:`Group` objects to look up commands from. - :param kwargs: Other arguments passed to :class:`Group`. - - .. versionchanged:: 8.2 - This is a subclass of ``Group``. Commands are looked up first on this - group, then each of its sources. - """ - - def __init__( - self, - name: str | None = None, - sources: list[Group] | None = None, - **kwargs: t.Any, - ) -> None: - super().__init__(name, **kwargs) - #: The list of registered groups. - self.sources: list[Group] = sources or [] - - def add_source(self, group: Group) -> None: - """Add a group as a source of commands.""" - self.sources.append(group) - - def get_command(self, ctx: Context, cmd_name: str) -> Command | None: - rv = super().get_command(ctx, cmd_name) - - if rv is not None: - return rv - - for source in self.sources: - rv = source.get_command(ctx, cmd_name) - - if rv is not None: - if self.chain: - _check_nested_chain(self, cmd_name, rv) - - return rv - - return None - - def list_commands(self, ctx: Context) -> list[str]: - rv: set[str] = set(super().list_commands(ctx)) - - for source in self.sources: - rv.update(source.list_commands(ctx)) - - return sorted(rv) - - -def _check_iter(value: t.Any) -> cabc.Iterator[t.Any]: - """Check if the value is iterable but not a string. Raises a type - error, or return an iterator over the value. - """ - if isinstance(value, str): - raise TypeError - - return iter(value) - - -class Parameter: - r"""A parameter to a command comes in two versions: they are either - :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently - not supported by design as some of the internals for parsing are - intentionally not finalized. - - Some settings are supported by both options and arguments. - - :param param_decls: the parameter declarations for this option or - argument. This is a list of flags or argument - names. - :param type: the type that should be used. Either a :class:`ParamType` - or a Python type. The latter is converted into the former - automatically if supported. - :param required: controls if this is optional or not. - :param default: the default value if omitted. This can also be a callable, - in which case it's invoked when the default is needed - without any arguments. - :param callback: A function to further process or validate the value - after type conversion. It is called as ``f(ctx, param, value)`` - and must return the value. It is called for all sources, - including prompts. - :param nargs: the number of arguments to match. If not ``1`` the return - value is a tuple instead of single value. The default for - nargs is ``1`` (except if the type is a tuple, then it's - the arity of the tuple). If ``nargs=-1``, all remaining - parameters are collected. - :param metavar: how the value is represented in the help page. - :param expose_value: if this is `True` then the value is passed onwards - to the command callback and stored on the context, - otherwise it's skipped. - :param is_eager: eager values are processed before non eager ones. This - should not be set for arguments or it will inverse the - order of processing. - :param envvar: environment variable(s) that are used to provide a default value for - this parameter. This can be a string or a sequence of strings. If a sequence is - given, only the first non-empty environment variable is used for the parameter. - :param shell_complete: A function that returns custom shell - completions. Used instead of the param's type completion if - given. Takes ``ctx, param, incomplete`` and must return a list - of :class:`~click.shell_completion.CompletionItem` or a list of - strings. - :param deprecated: If ``True`` or non-empty string, issues a message - indicating that the argument is deprecated and highlights - its deprecation in --help. The message can be customized - by using a string as the value. A deprecated parameter - cannot be required, a ValueError will be raised otherwise. - - .. versionchanged:: 8.2.0 - Introduction of ``deprecated``. - - .. versionchanged:: 8.2 - Adding duplicate parameter names to a :class:`~click.core.Command` will - result in a ``UserWarning`` being shown. - - .. versionchanged:: 8.2 - Adding duplicate parameter names to a :class:`~click.core.Command` will - result in a ``UserWarning`` being shown. - - .. versionchanged:: 8.0 - ``process_value`` validates required parameters and bounded - ``nargs``, and invokes the parameter callback before returning - the value. This allows the callback to validate prompts. - ``full_process_value`` is removed. - - .. versionchanged:: 8.0 - ``autocompletion`` is renamed to ``shell_complete`` and has new - semantics described above. The old name is deprecated and will - be removed in 8.1, until then it will be wrapped to match the - new requirements. - - .. versionchanged:: 8.0 - For ``multiple=True, nargs>1``, the default must be a list of - tuples. - - .. versionchanged:: 8.0 - Setting a default is no longer required for ``nargs>1``, it will - default to ``None``. ``multiple=True`` or ``nargs=-1`` will - default to ``()``. - - .. versionchanged:: 7.1 - Empty environment variables are ignored rather than taking the - empty string value. This makes it possible for scripts to clear - variables if they can't unset them. - - .. versionchanged:: 2.0 - Changed signature for parameter callback to also be passed the - parameter. The old callback format will still work, but it will - raise a warning to give you a chance to migrate the code easier. - """ - - param_type_name = "parameter" - - def __init__( - self, - param_decls: cabc.Sequence[str] | None = None, - type: types.ParamType | t.Any | None = None, - required: bool = False, - # XXX The default historically embed two concepts: - # - the declaration of a Parameter object carrying the default (handy to - # arbitrage the default value of coupled Parameters sharing the same - # self.name, like flag options), - # - and the actual value of the default. - # It is confusing and is the source of many issues discussed in: - # https://github.com/pallets/click/pull/3030 - # In the future, we might think of splitting it in two, not unlike - # Option.is_flag and Option.flag_value: we could have something like - # Parameter.is_default and Parameter.default_value. - default: t.Any | t.Callable[[], t.Any] | None = UNSET, - callback: t.Callable[[Context, Parameter, t.Any], t.Any] | None = None, - nargs: int | None = None, - multiple: bool = False, - metavar: str | None = None, - expose_value: bool = True, - is_eager: bool = False, - envvar: str | cabc.Sequence[str] | None = None, - shell_complete: t.Callable[ - [Context, Parameter, str], list[CompletionItem] | list[str] - ] - | None = None, - deprecated: bool | str = False, - ) -> None: - self.name: str | None - self.opts: list[str] - self.secondary_opts: list[str] - self.name, self.opts, self.secondary_opts = self._parse_decls( - param_decls or (), expose_value - ) - self.type: types.ParamType = types.convert_type(type, default) - - # Default nargs to what the type tells us if we have that - # information available. - if nargs is None: - if self.type.is_composite: - nargs = self.type.arity - else: - nargs = 1 - - self.required = required - self.callback = callback - self.nargs = nargs - self.multiple = multiple - self.expose_value = expose_value - self.default: t.Any | t.Callable[[], t.Any] | None = default - self.is_eager = is_eager - self.metavar = metavar - self.envvar = envvar - self._custom_shell_complete = shell_complete - self.deprecated = deprecated - - if __debug__: - if self.type.is_composite and nargs != self.type.arity: - raise ValueError( - f"'nargs' must be {self.type.arity} (or None) for" - f" type {self.type!r}, but it was {nargs}." - ) - - if required and deprecated: - raise ValueError( - f"The {self.param_type_name} '{self.human_readable_name}' " - "is deprecated and still required. A deprecated " - f"{self.param_type_name} cannot be required." - ) - - def to_info_dict(self) -> dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - .. versionchanged:: 8.3.0 - Returns ``None`` for the :attr:`default` if it was not set. - - .. versionadded:: 8.0 - """ - return { - "name": self.name, - "param_type_name": self.param_type_name, - "opts": self.opts, - "secondary_opts": self.secondary_opts, - "type": self.type.to_info_dict(), - "required": self.required, - "nargs": self.nargs, - "multiple": self.multiple, - # We explicitly hide the :attr:`UNSET` value to the user, as we choose to - # make it an implementation detail. And because ``to_info_dict`` has been - # designed for documentation purposes, we return ``None`` instead. - "default": self.default if self.default is not UNSET else None, - "envvar": self.envvar, - } - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.name}>" - - def _parse_decls( - self, decls: cabc.Sequence[str], expose_value: bool - ) -> tuple[str | None, list[str], list[str]]: - raise NotImplementedError() - - @property - def human_readable_name(self) -> str: - """Returns the human readable name of this parameter. This is the - same as the name for options, but the metavar for arguments. - """ - return self.name # type: ignore - - def make_metavar(self, ctx: Context) -> str: - if self.metavar is not None: - return self.metavar - - metavar = self.type.get_metavar(param=self, ctx=ctx) - - if metavar is None: - metavar = self.type.name.upper() - - if self.nargs != 1: - metavar += "..." - - return metavar - - @t.overload - def get_default( - self, ctx: Context, call: t.Literal[True] = True - ) -> t.Any | None: ... - - @t.overload - def get_default( - self, ctx: Context, call: bool = ... - ) -> t.Any | t.Callable[[], t.Any] | None: ... - - def get_default( - self, ctx: Context, call: bool = True - ) -> t.Any | t.Callable[[], t.Any] | None: - """Get the default for the parameter. Tries - :meth:`Context.lookup_default` first, then the local default. - - :param ctx: Current context. - :param call: If the default is a callable, call it. Disable to - return the callable instead. - - .. versionchanged:: 8.0.2 - Type casting is no longer performed when getting a default. - - .. versionchanged:: 8.0.1 - Type casting can fail in resilient parsing mode. Invalid - defaults will not prevent showing help text. - - .. versionchanged:: 8.0 - Looks at ``ctx.default_map`` first. - - .. versionchanged:: 8.0 - Added the ``call`` parameter. - """ - value = ctx.lookup_default(self.name, call=False) # type: ignore - - if value is UNSET: - value = self.default - - if call and callable(value): - value = value() - - return value - - def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: - raise NotImplementedError() - - def consume_value( - self, ctx: Context, opts: cabc.Mapping[str, t.Any] - ) -> tuple[t.Any, ParameterSource]: - """Returns the parameter value produced by the parser. - - If the parser did not produce a value from user input, the value is either - sourced from the environment variable, the default map, or the parameter's - default value. In that order of precedence. - - If no value is found, an internal sentinel value is returned. - - :meta private: - """ - # Collect from the parse the value passed by the user to the CLI. - value = opts.get(self.name, UNSET) # type: ignore - # If the value is set, it means it was sourced from the command line by the - # parser, otherwise it left unset by default. - source = ( - ParameterSource.COMMANDLINE - if value is not UNSET - else ParameterSource.DEFAULT - ) - - if value is UNSET: - envvar_value = self.value_from_envvar(ctx) - if envvar_value is not None: - value = envvar_value - source = ParameterSource.ENVIRONMENT - - if value is UNSET: - default_map_value = ctx.lookup_default(self.name) # type: ignore - if default_map_value is not UNSET: - value = default_map_value - source = ParameterSource.DEFAULT_MAP - - if value is UNSET: - default_value = self.get_default(ctx) - if default_value is not UNSET: - value = default_value - source = ParameterSource.DEFAULT - - return value, source - - def type_cast_value(self, ctx: Context, value: t.Any) -> t.Any: - """Convert and validate a value against the parameter's - :attr:`type`, :attr:`multiple`, and :attr:`nargs`. - """ - if value is None: - if self.multiple or self.nargs == -1: - return () - else: - return value - - def check_iter(value: t.Any) -> cabc.Iterator[t.Any]: - try: - return _check_iter(value) - except TypeError: - # This should only happen when passing in args manually, - # the parser should construct an iterable when parsing - # the command line. - raise BadParameter( - _("Value must be an iterable."), ctx=ctx, param=self - ) from None - - # Define the conversion function based on nargs and type. - - if self.nargs == 1 or self.type.is_composite: - - def convert(value: t.Any) -> t.Any: - return self.type(value, param=self, ctx=ctx) - - elif self.nargs == -1: - - def convert(value: t.Any) -> t.Any: # tuple[t.Any, ...] - return tuple(self.type(x, self, ctx) for x in check_iter(value)) - - else: # nargs > 1 - - def convert(value: t.Any) -> t.Any: # tuple[t.Any, ...] - value = tuple(check_iter(value)) - - if len(value) != self.nargs: - raise BadParameter( - ngettext( - "Takes {nargs} values but 1 was given.", - "Takes {nargs} values but {len} were given.", - len(value), - ).format(nargs=self.nargs, len=len(value)), - ctx=ctx, - param=self, - ) - - return tuple(self.type(x, self, ctx) for x in value) - - if self.multiple: - return tuple(convert(x) for x in check_iter(value)) - - return convert(value) - - def value_is_missing(self, value: t.Any) -> bool: - """A value is considered missing if: - - - it is :attr:`UNSET`, - - or if it is an empty sequence while the parameter is suppose to have - non-single value (i.e. :attr:`nargs` is not ``1`` or :attr:`multiple` is - set). - - :meta private: - """ - if value is UNSET: - return True - - if (self.nargs != 1 or self.multiple) and value == (): - return True - - return False - - def process_value(self, ctx: Context, value: t.Any) -> t.Any: - """Process the value of this parameter: - - 1. Type cast the value using :meth:`type_cast_value`. - 2. Check if the value is missing (see: :meth:`value_is_missing`), and raise - :exc:`MissingParameter` if it is required. - 3. If a :attr:`callback` is set, call it to have the value replaced by the - result of the callback. If the value was not set, the callback receive - ``None``. This keep the legacy behavior as it was before the introduction of - the :attr:`UNSET` sentinel. - - :meta private: - """ - # shelter `type_cast_value` from ever seeing an `UNSET` value by handling the - # cases in which `UNSET` gets special treatment explicitly at this layer - # - # Refs: - # https://github.com/pallets/click/issues/3069 - if value is UNSET: - if self.multiple or self.nargs == -1: - value = () - else: - value = self.type_cast_value(ctx, value) - - if self.required and self.value_is_missing(value): - raise MissingParameter(ctx=ctx, param=self) - - if self.callback is not None: - # Legacy case: UNSET is not exposed directly to the callback, but converted - # to None. - if value is UNSET: - value = None - - # Search for parameters with UNSET values in the context. - unset_keys = {k: None for k, v in ctx.params.items() if v is UNSET} - # No UNSET values, call the callback as usual. - if not unset_keys: - value = self.callback(ctx, self, value) - - # Legacy case: provide a temporarily manipulated context to the callback - # to hide UNSET values as None. - # - # Refs: - # https://github.com/pallets/click/issues/3136 - # https://github.com/pallets/click/pull/3137 - else: - # Add another layer to the context stack to clearly hint that the - # context is temporarily modified. - with ctx: - # Update the context parameters to replace UNSET with None. - ctx.params.update(unset_keys) - # Feed these fake context parameters to the callback. - value = self.callback(ctx, self, value) - # Restore the UNSET values in the context parameters. - ctx.params.update( - { - k: UNSET - for k in unset_keys - # Only restore keys that are present and still None, in case - # the callback modified other parameters. - if k in ctx.params and ctx.params[k] is None - } - ) - - return value - - def resolve_envvar_value(self, ctx: Context) -> str | None: - """Returns the value found in the environment variable(s) attached to this - parameter. - - Environment variables values are `always returned as strings - `_. - - This method returns ``None`` if: - - - the :attr:`envvar` property is not set on the :class:`Parameter`, - - the environment variable is not found in the environment, - - the variable is found in the environment but its value is empty (i.e. the - environment variable is present but has an empty string). - - If :attr:`envvar` is setup with multiple environment variables, - then only the first non-empty value is returned. - - .. caution:: - - The raw value extracted from the environment is not normalized and is - returned as-is. Any normalization or reconciliation is performed later by - the :class:`Parameter`'s :attr:`type`. - - :meta private: - """ - if not self.envvar: - return None - - if isinstance(self.envvar, str): - rv = os.environ.get(self.envvar) - - if rv: - return rv - else: - for envvar in self.envvar: - rv = os.environ.get(envvar) - - # Return the first non-empty value of the list of environment variables. - if rv: - return rv - # Else, absence of value is interpreted as an environment variable that - # is not set, so proceed to the next one. - - return None - - def value_from_envvar(self, ctx: Context) -> str | cabc.Sequence[str] | None: - """Process the raw environment variable string for this parameter. - - Returns the string as-is or splits it into a sequence of strings if the - parameter is expecting multiple values (i.e. its :attr:`nargs` property is set - to a value other than ``1``). - - :meta private: - """ - rv = self.resolve_envvar_value(ctx) - - if rv is not None and self.nargs != 1: - return self.type.split_envvar_value(rv) - - return rv - - def handle_parse_result( - self, ctx: Context, opts: cabc.Mapping[str, t.Any], args: list[str] - ) -> tuple[t.Any, list[str]]: - """Process the value produced by the parser from user input. - - Always process the value through the Parameter's :attr:`type`, wherever it - comes from. - - If the parameter is deprecated, this method warn the user about it. But only if - the value has been explicitly set by the user (and as such, is not coming from - a default). - - :meta private: - """ - with augment_usage_errors(ctx, param=self): - value, source = self.consume_value(ctx, opts) - - ctx.set_parameter_source(self.name, source) # type: ignore - - # Display a deprecation warning if necessary. - if ( - self.deprecated - and value is not UNSET - and source not in (ParameterSource.DEFAULT, ParameterSource.DEFAULT_MAP) - ): - extra_message = ( - f" {self.deprecated}" if isinstance(self.deprecated, str) else "" - ) - message = _( - "DeprecationWarning: The {param_type} {name!r} is deprecated." - "{extra_message}" - ).format( - param_type=self.param_type_name, - name=self.human_readable_name, - extra_message=extra_message, - ) - echo(style(message, fg="red"), err=True) - - # Process the value through the parameter's type. - try: - value = self.process_value(ctx, value) - except Exception: - if not ctx.resilient_parsing: - raise - # In resilient parsing mode, we do not want to fail the command if the - # value is incompatible with the parameter type, so we reset the value - # to UNSET, which will be interpreted as a missing value. - value = UNSET - - # Add parameter's value to the context. - if ( - self.expose_value - # We skip adding the value if it was previously set by another parameter - # targeting the same variable name. This prevents parameters competing for - # the same name to override each other. - and (self.name not in ctx.params or ctx.params[self.name] is UNSET) - ): - # Click is logically enforcing that the name is None if the parameter is - # not to be exposed. We still assert it here to please the type checker. - assert self.name is not None, ( - f"{self!r} parameter's name should not be None when exposing value." - ) - ctx.params[self.name] = value - - return value, args - - def get_help_record(self, ctx: Context) -> tuple[str, str] | None: - pass - - def get_usage_pieces(self, ctx: Context) -> list[str]: - return [] - - def get_error_hint(self, ctx: Context) -> str: - """Get a stringified version of the param for use in error messages to - indicate which param caused the error. - """ - hint_list = self.opts or [self.human_readable_name] - return " / ".join(f"'{x}'" for x in hint_list) - - def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: - """Return a list of completions for the incomplete value. If a - ``shell_complete`` function was given during init, it is used. - Otherwise, the :attr:`type` - :meth:`~click.types.ParamType.shell_complete` function is used. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - if self._custom_shell_complete is not None: - results = self._custom_shell_complete(ctx, self, incomplete) - - if results and isinstance(results[0], str): - from click.shell_completion import CompletionItem - - results = [CompletionItem(c) for c in results] - - return t.cast("list[CompletionItem]", results) - - return self.type.shell_complete(ctx, self, incomplete) - - -class Option(Parameter): - """Options are usually optional values on the command line and - have some extra features that arguments don't have. - - All other parameters are passed onwards to the parameter constructor. - - :param show_default: Show the default value for this option in its - help text. Values are not shown by default, unless - :attr:`Context.show_default` is ``True``. If this value is a - string, it shows that string in parentheses instead of the - actual value. This is particularly useful for dynamic options. - For single option boolean flags, the default remains hidden if - its value is ``False``. - :param show_envvar: Controls if an environment variable should be - shown on the help page and error messages. - Normally, environment variables are not shown. - :param prompt: If set to ``True`` or a non empty string then the - user will be prompted for input. If set to ``True`` the prompt - will be the option name capitalized. A deprecated option cannot be - prompted. - :param confirmation_prompt: Prompt a second time to confirm the - value if it was prompted for. Can be set to a string instead of - ``True`` to customize the message. - :param prompt_required: If set to ``False``, the user will be - prompted for input only when the option was specified as a flag - without a value. - :param hide_input: If this is ``True`` then the input on the prompt - will be hidden from the user. This is useful for password input. - :param is_flag: forces this option to act as a flag. The default is - auto detection. - :param flag_value: which value should be used for this flag if it's - enabled. This is set to a boolean automatically if - the option string contains a slash to mark two options. - :param multiple: if this is set to `True` then the argument is accepted - multiple times and recorded. This is similar to ``nargs`` - in how it works but supports arbitrary number of - arguments. - :param count: this flag makes an option increment an integer. - :param allow_from_autoenv: if this is enabled then the value of this - parameter will be pulled from an environment - variable in case a prefix is defined on the - context. - :param help: the help string. - :param hidden: hide this option from help outputs. - :param attrs: Other command arguments described in :class:`Parameter`. - - .. versionchanged:: 8.2 - ``envvar`` used with ``flag_value`` will always use the ``flag_value``, - previously it would use the value of the environment variable. - - .. versionchanged:: 8.1 - Help text indentation is cleaned here instead of only in the - ``@option`` decorator. - - .. versionchanged:: 8.1 - The ``show_default`` parameter overrides - ``Context.show_default``. - - .. versionchanged:: 8.1 - The default of a single option boolean flag is not shown if the - default value is ``False``. - - .. versionchanged:: 8.0.1 - ``type`` is detected from ``flag_value`` if given. - """ - - param_type_name = "option" - - def __init__( - self, - param_decls: cabc.Sequence[str] | None = None, - show_default: bool | str | None = None, - prompt: bool | str = False, - confirmation_prompt: bool | str = False, - prompt_required: bool = True, - hide_input: bool = False, - is_flag: bool | None = None, - flag_value: t.Any = UNSET, - multiple: bool = False, - count: bool = False, - allow_from_autoenv: bool = True, - type: types.ParamType | t.Any | None = None, - help: str | None = None, - hidden: bool = False, - show_choices: bool = True, - show_envvar: bool = False, - deprecated: bool | str = False, - **attrs: t.Any, - ) -> None: - if help: - help = inspect.cleandoc(help) - - super().__init__( - param_decls, type=type, multiple=multiple, deprecated=deprecated, **attrs - ) - - if prompt is True: - if self.name is None: - raise TypeError("'name' is required with 'prompt=True'.") - - prompt_text: str | None = self.name.replace("_", " ").capitalize() - elif prompt is False: - prompt_text = None - else: - prompt_text = prompt - - if deprecated: - deprecated_message = ( - f"(DEPRECATED: {deprecated})" - if isinstance(deprecated, str) - else "(DEPRECATED)" - ) - help = help + deprecated_message if help is not None else deprecated_message - - self.prompt = prompt_text - self.confirmation_prompt = confirmation_prompt - self.prompt_required = prompt_required - self.hide_input = hide_input - self.hidden = hidden - - # The _flag_needs_value property tells the parser that this option is a flag - # that cannot be used standalone and needs a value. With this information, the - # parser can determine whether to consider the next user-provided argument in - # the CLI as a value for this flag or as a new option. - # If prompt is enabled but not required, then it opens the possibility for the - # option to gets its value from the user. - self._flag_needs_value = self.prompt is not None and not self.prompt_required - - # Auto-detect if this is a flag or not. - if is_flag is None: - # Implicitly a flag because flag_value was set. - if flag_value is not UNSET: - is_flag = True - # Not a flag, but when used as a flag it shows a prompt. - elif self._flag_needs_value: - is_flag = False - # Implicitly a flag because secondary options names were given. - elif self.secondary_opts: - is_flag = True - # The option is explicitly not a flag. But we do not know yet if it needs a - # value or not. So we look at the default value to determine it. - elif is_flag is False and not self._flag_needs_value: - self._flag_needs_value = self.default is UNSET - - if is_flag: - # Set missing default for flags if not explicitly required or prompted. - if self.default is UNSET and not self.required and not self.prompt: - if multiple: - self.default = () - - # Auto-detect the type of the flag based on the flag_value. - if type is None: - # A flag without a flag_value is a boolean flag. - if flag_value is UNSET: - self.type: types.ParamType = types.BoolParamType() - # If the flag value is a boolean, use BoolParamType. - elif isinstance(flag_value, bool): - self.type = types.BoolParamType() - # Otherwise, guess the type from the flag value. - else: - self.type = types.convert_type(None, flag_value) - - self.is_flag: bool = bool(is_flag) - self.is_bool_flag: bool = bool( - is_flag and isinstance(self.type, types.BoolParamType) - ) - self.flag_value: t.Any = flag_value - - # Set boolean flag default to False if unset and not required. - if self.is_bool_flag: - if self.default is UNSET and not self.required: - self.default = False - - # Support the special case of aligning the default value with the flag_value - # for flags whose default is explicitly set to True. Note that as long as we - # have this condition, there is no way a flag can have a default set to True, - # and a flag_value set to something else. Refs: - # https://github.com/pallets/click/issues/3024#issuecomment-3146199461 - # https://github.com/pallets/click/pull/3030/commits/06847da - if self.default is True and self.flag_value is not UNSET: - self.default = self.flag_value - - # Set the default flag_value if it is not set. - if self.flag_value is UNSET: - if self.is_flag: - self.flag_value = True - else: - self.flag_value = None - - # Counting. - self.count = count - if count: - if type is None: - self.type = types.IntRange(min=0) - if self.default is UNSET: - self.default = 0 - - self.allow_from_autoenv = allow_from_autoenv - self.help = help - self.show_default = show_default - self.show_choices = show_choices - self.show_envvar = show_envvar - - if __debug__: - if deprecated and prompt: - raise ValueError("`deprecated` options cannot use `prompt`.") - - if self.nargs == -1: - raise TypeError("nargs=-1 is not supported for options.") - - if not self.is_bool_flag and self.secondary_opts: - raise TypeError("Secondary flag is not valid for non-boolean flag.") - - if self.is_bool_flag and self.hide_input and self.prompt is not None: - raise TypeError( - "'prompt' with 'hide_input' is not valid for boolean flag." - ) - - if self.count: - if self.multiple: - raise TypeError("'count' is not valid with 'multiple'.") - - if self.is_flag: - raise TypeError("'count' is not valid with 'is_flag'.") - - def to_info_dict(self) -> dict[str, t.Any]: - """ - .. versionchanged:: 8.3.0 - Returns ``None`` for the :attr:`flag_value` if it was not set. - """ - info_dict = super().to_info_dict() - info_dict.update( - help=self.help, - prompt=self.prompt, - is_flag=self.is_flag, - # We explicitly hide the :attr:`UNSET` value to the user, as we choose to - # make it an implementation detail. And because ``to_info_dict`` has been - # designed for documentation purposes, we return ``None`` instead. - flag_value=self.flag_value if self.flag_value is not UNSET else None, - count=self.count, - hidden=self.hidden, - ) - return info_dict - - def get_error_hint(self, ctx: Context) -> str: - result = super().get_error_hint(ctx) - if self.show_envvar and self.envvar is not None: - result += f" (env var: '{self.envvar}')" - return result - - def _parse_decls( - self, decls: cabc.Sequence[str], expose_value: bool - ) -> tuple[str | None, list[str], list[str]]: - opts = [] - secondary_opts = [] - name = None - possible_names = [] - - for decl in decls: - if decl.isidentifier(): - if name is not None: - raise TypeError(f"Name '{name}' defined twice") - name = decl - else: - split_char = ";" if decl[:1] == "/" else "/" - if split_char in decl: - first, second = decl.split(split_char, 1) - first = first.rstrip() - if first: - possible_names.append(_split_opt(first)) - opts.append(first) - second = second.lstrip() - if second: - secondary_opts.append(second.lstrip()) - if first == second: - raise ValueError( - f"Boolean option {decl!r} cannot use the" - " same flag for true/false." - ) - else: - possible_names.append(_split_opt(decl)) - opts.append(decl) - - if name is None and possible_names: - possible_names.sort(key=lambda x: -len(x[0])) # group long options first - name = possible_names[0][1].replace("-", "_").lower() - if not name.isidentifier(): - name = None - - if name is None: - if not expose_value: - return None, opts, secondary_opts - raise TypeError( - f"Could not determine name for option with declarations {decls!r}" - ) - - if not opts and not secondary_opts: - raise TypeError( - f"No options defined but a name was passed ({name})." - " Did you mean to declare an argument instead? Did" - f" you mean to pass '--{name}'?" - ) - - return name, opts, secondary_opts - - def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: - if self.multiple: - action = "append" - elif self.count: - action = "count" - else: - action = "store" - - if self.is_flag: - action = f"{action}_const" - - if self.is_bool_flag and self.secondary_opts: - parser.add_option( - obj=self, opts=self.opts, dest=self.name, action=action, const=True - ) - parser.add_option( - obj=self, - opts=self.secondary_opts, - dest=self.name, - action=action, - const=False, - ) - else: - parser.add_option( - obj=self, - opts=self.opts, - dest=self.name, - action=action, - const=self.flag_value, - ) - else: - parser.add_option( - obj=self, - opts=self.opts, - dest=self.name, - action=action, - nargs=self.nargs, - ) - - def get_help_record(self, ctx: Context) -> tuple[str, str] | None: - if self.hidden: - return None - - any_prefix_is_slash = False - - def _write_opts(opts: cabc.Sequence[str]) -> str: - nonlocal any_prefix_is_slash - - rv, any_slashes = join_options(opts) - - if any_slashes: - any_prefix_is_slash = True - - if not self.is_flag and not self.count: - rv += f" {self.make_metavar(ctx=ctx)}" - - return rv - - rv = [_write_opts(self.opts)] - - if self.secondary_opts: - rv.append(_write_opts(self.secondary_opts)) - - help = self.help or "" - - extra = self.get_help_extra(ctx) - extra_items = [] - if "envvars" in extra: - extra_items.append( - _("env var: {var}").format(var=", ".join(extra["envvars"])) - ) - if "default" in extra: - extra_items.append(_("default: {default}").format(default=extra["default"])) - if "range" in extra: - extra_items.append(extra["range"]) - if "required" in extra: - extra_items.append(_(extra["required"])) - - if extra_items: - extra_str = "; ".join(extra_items) - help = f"{help} [{extra_str}]" if help else f"[{extra_str}]" - - return ("; " if any_prefix_is_slash else " / ").join(rv), help - - def get_help_extra(self, ctx: Context) -> types.OptionHelpExtra: - extra: types.OptionHelpExtra = {} - - if self.show_envvar: - envvar = self.envvar - - if envvar is None: - if ( - self.allow_from_autoenv - and ctx.auto_envvar_prefix is not None - and self.name is not None - ): - envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" - - if envvar is not None: - if isinstance(envvar, str): - extra["envvars"] = (envvar,) - else: - extra["envvars"] = tuple(str(d) for d in envvar) - - # Temporarily enable resilient parsing to avoid type casting - # failing for the default. Might be possible to extend this to - # help formatting in general. - resilient = ctx.resilient_parsing - ctx.resilient_parsing = True - - try: - default_value = self.get_default(ctx, call=False) - finally: - ctx.resilient_parsing = resilient - - show_default = False - show_default_is_str = False - - if self.show_default is not None: - if isinstance(self.show_default, str): - show_default_is_str = show_default = True - else: - show_default = self.show_default - elif ctx.show_default is not None: - show_default = ctx.show_default - - if show_default_is_str or ( - show_default and (default_value not in (None, UNSET)) - ): - if show_default_is_str: - default_string = f"({self.show_default})" - elif isinstance(default_value, (list, tuple)): - default_string = ", ".join(str(d) for d in default_value) - elif isinstance(default_value, enum.Enum): - default_string = default_value.name - elif inspect.isfunction(default_value): - default_string = _("(dynamic)") - elif self.is_bool_flag and self.secondary_opts: - # For boolean flags that have distinct True/False opts, - # use the opt without prefix instead of the value. - default_string = _split_opt( - (self.opts if default_value else self.secondary_opts)[0] - )[1] - elif self.is_bool_flag and not self.secondary_opts and not default_value: - default_string = "" - elif default_value == "": - default_string = '""' - else: - default_string = str(default_value) - - if default_string: - extra["default"] = default_string - - if ( - isinstance(self.type, types._NumberRangeBase) - # skip count with default range type - and not (self.count and self.type.min == 0 and self.type.max is None) - ): - range_str = self.type._describe_range() - - if range_str: - extra["range"] = range_str - - if self.required: - extra["required"] = "required" - - return extra - - def prompt_for_value(self, ctx: Context) -> t.Any: - """This is an alternative flow that can be activated in the full - value processing if a value does not exist. It will prompt the - user until a valid value exists and then returns the processed - value as result. - """ - assert self.prompt is not None - - # Calculate the default before prompting anything to lock in the value before - # attempting any user interaction. - default = self.get_default(ctx) - - # A boolean flag can use a simplified [y/n] confirmation prompt. - if self.is_bool_flag: - # If we have no boolean default, we force the user to explicitly provide - # one. - if default in (UNSET, None): - default = None - # Nothing prevent you to declare an option that is simultaneously: - # 1) auto-detected as a boolean flag, - # 2) allowed to prompt, and - # 3) still declare a non-boolean default. - # This forced casting into a boolean is necessary to align any non-boolean - # default to the prompt, which is going to be a [y/n]-style confirmation - # because the option is still a boolean flag. That way, instead of [y/n], - # we get [Y/n] or [y/N] depending on the truthy value of the default. - # Refs: https://github.com/pallets/click/pull/3030#discussion_r2289180249 - else: - default = bool(default) - return confirm(self.prompt, default) - - # If show_default is set to True/False, provide this to `prompt` as well. For - # non-bool values of `show_default`, we use `prompt`'s default behavior - prompt_kwargs: t.Any = {} - if isinstance(self.show_default, bool): - prompt_kwargs["show_default"] = self.show_default - - return prompt( - self.prompt, - # Use ``None`` to inform the prompt() function to reiterate until a valid - # value is provided by the user if we have no default. - default=None if default is UNSET else default, - type=self.type, - hide_input=self.hide_input, - show_choices=self.show_choices, - confirmation_prompt=self.confirmation_prompt, - value_proc=lambda x: self.process_value(ctx, x), - **prompt_kwargs, - ) - - def resolve_envvar_value(self, ctx: Context) -> str | None: - """:class:`Option` resolves its environment variable the same way as - :func:`Parameter.resolve_envvar_value`, but it also supports - :attr:`Context.auto_envvar_prefix`. If we could not find an environment from - the :attr:`envvar` property, we fallback on :attr:`Context.auto_envvar_prefix` - to build dynamiccaly the environment variable name using the - :python:`{ctx.auto_envvar_prefix}_{self.name.upper()}` template. - - :meta private: - """ - rv = super().resolve_envvar_value(ctx) - - if rv is not None: - return rv - - if ( - self.allow_from_autoenv - and ctx.auto_envvar_prefix is not None - and self.name is not None - ): - envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" - rv = os.environ.get(envvar) - - if rv: - return rv - - return None - - def value_from_envvar(self, ctx: Context) -> t.Any: - """For :class:`Option`, this method processes the raw environment variable - string the same way as :func:`Parameter.value_from_envvar` does. - - But in the case of non-boolean flags, the value is analyzed to determine if the - flag is activated or not, and returns a boolean of its activation, or the - :attr:`flag_value` if the latter is set. - - This method also takes care of repeated options (i.e. options with - :attr:`multiple` set to ``True``). - - :meta private: - """ - rv = self.resolve_envvar_value(ctx) - - # Absent environment variable or an empty string is interpreted as unset. - if rv is None: - return None - - # Non-boolean flags are more liberal in what they accept. But a flag being a - # flag, its envvar value still needs to be analyzed to determine if the flag is - # activated or not. - if self.is_flag and not self.is_bool_flag: - # If the flag_value is set and match the envvar value, return it - # directly. - if self.flag_value is not UNSET and rv == self.flag_value: - return self.flag_value - # Analyze the envvar value as a boolean to know if the flag is - # activated or not. - return types.BoolParamType.str_to_bool(rv) - - # Split the envvar value if it is allowed to be repeated. - value_depth = (self.nargs != 1) + bool(self.multiple) - if value_depth > 0: - multi_rv = self.type.split_envvar_value(rv) - if self.multiple and self.nargs != 1: - multi_rv = batch(multi_rv, self.nargs) # type: ignore[assignment] - - return multi_rv - - return rv - - def consume_value( - self, ctx: Context, opts: cabc.Mapping[str, Parameter] - ) -> tuple[t.Any, ParameterSource]: - """For :class:`Option`, the value can be collected from an interactive prompt - if the option is a flag that needs a value (and the :attr:`prompt` property is - set). - - Additionally, this method handles flag option that are activated without a - value, in which case the :attr:`flag_value` is returned. - - :meta private: - """ - value, source = super().consume_value(ctx, opts) - - # The parser will emit a sentinel value if the option is allowed to as a flag - # without a value. - if value is FLAG_NEEDS_VALUE: - # If the option allows for a prompt, we start an interaction with the user. - if self.prompt is not None and not ctx.resilient_parsing: - value = self.prompt_for_value(ctx) - source = ParameterSource.PROMPT - # Else the flag takes its flag_value as value. - else: - value = self.flag_value - source = ParameterSource.COMMANDLINE - - # A flag which is activated always returns the flag value, unless the value - # comes from the explicitly sets default. - elif ( - self.is_flag - and value is True - and not self.is_bool_flag - and source not in (ParameterSource.DEFAULT, ParameterSource.DEFAULT_MAP) - ): - value = self.flag_value - - # Re-interpret a multiple option which has been sent as-is by the parser. - # Here we replace each occurrence of value-less flags (marked by the - # FLAG_NEEDS_VALUE sentinel) with the flag_value. - elif ( - self.multiple - and value is not UNSET - and source not in (ParameterSource.DEFAULT, ParameterSource.DEFAULT_MAP) - and any(v is FLAG_NEEDS_VALUE for v in value) - ): - value = [self.flag_value if v is FLAG_NEEDS_VALUE else v for v in value] - source = ParameterSource.COMMANDLINE - - # The value wasn't set, or used the param's default, prompt for one to the user - # if prompting is enabled. - elif ( - ( - value is UNSET - or source in (ParameterSource.DEFAULT, ParameterSource.DEFAULT_MAP) - ) - and self.prompt is not None - and (self.required or self.prompt_required) - and not ctx.resilient_parsing - ): - value = self.prompt_for_value(ctx) - source = ParameterSource.PROMPT - - return value, source - - def process_value(self, ctx: Context, value: t.Any) -> t.Any: - # process_value has to be overridden on Options in order to capture - # `value == UNSET` cases before `type_cast_value()` gets called. - # - # Refs: - # https://github.com/pallets/click/issues/3069 - if self.is_flag and not self.required and self.is_bool_flag and value is UNSET: - value = False - - if self.callback is not None: - value = self.callback(ctx, self, value) - - return value - - # in the normal case, rely on Parameter.process_value - return super().process_value(ctx, value) - - -class Argument(Parameter): - """Arguments are positional parameters to a command. They generally - provide fewer features than options but can have infinite ``nargs`` - and are required by default. - - All parameters are passed onwards to the constructor of :class:`Parameter`. - """ - - param_type_name = "argument" - - def __init__( - self, - param_decls: cabc.Sequence[str], - required: bool | None = None, - **attrs: t.Any, - ) -> None: - # Auto-detect the requirement status of the argument if not explicitly set. - if required is None: - # The argument gets automatically required if it has no explicit default - # value set and is setup to match at least one value. - if attrs.get("default", UNSET) is UNSET: - required = attrs.get("nargs", 1) > 0 - # If the argument has a default value, it is not required. - else: - required = False - - if "multiple" in attrs: - raise TypeError("__init__() got an unexpected keyword argument 'multiple'.") - - super().__init__(param_decls, required=required, **attrs) - - @property - def human_readable_name(self) -> str: - if self.metavar is not None: - return self.metavar - return self.name.upper() # type: ignore - - def make_metavar(self, ctx: Context) -> str: - if self.metavar is not None: - return self.metavar - var = self.type.get_metavar(param=self, ctx=ctx) - if not var: - var = self.name.upper() # type: ignore - if self.deprecated: - var += "!" - if not self.required: - var = f"[{var}]" - if self.nargs != 1: - var += "..." - return var - - def _parse_decls( - self, decls: cabc.Sequence[str], expose_value: bool - ) -> tuple[str | None, list[str], list[str]]: - if not decls: - if not expose_value: - return None, [], [] - raise TypeError("Argument is marked as exposed, but does not have a name.") - if len(decls) == 1: - name = arg = decls[0] - name = name.replace("-", "_").lower() - else: - raise TypeError( - "Arguments take exactly one parameter declaration, got" - f" {len(decls)}: {decls}." - ) - return name, [arg], [] - - def get_usage_pieces(self, ctx: Context) -> list[str]: - return [self.make_metavar(ctx)] - - def get_error_hint(self, ctx: Context) -> str: - return f"'{self.make_metavar(ctx)}'" - - def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: - parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) - - -def __getattr__(name: str) -> object: - import warnings - - if name == "BaseCommand": - warnings.warn( - "'BaseCommand' is deprecated and will be removed in Click 9.0. Use" - " 'Command' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _BaseCommand - - if name == "MultiCommand": - warnings.warn( - "'MultiCommand' is deprecated and will be removed in Click 9.0. Use" - " 'Group' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _MultiCommand - - raise AttributeError(name) diff --git a/venv/lib/python3.12/site-packages/click/decorators.py b/venv/lib/python3.12/site-packages/click/decorators.py deleted file mode 100644 index 21f4c342..00000000 --- a/venv/lib/python3.12/site-packages/click/decorators.py +++ /dev/null @@ -1,551 +0,0 @@ -from __future__ import annotations - -import inspect -import typing as t -from functools import update_wrapper -from gettext import gettext as _ - -from .core import Argument -from .core import Command -from .core import Context -from .core import Group -from .core import Option -from .core import Parameter -from .globals import get_current_context -from .utils import echo - -if t.TYPE_CHECKING: - import typing_extensions as te - - P = te.ParamSpec("P") - -R = t.TypeVar("R") -T = t.TypeVar("T") -_AnyCallable = t.Callable[..., t.Any] -FC = t.TypeVar("FC", bound="_AnyCallable | Command") - - -def pass_context(f: t.Callable[te.Concatenate[Context, P], R]) -> t.Callable[P, R]: - """Marks a callback as wanting to receive the current context - object as first argument. - """ - - def new_func(*args: P.args, **kwargs: P.kwargs) -> R: - return f(get_current_context(), *args, **kwargs) - - return update_wrapper(new_func, f) - - -def pass_obj(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: - """Similar to :func:`pass_context`, but only pass the object on the - context onwards (:attr:`Context.obj`). This is useful if that object - represents the state of a nested system. - """ - - def new_func(*args: P.args, **kwargs: P.kwargs) -> R: - return f(get_current_context().obj, *args, **kwargs) - - return update_wrapper(new_func, f) - - -def make_pass_decorator( - object_type: type[T], ensure: bool = False -) -> t.Callable[[t.Callable[te.Concatenate[T, P], R]], t.Callable[P, R]]: - """Given an object type this creates a decorator that will work - similar to :func:`pass_obj` but instead of passing the object of the - current context, it will find the innermost context of type - :func:`object_type`. - - This generates a decorator that works roughly like this:: - - from functools import update_wrapper - - def decorator(f): - @pass_context - def new_func(ctx, *args, **kwargs): - obj = ctx.find_object(object_type) - return ctx.invoke(f, obj, *args, **kwargs) - return update_wrapper(new_func, f) - return decorator - - :param object_type: the type of the object to pass. - :param ensure: if set to `True`, a new object will be created and - remembered on the context if it's not there yet. - """ - - def decorator(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: - def new_func(*args: P.args, **kwargs: P.kwargs) -> R: - ctx = get_current_context() - - obj: T | None - if ensure: - obj = ctx.ensure_object(object_type) - else: - obj = ctx.find_object(object_type) - - if obj is None: - raise RuntimeError( - "Managed to invoke callback without a context" - f" object of type {object_type.__name__!r}" - " existing." - ) - - return ctx.invoke(f, obj, *args, **kwargs) - - return update_wrapper(new_func, f) - - return decorator - - -def pass_meta_key( - key: str, *, doc_description: str | None = None -) -> t.Callable[[t.Callable[te.Concatenate[T, P], R]], t.Callable[P, R]]: - """Create a decorator that passes a key from - :attr:`click.Context.meta` as the first argument to the decorated - function. - - :param key: Key in ``Context.meta`` to pass. - :param doc_description: Description of the object being passed, - inserted into the decorator's docstring. Defaults to "the 'key' - key from Context.meta". - - .. versionadded:: 8.0 - """ - - def decorator(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: - def new_func(*args: P.args, **kwargs: P.kwargs) -> R: - ctx = get_current_context() - obj = ctx.meta[key] - return ctx.invoke(f, obj, *args, **kwargs) - - return update_wrapper(new_func, f) - - if doc_description is None: - doc_description = f"the {key!r} key from :attr:`click.Context.meta`" - - decorator.__doc__ = ( - f"Decorator that passes {doc_description} as the first argument" - " to the decorated function." - ) - return decorator - - -CmdType = t.TypeVar("CmdType", bound=Command) - - -# variant: no call, directly as decorator for a function. -@t.overload -def command(name: _AnyCallable) -> Command: ... - - -# variant: with positional name and with positional or keyword cls argument: -# @command(namearg, CommandCls, ...) or @command(namearg, cls=CommandCls, ...) -@t.overload -def command( - name: str | None, - cls: type[CmdType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], CmdType]: ... - - -# variant: name omitted, cls _must_ be a keyword argument, @command(cls=CommandCls, ...) -@t.overload -def command( - name: None = None, - *, - cls: type[CmdType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], CmdType]: ... - - -# variant: with optional string name, no cls argument provided. -@t.overload -def command( - name: str | None = ..., cls: None = None, **attrs: t.Any -) -> t.Callable[[_AnyCallable], Command]: ... - - -def command( - name: str | _AnyCallable | None = None, - cls: type[CmdType] | None = None, - **attrs: t.Any, -) -> Command | t.Callable[[_AnyCallable], Command | CmdType]: - r"""Creates a new :class:`Command` and uses the decorated function as - callback. This will also automatically attach all decorated - :func:`option`\s and :func:`argument`\s as parameters to the command. - - The name of the command defaults to the name of the function, converted to - lowercase, with underscores ``_`` replaced by dashes ``-``, and the suffixes - ``_command``, ``_cmd``, ``_group``, and ``_grp`` are removed. For example, - ``init_data_command`` becomes ``init-data``. - - All keyword arguments are forwarded to the underlying command class. - For the ``params`` argument, any decorated params are appended to - the end of the list. - - Once decorated the function turns into a :class:`Command` instance - that can be invoked as a command line utility or be attached to a - command :class:`Group`. - - :param name: The name of the command. Defaults to modifying the function's - name as described above. - :param cls: The command class to create. Defaults to :class:`Command`. - - .. versionchanged:: 8.2 - The suffixes ``_command``, ``_cmd``, ``_group``, and ``_grp`` are - removed when generating the name. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.1 - The ``params`` argument can be used. Decorated params are - appended to the end of the list. - """ - - func: t.Callable[[_AnyCallable], t.Any] | None = None - - if callable(name): - func = name - name = None - assert cls is None, "Use 'command(cls=cls)(callable)' to specify a class." - assert not attrs, "Use 'command(**kwargs)(callable)' to provide arguments." - - if cls is None: - cls = t.cast("type[CmdType]", Command) - - def decorator(f: _AnyCallable) -> CmdType: - if isinstance(f, Command): - raise TypeError("Attempted to convert a callback into a command twice.") - - attr_params = attrs.pop("params", None) - params = attr_params if attr_params is not None else [] - - try: - decorator_params = f.__click_params__ # type: ignore - except AttributeError: - pass - else: - del f.__click_params__ # type: ignore - params.extend(reversed(decorator_params)) - - if attrs.get("help") is None: - attrs["help"] = f.__doc__ - - if t.TYPE_CHECKING: - assert cls is not None - assert not callable(name) - - if name is not None: - cmd_name = name - else: - cmd_name = f.__name__.lower().replace("_", "-") - cmd_left, sep, suffix = cmd_name.rpartition("-") - - if sep and suffix in {"command", "cmd", "group", "grp"}: - cmd_name = cmd_left - - cmd = cls(name=cmd_name, callback=f, params=params, **attrs) - cmd.__doc__ = f.__doc__ - return cmd - - if func is not None: - return decorator(func) - - return decorator - - -GrpType = t.TypeVar("GrpType", bound=Group) - - -# variant: no call, directly as decorator for a function. -@t.overload -def group(name: _AnyCallable) -> Group: ... - - -# variant: with positional name and with positional or keyword cls argument: -# @group(namearg, GroupCls, ...) or @group(namearg, cls=GroupCls, ...) -@t.overload -def group( - name: str | None, - cls: type[GrpType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], GrpType]: ... - - -# variant: name omitted, cls _must_ be a keyword argument, @group(cmd=GroupCls, ...) -@t.overload -def group( - name: None = None, - *, - cls: type[GrpType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], GrpType]: ... - - -# variant: with optional string name, no cls argument provided. -@t.overload -def group( - name: str | None = ..., cls: None = None, **attrs: t.Any -) -> t.Callable[[_AnyCallable], Group]: ... - - -def group( - name: str | _AnyCallable | None = None, - cls: type[GrpType] | None = None, - **attrs: t.Any, -) -> Group | t.Callable[[_AnyCallable], Group | GrpType]: - """Creates a new :class:`Group` with a function as callback. This - works otherwise the same as :func:`command` just that the `cls` - parameter is set to :class:`Group`. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - """ - if cls is None: - cls = t.cast("type[GrpType]", Group) - - if callable(name): - return command(cls=cls, **attrs)(name) - - return command(name, cls, **attrs) - - -def _param_memo(f: t.Callable[..., t.Any], param: Parameter) -> None: - if isinstance(f, Command): - f.params.append(param) - else: - if not hasattr(f, "__click_params__"): - f.__click_params__ = [] # type: ignore - - f.__click_params__.append(param) # type: ignore - - -def argument( - *param_decls: str, cls: type[Argument] | None = None, **attrs: t.Any -) -> t.Callable[[FC], FC]: - """Attaches an argument to the command. All positional arguments are - passed as parameter declarations to :class:`Argument`; all keyword - arguments are forwarded unchanged (except ``cls``). - This is equivalent to creating an :class:`Argument` instance manually - and attaching it to the :attr:`Command.params` list. - - For the default argument class, refer to :class:`Argument` and - :class:`Parameter` for descriptions of parameters. - - :param cls: the argument class to instantiate. This defaults to - :class:`Argument`. - :param param_decls: Passed as positional arguments to the constructor of - ``cls``. - :param attrs: Passed as keyword arguments to the constructor of ``cls``. - """ - if cls is None: - cls = Argument - - def decorator(f: FC) -> FC: - _param_memo(f, cls(param_decls, **attrs)) - return f - - return decorator - - -def option( - *param_decls: str, cls: type[Option] | None = None, **attrs: t.Any -) -> t.Callable[[FC], FC]: - """Attaches an option to the command. All positional arguments are - passed as parameter declarations to :class:`Option`; all keyword - arguments are forwarded unchanged (except ``cls``). - This is equivalent to creating an :class:`Option` instance manually - and attaching it to the :attr:`Command.params` list. - - For the default option class, refer to :class:`Option` and - :class:`Parameter` for descriptions of parameters. - - :param cls: the option class to instantiate. This defaults to - :class:`Option`. - :param param_decls: Passed as positional arguments to the constructor of - ``cls``. - :param attrs: Passed as keyword arguments to the constructor of ``cls``. - """ - if cls is None: - cls = Option - - def decorator(f: FC) -> FC: - _param_memo(f, cls(param_decls, **attrs)) - return f - - return decorator - - -def confirmation_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Add a ``--yes`` option which shows a prompt before continuing if - not passed. If the prompt is declined, the program will exit. - - :param param_decls: One or more option names. Defaults to the single - value ``"--yes"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value: - ctx.abort() - - if not param_decls: - param_decls = ("--yes",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("callback", callback) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("prompt", "Do you want to continue?") - kwargs.setdefault("help", "Confirm the action without prompting.") - return option(*param_decls, **kwargs) - - -def password_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Add a ``--password`` option which prompts for a password, hiding - input and asking to enter the value again for confirmation. - - :param param_decls: One or more option names. Defaults to the single - value ``"--password"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - if not param_decls: - param_decls = ("--password",) - - kwargs.setdefault("prompt", True) - kwargs.setdefault("confirmation_prompt", True) - kwargs.setdefault("hide_input", True) - return option(*param_decls, **kwargs) - - -def version_option( - version: str | None = None, - *param_decls: str, - package_name: str | None = None, - prog_name: str | None = None, - message: str | None = None, - **kwargs: t.Any, -) -> t.Callable[[FC], FC]: - """Add a ``--version`` option which immediately prints the version - number and exits the program. - - If ``version`` is not provided, Click will try to detect it using - :func:`importlib.metadata.version` to get the version for the - ``package_name``. - - If ``package_name`` is not provided, Click will try to detect it by - inspecting the stack frames. This will be used to detect the - version, so it must match the name of the installed package. - - :param version: The version number to show. If not provided, Click - will try to detect it. - :param param_decls: One or more option names. Defaults to the single - value ``"--version"``. - :param package_name: The package name to detect the version from. If - not provided, Click will try to detect it. - :param prog_name: The name of the CLI to show in the message. If not - provided, it will be detected from the command. - :param message: The message to show. The values ``%(prog)s``, - ``%(package)s``, and ``%(version)s`` are available. Defaults to - ``"%(prog)s, version %(version)s"``. - :param kwargs: Extra arguments are passed to :func:`option`. - :raise RuntimeError: ``version`` could not be detected. - - .. versionchanged:: 8.0 - Add the ``package_name`` parameter, and the ``%(package)s`` - value for messages. - - .. versionchanged:: 8.0 - Use :mod:`importlib.metadata` instead of ``pkg_resources``. The - version is detected based on the package name, not the entry - point name. The Python package name must match the installed - package name, or be passed with ``package_name=``. - """ - if message is None: - message = _("%(prog)s, version %(version)s") - - if version is None and package_name is None: - frame = inspect.currentframe() - f_back = frame.f_back if frame is not None else None - f_globals = f_back.f_globals if f_back is not None else None - # break reference cycle - # https://docs.python.org/3/library/inspect.html#the-interpreter-stack - del frame - - if f_globals is not None: - package_name = f_globals.get("__name__") - - if package_name == "__main__": - package_name = f_globals.get("__package__") - - if package_name: - package_name = package_name.partition(".")[0] - - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value or ctx.resilient_parsing: - return - - nonlocal prog_name - nonlocal version - - if prog_name is None: - prog_name = ctx.find_root().info_name - - if version is None and package_name is not None: - import importlib.metadata - - try: - version = importlib.metadata.version(package_name) - except importlib.metadata.PackageNotFoundError: - raise RuntimeError( - f"{package_name!r} is not installed. Try passing" - " 'package_name' instead." - ) from None - - if version is None: - raise RuntimeError( - f"Could not determine the version for {package_name!r} automatically." - ) - - echo( - message % {"prog": prog_name, "package": package_name, "version": version}, - color=ctx.color, - ) - ctx.exit() - - if not param_decls: - param_decls = ("--version",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("is_eager", True) - kwargs.setdefault("help", _("Show the version and exit.")) - kwargs["callback"] = callback - return option(*param_decls, **kwargs) - - -def help_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Pre-configured ``--help`` option which immediately prints the help page - and exits the program. - - :param param_decls: One or more option names. Defaults to the single - value ``"--help"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - - def show_help(ctx: Context, param: Parameter, value: bool) -> None: - """Callback that print the help page on ```` and exits.""" - if value and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - if not param_decls: - param_decls = ("--help",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("is_eager", True) - kwargs.setdefault("help", _("Show this message and exit.")) - kwargs.setdefault("callback", show_help) - - return option(*param_decls, **kwargs) diff --git a/venv/lib/python3.12/site-packages/click/exceptions.py b/venv/lib/python3.12/site-packages/click/exceptions.py deleted file mode 100644 index 4d782ee3..00000000 --- a/venv/lib/python3.12/site-packages/click/exceptions.py +++ /dev/null @@ -1,308 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import typing as t -from gettext import gettext as _ -from gettext import ngettext - -from ._compat import get_text_stderr -from .globals import resolve_color_default -from .utils import echo -from .utils import format_filename - -if t.TYPE_CHECKING: - from .core import Command - from .core import Context - from .core import Parameter - - -def _join_param_hints(param_hint: cabc.Sequence[str] | str | None) -> str | None: - if param_hint is not None and not isinstance(param_hint, str): - return " / ".join(repr(x) for x in param_hint) - - return param_hint - - -class ClickException(Exception): - """An exception that Click can handle and show to the user.""" - - #: The exit code for this exception. - exit_code = 1 - - def __init__(self, message: str) -> None: - super().__init__(message) - # The context will be removed by the time we print the message, so cache - # the color settings here to be used later on (in `show`) - self.show_color: bool | None = resolve_color_default() - self.message = message - - def format_message(self) -> str: - return self.message - - def __str__(self) -> str: - return self.message - - def show(self, file: t.IO[t.Any] | None = None) -> None: - if file is None: - file = get_text_stderr() - - echo( - _("Error: {message}").format(message=self.format_message()), - file=file, - color=self.show_color, - ) - - -class UsageError(ClickException): - """An internal exception that signals a usage error. This typically - aborts any further handling. - - :param message: the error message to display. - :param ctx: optionally the context that caused this error. Click will - fill in the context automatically in some situations. - """ - - exit_code = 2 - - def __init__(self, message: str, ctx: Context | None = None) -> None: - super().__init__(message) - self.ctx = ctx - self.cmd: Command | None = self.ctx.command if self.ctx else None - - def show(self, file: t.IO[t.Any] | None = None) -> None: - if file is None: - file = get_text_stderr() - color = None - hint = "" - if ( - self.ctx is not None - and self.ctx.command.get_help_option(self.ctx) is not None - ): - hint = _("Try '{command} {option}' for help.").format( - command=self.ctx.command_path, option=self.ctx.help_option_names[0] - ) - hint = f"{hint}\n" - if self.ctx is not None: - color = self.ctx.color - echo(f"{self.ctx.get_usage()}\n{hint}", file=file, color=color) - echo( - _("Error: {message}").format(message=self.format_message()), - file=file, - color=color, - ) - - -class BadParameter(UsageError): - """An exception that formats out a standardized error message for a - bad parameter. This is useful when thrown from a callback or type as - Click will attach contextual information to it (for instance, which - parameter it is). - - .. versionadded:: 2.0 - - :param param: the parameter object that caused this error. This can - be left out, and Click will attach this info itself - if possible. - :param param_hint: a string that shows up as parameter name. This - can be used as alternative to `param` in cases - where custom validation should happen. If it is - a string it's used as such, if it's a list then - each item is quoted and separated. - """ - - def __init__( - self, - message: str, - ctx: Context | None = None, - param: Parameter | None = None, - param_hint: cabc.Sequence[str] | str | None = None, - ) -> None: - super().__init__(message, ctx) - self.param = param - self.param_hint = param_hint - - def format_message(self) -> str: - if self.param_hint is not None: - param_hint = self.param_hint - elif self.param is not None: - param_hint = self.param.get_error_hint(self.ctx) # type: ignore - else: - return _("Invalid value: {message}").format(message=self.message) - - return _("Invalid value for {param_hint}: {message}").format( - param_hint=_join_param_hints(param_hint), message=self.message - ) - - -class MissingParameter(BadParameter): - """Raised if click required an option or argument but it was not - provided when invoking the script. - - .. versionadded:: 4.0 - - :param param_type: a string that indicates the type of the parameter. - The default is to inherit the parameter type from - the given `param`. Valid values are ``'parameter'``, - ``'option'`` or ``'argument'``. - """ - - def __init__( - self, - message: str | None = None, - ctx: Context | None = None, - param: Parameter | None = None, - param_hint: cabc.Sequence[str] | str | None = None, - param_type: str | None = None, - ) -> None: - super().__init__(message or "", ctx, param, param_hint) - self.param_type = param_type - - def format_message(self) -> str: - if self.param_hint is not None: - param_hint: cabc.Sequence[str] | str | None = self.param_hint - elif self.param is not None: - param_hint = self.param.get_error_hint(self.ctx) # type: ignore - else: - param_hint = None - - param_hint = _join_param_hints(param_hint) - param_hint = f" {param_hint}" if param_hint else "" - - param_type = self.param_type - if param_type is None and self.param is not None: - param_type = self.param.param_type_name - - msg = self.message - if self.param is not None: - msg_extra = self.param.type.get_missing_message( - param=self.param, ctx=self.ctx - ) - if msg_extra: - if msg: - msg += f". {msg_extra}" - else: - msg = msg_extra - - msg = f" {msg}" if msg else "" - - # Translate param_type for known types. - if param_type == "argument": - missing = _("Missing argument") - elif param_type == "option": - missing = _("Missing option") - elif param_type == "parameter": - missing = _("Missing parameter") - else: - missing = _("Missing {param_type}").format(param_type=param_type) - - return f"{missing}{param_hint}.{msg}" - - def __str__(self) -> str: - if not self.message: - param_name = self.param.name if self.param else None - return _("Missing parameter: {param_name}").format(param_name=param_name) - else: - return self.message - - -class NoSuchOption(UsageError): - """Raised if click attempted to handle an option that does not - exist. - - .. versionadded:: 4.0 - """ - - def __init__( - self, - option_name: str, - message: str | None = None, - possibilities: cabc.Sequence[str] | None = None, - ctx: Context | None = None, - ) -> None: - if message is None: - message = _("No such option: {name}").format(name=option_name) - - super().__init__(message, ctx) - self.option_name = option_name - self.possibilities = possibilities - - def format_message(self) -> str: - if not self.possibilities: - return self.message - - possibility_str = ", ".join(sorted(self.possibilities)) - suggest = ngettext( - "Did you mean {possibility}?", - "(Possible options: {possibilities})", - len(self.possibilities), - ).format(possibility=possibility_str, possibilities=possibility_str) - return f"{self.message} {suggest}" - - -class BadOptionUsage(UsageError): - """Raised if an option is generally supplied but the use of the option - was incorrect. This is for instance raised if the number of arguments - for an option is not correct. - - .. versionadded:: 4.0 - - :param option_name: the name of the option being used incorrectly. - """ - - def __init__( - self, option_name: str, message: str, ctx: Context | None = None - ) -> None: - super().__init__(message, ctx) - self.option_name = option_name - - -class BadArgumentUsage(UsageError): - """Raised if an argument is generally supplied but the use of the argument - was incorrect. This is for instance raised if the number of values - for an argument is not correct. - - .. versionadded:: 6.0 - """ - - -class NoArgsIsHelpError(UsageError): - def __init__(self, ctx: Context) -> None: - self.ctx: Context - super().__init__(ctx.get_help(), ctx=ctx) - - def show(self, file: t.IO[t.Any] | None = None) -> None: - echo(self.format_message(), file=file, err=True, color=self.ctx.color) - - -class FileError(ClickException): - """Raised if a file cannot be opened.""" - - def __init__(self, filename: str, hint: str | None = None) -> None: - if hint is None: - hint = _("unknown error") - - super().__init__(hint) - self.ui_filename: str = format_filename(filename) - self.filename = filename - - def format_message(self) -> str: - return _("Could not open file {filename!r}: {message}").format( - filename=self.ui_filename, message=self.message - ) - - -class Abort(RuntimeError): - """An internal signalling exception that signals Click to abort.""" - - -class Exit(RuntimeError): - """An exception that indicates that the application should exit with some - status code. - - :param code: the status code to exit with. - """ - - __slots__ = ("exit_code",) - - def __init__(self, code: int = 0) -> None: - self.exit_code: int = code diff --git a/venv/lib/python3.12/site-packages/click/formatting.py b/venv/lib/python3.12/site-packages/click/formatting.py deleted file mode 100644 index 0b64f831..00000000 --- a/venv/lib/python3.12/site-packages/click/formatting.py +++ /dev/null @@ -1,301 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -from contextlib import contextmanager -from gettext import gettext as _ - -from ._compat import term_len -from .parser import _split_opt - -# Can force a width. This is used by the test system -FORCED_WIDTH: int | None = None - - -def measure_table(rows: cabc.Iterable[tuple[str, str]]) -> tuple[int, ...]: - widths: dict[int, int] = {} - - for row in rows: - for idx, col in enumerate(row): - widths[idx] = max(widths.get(idx, 0), term_len(col)) - - return tuple(y for x, y in sorted(widths.items())) - - -def iter_rows( - rows: cabc.Iterable[tuple[str, str]], col_count: int -) -> cabc.Iterator[tuple[str, ...]]: - for row in rows: - yield row + ("",) * (col_count - len(row)) - - -def wrap_text( - text: str, - width: int = 78, - initial_indent: str = "", - subsequent_indent: str = "", - preserve_paragraphs: bool = False, -) -> str: - """A helper function that intelligently wraps text. By default, it - assumes that it operates on a single paragraph of text but if the - `preserve_paragraphs` parameter is provided it will intelligently - handle paragraphs (defined by two empty lines). - - If paragraphs are handled, a paragraph can be prefixed with an empty - line containing the ``\\b`` character (``\\x08``) to indicate that - no rewrapping should happen in that block. - - :param text: the text that should be rewrapped. - :param width: the maximum width for the text. - :param initial_indent: the initial indent that should be placed on the - first line as a string. - :param subsequent_indent: the indent string that should be placed on - each consecutive line. - :param preserve_paragraphs: if this flag is set then the wrapping will - intelligently handle paragraphs. - """ - from ._textwrap import TextWrapper - - text = text.expandtabs() - wrapper = TextWrapper( - width, - initial_indent=initial_indent, - subsequent_indent=subsequent_indent, - replace_whitespace=False, - ) - if not preserve_paragraphs: - return wrapper.fill(text) - - p: list[tuple[int, bool, str]] = [] - buf: list[str] = [] - indent = None - - def _flush_par() -> None: - if not buf: - return - if buf[0].strip() == "\b": - p.append((indent or 0, True, "\n".join(buf[1:]))) - else: - p.append((indent or 0, False, " ".join(buf))) - del buf[:] - - for line in text.splitlines(): - if not line: - _flush_par() - indent = None - else: - if indent is None: - orig_len = term_len(line) - line = line.lstrip() - indent = orig_len - term_len(line) - buf.append(line) - _flush_par() - - rv = [] - for indent, raw, text in p: - with wrapper.extra_indent(" " * indent): - if raw: - rv.append(wrapper.indent_only(text)) - else: - rv.append(wrapper.fill(text)) - - return "\n\n".join(rv) - - -class HelpFormatter: - """This class helps with formatting text-based help pages. It's - usually just needed for very special internal cases, but it's also - exposed so that developers can write their own fancy outputs. - - At present, it always writes into memory. - - :param indent_increment: the additional increment for each level. - :param width: the width for the text. This defaults to the terminal - width clamped to a maximum of 78. - """ - - def __init__( - self, - indent_increment: int = 2, - width: int | None = None, - max_width: int | None = None, - ) -> None: - self.indent_increment = indent_increment - if max_width is None: - max_width = 80 - if width is None: - import shutil - - width = FORCED_WIDTH - if width is None: - width = max(min(shutil.get_terminal_size().columns, max_width) - 2, 50) - self.width = width - self.current_indent: int = 0 - self.buffer: list[str] = [] - - def write(self, string: str) -> None: - """Writes a unicode string into the internal buffer.""" - self.buffer.append(string) - - def indent(self) -> None: - """Increases the indentation.""" - self.current_indent += self.indent_increment - - def dedent(self) -> None: - """Decreases the indentation.""" - self.current_indent -= self.indent_increment - - def write_usage(self, prog: str, args: str = "", prefix: str | None = None) -> None: - """Writes a usage line into the buffer. - - :param prog: the program name. - :param args: whitespace separated list of arguments. - :param prefix: The prefix for the first line. Defaults to - ``"Usage: "``. - """ - if prefix is None: - prefix = f"{_('Usage:')} " - - usage_prefix = f"{prefix:>{self.current_indent}}{prog} " - text_width = self.width - self.current_indent - - if text_width >= (term_len(usage_prefix) + 20): - # The arguments will fit to the right of the prefix. - indent = " " * term_len(usage_prefix) - self.write( - wrap_text( - args, - text_width, - initial_indent=usage_prefix, - subsequent_indent=indent, - ) - ) - else: - # The prefix is too long, put the arguments on the next line. - self.write(usage_prefix) - self.write("\n") - indent = " " * (max(self.current_indent, term_len(prefix)) + 4) - self.write( - wrap_text( - args, text_width, initial_indent=indent, subsequent_indent=indent - ) - ) - - self.write("\n") - - def write_heading(self, heading: str) -> None: - """Writes a heading into the buffer.""" - self.write(f"{'':>{self.current_indent}}{heading}:\n") - - def write_paragraph(self) -> None: - """Writes a paragraph into the buffer.""" - if self.buffer: - self.write("\n") - - def write_text(self, text: str) -> None: - """Writes re-indented text into the buffer. This rewraps and - preserves paragraphs. - """ - indent = " " * self.current_indent - self.write( - wrap_text( - text, - self.width, - initial_indent=indent, - subsequent_indent=indent, - preserve_paragraphs=True, - ) - ) - self.write("\n") - - def write_dl( - self, - rows: cabc.Sequence[tuple[str, str]], - col_max: int = 30, - col_spacing: int = 2, - ) -> None: - """Writes a definition list into the buffer. This is how options - and commands are usually formatted. - - :param rows: a list of two item tuples for the terms and values. - :param col_max: the maximum width of the first column. - :param col_spacing: the number of spaces between the first and - second column. - """ - rows = list(rows) - widths = measure_table(rows) - if len(widths) != 2: - raise TypeError("Expected two columns for definition list") - - first_col = min(widths[0], col_max) + col_spacing - - for first, second in iter_rows(rows, len(widths)): - self.write(f"{'':>{self.current_indent}}{first}") - if not second: - self.write("\n") - continue - if term_len(first) <= first_col - col_spacing: - self.write(" " * (first_col - term_len(first))) - else: - self.write("\n") - self.write(" " * (first_col + self.current_indent)) - - text_width = max(self.width - first_col - 2, 10) - wrapped_text = wrap_text(second, text_width, preserve_paragraphs=True) - lines = wrapped_text.splitlines() - - if lines: - self.write(f"{lines[0]}\n") - - for line in lines[1:]: - self.write(f"{'':>{first_col + self.current_indent}}{line}\n") - else: - self.write("\n") - - @contextmanager - def section(self, name: str) -> cabc.Iterator[None]: - """Helpful context manager that writes a paragraph, a heading, - and the indents. - - :param name: the section name that is written as heading. - """ - self.write_paragraph() - self.write_heading(name) - self.indent() - try: - yield - finally: - self.dedent() - - @contextmanager - def indentation(self) -> cabc.Iterator[None]: - """A context manager that increases the indentation.""" - self.indent() - try: - yield - finally: - self.dedent() - - def getvalue(self) -> str: - """Returns the buffer contents.""" - return "".join(self.buffer) - - -def join_options(options: cabc.Sequence[str]) -> tuple[str, bool]: - """Given a list of option strings this joins them in the most appropriate - way and returns them in the form ``(formatted_string, - any_prefix_is_slash)`` where the second item in the tuple is a flag that - indicates if any of the option prefixes was a slash. - """ - rv = [] - any_prefix_is_slash = False - - for opt in options: - prefix = _split_opt(opt)[0] - - if prefix == "/": - any_prefix_is_slash = True - - rv.append((len(prefix), opt)) - - rv.sort(key=lambda x: x[0]) - return ", ".join(x[1] for x in rv), any_prefix_is_slash diff --git a/venv/lib/python3.12/site-packages/click/globals.py b/venv/lib/python3.12/site-packages/click/globals.py deleted file mode 100644 index a2f91723..00000000 --- a/venv/lib/python3.12/site-packages/click/globals.py +++ /dev/null @@ -1,67 +0,0 @@ -from __future__ import annotations - -import typing as t -from threading import local - -if t.TYPE_CHECKING: - from .core import Context - -_local = local() - - -@t.overload -def get_current_context(silent: t.Literal[False] = False) -> Context: ... - - -@t.overload -def get_current_context(silent: bool = ...) -> Context | None: ... - - -def get_current_context(silent: bool = False) -> Context | None: - """Returns the current click context. This can be used as a way to - access the current context object from anywhere. This is a more implicit - alternative to the :func:`pass_context` decorator. This function is - primarily useful for helpers such as :func:`echo` which might be - interested in changing its behavior based on the current context. - - To push the current context, :meth:`Context.scope` can be used. - - .. versionadded:: 5.0 - - :param silent: if set to `True` the return value is `None` if no context - is available. The default behavior is to raise a - :exc:`RuntimeError`. - """ - try: - return t.cast("Context", _local.stack[-1]) - except (AttributeError, IndexError) as e: - if not silent: - raise RuntimeError("There is no active click context.") from e - - return None - - -def push_context(ctx: Context) -> None: - """Pushes a new context to the current stack.""" - _local.__dict__.setdefault("stack", []).append(ctx) - - -def pop_context() -> None: - """Removes the top level from the stack.""" - _local.stack.pop() - - -def resolve_color_default(color: bool | None = None) -> bool | None: - """Internal helper to get the default value of the color flag. If a - value is passed it's returned unchanged, otherwise it's looked up from - the current context. - """ - if color is not None: - return color - - ctx = get_current_context(silent=True) - - if ctx is not None: - return ctx.color - - return None diff --git a/venv/lib/python3.12/site-packages/click/parser.py b/venv/lib/python3.12/site-packages/click/parser.py deleted file mode 100644 index 1ea1f716..00000000 --- a/venv/lib/python3.12/site-packages/click/parser.py +++ /dev/null @@ -1,532 +0,0 @@ -""" -This module started out as largely a copy paste from the stdlib's -optparse module with the features removed that we do not need from -optparse because we implement them in Click on a higher level (for -instance type handling, help formatting and a lot more). - -The plan is to remove more and more from here over time. - -The reason this is a different module and not optparse from the stdlib -is that there are differences in 2.x and 3.x about the error messages -generated and optparse in the stdlib uses gettext for no good reason -and might cause us issues. - -Click uses parts of optparse written by Gregory P. Ward and maintained -by the Python Software Foundation. This is limited to code in parser.py. - -Copyright 2001-2006 Gregory P. Ward. All rights reserved. -Copyright 2002-2006 Python Software Foundation. All rights reserved. -""" - -# This code uses parts of optparse written by Gregory P. Ward and -# maintained by the Python Software Foundation. -# Copyright 2001-2006 Gregory P. Ward -# Copyright 2002-2006 Python Software Foundation -from __future__ import annotations - -import collections.abc as cabc -import typing as t -from collections import deque -from gettext import gettext as _ -from gettext import ngettext - -from ._utils import FLAG_NEEDS_VALUE -from ._utils import UNSET -from .exceptions import BadArgumentUsage -from .exceptions import BadOptionUsage -from .exceptions import NoSuchOption -from .exceptions import UsageError - -if t.TYPE_CHECKING: - from ._utils import T_FLAG_NEEDS_VALUE - from ._utils import T_UNSET - from .core import Argument as CoreArgument - from .core import Context - from .core import Option as CoreOption - from .core import Parameter as CoreParameter - -V = t.TypeVar("V") - - -def _unpack_args( - args: cabc.Sequence[str], nargs_spec: cabc.Sequence[int] -) -> tuple[cabc.Sequence[str | cabc.Sequence[str | None] | None], list[str]]: - """Given an iterable of arguments and an iterable of nargs specifications, - it returns a tuple with all the unpacked arguments at the first index - and all remaining arguments as the second. - - The nargs specification is the number of arguments that should be consumed - or `-1` to indicate that this position should eat up all the remainders. - - Missing items are filled with ``UNSET``. - """ - args = deque(args) - nargs_spec = deque(nargs_spec) - rv: list[str | tuple[str | T_UNSET, ...] | T_UNSET] = [] - spos: int | None = None - - def _fetch(c: deque[V]) -> V | T_UNSET: - try: - if spos is None: - return c.popleft() - else: - return c.pop() - except IndexError: - return UNSET - - while nargs_spec: - nargs = _fetch(nargs_spec) - - if nargs is None: - continue - - if nargs == 1: - rv.append(_fetch(args)) # type: ignore[arg-type] - elif nargs > 1: - x = [_fetch(args) for _ in range(nargs)] - - # If we're reversed, we're pulling in the arguments in reverse, - # so we need to turn them around. - if spos is not None: - x.reverse() - - rv.append(tuple(x)) - elif nargs < 0: - if spos is not None: - raise TypeError("Cannot have two nargs < 0") - - spos = len(rv) - rv.append(UNSET) - - # spos is the position of the wildcard (star). If it's not `None`, - # we fill it with the remainder. - if spos is not None: - rv[spos] = tuple(args) - args = [] - rv[spos + 1 :] = reversed(rv[spos + 1 :]) - - return tuple(rv), list(args) - - -def _split_opt(opt: str) -> tuple[str, str]: - first = opt[:1] - if first.isalnum(): - return "", opt - if opt[1:2] == first: - return opt[:2], opt[2:] - return first, opt[1:] - - -def _normalize_opt(opt: str, ctx: Context | None) -> str: - if ctx is None or ctx.token_normalize_func is None: - return opt - prefix, opt = _split_opt(opt) - return f"{prefix}{ctx.token_normalize_func(opt)}" - - -class _Option: - def __init__( - self, - obj: CoreOption, - opts: cabc.Sequence[str], - dest: str | None, - action: str | None = None, - nargs: int = 1, - const: t.Any | None = None, - ): - self._short_opts = [] - self._long_opts = [] - self.prefixes: set[str] = set() - - for opt in opts: - prefix, value = _split_opt(opt) - if not prefix: - raise ValueError(f"Invalid start character for option ({opt})") - self.prefixes.add(prefix[0]) - if len(prefix) == 1 and len(value) == 1: - self._short_opts.append(opt) - else: - self._long_opts.append(opt) - self.prefixes.add(prefix) - - if action is None: - action = "store" - - self.dest = dest - self.action = action - self.nargs = nargs - self.const = const - self.obj = obj - - @property - def takes_value(self) -> bool: - return self.action in ("store", "append") - - def process(self, value: t.Any, state: _ParsingState) -> None: - if self.action == "store": - state.opts[self.dest] = value # type: ignore - elif self.action == "store_const": - state.opts[self.dest] = self.const # type: ignore - elif self.action == "append": - state.opts.setdefault(self.dest, []).append(value) # type: ignore - elif self.action == "append_const": - state.opts.setdefault(self.dest, []).append(self.const) # type: ignore - elif self.action == "count": - state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 # type: ignore - else: - raise ValueError(f"unknown action '{self.action}'") - state.order.append(self.obj) - - -class _Argument: - def __init__(self, obj: CoreArgument, dest: str | None, nargs: int = 1): - self.dest = dest - self.nargs = nargs - self.obj = obj - - def process( - self, - value: str | cabc.Sequence[str | None] | None | T_UNSET, - state: _ParsingState, - ) -> None: - if self.nargs > 1: - assert isinstance(value, cabc.Sequence) - holes = sum(1 for x in value if x is UNSET) - if holes == len(value): - value = UNSET - elif holes != 0: - raise BadArgumentUsage( - _("Argument {name!r} takes {nargs} values.").format( - name=self.dest, nargs=self.nargs - ) - ) - - # We failed to collect any argument value so we consider the argument as unset. - if value == (): - value = UNSET - - state.opts[self.dest] = value # type: ignore - state.order.append(self.obj) - - -class _ParsingState: - def __init__(self, rargs: list[str]) -> None: - self.opts: dict[str, t.Any] = {} - self.largs: list[str] = [] - self.rargs = rargs - self.order: list[CoreParameter] = [] - - -class _OptionParser: - """The option parser is an internal class that is ultimately used to - parse options and arguments. It's modelled after optparse and brings - a similar but vastly simplified API. It should generally not be used - directly as the high level Click classes wrap it for you. - - It's not nearly as extensible as optparse or argparse as it does not - implement features that are implemented on a higher level (such as - types or defaults). - - :param ctx: optionally the :class:`~click.Context` where this parser - should go with. - - .. deprecated:: 8.2 - Will be removed in Click 9.0. - """ - - def __init__(self, ctx: Context | None = None) -> None: - #: The :class:`~click.Context` for this parser. This might be - #: `None` for some advanced use cases. - self.ctx = ctx - #: This controls how the parser deals with interspersed arguments. - #: If this is set to `False`, the parser will stop on the first - #: non-option. Click uses this to implement nested subcommands - #: safely. - self.allow_interspersed_args: bool = True - #: This tells the parser how to deal with unknown options. By - #: default it will error out (which is sensible), but there is a - #: second mode where it will ignore it and continue processing - #: after shifting all the unknown options into the resulting args. - self.ignore_unknown_options: bool = False - - if ctx is not None: - self.allow_interspersed_args = ctx.allow_interspersed_args - self.ignore_unknown_options = ctx.ignore_unknown_options - - self._short_opt: dict[str, _Option] = {} - self._long_opt: dict[str, _Option] = {} - self._opt_prefixes = {"-", "--"} - self._args: list[_Argument] = [] - - def add_option( - self, - obj: CoreOption, - opts: cabc.Sequence[str], - dest: str | None, - action: str | None = None, - nargs: int = 1, - const: t.Any | None = None, - ) -> None: - """Adds a new option named `dest` to the parser. The destination - is not inferred (unlike with optparse) and needs to be explicitly - provided. Action can be any of ``store``, ``store_const``, - ``append``, ``append_const`` or ``count``. - - The `obj` can be used to identify the option in the order list - that is returned from the parser. - """ - opts = [_normalize_opt(opt, self.ctx) for opt in opts] - option = _Option(obj, opts, dest, action=action, nargs=nargs, const=const) - self._opt_prefixes.update(option.prefixes) - for opt in option._short_opts: - self._short_opt[opt] = option - for opt in option._long_opts: - self._long_opt[opt] = option - - def add_argument(self, obj: CoreArgument, dest: str | None, nargs: int = 1) -> None: - """Adds a positional argument named `dest` to the parser. - - The `obj` can be used to identify the option in the order list - that is returned from the parser. - """ - self._args.append(_Argument(obj, dest=dest, nargs=nargs)) - - def parse_args( - self, args: list[str] - ) -> tuple[dict[str, t.Any], list[str], list[CoreParameter]]: - """Parses positional arguments and returns ``(values, args, order)`` - for the parsed options and arguments as well as the leftover - arguments if there are any. The order is a list of objects as they - appear on the command line. If arguments appear multiple times they - will be memorized multiple times as well. - """ - state = _ParsingState(args) - try: - self._process_args_for_options(state) - self._process_args_for_args(state) - except UsageError: - if self.ctx is None or not self.ctx.resilient_parsing: - raise - return state.opts, state.largs, state.order - - def _process_args_for_args(self, state: _ParsingState) -> None: - pargs, args = _unpack_args( - state.largs + state.rargs, [x.nargs for x in self._args] - ) - - for idx, arg in enumerate(self._args): - arg.process(pargs[idx], state) - - state.largs = args - state.rargs = [] - - def _process_args_for_options(self, state: _ParsingState) -> None: - while state.rargs: - arg = state.rargs.pop(0) - arglen = len(arg) - # Double dashes always handled explicitly regardless of what - # prefixes are valid. - if arg == "--": - return - elif arg[:1] in self._opt_prefixes and arglen > 1: - self._process_opts(arg, state) - elif self.allow_interspersed_args: - state.largs.append(arg) - else: - state.rargs.insert(0, arg) - return - - # Say this is the original argument list: - # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] - # ^ - # (we are about to process arg(i)). - # - # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of - # [arg0, ..., arg(i-1)] (any options and their arguments will have - # been removed from largs). - # - # The while loop will usually consume 1 or more arguments per pass. - # If it consumes 1 (eg. arg is an option that takes no arguments), - # then after _process_arg() is done the situation is: - # - # largs = subset of [arg0, ..., arg(i)] - # rargs = [arg(i+1), ..., arg(N-1)] - # - # If allow_interspersed_args is false, largs will always be - # *empty* -- still a subset of [arg0, ..., arg(i-1)], but - # not a very interesting subset! - - def _match_long_opt( - self, opt: str, explicit_value: str | None, state: _ParsingState - ) -> None: - if opt not in self._long_opt: - from difflib import get_close_matches - - possibilities = get_close_matches(opt, self._long_opt) - raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) - - option = self._long_opt[opt] - if option.takes_value: - # At this point it's safe to modify rargs by injecting the - # explicit value, because no exception is raised in this - # branch. This means that the inserted value will be fully - # consumed. - if explicit_value is not None: - state.rargs.insert(0, explicit_value) - - value = self._get_value_from_state(opt, option, state) - - elif explicit_value is not None: - raise BadOptionUsage( - opt, _("Option {name!r} does not take a value.").format(name=opt) - ) - - else: - value = UNSET - - option.process(value, state) - - def _match_short_opt(self, arg: str, state: _ParsingState) -> None: - stop = False - i = 1 - prefix = arg[0] - unknown_options = [] - - for ch in arg[1:]: - opt = _normalize_opt(f"{prefix}{ch}", self.ctx) - option = self._short_opt.get(opt) - i += 1 - - if not option: - if self.ignore_unknown_options: - unknown_options.append(ch) - continue - raise NoSuchOption(opt, ctx=self.ctx) - if option.takes_value: - # Any characters left in arg? Pretend they're the - # next arg, and stop consuming characters of arg. - if i < len(arg): - state.rargs.insert(0, arg[i:]) - stop = True - - value = self._get_value_from_state(opt, option, state) - - else: - value = UNSET - - option.process(value, state) - - if stop: - break - - # If we got any unknown options we recombine the string of the - # remaining options and re-attach the prefix, then report that - # to the state as new larg. This way there is basic combinatorics - # that can be achieved while still ignoring unknown arguments. - if self.ignore_unknown_options and unknown_options: - state.largs.append(f"{prefix}{''.join(unknown_options)}") - - def _get_value_from_state( - self, option_name: str, option: _Option, state: _ParsingState - ) -> str | cabc.Sequence[str] | T_FLAG_NEEDS_VALUE: - nargs = option.nargs - - value: str | cabc.Sequence[str] | T_FLAG_NEEDS_VALUE - - if len(state.rargs) < nargs: - if option.obj._flag_needs_value: - # Option allows omitting the value. - value = FLAG_NEEDS_VALUE - else: - raise BadOptionUsage( - option_name, - ngettext( - "Option {name!r} requires an argument.", - "Option {name!r} requires {nargs} arguments.", - nargs, - ).format(name=option_name, nargs=nargs), - ) - elif nargs == 1: - next_rarg = state.rargs[0] - - if ( - option.obj._flag_needs_value - and isinstance(next_rarg, str) - and next_rarg[:1] in self._opt_prefixes - and len(next_rarg) > 1 - ): - # The next arg looks like the start of an option, don't - # use it as the value if omitting the value is allowed. - value = FLAG_NEEDS_VALUE - else: - value = state.rargs.pop(0) - else: - value = tuple(state.rargs[:nargs]) - del state.rargs[:nargs] - - return value - - def _process_opts(self, arg: str, state: _ParsingState) -> None: - explicit_value = None - # Long option handling happens in two parts. The first part is - # supporting explicitly attached values. In any case, we will try - # to long match the option first. - if "=" in arg: - long_opt, explicit_value = arg.split("=", 1) - else: - long_opt = arg - norm_long_opt = _normalize_opt(long_opt, self.ctx) - - # At this point we will match the (assumed) long option through - # the long option matching code. Note that this allows options - # like "-foo" to be matched as long options. - try: - self._match_long_opt(norm_long_opt, explicit_value, state) - except NoSuchOption: - # At this point the long option matching failed, and we need - # to try with short options. However there is a special rule - # which says, that if we have a two character options prefix - # (applies to "--foo" for instance), we do not dispatch to the - # short option code and will instead raise the no option - # error. - if arg[:2] not in self._opt_prefixes: - self._match_short_opt(arg, state) - return - - if not self.ignore_unknown_options: - raise - - state.largs.append(arg) - - -def __getattr__(name: str) -> object: - import warnings - - if name in { - "OptionParser", - "Argument", - "Option", - "split_opt", - "normalize_opt", - "ParsingState", - }: - warnings.warn( - f"'parser.{name}' is deprecated and will be removed in Click 9.0." - " The old parser is available in 'optparse'.", - DeprecationWarning, - stacklevel=2, - ) - return globals()[f"_{name}"] - - if name == "split_arg_string": - from .shell_completion import split_arg_string - - warnings.warn( - "Importing 'parser.split_arg_string' is deprecated, it will only be" - " available in 'shell_completion' in Click 9.0.", - DeprecationWarning, - stacklevel=2, - ) - return split_arg_string - - raise AttributeError(name) diff --git a/venv/lib/python3.12/site-packages/click/py.typed b/venv/lib/python3.12/site-packages/click/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/venv/lib/python3.12/site-packages/click/shell_completion.py b/venv/lib/python3.12/site-packages/click/shell_completion.py deleted file mode 100644 index 8f1564c4..00000000 --- a/venv/lib/python3.12/site-packages/click/shell_completion.py +++ /dev/null @@ -1,667 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import os -import re -import typing as t -from gettext import gettext as _ - -from .core import Argument -from .core import Command -from .core import Context -from .core import Group -from .core import Option -from .core import Parameter -from .core import ParameterSource -from .utils import echo - - -def shell_complete( - cli: Command, - ctx_args: cabc.MutableMapping[str, t.Any], - prog_name: str, - complete_var: str, - instruction: str, -) -> int: - """Perform shell completion for the given CLI program. - - :param cli: Command being called. - :param ctx_args: Extra arguments to pass to - ``cli.make_context``. - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. - :param instruction: Value of ``complete_var`` with the completion - instruction and shell, in the form ``instruction_shell``. - :return: Status code to exit with. - """ - shell, _, instruction = instruction.partition("_") - comp_cls = get_completion_class(shell) - - if comp_cls is None: - return 1 - - comp = comp_cls(cli, ctx_args, prog_name, complete_var) - - if instruction == "source": - echo(comp.source()) - return 0 - - if instruction == "complete": - echo(comp.complete()) - return 0 - - return 1 - - -class CompletionItem: - """Represents a completion value and metadata about the value. The - default metadata is ``type`` to indicate special shell handling, - and ``help`` if a shell supports showing a help string next to the - value. - - Arbitrary parameters can be passed when creating the object, and - accessed using ``item.attr``. If an attribute wasn't passed, - accessing it returns ``None``. - - :param value: The completion suggestion. - :param type: Tells the shell script to provide special completion - support for the type. Click uses ``"dir"`` and ``"file"``. - :param help: String shown next to the value if supported. - :param kwargs: Arbitrary metadata. The built-in implementations - don't use this, but custom type completions paired with custom - shell support could use it. - """ - - __slots__ = ("value", "type", "help", "_info") - - def __init__( - self, - value: t.Any, - type: str = "plain", - help: str | None = None, - **kwargs: t.Any, - ) -> None: - self.value: t.Any = value - self.type: str = type - self.help: str | None = help - self._info = kwargs - - def __getattr__(self, name: str) -> t.Any: - return self._info.get(name) - - -# Only Bash >= 4.4 has the nosort option. -_SOURCE_BASH = """\ -%(complete_func)s() { - local IFS=$'\\n' - local response - - response=$(env COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \ -%(complete_var)s=bash_complete $1) - - for completion in $response; do - IFS=',' read type value <<< "$completion" - - if [[ $type == 'dir' ]]; then - COMPREPLY=() - compopt -o dirnames - elif [[ $type == 'file' ]]; then - COMPREPLY=() - compopt -o default - elif [[ $type == 'plain' ]]; then - COMPREPLY+=($value) - fi - done - - return 0 -} - -%(complete_func)s_setup() { - complete -o nosort -F %(complete_func)s %(prog_name)s -} - -%(complete_func)s_setup; -""" - -# See ZshComplete.format_completion below, and issue #2703, before -# changing this script. -# -# (TL;DR: _describe is picky about the format, but this Zsh script snippet -# is already widely deployed. So freeze this script, and use clever-ish -# handling of colons in ZshComplet.format_completion.) -_SOURCE_ZSH = """\ -#compdef %(prog_name)s - -%(complete_func)s() { - local -a completions - local -a completions_with_descriptions - local -a response - (( ! $+commands[%(prog_name)s] )) && return 1 - - response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) \ -%(complete_var)s=zsh_complete %(prog_name)s)}") - - for type key descr in ${response}; do - if [[ "$type" == "plain" ]]; then - if [[ "$descr" == "_" ]]; then - completions+=("$key") - else - completions_with_descriptions+=("$key":"$descr") - fi - elif [[ "$type" == "dir" ]]; then - _path_files -/ - elif [[ "$type" == "file" ]]; then - _path_files -f - fi - done - - if [ -n "$completions_with_descriptions" ]; then - _describe -V unsorted completions_with_descriptions -U - fi - - if [ -n "$completions" ]; then - compadd -U -V unsorted -a completions - fi -} - -if [[ $zsh_eval_context[-1] == loadautofunc ]]; then - # autoload from fpath, call function directly - %(complete_func)s "$@" -else - # eval/source/. command, register function for later - compdef %(complete_func)s %(prog_name)s -fi -""" - -_SOURCE_FISH = """\ -function %(complete_func)s; - set -l response (env %(complete_var)s=fish_complete COMP_WORDS=(commandline -cp) \ -COMP_CWORD=(commandline -t) %(prog_name)s); - - for completion in $response; - set -l metadata (string split "," $completion); - - if test $metadata[1] = "dir"; - __fish_complete_directories $metadata[2]; - else if test $metadata[1] = "file"; - __fish_complete_path $metadata[2]; - else if test $metadata[1] = "plain"; - echo $metadata[2]; - end; - end; -end; - -complete --no-files --command %(prog_name)s --arguments \ -"(%(complete_func)s)"; -""" - - -class ShellComplete: - """Base class for providing shell completion support. A subclass for - a given shell will override attributes and methods to implement the - completion instructions (``source`` and ``complete``). - - :param cli: Command being called. - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. - - .. versionadded:: 8.0 - """ - - name: t.ClassVar[str] - """Name to register the shell as with :func:`add_completion_class`. - This is used in completion instructions (``{name}_source`` and - ``{name}_complete``). - """ - - source_template: t.ClassVar[str] - """Completion script template formatted by :meth:`source`. This must - be provided by subclasses. - """ - - def __init__( - self, - cli: Command, - ctx_args: cabc.MutableMapping[str, t.Any], - prog_name: str, - complete_var: str, - ) -> None: - self.cli = cli - self.ctx_args = ctx_args - self.prog_name = prog_name - self.complete_var = complete_var - - @property - def func_name(self) -> str: - """The name of the shell function defined by the completion - script. - """ - safe_name = re.sub(r"\W*", "", self.prog_name.replace("-", "_"), flags=re.ASCII) - return f"_{safe_name}_completion" - - def source_vars(self) -> dict[str, t.Any]: - """Vars for formatting :attr:`source_template`. - - By default this provides ``complete_func``, ``complete_var``, - and ``prog_name``. - """ - return { - "complete_func": self.func_name, - "complete_var": self.complete_var, - "prog_name": self.prog_name, - } - - def source(self) -> str: - """Produce the shell script that defines the completion - function. By default this ``%``-style formats - :attr:`source_template` with the dict returned by - :meth:`source_vars`. - """ - return self.source_template % self.source_vars() - - def get_completion_args(self) -> tuple[list[str], str]: - """Use the env vars defined by the shell script to return a - tuple of ``args, incomplete``. This must be implemented by - subclasses. - """ - raise NotImplementedError - - def get_completions(self, args: list[str], incomplete: str) -> list[CompletionItem]: - """Determine the context and last complete command or parameter - from the complete args. Call that object's ``shell_complete`` - method to get the completions for the incomplete value. - - :param args: List of complete args before the incomplete value. - :param incomplete: Value being completed. May be empty. - """ - ctx = _resolve_context(self.cli, self.ctx_args, self.prog_name, args) - obj, incomplete = _resolve_incomplete(ctx, args, incomplete) - return obj.shell_complete(ctx, incomplete) - - def format_completion(self, item: CompletionItem) -> str: - """Format a completion item into the form recognized by the - shell script. This must be implemented by subclasses. - - :param item: Completion item to format. - """ - raise NotImplementedError - - def complete(self) -> str: - """Produce the completion data to send back to the shell. - - By default this calls :meth:`get_completion_args`, gets the - completions, then calls :meth:`format_completion` for each - completion. - """ - args, incomplete = self.get_completion_args() - completions = self.get_completions(args, incomplete) - out = [self.format_completion(item) for item in completions] - return "\n".join(out) - - -class BashComplete(ShellComplete): - """Shell completion for Bash.""" - - name = "bash" - source_template = _SOURCE_BASH - - @staticmethod - def _check_version() -> None: - import shutil - import subprocess - - bash_exe = shutil.which("bash") - - if bash_exe is None: - match = None - else: - output = subprocess.run( - [bash_exe, "--norc", "-c", 'echo "${BASH_VERSION}"'], - stdout=subprocess.PIPE, - ) - match = re.search(r"^(\d+)\.(\d+)\.\d+", output.stdout.decode()) - - if match is not None: - major, minor = match.groups() - - if major < "4" or major == "4" and minor < "4": - echo( - _( - "Shell completion is not supported for Bash" - " versions older than 4.4." - ), - err=True, - ) - else: - echo( - _("Couldn't detect Bash version, shell completion is not supported."), - err=True, - ) - - def source(self) -> str: - self._check_version() - return super().source() - - def get_completion_args(self) -> tuple[list[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - cword = int(os.environ["COMP_CWORD"]) - args = cwords[1:cword] - - try: - incomplete = cwords[cword] - except IndexError: - incomplete = "" - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - return f"{item.type},{item.value}" - - -class ZshComplete(ShellComplete): - """Shell completion for Zsh.""" - - name = "zsh" - source_template = _SOURCE_ZSH - - def get_completion_args(self) -> tuple[list[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - cword = int(os.environ["COMP_CWORD"]) - args = cwords[1:cword] - - try: - incomplete = cwords[cword] - except IndexError: - incomplete = "" - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - help_ = item.help or "_" - # The zsh completion script uses `_describe` on items with help - # texts (which splits the item help from the item value at the - # first unescaped colon) and `compadd` on items without help - # text (which uses the item value as-is and does not support - # colon escaping). So escape colons in the item value if and - # only if the item help is not the sentinel "_" value, as used - # by the completion script. - # - # (The zsh completion script is potentially widely deployed, and - # thus harder to fix than this method.) - # - # See issue #1812 and issue #2703 for further context. - value = item.value.replace(":", r"\:") if help_ != "_" else item.value - return f"{item.type}\n{value}\n{help_}" - - -class FishComplete(ShellComplete): - """Shell completion for Fish.""" - - name = "fish" - source_template = _SOURCE_FISH - - def get_completion_args(self) -> tuple[list[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - incomplete = os.environ["COMP_CWORD"] - if incomplete: - incomplete = split_arg_string(incomplete)[0] - args = cwords[1:] - - # Fish stores the partial word in both COMP_WORDS and - # COMP_CWORD, remove it from complete args. - if incomplete and args and args[-1] == incomplete: - args.pop() - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - if item.help: - return f"{item.type},{item.value}\t{item.help}" - - return f"{item.type},{item.value}" - - -ShellCompleteType = t.TypeVar("ShellCompleteType", bound="type[ShellComplete]") - - -_available_shells: dict[str, type[ShellComplete]] = { - "bash": BashComplete, - "fish": FishComplete, - "zsh": ZshComplete, -} - - -def add_completion_class( - cls: ShellCompleteType, name: str | None = None -) -> ShellCompleteType: - """Register a :class:`ShellComplete` subclass under the given name. - The name will be provided by the completion instruction environment - variable during completion. - - :param cls: The completion class that will handle completion for the - shell. - :param name: Name to register the class under. Defaults to the - class's ``name`` attribute. - """ - if name is None: - name = cls.name - - _available_shells[name] = cls - - return cls - - -def get_completion_class(shell: str) -> type[ShellComplete] | None: - """Look up a registered :class:`ShellComplete` subclass by the name - provided by the completion instruction environment variable. If the - name isn't registered, returns ``None``. - - :param shell: Name the class is registered under. - """ - return _available_shells.get(shell) - - -def split_arg_string(string: str) -> list[str]: - """Split an argument string as with :func:`shlex.split`, but don't - fail if the string is incomplete. Ignores a missing closing quote or - incomplete escape sequence and uses the partial token as-is. - - .. code-block:: python - - split_arg_string("example 'my file") - ["example", "my file"] - - split_arg_string("example my\\") - ["example", "my"] - - :param string: String to split. - - .. versionchanged:: 8.2 - Moved to ``shell_completion`` from ``parser``. - """ - import shlex - - lex = shlex.shlex(string, posix=True) - lex.whitespace_split = True - lex.commenters = "" - out = [] - - try: - for token in lex: - out.append(token) - except ValueError: - # Raised when end-of-string is reached in an invalid state. Use - # the partial token as-is. The quote or escape character is in - # lex.state, not lex.token. - out.append(lex.token) - - return out - - -def _is_incomplete_argument(ctx: Context, param: Parameter) -> bool: - """Determine if the given parameter is an argument that can still - accept values. - - :param ctx: Invocation context for the command represented by the - parsed complete args. - :param param: Argument object being checked. - """ - if not isinstance(param, Argument): - return False - - assert param.name is not None - # Will be None if expose_value is False. - value = ctx.params.get(param.name) - return ( - param.nargs == -1 - or ctx.get_parameter_source(param.name) is not ParameterSource.COMMANDLINE - or ( - param.nargs > 1 - and isinstance(value, (tuple, list)) - and len(value) < param.nargs - ) - ) - - -def _start_of_option(ctx: Context, value: str) -> bool: - """Check if the value looks like the start of an option.""" - if not value: - return False - - c = value[0] - return c in ctx._opt_prefixes - - -def _is_incomplete_option(ctx: Context, args: list[str], param: Parameter) -> bool: - """Determine if the given parameter is an option that needs a value. - - :param args: List of complete args before the incomplete value. - :param param: Option object being checked. - """ - if not isinstance(param, Option): - return False - - if param.is_flag or param.count: - return False - - last_option = None - - for index, arg in enumerate(reversed(args)): - if index + 1 > param.nargs: - break - - if _start_of_option(ctx, arg): - last_option = arg - break - - return last_option is not None and last_option in param.opts - - -def _resolve_context( - cli: Command, - ctx_args: cabc.MutableMapping[str, t.Any], - prog_name: str, - args: list[str], -) -> Context: - """Produce the context hierarchy starting with the command and - traversing the complete arguments. This only follows the commands, - it doesn't trigger input prompts or callbacks. - - :param cli: Command being called. - :param prog_name: Name of the executable in the shell. - :param args: List of complete args before the incomplete value. - """ - ctx_args["resilient_parsing"] = True - with cli.make_context(prog_name, args.copy(), **ctx_args) as ctx: - args = ctx._protected_args + ctx.args - - while args: - command = ctx.command - - if isinstance(command, Group): - if not command.chain: - name, cmd, args = command.resolve_command(ctx, args) - - if cmd is None: - return ctx - - with cmd.make_context( - name, args, parent=ctx, resilient_parsing=True - ) as sub_ctx: - ctx = sub_ctx - args = ctx._protected_args + ctx.args - else: - sub_ctx = ctx - - while args: - name, cmd, args = command.resolve_command(ctx, args) - - if cmd is None: - return ctx - - with cmd.make_context( - name, - args, - parent=ctx, - allow_extra_args=True, - allow_interspersed_args=False, - resilient_parsing=True, - ) as sub_sub_ctx: - sub_ctx = sub_sub_ctx - args = sub_ctx.args - - ctx = sub_ctx - args = [*sub_ctx._protected_args, *sub_ctx.args] - else: - break - - return ctx - - -def _resolve_incomplete( - ctx: Context, args: list[str], incomplete: str -) -> tuple[Command | Parameter, str]: - """Find the Click object that will handle the completion of the - incomplete value. Return the object and the incomplete value. - - :param ctx: Invocation context for the command represented by - the parsed complete args. - :param args: List of complete args before the incomplete value. - :param incomplete: Value being completed. May be empty. - """ - # Different shells treat an "=" between a long option name and - # value differently. Might keep the value joined, return the "=" - # as a separate item, or return the split name and value. Always - # split and discard the "=" to make completion easier. - if incomplete == "=": - incomplete = "" - elif "=" in incomplete and _start_of_option(ctx, incomplete): - name, _, incomplete = incomplete.partition("=") - args.append(name) - - # The "--" marker tells Click to stop treating values as options - # even if they start with the option character. If it hasn't been - # given and the incomplete arg looks like an option, the current - # command will provide option name completions. - if "--" not in args and _start_of_option(ctx, incomplete): - return ctx.command, incomplete - - params = ctx.command.get_params(ctx) - - # If the last complete arg is an option name with an incomplete - # value, the option will provide value completions. - for param in params: - if _is_incomplete_option(ctx, args, param): - return param, incomplete - - # It's not an option name or value. The first argument without a - # parsed value will provide value completions. - for param in params: - if _is_incomplete_argument(ctx, param): - return param, incomplete - - # There were no unparsed arguments, the command may be a group that - # will provide command name completions. - return ctx.command, incomplete diff --git a/venv/lib/python3.12/site-packages/click/termui.py b/venv/lib/python3.12/site-packages/click/termui.py deleted file mode 100644 index 2e98a077..00000000 --- a/venv/lib/python3.12/site-packages/click/termui.py +++ /dev/null @@ -1,883 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import inspect -import io -import itertools -import sys -import typing as t -from contextlib import AbstractContextManager -from gettext import gettext as _ - -from ._compat import isatty -from ._compat import strip_ansi -from .exceptions import Abort -from .exceptions import UsageError -from .globals import resolve_color_default -from .types import Choice -from .types import convert_type -from .types import ParamType -from .utils import echo -from .utils import LazyFile - -if t.TYPE_CHECKING: - from ._termui_impl import ProgressBar - -V = t.TypeVar("V") - -# The prompt functions to use. The doc tools currently override these -# functions to customize how they work. -visible_prompt_func: t.Callable[[str], str] = input - -_ansi_colors = { - "black": 30, - "red": 31, - "green": 32, - "yellow": 33, - "blue": 34, - "magenta": 35, - "cyan": 36, - "white": 37, - "reset": 39, - "bright_black": 90, - "bright_red": 91, - "bright_green": 92, - "bright_yellow": 93, - "bright_blue": 94, - "bright_magenta": 95, - "bright_cyan": 96, - "bright_white": 97, -} -_ansi_reset_all = "\033[0m" - - -def hidden_prompt_func(prompt: str) -> str: - import getpass - - return getpass.getpass(prompt) - - -def _build_prompt( - text: str, - suffix: str, - show_default: bool = False, - default: t.Any | None = None, - show_choices: bool = True, - type: ParamType | None = None, -) -> str: - prompt = text - if type is not None and show_choices and isinstance(type, Choice): - prompt += f" ({', '.join(map(str, type.choices))})" - if default is not None and show_default: - prompt = f"{prompt} [{_format_default(default)}]" - return f"{prompt}{suffix}" - - -def _format_default(default: t.Any) -> t.Any: - if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): - return default.name - - return default - - -def prompt( - text: str, - default: t.Any | None = None, - hide_input: bool = False, - confirmation_prompt: bool | str = False, - type: ParamType | t.Any | None = None, - value_proc: t.Callable[[str], t.Any] | None = None, - prompt_suffix: str = ": ", - show_default: bool = True, - err: bool = False, - show_choices: bool = True, -) -> t.Any: - """Prompts a user for input. This is a convenience function that can - be used to prompt a user for input later. - - If the user aborts the input by sending an interrupt signal, this - function will catch it and raise a :exc:`Abort` exception. - - :param text: the text to show for the prompt. - :param default: the default value to use if no input happens. If this - is not given it will prompt until it's aborted. - :param hide_input: if this is set to true then the input value will - be hidden. - :param confirmation_prompt: Prompt a second time to confirm the - value. Can be set to a string instead of ``True`` to customize - the message. - :param type: the type to use to check the value against. - :param value_proc: if this parameter is provided it's a function that - is invoked instead of the type conversion to - convert a value. - :param prompt_suffix: a suffix that should be added to the prompt. - :param show_default: shows or hides the default value in the prompt. - :param err: if set to true the file defaults to ``stderr`` instead of - ``stdout``, the same as with echo. - :param show_choices: Show or hide choices if the passed type is a Choice. - For example if type is a Choice of either day or week, - show_choices is true and text is "Group by" then the - prompt will be "Group by (day, week): ". - - .. versionchanged:: 8.3.1 - A space is no longer appended to the prompt. - - .. versionadded:: 8.0 - ``confirmation_prompt`` can be a custom string. - - .. versionadded:: 7.0 - Added the ``show_choices`` parameter. - - .. versionadded:: 6.0 - Added unicode support for cmd.exe on Windows. - - .. versionadded:: 4.0 - Added the `err` parameter. - - """ - - def prompt_func(text: str) -> str: - f = hidden_prompt_func if hide_input else visible_prompt_func - try: - # Write the prompt separately so that we get nice - # coloring through colorama on Windows - echo(text[:-1], nl=False, err=err) - # Echo the last character to stdout to work around an issue where - # readline causes backspace to clear the whole line. - return f(text[-1:]) - except (KeyboardInterrupt, EOFError): - # getpass doesn't print a newline if the user aborts input with ^C. - # Allegedly this behavior is inherited from getpass(3). - # A doc bug has been filed at https://bugs.python.org/issue24711 - if hide_input: - echo(None, err=err) - raise Abort() from None - - if value_proc is None: - value_proc = convert_type(type, default) - - prompt = _build_prompt( - text, prompt_suffix, show_default, default, show_choices, type - ) - - if confirmation_prompt: - if confirmation_prompt is True: - confirmation_prompt = _("Repeat for confirmation") - - confirmation_prompt = _build_prompt(confirmation_prompt, prompt_suffix) - - while True: - while True: - value = prompt_func(prompt) - if value: - break - elif default is not None: - value = default - break - try: - result = value_proc(value) - except UsageError as e: - if hide_input: - echo(_("Error: The value you entered was invalid."), err=err) - else: - echo(_("Error: {e.message}").format(e=e), err=err) - continue - if not confirmation_prompt: - return result - while True: - value2 = prompt_func(confirmation_prompt) - is_empty = not value and not value2 - if value2 or is_empty: - break - if value == value2: - return result - echo(_("Error: The two entered values do not match."), err=err) - - -def confirm( - text: str, - default: bool | None = False, - abort: bool = False, - prompt_suffix: str = ": ", - show_default: bool = True, - err: bool = False, -) -> bool: - """Prompts for confirmation (yes/no question). - - If the user aborts the input by sending a interrupt signal this - function will catch it and raise a :exc:`Abort` exception. - - :param text: the question to ask. - :param default: The default value to use when no input is given. If - ``None``, repeat until input is given. - :param abort: if this is set to `True` a negative answer aborts the - exception by raising :exc:`Abort`. - :param prompt_suffix: a suffix that should be added to the prompt. - :param show_default: shows or hides the default value in the prompt. - :param err: if set to true the file defaults to ``stderr`` instead of - ``stdout``, the same as with echo. - - .. versionchanged:: 8.3.1 - A space is no longer appended to the prompt. - - .. versionchanged:: 8.0 - Repeat until input is given if ``default`` is ``None``. - - .. versionadded:: 4.0 - Added the ``err`` parameter. - """ - prompt = _build_prompt( - text, - prompt_suffix, - show_default, - "y/n" if default is None else ("Y/n" if default else "y/N"), - ) - - while True: - try: - # Write the prompt separately so that we get nice - # coloring through colorama on Windows - echo(prompt[:-1], nl=False, err=err) - # Echo the last character to stdout to work around an issue where - # readline causes backspace to clear the whole line. - value = visible_prompt_func(prompt[-1:]).lower().strip() - except (KeyboardInterrupt, EOFError): - raise Abort() from None - if value in ("y", "yes"): - rv = True - elif value in ("n", "no"): - rv = False - elif default is not None and value == "": - rv = default - else: - echo(_("Error: invalid input"), err=err) - continue - break - if abort and not rv: - raise Abort() - return rv - - -def echo_via_pager( - text_or_generator: cabc.Iterable[str] | t.Callable[[], cabc.Iterable[str]] | str, - color: bool | None = None, -) -> None: - """This function takes a text and shows it via an environment specific - pager on stdout. - - .. versionchanged:: 3.0 - Added the `color` flag. - - :param text_or_generator: the text to page, or alternatively, a - generator emitting the text to page. - :param color: controls if the pager supports ANSI colors or not. The - default is autodetection. - """ - color = resolve_color_default(color) - - if inspect.isgeneratorfunction(text_or_generator): - i = t.cast("t.Callable[[], cabc.Iterable[str]]", text_or_generator)() - elif isinstance(text_or_generator, str): - i = [text_or_generator] - else: - i = iter(t.cast("cabc.Iterable[str]", text_or_generator)) - - # convert every element of i to a text type if necessary - text_generator = (el if isinstance(el, str) else str(el) for el in i) - - from ._termui_impl import pager - - return pager(itertools.chain(text_generator, "\n"), color) - - -@t.overload -def progressbar( - *, - length: int, - label: str | None = None, - hidden: bool = False, - show_eta: bool = True, - show_percent: bool | None = None, - show_pos: bool = False, - fill_char: str = "#", - empty_char: str = "-", - bar_template: str = "%(label)s [%(bar)s] %(info)s", - info_sep: str = " ", - width: int = 36, - file: t.TextIO | None = None, - color: bool | None = None, - update_min_steps: int = 1, -) -> ProgressBar[int]: ... - - -@t.overload -def progressbar( - iterable: cabc.Iterable[V] | None = None, - length: int | None = None, - label: str | None = None, - hidden: bool = False, - show_eta: bool = True, - show_percent: bool | None = None, - show_pos: bool = False, - item_show_func: t.Callable[[V | None], str | None] | None = None, - fill_char: str = "#", - empty_char: str = "-", - bar_template: str = "%(label)s [%(bar)s] %(info)s", - info_sep: str = " ", - width: int = 36, - file: t.TextIO | None = None, - color: bool | None = None, - update_min_steps: int = 1, -) -> ProgressBar[V]: ... - - -def progressbar( - iterable: cabc.Iterable[V] | None = None, - length: int | None = None, - label: str | None = None, - hidden: bool = False, - show_eta: bool = True, - show_percent: bool | None = None, - show_pos: bool = False, - item_show_func: t.Callable[[V | None], str | None] | None = None, - fill_char: str = "#", - empty_char: str = "-", - bar_template: str = "%(label)s [%(bar)s] %(info)s", - info_sep: str = " ", - width: int = 36, - file: t.TextIO | None = None, - color: bool | None = None, - update_min_steps: int = 1, -) -> ProgressBar[V]: - """This function creates an iterable context manager that can be used - to iterate over something while showing a progress bar. It will - either iterate over the `iterable` or `length` items (that are counted - up). While iteration happens, this function will print a rendered - progress bar to the given `file` (defaults to stdout) and will attempt - to calculate remaining time and more. By default, this progress bar - will not be rendered if the file is not a terminal. - - The context manager creates the progress bar. When the context - manager is entered the progress bar is already created. With every - iteration over the progress bar, the iterable passed to the bar is - advanced and the bar is updated. When the context manager exits, - a newline is printed and the progress bar is finalized on screen. - - Note: The progress bar is currently designed for use cases where the - total progress can be expected to take at least several seconds. - Because of this, the ProgressBar class object won't display - progress that is considered too fast, and progress where the time - between steps is less than a second. - - No printing must happen or the progress bar will be unintentionally - destroyed. - - Example usage:: - - with progressbar(items) as bar: - for item in bar: - do_something_with(item) - - Alternatively, if no iterable is specified, one can manually update the - progress bar through the `update()` method instead of directly - iterating over the progress bar. The update method accepts the number - of steps to increment the bar with:: - - with progressbar(length=chunks.total_bytes) as bar: - for chunk in chunks: - process_chunk(chunk) - bar.update(chunks.bytes) - - The ``update()`` method also takes an optional value specifying the - ``current_item`` at the new position. This is useful when used - together with ``item_show_func`` to customize the output for each - manual step:: - - with click.progressbar( - length=total_size, - label='Unzipping archive', - item_show_func=lambda a: a.filename - ) as bar: - for archive in zip_file: - archive.extract() - bar.update(archive.size, archive) - - :param iterable: an iterable to iterate over. If not provided the length - is required. - :param length: the number of items to iterate over. By default the - progressbar will attempt to ask the iterator about its - length, which might or might not work. If an iterable is - also provided this parameter can be used to override the - length. If an iterable is not provided the progress bar - will iterate over a range of that length. - :param label: the label to show next to the progress bar. - :param hidden: hide the progressbar. Defaults to ``False``. When no tty is - detected, it will only print the progressbar label. Setting this to - ``False`` also disables that. - :param show_eta: enables or disables the estimated time display. This is - automatically disabled if the length cannot be - determined. - :param show_percent: enables or disables the percentage display. The - default is `True` if the iterable has a length or - `False` if not. - :param show_pos: enables or disables the absolute position display. The - default is `False`. - :param item_show_func: A function called with the current item which - can return a string to show next to the progress bar. If the - function returns ``None`` nothing is shown. The current item can - be ``None``, such as when entering and exiting the bar. - :param fill_char: the character to use to show the filled part of the - progress bar. - :param empty_char: the character to use to show the non-filled part of - the progress bar. - :param bar_template: the format string to use as template for the bar. - The parameters in it are ``label`` for the label, - ``bar`` for the progress bar and ``info`` for the - info section. - :param info_sep: the separator between multiple info items (eta etc.) - :param width: the width of the progress bar in characters, 0 means full - terminal width - :param file: The file to write to. If this is not a terminal then - only the label is printed. - :param color: controls if the terminal supports ANSI colors or not. The - default is autodetection. This is only needed if ANSI - codes are included anywhere in the progress bar output - which is not the case by default. - :param update_min_steps: Render only when this many updates have - completed. This allows tuning for very fast iterators. - - .. versionadded:: 8.2 - The ``hidden`` argument. - - .. versionchanged:: 8.0 - Output is shown even if execution time is less than 0.5 seconds. - - .. versionchanged:: 8.0 - ``item_show_func`` shows the current item, not the previous one. - - .. versionchanged:: 8.0 - Labels are echoed if the output is not a TTY. Reverts a change - in 7.0 that removed all output. - - .. versionadded:: 8.0 - The ``update_min_steps`` parameter. - - .. versionadded:: 4.0 - The ``color`` parameter and ``update`` method. - - .. versionadded:: 2.0 - """ - from ._termui_impl import ProgressBar - - color = resolve_color_default(color) - return ProgressBar( - iterable=iterable, - length=length, - hidden=hidden, - show_eta=show_eta, - show_percent=show_percent, - show_pos=show_pos, - item_show_func=item_show_func, - fill_char=fill_char, - empty_char=empty_char, - bar_template=bar_template, - info_sep=info_sep, - file=file, - label=label, - width=width, - color=color, - update_min_steps=update_min_steps, - ) - - -def clear() -> None: - """Clears the terminal screen. This will have the effect of clearing - the whole visible space of the terminal and moving the cursor to the - top left. This does not do anything if not connected to a terminal. - - .. versionadded:: 2.0 - """ - if not isatty(sys.stdout): - return - - # ANSI escape \033[2J clears the screen, \033[1;1H moves the cursor - echo("\033[2J\033[1;1H", nl=False) - - -def _interpret_color(color: int | tuple[int, int, int] | str, offset: int = 0) -> str: - if isinstance(color, int): - return f"{38 + offset};5;{color:d}" - - if isinstance(color, (tuple, list)): - r, g, b = color - return f"{38 + offset};2;{r:d};{g:d};{b:d}" - - return str(_ansi_colors[color] + offset) - - -def style( - text: t.Any, - fg: int | tuple[int, int, int] | str | None = None, - bg: int | tuple[int, int, int] | str | None = None, - bold: bool | None = None, - dim: bool | None = None, - underline: bool | None = None, - overline: bool | None = None, - italic: bool | None = None, - blink: bool | None = None, - reverse: bool | None = None, - strikethrough: bool | None = None, - reset: bool = True, -) -> str: - """Styles a text with ANSI styles and returns the new string. By - default the styling is self contained which means that at the end - of the string a reset code is issued. This can be prevented by - passing ``reset=False``. - - Examples:: - - click.echo(click.style('Hello World!', fg='green')) - click.echo(click.style('ATTENTION!', blink=True)) - click.echo(click.style('Some things', reverse=True, fg='cyan')) - click.echo(click.style('More colors', fg=(255, 12, 128), bg=117)) - - Supported color names: - - * ``black`` (might be a gray) - * ``red`` - * ``green`` - * ``yellow`` (might be an orange) - * ``blue`` - * ``magenta`` - * ``cyan`` - * ``white`` (might be light gray) - * ``bright_black`` - * ``bright_red`` - * ``bright_green`` - * ``bright_yellow`` - * ``bright_blue`` - * ``bright_magenta`` - * ``bright_cyan`` - * ``bright_white`` - * ``reset`` (reset the color code only) - - If the terminal supports it, color may also be specified as: - - - An integer in the interval [0, 255]. The terminal must support - 8-bit/256-color mode. - - An RGB tuple of three integers in [0, 255]. The terminal must - support 24-bit/true-color mode. - - See https://en.wikipedia.org/wiki/ANSI_color and - https://gist.github.com/XVilka/8346728 for more information. - - :param text: the string to style with ansi codes. - :param fg: if provided this will become the foreground color. - :param bg: if provided this will become the background color. - :param bold: if provided this will enable or disable bold mode. - :param dim: if provided this will enable or disable dim mode. This is - badly supported. - :param underline: if provided this will enable or disable underline. - :param overline: if provided this will enable or disable overline. - :param italic: if provided this will enable or disable italic. - :param blink: if provided this will enable or disable blinking. - :param reverse: if provided this will enable or disable inverse - rendering (foreground becomes background and the - other way round). - :param strikethrough: if provided this will enable or disable - striking through text. - :param reset: by default a reset-all code is added at the end of the - string which means that styles do not carry over. This - can be disabled to compose styles. - - .. versionchanged:: 8.0 - A non-string ``message`` is converted to a string. - - .. versionchanged:: 8.0 - Added support for 256 and RGB color codes. - - .. versionchanged:: 8.0 - Added the ``strikethrough``, ``italic``, and ``overline`` - parameters. - - .. versionchanged:: 7.0 - Added support for bright colors. - - .. versionadded:: 2.0 - """ - if not isinstance(text, str): - text = str(text) - - bits = [] - - if fg: - try: - bits.append(f"\033[{_interpret_color(fg)}m") - except KeyError: - raise TypeError(f"Unknown color {fg!r}") from None - - if bg: - try: - bits.append(f"\033[{_interpret_color(bg, 10)}m") - except KeyError: - raise TypeError(f"Unknown color {bg!r}") from None - - if bold is not None: - bits.append(f"\033[{1 if bold else 22}m") - if dim is not None: - bits.append(f"\033[{2 if dim else 22}m") - if underline is not None: - bits.append(f"\033[{4 if underline else 24}m") - if overline is not None: - bits.append(f"\033[{53 if overline else 55}m") - if italic is not None: - bits.append(f"\033[{3 if italic else 23}m") - if blink is not None: - bits.append(f"\033[{5 if blink else 25}m") - if reverse is not None: - bits.append(f"\033[{7 if reverse else 27}m") - if strikethrough is not None: - bits.append(f"\033[{9 if strikethrough else 29}m") - bits.append(text) - if reset: - bits.append(_ansi_reset_all) - return "".join(bits) - - -def unstyle(text: str) -> str: - """Removes ANSI styling information from a string. Usually it's not - necessary to use this function as Click's echo function will - automatically remove styling if necessary. - - .. versionadded:: 2.0 - - :param text: the text to remove style information from. - """ - return strip_ansi(text) - - -def secho( - message: t.Any | None = None, - file: t.IO[t.AnyStr] | None = None, - nl: bool = True, - err: bool = False, - color: bool | None = None, - **styles: t.Any, -) -> None: - """This function combines :func:`echo` and :func:`style` into one - call. As such the following two calls are the same:: - - click.secho('Hello World!', fg='green') - click.echo(click.style('Hello World!', fg='green')) - - All keyword arguments are forwarded to the underlying functions - depending on which one they go with. - - Non-string types will be converted to :class:`str`. However, - :class:`bytes` are passed directly to :meth:`echo` without applying - style. If you want to style bytes that represent text, call - :meth:`bytes.decode` first. - - .. versionchanged:: 8.0 - A non-string ``message`` is converted to a string. Bytes are - passed through without style applied. - - .. versionadded:: 2.0 - """ - if message is not None and not isinstance(message, (bytes, bytearray)): - message = style(message, **styles) - - return echo(message, file=file, nl=nl, err=err, color=color) - - -@t.overload -def edit( - text: bytes | bytearray, - editor: str | None = None, - env: cabc.Mapping[str, str] | None = None, - require_save: bool = False, - extension: str = ".txt", -) -> bytes | None: ... - - -@t.overload -def edit( - text: str, - editor: str | None = None, - env: cabc.Mapping[str, str] | None = None, - require_save: bool = True, - extension: str = ".txt", -) -> str | None: ... - - -@t.overload -def edit( - text: None = None, - editor: str | None = None, - env: cabc.Mapping[str, str] | None = None, - require_save: bool = True, - extension: str = ".txt", - filename: str | cabc.Iterable[str] | None = None, -) -> None: ... - - -def edit( - text: str | bytes | bytearray | None = None, - editor: str | None = None, - env: cabc.Mapping[str, str] | None = None, - require_save: bool = True, - extension: str = ".txt", - filename: str | cabc.Iterable[str] | None = None, -) -> str | bytes | bytearray | None: - r"""Edits the given text in the defined editor. If an editor is given - (should be the full path to the executable but the regular operating - system search path is used for finding the executable) it overrides - the detected editor. Optionally, some environment variables can be - used. If the editor is closed without changes, `None` is returned. In - case a file is edited directly the return value is always `None` and - `require_save` and `extension` are ignored. - - If the editor cannot be opened a :exc:`UsageError` is raised. - - Note for Windows: to simplify cross-platform usage, the newlines are - automatically converted from POSIX to Windows and vice versa. As such, - the message here will have ``\n`` as newline markers. - - :param text: the text to edit. - :param editor: optionally the editor to use. Defaults to automatic - detection. - :param env: environment variables to forward to the editor. - :param require_save: if this is true, then not saving in the editor - will make the return value become `None`. - :param extension: the extension to tell the editor about. This defaults - to `.txt` but changing this might change syntax - highlighting. - :param filename: if provided it will edit this file instead of the - provided text contents. It will not use a temporary - file as an indirection in that case. If the editor supports - editing multiple files at once, a sequence of files may be - passed as well. Invoke `click.file` once per file instead - if multiple files cannot be managed at once or editing the - files serially is desired. - - .. versionchanged:: 8.2.0 - ``filename`` now accepts any ``Iterable[str]`` in addition to a ``str`` - if the ``editor`` supports editing multiple files at once. - - """ - from ._termui_impl import Editor - - ed = Editor(editor=editor, env=env, require_save=require_save, extension=extension) - - if filename is None: - return ed.edit(text) - - if isinstance(filename, str): - filename = (filename,) - - ed.edit_files(filenames=filename) - return None - - -def launch(url: str, wait: bool = False, locate: bool = False) -> int: - """This function launches the given URL (or filename) in the default - viewer application for this file type. If this is an executable, it - might launch the executable in a new session. The return value is - the exit code of the launched application. Usually, ``0`` indicates - success. - - Examples:: - - click.launch('https://click.palletsprojects.com/') - click.launch('/my/downloaded/file', locate=True) - - .. versionadded:: 2.0 - - :param url: URL or filename of the thing to launch. - :param wait: Wait for the program to exit before returning. This - only works if the launched program blocks. In particular, - ``xdg-open`` on Linux does not block. - :param locate: if this is set to `True` then instead of launching the - application associated with the URL it will attempt to - launch a file manager with the file located. This - might have weird effects if the URL does not point to - the filesystem. - """ - from ._termui_impl import open_url - - return open_url(url, wait=wait, locate=locate) - - -# If this is provided, getchar() calls into this instead. This is used -# for unittesting purposes. -_getchar: t.Callable[[bool], str] | None = None - - -def getchar(echo: bool = False) -> str: - """Fetches a single character from the terminal and returns it. This - will always return a unicode character and under certain rare - circumstances this might return more than one character. The - situations which more than one character is returned is when for - whatever reason multiple characters end up in the terminal buffer or - standard input was not actually a terminal. - - Note that this will always read from the terminal, even if something - is piped into the standard input. - - Note for Windows: in rare cases when typing non-ASCII characters, this - function might wait for a second character and then return both at once. - This is because certain Unicode characters look like special-key markers. - - .. versionadded:: 2.0 - - :param echo: if set to `True`, the character read will also show up on - the terminal. The default is to not show it. - """ - global _getchar - - if _getchar is None: - from ._termui_impl import getchar as f - - _getchar = f - - return _getchar(echo) - - -def raw_terminal() -> AbstractContextManager[int]: - from ._termui_impl import raw_terminal as f - - return f() - - -def pause(info: str | None = None, err: bool = False) -> None: - """This command stops execution and waits for the user to press any - key to continue. This is similar to the Windows batch "pause" - command. If the program is not run through a terminal, this command - will instead do nothing. - - .. versionadded:: 2.0 - - .. versionadded:: 4.0 - Added the `err` parameter. - - :param info: The message to print before pausing. Defaults to - ``"Press any key to continue..."``. - :param err: if set to message goes to ``stderr`` instead of - ``stdout``, the same as with echo. - """ - if not isatty(sys.stdin) or not isatty(sys.stdout): - return - - if info is None: - info = _("Press any key to continue...") - - try: - if info: - echo(info, nl=False, err=err) - try: - getchar() - except (KeyboardInterrupt, EOFError): - pass - finally: - if info: - echo(err=err) diff --git a/venv/lib/python3.12/site-packages/click/testing.py b/venv/lib/python3.12/site-packages/click/testing.py deleted file mode 100644 index f6f60b80..00000000 --- a/venv/lib/python3.12/site-packages/click/testing.py +++ /dev/null @@ -1,577 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import contextlib -import io -import os -import shlex -import sys -import tempfile -import typing as t -from types import TracebackType - -from . import _compat -from . import formatting -from . import termui -from . import utils -from ._compat import _find_binary_reader - -if t.TYPE_CHECKING: - from _typeshed import ReadableBuffer - - from .core import Command - - -class EchoingStdin: - def __init__(self, input: t.BinaryIO, output: t.BinaryIO) -> None: - self._input = input - self._output = output - self._paused = False - - def __getattr__(self, x: str) -> t.Any: - return getattr(self._input, x) - - def _echo(self, rv: bytes) -> bytes: - if not self._paused: - self._output.write(rv) - - return rv - - def read(self, n: int = -1) -> bytes: - return self._echo(self._input.read(n)) - - def read1(self, n: int = -1) -> bytes: - return self._echo(self._input.read1(n)) # type: ignore - - def readline(self, n: int = -1) -> bytes: - return self._echo(self._input.readline(n)) - - def readlines(self) -> list[bytes]: - return [self._echo(x) for x in self._input.readlines()] - - def __iter__(self) -> cabc.Iterator[bytes]: - return iter(self._echo(x) for x in self._input) - - def __repr__(self) -> str: - return repr(self._input) - - -@contextlib.contextmanager -def _pause_echo(stream: EchoingStdin | None) -> cabc.Iterator[None]: - if stream is None: - yield - else: - stream._paused = True - yield - stream._paused = False - - -class BytesIOCopy(io.BytesIO): - """Patch ``io.BytesIO`` to let the written stream be copied to another. - - .. versionadded:: 8.2 - """ - - def __init__(self, copy_to: io.BytesIO) -> None: - super().__init__() - self.copy_to = copy_to - - def flush(self) -> None: - super().flush() - self.copy_to.flush() - - def write(self, b: ReadableBuffer) -> int: - self.copy_to.write(b) - return super().write(b) - - -class StreamMixer: - """Mixes `` and `` streams. - - The result is available in the ``output`` attribute. - - .. versionadded:: 8.2 - """ - - def __init__(self) -> None: - self.output: io.BytesIO = io.BytesIO() - self.stdout: io.BytesIO = BytesIOCopy(copy_to=self.output) - self.stderr: io.BytesIO = BytesIOCopy(copy_to=self.output) - - def __del__(self) -> None: - """ - Guarantee that embedded file-like objects are closed in a - predictable order, protecting against races between - self.output being closed and other streams being flushed on close - - .. versionadded:: 8.2.2 - """ - self.stderr.close() - self.stdout.close() - self.output.close() - - -class _NamedTextIOWrapper(io.TextIOWrapper): - def __init__( - self, buffer: t.BinaryIO, name: str, mode: str, **kwargs: t.Any - ) -> None: - super().__init__(buffer, **kwargs) - self._name = name - self._mode = mode - - @property - def name(self) -> str: - return self._name - - @property - def mode(self) -> str: - return self._mode - - -def make_input_stream( - input: str | bytes | t.IO[t.Any] | None, charset: str -) -> t.BinaryIO: - # Is already an input stream. - if hasattr(input, "read"): - rv = _find_binary_reader(t.cast("t.IO[t.Any]", input)) - - if rv is not None: - return rv - - raise TypeError("Could not find binary reader for input stream.") - - if input is None: - input = b"" - elif isinstance(input, str): - input = input.encode(charset) - - return io.BytesIO(input) - - -class Result: - """Holds the captured result of an invoked CLI script. - - :param runner: The runner that created the result - :param stdout_bytes: The standard output as bytes. - :param stderr_bytes: The standard error as bytes. - :param output_bytes: A mix of ``stdout_bytes`` and ``stderr_bytes``, as the - user would see it in its terminal. - :param return_value: The value returned from the invoked command. - :param exit_code: The exit code as integer. - :param exception: The exception that happened if one did. - :param exc_info: Exception information (exception type, exception instance, - traceback type). - - .. versionchanged:: 8.2 - ``stderr_bytes`` no longer optional, ``output_bytes`` introduced and - ``mix_stderr`` has been removed. - - .. versionadded:: 8.0 - Added ``return_value``. - """ - - def __init__( - self, - runner: CliRunner, - stdout_bytes: bytes, - stderr_bytes: bytes, - output_bytes: bytes, - return_value: t.Any, - exit_code: int, - exception: BaseException | None, - exc_info: tuple[type[BaseException], BaseException, TracebackType] - | None = None, - ): - self.runner = runner - self.stdout_bytes = stdout_bytes - self.stderr_bytes = stderr_bytes - self.output_bytes = output_bytes - self.return_value = return_value - self.exit_code = exit_code - self.exception = exception - self.exc_info = exc_info - - @property - def output(self) -> str: - """The terminal output as unicode string, as the user would see it. - - .. versionchanged:: 8.2 - No longer a proxy for ``self.stdout``. Now has its own independent stream - that is mixing `` and ``, in the order they were written. - """ - return self.output_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - @property - def stdout(self) -> str: - """The standard output as unicode string.""" - return self.stdout_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - @property - def stderr(self) -> str: - """The standard error as unicode string. - - .. versionchanged:: 8.2 - No longer raise an exception, always returns the `` string. - """ - return self.stderr_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - def __repr__(self) -> str: - exc_str = repr(self.exception) if self.exception else "okay" - return f"<{type(self).__name__} {exc_str}>" - - -class CliRunner: - """The CLI runner provides functionality to invoke a Click command line - script for unittesting purposes in a isolated environment. This only - works in single-threaded systems without any concurrency as it changes the - global interpreter state. - - :param charset: the character set for the input and output data. - :param env: a dictionary with environment variables for overriding. - :param echo_stdin: if this is set to `True`, then reading from `` writes - to ``. This is useful for showing examples in - some circumstances. Note that regular prompts - will automatically echo the input. - :param catch_exceptions: Whether to catch any exceptions other than - ``SystemExit`` when running :meth:`~CliRunner.invoke`. - - .. versionchanged:: 8.2 - Added the ``catch_exceptions`` parameter. - - .. versionchanged:: 8.2 - ``mix_stderr`` parameter has been removed. - """ - - def __init__( - self, - charset: str = "utf-8", - env: cabc.Mapping[str, str | None] | None = None, - echo_stdin: bool = False, - catch_exceptions: bool = True, - ) -> None: - self.charset = charset - self.env: cabc.Mapping[str, str | None] = env or {} - self.echo_stdin = echo_stdin - self.catch_exceptions = catch_exceptions - - def get_default_prog_name(self, cli: Command) -> str: - """Given a command object it will return the default program name - for it. The default is the `name` attribute or ``"root"`` if not - set. - """ - return cli.name or "root" - - def make_env( - self, overrides: cabc.Mapping[str, str | None] | None = None - ) -> cabc.Mapping[str, str | None]: - """Returns the environment overrides for invoking a script.""" - rv = dict(self.env) - if overrides: - rv.update(overrides) - return rv - - @contextlib.contextmanager - def isolation( - self, - input: str | bytes | t.IO[t.Any] | None = None, - env: cabc.Mapping[str, str | None] | None = None, - color: bool = False, - ) -> cabc.Iterator[tuple[io.BytesIO, io.BytesIO, io.BytesIO]]: - """A context manager that sets up the isolation for invoking of a - command line tool. This sets up `` with the given input data - and `os.environ` with the overrides from the given dictionary. - This also rebinds some internals in Click to be mocked (like the - prompt functionality). - - This is automatically done in the :meth:`invoke` method. - - :param input: the input stream to put into `sys.stdin`. - :param env: the environment overrides as dictionary. - :param color: whether the output should contain color codes. The - application can still override this explicitly. - - .. versionadded:: 8.2 - An additional output stream is returned, which is a mix of - `` and `` streams. - - .. versionchanged:: 8.2 - Always returns the `` stream. - - .. versionchanged:: 8.0 - `` is opened with ``errors="backslashreplace"`` - instead of the default ``"strict"``. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - """ - bytes_input = make_input_stream(input, self.charset) - echo_input = None - - old_stdin = sys.stdin - old_stdout = sys.stdout - old_stderr = sys.stderr - old_forced_width = formatting.FORCED_WIDTH - formatting.FORCED_WIDTH = 80 - - env = self.make_env(env) - - stream_mixer = StreamMixer() - - if self.echo_stdin: - bytes_input = echo_input = t.cast( - t.BinaryIO, EchoingStdin(bytes_input, stream_mixer.stdout) - ) - - sys.stdin = text_input = _NamedTextIOWrapper( - bytes_input, encoding=self.charset, name="", mode="r" - ) - - if self.echo_stdin: - # Force unbuffered reads, otherwise TextIOWrapper reads a - # large chunk which is echoed early. - text_input._CHUNK_SIZE = 1 # type: ignore - - sys.stdout = _NamedTextIOWrapper( - stream_mixer.stdout, encoding=self.charset, name="", mode="w" - ) - - sys.stderr = _NamedTextIOWrapper( - stream_mixer.stderr, - encoding=self.charset, - name="", - mode="w", - errors="backslashreplace", - ) - - @_pause_echo(echo_input) # type: ignore - def visible_input(prompt: str | None = None) -> str: - sys.stdout.write(prompt or "") - try: - val = next(text_input).rstrip("\r\n") - except StopIteration as e: - raise EOFError() from e - sys.stdout.write(f"{val}\n") - sys.stdout.flush() - return val - - @_pause_echo(echo_input) # type: ignore - def hidden_input(prompt: str | None = None) -> str: - sys.stdout.write(f"{prompt or ''}\n") - sys.stdout.flush() - try: - return next(text_input).rstrip("\r\n") - except StopIteration as e: - raise EOFError() from e - - @_pause_echo(echo_input) # type: ignore - def _getchar(echo: bool) -> str: - char = sys.stdin.read(1) - - if echo: - sys.stdout.write(char) - - sys.stdout.flush() - return char - - default_color = color - - def should_strip_ansi( - stream: t.IO[t.Any] | None = None, color: bool | None = None - ) -> bool: - if color is None: - return not default_color - return not color - - old_visible_prompt_func = termui.visible_prompt_func - old_hidden_prompt_func = termui.hidden_prompt_func - old__getchar_func = termui._getchar - old_should_strip_ansi = utils.should_strip_ansi # type: ignore - old__compat_should_strip_ansi = _compat.should_strip_ansi - termui.visible_prompt_func = visible_input - termui.hidden_prompt_func = hidden_input - termui._getchar = _getchar - utils.should_strip_ansi = should_strip_ansi # type: ignore - _compat.should_strip_ansi = should_strip_ansi - - old_env = {} - try: - for key, value in env.items(): - old_env[key] = os.environ.get(key) - if value is None: - try: - del os.environ[key] - except Exception: - pass - else: - os.environ[key] = value - yield (stream_mixer.stdout, stream_mixer.stderr, stream_mixer.output) - finally: - for key, value in old_env.items(): - if value is None: - try: - del os.environ[key] - except Exception: - pass - else: - os.environ[key] = value - sys.stdout = old_stdout - sys.stderr = old_stderr - sys.stdin = old_stdin - termui.visible_prompt_func = old_visible_prompt_func - termui.hidden_prompt_func = old_hidden_prompt_func - termui._getchar = old__getchar_func - utils.should_strip_ansi = old_should_strip_ansi # type: ignore - _compat.should_strip_ansi = old__compat_should_strip_ansi - formatting.FORCED_WIDTH = old_forced_width - - def invoke( - self, - cli: Command, - args: str | cabc.Sequence[str] | None = None, - input: str | bytes | t.IO[t.Any] | None = None, - env: cabc.Mapping[str, str | None] | None = None, - catch_exceptions: bool | None = None, - color: bool = False, - **extra: t.Any, - ) -> Result: - """Invokes a command in an isolated environment. The arguments are - forwarded directly to the command line script, the `extra` keyword - arguments are passed to the :meth:`~clickpkg.Command.main` function of - the command. - - This returns a :class:`Result` object. - - :param cli: the command to invoke - :param args: the arguments to invoke. It may be given as an iterable - or a string. When given as string it will be interpreted - as a Unix shell command. More details at - :func:`shlex.split`. - :param input: the input data for `sys.stdin`. - :param env: the environment overrides. - :param catch_exceptions: Whether to catch any other exceptions than - ``SystemExit``. If :data:`None`, the value - from :class:`CliRunner` is used. - :param extra: the keyword arguments to pass to :meth:`main`. - :param color: whether the output should contain color codes. The - application can still override this explicitly. - - .. versionadded:: 8.2 - The result object has the ``output_bytes`` attribute with - the mix of ``stdout_bytes`` and ``stderr_bytes``, as the user would - see it in its terminal. - - .. versionchanged:: 8.2 - The result object always returns the ``stderr_bytes`` stream. - - .. versionchanged:: 8.0 - The result object has the ``return_value`` attribute with - the value returned from the invoked command. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - - .. versionchanged:: 3.0 - Added the ``catch_exceptions`` parameter. - - .. versionchanged:: 3.0 - The result object has the ``exc_info`` attribute with the - traceback if available. - """ - exc_info = None - if catch_exceptions is None: - catch_exceptions = self.catch_exceptions - - with self.isolation(input=input, env=env, color=color) as outstreams: - return_value = None - exception: BaseException | None = None - exit_code = 0 - - if isinstance(args, str): - args = shlex.split(args) - - try: - prog_name = extra.pop("prog_name") - except KeyError: - prog_name = self.get_default_prog_name(cli) - - try: - return_value = cli.main(args=args or (), prog_name=prog_name, **extra) - except SystemExit as e: - exc_info = sys.exc_info() - e_code = t.cast("int | t.Any | None", e.code) - - if e_code is None: - e_code = 0 - - if e_code != 0: - exception = e - - if not isinstance(e_code, int): - sys.stdout.write(str(e_code)) - sys.stdout.write("\n") - e_code = 1 - - exit_code = e_code - - except Exception as e: - if not catch_exceptions: - raise - exception = e - exit_code = 1 - exc_info = sys.exc_info() - finally: - sys.stdout.flush() - sys.stderr.flush() - stdout = outstreams[0].getvalue() - stderr = outstreams[1].getvalue() - output = outstreams[2].getvalue() - - return Result( - runner=self, - stdout_bytes=stdout, - stderr_bytes=stderr, - output_bytes=output, - return_value=return_value, - exit_code=exit_code, - exception=exception, - exc_info=exc_info, # type: ignore - ) - - @contextlib.contextmanager - def isolated_filesystem( - self, temp_dir: str | os.PathLike[str] | None = None - ) -> cabc.Iterator[str]: - """A context manager that creates a temporary directory and - changes the current working directory to it. This isolates tests - that affect the contents of the CWD to prevent them from - interfering with each other. - - :param temp_dir: Create the temporary directory under this - directory. If given, the created directory is not removed - when exiting. - - .. versionchanged:: 8.0 - Added the ``temp_dir`` parameter. - """ - cwd = os.getcwd() - dt = tempfile.mkdtemp(dir=temp_dir) - os.chdir(dt) - - try: - yield dt - finally: - os.chdir(cwd) - - if temp_dir is None: - import shutil - - try: - shutil.rmtree(dt) - except OSError: - pass diff --git a/venv/lib/python3.12/site-packages/click/types.py b/venv/lib/python3.12/site-packages/click/types.py deleted file mode 100644 index e71c1c21..00000000 --- a/venv/lib/python3.12/site-packages/click/types.py +++ /dev/null @@ -1,1209 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import enum -import os -import stat -import sys -import typing as t -from datetime import datetime -from gettext import gettext as _ -from gettext import ngettext - -from ._compat import _get_argv_encoding -from ._compat import open_stream -from .exceptions import BadParameter -from .utils import format_filename -from .utils import LazyFile -from .utils import safecall - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .core import Context - from .core import Parameter - from .shell_completion import CompletionItem - -ParamTypeValue = t.TypeVar("ParamTypeValue") - - -class ParamType: - """Represents the type of a parameter. Validates and converts values - from the command line or Python into the correct type. - - To implement a custom type, subclass and implement at least the - following: - - - The :attr:`name` class attribute must be set. - - Calling an instance of the type with ``None`` must return - ``None``. This is already implemented by default. - - :meth:`convert` must convert string values to the correct type. - - :meth:`convert` must accept values that are already the correct - type. - - It must be able to convert a value if the ``ctx`` and ``param`` - arguments are ``None``. This can occur when converting prompt - input. - """ - - is_composite: t.ClassVar[bool] = False - arity: t.ClassVar[int] = 1 - - #: the descriptive name of this type - name: str - - #: if a list of this type is expected and the value is pulled from a - #: string environment variable, this is what splits it up. `None` - #: means any whitespace. For all parameters the general rule is that - #: whitespace splits them up. The exception are paths and files which - #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on - #: Windows). - envvar_list_splitter: t.ClassVar[str | None] = None - - def to_info_dict(self) -> dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - .. versionadded:: 8.0 - """ - # The class name without the "ParamType" suffix. - param_type = type(self).__name__.partition("ParamType")[0] - param_type = param_type.partition("ParameterType")[0] - - # Custom subclasses might not remember to set a name. - if hasattr(self, "name"): - name = self.name - else: - name = param_type - - return {"param_type": param_type, "name": name} - - def __call__( - self, - value: t.Any, - param: Parameter | None = None, - ctx: Context | None = None, - ) -> t.Any: - if value is not None: - return self.convert(value, param, ctx) - - def get_metavar(self, param: Parameter, ctx: Context) -> str | None: - """Returns the metavar default for this param if it provides one.""" - - def get_missing_message(self, param: Parameter, ctx: Context | None) -> str | None: - """Optionally might return extra information about a missing - parameter. - - .. versionadded:: 2.0 - """ - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - """Convert the value to the correct type. This is not called if - the value is ``None`` (the missing value). - - This must accept string values from the command line, as well as - values that are already the correct type. It may also convert - other compatible types. - - The ``param`` and ``ctx`` arguments may be ``None`` in certain - situations, such as when converting prompt input. - - If the value cannot be converted, call :meth:`fail` with a - descriptive message. - - :param value: The value to convert. - :param param: The parameter that is using this type to convert - its value. May be ``None``. - :param ctx: The current context that arrived at this value. May - be ``None``. - """ - return value - - def split_envvar_value(self, rv: str) -> cabc.Sequence[str]: - """Given a value from an environment variable this splits it up - into small chunks depending on the defined envvar list splitter. - - If the splitter is set to `None`, which means that whitespace splits, - then leading and trailing whitespace is ignored. Otherwise, leading - and trailing splitters usually lead to empty items being included. - """ - return (rv or "").split(self.envvar_list_splitter) - - def fail( - self, - message: str, - param: Parameter | None = None, - ctx: Context | None = None, - ) -> t.NoReturn: - """Helper method to fail with an invalid value message.""" - raise BadParameter(message, ctx=ctx, param=param) - - def shell_complete( - self, ctx: Context, param: Parameter, incomplete: str - ) -> list[CompletionItem]: - """Return a list of - :class:`~click.shell_completion.CompletionItem` objects for the - incomplete value. Most types do not provide completions, but - some do, and this allows custom types to provide custom - completions as well. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - return [] - - -class CompositeParamType(ParamType): - is_composite = True - - @property - def arity(self) -> int: # type: ignore - raise NotImplementedError() - - -class FuncParamType(ParamType): - def __init__(self, func: t.Callable[[t.Any], t.Any]) -> None: - self.name: str = func.__name__ - self.func = func - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["func"] = self.func - return info_dict - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - try: - return self.func(value) - except ValueError: - try: - value = str(value) - except UnicodeError: - value = value.decode("utf-8", "replace") - - self.fail(value, param, ctx) - - -class UnprocessedParamType(ParamType): - name = "text" - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - return value - - def __repr__(self) -> str: - return "UNPROCESSED" - - -class StringParamType(ParamType): - name = "text" - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - if isinstance(value, bytes): - enc = _get_argv_encoding() - try: - value = value.decode(enc) - except UnicodeError: - fs_enc = sys.getfilesystemencoding() - if fs_enc != enc: - try: - value = value.decode(fs_enc) - except UnicodeError: - value = value.decode("utf-8", "replace") - else: - value = value.decode("utf-8", "replace") - return value - return str(value) - - def __repr__(self) -> str: - return "STRING" - - -class Choice(ParamType, t.Generic[ParamTypeValue]): - """The choice type allows a value to be checked against a fixed set - of supported values. - - You may pass any iterable value which will be converted to a tuple - and thus will only be iterated once. - - The resulting value will always be one of the originally passed choices. - See :meth:`normalize_choice` for more info on the mapping of strings - to choices. See :ref:`choice-opts` for an example. - - :param case_sensitive: Set to false to make choices case - insensitive. Defaults to true. - - .. versionchanged:: 8.2.0 - Non-``str`` ``choices`` are now supported. It can additionally be any - iterable. Before you were not recommended to pass anything but a list or - tuple. - - .. versionadded:: 8.2.0 - Choice normalization can be overridden via :meth:`normalize_choice`. - """ - - name = "choice" - - def __init__( - self, choices: cabc.Iterable[ParamTypeValue], case_sensitive: bool = True - ) -> None: - self.choices: cabc.Sequence[ParamTypeValue] = tuple(choices) - self.case_sensitive = case_sensitive - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["choices"] = self.choices - info_dict["case_sensitive"] = self.case_sensitive - return info_dict - - def _normalized_mapping( - self, ctx: Context | None = None - ) -> cabc.Mapping[ParamTypeValue, str]: - """ - Returns mapping where keys are the original choices and the values are - the normalized values that are accepted via the command line. - - This is a simple wrapper around :meth:`normalize_choice`, use that - instead which is supported. - """ - return { - choice: self.normalize_choice( - choice=choice, - ctx=ctx, - ) - for choice in self.choices - } - - def normalize_choice(self, choice: ParamTypeValue, ctx: Context | None) -> str: - """ - Normalize a choice value, used to map a passed string to a choice. - Each choice must have a unique normalized value. - - By default uses :meth:`Context.token_normalize_func` and if not case - sensitive, convert it to a casefolded value. - - .. versionadded:: 8.2.0 - """ - normed_value = choice.name if isinstance(choice, enum.Enum) else str(choice) - - if ctx is not None and ctx.token_normalize_func is not None: - normed_value = ctx.token_normalize_func(normed_value) - - if not self.case_sensitive: - normed_value = normed_value.casefold() - - return normed_value - - def get_metavar(self, param: Parameter, ctx: Context) -> str | None: - if param.param_type_name == "option" and not param.show_choices: # type: ignore - choice_metavars = [ - convert_type(type(choice)).name.upper() for choice in self.choices - ] - choices_str = "|".join([*dict.fromkeys(choice_metavars)]) - else: - choices_str = "|".join( - [str(i) for i in self._normalized_mapping(ctx=ctx).values()] - ) - - # Use curly braces to indicate a required argument. - if param.required and param.param_type_name == "argument": - return f"{{{choices_str}}}" - - # Use square braces to indicate an option or optional argument. - return f"[{choices_str}]" - - def get_missing_message(self, param: Parameter, ctx: Context | None) -> str: - """ - Message shown when no choice is passed. - - .. versionchanged:: 8.2.0 Added ``ctx`` argument. - """ - return _("Choose from:\n\t{choices}").format( - choices=",\n\t".join(self._normalized_mapping(ctx=ctx).values()) - ) - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> ParamTypeValue: - """ - For a given value from the parser, normalize it and find its - matching normalized value in the list of choices. Then return the - matched "original" choice. - """ - normed_value = self.normalize_choice(choice=value, ctx=ctx) - normalized_mapping = self._normalized_mapping(ctx=ctx) - - try: - return next( - original - for original, normalized in normalized_mapping.items() - if normalized == normed_value - ) - except StopIteration: - self.fail( - self.get_invalid_choice_message(value=value, ctx=ctx), - param=param, - ctx=ctx, - ) - - def get_invalid_choice_message(self, value: t.Any, ctx: Context | None) -> str: - """Get the error message when the given choice is invalid. - - :param value: The invalid value. - - .. versionadded:: 8.2 - """ - choices_str = ", ".join(map(repr, self._normalized_mapping(ctx=ctx).values())) - return ngettext( - "{value!r} is not {choice}.", - "{value!r} is not one of {choices}.", - len(self.choices), - ).format(value=value, choice=choices_str, choices=choices_str) - - def __repr__(self) -> str: - return f"Choice({list(self.choices)})" - - def shell_complete( - self, ctx: Context, param: Parameter, incomplete: str - ) -> list[CompletionItem]: - """Complete choices that start with the incomplete value. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - str_choices = map(str, self.choices) - - if self.case_sensitive: - matched = (c for c in str_choices if c.startswith(incomplete)) - else: - incomplete = incomplete.lower() - matched = (c for c in str_choices if c.lower().startswith(incomplete)) - - return [CompletionItem(c) for c in matched] - - -class DateTime(ParamType): - """The DateTime type converts date strings into `datetime` objects. - - The format strings which are checked are configurable, but default to some - common (non-timezone aware) ISO 8601 formats. - - When specifying *DateTime* formats, you should only pass a list or a tuple. - Other iterables, like generators, may lead to surprising results. - - The format strings are processed using ``datetime.strptime``, and this - consequently defines the format strings which are allowed. - - Parsing is tried using each format, in order, and the first format which - parses successfully is used. - - :param formats: A list or tuple of date format strings, in the order in - which they should be tried. Defaults to - ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, - ``'%Y-%m-%d %H:%M:%S'``. - """ - - name = "datetime" - - def __init__(self, formats: cabc.Sequence[str] | None = None): - self.formats: cabc.Sequence[str] = formats or [ - "%Y-%m-%d", - "%Y-%m-%dT%H:%M:%S", - "%Y-%m-%d %H:%M:%S", - ] - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["formats"] = self.formats - return info_dict - - def get_metavar(self, param: Parameter, ctx: Context) -> str | None: - return f"[{'|'.join(self.formats)}]" - - def _try_to_convert_date(self, value: t.Any, format: str) -> datetime | None: - try: - return datetime.strptime(value, format) - except ValueError: - return None - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - if isinstance(value, datetime): - return value - - for format in self.formats: - converted = self._try_to_convert_date(value, format) - - if converted is not None: - return converted - - formats_str = ", ".join(map(repr, self.formats)) - self.fail( - ngettext( - "{value!r} does not match the format {format}.", - "{value!r} does not match the formats {formats}.", - len(self.formats), - ).format(value=value, format=formats_str, formats=formats_str), - param, - ctx, - ) - - def __repr__(self) -> str: - return "DateTime" - - -class _NumberParamTypeBase(ParamType): - _number_class: t.ClassVar[type[t.Any]] - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - try: - return self._number_class(value) - except ValueError: - self.fail( - _("{value!r} is not a valid {number_type}.").format( - value=value, number_type=self.name - ), - param, - ctx, - ) - - -class _NumberRangeBase(_NumberParamTypeBase): - def __init__( - self, - min: float | None = None, - max: float | None = None, - min_open: bool = False, - max_open: bool = False, - clamp: bool = False, - ) -> None: - self.min = min - self.max = max - self.min_open = min_open - self.max_open = max_open - self.clamp = clamp - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - min=self.min, - max=self.max, - min_open=self.min_open, - max_open=self.max_open, - clamp=self.clamp, - ) - return info_dict - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - import operator - - rv = super().convert(value, param, ctx) - lt_min: bool = self.min is not None and ( - operator.le if self.min_open else operator.lt - )(rv, self.min) - gt_max: bool = self.max is not None and ( - operator.ge if self.max_open else operator.gt - )(rv, self.max) - - if self.clamp: - if lt_min: - return self._clamp(self.min, 1, self.min_open) # type: ignore - - if gt_max: - return self._clamp(self.max, -1, self.max_open) # type: ignore - - if lt_min or gt_max: - self.fail( - _("{value} is not in the range {range}.").format( - value=rv, range=self._describe_range() - ), - param, - ctx, - ) - - return rv - - def _clamp(self, bound: float, dir: t.Literal[1, -1], open: bool) -> float: - """Find the valid value to clamp to bound in the given - direction. - - :param bound: The boundary value. - :param dir: 1 or -1 indicating the direction to move. - :param open: If true, the range does not include the bound. - """ - raise NotImplementedError - - def _describe_range(self) -> str: - """Describe the range for use in help text.""" - if self.min is None: - op = "<" if self.max_open else "<=" - return f"x{op}{self.max}" - - if self.max is None: - op = ">" if self.min_open else ">=" - return f"x{op}{self.min}" - - lop = "<" if self.min_open else "<=" - rop = "<" if self.max_open else "<=" - return f"{self.min}{lop}x{rop}{self.max}" - - def __repr__(self) -> str: - clamp = " clamped" if self.clamp else "" - return f"<{type(self).__name__} {self._describe_range()}{clamp}>" - - -class IntParamType(_NumberParamTypeBase): - name = "integer" - _number_class = int - - def __repr__(self) -> str: - return "INT" - - -class IntRange(_NumberRangeBase, IntParamType): - """Restrict an :data:`click.INT` value to a range of accepted - values. See :ref:`ranges`. - - If ``min`` or ``max`` are not passed, any value is accepted in that - direction. If ``min_open`` or ``max_open`` are enabled, the - corresponding boundary is not included in the range. - - If ``clamp`` is enabled, a value outside the range is clamped to the - boundary instead of failing. - - .. versionchanged:: 8.0 - Added the ``min_open`` and ``max_open`` parameters. - """ - - name = "integer range" - - def _clamp( # type: ignore - self, bound: int, dir: t.Literal[1, -1], open: bool - ) -> int: - if not open: - return bound - - return bound + dir - - -class FloatParamType(_NumberParamTypeBase): - name = "float" - _number_class = float - - def __repr__(self) -> str: - return "FLOAT" - - -class FloatRange(_NumberRangeBase, FloatParamType): - """Restrict a :data:`click.FLOAT` value to a range of accepted - values. See :ref:`ranges`. - - If ``min`` or ``max`` are not passed, any value is accepted in that - direction. If ``min_open`` or ``max_open`` are enabled, the - corresponding boundary is not included in the range. - - If ``clamp`` is enabled, a value outside the range is clamped to the - boundary instead of failing. This is not supported if either - boundary is marked ``open``. - - .. versionchanged:: 8.0 - Added the ``min_open`` and ``max_open`` parameters. - """ - - name = "float range" - - def __init__( - self, - min: float | None = None, - max: float | None = None, - min_open: bool = False, - max_open: bool = False, - clamp: bool = False, - ) -> None: - super().__init__( - min=min, max=max, min_open=min_open, max_open=max_open, clamp=clamp - ) - - if (min_open or max_open) and clamp: - raise TypeError("Clamping is not supported for open bounds.") - - def _clamp(self, bound: float, dir: t.Literal[1, -1], open: bool) -> float: - if not open: - return bound - - # Could use math.nextafter here, but clamping an - # open float range doesn't seem to be particularly useful. It's - # left up to the user to write a callback to do it if needed. - raise RuntimeError("Clamping is not supported for open bounds.") - - -class BoolParamType(ParamType): - name = "boolean" - - bool_states: dict[str, bool] = { - "1": True, - "0": False, - "yes": True, - "no": False, - "true": True, - "false": False, - "on": True, - "off": False, - "t": True, - "f": False, - "y": True, - "n": False, - # Absence of value is considered False. - "": False, - } - """A mapping of string values to boolean states. - - Mapping is inspired by :py:attr:`configparser.ConfigParser.BOOLEAN_STATES` - and extends it. - - .. caution:: - String values are lower-cased, as the ``str_to_bool`` comparison function - below is case-insensitive. - - .. warning:: - The mapping is not exhaustive, and does not cover all possible boolean strings - representations. It will remains as it is to avoid endless bikeshedding. - - Future work my be considered to make this mapping user-configurable from public - API. - """ - - @staticmethod - def str_to_bool(value: str | bool) -> bool | None: - """Convert a string to a boolean value. - - If the value is already a boolean, it is returned as-is. If the value is a - string, it is stripped of whitespaces and lower-cased, then checked against - the known boolean states pre-defined in the `BoolParamType.bool_states` mapping - above. - - Returns `None` if the value does not match any known boolean state. - """ - if isinstance(value, bool): - return value - return BoolParamType.bool_states.get(value.strip().lower()) - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> bool: - normalized = self.str_to_bool(value) - if normalized is None: - self.fail( - _( - "{value!r} is not a valid boolean. Recognized values: {states}" - ).format(value=value, states=", ".join(sorted(self.bool_states))), - param, - ctx, - ) - return normalized - - def __repr__(self) -> str: - return "BOOL" - - -class UUIDParameterType(ParamType): - name = "uuid" - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - import uuid - - if isinstance(value, uuid.UUID): - return value - - value = value.strip() - - try: - return uuid.UUID(value) - except ValueError: - self.fail( - _("{value!r} is not a valid UUID.").format(value=value), param, ctx - ) - - def __repr__(self) -> str: - return "UUID" - - -class File(ParamType): - """Declares a parameter to be a file for reading or writing. The file - is automatically closed once the context tears down (after the command - finished working). - - Files can be opened for reading or writing. The special value ``-`` - indicates stdin or stdout depending on the mode. - - By default, the file is opened for reading text data, but it can also be - opened in binary mode or for writing. The encoding parameter can be used - to force a specific encoding. - - The `lazy` flag controls if the file should be opened immediately or upon - first IO. The default is to be non-lazy for standard input and output - streams as well as files opened for reading, `lazy` otherwise. When opening a - file lazily for reading, it is still opened temporarily for validation, but - will not be held open until first IO. lazy is mainly useful when opening - for writing to avoid creating the file until it is needed. - - Files can also be opened atomically in which case all writes go into a - separate file in the same folder and upon completion the file will - be moved over to the original location. This is useful if a file - regularly read by other users is modified. - - See :ref:`file-args` for more information. - - .. versionchanged:: 2.0 - Added the ``atomic`` parameter. - """ - - name = "filename" - envvar_list_splitter: t.ClassVar[str] = os.path.pathsep - - def __init__( - self, - mode: str = "r", - encoding: str | None = None, - errors: str | None = "strict", - lazy: bool | None = None, - atomic: bool = False, - ) -> None: - self.mode = mode - self.encoding = encoding - self.errors = errors - self.lazy = lazy - self.atomic = atomic - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update(mode=self.mode, encoding=self.encoding) - return info_dict - - def resolve_lazy_flag(self, value: str | os.PathLike[str]) -> bool: - if self.lazy is not None: - return self.lazy - if os.fspath(value) == "-": - return False - elif "w" in self.mode: - return True - return False - - def convert( - self, - value: str | os.PathLike[str] | t.IO[t.Any], - param: Parameter | None, - ctx: Context | None, - ) -> t.IO[t.Any]: - if _is_file_like(value): - return value - - value = t.cast("str | os.PathLike[str]", value) - - try: - lazy = self.resolve_lazy_flag(value) - - if lazy: - lf = LazyFile( - value, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - - if ctx is not None: - ctx.call_on_close(lf.close_intelligently) - - return t.cast("t.IO[t.Any]", lf) - - f, should_close = open_stream( - value, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - - # If a context is provided, we automatically close the file - # at the end of the context execution (or flush out). If a - # context does not exist, it's the caller's responsibility to - # properly close the file. This for instance happens when the - # type is used with prompts. - if ctx is not None: - if should_close: - ctx.call_on_close(safecall(f.close)) - else: - ctx.call_on_close(safecall(f.flush)) - - return f - except OSError as e: - self.fail(f"'{format_filename(value)}': {e.strerror}", param, ctx) - - def shell_complete( - self, ctx: Context, param: Parameter, incomplete: str - ) -> list[CompletionItem]: - """Return a special completion marker that tells the completion - system to use the shell to provide file path completions. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - return [CompletionItem(incomplete, type="file")] - - -def _is_file_like(value: t.Any) -> te.TypeGuard[t.IO[t.Any]]: - return hasattr(value, "read") or hasattr(value, "write") - - -class Path(ParamType): - """The ``Path`` type is similar to the :class:`File` type, but - returns the filename instead of an open file. Various checks can be - enabled to validate the type of file and permissions. - - :param exists: The file or directory needs to exist for the value to - be valid. If this is not set to ``True``, and the file does not - exist, then all further checks are silently skipped. - :param file_okay: Allow a file as a value. - :param dir_okay: Allow a directory as a value. - :param readable: if true, a readable check is performed. - :param writable: if true, a writable check is performed. - :param executable: if true, an executable check is performed. - :param resolve_path: Make the value absolute and resolve any - symlinks. A ``~`` is not expanded, as this is supposed to be - done by the shell only. - :param allow_dash: Allow a single dash as a value, which indicates - a standard stream (but does not open it). Use - :func:`~click.open_file` to handle opening this value. - :param path_type: Convert the incoming path value to this type. If - ``None``, keep Python's default, which is ``str``. Useful to - convert to :class:`pathlib.Path`. - - .. versionchanged:: 8.1 - Added the ``executable`` parameter. - - .. versionchanged:: 8.0 - Allow passing ``path_type=pathlib.Path``. - - .. versionchanged:: 6.0 - Added the ``allow_dash`` parameter. - """ - - envvar_list_splitter: t.ClassVar[str] = os.path.pathsep - - def __init__( - self, - exists: bool = False, - file_okay: bool = True, - dir_okay: bool = True, - writable: bool = False, - readable: bool = True, - resolve_path: bool = False, - allow_dash: bool = False, - path_type: type[t.Any] | None = None, - executable: bool = False, - ): - self.exists = exists - self.file_okay = file_okay - self.dir_okay = dir_okay - self.readable = readable - self.writable = writable - self.executable = executable - self.resolve_path = resolve_path - self.allow_dash = allow_dash - self.type = path_type - - if self.file_okay and not self.dir_okay: - self.name: str = _("file") - elif self.dir_okay and not self.file_okay: - self.name = _("directory") - else: - self.name = _("path") - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - exists=self.exists, - file_okay=self.file_okay, - dir_okay=self.dir_okay, - writable=self.writable, - readable=self.readable, - allow_dash=self.allow_dash, - ) - return info_dict - - def coerce_path_result( - self, value: str | os.PathLike[str] - ) -> str | bytes | os.PathLike[str]: - if self.type is not None and not isinstance(value, self.type): - if self.type is str: - return os.fsdecode(value) - elif self.type is bytes: - return os.fsencode(value) - else: - return t.cast("os.PathLike[str]", self.type(value)) - - return value - - def convert( - self, - value: str | os.PathLike[str], - param: Parameter | None, - ctx: Context | None, - ) -> str | bytes | os.PathLike[str]: - rv = value - - is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-") - - if not is_dash: - if self.resolve_path: - rv = os.path.realpath(rv) - - try: - st = os.stat(rv) - except OSError: - if not self.exists: - return self.coerce_path_result(rv) - self.fail( - _("{name} {filename!r} does not exist.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if not self.file_okay and stat.S_ISREG(st.st_mode): - self.fail( - _("{name} {filename!r} is a file.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - if not self.dir_okay and stat.S_ISDIR(st.st_mode): - self.fail( - _("{name} {filename!r} is a directory.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if self.readable and not os.access(rv, os.R_OK): - self.fail( - _("{name} {filename!r} is not readable.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if self.writable and not os.access(rv, os.W_OK): - self.fail( - _("{name} {filename!r} is not writable.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if self.executable and not os.access(value, os.X_OK): - self.fail( - _("{name} {filename!r} is not executable.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - return self.coerce_path_result(rv) - - def shell_complete( - self, ctx: Context, param: Parameter, incomplete: str - ) -> list[CompletionItem]: - """Return a special completion marker that tells the completion - system to use the shell to provide path completions for only - directories or any paths. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - type = "dir" if self.dir_okay and not self.file_okay else "file" - return [CompletionItem(incomplete, type=type)] - - -class Tuple(CompositeParamType): - """The default behavior of Click is to apply a type on a value directly. - This works well in most cases, except for when `nargs` is set to a fixed - count and different types should be used for different items. In this - case the :class:`Tuple` type can be used. This type can only be used - if `nargs` is set to a fixed number. - - For more information see :ref:`tuple-type`. - - This can be selected by using a Python tuple literal as a type. - - :param types: a list of types that should be used for the tuple items. - """ - - def __init__(self, types: cabc.Sequence[type[t.Any] | ParamType]) -> None: - self.types: cabc.Sequence[ParamType] = [convert_type(ty) for ty in types] - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["types"] = [t.to_info_dict() for t in self.types] - return info_dict - - @property - def name(self) -> str: # type: ignore - return f"<{' '.join(ty.name for ty in self.types)}>" - - @property - def arity(self) -> int: # type: ignore - return len(self.types) - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - len_type = len(self.types) - len_value = len(value) - - if len_value != len_type: - self.fail( - ngettext( - "{len_type} values are required, but {len_value} was given.", - "{len_type} values are required, but {len_value} were given.", - len_value, - ).format(len_type=len_type, len_value=len_value), - param=param, - ctx=ctx, - ) - - return tuple( - ty(x, param, ctx) for ty, x in zip(self.types, value, strict=False) - ) - - -def convert_type(ty: t.Any | None, default: t.Any | None = None) -> ParamType: - """Find the most appropriate :class:`ParamType` for the given Python - type. If the type isn't provided, it can be inferred from a default - value. - """ - guessed_type = False - - if ty is None and default is not None: - if isinstance(default, (tuple, list)): - # If the default is empty, ty will remain None and will - # return STRING. - if default: - item = default[0] - - # A tuple of tuples needs to detect the inner types. - # Can't call convert recursively because that would - # incorrectly unwind the tuple to a single type. - if isinstance(item, (tuple, list)): - ty = tuple(map(type, item)) - else: - ty = type(item) - else: - ty = type(default) - - guessed_type = True - - if isinstance(ty, tuple): - return Tuple(ty) - - if isinstance(ty, ParamType): - return ty - - if ty is str or ty is None: - return STRING - - if ty is int: - return INT - - if ty is float: - return FLOAT - - if ty is bool: - return BOOL - - if guessed_type: - return STRING - - if __debug__: - try: - if issubclass(ty, ParamType): - raise AssertionError( - f"Attempted to use an uninstantiated parameter type ({ty})." - ) - except TypeError: - # ty is an instance (correct), so issubclass fails. - pass - - return FuncParamType(ty) - - -#: A dummy parameter type that just does nothing. From a user's -#: perspective this appears to just be the same as `STRING` but -#: internally no string conversion takes place if the input was bytes. -#: This is usually useful when working with file paths as they can -#: appear in bytes and unicode. -#: -#: For path related uses the :class:`Path` type is a better choice but -#: there are situations where an unprocessed type is useful which is why -#: it is is provided. -#: -#: .. versionadded:: 4.0 -UNPROCESSED = UnprocessedParamType() - -#: A unicode string parameter type which is the implicit default. This -#: can also be selected by using ``str`` as type. -STRING = StringParamType() - -#: An integer parameter. This can also be selected by using ``int`` as -#: type. -INT = IntParamType() - -#: A floating point value parameter. This can also be selected by using -#: ``float`` as type. -FLOAT = FloatParamType() - -#: A boolean parameter. This is the default for boolean flags. This can -#: also be selected by using ``bool`` as a type. -BOOL = BoolParamType() - -#: A UUID parameter. -UUID = UUIDParameterType() - - -class OptionHelpExtra(t.TypedDict, total=False): - envvars: tuple[str, ...] - default: str - range: str - required: str diff --git a/venv/lib/python3.12/site-packages/click/utils.py b/venv/lib/python3.12/site-packages/click/utils.py deleted file mode 100644 index beae26f7..00000000 --- a/venv/lib/python3.12/site-packages/click/utils.py +++ /dev/null @@ -1,627 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import os -import re -import sys -import typing as t -from functools import update_wrapper -from types import ModuleType -from types import TracebackType - -from ._compat import _default_text_stderr -from ._compat import _default_text_stdout -from ._compat import _find_binary_writer -from ._compat import auto_wrap_for_ansi -from ._compat import binary_streams -from ._compat import open_stream -from ._compat import should_strip_ansi -from ._compat import strip_ansi -from ._compat import text_streams -from ._compat import WIN -from .globals import resolve_color_default - -if t.TYPE_CHECKING: - import typing_extensions as te - - P = te.ParamSpec("P") - -R = t.TypeVar("R") - - -def _posixify(name: str) -> str: - return "-".join(name.split()).lower() - - -def safecall(func: t.Callable[P, R]) -> t.Callable[P, R | None]: - """Wraps a function so that it swallows exceptions.""" - - def wrapper(*args: P.args, **kwargs: P.kwargs) -> R | None: - try: - return func(*args, **kwargs) - except Exception: - pass - return None - - return update_wrapper(wrapper, func) - - -def make_str(value: t.Any) -> str: - """Converts a value into a valid string.""" - if isinstance(value, bytes): - try: - return value.decode(sys.getfilesystemencoding()) - except UnicodeError: - return value.decode("utf-8", "replace") - return str(value) - - -def make_default_short_help(help: str, max_length: int = 45) -> str: - """Returns a condensed version of help string.""" - # Consider only the first paragraph. - paragraph_end = help.find("\n\n") - - if paragraph_end != -1: - help = help[:paragraph_end] - - # Collapse newlines, tabs, and spaces. - words = help.split() - - if not words: - return "" - - # The first paragraph started with a "no rewrap" marker, ignore it. - if words[0] == "\b": - words = words[1:] - - total_length = 0 - last_index = len(words) - 1 - - for i, word in enumerate(words): - total_length += len(word) + (i > 0) - - if total_length > max_length: # too long, truncate - break - - if word[-1] == ".": # sentence end, truncate without "..." - return " ".join(words[: i + 1]) - - if total_length == max_length and i != last_index: - break # not at sentence end, truncate with "..." - else: - return " ".join(words) # no truncation needed - - # Account for the length of the suffix. - total_length += len("...") - - # remove words until the length is short enough - while i > 0: - total_length -= len(words[i]) + (i > 0) - - if total_length <= max_length: - break - - i -= 1 - - return " ".join(words[:i]) + "..." - - -class LazyFile: - """A lazy file works like a regular file but it does not fully open - the file but it does perform some basic checks early to see if the - filename parameter does make sense. This is useful for safely opening - files for writing. - """ - - def __init__( - self, - filename: str | os.PathLike[str], - mode: str = "r", - encoding: str | None = None, - errors: str | None = "strict", - atomic: bool = False, - ): - self.name: str = os.fspath(filename) - self.mode = mode - self.encoding = encoding - self.errors = errors - self.atomic = atomic - self._f: t.IO[t.Any] | None - self.should_close: bool - - if self.name == "-": - self._f, self.should_close = open_stream(filename, mode, encoding, errors) - else: - if "r" in mode: - # Open and close the file in case we're opening it for - # reading so that we can catch at least some errors in - # some cases early. - open(filename, mode).close() - self._f = None - self.should_close = True - - def __getattr__(self, name: str) -> t.Any: - return getattr(self.open(), name) - - def __repr__(self) -> str: - if self._f is not None: - return repr(self._f) - return f"" - - def open(self) -> t.IO[t.Any]: - """Opens the file if it's not yet open. This call might fail with - a :exc:`FileError`. Not handling this error will produce an error - that Click shows. - """ - if self._f is not None: - return self._f - try: - rv, self.should_close = open_stream( - self.name, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - except OSError as e: - from .exceptions import FileError - - raise FileError(self.name, hint=e.strerror) from e - self._f = rv - return rv - - def close(self) -> None: - """Closes the underlying file, no matter what.""" - if self._f is not None: - self._f.close() - - def close_intelligently(self) -> None: - """This function only closes the file if it was opened by the lazy - file wrapper. For instance this will never close stdin. - """ - if self.should_close: - self.close() - - def __enter__(self) -> LazyFile: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.close_intelligently() - - def __iter__(self) -> cabc.Iterator[t.AnyStr]: - self.open() - return iter(self._f) # type: ignore - - -class KeepOpenFile: - def __init__(self, file: t.IO[t.Any]) -> None: - self._file: t.IO[t.Any] = file - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._file, name) - - def __enter__(self) -> KeepOpenFile: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - pass - - def __repr__(self) -> str: - return repr(self._file) - - def __iter__(self) -> cabc.Iterator[t.AnyStr]: - return iter(self._file) - - -def echo( - message: t.Any | None = None, - file: t.IO[t.Any] | None = None, - nl: bool = True, - err: bool = False, - color: bool | None = None, -) -> None: - """Print a message and newline to stdout or a file. This should be - used instead of :func:`print` because it provides better support - for different data, files, and environments. - - Compared to :func:`print`, this does the following: - - - Ensures that the output encoding is not misconfigured on Linux. - - Supports Unicode in the Windows console. - - Supports writing to binary outputs, and supports writing bytes - to text outputs. - - Supports colors and styles on Windows. - - Removes ANSI color and style codes if the output does not look - like an interactive terminal. - - Always flushes the output. - - :param message: The string or bytes to output. Other objects are - converted to strings. - :param file: The file to write to. Defaults to ``stdout``. - :param err: Write to ``stderr`` instead of ``stdout``. - :param nl: Print a newline after the message. Enabled by default. - :param color: Force showing or hiding colors and other styles. By - default Click will remove color if the output does not look like - an interactive terminal. - - .. versionchanged:: 6.0 - Support Unicode output on the Windows console. Click does not - modify ``sys.stdout``, so ``sys.stdout.write()`` and ``print()`` - will still not support Unicode. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - - .. versionadded:: 3.0 - Added the ``err`` parameter. - - .. versionchanged:: 2.0 - Support colors on Windows if colorama is installed. - """ - if file is None: - if err: - file = _default_text_stderr() - else: - file = _default_text_stdout() - - # There are no standard streams attached to write to. For example, - # pythonw on Windows. - if file is None: - return - - # Convert non bytes/text into the native string type. - if message is not None and not isinstance(message, (str, bytes, bytearray)): - out: str | bytes | bytearray | None = str(message) - else: - out = message - - if nl: - out = out or "" - if isinstance(out, str): - out += "\n" - else: - out += b"\n" - - if not out: - file.flush() - return - - # If there is a message and the value looks like bytes, we manually - # need to find the binary stream and write the message in there. - # This is done separately so that most stream types will work as you - # would expect. Eg: you can write to StringIO for other cases. - if isinstance(out, (bytes, bytearray)): - binary_file = _find_binary_writer(file) - - if binary_file is not None: - file.flush() - binary_file.write(out) - binary_file.flush() - return - - # ANSI style code support. For no message or bytes, nothing happens. - # When outputting to a file instead of a terminal, strip codes. - else: - color = resolve_color_default(color) - - if should_strip_ansi(file, color): - out = strip_ansi(out) - elif WIN: - if auto_wrap_for_ansi is not None: - file = auto_wrap_for_ansi(file, color) # type: ignore - elif not color: - out = strip_ansi(out) - - file.write(out) # type: ignore - file.flush() - - -def get_binary_stream(name: t.Literal["stdin", "stdout", "stderr"]) -> t.BinaryIO: - """Returns a system stream for byte processing. - - :param name: the name of the stream to open. Valid names are ``'stdin'``, - ``'stdout'`` and ``'stderr'`` - """ - opener = binary_streams.get(name) - if opener is None: - raise TypeError(f"Unknown standard stream '{name}'") - return opener() - - -def get_text_stream( - name: t.Literal["stdin", "stdout", "stderr"], - encoding: str | None = None, - errors: str | None = "strict", -) -> t.TextIO: - """Returns a system stream for text processing. This usually returns - a wrapped stream around a binary stream returned from - :func:`get_binary_stream` but it also can take shortcuts for already - correctly configured streams. - - :param name: the name of the stream to open. Valid names are ``'stdin'``, - ``'stdout'`` and ``'stderr'`` - :param encoding: overrides the detected default encoding. - :param errors: overrides the default error mode. - """ - opener = text_streams.get(name) - if opener is None: - raise TypeError(f"Unknown standard stream '{name}'") - return opener(encoding, errors) - - -def open_file( - filename: str | os.PathLike[str], - mode: str = "r", - encoding: str | None = None, - errors: str | None = "strict", - lazy: bool = False, - atomic: bool = False, -) -> t.IO[t.Any]: - """Open a file, with extra behavior to handle ``'-'`` to indicate - a standard stream, lazy open on write, and atomic write. Similar to - the behavior of the :class:`~click.File` param type. - - If ``'-'`` is given to open ``stdout`` or ``stdin``, the stream is - wrapped so that using it in a context manager will not close it. - This makes it possible to use the function without accidentally - closing a standard stream: - - .. code-block:: python - - with open_file(filename) as f: - ... - - :param filename: The name or Path of the file to open, or ``'-'`` for - ``stdin``/``stdout``. - :param mode: The mode in which to open the file. - :param encoding: The encoding to decode or encode a file opened in - text mode. - :param errors: The error handling mode. - :param lazy: Wait to open the file until it is accessed. For read - mode, the file is temporarily opened to raise access errors - early, then closed until it is read again. - :param atomic: Write to a temporary file and replace the given file - on close. - - .. versionadded:: 3.0 - """ - if lazy: - return t.cast( - "t.IO[t.Any]", LazyFile(filename, mode, encoding, errors, atomic=atomic) - ) - - f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) - - if not should_close: - f = t.cast("t.IO[t.Any]", KeepOpenFile(f)) - - return f - - -def format_filename( - filename: str | bytes | os.PathLike[str] | os.PathLike[bytes], - shorten: bool = False, -) -> str: - """Format a filename as a string for display. Ensures the filename can be - displayed by replacing any invalid bytes or surrogate escapes in the name - with the replacement character ``�``. - - Invalid bytes or surrogate escapes will raise an error when written to a - stream with ``errors="strict"``. This will typically happen with ``stdout`` - when the locale is something like ``en_GB.UTF-8``. - - Many scenarios *are* safe to write surrogates though, due to PEP 538 and - PEP 540, including: - - - Writing to ``stderr``, which uses ``errors="backslashreplace"``. - - The system has ``LANG=C.UTF-8``, ``C``, or ``POSIX``. Python opens - stdout and stderr with ``errors="surrogateescape"``. - - None of ``LANG/LC_*`` are set. Python assumes ``LANG=C.UTF-8``. - - Python is started in UTF-8 mode with ``PYTHONUTF8=1`` or ``-X utf8``. - Python opens stdout and stderr with ``errors="surrogateescape"``. - - :param filename: formats a filename for UI display. This will also convert - the filename into unicode without failing. - :param shorten: this optionally shortens the filename to strip of the - path that leads up to it. - """ - if shorten: - filename = os.path.basename(filename) - else: - filename = os.fspath(filename) - - if isinstance(filename, bytes): - filename = filename.decode(sys.getfilesystemencoding(), "replace") - else: - filename = filename.encode("utf-8", "surrogateescape").decode( - "utf-8", "replace" - ) - - return filename - - -def get_app_dir(app_name: str, roaming: bool = True, force_posix: bool = False) -> str: - r"""Returns the config folder for the application. The default behavior - is to return whatever is most appropriate for the operating system. - - To give you an idea, for an app called ``"Foo Bar"``, something like - the following folders could be returned: - - Mac OS X: - ``~/Library/Application Support/Foo Bar`` - Mac OS X (POSIX): - ``~/.foo-bar`` - Unix: - ``~/.config/foo-bar`` - Unix (POSIX): - ``~/.foo-bar`` - Windows (roaming): - ``C:\Users\\AppData\Roaming\Foo Bar`` - Windows (not roaming): - ``C:\Users\\AppData\Local\Foo Bar`` - - .. versionadded:: 2.0 - - :param app_name: the application name. This should be properly capitalized - and can contain whitespace. - :param roaming: controls if the folder should be roaming or not on Windows. - Has no effect otherwise. - :param force_posix: if this is set to `True` then on any POSIX system the - folder will be stored in the home folder with a leading - dot instead of the XDG config home or darwin's - application support folder. - """ - if WIN: - key = "APPDATA" if roaming else "LOCALAPPDATA" - folder = os.environ.get(key) - if folder is None: - folder = os.path.expanduser("~") - return os.path.join(folder, app_name) - if force_posix: - return os.path.join(os.path.expanduser(f"~/.{_posixify(app_name)}")) - if sys.platform == "darwin": - return os.path.join( - os.path.expanduser("~/Library/Application Support"), app_name - ) - return os.path.join( - os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), - _posixify(app_name), - ) - - -class PacifyFlushWrapper: - """This wrapper is used to catch and suppress BrokenPipeErrors resulting - from ``.flush()`` being called on broken pipe during the shutdown/final-GC - of the Python interpreter. Notably ``.flush()`` is always called on - ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any - other cleanup code, and the case where the underlying file is not a broken - pipe, all calls and attributes are proxied. - """ - - def __init__(self, wrapped: t.IO[t.Any]) -> None: - self.wrapped = wrapped - - def flush(self) -> None: - try: - self.wrapped.flush() - except OSError as e: - import errno - - if e.errno != errno.EPIPE: - raise - - def __getattr__(self, attr: str) -> t.Any: - return getattr(self.wrapped, attr) - - -def _detect_program_name( - path: str | None = None, _main: ModuleType | None = None -) -> str: - """Determine the command used to run the program, for use in help - text. If a file or entry point was executed, the file name is - returned. If ``python -m`` was used to execute a module or package, - ``python -m name`` is returned. - - This doesn't try to be too precise, the goal is to give a concise - name for help text. Files are only shown as their name without the - path. ``python`` is only shown for modules, and the full path to - ``sys.executable`` is not shown. - - :param path: The Python file being executed. Python puts this in - ``sys.argv[0]``, which is used by default. - :param _main: The ``__main__`` module. This should only be passed - during internal testing. - - .. versionadded:: 8.0 - Based on command args detection in the Werkzeug reloader. - - :meta private: - """ - if _main is None: - _main = sys.modules["__main__"] - - if not path: - path = sys.argv[0] - - # The value of __package__ indicates how Python was called. It may - # not exist if a setuptools script is installed as an egg. It may be - # set incorrectly for entry points created with pip on Windows. - # It is set to "" inside a Shiv or PEX zipapp. - if getattr(_main, "__package__", None) in {None, ""} or ( - os.name == "nt" - and _main.__package__ == "" - and not os.path.exists(path) - and os.path.exists(f"{path}.exe") - ): - # Executed a file, like "python app.py". - return os.path.basename(path) - - # Executed a module, like "python -m example". - # Rewritten by Python from "-m script" to "/path/to/script.py". - # Need to look at main module to determine how it was executed. - py_module = t.cast(str, _main.__package__) - name = os.path.splitext(os.path.basename(path))[0] - - # A submodule like "example.cli". - if name != "__main__": - py_module = f"{py_module}.{name}" - - return f"python -m {py_module.lstrip('.')}" - - -def _expand_args( - args: cabc.Iterable[str], - *, - user: bool = True, - env: bool = True, - glob_recursive: bool = True, -) -> list[str]: - """Simulate Unix shell expansion with Python functions. - - See :func:`glob.glob`, :func:`os.path.expanduser`, and - :func:`os.path.expandvars`. - - This is intended for use on Windows, where the shell does not do any - expansion. It may not exactly match what a Unix shell would do. - - :param args: List of command line arguments to expand. - :param user: Expand user home directory. - :param env: Expand environment variables. - :param glob_recursive: ``**`` matches directories recursively. - - .. versionchanged:: 8.1 - Invalid glob patterns are treated as empty expansions rather - than raising an error. - - .. versionadded:: 8.0 - - :meta private: - """ - from glob import glob - - out = [] - - for arg in args: - if user: - arg = os.path.expanduser(arg) - - if env: - arg = os.path.expandvars(arg) - - try: - matches = glob(arg, recursive=glob_recursive) - except re.error: - matches = [] - - if not matches: - out.append(arg) - else: - out.extend(matches) - - return out diff --git a/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/METADATA b/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/METADATA deleted file mode 100644 index 46028fb9..00000000 --- a/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/METADATA +++ /dev/null @@ -1,91 +0,0 @@ -Metadata-Version: 2.4 -Name: Flask -Version: 3.1.2 -Summary: A simple framework for building complex web applications. -Maintainer-email: Pallets -Requires-Python: >=3.9 -Description-Content-Type: text/markdown -License-Expression: BSD-3-Clause -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Framework :: Flask -Classifier: Intended Audience :: Developers -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application -Classifier: Topic :: Software Development :: Libraries :: Application Frameworks -Classifier: Typing :: Typed -License-File: LICENSE.txt -Requires-Dist: blinker>=1.9.0 -Requires-Dist: click>=8.1.3 -Requires-Dist: importlib-metadata>=3.6.0; python_version < '3.10' -Requires-Dist: itsdangerous>=2.2.0 -Requires-Dist: jinja2>=3.1.2 -Requires-Dist: markupsafe>=2.1.1 -Requires-Dist: werkzeug>=3.1.0 -Requires-Dist: asgiref>=3.2 ; extra == "async" -Requires-Dist: python-dotenv ; extra == "dotenv" -Project-URL: Changes, https://flask.palletsprojects.com/page/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://flask.palletsprojects.com/ -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Source, https://github.com/pallets/flask/ -Provides-Extra: async -Provides-Extra: dotenv - -

- -# Flask - -Flask is a lightweight [WSGI] web application framework. It is designed -to make getting started quick and easy, with the ability to scale up to -complex applications. It began as a simple wrapper around [Werkzeug] -and [Jinja], and has become one of the most popular Python web -application frameworks. - -Flask offers suggestions, but doesn't enforce any dependencies or -project layout. It is up to the developer to choose the tools and -libraries they want to use. There are many extensions provided by the -community that make adding new functionality easy. - -[WSGI]: https://wsgi.readthedocs.io/ -[Werkzeug]: https://werkzeug.palletsprojects.com/ -[Jinja]: https://jinja.palletsprojects.com/ - -## A Simple Example - -```python -# save this as app.py -from flask import Flask - -app = Flask(__name__) - -@app.route("/") -def hello(): - return "Hello, World!" -``` - -``` -$ flask run - * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) -``` - -## Donate - -The Pallets organization develops and supports Flask and the libraries -it uses. In order to grow the community of contributors and users, and -allow the maintainers to devote more time to the projects, [please -donate today]. - -[please donate today]: https://palletsprojects.com/donate - -## Contributing - -See our [detailed contributing documentation][contrib] for many ways to -contribute, including reporting issues, requesting features, asking or answering -questions, and making PRs. - -[contrib]: https://palletsprojects.com/contributing/ - diff --git a/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/RECORD b/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/RECORD deleted file mode 100644 index 64623985..00000000 --- a/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/RECORD +++ /dev/null @@ -1,58 +0,0 @@ -../../../bin/flask,sha256=DHnmUh31IU6kaZ3fXM94wYekmfEFSxv84y1zI0fFPJQ,237 -flask-3.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -flask-3.1.2.dist-info/METADATA,sha256=oRg63DAAIcoLAr7kzTgIEKfm8_4HMTRpmWmIptdY_js,3167 -flask-3.1.2.dist-info/RECORD,, -flask-3.1.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -flask-3.1.2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82 -flask-3.1.2.dist-info/entry_points.txt,sha256=bBP7hTOS5fz9zLtC7sPofBZAlMkEvBxu7KqS6l5lvc4,40 -flask-3.1.2.dist-info/licenses/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -flask/__init__.py,sha256=mHvJN9Swtl1RDtjCqCIYyIniK_SZ_l_hqUynOzgpJ9o,2701 -flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 -flask/__pycache__/__init__.cpython-312.pyc,, -flask/__pycache__/__main__.cpython-312.pyc,, -flask/__pycache__/app.cpython-312.pyc,, -flask/__pycache__/blueprints.cpython-312.pyc,, -flask/__pycache__/cli.cpython-312.pyc,, -flask/__pycache__/config.cpython-312.pyc,, -flask/__pycache__/ctx.cpython-312.pyc,, -flask/__pycache__/debughelpers.cpython-312.pyc,, -flask/__pycache__/globals.cpython-312.pyc,, -flask/__pycache__/helpers.cpython-312.pyc,, -flask/__pycache__/logging.cpython-312.pyc,, -flask/__pycache__/sessions.cpython-312.pyc,, -flask/__pycache__/signals.cpython-312.pyc,, -flask/__pycache__/templating.cpython-312.pyc,, -flask/__pycache__/testing.cpython-312.pyc,, -flask/__pycache__/typing.cpython-312.pyc,, -flask/__pycache__/views.cpython-312.pyc,, -flask/__pycache__/wrappers.cpython-312.pyc,, -flask/app.py,sha256=XGqgFRsLgBhzIoB2HSftoMTIM3hjDiH6rdV7c3g3IKc,61744 -flask/blueprints.py,sha256=p5QE2lY18GItbdr_RKRpZ8Do17g0PvQGIgZkSUDhX2k,4541 -flask/cli.py,sha256=Pfh72-BxlvoH0QHCDOc1HvXG7Kq5Xetf3zzNz2kNSHk,37184 -flask/config.py,sha256=PiqF0DPam6HW0FH4CH1hpXTBe30NSzjPEOwrz1b6kt0,13219 -flask/ctx.py,sha256=sPKzahqtgxaS7O0y9E_NzUJNUDyTD6M4GkDrVu2fU3Y,15064 -flask/debughelpers.py,sha256=PGIDhStW_efRjpaa3zHIpo-htStJOR41Ip3OJWPYBwo,6080 -flask/globals.py,sha256=XdQZmStBmPIs8t93tjx6pO7Bm3gobAaONWkFcUHaGas,1713 -flask/helpers.py,sha256=rJZge7_J288J1UQv5-kNf4oEaw332PP8NTW0QRIBbXE,23517 -flask/json/__init__.py,sha256=hLNR898paqoefdeAhraa5wyJy-bmRB2k2dV4EgVy2Z8,5602 -flask/json/__pycache__/__init__.cpython-312.pyc,, -flask/json/__pycache__/provider.cpython-312.pyc,, -flask/json/__pycache__/tag.cpython-312.pyc,, -flask/json/provider.py,sha256=5imEzY5HjV2HoUVrQbJLqXCzMNpZXfD0Y1XqdLV2XBA,7672 -flask/json/tag.py,sha256=DhaNwuIOhdt2R74oOC9Y4Z8ZprxFYiRb5dUP5byyINw,9281 -flask/logging.py,sha256=8sM3WMTubi1cBb2c_lPkWpN0J8dMAqrgKRYLLi1dCVI,2377 -flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -flask/sansio/README.md,sha256=-0X1tECnilmz1cogx-YhNw5d7guK7GKrq_DEV2OzlU0,228 -flask/sansio/__pycache__/app.cpython-312.pyc,, -flask/sansio/__pycache__/blueprints.cpython-312.pyc,, -flask/sansio/__pycache__/scaffold.cpython-312.pyc,, -flask/sansio/app.py,sha256=5EbxwHOchgcpZqQyalA9vyDBopknOvDg6BVwXFyFD2s,38099 -flask/sansio/blueprints.py,sha256=Tqe-7EkZ-tbWchm8iDoCfD848f0_3nLv6NNjeIPvHwM,24637 -flask/sansio/scaffold.py,sha256=wSASXYdFRWJmqcL0Xq-T7N-PDVUSiFGvjO9kPZg58bk,30371 -flask/sessions.py,sha256=duvYGmCGh_H3cgMuy2oeSjrCsCvLylF4CBKOXpN0Qms,15480 -flask/signals.py,sha256=V7lMUww7CqgJ2ThUBn1PiatZtQanOyt7OZpu2GZI-34,750 -flask/templating.py,sha256=IHsdsF-eBJPCJE0AJLCi1VhhnytOGdzHCn3yThz87c4,7536 -flask/testing.py,sha256=zzC7XxhBWOP9H697IV_4SG7Lg3Lzb5PWiyEP93_KQXE,10117 -flask/typing.py,sha256=L-L5t2jKgS0aOmVhioQ_ylqcgiVFnA6yxO-RLNhq-GU,3293 -flask/views.py,sha256=xzJx6oJqGElThtEghZN7ZQGMw5TDFyuRxUkecwRuAoA,6962 -flask/wrappers.py,sha256=jUkv4mVek2Iq4hwxd4RvqrIMb69Bv0PElDgWLmd5ORo,9406 diff --git a/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/REQUESTED b/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/REQUESTED deleted file mode 100644 index e69de29b..00000000 diff --git a/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/WHEEL b/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/WHEEL deleted file mode 100644 index d8b9936d..00000000 --- a/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.12.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/entry_points.txt b/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/entry_points.txt deleted file mode 100644 index eec6733e..00000000 --- a/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[console_scripts] -flask=flask.cli:main - diff --git a/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/licenses/LICENSE.txt b/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/licenses/LICENSE.txt deleted file mode 100644 index 9d227a0c..00000000 --- a/venv/lib/python3.12/site-packages/flask-3.1.2.dist-info/licenses/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2010 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. 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. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 -HOLDER 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. diff --git a/venv/lib/python3.12/site-packages/flask/__init__.py b/venv/lib/python3.12/site-packages/flask/__init__.py deleted file mode 100644 index 1fdc50ce..00000000 --- a/venv/lib/python3.12/site-packages/flask/__init__.py +++ /dev/null @@ -1,61 +0,0 @@ -from __future__ import annotations - -import typing as t - -from . import json as json -from .app import Flask as Flask -from .blueprints import Blueprint as Blueprint -from .config import Config as Config -from .ctx import after_this_request as after_this_request -from .ctx import copy_current_request_context as copy_current_request_context -from .ctx import has_app_context as has_app_context -from .ctx import has_request_context as has_request_context -from .globals import current_app as current_app -from .globals import g as g -from .globals import request as request -from .globals import session as session -from .helpers import abort as abort -from .helpers import flash as flash -from .helpers import get_flashed_messages as get_flashed_messages -from .helpers import get_template_attribute as get_template_attribute -from .helpers import make_response as make_response -from .helpers import redirect as redirect -from .helpers import send_file as send_file -from .helpers import send_from_directory as send_from_directory -from .helpers import stream_with_context as stream_with_context -from .helpers import url_for as url_for -from .json import jsonify as jsonify -from .signals import appcontext_popped as appcontext_popped -from .signals import appcontext_pushed as appcontext_pushed -from .signals import appcontext_tearing_down as appcontext_tearing_down -from .signals import before_render_template as before_render_template -from .signals import got_request_exception as got_request_exception -from .signals import message_flashed as message_flashed -from .signals import request_finished as request_finished -from .signals import request_started as request_started -from .signals import request_tearing_down as request_tearing_down -from .signals import template_rendered as template_rendered -from .templating import render_template as render_template -from .templating import render_template_string as render_template_string -from .templating import stream_template as stream_template -from .templating import stream_template_string as stream_template_string -from .wrappers import Request as Request -from .wrappers import Response as Response - -if not t.TYPE_CHECKING: - - def __getattr__(name: str) -> t.Any: - if name == "__version__": - import importlib.metadata - import warnings - - warnings.warn( - "The '__version__' attribute is deprecated and will be removed in" - " Flask 3.2. Use feature detection or" - " 'importlib.metadata.version(\"flask\")' instead.", - DeprecationWarning, - stacklevel=2, - ) - return importlib.metadata.version("flask") - - raise AttributeError(name) diff --git a/venv/lib/python3.12/site-packages/flask/__main__.py b/venv/lib/python3.12/site-packages/flask/__main__.py deleted file mode 100644 index 4e28416e..00000000 --- a/venv/lib/python3.12/site-packages/flask/__main__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .cli import main - -main() diff --git a/venv/lib/python3.12/site-packages/flask/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/flask/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4bddd3288fb97e688ba28cf19d15bacebf9b45ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2523 zcmZXWTW=Fb6vt~p{j@wP*t6m)y6xvH`!Zf*SVk| zDpaZJL)BJ&fRE6MKKD!X1Voa>R(xs20^?M$C-UIA~EVZY0bkO$tsJ zDYJ`q2~HZ_W}2o2r;HvmLory|h2n^T5M&Sa1P&gpLR<0*}&B!TrEvbWHF7@Hib8JP15N zCj<`xPtr-j!@x3?1&C0-kL{vA*HT?Yb(~{T0j16e$K-T42=s;zC7d&PG*QxJt_y*K8do=Lj)TV= z5ONEk*kqm}8cb76=%_ZC3;F=+9y1+7^_Zf19@jV89s^ItRJRyJ;X1GvD5N;kbk6EH zZkNj}O=;)`ItqskZkx(s2b=E++2c$#l^xw{9a}}R%?+htbLf%8jny02xewOV*%QUF z9fxTr#kSiL;^48K9#bI;O+~YJaM=SJ3n2mS$d@t@SRZtTPttkrByr(EtXAkoMmjiA%vG5!Jk_)(~KKfxK~%DNNxs+X<3%6Y$A zQ5tPbAB2Oe_7mQo0~_m0o=-TIt{;WFfn&M)-5cQ*?ee7P47Uqh(;Q3IkJi0i-UY<* z{{qL7OM^ivkMAMIE0L>tpAvD8iM$n9c z@sqCJv~ch-l*Z9apqWG?qnSceLNkqK2F)xOzq@l6z;gKsLhve<%DB`Y(Wam%3!yTH9bB^L1$A0d;=?a}bpzDIld+ zB>yiN3CLtXssWh^$cF*B9*~uQTntDpAfo{(i+4I8@Lmqcn($TvvKWw0#0wqZL+B6h sRncKJAm_zUVBr(cF9hUTXy*g6@G_bD{@(q2Z)4f`^g*1Y21UsK0odKn>Hq)$ diff --git a/venv/lib/python3.12/site-packages/flask/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/flask/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index f8074695b34b08b64b7e60e15f71383970f2270d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231 zcmX@j%ge<81bo{(GUb5uV-N=hn4pZ$Aere5DGVu$ISjdsQH+cXObn@vtD(}243$ip z%r6;%TusJXEV+r9d48Hqx0sW2GK-jjf-4z5gH-+s(9g)vP1VoLE6GXLFDS~-N=+^) z1~Dpf^DFerQuE66b25|k3o1)8^7D-K42|@QGfPr+3lfvF6Vp?R_0w_^i?j9P<3Se0 u$LkeT{^GF7%}*)KNwq8D09pWYKrt_n_`uA_$at4Q^dSRFD_ap8Py_&d?Ku4a diff --git a/venv/lib/python3.12/site-packages/flask/__pycache__/app.cpython-312.pyc b/venv/lib/python3.12/site-packages/flask/__pycache__/app.cpython-312.pyc deleted file mode 100644 index 4f015a7916d7a7f47ba5dbb4a26acf84e5769676..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62478 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 dmqeorzQHLtxymPlt@t|Qvh`!q(ix# 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

hzW$!CdGB9qMyfMT4X?g{C`ub{|7d^ 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 XC^vs9A^B`j9<<4o{~}S!Z}Yzc-OgK# diff --git a/venv/lib/python3.12/site-packages/flask/__pycache__/debughelpers.cpython-312.pyc b/venv/lib/python3.12/site-packages/flask/__pycache__/debughelpers.cpython-312.pyc deleted file mode 100644 index 683be2eba302984ef4c23077ab94d484894830d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9140 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 diff --git a/venv/lib/python3.12/site-packages/flask/__pycache__/helpers.cpython-312.pyc b/venv/lib/python3.12/site-packages/flask/__pycache__/helpers.cpython-312.pyc deleted file mode 100644 index 12261bfab803c08ea7cf141d6a37273daaaac5cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25556 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 diff --git a/venv/lib/python3.12/site-packages/flask/__pycache__/logging.cpython-312.pyc b/venv/lib/python3.12/site-packages/flask/__pycache__/logging.cpython-312.pyc deleted file mode 100644 index 7edb9d5fe72332b6b973247e54621c9658b459b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3257 zcmZuz&2JmW6`xstil3Hbsj#csgI2Oc*CyKr$$=G|wvH$pQEdZOnwCXCuDC;TrR6R= zGqglOPKeZits;QiLn0>#;GTjMMuDD+{tvyFkpc;u1aOfAXn-CB%LP)O`ev3Z%9aM$ zowqaZd*=P#{xg}3AsDH@UotNbAoQjD@JGla@ZNub*gys{u!S19h_R$KODk$>4ip1w z4i-Z&2dr=-Qj7pk& z?8bH5c7!fW$L3eyJ2vN3bn6;(R@&c4)36j_^mi@F1(1QCH=7mTgq$^a0tn%~c_22B zkZWqN;Xb`6xt<#aJ^?G&kqG)5i(#MY&(~2#)87R@3Z`ukQKzKga6$BDlQ~Uh>Vgu= zn8OGcjOqz)&t{V@eCCZ96SeaqOyDYcVRn7;%7>$U*vN}Dtz>fo6lf)|nUUh?Z;pv6HOshSog5T{{Q#J+VE zDgg^hSw*)e1u+{Y2&?TGhkZy$l|r%{VnRN-5-XSKipb}3Rd9bP>w7OV zQ}QxX@|=<>ka=8`etm1d3+ks4Q^@EFbT3I4yRo;KNEAoz$x_9M>X{)N}<&9M8x?0f% zSvD=J$0k|SvDTn6Y*`sK$|gCjxR%d}dB!-6eh(Hqnv({K96FsC@PH7aI&o;k^K zp?6K5$*#=N3lcDOSQ5*d=u#7WU z!c|B)lL@$5_D61{7cUzEX)Y}h(qSo>pAJmds7+Uz?854JUFRhwR_gI*r!5J3{6co0 zYf@?etLWQ*qi;LtlT_j3$vew;Z?50`bLi9bL^oCVAD2h_`x9e$zK{vIgNMR*1G?RI zqdgnk9gvu%*8sEJa1+Ye7T|W+OS2oPw3u8v==#r;>+awof7$oI@@eVeuce0_v>Qdq z;qAnDH!;4MIMbQgNgeOZ{wp^4c|5h5D*WyB?H6adFV1YG3S05Q&hU30rAN2ZXdVd!3+Nt4lVzh>#g<<_45b`XQSWHPlqO0ss zP+Q*VOWfW^awuJZ?kcepgilLe@U@V zdx)+qXXT14&6tGn*XvN~J*hVjav5}?RVzyvp|-wYQR5upy#RWSsEgpYue_lPz2EU( znfb+Qvmjkn!Ege<7*f37Il*xcq-4)q*2RY}6ZWu&Ye)}zUAB3Lmv9gPL zeASj+$(MVfNzJk$A8s0DNU5j;WG?93tVr>O4(`enWnylmC+H49mCq@-bAvLEZb;=x zRjnI^2s<$lR15ZW+kbr-g@4~I&@+XN9ujZ2#_?;27 z)X*2-ROxAb6e4~kK%)!U#dC>Pr{6f7PD8QB0CTN z0hg~rN0*L0P5Ei_B4-&`bb||yV*!T*N*0kXxy;VOD|6h9l}gnXXrrYPlQ_&IS~2+} z?uJFX31{G9;ii@;TUw>98vJVj{xVtjZlq>83joI6-$Zi$H`iuL7cb3ReD(5`SvSUY zo10EnCQTWY<>}=)`OFPqXQZwKoJc_(rJ&3m*e6v&nJj!2yw@V4(;kvtU@yUj#3;_; zwHv?~e}TULB}#pUVxOU*uhGQUXzWoSc>CqIU;ZL^dN+);#A7XiNB06i?JDZjF+8|? z77b7RadLZTvO6^Sa4Nq!^wUmy2c@^sSQm}$1V=iv+rg1;aOC0WmCfMQCjkv>Phul@ HNICU?$VEt? diff --git a/venv/lib/python3.12/site-packages/flask/__pycache__/sessions.cpython-312.pyc b/venv/lib/python3.12/site-packages/flask/__pycache__/sessions.cpython-312.pyc deleted file mode 100644 index a97cd9e260b76e9d8100af0c976fe6513f23f57b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17172 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 OUF?rf_d&%4zU+U{drYtZ diff --git a/venv/lib/python3.12/site-packages/flask/__pycache__/templating.cpython-312.pyc b/venv/lib/python3.12/site-packages/flask/__pycache__/templating.cpython-312.pyc deleted file mode 100644 index 15e19e435a98941899e7a4dc68d2a0fae892ac3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9921 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 diff --git a/venv/lib/python3.12/site-packages/flask/__pycache__/testing.cpython-312.pyc b/venv/lib/python3.12/site-packages/flask/__pycache__/testing.cpython-312.pyc deleted file mode 100644 index 53f3a0b92eb4bbeb03a69934eae3fc217a344d03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13602 zcmb_jd2Afld7s()BA47HC5neQq$D1uw6tVVwl=mUnxqa}rVLV!>kZuHa%V^`wFfgZ z6b~$2HFXd&O=78SDj8`JrAQkEZVLr18U<*PrbU1P?H^oG!7io}pdv1s{?&D8!>&-E z{e5qaT~h0`e{@K`dGn6%eee2i{$pL8kHb^{SLae+?&Y|j(}(#u^$frL>paKZ;6zU3 z(_Ds+@jT^iX0>oeh4nC1QHrc85e5Ap%AF1tJvi0CRtAKkM6=?#u`=f#+=8SxyYS!--)jIR8?m zx0#zCHFK5s`*uAa>lT|52gFvf`5i~>AcM3AkoHPptHmK!+Je%3QlnMcvtsLS`*#A; z&ujifHk(ruYATmi#_?UB%w<(+SiKH}* z!b>X)5(+$va#~qPr&Q`Ol1@!5X0xojYeG^M(^Tw2v6Q8pdqVo+qNJ$*j*TWHe3MBz zwVvwDQ239XErqZG$C;kRoGn^HoNnoQyr`}$Y7ReQKed2;ZIbm8#WoHFh-yKQZ(R4bYNOA0PRCozF)@Nx>G6n%c zLP|0EE0TOg5)TVYbE)JU8;vG2HAO>AO;I~pN@G@6fM6~noSzYJ1ch0AXAcY0SWA^5 zYW0kY2{jR&dTnCt%-F=l*k~O1#wSP4jlDXCRh*hq7N^BrCXvccO dX>x4h^J5e7 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ΠOorU61aS^TGkswi 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 timedelta | None: - if value is None or isinstance(value, timedelta): - return value - - return timedelta(seconds=value) - - -class Flask(App): - """The flask object implements a WSGI application and acts as the central - object. It is passed the name of the module or package of the - application. Once it is created it will act as a central registry for - the view functions, the URL rules, template configuration and much more. - - The name of the package is used to resolve resources from inside the - package or the folder the module is contained in depending on if the - package parameter resolves to an actual python package (a folder with - an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). - - For more information about resource loading, see :func:`open_resource`. - - Usually you create a :class:`Flask` instance in your main module or - in the :file:`__init__.py` file of your package like this:: - - from flask import Flask - app = Flask(__name__) - - .. admonition:: About the First Parameter - - The idea of the first parameter is to give Flask an idea of what - belongs to your application. This name is used to find resources - on the filesystem, can be used by extensions to improve debugging - information and a lot more. - - So it's important what you provide there. If you are using a single - module, `__name__` is always the correct value. If you however are - using a package, it's usually recommended to hardcode the name of - your package there. - - For example if your application is defined in :file:`yourapplication/app.py` - you should create it with one of the two versions below:: - - app = Flask('yourapplication') - app = Flask(__name__.split('.')[0]) - - Why is that? The application will work even with `__name__`, thanks - to how resources are looked up. However it will make debugging more - painful. Certain extensions can make assumptions based on the - import name of your application. For example the Flask-SQLAlchemy - extension will look for the code in your application that triggered - an SQL query in debug mode. If the import name is not properly set - up, that debugging information is lost. (For example it would only - pick up SQL queries in `yourapplication.app` and not - `yourapplication.views.frontend`) - - .. versionadded:: 0.7 - The `static_url_path`, `static_folder`, and `template_folder` - parameters were added. - - .. versionadded:: 0.8 - The `instance_path` and `instance_relative_config` parameters were - added. - - .. versionadded:: 0.11 - The `root_path` parameter was added. - - .. versionadded:: 1.0 - The ``host_matching`` and ``static_host`` parameters were added. - - .. versionadded:: 1.0 - The ``subdomain_matching`` parameter was added. Subdomain - matching needs to be enabled manually now. Setting - :data:`SERVER_NAME` does not implicitly enable it. - - :param import_name: the name of the application package - :param static_url_path: can be used to specify a different path for the - static files on the web. Defaults to the name - of the `static_folder` folder. - :param static_folder: The folder with static files that is served at - ``static_url_path``. Relative to the application ``root_path`` - or an absolute path. Defaults to ``'static'``. - :param static_host: the host to use when adding the static route. - Defaults to None. Required when using ``host_matching=True`` - with a ``static_folder`` configured. - :param host_matching: set ``url_map.host_matching`` attribute. - Defaults to False. - :param subdomain_matching: consider the subdomain relative to - :data:`SERVER_NAME` when matching routes. Defaults to False. - :param template_folder: the folder that contains the templates that should - be used by the application. Defaults to - ``'templates'`` folder in the root path of the - application. - :param instance_path: An alternative instance path for the application. - By default the folder ``'instance'`` next to the - package or module is assumed to be the instance - path. - :param instance_relative_config: if set to ``True`` relative filenames - for loading the config are assumed to - be relative to the instance path instead - of the application root. - :param root_path: The path to the root of the application files. - This should only be set manually when it can't be detected - automatically, such as for namespace packages. - """ - - default_config = ImmutableDict( - { - "DEBUG": None, - "TESTING": False, - "PROPAGATE_EXCEPTIONS": None, - "SECRET_KEY": None, - "SECRET_KEY_FALLBACKS": None, - "PERMANENT_SESSION_LIFETIME": timedelta(days=31), - "USE_X_SENDFILE": False, - "TRUSTED_HOSTS": None, - "SERVER_NAME": None, - "APPLICATION_ROOT": "/", - "SESSION_COOKIE_NAME": "session", - "SESSION_COOKIE_DOMAIN": None, - "SESSION_COOKIE_PATH": None, - "SESSION_COOKIE_HTTPONLY": True, - "SESSION_COOKIE_SECURE": False, - "SESSION_COOKIE_PARTITIONED": False, - "SESSION_COOKIE_SAMESITE": None, - "SESSION_REFRESH_EACH_REQUEST": True, - "MAX_CONTENT_LENGTH": None, - "MAX_FORM_MEMORY_SIZE": 500_000, - "MAX_FORM_PARTS": 1_000, - "SEND_FILE_MAX_AGE_DEFAULT": None, - "TRAP_BAD_REQUEST_ERRORS": None, - "TRAP_HTTP_EXCEPTIONS": False, - "EXPLAIN_TEMPLATE_LOADING": False, - "PREFERRED_URL_SCHEME": "http", - "TEMPLATES_AUTO_RELOAD": None, - "MAX_COOKIE_SIZE": 4093, - "PROVIDE_AUTOMATIC_OPTIONS": True, - } - ) - - #: The class that is used for request objects. See :class:`~flask.Request` - #: for more information. - request_class: type[Request] = Request - - #: The class that is used for response objects. See - #: :class:`~flask.Response` for more information. - response_class: type[Response] = Response - - #: the session interface to use. By default an instance of - #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. - #: - #: .. versionadded:: 0.8 - session_interface: SessionInterface = SecureCookieSessionInterface() - - def __init__( - self, - import_name: str, - static_url_path: str | None = None, - static_folder: str | os.PathLike[str] | None = "static", - static_host: str | None = None, - host_matching: bool = False, - subdomain_matching: bool = False, - template_folder: str | os.PathLike[str] | None = "templates", - instance_path: str | None = None, - instance_relative_config: bool = False, - root_path: str | None = None, - ): - super().__init__( - import_name=import_name, - static_url_path=static_url_path, - static_folder=static_folder, - static_host=static_host, - host_matching=host_matching, - subdomain_matching=subdomain_matching, - template_folder=template_folder, - instance_path=instance_path, - instance_relative_config=instance_relative_config, - root_path=root_path, - ) - - #: The Click command group for registering CLI commands for this - #: object. The commands are available from the ``flask`` command - #: once the application has been discovered and blueprints have - #: been registered. - self.cli = cli.AppGroup() - - # Set the name of the Click group in case someone wants to add - # the app's commands to another CLI tool. - self.cli.name = self.name - - # Add a static route using the provided static_url_path, static_host, - # and static_folder if there is a configured static_folder. - # Note we do this without checking if static_folder exists. - # For one, it might be created while the server is running (e.g. during - # development). Also, Google App Engine stores static files somewhere - if self.has_static_folder: - assert bool(static_host) == host_matching, ( - "Invalid static_host/host_matching combination" - ) - # Use a weakref to avoid creating a reference cycle between the app - # and the view function (see #3761). - self_ref = weakref.ref(self) - self.add_url_rule( - f"{self.static_url_path}/", - endpoint="static", - host=static_host, - view_func=lambda **kw: self_ref().send_static_file(**kw), # type: ignore # noqa: B950 - ) - - def get_send_file_max_age(self, filename: str | None) -> int | None: - """Used by :func:`send_file` to determine the ``max_age`` cache - value for a given file path if it wasn't passed. - - By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from - the configuration of :data:`~flask.current_app`. This defaults - to ``None``, which tells the browser to use conditional requests - instead of a timed cache, which is usually preferable. - - Note this is a duplicate of the same method in the Flask - class. - - .. versionchanged:: 2.0 - The default configuration is ``None`` instead of 12 hours. - - .. versionadded:: 0.9 - """ - value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] - - if value is None: - return None - - if isinstance(value, timedelta): - return int(value.total_seconds()) - - return value # type: ignore[no-any-return] - - def send_static_file(self, filename: str) -> Response: - """The view function used to serve files from - :attr:`static_folder`. A route is automatically registered for - this view at :attr:`static_url_path` if :attr:`static_folder` is - set. - - Note this is a duplicate of the same method in the Flask - class. - - .. versionadded:: 0.5 - - """ - if not self.has_static_folder: - raise RuntimeError("'static_folder' must be set to serve static_files.") - - # send_file only knows to call get_send_file_max_age on the app, - # call it here so it works for blueprints too. - max_age = self.get_send_file_max_age(filename) - return send_from_directory( - t.cast(str, self.static_folder), filename, max_age=max_age - ) - - def open_resource( - self, resource: str, mode: str = "rb", encoding: str | None = None - ) -> t.IO[t.AnyStr]: - """Open a resource file relative to :attr:`root_path` for reading. - - For example, if the file ``schema.sql`` is next to the file - ``app.py`` where the ``Flask`` app is defined, it can be opened - with: - - .. code-block:: python - - with app.open_resource("schema.sql") as f: - conn.executescript(f.read()) - - :param resource: Path to the resource relative to :attr:`root_path`. - :param mode: Open the file in this mode. Only reading is supported, - valid values are ``"r"`` (or ``"rt"``) and ``"rb"``. - :param encoding: Open the file with this encoding when opening in text - mode. This is ignored when opening in binary mode. - - .. versionchanged:: 3.1 - Added the ``encoding`` parameter. - """ - if mode not in {"r", "rt", "rb"}: - raise ValueError("Resources can only be opened for reading.") - - path = os.path.join(self.root_path, resource) - - if mode == "rb": - return open(path, mode) # pyright: ignore - - return open(path, mode, encoding=encoding) - - def open_instance_resource( - self, resource: str, mode: str = "rb", encoding: str | None = "utf-8" - ) -> t.IO[t.AnyStr]: - """Open a resource file relative to the application's instance folder - :attr:`instance_path`. Unlike :meth:`open_resource`, files in the - instance folder can be opened for writing. - - :param resource: Path to the resource relative to :attr:`instance_path`. - :param mode: Open the file in this mode. - :param encoding: Open the file with this encoding when opening in text - mode. This is ignored when opening in binary mode. - - .. versionchanged:: 3.1 - Added the ``encoding`` parameter. - """ - path = os.path.join(self.instance_path, resource) - - if "b" in mode: - return open(path, mode) - - return open(path, mode, encoding=encoding) - - def create_jinja_environment(self) -> Environment: - """Create the Jinja environment based on :attr:`jinja_options` - and the various Jinja-related methods of the app. Changing - :attr:`jinja_options` after this will have no effect. Also adds - Flask-related globals and filters to the environment. - - .. versionchanged:: 0.11 - ``Environment.auto_reload`` set in accordance with - ``TEMPLATES_AUTO_RELOAD`` configuration option. - - .. versionadded:: 0.5 - """ - options = dict(self.jinja_options) - - if "autoescape" not in options: - options["autoescape"] = self.select_jinja_autoescape - - if "auto_reload" not in options: - auto_reload = self.config["TEMPLATES_AUTO_RELOAD"] - - if auto_reload is None: - auto_reload = self.debug - - options["auto_reload"] = auto_reload - - rv = self.jinja_environment(self, **options) - rv.globals.update( - url_for=self.url_for, - get_flashed_messages=get_flashed_messages, - config=self.config, - # request, session and g are normally added with the - # context processor for efficiency reasons but for imported - # templates we also want the proxies in there. - request=request, - session=session, - g=g, - ) - rv.policies["json.dumps_function"] = self.json.dumps - return rv - - def create_url_adapter(self, request: Request | None) -> MapAdapter | None: - """Creates a URL adapter for the given request. The URL adapter - is created at a point where the request context is not yet set - up so the request is passed explicitly. - - .. versionchanged:: 3.1 - If :data:`SERVER_NAME` is set, it does not restrict requests to - only that domain, for both ``subdomain_matching`` and - ``host_matching``. - - .. versionchanged:: 1.0 - :data:`SERVER_NAME` no longer implicitly enables subdomain - matching. Use :attr:`subdomain_matching` instead. - - .. versionchanged:: 0.9 - This can be called outside a request when the URL adapter is created - for an application context. - - .. versionadded:: 0.6 - """ - if request is not None: - if (trusted_hosts := self.config["TRUSTED_HOSTS"]) is not None: - request.trusted_hosts = trusted_hosts - - # Check trusted_hosts here until bind_to_environ does. - request.host = get_host(request.environ, request.trusted_hosts) # pyright: ignore - subdomain = None - server_name = self.config["SERVER_NAME"] - - if self.url_map.host_matching: - # Don't pass SERVER_NAME, otherwise it's used and the actual - # host is ignored, which breaks host matching. - server_name = None - elif not self.subdomain_matching: - # Werkzeug doesn't implement subdomain matching yet. Until then, - # disable it by forcing the current subdomain to the default, or - # the empty string. - subdomain = self.url_map.default_subdomain or "" - - return self.url_map.bind_to_environ( - request.environ, server_name=server_name, subdomain=subdomain - ) - - # Need at least SERVER_NAME to match/build outside a request. - if self.config["SERVER_NAME"] is not None: - return self.url_map.bind( - self.config["SERVER_NAME"], - script_name=self.config["APPLICATION_ROOT"], - url_scheme=self.config["PREFERRED_URL_SCHEME"], - ) - - return None - - def raise_routing_exception(self, request: Request) -> t.NoReturn: - """Intercept routing exceptions and possibly do something else. - - In debug mode, intercept a routing redirect and replace it with - an error if the body will be discarded. - - With modern Werkzeug this shouldn't occur, since it now uses a - 308 status which tells the browser to resend the method and - body. - - .. versionchanged:: 2.1 - Don't intercept 307 and 308 redirects. - - :meta private: - :internal: - """ - if ( - not self.debug - or not isinstance(request.routing_exception, RequestRedirect) - or request.routing_exception.code in {307, 308} - or request.method in {"GET", "HEAD", "OPTIONS"} - ): - raise request.routing_exception # type: ignore[misc] - - from .debughelpers import FormDataRoutingRedirect - - raise FormDataRoutingRedirect(request) - - def update_template_context(self, context: dict[str, t.Any]) -> None: - """Update the template context with some commonly used variables. - This injects request, session, config and g into the template - context as well as everything template context processors want - to inject. Note that the as of Flask 0.6, the original values - in the context will not be overridden if a context processor - decides to return a value with the same key. - - :param context: the context as a dictionary that is updated in place - to add extra variables. - """ - names: t.Iterable[str | None] = (None,) - - # A template may be rendered outside a request context. - if request: - names = chain(names, reversed(request.blueprints)) - - # The values passed to render_template take precedence. Keep a - # copy to re-apply after all context functions. - orig_ctx = context.copy() - - for name in names: - if name in self.template_context_processors: - for func in self.template_context_processors[name]: - context.update(self.ensure_sync(func)()) - - context.update(orig_ctx) - - def make_shell_context(self) -> dict[str, t.Any]: - """Returns the shell context for an interactive shell for this - application. This runs all the registered shell context - processors. - - .. versionadded:: 0.11 - """ - rv = {"app": self, "g": g} - for processor in self.shell_context_processors: - rv.update(processor()) - return rv - - def run( - self, - host: str | None = None, - port: int | None = None, - debug: bool | None = None, - load_dotenv: bool = True, - **options: t.Any, - ) -> None: - """Runs the application on a local development server. - - Do not use ``run()`` in a production setting. It is not intended to - meet security and performance requirements for a production server. - Instead, see :doc:`/deploying/index` for WSGI server recommendations. - - If the :attr:`debug` flag is set the server will automatically reload - for code changes and show a debugger in case an exception happened. - - If you want to run the application in debug mode, but disable the - code execution on the interactive debugger, you can pass - ``use_evalex=False`` as parameter. This will keep the debugger's - traceback screen active, but disable code execution. - - It is not recommended to use this function for development with - automatic reloading as this is badly supported. Instead you should - be using the :command:`flask` command line script's ``run`` support. - - .. admonition:: Keep in Mind - - Flask will suppress any server error with a generic error page - unless it is in debug mode. As such to enable just the - interactive debugger without the code reloading, you have to - invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``. - Setting ``use_debugger`` to ``True`` without being in debug mode - won't catch any exceptions because there won't be any to - catch. - - :param host: the hostname to listen on. Set this to ``'0.0.0.0'`` to - have the server available externally as well. Defaults to - ``'127.0.0.1'`` or the host in the ``SERVER_NAME`` config variable - if present. - :param port: the port of the webserver. Defaults to ``5000`` or the - port defined in the ``SERVER_NAME`` config variable if present. - :param debug: if given, enable or disable debug mode. See - :attr:`debug`. - :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` - files to set environment variables. Will also change the working - directory to the directory containing the first file found. - :param options: the options to be forwarded to the underlying Werkzeug - server. See :func:`werkzeug.serving.run_simple` for more - information. - - .. versionchanged:: 1.0 - If installed, python-dotenv will be used to load environment - variables from :file:`.env` and :file:`.flaskenv` files. - - The :envvar:`FLASK_DEBUG` environment variable will override :attr:`debug`. - - Threaded mode is enabled by default. - - .. versionchanged:: 0.10 - The default port is now picked from the ``SERVER_NAME`` - variable. - """ - # Ignore this call so that it doesn't start another server if - # the 'flask run' command is used. - if os.environ.get("FLASK_RUN_FROM_CLI") == "true": - if not is_running_from_reloader(): - click.secho( - " * Ignoring a call to 'app.run()' that would block" - " the current 'flask' CLI command.\n" - " Only call 'app.run()' in an 'if __name__ ==" - ' "__main__"\' guard.', - fg="red", - ) - - return - - if get_load_dotenv(load_dotenv): - cli.load_dotenv() - - # if set, env var overrides existing value - if "FLASK_DEBUG" in os.environ: - self.debug = get_debug_flag() - - # debug passed to method overrides all other sources - if debug is not None: - self.debug = bool(debug) - - server_name = self.config.get("SERVER_NAME") - sn_host = sn_port = None - - if server_name: - sn_host, _, sn_port = server_name.partition(":") - - if not host: - if sn_host: - host = sn_host - else: - host = "127.0.0.1" - - if port or port == 0: - port = int(port) - elif sn_port: - port = int(sn_port) - else: - port = 5000 - - options.setdefault("use_reloader", self.debug) - options.setdefault("use_debugger", self.debug) - options.setdefault("threaded", True) - - cli.show_server_banner(self.debug, self.name) - - from werkzeug.serving import run_simple - - try: - run_simple(t.cast(str, host), port, self, **options) - finally: - # reset the first request information if the development server - # reset normally. This makes it possible to restart the server - # without reloader and that stuff from an interactive shell. - self._got_first_request = False - - def test_client(self, use_cookies: bool = True, **kwargs: t.Any) -> FlaskClient: - """Creates a test client for this application. For information - about unit testing head over to :doc:`/testing`. - - Note that if you are testing for assertions or exceptions in your - application code, you must set ``app.testing = True`` in order for the - exceptions to propagate to the test client. Otherwise, the exception - will be handled by the application (not visible to the test client) and - the only indication of an AssertionError or other exception will be a - 500 status code response to the test client. See the :attr:`testing` - attribute. For example:: - - app.testing = True - client = app.test_client() - - The test client can be used in a ``with`` block to defer the closing down - of the context until the end of the ``with`` block. This is useful if - you want to access the context locals for testing:: - - with app.test_client() as c: - rv = c.get('/?vodka=42') - assert request.args['vodka'] == '42' - - Additionally, you may pass optional keyword arguments that will then - be passed to the application's :attr:`test_client_class` constructor. - For example:: - - from flask.testing import FlaskClient - - class CustomClient(FlaskClient): - def __init__(self, *args, **kwargs): - self._authentication = kwargs.pop("authentication") - super(CustomClient,self).__init__( *args, **kwargs) - - app.test_client_class = CustomClient - client = app.test_client(authentication='Basic ....') - - See :class:`~flask.testing.FlaskClient` for more information. - - .. versionchanged:: 0.4 - added support for ``with`` block usage for the client. - - .. versionadded:: 0.7 - The `use_cookies` parameter was added as well as the ability - to override the client to be used by setting the - :attr:`test_client_class` attribute. - - .. versionchanged:: 0.11 - Added `**kwargs` to support passing additional keyword arguments to - the constructor of :attr:`test_client_class`. - """ - cls = self.test_client_class - if cls is None: - from .testing import FlaskClient as cls - return cls( # type: ignore - self, self.response_class, use_cookies=use_cookies, **kwargs - ) - - def test_cli_runner(self, **kwargs: t.Any) -> FlaskCliRunner: - """Create a CLI runner for testing CLI commands. - See :ref:`testing-cli`. - - Returns an instance of :attr:`test_cli_runner_class`, by default - :class:`~flask.testing.FlaskCliRunner`. The Flask app object is - passed as the first argument. - - .. versionadded:: 1.0 - """ - cls = self.test_cli_runner_class - - if cls is None: - from .testing import FlaskCliRunner as cls - - return cls(self, **kwargs) # type: ignore - - def handle_http_exception( - self, e: HTTPException - ) -> HTTPException | ft.ResponseReturnValue: - """Handles an HTTP exception. By default this will invoke the - registered error handlers and fall back to returning the - exception as response. - - .. versionchanged:: 1.0.3 - ``RoutingException``, used internally for actions such as - slash redirects during routing, is not passed to error - handlers. - - .. versionchanged:: 1.0 - Exceptions are looked up by code *and* by MRO, so - ``HTTPException`` subclasses can be handled with a catch-all - handler for the base ``HTTPException``. - - .. versionadded:: 0.3 - """ - # Proxy exceptions don't have error codes. We want to always return - # those unchanged as errors - if e.code is None: - return e - - # RoutingExceptions are used internally to trigger routing - # actions, such as slash redirects raising RequestRedirect. They - # are not raised or handled in user code. - if isinstance(e, RoutingException): - return e - - handler = self._find_error_handler(e, request.blueprints) - if handler is None: - return e - return self.ensure_sync(handler)(e) # type: ignore[no-any-return] - - def handle_user_exception( - self, e: Exception - ) -> HTTPException | ft.ResponseReturnValue: - """This method is called whenever an exception occurs that - should be handled. A special case is :class:`~werkzeug - .exceptions.HTTPException` which is forwarded to the - :meth:`handle_http_exception` method. This function will either - return a response value or reraise the exception with the same - traceback. - - .. versionchanged:: 1.0 - Key errors raised from request data like ``form`` show the - bad key in debug mode rather than a generic bad request - message. - - .. versionadded:: 0.7 - """ - if isinstance(e, BadRequestKeyError) and ( - self.debug or self.config["TRAP_BAD_REQUEST_ERRORS"] - ): - e.show_exception = True - - if isinstance(e, HTTPException) and not self.trap_http_exception(e): - return self.handle_http_exception(e) - - handler = self._find_error_handler(e, request.blueprints) - - if handler is None: - raise - - return self.ensure_sync(handler)(e) # type: ignore[no-any-return] - - def handle_exception(self, e: Exception) -> Response: - """Handle an exception that did not have an error handler - associated with it, or that was raised from an error handler. - This always causes a 500 ``InternalServerError``. - - Always sends the :data:`got_request_exception` signal. - - If :data:`PROPAGATE_EXCEPTIONS` is ``True``, such as in debug - mode, the error will be re-raised so that the debugger can - display it. Otherwise, the original exception is logged, and - an :exc:`~werkzeug.exceptions.InternalServerError` is returned. - - If an error handler is registered for ``InternalServerError`` or - ``500``, it will be used. For consistency, the handler will - always receive the ``InternalServerError``. The original - unhandled exception is available as ``e.original_exception``. - - .. versionchanged:: 1.1.0 - Always passes the ``InternalServerError`` instance to the - handler, setting ``original_exception`` to the unhandled - error. - - .. versionchanged:: 1.1.0 - ``after_request`` functions and other finalization is done - even for the default 500 response when there is no handler. - - .. versionadded:: 0.3 - """ - exc_info = sys.exc_info() - got_request_exception.send(self, _async_wrapper=self.ensure_sync, exception=e) - propagate = self.config["PROPAGATE_EXCEPTIONS"] - - if propagate is None: - propagate = self.testing or self.debug - - if propagate: - # Re-raise if called with an active exception, otherwise - # raise the passed in exception. - if exc_info[1] is e: - raise - - raise e - - self.log_exception(exc_info) - server_error: InternalServerError | ft.ResponseReturnValue - server_error = InternalServerError(original_exception=e) - handler = self._find_error_handler(server_error, request.blueprints) - - if handler is not None: - server_error = self.ensure_sync(handler)(server_error) - - return self.finalize_request(server_error, from_error_handler=True) - - def log_exception( - self, - exc_info: (tuple[type, BaseException, TracebackType] | tuple[None, None, None]), - ) -> None: - """Logs an exception. This is called by :meth:`handle_exception` - if debugging is disabled and right before the handler is called. - The default implementation logs the exception as error on the - :attr:`logger`. - - .. versionadded:: 0.8 - """ - self.logger.error( - f"Exception on {request.path} [{request.method}]", exc_info=exc_info - ) - - def dispatch_request(self) -> ft.ResponseReturnValue: - """Does the request dispatching. Matches the URL and returns the - return value of the view or error handler. This does not have to - be a response object. In order to convert the return value to a - proper response object, call :func:`make_response`. - - .. versionchanged:: 0.7 - This no longer does the exception handling, this code was - moved to the new :meth:`full_dispatch_request`. - """ - req = request_ctx.request - if req.routing_exception is not None: - self.raise_routing_exception(req) - rule: Rule = req.url_rule # type: ignore[assignment] - # if we provide automatic options for this URL and the - # request came with the OPTIONS method, reply automatically - if ( - getattr(rule, "provide_automatic_options", False) - and req.method == "OPTIONS" - ): - return self.make_default_options_response() - # otherwise dispatch to the handler for that endpoint - view_args: dict[str, t.Any] = req.view_args # type: ignore[assignment] - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - - def full_dispatch_request(self) -> Response: - """Dispatches the request and on top of that performs request - pre and postprocessing as well as HTTP exception catching and - error handling. - - .. versionadded:: 0.7 - """ - self._got_first_request = True - - try: - request_started.send(self, _async_wrapper=self.ensure_sync) - rv = self.preprocess_request() - if rv is None: - rv = self.dispatch_request() - except Exception as e: - rv = self.handle_user_exception(e) - return self.finalize_request(rv) - - def finalize_request( - self, - rv: ft.ResponseReturnValue | HTTPException, - from_error_handler: bool = False, - ) -> Response: - """Given the return value from a view function this finalizes - the request by converting it into a response and invoking the - postprocessing functions. This is invoked for both normal - request dispatching as well as error handlers. - - Because this means that it might be called as a result of a - failure a special safe mode is available which can be enabled - with the `from_error_handler` flag. If enabled, failures in - response processing will be logged and otherwise ignored. - - :internal: - """ - response = self.make_response(rv) - try: - response = self.process_response(response) - request_finished.send( - self, _async_wrapper=self.ensure_sync, response=response - ) - except Exception: - if not from_error_handler: - raise - self.logger.exception( - "Request finalizing failed with an error while handling an error" - ) - return response - - def make_default_options_response(self) -> Response: - """This method is called to create the default ``OPTIONS`` response. - This can be changed through subclassing to change the default - behavior of ``OPTIONS`` responses. - - .. versionadded:: 0.7 - """ - adapter = request_ctx.url_adapter - methods = adapter.allowed_methods() # type: ignore[union-attr] - rv = self.response_class() - rv.allow.update(methods) - return rv - - def ensure_sync(self, func: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: - """Ensure that the function is synchronous for WSGI workers. - Plain ``def`` functions are returned as-is. ``async def`` - functions are wrapped to run and wait for the response. - - Override this method to change how the app runs async views. - - .. versionadded:: 2.0 - """ - if iscoroutinefunction(func): - return self.async_to_sync(func) - - return func - - def async_to_sync( - self, func: t.Callable[..., t.Coroutine[t.Any, t.Any, t.Any]] - ) -> t.Callable[..., t.Any]: - """Return a sync function that will run the coroutine function. - - .. code-block:: python - - result = app.async_to_sync(func)(*args, **kwargs) - - Override this method to change how the app converts async code - to be synchronously callable. - - .. versionadded:: 2.0 - """ - try: - from asgiref.sync import async_to_sync as asgiref_async_to_sync - except ImportError: - raise RuntimeError( - "Install Flask with the 'async' extra in order to use async views." - ) from None - - return asgiref_async_to_sync(func) - - def url_for( - self, - /, - endpoint: str, - *, - _anchor: str | None = None, - _method: str | None = None, - _scheme: str | None = None, - _external: bool | None = None, - **values: t.Any, - ) -> str: - """Generate a URL to the given endpoint with the given values. - - This is called by :func:`flask.url_for`, and can be called - directly as well. - - An *endpoint* is the name of a URL rule, usually added with - :meth:`@app.route() `, and usually the same name as the - view function. A route defined in a :class:`~flask.Blueprint` - will prepend the blueprint's name separated by a ``.`` to the - endpoint. - - In some cases, such as email messages, you want URLs to include - the scheme and domain, like ``https://example.com/hello``. When - not in an active request, URLs will be external by default, but - this requires setting :data:`SERVER_NAME` so Flask knows what - domain to use. :data:`APPLICATION_ROOT` and - :data:`PREFERRED_URL_SCHEME` should also be configured as - needed. This config is only used when not in an active request. - - Functions can be decorated with :meth:`url_defaults` to modify - keyword arguments before the URL is built. - - If building fails for some reason, such as an unknown endpoint - or incorrect values, the app's :meth:`handle_url_build_error` - method is called. If that returns a string, that is returned, - otherwise a :exc:`~werkzeug.routing.BuildError` is raised. - - :param endpoint: The endpoint name associated with the URL to - generate. If this starts with a ``.``, the current blueprint - name (if any) will be used. - :param _anchor: If given, append this as ``#anchor`` to the URL. - :param _method: If given, generate the URL associated with this - method for the endpoint. - :param _scheme: If given, the URL will have this scheme if it - is external. - :param _external: If given, prefer the URL to be internal - (False) or require it to be external (True). External URLs - include the scheme and domain. When not in an active - request, URLs are external by default. - :param values: Values to use for the variable parts of the URL - rule. Unknown keys are appended as query string arguments, - like ``?a=b&c=d``. - - .. versionadded:: 2.2 - Moved from ``flask.url_for``, which calls this method. - """ - req_ctx = _cv_request.get(None) - - if req_ctx is not None: - url_adapter = req_ctx.url_adapter - blueprint_name = req_ctx.request.blueprint - - # If the endpoint starts with "." and the request matches a - # blueprint, the endpoint is relative to the blueprint. - if endpoint[:1] == ".": - if blueprint_name is not None: - endpoint = f"{blueprint_name}{endpoint}" - else: - endpoint = endpoint[1:] - - # When in a request, generate a URL without scheme and - # domain by default, unless a scheme is given. - if _external is None: - _external = _scheme is not None - else: - app_ctx = _cv_app.get(None) - - # If called by helpers.url_for, an app context is active, - # use its url_adapter. Otherwise, app.url_for was called - # directly, build an adapter. - if app_ctx is not None: - url_adapter = app_ctx.url_adapter - else: - url_adapter = self.create_url_adapter(None) - - if url_adapter is None: - raise RuntimeError( - "Unable to build URLs outside an active request" - " without 'SERVER_NAME' configured. Also configure" - " 'APPLICATION_ROOT' and 'PREFERRED_URL_SCHEME' as" - " needed." - ) - - # When outside a request, generate a URL with scheme and - # domain by default. - if _external is None: - _external = True - - # It is an error to set _scheme when _external=False, in order - # to avoid accidental insecure URLs. - if _scheme is not None and not _external: - raise ValueError("When specifying '_scheme', '_external' must be True.") - - self.inject_url_defaults(endpoint, values) - - try: - rv = url_adapter.build( # type: ignore[union-attr] - endpoint, - values, - method=_method, - url_scheme=_scheme, - force_external=_external, - ) - except BuildError as error: - values.update( - _anchor=_anchor, _method=_method, _scheme=_scheme, _external=_external - ) - return self.handle_url_build_error(error, endpoint, values) - - if _anchor is not None: - _anchor = _url_quote(_anchor, safe="%!#$&'()*+,/:;=?@") - rv = f"{rv}#{_anchor}" - - return rv - - def make_response(self, rv: ft.ResponseReturnValue) -> Response: - """Convert the return value from a view function to an instance of - :attr:`response_class`. - - :param rv: the return value from the view function. The view function - must return a response. Returning ``None``, or the view ending - without returning, is not allowed. The following types are allowed - for ``view_rv``: - - ``str`` - A response object is created with the string encoded to UTF-8 - as the body. - - ``bytes`` - A response object is created with the bytes as the body. - - ``dict`` - A dictionary that will be jsonify'd before being returned. - - ``list`` - A list that will be jsonify'd before being returned. - - ``generator`` or ``iterator`` - A generator that returns ``str`` or ``bytes`` to be - streamed as the response. - - ``tuple`` - Either ``(body, status, headers)``, ``(body, status)``, or - ``(body, headers)``, where ``body`` is any of the other types - allowed here, ``status`` is a string or an integer, and - ``headers`` is a dictionary or a list of ``(key, value)`` - tuples. If ``body`` is a :attr:`response_class` instance, - ``status`` overwrites the exiting value and ``headers`` are - extended. - - :attr:`response_class` - The object is returned unchanged. - - other :class:`~werkzeug.wrappers.Response` class - The object is coerced to :attr:`response_class`. - - :func:`callable` - The function is called as a WSGI application. The result is - used to create a response object. - - .. versionchanged:: 2.2 - A generator will be converted to a streaming response. - A list will be converted to a JSON response. - - .. versionchanged:: 1.1 - A dict will be converted to a JSON response. - - .. versionchanged:: 0.9 - Previously a tuple was interpreted as the arguments for the - response object. - """ - - status: int | None = None - headers: HeadersValue | None = None - - # unpack tuple returns - if isinstance(rv, tuple): - len_rv = len(rv) - - # a 3-tuple is unpacked directly - if len_rv == 3: - rv, status, headers = rv # type: ignore[misc] - # decide if a 2-tuple has status or headers - elif len_rv == 2: - if isinstance(rv[1], (Headers, dict, tuple, list)): - rv, headers = rv # pyright: ignore - else: - rv, status = rv # type: ignore[assignment,misc] - # other sized tuples are not allowed - else: - raise TypeError( - "The view function did not return a valid response tuple." - " The tuple must have the form (body, status, headers)," - " (body, status), or (body, headers)." - ) - - # the body must not be None - if rv is None: - raise TypeError( - f"The view function for {request.endpoint!r} did not" - " return a valid response. The function either returned" - " None or ended without a return statement." - ) - - # make sure the body is an instance of the response class - if not isinstance(rv, self.response_class): - if isinstance(rv, (str, bytes, bytearray)) or isinstance(rv, cabc.Iterator): - # let the response class set the status and headers instead of - # waiting to do it manually, so that the class can handle any - # special logic - rv = self.response_class( - rv, # pyright: ignore - status=status, - headers=headers, # type: ignore[arg-type] - ) - status = headers = None - elif isinstance(rv, (dict, list)): - rv = self.json.response(rv) - elif isinstance(rv, BaseResponse) or callable(rv): - # evaluate a WSGI callable, or coerce a different response - # class to the correct type - try: - rv = self.response_class.force_type( - rv, # type: ignore[arg-type] - request.environ, - ) - except TypeError as e: - raise TypeError( - f"{e}\nThe view function did not return a valid" - " response. The return type must be a string," - " dict, list, tuple with headers or status," - " Response instance, or WSGI callable, but it" - f" was a {type(rv).__name__}." - ).with_traceback(sys.exc_info()[2]) from None - else: - raise TypeError( - "The view function did not return a valid" - " response. The return type must be a string," - " dict, list, tuple with headers or status," - " Response instance, or WSGI callable, but it was a" - f" {type(rv).__name__}." - ) - - rv = t.cast(Response, rv) - # prefer the status if it was provided - if status is not None: - if isinstance(status, (str, bytes, bytearray)): - rv.status = status - else: - rv.status_code = status - - # extend existing headers with provided headers - if headers: - rv.headers.update(headers) - - return rv - - def preprocess_request(self) -> ft.ResponseReturnValue | None: - """Called before the request is dispatched. Calls - :attr:`url_value_preprocessors` registered with the app and the - current blueprint (if any). Then calls :attr:`before_request_funcs` - registered with the app and the blueprint. - - If any :meth:`before_request` handler returns a non-None value, the - value is handled as if it was the return value from the view, and - further request handling is stopped. - """ - names = (None, *reversed(request.blueprints)) - - for name in names: - if name in self.url_value_preprocessors: - for url_func in self.url_value_preprocessors[name]: - url_func(request.endpoint, request.view_args) - - for name in names: - if name in self.before_request_funcs: - for before_func in self.before_request_funcs[name]: - rv = self.ensure_sync(before_func)() - - if rv is not None: - return rv # type: ignore[no-any-return] - - return None - - def process_response(self, response: Response) -> Response: - """Can be overridden in order to modify the response object - before it's sent to the WSGI server. By default this will - call all the :meth:`after_request` decorated functions. - - .. versionchanged:: 0.5 - As of Flask 0.5 the functions registered for after request - execution are called in reverse order of registration. - - :param response: a :attr:`response_class` object. - :return: a new response object or the same, has to be an - instance of :attr:`response_class`. - """ - ctx = request_ctx._get_current_object() # type: ignore[attr-defined] - - for func in ctx._after_request_functions: - response = self.ensure_sync(func)(response) - - for name in chain(request.blueprints, (None,)): - if name in self.after_request_funcs: - for func in reversed(self.after_request_funcs[name]): - response = self.ensure_sync(func)(response) - - if not self.session_interface.is_null_session(ctx.session): - self.session_interface.save_session(self, ctx.session, response) - - return response - - def do_teardown_request( - self, - exc: BaseException | None = _sentinel, # type: ignore[assignment] - ) -> None: - """Called after the request is dispatched and the response is - returned, right before the request context is popped. - - This calls all functions decorated with - :meth:`teardown_request`, and :meth:`Blueprint.teardown_request` - if a blueprint handled the request. Finally, the - :data:`request_tearing_down` signal is sent. - - This is called by - :meth:`RequestContext.pop() `, - which may be delayed during testing to maintain access to - resources. - - :param exc: An unhandled exception raised while dispatching the - request. Detected from the current exception information if - not passed. Passed to each teardown function. - - .. versionchanged:: 0.9 - Added the ``exc`` argument. - """ - if exc is _sentinel: - exc = sys.exc_info()[1] - - for name in chain(request.blueprints, (None,)): - if name in self.teardown_request_funcs: - for func in reversed(self.teardown_request_funcs[name]): - self.ensure_sync(func)(exc) - - request_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) - - def do_teardown_appcontext( - self, - exc: BaseException | None = _sentinel, # type: ignore[assignment] - ) -> None: - """Called right before the application context is popped. - - When handling a request, the application context is popped - after the request context. See :meth:`do_teardown_request`. - - This calls all functions decorated with - :meth:`teardown_appcontext`. Then the - :data:`appcontext_tearing_down` signal is sent. - - This is called by - :meth:`AppContext.pop() `. - - .. versionadded:: 0.9 - """ - if exc is _sentinel: - exc = sys.exc_info()[1] - - for func in reversed(self.teardown_appcontext_funcs): - self.ensure_sync(func)(exc) - - appcontext_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) - - def app_context(self) -> AppContext: - """Create an :class:`~flask.ctx.AppContext`. Use as a ``with`` - block to push the context, which will make :data:`current_app` - point at this application. - - An application context is automatically pushed by - :meth:`RequestContext.push() ` - when handling a request, and when running a CLI command. Use - this to manually create a context outside of these situations. - - :: - - with app.app_context(): - init_db() - - See :doc:`/appcontext`. - - .. versionadded:: 0.9 - """ - return AppContext(self) - - def request_context(self, environ: WSGIEnvironment) -> RequestContext: - """Create a :class:`~flask.ctx.RequestContext` representing a - WSGI environment. Use a ``with`` block to push the context, - which will make :data:`request` point at this request. - - See :doc:`/reqcontext`. - - Typically you should not call this from your own code. A request - context is automatically pushed by the :meth:`wsgi_app` when - handling a request. Use :meth:`test_request_context` to create - an environment and context instead of this method. - - :param environ: a WSGI environment - """ - return RequestContext(self, environ) - - def test_request_context(self, *args: t.Any, **kwargs: t.Any) -> RequestContext: - """Create a :class:`~flask.ctx.RequestContext` for a WSGI - environment created from the given values. This is mostly useful - during testing, where you may want to run a function that uses - request data without dispatching a full request. - - See :doc:`/reqcontext`. - - Use a ``with`` block to push the context, which will make - :data:`request` point at the request for the created - environment. :: - - with app.test_request_context(...): - generate_report() - - When using the shell, it may be easier to push and pop the - context manually to avoid indentation. :: - - ctx = app.test_request_context(...) - ctx.push() - ... - ctx.pop() - - Takes the same arguments as Werkzeug's - :class:`~werkzeug.test.EnvironBuilder`, with some defaults from - the application. See the linked Werkzeug docs for most of the - available arguments. Flask-specific behavior is listed here. - - :param path: URL path being requested. - :param base_url: Base URL where the app is being served, which - ``path`` is relative to. If not given, built from - :data:`PREFERRED_URL_SCHEME`, ``subdomain``, - :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. - :param subdomain: Subdomain name to append to - :data:`SERVER_NAME`. - :param url_scheme: Scheme to use instead of - :data:`PREFERRED_URL_SCHEME`. - :param data: The request body, either as a string or a dict of - form keys and values. - :param json: If given, this is serialized as JSON and passed as - ``data``. Also defaults ``content_type`` to - ``application/json``. - :param args: other positional arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - :param kwargs: other keyword arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - """ - from .testing import EnvironBuilder - - builder = EnvironBuilder(self, *args, **kwargs) - - try: - return self.request_context(builder.get_environ()) - finally: - builder.close() - - def wsgi_app( - self, environ: WSGIEnvironment, start_response: StartResponse - ) -> cabc.Iterable[bytes]: - """The actual WSGI application. This is not implemented in - :meth:`__call__` so that middlewares can be applied without - losing a reference to the app object. Instead of doing this:: - - app = MyMiddleware(app) - - It's a better idea to do this instead:: - - app.wsgi_app = MyMiddleware(app.wsgi_app) - - Then you still have the original application object around and - can continue to call methods on it. - - .. versionchanged:: 0.7 - Teardown events for the request and app contexts are called - even if an unhandled error occurs. Other events may not be - called depending on when an error occurs during dispatch. - See :ref:`callbacks-and-errors`. - - :param environ: A WSGI environment. - :param start_response: A callable accepting a status code, - a list of headers, and an optional exception context to - start the response. - """ - ctx = self.request_context(environ) - error: BaseException | None = None - try: - try: - ctx.push() - response = self.full_dispatch_request() - except Exception as e: - error = e - response = self.handle_exception(e) - except: # noqa: B001 - error = sys.exc_info()[1] - raise - return response(environ, start_response) - finally: - if "werkzeug.debug.preserve_context" in environ: - environ["werkzeug.debug.preserve_context"](_cv_app.get()) - environ["werkzeug.debug.preserve_context"](_cv_request.get()) - - if error is not None and self.should_ignore_error(error): - error = None - - ctx.pop(error) - - def __call__( - self, environ: WSGIEnvironment, start_response: StartResponse - ) -> cabc.Iterable[bytes]: - """The WSGI server calls the Flask application object as the - WSGI application. This calls :meth:`wsgi_app`, which can be - wrapped to apply middleware. - """ - return self.wsgi_app(environ, start_response) diff --git a/venv/lib/python3.12/site-packages/flask/blueprints.py b/venv/lib/python3.12/site-packages/flask/blueprints.py deleted file mode 100644 index b6d4e433..00000000 --- a/venv/lib/python3.12/site-packages/flask/blueprints.py +++ /dev/null @@ -1,128 +0,0 @@ -from __future__ import annotations - -import os -import typing as t -from datetime import timedelta - -from .cli import AppGroup -from .globals import current_app -from .helpers import send_from_directory -from .sansio.blueprints import Blueprint as SansioBlueprint -from .sansio.blueprints import BlueprintSetupState as BlueprintSetupState # noqa -from .sansio.scaffold import _sentinel - -if t.TYPE_CHECKING: # pragma: no cover - from .wrappers import Response - - -class Blueprint(SansioBlueprint): - def __init__( - self, - name: str, - import_name: str, - static_folder: str | os.PathLike[str] | None = None, - static_url_path: str | None = None, - template_folder: str | os.PathLike[str] | None = None, - url_prefix: str | None = None, - subdomain: str | None = None, - url_defaults: dict[str, t.Any] | None = None, - root_path: str | None = None, - cli_group: str | None = _sentinel, # type: ignore - ) -> None: - super().__init__( - name, - import_name, - static_folder, - static_url_path, - template_folder, - url_prefix, - subdomain, - url_defaults, - root_path, - cli_group, - ) - - #: The Click command group for registering CLI commands for this - #: object. The commands are available from the ``flask`` command - #: once the application has been discovered and blueprints have - #: been registered. - self.cli = AppGroup() - - # Set the name of the Click group in case someone wants to add - # the app's commands to another CLI tool. - self.cli.name = self.name - - def get_send_file_max_age(self, filename: str | None) -> int | None: - """Used by :func:`send_file` to determine the ``max_age`` cache - value for a given file path if it wasn't passed. - - By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from - the configuration of :data:`~flask.current_app`. This defaults - to ``None``, which tells the browser to use conditional requests - instead of a timed cache, which is usually preferable. - - Note this is a duplicate of the same method in the Flask - class. - - .. versionchanged:: 2.0 - The default configuration is ``None`` instead of 12 hours. - - .. versionadded:: 0.9 - """ - value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] - - if value is None: - return None - - if isinstance(value, timedelta): - return int(value.total_seconds()) - - return value # type: ignore[no-any-return] - - def send_static_file(self, filename: str) -> Response: - """The view function used to serve files from - :attr:`static_folder`. A route is automatically registered for - this view at :attr:`static_url_path` if :attr:`static_folder` is - set. - - Note this is a duplicate of the same method in the Flask - class. - - .. versionadded:: 0.5 - - """ - if not self.has_static_folder: - raise RuntimeError("'static_folder' must be set to serve static_files.") - - # send_file only knows to call get_send_file_max_age on the app, - # call it here so it works for blueprints too. - max_age = self.get_send_file_max_age(filename) - return send_from_directory( - t.cast(str, self.static_folder), filename, max_age=max_age - ) - - def open_resource( - self, resource: str, mode: str = "rb", encoding: str | None = "utf-8" - ) -> t.IO[t.AnyStr]: - """Open a resource file relative to :attr:`root_path` for reading. The - blueprint-relative equivalent of the app's :meth:`~.Flask.open_resource` - method. - - :param resource: Path to the resource relative to :attr:`root_path`. - :param mode: Open the file in this mode. Only reading is supported, - valid values are ``"r"`` (or ``"rt"``) and ``"rb"``. - :param encoding: Open the file with this encoding when opening in text - mode. This is ignored when opening in binary mode. - - .. versionchanged:: 3.1 - Added the ``encoding`` parameter. - """ - if mode not in {"r", "rt", "rb"}: - raise ValueError("Resources can only be opened for reading.") - - path = os.path.join(self.root_path, resource) - - if mode == "rb": - return open(path, mode) # pyright: ignore - - return open(path, mode, encoding=encoding) diff --git a/venv/lib/python3.12/site-packages/flask/cli.py b/venv/lib/python3.12/site-packages/flask/cli.py deleted file mode 100644 index ed11f256..00000000 --- a/venv/lib/python3.12/site-packages/flask/cli.py +++ /dev/null @@ -1,1135 +0,0 @@ -from __future__ import annotations - -import ast -import collections.abc as cabc -import importlib.metadata -import inspect -import os -import platform -import re -import sys -import traceback -import typing as t -from functools import update_wrapper -from operator import itemgetter -from types import ModuleType - -import click -from click.core import ParameterSource -from werkzeug import run_simple -from werkzeug.serving import is_running_from_reloader -from werkzeug.utils import import_string - -from .globals import current_app -from .helpers import get_debug_flag -from .helpers import get_load_dotenv - -if t.TYPE_CHECKING: - import ssl - - from _typeshed.wsgi import StartResponse - from _typeshed.wsgi import WSGIApplication - from _typeshed.wsgi import WSGIEnvironment - - from .app import Flask - - -class NoAppException(click.UsageError): - """Raised if an application cannot be found or loaded.""" - - -def find_best_app(module: ModuleType) -> Flask: - """Given a module instance this tries to find the best possible - application in the module or raises an exception. - """ - from . import Flask - - # Search for the most common names first. - for attr_name in ("app", "application"): - app = getattr(module, attr_name, None) - - if isinstance(app, Flask): - return app - - # Otherwise find the only object that is a Flask instance. - matches = [v for v in module.__dict__.values() if isinstance(v, Flask)] - - if len(matches) == 1: - return matches[0] - elif len(matches) > 1: - raise NoAppException( - "Detected multiple Flask applications in module" - f" '{module.__name__}'. Use '{module.__name__}:name'" - " to specify the correct one." - ) - - # Search for app factory functions. - for attr_name in ("create_app", "make_app"): - app_factory = getattr(module, attr_name, None) - - if inspect.isfunction(app_factory): - try: - app = app_factory() - - if isinstance(app, Flask): - return app - except TypeError as e: - if not _called_with_wrong_args(app_factory): - raise - - raise NoAppException( - f"Detected factory '{attr_name}' in module '{module.__name__}'," - " but could not call it without arguments. Use" - f" '{module.__name__}:{attr_name}(args)'" - " to specify arguments." - ) from e - - raise NoAppException( - "Failed to find Flask application or factory in module" - f" '{module.__name__}'. Use '{module.__name__}:name'" - " to specify one." - ) - - -def _called_with_wrong_args(f: t.Callable[..., Flask]) -> bool: - """Check whether calling a function raised a ``TypeError`` because - the call failed or because something in the factory raised the - error. - - :param f: The function that was called. - :return: ``True`` if the call failed. - """ - tb = sys.exc_info()[2] - - try: - while tb is not None: - if tb.tb_frame.f_code is f.__code__: - # In the function, it was called successfully. - return False - - tb = tb.tb_next - - # Didn't reach the function. - return True - finally: - # Delete tb to break a circular reference. - # https://docs.python.org/2/library/sys.html#sys.exc_info - del tb - - -def find_app_by_string(module: ModuleType, app_name: str) -> Flask: - """Check if the given string is a variable name or a function. Call - a function to get the app instance, or return the variable directly. - """ - from . import Flask - - # Parse app_name as a single expression to determine if it's a valid - # attribute name or function call. - try: - expr = ast.parse(app_name.strip(), mode="eval").body - except SyntaxError: - raise NoAppException( - f"Failed to parse {app_name!r} as an attribute name or function call." - ) from None - - if isinstance(expr, ast.Name): - name = expr.id - args = [] - kwargs = {} - elif isinstance(expr, ast.Call): - # Ensure the function name is an attribute name only. - if not isinstance(expr.func, ast.Name): - raise NoAppException( - f"Function reference must be a simple name: {app_name!r}." - ) - - name = expr.func.id - - # Parse the positional and keyword arguments as literals. - try: - args = [ast.literal_eval(arg) for arg in expr.args] - kwargs = { - kw.arg: ast.literal_eval(kw.value) - for kw in expr.keywords - if kw.arg is not None - } - except ValueError: - # literal_eval gives cryptic error messages, show a generic - # message with the full expression instead. - raise NoAppException( - f"Failed to parse arguments as literal values: {app_name!r}." - ) from None - else: - raise NoAppException( - f"Failed to parse {app_name!r} as an attribute name or function call." - ) - - try: - attr = getattr(module, name) - except AttributeError as e: - raise NoAppException( - f"Failed to find attribute {name!r} in {module.__name__!r}." - ) from e - - # If the attribute is a function, call it with any args and kwargs - # to get the real application. - if inspect.isfunction(attr): - try: - app = attr(*args, **kwargs) - except TypeError as e: - if not _called_with_wrong_args(attr): - raise - - raise NoAppException( - f"The factory {app_name!r} in module" - f" {module.__name__!r} could not be called with the" - " specified arguments." - ) from e - else: - app = attr - - if isinstance(app, Flask): - return app - - raise NoAppException( - "A valid Flask application was not obtained from" - f" '{module.__name__}:{app_name}'." - ) - - -def prepare_import(path: str) -> str: - """Given a filename this will try to calculate the python path, add it - to the search path and return the actual module name that is expected. - """ - path = os.path.realpath(path) - - fname, ext = os.path.splitext(path) - if ext == ".py": - path = fname - - if os.path.basename(path) == "__init__": - path = os.path.dirname(path) - - module_name = [] - - # move up until outside package structure (no __init__.py) - while True: - path, name = os.path.split(path) - module_name.append(name) - - if not os.path.exists(os.path.join(path, "__init__.py")): - break - - if sys.path[0] != path: - sys.path.insert(0, path) - - return ".".join(module_name[::-1]) - - -@t.overload -def locate_app( - module_name: str, app_name: str | None, raise_if_not_found: t.Literal[True] = True -) -> Flask: ... - - -@t.overload -def locate_app( - module_name: str, app_name: str | None, raise_if_not_found: t.Literal[False] = ... -) -> Flask | None: ... - - -def locate_app( - module_name: str, app_name: str | None, raise_if_not_found: bool = True -) -> Flask | None: - try: - __import__(module_name) - except ImportError: - # Reraise the ImportError if it occurred within the imported module. - # Determine this by checking whether the trace has a depth > 1. - if sys.exc_info()[2].tb_next: # type: ignore[union-attr] - raise NoAppException( - f"While importing {module_name!r}, an ImportError was" - f" raised:\n\n{traceback.format_exc()}" - ) from None - elif raise_if_not_found: - raise NoAppException(f"Could not import {module_name!r}.") from None - else: - return None - - module = sys.modules[module_name] - - if app_name is None: - return find_best_app(module) - else: - return find_app_by_string(module, app_name) - - -def get_version(ctx: click.Context, param: click.Parameter, value: t.Any) -> None: - if not value or ctx.resilient_parsing: - return - - flask_version = importlib.metadata.version("flask") - werkzeug_version = importlib.metadata.version("werkzeug") - - click.echo( - f"Python {platform.python_version()}\n" - f"Flask {flask_version}\n" - f"Werkzeug {werkzeug_version}", - color=ctx.color, - ) - ctx.exit() - - -version_option = click.Option( - ["--version"], - help="Show the Flask version.", - expose_value=False, - callback=get_version, - is_flag=True, - is_eager=True, -) - - -class ScriptInfo: - """Helper object to deal with Flask applications. This is usually not - necessary to interface with as it's used internally in the dispatching - to click. In future versions of Flask this object will most likely play - a bigger role. Typically it's created automatically by the - :class:`FlaskGroup` but you can also manually create it and pass it - onwards as click object. - - .. versionchanged:: 3.1 - Added the ``load_dotenv_defaults`` parameter and attribute. - """ - - def __init__( - self, - app_import_path: str | None = None, - create_app: t.Callable[..., Flask] | None = None, - set_debug_flag: bool = True, - load_dotenv_defaults: bool = True, - ) -> None: - #: Optionally the import path for the Flask application. - self.app_import_path = app_import_path - #: Optionally a function that is passed the script info to create - #: the instance of the application. - self.create_app = create_app - #: A dictionary with arbitrary data that can be associated with - #: this script info. - self.data: dict[t.Any, t.Any] = {} - self.set_debug_flag = set_debug_flag - - self.load_dotenv_defaults = get_load_dotenv(load_dotenv_defaults) - """Whether default ``.flaskenv`` and ``.env`` files should be loaded. - - ``ScriptInfo`` doesn't load anything, this is for reference when doing - the load elsewhere during processing. - - .. versionadded:: 3.1 - """ - - self._loaded_app: Flask | None = None - - def load_app(self) -> Flask: - """Loads the Flask app (if not yet loaded) and returns it. Calling - this multiple times will just result in the already loaded app to - be returned. - """ - if self._loaded_app is not None: - return self._loaded_app - app: Flask | None = None - if self.create_app is not None: - app = self.create_app() - else: - if self.app_import_path: - path, name = ( - re.split(r":(?![\\/])", self.app_import_path, maxsplit=1) + [None] - )[:2] - import_name = prepare_import(path) - app = locate_app(import_name, name) - else: - for path in ("wsgi.py", "app.py"): - import_name = prepare_import(path) - app = locate_app(import_name, None, raise_if_not_found=False) - - if app is not None: - break - - if app is None: - raise NoAppException( - "Could not locate a Flask application. Use the" - " 'flask --app' option, 'FLASK_APP' environment" - " variable, or a 'wsgi.py' or 'app.py' file in the" - " current directory." - ) - - if self.set_debug_flag: - # Update the app's debug flag through the descriptor so that - # other values repopulate as well. - app.debug = get_debug_flag() - - self._loaded_app = app - return app - - -pass_script_info = click.make_pass_decorator(ScriptInfo, ensure=True) - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - - -def with_appcontext(f: F) -> F: - """Wraps a callback so that it's guaranteed to be executed with the - script's application context. - - Custom commands (and their options) registered under ``app.cli`` or - ``blueprint.cli`` will always have an app context available, this - decorator is not required in that case. - - .. versionchanged:: 2.2 - The app context is active for subcommands as well as the - decorated callback. The app context is always available to - ``app.cli`` command and parameter callbacks. - """ - - @click.pass_context - def decorator(ctx: click.Context, /, *args: t.Any, **kwargs: t.Any) -> t.Any: - if not current_app: - app = ctx.ensure_object(ScriptInfo).load_app() - ctx.with_resource(app.app_context()) - - return ctx.invoke(f, *args, **kwargs) - - return update_wrapper(decorator, f) # type: ignore[return-value] - - -class AppGroup(click.Group): - """This works similar to a regular click :class:`~click.Group` but it - changes the behavior of the :meth:`command` decorator so that it - automatically wraps the functions in :func:`with_appcontext`. - - Not to be confused with :class:`FlaskGroup`. - """ - - def command( # type: ignore[override] - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], click.Command]: - """This works exactly like the method of the same name on a regular - :class:`click.Group` but it wraps callbacks in :func:`with_appcontext` - unless it's disabled by passing ``with_appcontext=False``. - """ - wrap_for_ctx = kwargs.pop("with_appcontext", True) - - def decorator(f: t.Callable[..., t.Any]) -> click.Command: - if wrap_for_ctx: - f = with_appcontext(f) - return super(AppGroup, self).command(*args, **kwargs)(f) # type: ignore[no-any-return] - - return decorator - - def group( # type: ignore[override] - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], click.Group]: - """This works exactly like the method of the same name on a regular - :class:`click.Group` but it defaults the group class to - :class:`AppGroup`. - """ - kwargs.setdefault("cls", AppGroup) - return super().group(*args, **kwargs) # type: ignore[no-any-return] - - -def _set_app(ctx: click.Context, param: click.Option, value: str | None) -> str | None: - if value is None: - return None - - info = ctx.ensure_object(ScriptInfo) - info.app_import_path = value - return value - - -# This option is eager so the app will be available if --help is given. -# --help is also eager, so --app must be before it in the param list. -# no_args_is_help bypasses eager processing, so this option must be -# processed manually in that case to ensure FLASK_APP gets picked up. -_app_option = click.Option( - ["-A", "--app"], - metavar="IMPORT", - help=( - "The Flask application or factory function to load, in the form 'module:name'." - " Module can be a dotted import or file path. Name is not required if it is" - " 'app', 'application', 'create_app', or 'make_app', and can be 'name(args)' to" - " pass arguments." - ), - is_eager=True, - expose_value=False, - callback=_set_app, -) - - -def _set_debug(ctx: click.Context, param: click.Option, value: bool) -> bool | None: - # If the flag isn't provided, it will default to False. Don't use - # that, let debug be set by env in that case. - source = ctx.get_parameter_source(param.name) # type: ignore[arg-type] - - if source is not None and source in ( - ParameterSource.DEFAULT, - ParameterSource.DEFAULT_MAP, - ): - return None - - # Set with env var instead of ScriptInfo.load so that it can be - # accessed early during a factory function. - os.environ["FLASK_DEBUG"] = "1" if value else "0" - return value - - -_debug_option = click.Option( - ["--debug/--no-debug"], - help="Set debug mode.", - expose_value=False, - callback=_set_debug, -) - - -def _env_file_callback( - ctx: click.Context, param: click.Option, value: str | None -) -> str | None: - try: - import dotenv # noqa: F401 - except ImportError: - # Only show an error if a value was passed, otherwise we still want to - # call load_dotenv and show a message without exiting. - if value is not None: - raise click.BadParameter( - "python-dotenv must be installed to load an env file.", - ctx=ctx, - param=param, - ) from None - - # Load if a value was passed, or we want to load default files, or both. - if value is not None or ctx.obj.load_dotenv_defaults: - load_dotenv(value, load_defaults=ctx.obj.load_dotenv_defaults) - - return value - - -# This option is eager so env vars are loaded as early as possible to be -# used by other options. -_env_file_option = click.Option( - ["-e", "--env-file"], - type=click.Path(exists=True, dir_okay=False), - help=( - "Load environment variables from this file, taking precedence over" - " those set by '.env' and '.flaskenv'. Variables set directly in the" - " environment take highest precedence. python-dotenv must be installed." - ), - is_eager=True, - expose_value=False, - callback=_env_file_callback, -) - - -class FlaskGroup(AppGroup): - """Special subclass of the :class:`AppGroup` group that supports - loading more commands from the configured Flask app. Normally a - developer does not have to interface with this class but there are - some very advanced use cases for which it makes sense to create an - instance of this. see :ref:`custom-scripts`. - - :param add_default_commands: if this is True then the default run and - shell commands will be added. - :param add_version_option: adds the ``--version`` option. - :param create_app: an optional callback that is passed the script info and - returns the loaded app. - :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` - files to set environment variables. Will also change the working - directory to the directory containing the first file found. - :param set_debug_flag: Set the app's debug flag. - - .. versionchanged:: 3.1 - ``-e path`` takes precedence over default ``.env`` and ``.flaskenv`` files. - - .. versionchanged:: 2.2 - Added the ``-A/--app``, ``--debug/--no-debug``, ``-e/--env-file`` options. - - .. versionchanged:: 2.2 - An app context is pushed when running ``app.cli`` commands, so - ``@with_appcontext`` is no longer required for those commands. - - .. versionchanged:: 1.0 - If installed, python-dotenv will be used to load environment variables - from :file:`.env` and :file:`.flaskenv` files. - """ - - def __init__( - self, - add_default_commands: bool = True, - create_app: t.Callable[..., Flask] | None = None, - add_version_option: bool = True, - load_dotenv: bool = True, - set_debug_flag: bool = True, - **extra: t.Any, - ) -> None: - params: list[click.Parameter] = list(extra.pop("params", None) or ()) - # Processing is done with option callbacks instead of a group - # callback. This allows users to make a custom group callback - # without losing the behavior. --env-file must come first so - # that it is eagerly evaluated before --app. - params.extend((_env_file_option, _app_option, _debug_option)) - - if add_version_option: - params.append(version_option) - - if "context_settings" not in extra: - extra["context_settings"] = {} - - extra["context_settings"].setdefault("auto_envvar_prefix", "FLASK") - - super().__init__(params=params, **extra) - - self.create_app = create_app - self.load_dotenv = load_dotenv - self.set_debug_flag = set_debug_flag - - if add_default_commands: - self.add_command(run_command) - self.add_command(shell_command) - self.add_command(routes_command) - - self._loaded_plugin_commands = False - - def _load_plugin_commands(self) -> None: - if self._loaded_plugin_commands: - return - - if sys.version_info >= (3, 10): - from importlib import metadata - else: - # Use a backport on Python < 3.10. We technically have - # importlib.metadata on 3.8+, but the API changed in 3.10, - # so use the backport for consistency. - import importlib_metadata as metadata # pyright: ignore - - for ep in metadata.entry_points(group="flask.commands"): - self.add_command(ep.load(), ep.name) - - self._loaded_plugin_commands = True - - def get_command(self, ctx: click.Context, name: str) -> click.Command | None: - self._load_plugin_commands() - # Look up built-in and plugin commands, which should be - # available even if the app fails to load. - rv = super().get_command(ctx, name) - - if rv is not None: - return rv - - info = ctx.ensure_object(ScriptInfo) - - # Look up commands provided by the app, showing an error and - # continuing if the app couldn't be loaded. - try: - app = info.load_app() - except NoAppException as e: - click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") - return None - - # Push an app context for the loaded app unless it is already - # active somehow. This makes the context available to parameter - # and command callbacks without needing @with_appcontext. - if not current_app or current_app._get_current_object() is not app: # type: ignore[attr-defined] - ctx.with_resource(app.app_context()) - - return app.cli.get_command(ctx, name) - - def list_commands(self, ctx: click.Context) -> list[str]: - self._load_plugin_commands() - # Start with the built-in and plugin commands. - rv = set(super().list_commands(ctx)) - info = ctx.ensure_object(ScriptInfo) - - # Add commands provided by the app, showing an error and - # continuing if the app couldn't be loaded. - try: - rv.update(info.load_app().cli.list_commands(ctx)) - except NoAppException as e: - # When an app couldn't be loaded, show the error message - # without the traceback. - click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") - except Exception: - # When any other errors occurred during loading, show the - # full traceback. - click.secho(f"{traceback.format_exc()}\n", err=True, fg="red") - - return sorted(rv) - - def make_context( - self, - info_name: str | None, - args: list[str], - parent: click.Context | None = None, - **extra: t.Any, - ) -> click.Context: - # Set a flag to tell app.run to become a no-op. If app.run was - # not in a __name__ == __main__ guard, it would start the server - # when importing, blocking whatever command is being called. - os.environ["FLASK_RUN_FROM_CLI"] = "true" - - if "obj" not in extra and "obj" not in self.context_settings: - extra["obj"] = ScriptInfo( - create_app=self.create_app, - set_debug_flag=self.set_debug_flag, - load_dotenv_defaults=self.load_dotenv, - ) - - return super().make_context(info_name, args, parent=parent, **extra) - - def parse_args(self, ctx: click.Context, args: list[str]) -> list[str]: - if (not args and self.no_args_is_help) or ( - len(args) == 1 and args[0] in self.get_help_option_names(ctx) - ): - # Attempt to load --env-file and --app early in case they - # were given as env vars. Otherwise no_args_is_help will not - # see commands from app.cli. - _env_file_option.handle_parse_result(ctx, {}, []) - _app_option.handle_parse_result(ctx, {}, []) - - return super().parse_args(ctx, args) - - -def _path_is_ancestor(path: str, other: str) -> bool: - """Take ``other`` and remove the length of ``path`` from it. Then join it - to ``path``. If it is the original value, ``path`` is an ancestor of - ``other``.""" - return os.path.join(path, other[len(path) :].lstrip(os.sep)) == other - - -def load_dotenv( - path: str | os.PathLike[str] | None = None, load_defaults: bool = True -) -> bool: - """Load "dotenv" files to set environment variables. A given path takes - precedence over ``.env``, which takes precedence over ``.flaskenv``. After - loading and combining these files, values are only set if the key is not - already set in ``os.environ``. - - This is a no-op if `python-dotenv`_ is not installed. - - .. _python-dotenv: https://github.com/theskumar/python-dotenv#readme - - :param path: Load the file at this location. - :param load_defaults: Search for and load the default ``.flaskenv`` and - ``.env`` files. - :return: ``True`` if at least one env var was loaded. - - .. versionchanged:: 3.1 - Added the ``load_defaults`` parameter. A given path takes precedence - over default files. - - .. versionchanged:: 2.0 - The current directory is not changed to the location of the - loaded file. - - .. versionchanged:: 2.0 - When loading the env files, set the default encoding to UTF-8. - - .. versionchanged:: 1.1.0 - Returns ``False`` when python-dotenv is not installed, or when - the given path isn't a file. - - .. versionadded:: 1.0 - """ - try: - import dotenv - except ImportError: - if path or os.path.isfile(".env") or os.path.isfile(".flaskenv"): - click.secho( - " * Tip: There are .env files present. Install python-dotenv" - " to use them.", - fg="yellow", - err=True, - ) - - return False - - data: dict[str, str | None] = {} - - if load_defaults: - for default_name in (".flaskenv", ".env"): - if not (default_path := dotenv.find_dotenv(default_name, usecwd=True)): - continue - - data |= dotenv.dotenv_values(default_path, encoding="utf-8") - - if path is not None and os.path.isfile(path): - data |= dotenv.dotenv_values(path, encoding="utf-8") - - for key, value in data.items(): - if key in os.environ or value is None: - continue - - os.environ[key] = value - - return bool(data) # True if at least one env var was loaded. - - -def show_server_banner(debug: bool, app_import_path: str | None) -> None: - """Show extra startup messages the first time the server is run, - ignoring the reloader. - """ - if is_running_from_reloader(): - return - - if app_import_path is not None: - click.echo(f" * Serving Flask app '{app_import_path}'") - - if debug is not None: - click.echo(f" * Debug mode: {'on' if debug else 'off'}") - - -class CertParamType(click.ParamType): - """Click option type for the ``--cert`` option. Allows either an - existing file, the string ``'adhoc'``, or an import for a - :class:`~ssl.SSLContext` object. - """ - - name = "path" - - def __init__(self) -> None: - self.path_type = click.Path(exists=True, dir_okay=False, resolve_path=True) - - def convert( - self, value: t.Any, param: click.Parameter | None, ctx: click.Context | None - ) -> t.Any: - try: - import ssl - except ImportError: - raise click.BadParameter( - 'Using "--cert" requires Python to be compiled with SSL support.', - ctx, - param, - ) from None - - try: - return self.path_type(value, param, ctx) - except click.BadParameter: - value = click.STRING(value, param, ctx).lower() - - if value == "adhoc": - try: - import cryptography # noqa: F401 - except ImportError: - raise click.BadParameter( - "Using ad-hoc certificates requires the cryptography library.", - ctx, - param, - ) from None - - return value - - obj = import_string(value, silent=True) - - if isinstance(obj, ssl.SSLContext): - return obj - - raise - - -def _validate_key(ctx: click.Context, param: click.Parameter, value: t.Any) -> t.Any: - """The ``--key`` option must be specified when ``--cert`` is a file. - Modifies the ``cert`` param to be a ``(cert, key)`` pair if needed. - """ - cert = ctx.params.get("cert") - is_adhoc = cert == "adhoc" - - try: - import ssl - except ImportError: - is_context = False - else: - is_context = isinstance(cert, ssl.SSLContext) - - if value is not None: - if is_adhoc: - raise click.BadParameter( - 'When "--cert" is "adhoc", "--key" is not used.', ctx, param - ) - - if is_context: - raise click.BadParameter( - 'When "--cert" is an SSLContext object, "--key" is not used.', - ctx, - param, - ) - - if not cert: - raise click.BadParameter('"--cert" must also be specified.', ctx, param) - - ctx.params["cert"] = cert, value - - else: - if cert and not (is_adhoc or is_context): - raise click.BadParameter('Required when using "--cert".', ctx, param) - - return value - - -class SeparatedPathType(click.Path): - """Click option type that accepts a list of values separated by the - OS's path separator (``:``, ``;`` on Windows). Each value is - validated as a :class:`click.Path` type. - """ - - def convert( - self, value: t.Any, param: click.Parameter | None, ctx: click.Context | None - ) -> t.Any: - items = self.split_envvar_value(value) - # can't call no-arg super() inside list comprehension until Python 3.12 - super_convert = super().convert - return [super_convert(item, param, ctx) for item in items] - - -@click.command("run", short_help="Run a development server.") -@click.option("--host", "-h", default="127.0.0.1", help="The interface to bind to.") -@click.option("--port", "-p", default=5000, help="The port to bind to.") -@click.option( - "--cert", - type=CertParamType(), - help="Specify a certificate file to use HTTPS.", - is_eager=True, -) -@click.option( - "--key", - type=click.Path(exists=True, dir_okay=False, resolve_path=True), - callback=_validate_key, - expose_value=False, - help="The key file to use when specifying a certificate.", -) -@click.option( - "--reload/--no-reload", - default=None, - help="Enable or disable the reloader. By default the reloader " - "is active if debug is enabled.", -) -@click.option( - "--debugger/--no-debugger", - default=None, - help="Enable or disable the debugger. By default the debugger " - "is active if debug is enabled.", -) -@click.option( - "--with-threads/--without-threads", - default=True, - help="Enable or disable multithreading.", -) -@click.option( - "--extra-files", - default=None, - type=SeparatedPathType(), - help=( - "Extra files that trigger a reload on change. Multiple paths" - f" are separated by {os.path.pathsep!r}." - ), -) -@click.option( - "--exclude-patterns", - default=None, - type=SeparatedPathType(), - help=( - "Files matching these fnmatch patterns will not trigger a reload" - " on change. Multiple patterns are separated by" - f" {os.path.pathsep!r}." - ), -) -@pass_script_info -def run_command( - info: ScriptInfo, - host: str, - port: int, - reload: bool, - debugger: bool, - with_threads: bool, - cert: ssl.SSLContext | tuple[str, str | None] | t.Literal["adhoc"] | None, - extra_files: list[str] | None, - exclude_patterns: list[str] | None, -) -> None: - """Run a local development server. - - This server is for development purposes only. It does not provide - the stability, security, or performance of production WSGI servers. - - The reloader and debugger are enabled by default with the '--debug' - option. - """ - try: - app: WSGIApplication = info.load_app() # pyright: ignore - except Exception as e: - if is_running_from_reloader(): - # When reloading, print out the error immediately, but raise - # it later so the debugger or server can handle it. - traceback.print_exc() - err = e - - def app( - environ: WSGIEnvironment, start_response: StartResponse - ) -> cabc.Iterable[bytes]: - raise err from None - - else: - # When not reloading, raise the error immediately so the - # command fails. - raise e from None - - debug = get_debug_flag() - - if reload is None: - reload = debug - - if debugger is None: - debugger = debug - - show_server_banner(debug, info.app_import_path) - - run_simple( - host, - port, - app, - use_reloader=reload, - use_debugger=debugger, - threaded=with_threads, - ssl_context=cert, - extra_files=extra_files, - exclude_patterns=exclude_patterns, - ) - - -run_command.params.insert(0, _debug_option) - - -@click.command("shell", short_help="Run a shell in the app context.") -@with_appcontext -def shell_command() -> None: - """Run an interactive Python shell in the context of a given - Flask application. The application will populate the default - namespace of this shell according to its configuration. - - This is useful for executing small snippets of management code - without having to manually configure the application. - """ - import code - - banner = ( - f"Python {sys.version} on {sys.platform}\n" - f"App: {current_app.import_name}\n" - f"Instance: {current_app.instance_path}" - ) - ctx: dict[str, t.Any] = {} - - # Support the regular Python interpreter startup script if someone - # is using it. - startup = os.environ.get("PYTHONSTARTUP") - if startup and os.path.isfile(startup): - with open(startup) as f: - eval(compile(f.read(), startup, "exec"), ctx) - - ctx.update(current_app.make_shell_context()) - - # Site, customize, or startup script can set a hook to call when - # entering interactive mode. The default one sets up readline with - # tab and history completion. - interactive_hook = getattr(sys, "__interactivehook__", None) - - if interactive_hook is not None: - try: - import readline - from rlcompleter import Completer - except ImportError: - pass - else: - # rlcompleter uses __main__.__dict__ by default, which is - # flask.__main__. Use the shell context instead. - readline.set_completer(Completer(ctx).complete) - - interactive_hook() - - code.interact(banner=banner, local=ctx) - - -@click.command("routes", short_help="Show the routes for the app.") -@click.option( - "--sort", - "-s", - type=click.Choice(("endpoint", "methods", "domain", "rule", "match")), - default="endpoint", - help=( - "Method to sort routes by. 'match' is the order that Flask will match routes" - " when dispatching a request." - ), -) -@click.option("--all-methods", is_flag=True, help="Show HEAD and OPTIONS methods.") -@with_appcontext -def routes_command(sort: str, all_methods: bool) -> None: - """Show all registered routes with endpoints and methods.""" - rules = list(current_app.url_map.iter_rules()) - - if not rules: - click.echo("No routes were registered.") - return - - ignored_methods = set() if all_methods else {"HEAD", "OPTIONS"} - host_matching = current_app.url_map.host_matching - has_domain = any(rule.host if host_matching else rule.subdomain for rule in rules) - rows = [] - - for rule in rules: - row = [ - rule.endpoint, - ", ".join(sorted((rule.methods or set()) - ignored_methods)), - ] - - if has_domain: - row.append((rule.host if host_matching else rule.subdomain) or "") - - row.append(rule.rule) - rows.append(row) - - headers = ["Endpoint", "Methods"] - sorts = ["endpoint", "methods"] - - if has_domain: - headers.append("Host" if host_matching else "Subdomain") - sorts.append("domain") - - headers.append("Rule") - sorts.append("rule") - - try: - rows.sort(key=itemgetter(sorts.index(sort))) - except ValueError: - pass - - rows.insert(0, headers) - widths = [max(len(row[i]) for row in rows) for i in range(len(headers))] - rows.insert(1, ["-" * w for w in widths]) - template = " ".join(f"{{{i}:<{w}}}" for i, w in enumerate(widths)) - - for row in rows: - click.echo(template.format(*row)) - - -cli = FlaskGroup( - name="flask", - help="""\ -A general utility script for Flask applications. - -An application to load must be given with the '--app' option, -'FLASK_APP' environment variable, or with a 'wsgi.py' or 'app.py' file -in the current directory. -""", -) - - -def main() -> None: - cli.main() - - -if __name__ == "__main__": - main() diff --git a/venv/lib/python3.12/site-packages/flask/config.py b/venv/lib/python3.12/site-packages/flask/config.py deleted file mode 100644 index 34ef1a57..00000000 --- a/venv/lib/python3.12/site-packages/flask/config.py +++ /dev/null @@ -1,367 +0,0 @@ -from __future__ import annotations - -import errno -import json -import os -import types -import typing as t - -from werkzeug.utils import import_string - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .sansio.app import App - - -T = t.TypeVar("T") - - -class ConfigAttribute(t.Generic[T]): - """Makes an attribute forward to the config""" - - def __init__( - self, name: str, get_converter: t.Callable[[t.Any], T] | None = None - ) -> None: - self.__name__ = name - self.get_converter = get_converter - - @t.overload - def __get__(self, obj: None, owner: None) -> te.Self: ... - - @t.overload - def __get__(self, obj: App, owner: type[App]) -> T: ... - - def __get__(self, obj: App | None, owner: type[App] | None = None) -> T | te.Self: - if obj is None: - return self - - rv = obj.config[self.__name__] - - if self.get_converter is not None: - rv = self.get_converter(rv) - - return rv # type: ignore[no-any-return] - - def __set__(self, obj: App, value: t.Any) -> None: - obj.config[self.__name__] = value - - -class Config(dict): # type: ignore[type-arg] - """Works exactly like a dict but provides ways to fill it from files - or special dictionaries. There are two common patterns to populate the - config. - - Either you can fill the config from a config file:: - - app.config.from_pyfile('yourconfig.cfg') - - Or alternatively you can define the configuration options in the - module that calls :meth:`from_object` or provide an import path to - a module that should be loaded. It is also possible to tell it to - use the same module and with that provide the configuration values - just before the call:: - - DEBUG = True - SECRET_KEY = 'development key' - app.config.from_object(__name__) - - In both cases (loading from any Python file or loading from modules), - only uppercase keys are added to the config. This makes it possible to use - lowercase values in the config file for temporary values that are not added - to the config or to define the config keys in the same file that implements - the application. - - Probably the most interesting way to load configurations is from an - environment variable pointing to a file:: - - app.config.from_envvar('YOURAPPLICATION_SETTINGS') - - In this case before launching the application you have to set this - environment variable to the file you want to use. On Linux and OS X - use the export statement:: - - export YOURAPPLICATION_SETTINGS='/path/to/config/file' - - On windows use `set` instead. - - :param root_path: path to which files are read relative from. When the - config object is created by the application, this is - the application's :attr:`~flask.Flask.root_path`. - :param defaults: an optional dictionary of default values - """ - - def __init__( - self, - root_path: str | os.PathLike[str], - defaults: dict[str, t.Any] | None = None, - ) -> None: - super().__init__(defaults or {}) - self.root_path = root_path - - def from_envvar(self, variable_name: str, silent: bool = False) -> bool: - """Loads a configuration from an environment variable pointing to - a configuration file. This is basically just a shortcut with nicer - error messages for this line of code:: - - app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS']) - - :param variable_name: name of the environment variable - :param silent: set to ``True`` if you want silent failure for missing - files. - :return: ``True`` if the file was loaded successfully. - """ - rv = os.environ.get(variable_name) - if not rv: - if silent: - return False - raise RuntimeError( - f"The environment variable {variable_name!r} is not set" - " and as such configuration could not be loaded. Set" - " this variable and make it point to a configuration" - " file" - ) - return self.from_pyfile(rv, silent=silent) - - def from_prefixed_env( - self, prefix: str = "FLASK", *, loads: t.Callable[[str], t.Any] = json.loads - ) -> bool: - """Load any environment variables that start with ``FLASK_``, - dropping the prefix from the env key for the config key. Values - are passed through a loading function to attempt to convert them - to more specific types than strings. - - Keys are loaded in :func:`sorted` order. - - The default loading function attempts to parse values as any - valid JSON type, including dicts and lists. - - Specific items in nested dicts can be set by separating the - keys with double underscores (``__``). If an intermediate key - doesn't exist, it will be initialized to an empty dict. - - :param prefix: Load env vars that start with this prefix, - separated with an underscore (``_``). - :param loads: Pass each string value to this function and use - the returned value as the config value. If any error is - raised it is ignored and the value remains a string. The - default is :func:`json.loads`. - - .. versionadded:: 2.1 - """ - prefix = f"{prefix}_" - - for key in sorted(os.environ): - if not key.startswith(prefix): - continue - - value = os.environ[key] - key = key.removeprefix(prefix) - - try: - value = loads(value) - except Exception: - # Keep the value as a string if loading failed. - pass - - if "__" not in key: - # A non-nested key, set directly. - self[key] = value - continue - - # Traverse nested dictionaries with keys separated by "__". - current = self - *parts, tail = key.split("__") - - for part in parts: - # If an intermediate dict does not exist, create it. - if part not in current: - current[part] = {} - - current = current[part] - - current[tail] = value - - return True - - def from_pyfile( - self, filename: str | os.PathLike[str], silent: bool = False - ) -> bool: - """Updates the values in the config from a Python file. This function - behaves as if the file was imported as module with the - :meth:`from_object` function. - - :param filename: the filename of the config. This can either be an - absolute filename or a filename relative to the - root path. - :param silent: set to ``True`` if you want silent failure for missing - files. - :return: ``True`` if the file was loaded successfully. - - .. versionadded:: 0.7 - `silent` parameter. - """ - filename = os.path.join(self.root_path, filename) - d = types.ModuleType("config") - d.__file__ = filename - try: - with open(filename, mode="rb") as config_file: - exec(compile(config_file.read(), filename, "exec"), d.__dict__) - except OSError as e: - if silent and e.errno in (errno.ENOENT, errno.EISDIR, errno.ENOTDIR): - return False - e.strerror = f"Unable to load configuration file ({e.strerror})" - raise - self.from_object(d) - return True - - def from_object(self, obj: object | str) -> None: - """Updates the values from the given object. An object can be of one - of the following two types: - - - a string: in this case the object with that name will be imported - - an actual object reference: that object is used directly - - Objects are usually either modules or classes. :meth:`from_object` - loads only the uppercase attributes of the module/class. A ``dict`` - object will not work with :meth:`from_object` because the keys of a - ``dict`` are not attributes of the ``dict`` class. - - Example of module-based configuration:: - - app.config.from_object('yourapplication.default_config') - from yourapplication import default_config - app.config.from_object(default_config) - - Nothing is done to the object before loading. If the object is a - class and has ``@property`` attributes, it needs to be - instantiated before being passed to this method. - - You should not use this function to load the actual configuration but - rather configuration defaults. The actual config should be loaded - with :meth:`from_pyfile` and ideally from a location not within the - package because the package might be installed system wide. - - See :ref:`config-dev-prod` for an example of class-based configuration - using :meth:`from_object`. - - :param obj: an import name or object - """ - if isinstance(obj, str): - obj = import_string(obj) - for key in dir(obj): - if key.isupper(): - self[key] = getattr(obj, key) - - def from_file( - self, - filename: str | os.PathLike[str], - load: t.Callable[[t.IO[t.Any]], t.Mapping[str, t.Any]], - silent: bool = False, - text: bool = True, - ) -> bool: - """Update the values in the config from a file that is loaded - using the ``load`` parameter. The loaded data is passed to the - :meth:`from_mapping` method. - - .. code-block:: python - - import json - app.config.from_file("config.json", load=json.load) - - import tomllib - app.config.from_file("config.toml", load=tomllib.load, text=False) - - :param filename: The path to the data file. This can be an - absolute path or relative to the config root path. - :param load: A callable that takes a file handle and returns a - mapping of loaded data from the file. - :type load: ``Callable[[Reader], Mapping]`` where ``Reader`` - implements a ``read`` method. - :param silent: Ignore the file if it doesn't exist. - :param text: Open the file in text or binary mode. - :return: ``True`` if the file was loaded successfully. - - .. versionchanged:: 2.3 - The ``text`` parameter was added. - - .. versionadded:: 2.0 - """ - filename = os.path.join(self.root_path, filename) - - try: - with open(filename, "r" if text else "rb") as f: - obj = load(f) - except OSError as e: - if silent and e.errno in (errno.ENOENT, errno.EISDIR): - return False - - e.strerror = f"Unable to load configuration file ({e.strerror})" - raise - - return self.from_mapping(obj) - - def from_mapping( - self, mapping: t.Mapping[str, t.Any] | None = None, **kwargs: t.Any - ) -> bool: - """Updates the config like :meth:`update` ignoring items with - non-upper keys. - - :return: Always returns ``True``. - - .. versionadded:: 0.11 - """ - mappings: dict[str, t.Any] = {} - if mapping is not None: - mappings.update(mapping) - mappings.update(kwargs) - for key, value in mappings.items(): - if key.isupper(): - self[key] = value - return True - - def get_namespace( - self, namespace: str, lowercase: bool = True, trim_namespace: bool = True - ) -> dict[str, t.Any]: - """Returns a dictionary containing a subset of configuration options - that match the specified namespace/prefix. Example usage:: - - app.config['IMAGE_STORE_TYPE'] = 'fs' - app.config['IMAGE_STORE_PATH'] = '/var/app/images' - app.config['IMAGE_STORE_BASE_URL'] = 'http://img.website.com' - image_store_config = app.config.get_namespace('IMAGE_STORE_') - - The resulting dictionary `image_store_config` would look like:: - - { - 'type': 'fs', - 'path': '/var/app/images', - 'base_url': 'http://img.website.com' - } - - This is often useful when configuration options map directly to - keyword arguments in functions or class constructors. - - :param namespace: a configuration namespace - :param lowercase: a flag indicating if the keys of the resulting - dictionary should be lowercase - :param trim_namespace: a flag indicating if the keys of the resulting - dictionary should not include the namespace - - .. versionadded:: 0.11 - """ - rv = {} - for k, v in self.items(): - if not k.startswith(namespace): - continue - if trim_namespace: - key = k[len(namespace) :] - else: - key = k - if lowercase: - key = key.lower() - rv[key] = v - return rv - - def __repr__(self) -> str: - return f"<{type(self).__name__} {dict.__repr__(self)}>" diff --git a/venv/lib/python3.12/site-packages/flask/ctx.py b/venv/lib/python3.12/site-packages/flask/ctx.py deleted file mode 100644 index 222e818e..00000000 --- a/venv/lib/python3.12/site-packages/flask/ctx.py +++ /dev/null @@ -1,449 +0,0 @@ -from __future__ import annotations - -import contextvars -import sys -import typing as t -from functools import update_wrapper -from types import TracebackType - -from werkzeug.exceptions import HTTPException - -from . import typing as ft -from .globals import _cv_app -from .globals import _cv_request -from .signals import appcontext_popped -from .signals import appcontext_pushed - -if t.TYPE_CHECKING: # pragma: no cover - from _typeshed.wsgi import WSGIEnvironment - - from .app import Flask - from .sessions import SessionMixin - from .wrappers import Request - - -# a singleton sentinel value for parameter defaults -_sentinel = object() - - -class _AppCtxGlobals: - """A plain object. Used as a namespace for storing data during an - application context. - - Creating an app context automatically creates this object, which is - made available as the :data:`g` proxy. - - .. describe:: 'key' in g - - Check whether an attribute is present. - - .. versionadded:: 0.10 - - .. describe:: iter(g) - - Return an iterator over the attribute names. - - .. versionadded:: 0.10 - """ - - # Define attr methods to let mypy know this is a namespace object - # that has arbitrary attributes. - - def __getattr__(self, name: str) -> t.Any: - try: - return self.__dict__[name] - except KeyError: - raise AttributeError(name) from None - - def __setattr__(self, name: str, value: t.Any) -> None: - self.__dict__[name] = value - - def __delattr__(self, name: str) -> None: - try: - del self.__dict__[name] - except KeyError: - raise AttributeError(name) from None - - def get(self, name: str, default: t.Any | None = None) -> t.Any: - """Get an attribute by name, or a default value. Like - :meth:`dict.get`. - - :param name: Name of attribute to get. - :param default: Value to return if the attribute is not present. - - .. versionadded:: 0.10 - """ - return self.__dict__.get(name, default) - - def pop(self, name: str, default: t.Any = _sentinel) -> t.Any: - """Get and remove an attribute by name. Like :meth:`dict.pop`. - - :param name: Name of attribute to pop. - :param default: Value to return if the attribute is not present, - instead of raising a ``KeyError``. - - .. versionadded:: 0.11 - """ - if default is _sentinel: - return self.__dict__.pop(name) - else: - return self.__dict__.pop(name, default) - - def setdefault(self, name: str, default: t.Any = None) -> t.Any: - """Get the value of an attribute if it is present, otherwise - set and return a default value. Like :meth:`dict.setdefault`. - - :param name: Name of attribute to get. - :param default: Value to set and return if the attribute is not - present. - - .. versionadded:: 0.11 - """ - return self.__dict__.setdefault(name, default) - - def __contains__(self, item: str) -> bool: - return item in self.__dict__ - - def __iter__(self) -> t.Iterator[str]: - return iter(self.__dict__) - - def __repr__(self) -> str: - ctx = _cv_app.get(None) - if ctx is not None: - return f"" - return object.__repr__(self) - - -def after_this_request( - f: ft.AfterRequestCallable[t.Any], -) -> ft.AfterRequestCallable[t.Any]: - """Executes a function after this request. This is useful to modify - response objects. The function is passed the response object and has - to return the same or a new one. - - Example:: - - @app.route('/') - def index(): - @after_this_request - def add_header(response): - response.headers['X-Foo'] = 'Parachute' - return response - return 'Hello World!' - - This is more useful if a function other than the view function wants to - modify a response. For instance think of a decorator that wants to add - some headers without converting the return value into a response object. - - .. versionadded:: 0.9 - """ - ctx = _cv_request.get(None) - - if ctx is None: - raise RuntimeError( - "'after_this_request' can only be used when a request" - " context is active, such as in a view function." - ) - - ctx._after_request_functions.append(f) - return f - - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - - -def copy_current_request_context(f: F) -> F: - """A helper function that decorates a function to retain the current - request context. This is useful when working with greenlets. The moment - the function is decorated a copy of the request context is created and - then pushed when the function is called. The current session is also - included in the copied request context. - - Example:: - - import gevent - from flask import copy_current_request_context - - @app.route('/') - def index(): - @copy_current_request_context - def do_some_work(): - # do some work here, it can access flask.request or - # flask.session like you would otherwise in the view function. - ... - gevent.spawn(do_some_work) - return 'Regular response' - - .. versionadded:: 0.10 - """ - ctx = _cv_request.get(None) - - if ctx is None: - raise RuntimeError( - "'copy_current_request_context' can only be used when a" - " request context is active, such as in a view function." - ) - - ctx = ctx.copy() - - def wrapper(*args: t.Any, **kwargs: t.Any) -> t.Any: - with ctx: - return ctx.app.ensure_sync(f)(*args, **kwargs) - - return update_wrapper(wrapper, f) # type: ignore[return-value] - - -def has_request_context() -> bool: - """If you have code that wants to test if a request context is there or - not this function can be used. For instance, you may want to take advantage - of request information if the request object is available, but fail - silently if it is unavailable. - - :: - - class User(db.Model): - - def __init__(self, username, remote_addr=None): - self.username = username - if remote_addr is None and has_request_context(): - remote_addr = request.remote_addr - self.remote_addr = remote_addr - - Alternatively you can also just test any of the context bound objects - (such as :class:`request` or :class:`g`) for truthness:: - - class User(db.Model): - - def __init__(self, username, remote_addr=None): - self.username = username - if remote_addr is None and request: - remote_addr = request.remote_addr - self.remote_addr = remote_addr - - .. versionadded:: 0.7 - """ - return _cv_request.get(None) is not None - - -def has_app_context() -> bool: - """Works like :func:`has_request_context` but for the application - context. You can also just do a boolean check on the - :data:`current_app` object instead. - - .. versionadded:: 0.9 - """ - return _cv_app.get(None) is not None - - -class AppContext: - """The app context contains application-specific information. An app - context is created and pushed at the beginning of each request if - one is not already active. An app context is also pushed when - running CLI commands. - """ - - def __init__(self, app: Flask) -> None: - self.app = app - self.url_adapter = app.create_url_adapter(None) - self.g: _AppCtxGlobals = app.app_ctx_globals_class() - self._cv_tokens: list[contextvars.Token[AppContext]] = [] - - def push(self) -> None: - """Binds the app context to the current context.""" - self._cv_tokens.append(_cv_app.set(self)) - appcontext_pushed.send(self.app, _async_wrapper=self.app.ensure_sync) - - def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore - """Pops the app context.""" - try: - if len(self._cv_tokens) == 1: - if exc is _sentinel: - exc = sys.exc_info()[1] - self.app.do_teardown_appcontext(exc) - finally: - ctx = _cv_app.get() - _cv_app.reset(self._cv_tokens.pop()) - - if ctx is not self: - raise AssertionError( - f"Popped wrong app context. ({ctx!r} instead of {self!r})" - ) - - appcontext_popped.send(self.app, _async_wrapper=self.app.ensure_sync) - - def __enter__(self) -> AppContext: - self.push() - return self - - def __exit__( - self, - exc_type: type | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.pop(exc_value) - - -class RequestContext: - """The request context contains per-request information. The Flask - app creates and pushes it at the beginning of the request, then pops - it at the end of the request. It will create the URL adapter and - request object for the WSGI environment provided. - - Do not attempt to use this class directly, instead use - :meth:`~flask.Flask.test_request_context` and - :meth:`~flask.Flask.request_context` to create this object. - - When the request context is popped, it will evaluate all the - functions registered on the application for teardown execution - (:meth:`~flask.Flask.teardown_request`). - - The request context is automatically popped at the end of the - request. When using the interactive debugger, the context will be - restored so ``request`` is still accessible. Similarly, the test - client can preserve the context after the request ends. However, - teardown functions may already have closed some resources such as - database connections. - """ - - def __init__( - self, - app: Flask, - environ: WSGIEnvironment, - request: Request | None = None, - session: SessionMixin | None = None, - ) -> None: - self.app = app - if request is None: - request = app.request_class(environ) - request.json_module = app.json - self.request: Request = request - self.url_adapter = None - try: - self.url_adapter = app.create_url_adapter(self.request) - except HTTPException as e: - self.request.routing_exception = e - self.flashes: list[tuple[str, str]] | None = None - self.session: SessionMixin | None = session - # Functions that should be executed after the request on the response - # object. These will be called before the regular "after_request" - # functions. - self._after_request_functions: list[ft.AfterRequestCallable[t.Any]] = [] - - self._cv_tokens: list[ - tuple[contextvars.Token[RequestContext], AppContext | None] - ] = [] - - def copy(self) -> RequestContext: - """Creates a copy of this request context with the same request object. - This can be used to move a request context to a different greenlet. - Because the actual request object is the same this cannot be used to - move a request context to a different thread unless access to the - request object is locked. - - .. versionadded:: 0.10 - - .. versionchanged:: 1.1 - The current session object is used instead of reloading the original - data. This prevents `flask.session` pointing to an out-of-date object. - """ - return self.__class__( - self.app, - environ=self.request.environ, - request=self.request, - session=self.session, - ) - - def match_request(self) -> None: - """Can be overridden by a subclass to hook into the matching - of the request. - """ - try: - result = self.url_adapter.match(return_rule=True) # type: ignore - self.request.url_rule, self.request.view_args = result # type: ignore - except HTTPException as e: - self.request.routing_exception = e - - def push(self) -> None: - # Before we push the request context we have to ensure that there - # is an application context. - app_ctx = _cv_app.get(None) - - if app_ctx is None or app_ctx.app is not self.app: - app_ctx = self.app.app_context() - app_ctx.push() - else: - app_ctx = None - - self._cv_tokens.append((_cv_request.set(self), app_ctx)) - - # Open the session at the moment that the request context is available. - # This allows a custom open_session method to use the request context. - # Only open a new session if this is the first time the request was - # pushed, otherwise stream_with_context loses the session. - if self.session is None: - session_interface = self.app.session_interface - self.session = session_interface.open_session(self.app, self.request) - - if self.session is None: - self.session = session_interface.make_null_session(self.app) - - # Match the request URL after loading the session, so that the - # session is available in custom URL converters. - if self.url_adapter is not None: - self.match_request() - - def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore - """Pops the request context and unbinds it by doing that. This will - also trigger the execution of functions registered by the - :meth:`~flask.Flask.teardown_request` decorator. - - .. versionchanged:: 0.9 - Added the `exc` argument. - """ - clear_request = len(self._cv_tokens) == 1 - - try: - if clear_request: - if exc is _sentinel: - exc = sys.exc_info()[1] - self.app.do_teardown_request(exc) - - request_close = getattr(self.request, "close", None) - if request_close is not None: - request_close() - finally: - ctx = _cv_request.get() - token, app_ctx = self._cv_tokens.pop() - _cv_request.reset(token) - - # get rid of circular dependencies at the end of the request - # so that we don't require the GC to be active. - if clear_request: - ctx.request.environ["werkzeug.request"] = None - - if app_ctx is not None: - app_ctx.pop(exc) - - if ctx is not self: - raise AssertionError( - f"Popped wrong request context. ({ctx!r} instead of {self!r})" - ) - - def __enter__(self) -> RequestContext: - self.push() - return self - - def __exit__( - self, - exc_type: type | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.pop(exc_value) - - def __repr__(self) -> str: - return ( - f"<{type(self).__name__} {self.request.url!r}" - f" [{self.request.method}] of {self.app.name}>" - ) diff --git a/venv/lib/python3.12/site-packages/flask/debughelpers.py b/venv/lib/python3.12/site-packages/flask/debughelpers.py deleted file mode 100644 index 2c8c4c48..00000000 --- a/venv/lib/python3.12/site-packages/flask/debughelpers.py +++ /dev/null @@ -1,178 +0,0 @@ -from __future__ import annotations - -import typing as t - -from jinja2.loaders import BaseLoader -from werkzeug.routing import RequestRedirect - -from .blueprints import Blueprint -from .globals import request_ctx -from .sansio.app import App - -if t.TYPE_CHECKING: - from .sansio.scaffold import Scaffold - from .wrappers import Request - - -class UnexpectedUnicodeError(AssertionError, UnicodeError): - """Raised in places where we want some better error reporting for - unexpected unicode or binary data. - """ - - -class DebugFilesKeyError(KeyError, AssertionError): - """Raised from request.files during debugging. The idea is that it can - provide a better error message than just a generic KeyError/BadRequest. - """ - - def __init__(self, request: Request, key: str) -> None: - form_matches = request.form.getlist(key) - buf = [ - f"You tried to access the file {key!r} in the request.files" - " dictionary but it does not exist. The mimetype for the" - f" request is {request.mimetype!r} instead of" - " 'multipart/form-data' which means that no file contents" - " were transmitted. To fix this error you should provide" - ' enctype="multipart/form-data" in your form.' - ] - if form_matches: - names = ", ".join(repr(x) for x in form_matches) - buf.append( - "\n\nThe browser instead transmitted some file names. " - f"This was submitted: {names}" - ) - self.msg = "".join(buf) - - def __str__(self) -> str: - return self.msg - - -class FormDataRoutingRedirect(AssertionError): - """This exception is raised in debug mode if a routing redirect - would cause the browser to drop the method or body. This happens - when method is not GET, HEAD or OPTIONS and the status code is not - 307 or 308. - """ - - def __init__(self, request: Request) -> None: - exc = request.routing_exception - assert isinstance(exc, RequestRedirect) - buf = [ - f"A request was sent to '{request.url}', but routing issued" - f" a redirect to the canonical URL '{exc.new_url}'." - ] - - if f"{request.base_url}/" == exc.new_url.partition("?")[0]: - buf.append( - " The URL was defined with a trailing slash. Flask" - " will redirect to the URL with a trailing slash if it" - " was accessed without one." - ) - - buf.append( - " Send requests to the canonical URL, or use 307 or 308 for" - " routing redirects. Otherwise, browsers will drop form" - " data.\n\n" - "This exception is only raised in debug mode." - ) - super().__init__("".join(buf)) - - -def attach_enctype_error_multidict(request: Request) -> None: - """Patch ``request.files.__getitem__`` to raise a descriptive error - about ``enctype=multipart/form-data``. - - :param request: The request to patch. - :meta private: - """ - oldcls = request.files.__class__ - - class newcls(oldcls): # type: ignore[valid-type, misc] - def __getitem__(self, key: str) -> t.Any: - try: - return super().__getitem__(key) - except KeyError as e: - if key not in request.form: - raise - - raise DebugFilesKeyError(request, key).with_traceback( - e.__traceback__ - ) from None - - newcls.__name__ = oldcls.__name__ - newcls.__module__ = oldcls.__module__ - request.files.__class__ = newcls - - -def _dump_loader_info(loader: BaseLoader) -> t.Iterator[str]: - yield f"class: {type(loader).__module__}.{type(loader).__name__}" - for key, value in sorted(loader.__dict__.items()): - if key.startswith("_"): - continue - if isinstance(value, (tuple, list)): - if not all(isinstance(x, str) for x in value): - continue - yield f"{key}:" - for item in value: - yield f" - {item}" - continue - elif not isinstance(value, (str, int, float, bool)): - continue - yield f"{key}: {value!r}" - - -def explain_template_loading_attempts( - app: App, - template: str, - attempts: list[ - tuple[ - BaseLoader, - Scaffold, - tuple[str, str | None, t.Callable[[], bool] | None] | None, - ] - ], -) -> None: - """This should help developers understand what failed""" - info = [f"Locating template {template!r}:"] - total_found = 0 - blueprint = None - if request_ctx and request_ctx.request.blueprint is not None: - blueprint = request_ctx.request.blueprint - - for idx, (loader, srcobj, triple) in enumerate(attempts): - if isinstance(srcobj, App): - src_info = f"application {srcobj.import_name!r}" - elif isinstance(srcobj, Blueprint): - src_info = f"blueprint {srcobj.name!r} ({srcobj.import_name})" - else: - src_info = repr(srcobj) - - info.append(f"{idx + 1:5}: trying loader of {src_info}") - - for line in _dump_loader_info(loader): - info.append(f" {line}") - - if triple is None: - detail = "no match" - else: - detail = f"found ({triple[1] or ''!r})" - total_found += 1 - info.append(f" -> {detail}") - - seems_fishy = False - if total_found == 0: - info.append("Error: the template could not be found.") - seems_fishy = True - elif total_found > 1: - info.append("Warning: multiple loaders returned a match for the template.") - seems_fishy = True - - if blueprint is not None and seems_fishy: - info.append( - " The template was looked up from an endpoint that belongs" - f" to the blueprint {blueprint!r}." - ) - info.append(" Maybe you did not place a template in the right folder?") - info.append(" See https://flask.palletsprojects.com/blueprints/#templates") - - app.logger.info("\n".join(info)) diff --git a/venv/lib/python3.12/site-packages/flask/globals.py b/venv/lib/python3.12/site-packages/flask/globals.py deleted file mode 100644 index e2c410cc..00000000 --- a/venv/lib/python3.12/site-packages/flask/globals.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -import typing as t -from contextvars import ContextVar - -from werkzeug.local import LocalProxy - -if t.TYPE_CHECKING: # pragma: no cover - from .app import Flask - from .ctx import _AppCtxGlobals - from .ctx import AppContext - from .ctx import RequestContext - from .sessions import SessionMixin - from .wrappers import Request - - -_no_app_msg = """\ -Working outside of application context. - -This typically means that you attempted to use functionality that needed -the current application. To solve this, set up an application context -with app.app_context(). See the documentation for more information.\ -""" -_cv_app: ContextVar[AppContext] = ContextVar("flask.app_ctx") -app_ctx: AppContext = LocalProxy( # type: ignore[assignment] - _cv_app, unbound_message=_no_app_msg -) -current_app: Flask = LocalProxy( # type: ignore[assignment] - _cv_app, "app", unbound_message=_no_app_msg -) -g: _AppCtxGlobals = LocalProxy( # type: ignore[assignment] - _cv_app, "g", unbound_message=_no_app_msg -) - -_no_req_msg = """\ -Working outside of request context. - -This typically means that you attempted to use functionality that needed -an active HTTP request. Consult the documentation on testing for -information about how to avoid this problem.\ -""" -_cv_request: ContextVar[RequestContext] = ContextVar("flask.request_ctx") -request_ctx: RequestContext = LocalProxy( # type: ignore[assignment] - _cv_request, unbound_message=_no_req_msg -) -request: Request = LocalProxy( # type: ignore[assignment] - _cv_request, "request", unbound_message=_no_req_msg -) -session: SessionMixin = LocalProxy( # type: ignore[assignment] - _cv_request, "session", unbound_message=_no_req_msg -) diff --git a/venv/lib/python3.12/site-packages/flask/helpers.py b/venv/lib/python3.12/site-packages/flask/helpers.py deleted file mode 100644 index 5d412c90..00000000 --- a/venv/lib/python3.12/site-packages/flask/helpers.py +++ /dev/null @@ -1,641 +0,0 @@ -from __future__ import annotations - -import importlib.util -import os -import sys -import typing as t -from datetime import datetime -from functools import cache -from functools import update_wrapper - -import werkzeug.utils -from werkzeug.exceptions import abort as _wz_abort -from werkzeug.utils import redirect as _wz_redirect -from werkzeug.wrappers import Response as BaseResponse - -from .globals import _cv_app -from .globals import _cv_request -from .globals import current_app -from .globals import request -from .globals import request_ctx -from .globals import session -from .signals import message_flashed - -if t.TYPE_CHECKING: # pragma: no cover - from .wrappers import Response - - -def get_debug_flag() -> bool: - """Get whether debug mode should be enabled for the app, indicated by the - :envvar:`FLASK_DEBUG` environment variable. The default is ``False``. - """ - val = os.environ.get("FLASK_DEBUG") - return bool(val and val.lower() not in {"0", "false", "no"}) - - -def get_load_dotenv(default: bool = True) -> bool: - """Get whether the user has disabled loading default dotenv files by - setting :envvar:`FLASK_SKIP_DOTENV`. The default is ``True``, load - the files. - - :param default: What to return if the env var isn't set. - """ - val = os.environ.get("FLASK_SKIP_DOTENV") - - if not val: - return default - - return val.lower() in ("0", "false", "no") - - -@t.overload -def stream_with_context( - generator_or_function: t.Iterator[t.AnyStr], -) -> t.Iterator[t.AnyStr]: ... - - -@t.overload -def stream_with_context( - generator_or_function: t.Callable[..., t.Iterator[t.AnyStr]], -) -> t.Callable[[t.Iterator[t.AnyStr]], t.Iterator[t.AnyStr]]: ... - - -def stream_with_context( - generator_or_function: t.Iterator[t.AnyStr] | t.Callable[..., t.Iterator[t.AnyStr]], -) -> t.Iterator[t.AnyStr] | t.Callable[[t.Iterator[t.AnyStr]], t.Iterator[t.AnyStr]]: - """Wrap a response generator function so that it runs inside the current - request context. This keeps :data:`request`, :data:`session`, and :data:`g` - available, even though at the point the generator runs the request context - will typically have ended. - - Use it as a decorator on a generator function: - - .. code-block:: python - - from flask import stream_with_context, request, Response - - @app.get("/stream") - def streamed_response(): - @stream_with_context - def generate(): - yield "Hello " - yield request.args["name"] - yield "!" - - return Response(generate()) - - Or use it as a wrapper around a created generator: - - .. code-block:: python - - from flask import stream_with_context, request, Response - - @app.get("/stream") - def streamed_response(): - def generate(): - yield "Hello " - yield request.args["name"] - yield "!" - - return Response(stream_with_context(generate())) - - .. versionadded:: 0.9 - """ - try: - gen = iter(generator_or_function) # type: ignore[arg-type] - except TypeError: - - def decorator(*args: t.Any, **kwargs: t.Any) -> t.Any: - gen = generator_or_function(*args, **kwargs) # type: ignore[operator] - return stream_with_context(gen) - - return update_wrapper(decorator, generator_or_function) # type: ignore[arg-type] - - def generator() -> t.Iterator[t.AnyStr]: - if (req_ctx := _cv_request.get(None)) is None: - raise RuntimeError( - "'stream_with_context' can only be used when a request" - " context is active, such as in a view function." - ) - - app_ctx = _cv_app.get() - # Setup code below will run the generator to this point, so that the - # current contexts are recorded. The contexts must be pushed after, - # otherwise their ContextVar will record the wrong event loop during - # async view functions. - yield None # type: ignore[misc] - - # Push the app context first, so that the request context does not - # automatically create and push a different app context. - with app_ctx, req_ctx: - try: - yield from gen - finally: - # Clean up in case the user wrapped a WSGI iterator. - if hasattr(gen, "close"): - gen.close() - - # Execute the generator to the sentinel value. This ensures the context is - # preserved in the generator's state. Further iteration will push the - # context and yield from the original iterator. - wrapped_g = generator() - next(wrapped_g) - return wrapped_g - - -def make_response(*args: t.Any) -> Response: - """Sometimes it is necessary to set additional headers in a view. Because - views do not have to return response objects but can return a value that - is converted into a response object by Flask itself, it becomes tricky to - add headers to it. This function can be called instead of using a return - and you will get a response object which you can use to attach headers. - - If view looked like this and you want to add a new header:: - - def index(): - return render_template('index.html', foo=42) - - You can now do something like this:: - - def index(): - response = make_response(render_template('index.html', foo=42)) - response.headers['X-Parachutes'] = 'parachutes are cool' - return response - - This function accepts the very same arguments you can return from a - view function. This for example creates a response with a 404 error - code:: - - response = make_response(render_template('not_found.html'), 404) - - The other use case of this function is to force the return value of a - view function into a response which is helpful with view - decorators:: - - response = make_response(view_function()) - response.headers['X-Parachutes'] = 'parachutes are cool' - - Internally this function does the following things: - - - if no arguments are passed, it creates a new response argument - - if one argument is passed, :meth:`flask.Flask.make_response` - is invoked with it. - - if more than one argument is passed, the arguments are passed - to the :meth:`flask.Flask.make_response` function as tuple. - - .. versionadded:: 0.6 - """ - if not args: - return current_app.response_class() - if len(args) == 1: - args = args[0] - return current_app.make_response(args) - - -def url_for( - endpoint: str, - *, - _anchor: str | None = None, - _method: str | None = None, - _scheme: str | None = None, - _external: bool | None = None, - **values: t.Any, -) -> str: - """Generate a URL to the given endpoint with the given values. - - This requires an active request or application context, and calls - :meth:`current_app.url_for() `. See that method - for full documentation. - - :param endpoint: The endpoint name associated with the URL to - generate. If this starts with a ``.``, the current blueprint - name (if any) will be used. - :param _anchor: If given, append this as ``#anchor`` to the URL. - :param _method: If given, generate the URL associated with this - method for the endpoint. - :param _scheme: If given, the URL will have this scheme if it is - external. - :param _external: If given, prefer the URL to be internal (False) or - require it to be external (True). External URLs include the - scheme and domain. When not in an active request, URLs are - external by default. - :param values: Values to use for the variable parts of the URL rule. - Unknown keys are appended as query string arguments, like - ``?a=b&c=d``. - - .. versionchanged:: 2.2 - Calls ``current_app.url_for``, allowing an app to override the - behavior. - - .. versionchanged:: 0.10 - The ``_scheme`` parameter was added. - - .. versionchanged:: 0.9 - The ``_anchor`` and ``_method`` parameters were added. - - .. versionchanged:: 0.9 - Calls ``app.handle_url_build_error`` on build errors. - """ - return current_app.url_for( - endpoint, - _anchor=_anchor, - _method=_method, - _scheme=_scheme, - _external=_external, - **values, - ) - - -def redirect( - location: str, code: int = 302, Response: type[BaseResponse] | None = None -) -> BaseResponse: - """Create a redirect response object. - - If :data:`~flask.current_app` is available, it will use its - :meth:`~flask.Flask.redirect` method, otherwise it will use - :func:`werkzeug.utils.redirect`. - - :param location: The URL to redirect to. - :param code: The status code for the redirect. - :param Response: The response class to use. Not used when - ``current_app`` is active, which uses ``app.response_class``. - - .. versionadded:: 2.2 - Calls ``current_app.redirect`` if available instead of always - using Werkzeug's default ``redirect``. - """ - if current_app: - return current_app.redirect(location, code=code) - - return _wz_redirect(location, code=code, Response=Response) - - -def abort(code: int | BaseResponse, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: - """Raise an :exc:`~werkzeug.exceptions.HTTPException` for the given - status code. - - If :data:`~flask.current_app` is available, it will call its - :attr:`~flask.Flask.aborter` object, otherwise it will use - :func:`werkzeug.exceptions.abort`. - - :param code: The status code for the exception, which must be - registered in ``app.aborter``. - :param args: Passed to the exception. - :param kwargs: Passed to the exception. - - .. versionadded:: 2.2 - Calls ``current_app.aborter`` if available instead of always - using Werkzeug's default ``abort``. - """ - if current_app: - current_app.aborter(code, *args, **kwargs) - - _wz_abort(code, *args, **kwargs) - - -def get_template_attribute(template_name: str, attribute: str) -> t.Any: - """Loads a macro (or variable) a template exports. This can be used to - invoke a macro from within Python code. If you for example have a - template named :file:`_cider.html` with the following contents: - - .. sourcecode:: html+jinja - - {% macro hello(name) %}Hello {{ name }}!{% endmacro %} - - You can access this from Python code like this:: - - hello = get_template_attribute('_cider.html', 'hello') - return hello('World') - - .. versionadded:: 0.2 - - :param template_name: the name of the template - :param attribute: the name of the variable of macro to access - """ - return getattr(current_app.jinja_env.get_template(template_name).module, attribute) - - -def flash(message: str, category: str = "message") -> None: - """Flashes a message to the next request. In order to remove the - flashed message from the session and to display it to the user, - the template has to call :func:`get_flashed_messages`. - - .. versionchanged:: 0.3 - `category` parameter added. - - :param message: the message to be flashed. - :param category: the category for the message. The following values - are recommended: ``'message'`` for any kind of message, - ``'error'`` for errors, ``'info'`` for information - messages and ``'warning'`` for warnings. However any - kind of string can be used as category. - """ - # Original implementation: - # - # session.setdefault('_flashes', []).append((category, message)) - # - # This assumed that changes made to mutable structures in the session are - # always in sync with the session object, which is not true for session - # implementations that use external storage for keeping their keys/values. - flashes = session.get("_flashes", []) - flashes.append((category, message)) - session["_flashes"] = flashes - app = current_app._get_current_object() # type: ignore - message_flashed.send( - app, - _async_wrapper=app.ensure_sync, - message=message, - category=category, - ) - - -def get_flashed_messages( - with_categories: bool = False, category_filter: t.Iterable[str] = () -) -> list[str] | list[tuple[str, str]]: - """Pulls all flashed messages from the session and returns them. - Further calls in the same request to the function will return - the same messages. By default just the messages are returned, - but when `with_categories` is set to ``True``, the return value will - be a list of tuples in the form ``(category, message)`` instead. - - Filter the flashed messages to one or more categories by providing those - categories in `category_filter`. This allows rendering categories in - separate html blocks. The `with_categories` and `category_filter` - arguments are distinct: - - * `with_categories` controls whether categories are returned with message - text (``True`` gives a tuple, where ``False`` gives just the message text). - * `category_filter` filters the messages down to only those matching the - provided categories. - - See :doc:`/patterns/flashing` for examples. - - .. versionchanged:: 0.3 - `with_categories` parameter added. - - .. versionchanged:: 0.9 - `category_filter` parameter added. - - :param with_categories: set to ``True`` to also receive categories. - :param category_filter: filter of categories to limit return values. Only - categories in the list will be returned. - """ - flashes = request_ctx.flashes - if flashes is None: - flashes = session.pop("_flashes") if "_flashes" in session else [] - request_ctx.flashes = flashes - if category_filter: - flashes = list(filter(lambda f: f[0] in category_filter, flashes)) - if not with_categories: - return [x[1] for x in flashes] - return flashes - - -def _prepare_send_file_kwargs(**kwargs: t.Any) -> dict[str, t.Any]: - if kwargs.get("max_age") is None: - kwargs["max_age"] = current_app.get_send_file_max_age - - kwargs.update( - environ=request.environ, - use_x_sendfile=current_app.config["USE_X_SENDFILE"], - response_class=current_app.response_class, - _root_path=current_app.root_path, - ) - return kwargs - - -def send_file( - path_or_file: os.PathLike[t.AnyStr] | str | t.IO[bytes], - mimetype: str | None = None, - as_attachment: bool = False, - download_name: str | None = None, - conditional: bool = True, - etag: bool | str = True, - last_modified: datetime | int | float | None = None, - max_age: None | (int | t.Callable[[str | None], int | None]) = None, -) -> Response: - """Send the contents of a file to the client. - - The first argument can be a file path or a file-like object. Paths - are preferred in most cases because Werkzeug can manage the file and - get extra information from the path. Passing a file-like object - requires that the file is opened in binary mode, and is mostly - useful when building a file in memory with :class:`io.BytesIO`. - - Never pass file paths provided by a user. The path is assumed to be - trusted, so a user could craft a path to access a file you didn't - intend. Use :func:`send_from_directory` to safely serve - user-requested paths from within a directory. - - If the WSGI server sets a ``file_wrapper`` in ``environ``, it is - used, otherwise Werkzeug's built-in wrapper is used. Alternatively, - if the HTTP server supports ``X-Sendfile``, configuring Flask with - ``USE_X_SENDFILE = True`` will tell the server to send the given - path, which is much more efficient than reading it in Python. - - :param path_or_file: The path to the file to send, relative to the - current working directory if a relative path is given. - Alternatively, a file-like object opened in binary mode. Make - sure the file pointer is seeked to the start of the data. - :param mimetype: The MIME type to send for the file. If not - provided, it will try to detect it from the file name. - :param as_attachment: Indicate to a browser that it should offer to - save the file instead of displaying it. - :param download_name: The default name browsers will use when saving - the file. Defaults to the passed file name. - :param conditional: Enable conditional and range responses based on - request headers. Requires passing a file path and ``environ``. - :param etag: Calculate an ETag for the file, which requires passing - a file path. Can also be a string to use instead. - :param last_modified: The last modified time to send for the file, - in seconds. If not provided, it will try to detect it from the - file path. - :param max_age: How long the client should cache the file, in - seconds. If set, ``Cache-Control`` will be ``public``, otherwise - it will be ``no-cache`` to prefer conditional caching. - - .. versionchanged:: 2.0 - ``download_name`` replaces the ``attachment_filename`` - parameter. If ``as_attachment=False``, it is passed with - ``Content-Disposition: inline`` instead. - - .. versionchanged:: 2.0 - ``max_age`` replaces the ``cache_timeout`` parameter. - ``conditional`` is enabled and ``max_age`` is not set by - default. - - .. versionchanged:: 2.0 - ``etag`` replaces the ``add_etags`` parameter. It can be a - string to use instead of generating one. - - .. versionchanged:: 2.0 - Passing a file-like object that inherits from - :class:`~io.TextIOBase` will raise a :exc:`ValueError` rather - than sending an empty file. - - .. versionadded:: 2.0 - Moved the implementation to Werkzeug. This is now a wrapper to - pass some Flask-specific arguments. - - .. versionchanged:: 1.1 - ``filename`` may be a :class:`~os.PathLike` object. - - .. versionchanged:: 1.1 - Passing a :class:`~io.BytesIO` object supports range requests. - - .. versionchanged:: 1.0.3 - Filenames are encoded with ASCII instead of Latin-1 for broader - compatibility with WSGI servers. - - .. versionchanged:: 1.0 - UTF-8 filenames as specified in :rfc:`2231` are supported. - - .. versionchanged:: 0.12 - The filename is no longer automatically inferred from file - objects. If you want to use automatic MIME and etag support, - pass a filename via ``filename_or_fp`` or - ``attachment_filename``. - - .. versionchanged:: 0.12 - ``attachment_filename`` is preferred over ``filename`` for MIME - detection. - - .. versionchanged:: 0.9 - ``cache_timeout`` defaults to - :meth:`Flask.get_send_file_max_age`. - - .. versionchanged:: 0.7 - MIME guessing and etag support for file-like objects was - removed because it was unreliable. Pass a filename if you are - able to, otherwise attach an etag yourself. - - .. versionchanged:: 0.5 - The ``add_etags``, ``cache_timeout`` and ``conditional`` - parameters were added. The default behavior is to add etags. - - .. versionadded:: 0.2 - """ - return werkzeug.utils.send_file( # type: ignore[return-value] - **_prepare_send_file_kwargs( - path_or_file=path_or_file, - environ=request.environ, - mimetype=mimetype, - as_attachment=as_attachment, - download_name=download_name, - conditional=conditional, - etag=etag, - last_modified=last_modified, - max_age=max_age, - ) - ) - - -def send_from_directory( - directory: os.PathLike[str] | str, - path: os.PathLike[str] | str, - **kwargs: t.Any, -) -> Response: - """Send a file from within a directory using :func:`send_file`. - - .. code-block:: python - - @app.route("/uploads/") - def download_file(name): - return send_from_directory( - app.config['UPLOAD_FOLDER'], name, as_attachment=True - ) - - This is a secure way to serve files from a folder, such as static - files or uploads. Uses :func:`~werkzeug.security.safe_join` to - ensure the path coming from the client is not maliciously crafted to - point outside the specified directory. - - If the final path does not point to an existing regular file, - raises a 404 :exc:`~werkzeug.exceptions.NotFound` error. - - :param directory: The directory that ``path`` must be located under, - relative to the current application's root path. This *must not* - be a value provided by the client, otherwise it becomes insecure. - :param path: The path to the file to send, relative to - ``directory``. - :param kwargs: Arguments to pass to :func:`send_file`. - - .. versionchanged:: 2.0 - ``path`` replaces the ``filename`` parameter. - - .. versionadded:: 2.0 - Moved the implementation to Werkzeug. This is now a wrapper to - pass some Flask-specific arguments. - - .. versionadded:: 0.5 - """ - return werkzeug.utils.send_from_directory( # type: ignore[return-value] - directory, path, **_prepare_send_file_kwargs(**kwargs) - ) - - -def get_root_path(import_name: str) -> str: - """Find the root path of a package, or the path that contains a - module. If it cannot be found, returns the current working - directory. - - Not to be confused with the value returned by :func:`find_package`. - - :meta private: - """ - # Module already imported and has a file attribute. Use that first. - mod = sys.modules.get(import_name) - - if mod is not None and hasattr(mod, "__file__") and mod.__file__ is not None: - return os.path.dirname(os.path.abspath(mod.__file__)) - - # Next attempt: check the loader. - try: - spec = importlib.util.find_spec(import_name) - - if spec is None: - raise ValueError - except (ImportError, ValueError): - loader = None - else: - loader = spec.loader - - # Loader does not exist or we're referring to an unloaded main - # module or a main module without path (interactive sessions), go - # with the current working directory. - if loader is None: - return os.getcwd() - - if hasattr(loader, "get_filename"): - filepath = loader.get_filename(import_name) # pyright: ignore - else: - # Fall back to imports. - __import__(import_name) - mod = sys.modules[import_name] - filepath = getattr(mod, "__file__", None) - - # If we don't have a file path it might be because it is a - # namespace package. In this case pick the root path from the - # first module that is contained in the package. - if filepath is None: - raise RuntimeError( - "No root path can be found for the provided module" - f" {import_name!r}. This can happen because the module" - " came from an import hook that does not provide file" - " name information or because it's a namespace package." - " In this case the root path needs to be explicitly" - " provided." - ) - - # filepath is import_name.py for a module, or __init__.py for a package. - return os.path.dirname(os.path.abspath(filepath)) # type: ignore[no-any-return] - - -@cache -def _split_blueprint_path(name: str) -> list[str]: - out: list[str] = [name] - - if "." in name: - out.extend(_split_blueprint_path(name.rpartition(".")[0])) - - return out diff --git a/venv/lib/python3.12/site-packages/flask/json/__init__.py b/venv/lib/python3.12/site-packages/flask/json/__init__.py deleted file mode 100644 index c0941d04..00000000 --- a/venv/lib/python3.12/site-packages/flask/json/__init__.py +++ /dev/null @@ -1,170 +0,0 @@ -from __future__ import annotations - -import json as _json -import typing as t - -from ..globals import current_app -from .provider import _default - -if t.TYPE_CHECKING: # pragma: no cover - from ..wrappers import Response - - -def dumps(obj: t.Any, **kwargs: t.Any) -> str: - """Serialize data as JSON. - - If :data:`~flask.current_app` is available, it will use its - :meth:`app.json.dumps() ` - method, otherwise it will use :func:`json.dumps`. - - :param obj: The data to serialize. - :param kwargs: Arguments passed to the ``dumps`` implementation. - - .. versionchanged:: 2.3 - The ``app`` parameter was removed. - - .. versionchanged:: 2.2 - Calls ``current_app.json.dumps``, allowing an app to override - the behavior. - - .. versionchanged:: 2.0.2 - :class:`decimal.Decimal` is supported by converting to a string. - - .. versionchanged:: 2.0 - ``encoding`` will be removed in Flask 2.1. - - .. versionchanged:: 1.0.3 - ``app`` can be passed directly, rather than requiring an app - context for configuration. - """ - if current_app: - return current_app.json.dumps(obj, **kwargs) - - kwargs.setdefault("default", _default) - return _json.dumps(obj, **kwargs) - - -def dump(obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: - """Serialize data as JSON and write to a file. - - If :data:`~flask.current_app` is available, it will use its - :meth:`app.json.dump() ` - method, otherwise it will use :func:`json.dump`. - - :param obj: The data to serialize. - :param fp: A file opened for writing text. Should use the UTF-8 - encoding to be valid JSON. - :param kwargs: Arguments passed to the ``dump`` implementation. - - .. versionchanged:: 2.3 - The ``app`` parameter was removed. - - .. versionchanged:: 2.2 - Calls ``current_app.json.dump``, allowing an app to override - the behavior. - - .. versionchanged:: 2.0 - Writing to a binary file, and the ``encoding`` argument, will be - removed in Flask 2.1. - """ - if current_app: - current_app.json.dump(obj, fp, **kwargs) - else: - kwargs.setdefault("default", _default) - _json.dump(obj, fp, **kwargs) - - -def loads(s: str | bytes, **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON. - - If :data:`~flask.current_app` is available, it will use its - :meth:`app.json.loads() ` - method, otherwise it will use :func:`json.loads`. - - :param s: Text or UTF-8 bytes. - :param kwargs: Arguments passed to the ``loads`` implementation. - - .. versionchanged:: 2.3 - The ``app`` parameter was removed. - - .. versionchanged:: 2.2 - Calls ``current_app.json.loads``, allowing an app to override - the behavior. - - .. versionchanged:: 2.0 - ``encoding`` will be removed in Flask 2.1. The data must be a - string or UTF-8 bytes. - - .. versionchanged:: 1.0.3 - ``app`` can be passed directly, rather than requiring an app - context for configuration. - """ - if current_app: - return current_app.json.loads(s, **kwargs) - - return _json.loads(s, **kwargs) - - -def load(fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON read from a file. - - If :data:`~flask.current_app` is available, it will use its - :meth:`app.json.load() ` - method, otherwise it will use :func:`json.load`. - - :param fp: A file opened for reading text or UTF-8 bytes. - :param kwargs: Arguments passed to the ``load`` implementation. - - .. versionchanged:: 2.3 - The ``app`` parameter was removed. - - .. versionchanged:: 2.2 - Calls ``current_app.json.load``, allowing an app to override - the behavior. - - .. versionchanged:: 2.2 - The ``app`` parameter will be removed in Flask 2.3. - - .. versionchanged:: 2.0 - ``encoding`` will be removed in Flask 2.1. The file must be text - mode, or binary mode with UTF-8 bytes. - """ - if current_app: - return current_app.json.load(fp, **kwargs) - - return _json.load(fp, **kwargs) - - -def jsonify(*args: t.Any, **kwargs: t.Any) -> Response: - """Serialize the given arguments as JSON, and return a - :class:`~flask.Response` object with the ``application/json`` - mimetype. A dict or list returned from a view will be converted to a - JSON response automatically without needing to call this. - - This requires an active request or application context, and calls - :meth:`app.json.response() `. - - In debug mode, the output is formatted with indentation to make it - easier to read. This may also be controlled by the provider. - - Either positional or keyword arguments can be given, not both. - If no arguments are given, ``None`` is serialized. - - :param args: A single value to serialize, or multiple values to - treat as a list to serialize. - :param kwargs: Treat as a dict to serialize. - - .. versionchanged:: 2.2 - Calls ``current_app.json.response``, allowing an app to override - the behavior. - - .. versionchanged:: 2.0.2 - :class:`decimal.Decimal` is supported by converting to a string. - - .. versionchanged:: 0.11 - Added support for serializing top-level arrays. This was a - security risk in ancient browsers. See :ref:`security-json`. - - .. versionadded:: 0.2 - """ - return current_app.json.response(*args, **kwargs) # type: ignore[return-value] diff --git a/venv/lib/python3.12/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 03a702c2065782857fb75d917012f0fc15745de3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6683 zcmd5=&2JmW72l;OX)Ri!?Zk~^*YPBlin5iLvK+esV>mJVk+?;jAX56Fq9BLdp|tXH zmziBkrePF85uk7njc@VM2cvLNpvV3by@*Hv0jv!eO?&XIfYOUk{k@spCG`rwLx*75_2(J)8Rnz)L%x*IaVmv2 zR22(+$qnST6HnQ_sY^AOKv=3cqUJWZXJ6D$Wd~ua*$iX^byeG}7WkMjqBUT0&caBd zzWqGu(kd0<*8&FvpebcgRgvh3xjws0b_ms;+(zC>d#X?MiP~#W2xP^_>bO$WBCkEk zB!@cSr#LrE^ij*D)yCROmxVn=;(EmDfu#M_-T4;A;kdOCb%zs#7?Okq-7MK-cTm|( zcO(>1+%CzNyMtwFE@Zj`u+Hv~w!M(tn6W1x78insD7t>+)r#xA7VpCVzWP+!up!n|DfU9&4k{I39f<`k*w4$3OFq4EH3dH0X zYJ~xrr?yPJDfgig!gmZBz8_CXtW6a~YPy61kYf|%STC$vhdS1wRqJTSI(nyece-Ou z-T%(#*3=_wY}IW%4m7;G#$=#y&prMJ6#*CNX!IFxf;vfD91u$cJ3!1_^`RV&-P^?(f|BPwLN1fd9JC{+c zWRE}3C~KY_1MN1U4x7xFZlWDC0$S&D z%Lw%1b{R~1vDxg_;U&f6TZd1lwh5o6?Wq)Bo)V=LF-%a30;W_@BXE!;zdSe-2@pBlKzNT zfZ&*GZ=(WYk&=#`=W=?PoPx=_NcZ$IF2vO4T|{&&p=ijc=mdB>s+5 zF-ab(LKzN(h+3JN{2}i5+?t9{RUlZ26DclIDeb1PLE#-2LvS3Piz`LXLu6jV&XOyZ z6SA0u^EwrxmqMu;4AO}(##>R)z+^R~9@=UdK`Uau5ZbW=Mh&2)E(n6!$t*;xk87Tk}jCD(MlsXksH+ zD`FgMkkT8P(c}!MCeoQkk1fxDegEW)H zWo&1Y2n?Uu*0A-i!2PnB)k(uef?9|sL#*&lX{dlZz_QW@LKQ}gIpFEi= z_Ppc3ZsKH{io6rOsw*^Tp76wy@No2!x5L=_D9PAI7zI*?Zq#PdMIH?aHSX73STn22 zU>VXdYDNfFlA>O!Aj_>fpP+0~;win8;ItehI+H9RqCo;oP4%oq@kn!J$)q*`cXyb? zy7jhv1*3kCfA}hjkBzV1HjTY6t>%t&az|EkVJOH$*ZTmnFx5)I)f=kwXu5 zQ%5x$Ix1o4M|aVUF(pndVP><;r0Y?1)oY*_S=SiVD1~1*&>bn4>n$L?D3>Lep;n-} z^SVR8Yn*M@jJm_~UQh*$=mevcz=qB!j?Vt_{Y&Kw?_Rp_lPg!>=~~MY2#V8GQ|R2E zipCYaRu?Ae{7;6`rDEPsth0c=mM6~1AEJqFy6_DY{~j<+^P%zDm&S{KHxB&Ec=e(2 r%A(oK& diff --git a/venv/lib/python3.12/site-packages/flask/json/__pycache__/provider.cpython-312.pyc b/venv/lib/python3.12/site-packages/flask/json/__pycache__/provider.cpython-312.pyc deleted file mode 100644 index df651ec06bc5f3648c6f6807a70a661f2d5661e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9250 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 EZ>-8Pi~s-t diff --git a/venv/lib/python3.12/site-packages/flask/json/__pycache__/tag.cpython-312.pyc b/venv/lib/python3.12/site-packages/flask/json/__pycache__/tag.cpython-312.pyc deleted file mode 100644 index b2a2e6eea006a5b0aabdaaaa2e2f783d2e006bd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13945 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 wr>9v~MZ3Dw8Tj=V2X$z|pL0Ae~TW&i*H diff --git a/venv/lib/python3.12/site-packages/flask/json/provider.py b/venv/lib/python3.12/site-packages/flask/json/provider.py deleted file mode 100644 index ea7e4753..00000000 --- a/venv/lib/python3.12/site-packages/flask/json/provider.py +++ /dev/null @@ -1,215 +0,0 @@ -from __future__ import annotations - -import dataclasses -import decimal -import json -import typing as t -import uuid -import weakref -from datetime import date - -from werkzeug.http import http_date - -if t.TYPE_CHECKING: # pragma: no cover - from werkzeug.sansio.response import Response - - from ..sansio.app import App - - -class JSONProvider: - """A standard set of JSON operations for an application. Subclasses - of this can be used to customize JSON behavior or use different - JSON libraries. - - To implement a provider for a specific library, subclass this base - class and implement at least :meth:`dumps` and :meth:`loads`. All - other methods have default implementations. - - To use a different provider, either subclass ``Flask`` and set - :attr:`~flask.Flask.json_provider_class` to a provider class, or set - :attr:`app.json ` to an instance of the class. - - :param app: An application instance. This will be stored as a - :class:`weakref.proxy` on the :attr:`_app` attribute. - - .. versionadded:: 2.2 - """ - - def __init__(self, app: App) -> None: - self._app: App = weakref.proxy(app) - - def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: - """Serialize data as JSON. - - :param obj: The data to serialize. - :param kwargs: May be passed to the underlying JSON library. - """ - raise NotImplementedError - - def dump(self, obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: - """Serialize data as JSON and write to a file. - - :param obj: The data to serialize. - :param fp: A file opened for writing text. Should use the UTF-8 - encoding to be valid JSON. - :param kwargs: May be passed to the underlying JSON library. - """ - fp.write(self.dumps(obj, **kwargs)) - - def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON. - - :param s: Text or UTF-8 bytes. - :param kwargs: May be passed to the underlying JSON library. - """ - raise NotImplementedError - - def load(self, fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON read from a file. - - :param fp: A file opened for reading text or UTF-8 bytes. - :param kwargs: May be passed to the underlying JSON library. - """ - return self.loads(fp.read(), **kwargs) - - def _prepare_response_obj( - self, args: tuple[t.Any, ...], kwargs: dict[str, t.Any] - ) -> t.Any: - if args and kwargs: - raise TypeError("app.json.response() takes either args or kwargs, not both") - - if not args and not kwargs: - return None - - if len(args) == 1: - return args[0] - - return args or kwargs - - def response(self, *args: t.Any, **kwargs: t.Any) -> Response: - """Serialize the given arguments as JSON, and return a - :class:`~flask.Response` object with the ``application/json`` - mimetype. - - The :func:`~flask.json.jsonify` function calls this method for - the current application. - - Either positional or keyword arguments can be given, not both. - If no arguments are given, ``None`` is serialized. - - :param args: A single value to serialize, or multiple values to - treat as a list to serialize. - :param kwargs: Treat as a dict to serialize. - """ - obj = self._prepare_response_obj(args, kwargs) - return self._app.response_class(self.dumps(obj), mimetype="application/json") - - -def _default(o: t.Any) -> t.Any: - if isinstance(o, date): - return http_date(o) - - if isinstance(o, (decimal.Decimal, uuid.UUID)): - return str(o) - - if dataclasses and dataclasses.is_dataclass(o): - return dataclasses.asdict(o) # type: ignore[arg-type] - - if hasattr(o, "__html__"): - return str(o.__html__()) - - raise TypeError(f"Object of type {type(o).__name__} is not JSON serializable") - - -class DefaultJSONProvider(JSONProvider): - """Provide JSON operations using Python's built-in :mod:`json` - library. Serializes the following additional data types: - - - :class:`datetime.datetime` and :class:`datetime.date` are - serialized to :rfc:`822` strings. This is the same as the HTTP - date format. - - :class:`uuid.UUID` is serialized to a string. - - :class:`dataclasses.dataclass` is passed to - :func:`dataclasses.asdict`. - - :class:`~markupsafe.Markup` (or any object with a ``__html__`` - method) will call the ``__html__`` method to get a string. - """ - - default: t.Callable[[t.Any], t.Any] = staticmethod(_default) # type: ignore[assignment] - """Apply this function to any object that :meth:`json.dumps` does - not know how to serialize. It should return a valid JSON type or - raise a ``TypeError``. - """ - - ensure_ascii = True - """Replace non-ASCII characters with escape sequences. This may be - more compatible with some clients, but can be disabled for better - performance and size. - """ - - sort_keys = True - """Sort the keys in any serialized dicts. This may be useful for - some caching situations, but can be disabled for better performance. - When enabled, keys must all be strings, they are not converted - before sorting. - """ - - compact: bool | None = None - """If ``True``, or ``None`` out of debug mode, the :meth:`response` - output will not add indentation, newlines, or spaces. If ``False``, - or ``None`` in debug mode, it will use a non-compact representation. - """ - - mimetype = "application/json" - """The mimetype set in :meth:`response`.""" - - def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: - """Serialize data as JSON to a string. - - Keyword arguments are passed to :func:`json.dumps`. Sets some - parameter defaults from the :attr:`default`, - :attr:`ensure_ascii`, and :attr:`sort_keys` attributes. - - :param obj: The data to serialize. - :param kwargs: Passed to :func:`json.dumps`. - """ - kwargs.setdefault("default", self.default) - kwargs.setdefault("ensure_ascii", self.ensure_ascii) - kwargs.setdefault("sort_keys", self.sort_keys) - return json.dumps(obj, **kwargs) - - def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON from a string or bytes. - - :param s: Text or UTF-8 bytes. - :param kwargs: Passed to :func:`json.loads`. - """ - return json.loads(s, **kwargs) - - def response(self, *args: t.Any, **kwargs: t.Any) -> Response: - """Serialize the given arguments as JSON, and return a - :class:`~flask.Response` object with it. The response mimetype - will be "application/json" and can be changed with - :attr:`mimetype`. - - If :attr:`compact` is ``False`` or debug mode is enabled, the - output will be formatted to be easier to read. - - Either positional or keyword arguments can be given, not both. - If no arguments are given, ``None`` is serialized. - - :param args: A single value to serialize, or multiple values to - treat as a list to serialize. - :param kwargs: Treat as a dict to serialize. - """ - obj = self._prepare_response_obj(args, kwargs) - dump_args: dict[str, t.Any] = {} - - if (self.compact is None and self._app.debug) or self.compact is False: - dump_args.setdefault("indent", 2) - else: - dump_args.setdefault("separators", (",", ":")) - - return self._app.response_class( - f"{self.dumps(obj, **dump_args)}\n", mimetype=self.mimetype - ) diff --git a/venv/lib/python3.12/site-packages/flask/json/tag.py b/venv/lib/python3.12/site-packages/flask/json/tag.py deleted file mode 100644 index 8dc3629b..00000000 --- a/venv/lib/python3.12/site-packages/flask/json/tag.py +++ /dev/null @@ -1,327 +0,0 @@ -""" -Tagged JSON -~~~~~~~~~~~ - -A compact representation for lossless serialization of non-standard JSON -types. :class:`~flask.sessions.SecureCookieSessionInterface` uses this -to serialize the session data, but it may be useful in other places. It -can be extended to support other types. - -.. autoclass:: TaggedJSONSerializer - :members: - -.. autoclass:: JSONTag - :members: - -Let's see an example that adds support for -:class:`~collections.OrderedDict`. Dicts don't have an order in JSON, so -to handle this we will dump the items as a list of ``[key, value]`` -pairs. Subclass :class:`JSONTag` and give it the new key ``' od'`` to -identify the type. The session serializer processes dicts first, so -insert the new tag at the front of the order since ``OrderedDict`` must -be processed before ``dict``. - -.. code-block:: python - - from flask.json.tag import JSONTag - - class TagOrderedDict(JSONTag): - __slots__ = ('serializer',) - key = ' od' - - def check(self, value): - return isinstance(value, OrderedDict) - - def to_json(self, value): - return [[k, self.serializer.tag(v)] for k, v in iteritems(value)] - - def to_python(self, value): - return OrderedDict(value) - - app.session_interface.serializer.register(TagOrderedDict, index=0) -""" - -from __future__ import annotations - -import typing as t -from base64 import b64decode -from base64 import b64encode -from datetime import datetime -from uuid import UUID - -from markupsafe import Markup -from werkzeug.http import http_date -from werkzeug.http import parse_date - -from ..json import dumps -from ..json import loads - - -class JSONTag: - """Base class for defining type tags for :class:`TaggedJSONSerializer`.""" - - __slots__ = ("serializer",) - - #: The tag to mark the serialized object with. If empty, this tag is - #: only used as an intermediate step during tagging. - key: str = "" - - def __init__(self, serializer: TaggedJSONSerializer) -> None: - """Create a tagger for the given serializer.""" - self.serializer = serializer - - def check(self, value: t.Any) -> bool: - """Check if the given value should be tagged by this tag.""" - raise NotImplementedError - - def to_json(self, value: t.Any) -> t.Any: - """Convert the Python object to an object that is a valid JSON type. - The tag will be added later.""" - raise NotImplementedError - - def to_python(self, value: t.Any) -> t.Any: - """Convert the JSON representation back to the correct type. The tag - will already be removed.""" - raise NotImplementedError - - def tag(self, value: t.Any) -> dict[str, t.Any]: - """Convert the value to a valid JSON type and add the tag structure - around it.""" - return {self.key: self.to_json(value)} - - -class TagDict(JSONTag): - """Tag for 1-item dicts whose only key matches a registered tag. - - Internally, the dict key is suffixed with `__`, and the suffix is removed - when deserializing. - """ - - __slots__ = () - key = " di" - - def check(self, value: t.Any) -> bool: - return ( - isinstance(value, dict) - and len(value) == 1 - and next(iter(value)) in self.serializer.tags - ) - - def to_json(self, value: t.Any) -> t.Any: - key = next(iter(value)) - return {f"{key}__": self.serializer.tag(value[key])} - - def to_python(self, value: t.Any) -> t.Any: - key = next(iter(value)) - return {key[:-2]: value[key]} - - -class PassDict(JSONTag): - __slots__ = () - - def check(self, value: t.Any) -> bool: - return isinstance(value, dict) - - def to_json(self, value: t.Any) -> t.Any: - # JSON objects may only have string keys, so don't bother tagging the - # key here. - return {k: self.serializer.tag(v) for k, v in value.items()} - - tag = to_json - - -class TagTuple(JSONTag): - __slots__ = () - key = " t" - - def check(self, value: t.Any) -> bool: - return isinstance(value, tuple) - - def to_json(self, value: t.Any) -> t.Any: - return [self.serializer.tag(item) for item in value] - - def to_python(self, value: t.Any) -> t.Any: - return tuple(value) - - -class PassList(JSONTag): - __slots__ = () - - def check(self, value: t.Any) -> bool: - return isinstance(value, list) - - def to_json(self, value: t.Any) -> t.Any: - return [self.serializer.tag(item) for item in value] - - tag = to_json - - -class TagBytes(JSONTag): - __slots__ = () - key = " b" - - def check(self, value: t.Any) -> bool: - return isinstance(value, bytes) - - def to_json(self, value: t.Any) -> t.Any: - return b64encode(value).decode("ascii") - - def to_python(self, value: t.Any) -> t.Any: - return b64decode(value) - - -class TagMarkup(JSONTag): - """Serialize anything matching the :class:`~markupsafe.Markup` API by - having a ``__html__`` method to the result of that method. Always - deserializes to an instance of :class:`~markupsafe.Markup`.""" - - __slots__ = () - key = " m" - - def check(self, value: t.Any) -> bool: - return callable(getattr(value, "__html__", None)) - - def to_json(self, value: t.Any) -> t.Any: - return str(value.__html__()) - - def to_python(self, value: t.Any) -> t.Any: - return Markup(value) - - -class TagUUID(JSONTag): - __slots__ = () - key = " u" - - def check(self, value: t.Any) -> bool: - return isinstance(value, UUID) - - def to_json(self, value: t.Any) -> t.Any: - return value.hex - - def to_python(self, value: t.Any) -> t.Any: - return UUID(value) - - -class TagDateTime(JSONTag): - __slots__ = () - key = " d" - - def check(self, value: t.Any) -> bool: - return isinstance(value, datetime) - - def to_json(self, value: t.Any) -> t.Any: - return http_date(value) - - def to_python(self, value: t.Any) -> t.Any: - return parse_date(value) - - -class TaggedJSONSerializer: - """Serializer that uses a tag system to compactly represent objects that - are not JSON types. Passed as the intermediate serializer to - :class:`itsdangerous.Serializer`. - - The following extra types are supported: - - * :class:`dict` - * :class:`tuple` - * :class:`bytes` - * :class:`~markupsafe.Markup` - * :class:`~uuid.UUID` - * :class:`~datetime.datetime` - """ - - __slots__ = ("tags", "order") - - #: Tag classes to bind when creating the serializer. Other tags can be - #: added later using :meth:`~register`. - default_tags = [ - TagDict, - PassDict, - TagTuple, - PassList, - TagBytes, - TagMarkup, - TagUUID, - TagDateTime, - ] - - def __init__(self) -> None: - self.tags: dict[str, JSONTag] = {} - self.order: list[JSONTag] = [] - - for cls in self.default_tags: - self.register(cls) - - def register( - self, - tag_class: type[JSONTag], - force: bool = False, - index: int | None = None, - ) -> None: - """Register a new tag with this serializer. - - :param tag_class: tag class to register. Will be instantiated with this - serializer instance. - :param force: overwrite an existing tag. If false (default), a - :exc:`KeyError` is raised. - :param index: index to insert the new tag in the tag order. Useful when - the new tag is a special case of an existing tag. If ``None`` - (default), the tag is appended to the end of the order. - - :raise KeyError: if the tag key is already registered and ``force`` is - not true. - """ - tag = tag_class(self) - key = tag.key - - if key: - if not force and key in self.tags: - raise KeyError(f"Tag '{key}' is already registered.") - - self.tags[key] = tag - - if index is None: - self.order.append(tag) - else: - self.order.insert(index, tag) - - def tag(self, value: t.Any) -> t.Any: - """Convert a value to a tagged representation if necessary.""" - for tag in self.order: - if tag.check(value): - return tag.tag(value) - - return value - - def untag(self, value: dict[str, t.Any]) -> t.Any: - """Convert a tagged representation back to the original type.""" - if len(value) != 1: - return value - - key = next(iter(value)) - - if key not in self.tags: - return value - - return self.tags[key].to_python(value[key]) - - def _untag_scan(self, value: t.Any) -> t.Any: - if isinstance(value, dict): - # untag each item recursively - value = {k: self._untag_scan(v) for k, v in value.items()} - # untag the dict itself - value = self.untag(value) - elif isinstance(value, list): - # untag each item recursively - value = [self._untag_scan(item) for item in value] - - return value - - def dumps(self, value: t.Any) -> str: - """Tag the value and dump it to a compact JSON string.""" - return dumps(self.tag(value), separators=(",", ":")) - - def loads(self, value: str) -> t.Any: - """Load data from a JSON string and deserialized any tagged objects.""" - return self._untag_scan(loads(value)) diff --git a/venv/lib/python3.12/site-packages/flask/logging.py b/venv/lib/python3.12/site-packages/flask/logging.py deleted file mode 100644 index 0cb8f437..00000000 --- a/venv/lib/python3.12/site-packages/flask/logging.py +++ /dev/null @@ -1,79 +0,0 @@ -from __future__ import annotations - -import logging -import sys -import typing as t - -from werkzeug.local import LocalProxy - -from .globals import request - -if t.TYPE_CHECKING: # pragma: no cover - from .sansio.app import App - - -@LocalProxy -def wsgi_errors_stream() -> t.TextIO: - """Find the most appropriate error stream for the application. If a request - is active, log to ``wsgi.errors``, otherwise use ``sys.stderr``. - - If you configure your own :class:`logging.StreamHandler`, you may want to - use this for the stream. If you are using file or dict configuration and - can't import this directly, you can refer to it as - ``ext://flask.logging.wsgi_errors_stream``. - """ - if request: - return request.environ["wsgi.errors"] # type: ignore[no-any-return] - - return sys.stderr - - -def has_level_handler(logger: logging.Logger) -> bool: - """Check if there is a handler in the logging chain that will handle the - given logger's :meth:`effective level <~logging.Logger.getEffectiveLevel>`. - """ - level = logger.getEffectiveLevel() - current = logger - - while current: - if any(handler.level <= level for handler in current.handlers): - return True - - if not current.propagate: - break - - current = current.parent # type: ignore - - return False - - -#: Log messages to :func:`~flask.logging.wsgi_errors_stream` with the format -#: ``[%(asctime)s] %(levelname)s in %(module)s: %(message)s``. -default_handler = logging.StreamHandler(wsgi_errors_stream) # type: ignore -default_handler.setFormatter( - logging.Formatter("[%(asctime)s] %(levelname)s in %(module)s: %(message)s") -) - - -def create_logger(app: App) -> logging.Logger: - """Get the Flask app's logger and configure it if needed. - - The logger name will be the same as - :attr:`app.import_name `. - - When :attr:`~flask.Flask.debug` is enabled, set the logger level to - :data:`logging.DEBUG` if it is not set. - - If there is no handler for the logger's effective level, add a - :class:`~logging.StreamHandler` for - :func:`~flask.logging.wsgi_errors_stream` with a basic format. - """ - logger = logging.getLogger(app.name) - - if app.debug and not logger.level: - logger.setLevel(logging.DEBUG) - - if not has_level_handler(logger): - logger.addHandler(default_handler) - - return logger diff --git a/venv/lib/python3.12/site-packages/flask/py.typed b/venv/lib/python3.12/site-packages/flask/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/venv/lib/python3.12/site-packages/flask/sansio/README.md b/venv/lib/python3.12/site-packages/flask/sansio/README.md deleted file mode 100644 index 623ac198..00000000 --- a/venv/lib/python3.12/site-packages/flask/sansio/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Sansio - -This folder contains code that can be used by alternative Flask -implementations, for example Quart. The code therefore cannot do any -IO, nor be part of a likely IO path. Finally this code cannot use the -Flask globals. diff --git a/venv/lib/python3.12/site-packages/flask/sansio/__pycache__/app.cpython-312.pyc b/venv/lib/python3.12/site-packages/flask/sansio/__pycache__/app.cpython-312.pyc deleted file mode 100644 index bc3654887239c7c71710899054b2013ce3d44711..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33702 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 diff --git a/venv/lib/python3.12/site-packages/flask/sansio/__pycache__/blueprints.cpython-312.pyc b/venv/lib/python3.12/site-packages/flask/sansio/__pycache__/blueprints.cpython-312.pyc deleted file mode 100644 index 397d28167f39ef6a149e5c319aa7dec0f57c7703..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31203 zcmd^o3ve9gec$dqfP3NY02~fa0t*5l00KM!BqfRvNQy6s4+*45kd8>pz!7^O4+QR@ zy#qrtke$t^+k&S$Bi$L&nqX=fl& ziepWi_V@qxd4~f<$5HG~7v%1@-}~|Z{_k(^Kb4fYI9%R8I1=46#Bo2S7wxhu0sg_S zSvl?oCvqY`#*Opmc%H(RG0Qm%ds@%g@U)KE$BWJtu{7IQ@wnrh17W*ZH0B()o^v5w zEIP*A|7bkv&Bf$ zLSo59UbKu@su6K6V4<3}YH7w(^hR8xoyNNsLhg_jHl9@1cYJSIl$di>8`kPat=o-q zTF6wkX2Y_jDEqip!g!j>)@@j}3}t(bGFr$~wtmC1?xy+7BZFH zYT=&Y#OhZ#u|$WL4i;B~xY~&KE$k<{&UH>%+UtHo!FE3D4##5gWH=d(#}fVYE=ESe zlVeFSI-JC-cXC1uCnJMbrSQZ=MEVIqBBG0uQxnnH#h>uXYt>*RCQihovE<;06dxbF z5{+CP9GQ#_Bdc>T5s4+EvB(%+9H)oFBO~!K5n*>ClAN3vk0dX}>D9V_Vj^39U~Don zA)%tvlz18)i)4KRgW-{6L>iPLFHJ@g)Ghmk_+(7X`UeItL`LFLL`$N)5lM z@EA3q*O5eLvfhEgNoj0Qowh`_N_oE$#z;^*Mx!<`Of#-s>RRv*o<+;Hh!EU(zk*(gOUDv(|*+Fr4rvrk#u9g-JSPXEsVj5IEVr77VO<~t$@@e8Ao z;iQ1+5~Rq*XaWPo5(;7Af;Q*E)oAjPkh~Oe3AnJ}W6@y-86iQ~9}}XnL^2#3jtKD) zWQrz);jwTcAy7byU`|Eh!jxXRmln2n=pT$A&*hN5tfBGn

}Gi#v$gl93@nfdB#P zCD6)9!USrKh^!CExDXy2)B7t7-KI1v+G{Ra)+MQ^icrf9=9J-O|%Hjy7~(k!v-=V;S9!;cblGr#9?(gh4XHrxf=MmQxwfotROYh70& zu`69;(FU5RKivTXvJHheLX=wkSwD-n(*qVX<$n2FHDRMs>z}f zgM-s`I=(Q-KuAk%M{g2;gWGj(&CdlY=WJhdtQB!JO$d0`99&fc0-iMw*Ywz&?Vh9I zexT~cvy0EB1I==vdHMWmpl8mRaR*ZFx=dBwo8Ft=bXB)p)jf9=2Np?wfV##vZw`=XU6w&8v-v-*Y_u05ib#51UaGZ5@C;|6mR12#Ajx zr964pSB}l_QlDrU)e)VMp>T;&9X%O2MIHSBCFq;JQ2L0TbC!>J3b!!J&)5ngR-orX zXj9vIJdpc!cd|rlcgCu1##tc!La1uiF4|^nS2(FQS*n+^kML0-|4|*`Xek^g+O!(K z#s6b|)^4F$Er56mp%@}Hqg6&-TIjbSpdh72dpDje#q!(S8}@>8YS;QQV;!+#9QG*Y zjrs-D!?zbr|Lgt2rN|iAG>xW$d}^d#2n*8WSVU+eI;-Fm(9$VH6SJn%({>lz=D49O zIDtGaU;r^1t4D-CJedThOM*?Hx)e+YJ|KsWpbGVk-kJ~y11eOTQu;sTyBMm;Iy4sQ zQ$E!0Wf(1M8wFFDEdt_`q7&JoG3Dt3|Da}8uoTf`hS;PwgtFF&_yogdSx;CL8GA-! zXQ+`O$@U_tgEHDEI_uCzly&NitAYo6kSRfgl6oo#63K1S6Sz$ag)o%4u`f{3|A8B@ zRFL!dU)wjoFXi6y17CTjvgXFM#cSBr4c}}?H|~-fcipkBHul{S|M>DBUVgV}b#H%4 zII&uJa?y6bvi8Qyi!U$OG7ewbQ6oEQmY!U(z3si_z314KahIpuweMGU-FB{4_Rby2 zlvk$9o8|K6IR}u{Ql;z`-mk1(IwDs-wNm`H`kqF!FV&o+2)Tc$&hW5v%7?sJ|F2v(wSYdF4 zQY>rhkH;eImi~TJvK#rcR;;*00_LYKgoGJ^GDuHSMCC{_bSgfXj2r~;g)acM)l^2p z_E2m4==KzD?L|ag80{U*x&{Zw<04jma4_o`9DHdqJf@};4-Sg);lV*^8x^F5mNwIk zhNUb%aX*Z~ruf8l++N{6wAk#9HBYDg8UB8G-I|>OpbXy9wPF@@aAlQiP8M_l48fH3Bz2>GkD*kZ^LacMc z=!kx)92EcH0JzXs^P~&W0=s0IMz!Pg<`~-Ic|i9q)~FNNURm@kVuLn4zW%w zdd2pZ+Wa{uizzn6xFEA^%B@eV7afpS+{oJ?I!$>!q9D3ZZ;99_y7BZz)V_(Eb8FDv z#3s@6id}ErNBPBOB~@$@OH65ga~kCkw}@U-dZ{^GY!!W`v@&xVE88aeP3h(4bg^A5 zHKhg2X{_v4vCNcSfm!Gf%T2QoL`OewXfzX#d_V;$?}xNH2mO{cl`?NT2WH~eE@*;5c_BP7oQ^&3dN6EDN@u`#fM zP$Q6dDAB$|9-=j%A`+u2;B2=^5t8vlo!%rsWWq_vbur;WL?>3rfO^7s509BC5UYj> zi6IvY?>9QZ$PpS>q+C`j@Iw4*LI9}%UrC~_A<-HgVD%8eLYL9tOOsJWEJpjL>}s{) zOOY`82KhG%A|@P73X=(pQxlmJAZ=)F7;<+qE@Au$p_d8Cx*+^CiNiyk!UZ&jenpUp zsBA1ka{|dc9Mh&slf6l(mZ(aRhJeiDETbYSo23DDN)9Q_E26z7CMy)#v}CHtPRq!; zA(_^M^?*$viT0R8q%n$~Hx`|!Ck*-C;Ma$giM5jImpLsC2r#Z)+XX-FBc242)ReI6ASO6?b^Qli6yq*;qdy~2LX z6Vv&yWm6Ib=(HH9V!I^(>|;>ZD2g7cHW87oU?vm=j?oC%HMKO`(bQ#39D1g#B7iV@ z1-*{z14LJIO4CqSfsny5X;ms63S%+FXo3j1qVr*+oFcF!J!GL_GN~G!P?i91w1R8| zxmA-c(%>`?DHUSF#f71voEf9VI7&(_Q|ARSj_HDKRJatrVoX#RWm)@7svp8urcyu^ zc~gZQ129WM+eLsj91$bXoOSB+M3^zBIit8TEmz~Q)+B*xc$oB)QA|(HROm{`!fUQ2 ztN2x4Z~;83X`T%xAMI;pFqL6x_>#J81BF+ddasX02TIgZaK*K%fp1L94RF(|(3aZ- zCPpDz0bnX%b5alL(}_NSZUA#9jIKl#bfYYYQG+r|IWuUiB5fE3)R+zxD-e)i=dME^ z7~q*x&nAq8L_Sh!(sYay97EGhN>)G~MFG<#l3FE7pA^!V(-U1`L>2~a6bGSpAt9Zl#p z=yjuyNtGKR)?y?a9qSYlibTs+T4gvA6OrNQNYu0=#=|j&vYECU#9k#Xp^$I|#2VCQ z7%+D+BKGzQJ)xdZx8C*vZJ~hD6>uFI8Xk)RgeP2*@% zOc;2IHXJKD$O@tYM%XYQ3AtlQDLzKS&ZTck8?cF}ycQu*$}=>?6mFlya+WiG%)5=UCZ)So+;?jqH-}+wXWluDK;z1FG3e%Qe!)=TcX^oW5$uA zhIZjiS1Gd+x&j~ST6=%HJ?l0BTDByIFl2q|D?=6_Ia!~EQ&eJ`b?Tr$UDZk~M=KD* z6eAqK-Y~)>r$Q2$W~V#yl4&ssn!$pB%Cv@B1;CaR9>zk4+FeZVXUUv& zm@He0mY3;!N%Na6!*)crh{z0XOjj(CiZts4^eG^ebr0&BFwyQ|x(}rqGG$7~=|*-a z={dUTRVx~meu^X0BP@A?jF}xAOpsZDKuo=^E5b2J&C_N2M$k33zlZq5JZ^t|o%^_k zb9(2CWk*$}swq>`nyKrcf5C<|H|MPWn1dGKLqF#aykAzA+O%u6>T$5Wo;P`EPPYE3h#Uo+L4@$hE$?N>Cu?#h(AAyd0)?%DfIT@)o~ISxNFXM4|4 zr3lRybV<8(I3GaFM!Hj}E~!JN2uOv#j`WN=d}@_(98#=r==!>^@_;p4|8yDcZJ<1$ z1J&x)I^Bt72a1ZtLEeB^B%=8$(+w<0dstsPp>;ad%A}4r6In8q#I-h6eh?R2!;Ms$n_l2vcx2aG*LfgV|17tjg`S~_tu zCYMMnEf8CN-MY&p5xwd>u@BkxiU=K|F!6C0C&vLa6jqdXfB{u}P;I~KOuc$73h)~w zuOAEhJfJ*SiYG|f4t=YabC#qX4YH#l?bsqa zwk#*#b9Am>A>B@V1jSwjX%nq;JoH=qD;{P((5=KsRxe}w&sgSp%?$CDniK0~X}3-P z?=Qrq%Mj_J*h=bDD197aVn4Z3C&!T(NQ`YvT0K1#OBIhn z^{!)#VW=fkSw^331A*kq-eK%mY=7)sXfp}`2IJrKTJ$y*`#ed2gi4f_jkO#$PaACl zSXKB3-3So(0BotvrRga-E!;e;C8mjlG4&P?hZLqIZnuCM668r=L@5Oz6q=JQRy|Xu zx8y?vLnEO+lB~xPdqZlzHL8H%1hgpQ3#5ImcYUot@CO#oyza(M_O~%O>Az)@!pOu_ zy(TrXMS789iLGh3Ds+^3BwfHQL4y^B6e~g2tt>g~#B@c$zWpT?B5I4SeB!q_>!9d$ zmb~VkcmHPp@~)LbuvEV1*sj2>nZ)RDOZHwcWcq~9kaq)^vA5LR(B1LVKR(EuGq7WG zJvee5G;|Poh%Se~(yU$s04Q206(B$X2sSlb!yu!Ovj)|3dh!C}B|wyj`o+OqOHq-; zDAdYWWwHkV-$5Kw+)PwOjzT>dFc>fgFd@Z!yG>b=CWH+`c7kSu+GI>h)}N1-rfZDV z$xr($6itx#02mi9=Wklxxl+DzF}3UHs_$6Jacn(Kp|-$2^A89t0PXe_5~(?veg+C6lL(j3v8d7p&3+*XYI~?V)T8%-at#20hK7iZ zhRC9rDH(u(VS%QVbxUDp7^t;DTHgld8N!rdxTI>B>W_d?A99}BkrZR90uGE0X^AN} z>2GtoV-&}Hpbr{sqbK7~PDLkRbt2?RtQC}Eld&i~)L83@oO(#LtLTjof-tLSuc@cT zv}l4DCPgnh-Exrm=jjb&osB+Wwxdb%-{=Q2ItfsbPSfo?ZW?xKrid2Y6zrsJf--F& zhG1ZFx(KaL{XbL%nL|Nd>o`xvl1+BkF^2rmYT4nG=P>hGr~+HB5Z>kLm1k1I&i5RT zDSO0$rqw9ytaXDt*7<^aNH1rbv4Rzc$sa~_ zYe7c_UG!wWSo|nq*SrhD>MpoB6iAt|lN-@I?Qx4}kMUyBY!QjVmv>>>;UhF-N9&F^ ztVprU7AJMlQ*=^~MAu9a?(Ugl+&ym;zopK?SNWtaf-{R-$t#Y+?T?aCHSc;$eLuu$ zA+25yiO2TBHC^Fno%6s~g-6+kIz{ii$-fKpUYgf1UK#yyXr89CF61g(pG)ePagA22 zk4NqTo?4h2-y0UB5!KGSME`e6wbr0=a3m}VGrOg}9ea&Or2ui6nBE)%@4uKw|3weon9o@V>PWtYQ=Xx*J;1TnW(#Foa z9=$bVbg{`9PjZV^5ny@OjJ#ttW__rkP>u>chkwR@-7`~C$m@UBkNpwK zYaFj%shaVBB{<_3ZPR!woQI`&#R}T7u_oj%n(@zQ@3n=?e8pEdUMn}_V?8AvKJUUf zU84o!zw-Eu?<+eCr;YB&s|2rNP@5Mq$VT8Rh^zHn>L>&1D18_uW?WR>X_STfv_W6B za=?sUk*6B5Dvz!2Bk+e;+toba#pU%#TU*T+J#?^Wo|pm-gI;*6?i<@DVlz=KxAzs(oMTzaL`s|+9I@m%C}CtXnvT~)H+?) zO2U$+UN)^gNiowdVz60dX9!^T#=! zsYhRgl?Hym{Jdq7`z`(k52nin1k3#^>s4MFqHz$%1a+|`)Sb0lm|&v5D%B{upiiBB z7bCIAwFznObjtzF9H--8LlvZF>jQ~S5F`56e@RN1yRBz#ODmQY@jEWL^~}$h;^5c4 zrToCOzpIbThP`B)r&-#YEm90a&{UE$B6Cq>R+4^`{e*~6d#%(;8Hh!ch^k~=#ztU5 z8(jWlQ`sWL6f2#jd?S>v6iR+}Mn-q+P&^XJQj_(=2}{&d(W`85a6BSij2HqPvj-)Z zURAN*SYZ&#Iy8f$L~M`*ZkNLuFnGzT@l1rw+J@s3Q^pAZX(wfKXrRzu$|hfGq8f+? zRSq3ENfc#@c{bW?@r4N(pA*AbcjOu~j9(lKC$kmGIR>OD)u~4rDwSxO+?)iahGV|L z%*d53BdZpy>hUr7t0?9z#og3}8nv?$B?uel{j3MCx>-FzV#^S15%Z-Ou)d5WvjIyR za4EsbamcIylC@s0vi`>9#mmdvZkMeFch0#pf!Z6#7mqI&!8O-;%eflZjspf|n-(@L zg_oU6UrzZt(!TAoZ~N^XtG-=xw)<}1!j2nz7x&8U#*EPPZSOa|D@j?{dB-LTeTyUS zY@2%~vvtSq6$LNrYlq3xK_-SG<;0m z`q0aH8s+9E;d7k!w91~=73<2tJk&_zr#h$TyF?=ihc; z*#3|V_mH8bJ>Bw{-1681uFlyldm87CE=*^to8D}=*|1u@b?#WEZp)kfH~UxmR_mUa zdoEMk^5))~dsjMEYafSQ(pQ`EHDwyw(hb|?hV2WU`@XoV@$F zcZXMZpOOQopcOBzUFy5*Z^Js2p{cEzjwjFz#bio@>C#5Iv@un>Ez{AR?s!t}c#_g& zf7|`G&bea?v$CfJF5?Q2EG3qY{bx_thr2Oh>-9pkF_~US!2MOr4b{6<^>MY%SybB$ z9ST9#{Hu^HO_SIl*I!koI~(*ow(FL8ORQ)fM=fB$WxAnRo8hdG)HOXb_J`N{TG4C8 zuQ^_G4%?&Lu;oRdR3qJxq|TkzsPjA!NwJ4Zw#hRX>5il_0uRy zl-j`wt#8iWoc-;WKjJJU-HYx8>%!SgedE&QMe%m??cnW~?v&rLue`iq&G>7V4jLq* z=skbehjtWUNJ<%2k@OEy?We8O_47D-vVUUYgrs*5_LNRod=ts@>}<=6FG~Lixuvhu z%{YbP&XzH;Ogo)ENd9Ni9A%>QQ%)~=^+QO^nI{{_J>ssgb=mTqBk^ivP&?`l4v8I= zSK}*8et;}WskxG(8Q+<6P(6{Y)t#KkM=9r+e4^cLV*VIcODiRP4Y#bFRYu&Sh@-A_ zSC5}&osnz9iuVvR;WBi}0H(F;)k+VBf(YI#B z^M3VHYj!;808ZH_IH=T(L!z|}>6#w7rYBvqORm|qTC@8j>x)KQ?!8p(0bWX{lqe zc|}|~d%NfM>Dz}__RSr9KhW^LKY%(yJKjEj>-<|U{?u+QE&Gte?MGGZOSYxUpo$gM z?{uUOoR$xqUOjLoU32!<%PUiNnwNGji#PYJ)|{0CXFsu`zyo_xg?H{Syb?OP=MJVl zn`O`Dr49Ea6b5ia(`JUtXpFL>eYQMn$j183;*8ilc?rBHapX@Ao+EVxL`67hBZ=rk68GUlM z!t(PEeh-0H`ByEkT3@xjYQMqFTO^+dA&@x;>Ils2J~(fcS`0sod7Nd^aHdp^lGZ}* zSb4SSHXmk#rM~1{bCx;#oNbPuvyRwt&dKqX+7nn_i`t9Be!QMiRW?GHJc58h*^uRo8%x4>DhmeG>w*&zlwojZZ zhXQ7OtBRMhnnQ8g&pFdzxGyuKDyyKE{5yJ?Z#&s2J4pxd@FsEi{HnQa5i|>2=;V&(GU&eion- z1)$OSSvX2q`m@!l@?ubTBh~~;_!rP&K%64v6N;$Mq~32JjvZ5EIsoOM=ykdnCi~RU zHx?ehAcpr&x9M~uWL|uOcxgF*AApr0wE@uDLTn*?BeocW0G9DrW&G7Rc3DXW+&d2O zICqJliz~1B(2dY_<%nWG93W1jaJCq#gK!cjCuw$>%Zhs9Rq1Un#WJ-88v%_)>HH8~ z3L2*IP6rG3`y13tYUqDm=RU0GJb@+a(zTmDW)ALOEjy9&ocNJD@Qq3sfsfs*-gW2T zJG;{d&&c@KcZOveSS>q~@|?Nv@Q}C5Pc87G`^4%{&yVJ?HIM`pnShLcuPR$TRfSC(rI$GvXa}zqAXi;lv_3Kiu&Yrh z)Xe?Rs3UvoK3G&GHa^gW>KS2ZU~{$wu@!7vkU8mf$W-$MZS6B~zk>6&%22|R%AMwJ zS;+m0C_Fy6Q%P`(DKS2NqxAZgHOr4E%B>FMRP=G`2FN;fw^1`ASD+SSBj_c*j|F`| zR$S}^M!wo)PuoiA?Lf-YcF*&8raUlrgmGtp`QJr0iPU%stHna3EWD+Lbl0Q5m2Xrc7d50GMs?(_Jh7NsE;}RBu?G5tC z%3lz?7yOzJ?X0|O-g1pk;5&2k1-&Txkb8=ghVTH)HsO(Vjz(jnVSGI6O14CwDGjp_U@ZI{Mym^qiIir>}gPS zbhf)~y|?-AxxVYV>v@uGyMAdH{kp|VB0W^cJGK$oZhMeD?qO8ky-lHH``~BiN*~!6Mf0+?}tcGOJ)*b zSO>9R*s&s5uDT8D;iHidrT@QT1VsAhSVho|igmPux+{GPsX1^h5sIER%+#SAEJS4t z7}n{;e!WAosd?vu4urTEnV04bgc<=&6I&U z_5tl6jV{#uz0ig5=LyP>Kow}%zZgwmH59Z^|B7#gUlzTPz5_VT+G*YtIw6ttoV$kz z@lN-eKsBElP-$Zyt)m5hL;Gn9Dj{0Xw(OaW;J-bb`K>999 zNxx4$%0>MDhPq@rhf@$8&?l=Bq-`X$U&lN5{vBfd)(y6b@=3?PAH1)$^>>f?wK4pP z;{Nq=gVN!Ru)j&+n}dOsQU=`W_}>pUK>9X89!WTwFhFjkiZH-J8zA{y0YGVDLjgcZ zwo-H7)0!J5zC*io9^@Bf_@kdMv_1lASBCnFA$PTozjO4i)Z3|iR_5~(mVdbjzE~OK z!%_Uh7=ER^v02t3d3@iPlWqfW9|e8?5%N8hZ&#WNqE4M}2LgX2zMTjK_Kk8rjE>+H z7K+tlc_uaNJk!}tzwxZ;kX^2wME%H)dg?TS14i^69cC5jWCz#SxjFXn2prg_j|Cg2 zVe&tNk|*$LQnIQ5%4_$tG%+!ZdE=vS1!YY;isW4)cahWdHHAJFh|`I{BXph4kvXLW zL`jd+?L2O`EYcekCdtiwu1@-Ah%ocw>L3XztFvgpm!`e!A`l=CaPSV$T}Boo>0q}U z>`n)tl!H&+IfPGF1`nr$&&t7P-+g{Hc;dSHWi?_P&=FD~nL45<>t)Da6c+!f85VP_b1EpZIN|ez#N1YY#Q|}V zmRkoz=|A9gJp^tuakA_i;131B-30)!OAdCWgS~RF_s-6D;IMTl9Xu`vkH5QrHP~+k zK%t1@Uosl}CyxSsCT>)pSQ9v`$AAY50N{2xxIG=*BM0}~5#Kqm8hj=l z?3aW6@4mDeeE#787%0@}biJ`93Z?Ja2n?V9e8KQ{&0x6BZ9s)X@*vi9!gRX9Fuf>f zk<5UMI_tp0sPxZAkJmT;D-MgVKME}N7|Tu|xNeZ^f$;=E!dBF6BFDSr;I4G=fE+yV z&dzs%4WCU1Ps_p6sev=A!LtvC#)^W?<_PwM`t^(%9+fXMkS6zsp0f{!M_rtHxJq~W zx6E+IylWH$MkZ|f$|8Z>Bhg&*x3tI<@`#8pr^yWfjmE;PaAbLX-9l$xMGJfkG%F@~ zEvVcYGU(Tg&co4pMY41D7sjPWP=pK^8`-=Id2ksF;=KNaZn!t7%%VjxPu7IZNeteQ)?G!}Y-TS2yr0p>^BO3Vj>^K9 zkdsjf{GaP&PuntG(^ zo&9#$Bk`32!ybuL{rW}O+ka`^XN4Wd9(Bj*$o+4}YHZN>278aj&Gz0enc?_N^y4$x z-N$qHOyQ9lTSXJR#t01ZF#QfWxFa3hD+l-9NxpMxHFzW)JRt{9q)tNeI(6M7d97!B zYY5B=w>{nbC_NOZKbi<;#`&inj`M#}7|o#tGyv@*6^{y;nkL|HNegnC{1u1C-*^;w z>|DRv+LW$`!Yj1udE$SM9PCL4`{ZEXoq>0@uLhq^2cMIJ&%GO74W4{B5HdVyp3r(?mEdSbW>+nBFxw&IZb zg}>AE<+!KSUp_Lq74uKySD%`wf)cv5;P$CMzj^i{C222ZU@dqNf>&5GMfA~)ib;Fu zX7r#auUhH9Y@E*Q{&^#?_Ty9j9>wd7B{A1CHigXp>>yS54cw;P^g96BL>K6a<~PAw zVHHp>r?)3Vbo81$yUw3C{WO>2P4Qx1PYHW(Sb<=WBGM@hUpl+-B7{tzq+cpJ6{{_8CpnEJ>ww zV*o)RjkEIUu@ur`L1xvw6w+b?dMt$yON`HS1%5#;a{lnO;RySEBibGKO(E9Obl%J| zW=M0HXG6@5(HbJ_q0&_fX|W_eD6tf3uUC8`4^!;ZbbE$wXX)mm+cvtrKsP#sqI~X4 zq|gZ6$S@#%nQm9;_5|H-(d~EW_6Kw$Yp3+@==Mi+`##oR?fBJ+OFUQCn6g#j_aL6= z%WT=2*}W&z*n-1tneLr*7uweJ6;EGRiZu<^34k3I_=mbB2uPPSXkMo)Gpc-iGQ3KB$R|5B)br0;6XRVA? z;kg8^%U{S?1;fTsp=`h$K{Bh&NPn!8T@T@5@j0ra~X6jFXygF-H@ zxr^n(JmMENN+`~YU)cD_hmhI~#r2`$`;9GYRkEeLt>|lkTB)zBR`ivg)K@$=sP!XDvAtAn2_bbs9xZOo;!faWRR#qap6F-!x{syKVO&B^WXoTpXa?IzX z_FI*DHbU9ipq4F%_hClPS($sO-J6=TM|1IQRT(FU-HNFtf5f-LY5h*n6*J-*p#G1~0wz=G4upjBWGE z=JeL*hmbN9{N8C(7Gh4hxg@|MHsLmm21^;6d= Zo_Br7(f#95%YFx6y5RVPqbFOA{|nqvPV@i( diff --git a/venv/lib/python3.12/site-packages/flask/sansio/__pycache__/scaffold.cpython-312.pyc b/venv/lib/python3.12/site-packages/flask/sansio/__pycache__/scaffold.cpython-312.pyc deleted file mode 100644 index 1a7078b8e87e1c8ede35d1234777b2dcfaf518fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30216 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 RjjpW^hFu$6Ync}9{{os_oksuw diff --git a/venv/lib/python3.12/site-packages/flask/sansio/app.py b/venv/lib/python3.12/site-packages/flask/sansio/app.py deleted file mode 100644 index a2592fe4..00000000 --- a/venv/lib/python3.12/site-packages/flask/sansio/app.py +++ /dev/null @@ -1,964 +0,0 @@ -from __future__ import annotations - -import logging -import os -import sys -import typing as t -from datetime import timedelta -from itertools import chain - -from werkzeug.exceptions import Aborter -from werkzeug.exceptions import BadRequest -from werkzeug.exceptions import BadRequestKeyError -from werkzeug.routing import BuildError -from werkzeug.routing import Map -from werkzeug.routing import Rule -from werkzeug.sansio.response import Response -from werkzeug.utils import cached_property -from werkzeug.utils import redirect as _wz_redirect - -from .. import typing as ft -from ..config import Config -from ..config import ConfigAttribute -from ..ctx import _AppCtxGlobals -from ..helpers import _split_blueprint_path -from ..helpers import get_debug_flag -from ..json.provider import DefaultJSONProvider -from ..json.provider import JSONProvider -from ..logging import create_logger -from ..templating import DispatchingJinjaLoader -from ..templating import Environment -from .scaffold import _endpoint_from_view_func -from .scaffold import find_package -from .scaffold import Scaffold -from .scaffold import setupmethod - -if t.TYPE_CHECKING: # pragma: no cover - from werkzeug.wrappers import Response as BaseResponse - - from ..testing import FlaskClient - from ..testing import FlaskCliRunner - from .blueprints import Blueprint - -T_shell_context_processor = t.TypeVar( - "T_shell_context_processor", bound=ft.ShellContextProcessorCallable -) -T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) -T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) -T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) -T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) - - -def _make_timedelta(value: timedelta | int | None) -> timedelta | None: - if value is None or isinstance(value, timedelta): - return value - - return timedelta(seconds=value) - - -class App(Scaffold): - """The flask object implements a WSGI application and acts as the central - object. It is passed the name of the module or package of the - application. Once it is created it will act as a central registry for - the view functions, the URL rules, template configuration and much more. - - The name of the package is used to resolve resources from inside the - package or the folder the module is contained in depending on if the - package parameter resolves to an actual python package (a folder with - an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). - - For more information about resource loading, see :func:`open_resource`. - - Usually you create a :class:`Flask` instance in your main module or - in the :file:`__init__.py` file of your package like this:: - - from flask import Flask - app = Flask(__name__) - - .. admonition:: About the First Parameter - - The idea of the first parameter is to give Flask an idea of what - belongs to your application. This name is used to find resources - on the filesystem, can be used by extensions to improve debugging - information and a lot more. - - So it's important what you provide there. If you are using a single - module, `__name__` is always the correct value. If you however are - using a package, it's usually recommended to hardcode the name of - your package there. - - For example if your application is defined in :file:`yourapplication/app.py` - you should create it with one of the two versions below:: - - app = Flask('yourapplication') - app = Flask(__name__.split('.')[0]) - - Why is that? The application will work even with `__name__`, thanks - to how resources are looked up. However it will make debugging more - painful. Certain extensions can make assumptions based on the - import name of your application. For example the Flask-SQLAlchemy - extension will look for the code in your application that triggered - an SQL query in debug mode. If the import name is not properly set - up, that debugging information is lost. (For example it would only - pick up SQL queries in `yourapplication.app` and not - `yourapplication.views.frontend`) - - .. versionadded:: 0.7 - The `static_url_path`, `static_folder`, and `template_folder` - parameters were added. - - .. versionadded:: 0.8 - The `instance_path` and `instance_relative_config` parameters were - added. - - .. versionadded:: 0.11 - The `root_path` parameter was added. - - .. versionadded:: 1.0 - The ``host_matching`` and ``static_host`` parameters were added. - - .. versionadded:: 1.0 - The ``subdomain_matching`` parameter was added. Subdomain - matching needs to be enabled manually now. Setting - :data:`SERVER_NAME` does not implicitly enable it. - - :param import_name: the name of the application package - :param static_url_path: can be used to specify a different path for the - static files on the web. Defaults to the name - of the `static_folder` folder. - :param static_folder: The folder with static files that is served at - ``static_url_path``. Relative to the application ``root_path`` - or an absolute path. Defaults to ``'static'``. - :param static_host: the host to use when adding the static route. - Defaults to None. Required when using ``host_matching=True`` - with a ``static_folder`` configured. - :param host_matching: set ``url_map.host_matching`` attribute. - Defaults to False. - :param subdomain_matching: consider the subdomain relative to - :data:`SERVER_NAME` when matching routes. Defaults to False. - :param template_folder: the folder that contains the templates that should - be used by the application. Defaults to - ``'templates'`` folder in the root path of the - application. - :param instance_path: An alternative instance path for the application. - By default the folder ``'instance'`` next to the - package or module is assumed to be the instance - path. - :param instance_relative_config: if set to ``True`` relative filenames - for loading the config are assumed to - be relative to the instance path instead - of the application root. - :param root_path: The path to the root of the application files. - This should only be set manually when it can't be detected - automatically, such as for namespace packages. - """ - - #: The class of the object assigned to :attr:`aborter`, created by - #: :meth:`create_aborter`. That object is called by - #: :func:`flask.abort` to raise HTTP errors, and can be - #: called directly as well. - #: - #: Defaults to :class:`werkzeug.exceptions.Aborter`. - #: - #: .. versionadded:: 2.2 - aborter_class = Aborter - - #: The class that is used for the Jinja environment. - #: - #: .. versionadded:: 0.11 - jinja_environment = Environment - - #: The class that is used for the :data:`~flask.g` instance. - #: - #: Example use cases for a custom class: - #: - #: 1. Store arbitrary attributes on flask.g. - #: 2. Add a property for lazy per-request database connectors. - #: 3. Return None instead of AttributeError on unexpected attributes. - #: 4. Raise exception if an unexpected attr is set, a "controlled" flask.g. - #: - #: In Flask 0.9 this property was called `request_globals_class` but it - #: was changed in 0.10 to :attr:`app_ctx_globals_class` because the - #: flask.g object is now application context scoped. - #: - #: .. versionadded:: 0.10 - app_ctx_globals_class = _AppCtxGlobals - - #: The class that is used for the ``config`` attribute of this app. - #: Defaults to :class:`~flask.Config`. - #: - #: Example use cases for a custom class: - #: - #: 1. Default values for certain config options. - #: 2. Access to config values through attributes in addition to keys. - #: - #: .. versionadded:: 0.11 - config_class = Config - - #: The testing flag. Set this to ``True`` to enable the test mode of - #: Flask extensions (and in the future probably also Flask itself). - #: For example this might activate test helpers that have an - #: additional runtime cost which should not be enabled by default. - #: - #: If this is enabled and PROPAGATE_EXCEPTIONS is not changed from the - #: default it's implicitly enabled. - #: - #: This attribute can also be configured from the config with the - #: ``TESTING`` configuration key. Defaults to ``False``. - testing = ConfigAttribute[bool]("TESTING") - - #: If a secret key is set, cryptographic components can use this to - #: sign cookies and other things. Set this to a complex random value - #: when you want to use the secure cookie for instance. - #: - #: This attribute can also be configured from the config with the - #: :data:`SECRET_KEY` configuration key. Defaults to ``None``. - secret_key = ConfigAttribute[t.Union[str, bytes, None]]("SECRET_KEY") - - #: A :class:`~datetime.timedelta` which is used to set the expiration - #: date of a permanent session. The default is 31 days which makes a - #: permanent session survive for roughly one month. - #: - #: This attribute can also be configured from the config with the - #: ``PERMANENT_SESSION_LIFETIME`` configuration key. Defaults to - #: ``timedelta(days=31)`` - permanent_session_lifetime = ConfigAttribute[timedelta]( - "PERMANENT_SESSION_LIFETIME", - get_converter=_make_timedelta, # type: ignore[arg-type] - ) - - json_provider_class: type[JSONProvider] = DefaultJSONProvider - """A subclass of :class:`~flask.json.provider.JSONProvider`. An - instance is created and assigned to :attr:`app.json` when creating - the app. - - The default, :class:`~flask.json.provider.DefaultJSONProvider`, uses - Python's built-in :mod:`json` library. A different provider can use - a different JSON library. - - .. versionadded:: 2.2 - """ - - #: Options that are passed to the Jinja environment in - #: :meth:`create_jinja_environment`. Changing these options after - #: the environment is created (accessing :attr:`jinja_env`) will - #: have no effect. - #: - #: .. versionchanged:: 1.1.0 - #: This is a ``dict`` instead of an ``ImmutableDict`` to allow - #: easier configuration. - #: - jinja_options: dict[str, t.Any] = {} - - #: The rule object to use for URL rules created. This is used by - #: :meth:`add_url_rule`. Defaults to :class:`werkzeug.routing.Rule`. - #: - #: .. versionadded:: 0.7 - url_rule_class = Rule - - #: The map object to use for storing the URL rules and routing - #: configuration parameters. Defaults to :class:`werkzeug.routing.Map`. - #: - #: .. versionadded:: 1.1.0 - url_map_class = Map - - #: The :meth:`test_client` method creates an instance of this test - #: client class. Defaults to :class:`~flask.testing.FlaskClient`. - #: - #: .. versionadded:: 0.7 - test_client_class: type[FlaskClient] | None = None - - #: The :class:`~click.testing.CliRunner` subclass, by default - #: :class:`~flask.testing.FlaskCliRunner` that is used by - #: :meth:`test_cli_runner`. Its ``__init__`` method should take a - #: Flask app object as the first argument. - #: - #: .. versionadded:: 1.0 - test_cli_runner_class: type[FlaskCliRunner] | None = None - - default_config: dict[str, t.Any] - response_class: type[Response] - - def __init__( - self, - import_name: str, - static_url_path: str | None = None, - static_folder: str | os.PathLike[str] | None = "static", - static_host: str | None = None, - host_matching: bool = False, - subdomain_matching: bool = False, - template_folder: str | os.PathLike[str] | None = "templates", - instance_path: str | None = None, - instance_relative_config: bool = False, - root_path: str | None = None, - ) -> None: - super().__init__( - import_name=import_name, - static_folder=static_folder, - static_url_path=static_url_path, - template_folder=template_folder, - root_path=root_path, - ) - - if instance_path is None: - instance_path = self.auto_find_instance_path() - elif not os.path.isabs(instance_path): - raise ValueError( - "If an instance path is provided it must be absolute." - " A relative path was given instead." - ) - - #: Holds the path to the instance folder. - #: - #: .. versionadded:: 0.8 - self.instance_path = instance_path - - #: The configuration dictionary as :class:`Config`. This behaves - #: exactly like a regular dictionary but supports additional methods - #: to load a config from files. - self.config = self.make_config(instance_relative_config) - - #: An instance of :attr:`aborter_class` created by - #: :meth:`make_aborter`. This is called by :func:`flask.abort` - #: to raise HTTP errors, and can be called directly as well. - #: - #: .. versionadded:: 2.2 - #: Moved from ``flask.abort``, which calls this object. - self.aborter = self.make_aborter() - - self.json: JSONProvider = self.json_provider_class(self) - """Provides access to JSON methods. Functions in ``flask.json`` - will call methods on this provider when the application context - is active. Used for handling JSON requests and responses. - - An instance of :attr:`json_provider_class`. Can be customized by - changing that attribute on a subclass, or by assigning to this - attribute afterwards. - - The default, :class:`~flask.json.provider.DefaultJSONProvider`, - uses Python's built-in :mod:`json` library. A different provider - can use a different JSON library. - - .. versionadded:: 2.2 - """ - - #: A list of functions that are called by - #: :meth:`handle_url_build_error` when :meth:`.url_for` raises a - #: :exc:`~werkzeug.routing.BuildError`. Each function is called - #: with ``error``, ``endpoint`` and ``values``. If a function - #: returns ``None`` or raises a ``BuildError``, it is skipped. - #: Otherwise, its return value is returned by ``url_for``. - #: - #: .. versionadded:: 0.9 - self.url_build_error_handlers: list[ - t.Callable[[Exception, str, dict[str, t.Any]], str] - ] = [] - - #: A list of functions that are called when the application context - #: is destroyed. Since the application context is also torn down - #: if the request ends this is the place to store code that disconnects - #: from databases. - #: - #: .. versionadded:: 0.9 - self.teardown_appcontext_funcs: list[ft.TeardownCallable] = [] - - #: A list of shell context processor functions that should be run - #: when a shell context is created. - #: - #: .. versionadded:: 0.11 - self.shell_context_processors: list[ft.ShellContextProcessorCallable] = [] - - #: Maps registered blueprint names to blueprint objects. The - #: dict retains the order the blueprints were registered in. - #: Blueprints can be registered multiple times, this dict does - #: not track how often they were attached. - #: - #: .. versionadded:: 0.7 - self.blueprints: dict[str, Blueprint] = {} - - #: a place where extensions can store application specific state. For - #: example this is where an extension could store database engines and - #: similar things. - #: - #: The key must match the name of the extension module. For example in - #: case of a "Flask-Foo" extension in `flask_foo`, the key would be - #: ``'foo'``. - #: - #: .. versionadded:: 0.7 - self.extensions: dict[str, t.Any] = {} - - #: The :class:`~werkzeug.routing.Map` for this instance. You can use - #: this to change the routing converters after the class was created - #: but before any routes are connected. Example:: - #: - #: from werkzeug.routing import BaseConverter - #: - #: class ListConverter(BaseConverter): - #: def to_python(self, value): - #: return value.split(',') - #: def to_url(self, values): - #: return ','.join(super(ListConverter, self).to_url(value) - #: for value in values) - #: - #: app = Flask(__name__) - #: app.url_map.converters['list'] = ListConverter - self.url_map = self.url_map_class(host_matching=host_matching) - - self.subdomain_matching = subdomain_matching - - # tracks internally if the application already handled at least one - # request. - self._got_first_request = False - - def _check_setup_finished(self, f_name: str) -> None: - if self._got_first_request: - raise AssertionError( - f"The setup method '{f_name}' can no longer be called" - " on the application. It has already handled its first" - " request, any changes will not be applied" - " consistently.\n" - "Make sure all imports, decorators, functions, etc." - " needed to set up the application are done before" - " running it." - ) - - @cached_property - def name(self) -> str: - """The name of the application. This is usually the import name - with the difference that it's guessed from the run file if the - import name is main. This name is used as a display name when - Flask needs the name of the application. It can be set and overridden - to change the value. - - .. versionadded:: 0.8 - """ - if self.import_name == "__main__": - fn: str | None = getattr(sys.modules["__main__"], "__file__", None) - if fn is None: - return "__main__" - return os.path.splitext(os.path.basename(fn))[0] - return self.import_name - - @cached_property - def logger(self) -> logging.Logger: - """A standard Python :class:`~logging.Logger` for the app, with - the same name as :attr:`name`. - - In debug mode, the logger's :attr:`~logging.Logger.level` will - be set to :data:`~logging.DEBUG`. - - If there are no handlers configured, a default handler will be - added. See :doc:`/logging` for more information. - - .. versionchanged:: 1.1.0 - The logger takes the same name as :attr:`name` rather than - hard-coding ``"flask.app"``. - - .. versionchanged:: 1.0.0 - Behavior was simplified. The logger is always named - ``"flask.app"``. The level is only set during configuration, - it doesn't check ``app.debug`` each time. Only one format is - used, not different ones depending on ``app.debug``. No - handlers are removed, and a handler is only added if no - handlers are already configured. - - .. versionadded:: 0.3 - """ - return create_logger(self) - - @cached_property - def jinja_env(self) -> Environment: - """The Jinja environment used to load templates. - - The environment is created the first time this property is - accessed. Changing :attr:`jinja_options` after that will have no - effect. - """ - return self.create_jinja_environment() - - def create_jinja_environment(self) -> Environment: - raise NotImplementedError() - - def make_config(self, instance_relative: bool = False) -> Config: - """Used to create the config attribute by the Flask constructor. - The `instance_relative` parameter is passed in from the constructor - of Flask (there named `instance_relative_config`) and indicates if - the config should be relative to the instance path or the root path - of the application. - - .. versionadded:: 0.8 - """ - root_path = self.root_path - if instance_relative: - root_path = self.instance_path - defaults = dict(self.default_config) - defaults["DEBUG"] = get_debug_flag() - return self.config_class(root_path, defaults) - - def make_aborter(self) -> Aborter: - """Create the object to assign to :attr:`aborter`. That object - is called by :func:`flask.abort` to raise HTTP errors, and can - be called directly as well. - - By default, this creates an instance of :attr:`aborter_class`, - which defaults to :class:`werkzeug.exceptions.Aborter`. - - .. versionadded:: 2.2 - """ - return self.aborter_class() - - def auto_find_instance_path(self) -> str: - """Tries to locate the instance path if it was not provided to the - constructor of the application class. It will basically calculate - the path to a folder named ``instance`` next to your main file or - the package. - - .. versionadded:: 0.8 - """ - prefix, package_path = find_package(self.import_name) - if prefix is None: - return os.path.join(package_path, "instance") - return os.path.join(prefix, "var", f"{self.name}-instance") - - def create_global_jinja_loader(self) -> DispatchingJinjaLoader: - """Creates the loader for the Jinja environment. Can be used to - override just the loader and keeping the rest unchanged. It's - discouraged to override this function. Instead one should override - the :meth:`jinja_loader` function instead. - - The global loader dispatches between the loaders of the application - and the individual blueprints. - - .. versionadded:: 0.7 - """ - return DispatchingJinjaLoader(self) - - def select_jinja_autoescape(self, filename: str) -> bool: - """Returns ``True`` if autoescaping should be active for the given - template name. If no template name is given, returns `True`. - - .. versionchanged:: 2.2 - Autoescaping is now enabled by default for ``.svg`` files. - - .. versionadded:: 0.5 - """ - if filename is None: - return True - return filename.endswith((".html", ".htm", ".xml", ".xhtml", ".svg")) - - @property - def debug(self) -> bool: - """Whether debug mode is enabled. When using ``flask run`` to start the - development server, an interactive debugger will be shown for unhandled - exceptions, and the server will be reloaded when code changes. This maps to the - :data:`DEBUG` config key. It may not behave as expected if set late. - - **Do not enable debug mode when deploying in production.** - - Default: ``False`` - """ - return self.config["DEBUG"] # type: ignore[no-any-return] - - @debug.setter - def debug(self, value: bool) -> None: - self.config["DEBUG"] = value - - if self.config["TEMPLATES_AUTO_RELOAD"] is None: - self.jinja_env.auto_reload = value - - @setupmethod - def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: - """Register a :class:`~flask.Blueprint` on the application. Keyword - arguments passed to this method will override the defaults set on the - blueprint. - - Calls the blueprint's :meth:`~flask.Blueprint.register` method after - recording the blueprint in the application's :attr:`blueprints`. - - :param blueprint: The blueprint to register. - :param url_prefix: Blueprint routes will be prefixed with this. - :param subdomain: Blueprint routes will match on this subdomain. - :param url_defaults: Blueprint routes will use these default values for - view arguments. - :param options: Additional keyword arguments are passed to - :class:`~flask.blueprints.BlueprintSetupState`. They can be - accessed in :meth:`~flask.Blueprint.record` callbacks. - - .. versionchanged:: 2.0.1 - The ``name`` option can be used to change the (pre-dotted) - name the blueprint is registered with. This allows the same - blueprint to be registered multiple times with unique names - for ``url_for``. - - .. versionadded:: 0.7 - """ - blueprint.register(self, options) - - def iter_blueprints(self) -> t.ValuesView[Blueprint]: - """Iterates over all blueprints by the order they were registered. - - .. versionadded:: 0.11 - """ - return self.blueprints.values() - - @setupmethod - def add_url_rule( - self, - rule: str, - endpoint: str | None = None, - view_func: ft.RouteCallable | None = None, - provide_automatic_options: bool | None = None, - **options: t.Any, - ) -> None: - if endpoint is None: - endpoint = _endpoint_from_view_func(view_func) # type: ignore - options["endpoint"] = endpoint - methods = options.pop("methods", None) - - # if the methods are not given and the view_func object knows its - # methods we can use that instead. If neither exists, we go with - # a tuple of only ``GET`` as default. - if methods is None: - methods = getattr(view_func, "methods", None) or ("GET",) - if isinstance(methods, str): - raise TypeError( - "Allowed methods must be a list of strings, for" - ' example: @app.route(..., methods=["POST"])' - ) - methods = {item.upper() for item in methods} - - # Methods that should always be added - required_methods: set[str] = set(getattr(view_func, "required_methods", ())) - - # starting with Flask 0.8 the view_func object can disable and - # force-enable the automatic options handling. - if provide_automatic_options is None: - provide_automatic_options = getattr( - view_func, "provide_automatic_options", None - ) - - if provide_automatic_options is None: - if "OPTIONS" not in methods and self.config["PROVIDE_AUTOMATIC_OPTIONS"]: - provide_automatic_options = True - required_methods.add("OPTIONS") - else: - provide_automatic_options = False - - # Add the required methods now. - methods |= required_methods - - rule_obj = self.url_rule_class(rule, methods=methods, **options) - rule_obj.provide_automatic_options = provide_automatic_options # type: ignore[attr-defined] - - self.url_map.add(rule_obj) - if view_func is not None: - old_func = self.view_functions.get(endpoint) - if old_func is not None and old_func != view_func: - raise AssertionError( - "View function mapping is overwriting an existing" - f" endpoint function: {endpoint}" - ) - self.view_functions[endpoint] = view_func - - @setupmethod - def template_filter( - self, name: str | None = None - ) -> t.Callable[[T_template_filter], T_template_filter]: - """A decorator that is used to register custom template filter. - You can specify a name for the filter, otherwise the function - name will be used. Example:: - - @app.template_filter() - def reverse(s): - return s[::-1] - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - - def decorator(f: T_template_filter) -> T_template_filter: - self.add_template_filter(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_filter( - self, f: ft.TemplateFilterCallable, name: str | None = None - ) -> None: - """Register a custom template filter. Works exactly like the - :meth:`template_filter` decorator. - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - self.jinja_env.filters[name or f.__name__] = f - - @setupmethod - def template_test( - self, name: str | None = None - ) -> t.Callable[[T_template_test], T_template_test]: - """A decorator that is used to register custom template test. - You can specify a name for the test, otherwise the function - name will be used. Example:: - - @app.template_test() - def is_prime(n): - if n == 2: - return True - for i in range(2, int(math.ceil(math.sqrt(n))) + 1): - if n % i == 0: - return False - return True - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - - def decorator(f: T_template_test) -> T_template_test: - self.add_template_test(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_test( - self, f: ft.TemplateTestCallable, name: str | None = None - ) -> None: - """Register a custom template test. Works exactly like the - :meth:`template_test` decorator. - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - self.jinja_env.tests[name or f.__name__] = f - - @setupmethod - def template_global( - self, name: str | None = None - ) -> t.Callable[[T_template_global], T_template_global]: - """A decorator that is used to register a custom template global function. - You can specify a name for the global function, otherwise the function - name will be used. Example:: - - @app.template_global() - def double(n): - return 2 * n - - .. versionadded:: 0.10 - - :param name: the optional name of the global function, otherwise the - function name will be used. - """ - - def decorator(f: T_template_global) -> T_template_global: - self.add_template_global(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_global( - self, f: ft.TemplateGlobalCallable, name: str | None = None - ) -> None: - """Register a custom template global function. Works exactly like the - :meth:`template_global` decorator. - - .. versionadded:: 0.10 - - :param name: the optional name of the global function, otherwise the - function name will be used. - """ - self.jinja_env.globals[name or f.__name__] = f - - @setupmethod - def teardown_appcontext(self, f: T_teardown) -> T_teardown: - """Registers a function to be called when the application - context is popped. The application context is typically popped - after the request context for each request, at the end of CLI - commands, or after a manually pushed context ends. - - .. code-block:: python - - with app.app_context(): - ... - - When the ``with`` block exits (or ``ctx.pop()`` is called), the - teardown functions are called just before the app context is - made inactive. Since a request context typically also manages an - application context it would also be called when you pop a - request context. - - When a teardown function was called because of an unhandled - exception it will be passed an error object. If an - :meth:`errorhandler` is registered, it will handle the exception - and the teardown will not receive it. - - Teardown functions must avoid raising exceptions. If they - execute code that might fail they must surround that code with a - ``try``/``except`` block and log any errors. - - The return values of teardown functions are ignored. - - .. versionadded:: 0.9 - """ - self.teardown_appcontext_funcs.append(f) - return f - - @setupmethod - def shell_context_processor( - self, f: T_shell_context_processor - ) -> T_shell_context_processor: - """Registers a shell context processor function. - - .. versionadded:: 0.11 - """ - self.shell_context_processors.append(f) - return f - - def _find_error_handler( - self, e: Exception, blueprints: list[str] - ) -> ft.ErrorHandlerCallable | None: - """Return a registered error handler for an exception in this order: - blueprint handler for a specific code, app handler for a specific code, - blueprint handler for an exception class, app handler for an exception - class, or ``None`` if a suitable handler is not found. - """ - exc_class, code = self._get_exc_class_and_code(type(e)) - names = (*blueprints, None) - - for c in (code, None) if code is not None else (None,): - for name in names: - handler_map = self.error_handler_spec[name][c] - - if not handler_map: - continue - - for cls in exc_class.__mro__: - handler = handler_map.get(cls) - - if handler is not None: - return handler - return None - - def trap_http_exception(self, e: Exception) -> bool: - """Checks if an HTTP exception should be trapped or not. By default - this will return ``False`` for all exceptions except for a bad request - key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to ``True``. It - also returns ``True`` if ``TRAP_HTTP_EXCEPTIONS`` is set to ``True``. - - This is called for all HTTP exceptions raised by a view function. - If it returns ``True`` for any exception the error handler for this - exception is not called and it shows up as regular exception in the - traceback. This is helpful for debugging implicitly raised HTTP - exceptions. - - .. versionchanged:: 1.0 - Bad request errors are not trapped by default in debug mode. - - .. versionadded:: 0.8 - """ - if self.config["TRAP_HTTP_EXCEPTIONS"]: - return True - - trap_bad_request = self.config["TRAP_BAD_REQUEST_ERRORS"] - - # if unset, trap key errors in debug mode - if ( - trap_bad_request is None - and self.debug - and isinstance(e, BadRequestKeyError) - ): - return True - - if trap_bad_request: - return isinstance(e, BadRequest) - - return False - - def should_ignore_error(self, error: BaseException | None) -> bool: - """This is called to figure out if an error should be ignored - or not as far as the teardown system is concerned. If this - function returns ``True`` then the teardown handlers will not be - passed the error. - - .. versionadded:: 0.10 - """ - return False - - def redirect(self, location: str, code: int = 302) -> BaseResponse: - """Create a redirect response object. - - This is called by :func:`flask.redirect`, and can be called - directly as well. - - :param location: The URL to redirect to. - :param code: The status code for the redirect. - - .. versionadded:: 2.2 - Moved from ``flask.redirect``, which calls this method. - """ - return _wz_redirect( - location, - code=code, - Response=self.response_class, # type: ignore[arg-type] - ) - - def inject_url_defaults(self, endpoint: str, values: dict[str, t.Any]) -> None: - """Injects the URL defaults for the given endpoint directly into - the values dictionary passed. This is used internally and - automatically called on URL building. - - .. versionadded:: 0.7 - """ - names: t.Iterable[str | None] = (None,) - - # url_for may be called outside a request context, parse the - # passed endpoint instead of using request.blueprints. - if "." in endpoint: - names = chain( - names, reversed(_split_blueprint_path(endpoint.rpartition(".")[0])) - ) - - for name in names: - if name in self.url_default_functions: - for func in self.url_default_functions[name]: - func(endpoint, values) - - def handle_url_build_error( - self, error: BuildError, endpoint: str, values: dict[str, t.Any] - ) -> str: - """Called by :meth:`.url_for` if a - :exc:`~werkzeug.routing.BuildError` was raised. If this returns - a value, it will be returned by ``url_for``, otherwise the error - will be re-raised. - - Each function in :attr:`url_build_error_handlers` is called with - ``error``, ``endpoint`` and ``values``. If a function returns - ``None`` or raises a ``BuildError``, it is skipped. Otherwise, - its return value is returned by ``url_for``. - - :param error: The active ``BuildError`` being handled. - :param endpoint: The endpoint being built. - :param values: The keyword arguments passed to ``url_for``. - """ - for handler in self.url_build_error_handlers: - try: - rv = handler(error, endpoint, values) - except BuildError as e: - # make error available outside except block - error = e - else: - if rv is not None: - return rv - - # Re-raise if called with an active exception, otherwise raise - # the passed in exception. - if error is sys.exc_info()[1]: - raise - - raise error diff --git a/venv/lib/python3.12/site-packages/flask/sansio/blueprints.py b/venv/lib/python3.12/site-packages/flask/sansio/blueprints.py deleted file mode 100644 index 4f912cca..00000000 --- a/venv/lib/python3.12/site-packages/flask/sansio/blueprints.py +++ /dev/null @@ -1,632 +0,0 @@ -from __future__ import annotations - -import os -import typing as t -from collections import defaultdict -from functools import update_wrapper - -from .. import typing as ft -from .scaffold import _endpoint_from_view_func -from .scaffold import _sentinel -from .scaffold import Scaffold -from .scaffold import setupmethod - -if t.TYPE_CHECKING: # pragma: no cover - from .app import App - -DeferredSetupFunction = t.Callable[["BlueprintSetupState"], None] -T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable[t.Any]) -T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) -T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) -T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) -T_template_context_processor = t.TypeVar( - "T_template_context_processor", bound=ft.TemplateContextProcessorCallable -) -T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) -T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) -T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) -T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) -T_url_value_preprocessor = t.TypeVar( - "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable -) - - -class BlueprintSetupState: - """Temporary holder object for registering a blueprint with the - application. An instance of this class is created by the - :meth:`~flask.Blueprint.make_setup_state` method and later passed - to all register callback functions. - """ - - def __init__( - self, - blueprint: Blueprint, - app: App, - options: t.Any, - first_registration: bool, - ) -> None: - #: a reference to the current application - self.app = app - - #: a reference to the blueprint that created this setup state. - self.blueprint = blueprint - - #: a dictionary with all options that were passed to the - #: :meth:`~flask.Flask.register_blueprint` method. - self.options = options - - #: as blueprints can be registered multiple times with the - #: application and not everything wants to be registered - #: multiple times on it, this attribute can be used to figure - #: out if the blueprint was registered in the past already. - self.first_registration = first_registration - - subdomain = self.options.get("subdomain") - if subdomain is None: - subdomain = self.blueprint.subdomain - - #: The subdomain that the blueprint should be active for, ``None`` - #: otherwise. - self.subdomain = subdomain - - url_prefix = self.options.get("url_prefix") - if url_prefix is None: - url_prefix = self.blueprint.url_prefix - #: The prefix that should be used for all URLs defined on the - #: blueprint. - self.url_prefix = url_prefix - - self.name = self.options.get("name", blueprint.name) - self.name_prefix = self.options.get("name_prefix", "") - - #: A dictionary with URL defaults that is added to each and every - #: URL that was defined with the blueprint. - self.url_defaults = dict(self.blueprint.url_values_defaults) - self.url_defaults.update(self.options.get("url_defaults", ())) - - def add_url_rule( - self, - rule: str, - endpoint: str | None = None, - view_func: ft.RouteCallable | None = None, - **options: t.Any, - ) -> None: - """A helper method to register a rule (and optionally a view function) - to the application. The endpoint is automatically prefixed with the - blueprint's name. - """ - if self.url_prefix is not None: - if rule: - rule = "/".join((self.url_prefix.rstrip("/"), rule.lstrip("/"))) - else: - rule = self.url_prefix - options.setdefault("subdomain", self.subdomain) - if endpoint is None: - endpoint = _endpoint_from_view_func(view_func) # type: ignore - defaults = self.url_defaults - if "defaults" in options: - defaults = dict(defaults, **options.pop("defaults")) - - self.app.add_url_rule( - rule, - f"{self.name_prefix}.{self.name}.{endpoint}".lstrip("."), - view_func, - defaults=defaults, - **options, - ) - - -class Blueprint(Scaffold): - """Represents a blueprint, a collection of routes and other - app-related functions that can be registered on a real application - later. - - A blueprint is an object that allows defining application functions - without requiring an application object ahead of time. It uses the - same decorators as :class:`~flask.Flask`, but defers the need for an - application by recording them for later registration. - - Decorating a function with a blueprint creates a deferred function - that is called with :class:`~flask.blueprints.BlueprintSetupState` - when the blueprint is registered on an application. - - See :doc:`/blueprints` for more information. - - :param name: The name of the blueprint. Will be prepended to each - endpoint name. - :param import_name: The name of the blueprint package, usually - ``__name__``. This helps locate the ``root_path`` for the - blueprint. - :param static_folder: A folder with static files that should be - served by the blueprint's static route. The path is relative to - the blueprint's root path. Blueprint static files are disabled - by default. - :param static_url_path: The url to serve static files from. - Defaults to ``static_folder``. If the blueprint does not have - a ``url_prefix``, the app's static route will take precedence, - and the blueprint's static files won't be accessible. - :param template_folder: A folder with templates that should be added - to the app's template search path. The path is relative to the - blueprint's root path. Blueprint templates are disabled by - default. Blueprint templates have a lower precedence than those - in the app's templates folder. - :param url_prefix: A path to prepend to all of the blueprint's URLs, - to make them distinct from the rest of the app's routes. - :param subdomain: A subdomain that blueprint routes will match on by - default. - :param url_defaults: A dict of default values that blueprint routes - will receive by default. - :param root_path: By default, the blueprint will automatically set - this based on ``import_name``. In certain situations this - automatic detection can fail, so the path can be specified - manually instead. - - .. versionchanged:: 1.1.0 - Blueprints have a ``cli`` group to register nested CLI commands. - The ``cli_group`` parameter controls the name of the group under - the ``flask`` command. - - .. versionadded:: 0.7 - """ - - _got_registered_once = False - - def __init__( - self, - name: str, - import_name: str, - static_folder: str | os.PathLike[str] | None = None, - static_url_path: str | None = None, - template_folder: str | os.PathLike[str] | None = None, - url_prefix: str | None = None, - subdomain: str | None = None, - url_defaults: dict[str, t.Any] | None = None, - root_path: str | None = None, - cli_group: str | None = _sentinel, # type: ignore[assignment] - ): - super().__init__( - import_name=import_name, - static_folder=static_folder, - static_url_path=static_url_path, - template_folder=template_folder, - root_path=root_path, - ) - - if not name: - raise ValueError("'name' may not be empty.") - - if "." in name: - raise ValueError("'name' may not contain a dot '.' character.") - - self.name = name - self.url_prefix = url_prefix - self.subdomain = subdomain - self.deferred_functions: list[DeferredSetupFunction] = [] - - if url_defaults is None: - url_defaults = {} - - self.url_values_defaults = url_defaults - self.cli_group = cli_group - self._blueprints: list[tuple[Blueprint, dict[str, t.Any]]] = [] - - def _check_setup_finished(self, f_name: str) -> None: - if self._got_registered_once: - raise AssertionError( - f"The setup method '{f_name}' can no longer be called on the blueprint" - f" '{self.name}'. It has already been registered at least once, any" - " changes will not be applied consistently.\n" - "Make sure all imports, decorators, functions, etc. needed to set up" - " the blueprint are done before registering it." - ) - - @setupmethod - def record(self, func: DeferredSetupFunction) -> None: - """Registers a function that is called when the blueprint is - registered on the application. This function is called with the - state as argument as returned by the :meth:`make_setup_state` - method. - """ - self.deferred_functions.append(func) - - @setupmethod - def record_once(self, func: DeferredSetupFunction) -> None: - """Works like :meth:`record` but wraps the function in another - function that will ensure the function is only called once. If the - blueprint is registered a second time on the application, the - function passed is not called. - """ - - def wrapper(state: BlueprintSetupState) -> None: - if state.first_registration: - func(state) - - self.record(update_wrapper(wrapper, func)) - - def make_setup_state( - self, app: App, options: dict[str, t.Any], first_registration: bool = False - ) -> BlueprintSetupState: - """Creates an instance of :meth:`~flask.blueprints.BlueprintSetupState` - object that is later passed to the register callback functions. - Subclasses can override this to return a subclass of the setup state. - """ - return BlueprintSetupState(self, app, options, first_registration) - - @setupmethod - def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: - """Register a :class:`~flask.Blueprint` on this blueprint. Keyword - arguments passed to this method will override the defaults set - on the blueprint. - - .. versionchanged:: 2.0.1 - The ``name`` option can be used to change the (pre-dotted) - name the blueprint is registered with. This allows the same - blueprint to be registered multiple times with unique names - for ``url_for``. - - .. versionadded:: 2.0 - """ - if blueprint is self: - raise ValueError("Cannot register a blueprint on itself") - self._blueprints.append((blueprint, options)) - - def register(self, app: App, options: dict[str, t.Any]) -> None: - """Called by :meth:`Flask.register_blueprint` to register all - views and callbacks registered on the blueprint with the - application. Creates a :class:`.BlueprintSetupState` and calls - each :meth:`record` callback with it. - - :param app: The application this blueprint is being registered - with. - :param options: Keyword arguments forwarded from - :meth:`~Flask.register_blueprint`. - - .. versionchanged:: 2.3 - Nested blueprints now correctly apply subdomains. - - .. versionchanged:: 2.1 - Registering the same blueprint with the same name multiple - times is an error. - - .. versionchanged:: 2.0.1 - Nested blueprints are registered with their dotted name. - This allows different blueprints with the same name to be - nested at different locations. - - .. versionchanged:: 2.0.1 - The ``name`` option can be used to change the (pre-dotted) - name the blueprint is registered with. This allows the same - blueprint to be registered multiple times with unique names - for ``url_for``. - """ - name_prefix = options.get("name_prefix", "") - self_name = options.get("name", self.name) - name = f"{name_prefix}.{self_name}".lstrip(".") - - if name in app.blueprints: - bp_desc = "this" if app.blueprints[name] is self else "a different" - existing_at = f" '{name}'" if self_name != name else "" - - raise ValueError( - f"The name '{self_name}' is already registered for" - f" {bp_desc} blueprint{existing_at}. Use 'name=' to" - f" provide a unique name." - ) - - first_bp_registration = not any(bp is self for bp in app.blueprints.values()) - first_name_registration = name not in app.blueprints - - app.blueprints[name] = self - self._got_registered_once = True - state = self.make_setup_state(app, options, first_bp_registration) - - if self.has_static_folder: - state.add_url_rule( - f"{self.static_url_path}/", - view_func=self.send_static_file, # type: ignore[attr-defined] - endpoint="static", - ) - - # Merge blueprint data into parent. - if first_bp_registration or first_name_registration: - self._merge_blueprint_funcs(app, name) - - for deferred in self.deferred_functions: - deferred(state) - - cli_resolved_group = options.get("cli_group", self.cli_group) - - if self.cli.commands: - if cli_resolved_group is None: - app.cli.commands.update(self.cli.commands) - elif cli_resolved_group is _sentinel: - self.cli.name = name - app.cli.add_command(self.cli) - else: - self.cli.name = cli_resolved_group - app.cli.add_command(self.cli) - - for blueprint, bp_options in self._blueprints: - bp_options = bp_options.copy() - bp_url_prefix = bp_options.get("url_prefix") - bp_subdomain = bp_options.get("subdomain") - - if bp_subdomain is None: - bp_subdomain = blueprint.subdomain - - if state.subdomain is not None and bp_subdomain is not None: - bp_options["subdomain"] = bp_subdomain + "." + state.subdomain - elif bp_subdomain is not None: - bp_options["subdomain"] = bp_subdomain - elif state.subdomain is not None: - bp_options["subdomain"] = state.subdomain - - if bp_url_prefix is None: - bp_url_prefix = blueprint.url_prefix - - if state.url_prefix is not None and bp_url_prefix is not None: - bp_options["url_prefix"] = ( - state.url_prefix.rstrip("/") + "/" + bp_url_prefix.lstrip("/") - ) - elif bp_url_prefix is not None: - bp_options["url_prefix"] = bp_url_prefix - elif state.url_prefix is not None: - bp_options["url_prefix"] = state.url_prefix - - bp_options["name_prefix"] = name - blueprint.register(app, bp_options) - - def _merge_blueprint_funcs(self, app: App, name: str) -> None: - def extend( - bp_dict: dict[ft.AppOrBlueprintKey, list[t.Any]], - parent_dict: dict[ft.AppOrBlueprintKey, list[t.Any]], - ) -> None: - for key, values in bp_dict.items(): - key = name if key is None else f"{name}.{key}" - parent_dict[key].extend(values) - - for key, value in self.error_handler_spec.items(): - key = name if key is None else f"{name}.{key}" - value = defaultdict( - dict, - { - code: {exc_class: func for exc_class, func in code_values.items()} - for code, code_values in value.items() - }, - ) - app.error_handler_spec[key] = value - - for endpoint, func in self.view_functions.items(): - app.view_functions[endpoint] = func - - extend(self.before_request_funcs, app.before_request_funcs) - extend(self.after_request_funcs, app.after_request_funcs) - extend( - self.teardown_request_funcs, - app.teardown_request_funcs, - ) - extend(self.url_default_functions, app.url_default_functions) - extend(self.url_value_preprocessors, app.url_value_preprocessors) - extend(self.template_context_processors, app.template_context_processors) - - @setupmethod - def add_url_rule( - self, - rule: str, - endpoint: str | None = None, - view_func: ft.RouteCallable | None = None, - provide_automatic_options: bool | None = None, - **options: t.Any, - ) -> None: - """Register a URL rule with the blueprint. See :meth:`.Flask.add_url_rule` for - full documentation. - - The URL rule is prefixed with the blueprint's URL prefix. The endpoint name, - used with :func:`url_for`, is prefixed with the blueprint's name. - """ - if endpoint and "." in endpoint: - raise ValueError("'endpoint' may not contain a dot '.' character.") - - if view_func and hasattr(view_func, "__name__") and "." in view_func.__name__: - raise ValueError("'view_func' name may not contain a dot '.' character.") - - self.record( - lambda s: s.add_url_rule( - rule, - endpoint, - view_func, - provide_automatic_options=provide_automatic_options, - **options, - ) - ) - - @setupmethod - def app_template_filter( - self, name: str | None = None - ) -> t.Callable[[T_template_filter], T_template_filter]: - """Register a template filter, available in any template rendered by the - application. Equivalent to :meth:`.Flask.template_filter`. - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - - def decorator(f: T_template_filter) -> T_template_filter: - self.add_app_template_filter(f, name=name) - return f - - return decorator - - @setupmethod - def add_app_template_filter( - self, f: ft.TemplateFilterCallable, name: str | None = None - ) -> None: - """Register a template filter, available in any template rendered by the - application. Works like the :meth:`app_template_filter` decorator. Equivalent to - :meth:`.Flask.add_template_filter`. - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - - def register_template(state: BlueprintSetupState) -> None: - state.app.jinja_env.filters[name or f.__name__] = f - - self.record_once(register_template) - - @setupmethod - def app_template_test( - self, name: str | None = None - ) -> t.Callable[[T_template_test], T_template_test]: - """Register a template test, available in any template rendered by the - application. Equivalent to :meth:`.Flask.template_test`. - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - - def decorator(f: T_template_test) -> T_template_test: - self.add_app_template_test(f, name=name) - return f - - return decorator - - @setupmethod - def add_app_template_test( - self, f: ft.TemplateTestCallable, name: str | None = None - ) -> None: - """Register a template test, available in any template rendered by the - application. Works like the :meth:`app_template_test` decorator. Equivalent to - :meth:`.Flask.add_template_test`. - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - - def register_template(state: BlueprintSetupState) -> None: - state.app.jinja_env.tests[name or f.__name__] = f - - self.record_once(register_template) - - @setupmethod - def app_template_global( - self, name: str | None = None - ) -> t.Callable[[T_template_global], T_template_global]: - """Register a template global, available in any template rendered by the - application. Equivalent to :meth:`.Flask.template_global`. - - .. versionadded:: 0.10 - - :param name: the optional name of the global, otherwise the - function name will be used. - """ - - def decorator(f: T_template_global) -> T_template_global: - self.add_app_template_global(f, name=name) - return f - - return decorator - - @setupmethod - def add_app_template_global( - self, f: ft.TemplateGlobalCallable, name: str | None = None - ) -> None: - """Register a template global, available in any template rendered by the - application. Works like the :meth:`app_template_global` decorator. Equivalent to - :meth:`.Flask.add_template_global`. - - .. versionadded:: 0.10 - - :param name: the optional name of the global, otherwise the - function name will be used. - """ - - def register_template(state: BlueprintSetupState) -> None: - state.app.jinja_env.globals[name or f.__name__] = f - - self.record_once(register_template) - - @setupmethod - def before_app_request(self, f: T_before_request) -> T_before_request: - """Like :meth:`before_request`, but before every request, not only those handled - by the blueprint. Equivalent to :meth:`.Flask.before_request`. - """ - self.record_once( - lambda s: s.app.before_request_funcs.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def after_app_request(self, f: T_after_request) -> T_after_request: - """Like :meth:`after_request`, but after every request, not only those handled - by the blueprint. Equivalent to :meth:`.Flask.after_request`. - """ - self.record_once( - lambda s: s.app.after_request_funcs.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def teardown_app_request(self, f: T_teardown) -> T_teardown: - """Like :meth:`teardown_request`, but after every request, not only those - handled by the blueprint. Equivalent to :meth:`.Flask.teardown_request`. - """ - self.record_once( - lambda s: s.app.teardown_request_funcs.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def app_context_processor( - self, f: T_template_context_processor - ) -> T_template_context_processor: - """Like :meth:`context_processor`, but for templates rendered by every view, not - only by the blueprint. Equivalent to :meth:`.Flask.context_processor`. - """ - self.record_once( - lambda s: s.app.template_context_processors.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def app_errorhandler( - self, code: type[Exception] | int - ) -> t.Callable[[T_error_handler], T_error_handler]: - """Like :meth:`errorhandler`, but for every request, not only those handled by - the blueprint. Equivalent to :meth:`.Flask.errorhandler`. - """ - - def decorator(f: T_error_handler) -> T_error_handler: - def from_blueprint(state: BlueprintSetupState) -> None: - state.app.errorhandler(code)(f) - - self.record_once(from_blueprint) - return f - - return decorator - - @setupmethod - def app_url_value_preprocessor( - self, f: T_url_value_preprocessor - ) -> T_url_value_preprocessor: - """Like :meth:`url_value_preprocessor`, but for every request, not only those - handled by the blueprint. Equivalent to :meth:`.Flask.url_value_preprocessor`. - """ - self.record_once( - lambda s: s.app.url_value_preprocessors.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def app_url_defaults(self, f: T_url_defaults) -> T_url_defaults: - """Like :meth:`url_defaults`, but for every request, not only those handled by - the blueprint. Equivalent to :meth:`.Flask.url_defaults`. - """ - self.record_once( - lambda s: s.app.url_default_functions.setdefault(None, []).append(f) - ) - return f diff --git a/venv/lib/python3.12/site-packages/flask/sansio/scaffold.py b/venv/lib/python3.12/site-packages/flask/sansio/scaffold.py deleted file mode 100644 index 0e96f15b..00000000 --- a/venv/lib/python3.12/site-packages/flask/sansio/scaffold.py +++ /dev/null @@ -1,792 +0,0 @@ -from __future__ import annotations - -import importlib.util -import os -import pathlib -import sys -import typing as t -from collections import defaultdict -from functools import update_wrapper - -from jinja2 import BaseLoader -from jinja2 import FileSystemLoader -from werkzeug.exceptions import default_exceptions -from werkzeug.exceptions import HTTPException -from werkzeug.utils import cached_property - -from .. import typing as ft -from ..helpers import get_root_path -from ..templating import _default_template_ctx_processor - -if t.TYPE_CHECKING: # pragma: no cover - from click import Group - -# a singleton sentinel value for parameter defaults -_sentinel = object() - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) -T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable[t.Any]) -T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) -T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) -T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) -T_template_context_processor = t.TypeVar( - "T_template_context_processor", bound=ft.TemplateContextProcessorCallable -) -T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) -T_url_value_preprocessor = t.TypeVar( - "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable -) -T_route = t.TypeVar("T_route", bound=ft.RouteCallable) - - -def setupmethod(f: F) -> F: - f_name = f.__name__ - - def wrapper_func(self: Scaffold, *args: t.Any, **kwargs: t.Any) -> t.Any: - self._check_setup_finished(f_name) - return f(self, *args, **kwargs) - - return t.cast(F, update_wrapper(wrapper_func, f)) - - -class Scaffold: - """Common behavior shared between :class:`~flask.Flask` and - :class:`~flask.blueprints.Blueprint`. - - :param import_name: The import name of the module where this object - is defined. Usually :attr:`__name__` should be used. - :param static_folder: Path to a folder of static files to serve. - If this is set, a static route will be added. - :param static_url_path: URL prefix for the static route. - :param template_folder: Path to a folder containing template files. - for rendering. If this is set, a Jinja loader will be added. - :param root_path: The path that static, template, and resource files - are relative to. Typically not set, it is discovered based on - the ``import_name``. - - .. versionadded:: 2.0 - """ - - cli: Group - name: str - _static_folder: str | None = None - _static_url_path: str | None = None - - def __init__( - self, - import_name: str, - static_folder: str | os.PathLike[str] | None = None, - static_url_path: str | None = None, - template_folder: str | os.PathLike[str] | None = None, - root_path: str | None = None, - ): - #: The name of the package or module that this object belongs - #: to. Do not change this once it is set by the constructor. - self.import_name = import_name - - self.static_folder = static_folder - self.static_url_path = static_url_path - - #: The path to the templates folder, relative to - #: :attr:`root_path`, to add to the template loader. ``None`` if - #: templates should not be added. - self.template_folder = template_folder - - if root_path is None: - root_path = get_root_path(self.import_name) - - #: Absolute path to the package on the filesystem. Used to look - #: up resources contained in the package. - self.root_path = root_path - - #: A dictionary mapping endpoint names to view functions. - #: - #: To register a view function, use the :meth:`route` decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.view_functions: dict[str, ft.RouteCallable] = {} - - #: A data structure of registered error handlers, in the format - #: ``{scope: {code: {class: handler}}}``. The ``scope`` key is - #: the name of a blueprint the handlers are active for, or - #: ``None`` for all requests. The ``code`` key is the HTTP - #: status code for ``HTTPException``, or ``None`` for - #: other exceptions. The innermost dictionary maps exception - #: classes to handler functions. - #: - #: To register an error handler, use the :meth:`errorhandler` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.error_handler_spec: dict[ - ft.AppOrBlueprintKey, - dict[int | None, dict[type[Exception], ft.ErrorHandlerCallable]], - ] = defaultdict(lambda: defaultdict(dict)) - - #: A data structure of functions to call at the beginning of - #: each request, in the format ``{scope: [functions]}``. The - #: ``scope`` key is the name of a blueprint the functions are - #: active for, or ``None`` for all requests. - #: - #: To register a function, use the :meth:`before_request` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.before_request_funcs: dict[ - ft.AppOrBlueprintKey, list[ft.BeforeRequestCallable] - ] = defaultdict(list) - - #: A data structure of functions to call at the end of each - #: request, in the format ``{scope: [functions]}``. The - #: ``scope`` key is the name of a blueprint the functions are - #: active for, or ``None`` for all requests. - #: - #: To register a function, use the :meth:`after_request` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.after_request_funcs: dict[ - ft.AppOrBlueprintKey, list[ft.AfterRequestCallable[t.Any]] - ] = defaultdict(list) - - #: A data structure of functions to call at the end of each - #: request even if an exception is raised, in the format - #: ``{scope: [functions]}``. The ``scope`` key is the name of a - #: blueprint the functions are active for, or ``None`` for all - #: requests. - #: - #: To register a function, use the :meth:`teardown_request` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.teardown_request_funcs: dict[ - ft.AppOrBlueprintKey, list[ft.TeardownCallable] - ] = defaultdict(list) - - #: A data structure of functions to call to pass extra context - #: values when rendering templates, in the format - #: ``{scope: [functions]}``. The ``scope`` key is the name of a - #: blueprint the functions are active for, or ``None`` for all - #: requests. - #: - #: To register a function, use the :meth:`context_processor` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.template_context_processors: dict[ - ft.AppOrBlueprintKey, list[ft.TemplateContextProcessorCallable] - ] = defaultdict(list, {None: [_default_template_ctx_processor]}) - - #: A data structure of functions to call to modify the keyword - #: arguments passed to the view function, in the format - #: ``{scope: [functions]}``. The ``scope`` key is the name of a - #: blueprint the functions are active for, or ``None`` for all - #: requests. - #: - #: To register a function, use the - #: :meth:`url_value_preprocessor` decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.url_value_preprocessors: dict[ - ft.AppOrBlueprintKey, - list[ft.URLValuePreprocessorCallable], - ] = defaultdict(list) - - #: A data structure of functions to call to modify the keyword - #: arguments when generating URLs, in the format - #: ``{scope: [functions]}``. The ``scope`` key is the name of a - #: blueprint the functions are active for, or ``None`` for all - #: requests. - #: - #: To register a function, use the :meth:`url_defaults` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.url_default_functions: dict[ - ft.AppOrBlueprintKey, list[ft.URLDefaultCallable] - ] = defaultdict(list) - - def __repr__(self) -> str: - return f"<{type(self).__name__} {self.name!r}>" - - def _check_setup_finished(self, f_name: str) -> None: - raise NotImplementedError - - @property - def static_folder(self) -> str | None: - """The absolute path to the configured static folder. ``None`` - if no static folder is set. - """ - if self._static_folder is not None: - return os.path.join(self.root_path, self._static_folder) - else: - return None - - @static_folder.setter - def static_folder(self, value: str | os.PathLike[str] | None) -> None: - if value is not None: - value = os.fspath(value).rstrip(r"\/") - - self._static_folder = value - - @property - def has_static_folder(self) -> bool: - """``True`` if :attr:`static_folder` is set. - - .. versionadded:: 0.5 - """ - return self.static_folder is not None - - @property - def static_url_path(self) -> str | None: - """The URL prefix that the static route will be accessible from. - - If it was not configured during init, it is derived from - :attr:`static_folder`. - """ - if self._static_url_path is not None: - return self._static_url_path - - if self.static_folder is not None: - basename = os.path.basename(self.static_folder) - return f"/{basename}".rstrip("/") - - return None - - @static_url_path.setter - def static_url_path(self, value: str | None) -> None: - if value is not None: - value = value.rstrip("/") - - self._static_url_path = value - - @cached_property - def jinja_loader(self) -> BaseLoader | None: - """The Jinja loader for this object's templates. By default this - is a class :class:`jinja2.loaders.FileSystemLoader` to - :attr:`template_folder` if it is set. - - .. versionadded:: 0.5 - """ - if self.template_folder is not None: - return FileSystemLoader(os.path.join(self.root_path, self.template_folder)) - else: - return None - - def _method_route( - self, - method: str, - rule: str, - options: dict[str, t.Any], - ) -> t.Callable[[T_route], T_route]: - if "methods" in options: - raise TypeError("Use the 'route' decorator to use the 'methods' argument.") - - return self.route(rule, methods=[method], **options) - - @setupmethod - def get(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["GET"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("GET", rule, options) - - @setupmethod - def post(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["POST"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("POST", rule, options) - - @setupmethod - def put(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["PUT"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("PUT", rule, options) - - @setupmethod - def delete(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["DELETE"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("DELETE", rule, options) - - @setupmethod - def patch(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["PATCH"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("PATCH", rule, options) - - @setupmethod - def route(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Decorate a view function to register it with the given URL - rule and options. Calls :meth:`add_url_rule`, which has more - details about the implementation. - - .. code-block:: python - - @app.route("/") - def index(): - return "Hello, World!" - - See :ref:`url-route-registrations`. - - The endpoint name for the route defaults to the name of the view - function if the ``endpoint`` parameter isn't passed. - - The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` and - ``OPTIONS`` are added automatically. - - :param rule: The URL rule string. - :param options: Extra options passed to the - :class:`~werkzeug.routing.Rule` object. - """ - - def decorator(f: T_route) -> T_route: - endpoint = options.pop("endpoint", None) - self.add_url_rule(rule, endpoint, f, **options) - return f - - return decorator - - @setupmethod - def add_url_rule( - self, - rule: str, - endpoint: str | None = None, - view_func: ft.RouteCallable | None = None, - provide_automatic_options: bool | None = None, - **options: t.Any, - ) -> None: - """Register a rule for routing incoming requests and building - URLs. The :meth:`route` decorator is a shortcut to call this - with the ``view_func`` argument. These are equivalent: - - .. code-block:: python - - @app.route("/") - def index(): - ... - - .. code-block:: python - - def index(): - ... - - app.add_url_rule("/", view_func=index) - - See :ref:`url-route-registrations`. - - The endpoint name for the route defaults to the name of the view - function if the ``endpoint`` parameter isn't passed. An error - will be raised if a function has already been registered for the - endpoint. - - The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` is - always added automatically, and ``OPTIONS`` is added - automatically by default. - - ``view_func`` does not necessarily need to be passed, but if the - rule should participate in routing an endpoint name must be - associated with a view function at some point with the - :meth:`endpoint` decorator. - - .. code-block:: python - - app.add_url_rule("/", endpoint="index") - - @app.endpoint("index") - def index(): - ... - - If ``view_func`` has a ``required_methods`` attribute, those - methods are added to the passed and automatic methods. If it - has a ``provide_automatic_methods`` attribute, it is used as the - default if the parameter is not passed. - - :param rule: The URL rule string. - :param endpoint: The endpoint name to associate with the rule - and view function. Used when routing and building URLs. - Defaults to ``view_func.__name__``. - :param view_func: The view function to associate with the - endpoint name. - :param provide_automatic_options: Add the ``OPTIONS`` method and - respond to ``OPTIONS`` requests automatically. - :param options: Extra options passed to the - :class:`~werkzeug.routing.Rule` object. - """ - raise NotImplementedError - - @setupmethod - def endpoint(self, endpoint: str) -> t.Callable[[F], F]: - """Decorate a view function to register it for the given - endpoint. Used if a rule is added without a ``view_func`` with - :meth:`add_url_rule`. - - .. code-block:: python - - app.add_url_rule("/ex", endpoint="example") - - @app.endpoint("example") - def example(): - ... - - :param endpoint: The endpoint name to associate with the view - function. - """ - - def decorator(f: F) -> F: - self.view_functions[endpoint] = f - return f - - return decorator - - @setupmethod - def before_request(self, f: T_before_request) -> T_before_request: - """Register a function to run before each request. - - For example, this can be used to open a database connection, or - to load the logged in user from the session. - - .. code-block:: python - - @app.before_request - def load_user(): - if "user_id" in session: - g.user = db.session.get(session["user_id"]) - - The function will be called without any arguments. If it returns - a non-``None`` value, the value is handled as if it was the - return value from the view, and further request handling is - stopped. - - This is available on both app and blueprint objects. When used on an app, this - executes before every request. When used on a blueprint, this executes before - every request that the blueprint handles. To register with a blueprint and - execute before every request, use :meth:`.Blueprint.before_app_request`. - """ - self.before_request_funcs.setdefault(None, []).append(f) - return f - - @setupmethod - def after_request(self, f: T_after_request) -> T_after_request: - """Register a function to run after each request to this object. - - The function is called with the response object, and must return - a response object. This allows the functions to modify or - replace the response before it is sent. - - If a function raises an exception, any remaining - ``after_request`` functions will not be called. Therefore, this - should not be used for actions that must execute, such as to - close resources. Use :meth:`teardown_request` for that. - - This is available on both app and blueprint objects. When used on an app, this - executes after every request. When used on a blueprint, this executes after - every request that the blueprint handles. To register with a blueprint and - execute after every request, use :meth:`.Blueprint.after_app_request`. - """ - self.after_request_funcs.setdefault(None, []).append(f) - return f - - @setupmethod - def teardown_request(self, f: T_teardown) -> T_teardown: - """Register a function to be called when the request context is - popped. Typically this happens at the end of each request, but - contexts may be pushed manually as well during testing. - - .. code-block:: python - - with app.test_request_context(): - ... - - When the ``with`` block exits (or ``ctx.pop()`` is called), the - teardown functions are called just before the request context is - made inactive. - - When a teardown function was called because of an unhandled - exception it will be passed an error object. If an - :meth:`errorhandler` is registered, it will handle the exception - and the teardown will not receive it. - - Teardown functions must avoid raising exceptions. If they - execute code that might fail they must surround that code with a - ``try``/``except`` block and log any errors. - - The return values of teardown functions are ignored. - - This is available on both app and blueprint objects. When used on an app, this - executes after every request. When used on a blueprint, this executes after - every request that the blueprint handles. To register with a blueprint and - execute after every request, use :meth:`.Blueprint.teardown_app_request`. - """ - self.teardown_request_funcs.setdefault(None, []).append(f) - return f - - @setupmethod - def context_processor( - self, - f: T_template_context_processor, - ) -> T_template_context_processor: - """Registers a template context processor function. These functions run before - rendering a template. The keys of the returned dict are added as variables - available in the template. - - This is available on both app and blueprint objects. When used on an app, this - is called for every rendered template. When used on a blueprint, this is called - for templates rendered from the blueprint's views. To register with a blueprint - and affect every template, use :meth:`.Blueprint.app_context_processor`. - """ - self.template_context_processors[None].append(f) - return f - - @setupmethod - def url_value_preprocessor( - self, - f: T_url_value_preprocessor, - ) -> T_url_value_preprocessor: - """Register a URL value preprocessor function for all view - functions in the application. These functions will be called before the - :meth:`before_request` functions. - - The function can modify the values captured from the matched url before - they are passed to the view. For example, this can be used to pop a - common language code value and place it in ``g`` rather than pass it to - every view. - - The function is passed the endpoint name and values dict. The return - value is ignored. - - This is available on both app and blueprint objects. When used on an app, this - is called for every request. When used on a blueprint, this is called for - requests that the blueprint handles. To register with a blueprint and affect - every request, use :meth:`.Blueprint.app_url_value_preprocessor`. - """ - self.url_value_preprocessors[None].append(f) - return f - - @setupmethod - def url_defaults(self, f: T_url_defaults) -> T_url_defaults: - """Callback function for URL defaults for all view functions of the - application. It's called with the endpoint and values and should - update the values passed in place. - - This is available on both app and blueprint objects. When used on an app, this - is called for every request. When used on a blueprint, this is called for - requests that the blueprint handles. To register with a blueprint and affect - every request, use :meth:`.Blueprint.app_url_defaults`. - """ - self.url_default_functions[None].append(f) - return f - - @setupmethod - def errorhandler( - self, code_or_exception: type[Exception] | int - ) -> t.Callable[[T_error_handler], T_error_handler]: - """Register a function to handle errors by code or exception class. - - A decorator that is used to register a function given an - error code. Example:: - - @app.errorhandler(404) - def page_not_found(error): - return 'This page does not exist', 404 - - You can also register handlers for arbitrary exceptions:: - - @app.errorhandler(DatabaseError) - def special_exception_handler(error): - return 'Database connection failed', 500 - - This is available on both app and blueprint objects. When used on an app, this - can handle errors from every request. When used on a blueprint, this can handle - errors from requests that the blueprint handles. To register with a blueprint - and affect every request, use :meth:`.Blueprint.app_errorhandler`. - - .. versionadded:: 0.7 - Use :meth:`register_error_handler` instead of modifying - :attr:`error_handler_spec` directly, for application wide error - handlers. - - .. versionadded:: 0.7 - One can now additionally also register custom exception types - that do not necessarily have to be a subclass of the - :class:`~werkzeug.exceptions.HTTPException` class. - - :param code_or_exception: the code as integer for the handler, or - an arbitrary exception - """ - - def decorator(f: T_error_handler) -> T_error_handler: - self.register_error_handler(code_or_exception, f) - return f - - return decorator - - @setupmethod - def register_error_handler( - self, - code_or_exception: type[Exception] | int, - f: ft.ErrorHandlerCallable, - ) -> None: - """Alternative error attach function to the :meth:`errorhandler` - decorator that is more straightforward to use for non decorator - usage. - - .. versionadded:: 0.7 - """ - exc_class, code = self._get_exc_class_and_code(code_or_exception) - self.error_handler_spec[None][code][exc_class] = f - - @staticmethod - def _get_exc_class_and_code( - exc_class_or_code: type[Exception] | int, - ) -> tuple[type[Exception], int | None]: - """Get the exception class being handled. For HTTP status codes - or ``HTTPException`` subclasses, return both the exception and - status code. - - :param exc_class_or_code: Any exception class, or an HTTP status - code as an integer. - """ - exc_class: type[Exception] - - if isinstance(exc_class_or_code, int): - try: - exc_class = default_exceptions[exc_class_or_code] - except KeyError: - raise ValueError( - f"'{exc_class_or_code}' is not a recognized HTTP" - " error code. Use a subclass of HTTPException with" - " that code instead." - ) from None - else: - exc_class = exc_class_or_code - - if isinstance(exc_class, Exception): - raise TypeError( - f"{exc_class!r} is an instance, not a class. Handlers" - " can only be registered for Exception classes or HTTP" - " error codes." - ) - - if not issubclass(exc_class, Exception): - raise ValueError( - f"'{exc_class.__name__}' is not a subclass of Exception." - " Handlers can only be registered for Exception classes" - " or HTTP error codes." - ) - - if issubclass(exc_class, HTTPException): - return exc_class, exc_class.code - else: - return exc_class, None - - -def _endpoint_from_view_func(view_func: ft.RouteCallable) -> str: - """Internal helper that returns the default endpoint for a given - function. This always is the function name. - """ - assert view_func is not None, "expected view func if endpoint is not provided." - return view_func.__name__ - - -def _find_package_path(import_name: str) -> str: - """Find the path that contains the package or module.""" - root_mod_name, _, _ = import_name.partition(".") - - try: - root_spec = importlib.util.find_spec(root_mod_name) - - if root_spec is None: - raise ValueError("not found") - except (ImportError, ValueError): - # ImportError: the machinery told us it does not exist - # ValueError: - # - the module name was invalid - # - the module name is __main__ - # - we raised `ValueError` due to `root_spec` being `None` - return os.getcwd() - - if root_spec.submodule_search_locations: - if root_spec.origin is None or root_spec.origin == "namespace": - # namespace package - package_spec = importlib.util.find_spec(import_name) - - if package_spec is not None and package_spec.submodule_search_locations: - # Pick the path in the namespace that contains the submodule. - package_path = pathlib.Path( - os.path.commonpath(package_spec.submodule_search_locations) - ) - search_location = next( - location - for location in root_spec.submodule_search_locations - if package_path.is_relative_to(location) - ) - else: - # Pick the first path. - search_location = root_spec.submodule_search_locations[0] - - return os.path.dirname(search_location) - else: - # package with __init__.py - return os.path.dirname(os.path.dirname(root_spec.origin)) - else: - # module - return os.path.dirname(root_spec.origin) # type: ignore[type-var, return-value] - - -def find_package(import_name: str) -> tuple[str | None, str]: - """Find the prefix that a package is installed under, and the path - that it would be imported from. - - The prefix is the directory containing the standard directory - hierarchy (lib, bin, etc.). If the package is not installed to the - system (:attr:`sys.prefix`) or a virtualenv (``site-packages``), - ``None`` is returned. - - The path is the entry in :attr:`sys.path` that contains the package - for import. If the package is not installed, it's assumed that the - package was imported from the current working directory. - """ - package_path = _find_package_path(import_name) - py_prefix = os.path.abspath(sys.prefix) - - # installed to the system - if pathlib.PurePath(package_path).is_relative_to(py_prefix): - return py_prefix, package_path - - site_parent, site_folder = os.path.split(package_path) - - # installed to a virtualenv - if site_folder.lower() == "site-packages": - parent, folder = os.path.split(site_parent) - - # Windows (prefix/lib/site-packages) - if folder.lower() == "lib": - return parent, package_path - - # Unix (prefix/lib/pythonX.Y/site-packages) - if os.path.basename(parent).lower() == "lib": - return os.path.dirname(parent), package_path - - # something else (prefix/site-packages) - return site_parent, package_path - - # not installed - return None, package_path diff --git a/venv/lib/python3.12/site-packages/flask/sessions.py b/venv/lib/python3.12/site-packages/flask/sessions.py deleted file mode 100644 index 0a357d9e..00000000 --- a/venv/lib/python3.12/site-packages/flask/sessions.py +++ /dev/null @@ -1,399 +0,0 @@ -from __future__ import annotations - -import collections.abc as c -import hashlib -import typing as t -from collections.abc import MutableMapping -from datetime import datetime -from datetime import timezone - -from itsdangerous import BadSignature -from itsdangerous import URLSafeTimedSerializer -from werkzeug.datastructures import CallbackDict - -from .json.tag import TaggedJSONSerializer - -if t.TYPE_CHECKING: # pragma: no cover - import typing_extensions as te - - from .app import Flask - from .wrappers import Request - from .wrappers import Response - - -class SessionMixin(MutableMapping[str, t.Any]): - """Expands a basic dictionary with session attributes.""" - - @property - def permanent(self) -> bool: - """This reflects the ``'_permanent'`` key in the dict.""" - return self.get("_permanent", False) - - @permanent.setter - def permanent(self, value: bool) -> None: - self["_permanent"] = bool(value) - - #: Some implementations can detect whether a session is newly - #: created, but that is not guaranteed. Use with caution. The mixin - # default is hard-coded ``False``. - new = False - - #: Some implementations can detect changes to the session and set - #: this when that happens. The mixin default is hard coded to - #: ``True``. - modified = True - - #: Some implementations can detect when session data is read or - #: written and set this when that happens. The mixin default is hard - #: coded to ``True``. - accessed = True - - -class SecureCookieSession(CallbackDict[str, t.Any], SessionMixin): - """Base class for sessions based on signed cookies. - - This session backend will set the :attr:`modified` and - :attr:`accessed` attributes. It cannot reliably track whether a - session is new (vs. empty), so :attr:`new` remains hard coded to - ``False``. - """ - - #: When data is changed, this is set to ``True``. Only the session - #: dictionary itself is tracked; if the session contains mutable - #: data (for example a nested dict) then this must be set to - #: ``True`` manually when modifying that data. The session cookie - #: will only be written to the response if this is ``True``. - modified = False - - #: When data is read or written, this is set to ``True``. Used by - # :class:`.SecureCookieSessionInterface` to add a ``Vary: Cookie`` - #: header, which allows caching proxies to cache different pages for - #: different users. - accessed = False - - def __init__( - self, - initial: c.Mapping[str, t.Any] | c.Iterable[tuple[str, t.Any]] | None = None, - ) -> None: - def on_update(self: te.Self) -> None: - self.modified = True - self.accessed = True - - super().__init__(initial, on_update) - - def __getitem__(self, key: str) -> t.Any: - self.accessed = True - return super().__getitem__(key) - - def get(self, key: str, default: t.Any = None) -> t.Any: - self.accessed = True - return super().get(key, default) - - def setdefault(self, key: str, default: t.Any = None) -> t.Any: - self.accessed = True - return super().setdefault(key, default) - - -class NullSession(SecureCookieSession): - """Class used to generate nicer error messages if sessions are not - available. Will still allow read-only access to the empty session - but fail on setting. - """ - - def _fail(self, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: - raise RuntimeError( - "The session is unavailable because no secret " - "key was set. Set the secret_key on the " - "application to something unique and secret." - ) - - __setitem__ = __delitem__ = clear = pop = popitem = update = setdefault = _fail # noqa: B950 - del _fail - - -class SessionInterface: - """The basic interface you have to implement in order to replace the - default session interface which uses werkzeug's securecookie - implementation. The only methods you have to implement are - :meth:`open_session` and :meth:`save_session`, the others have - useful defaults which you don't need to change. - - The session object returned by the :meth:`open_session` method has to - provide a dictionary like interface plus the properties and methods - from the :class:`SessionMixin`. We recommend just subclassing a dict - and adding that mixin:: - - class Session(dict, SessionMixin): - pass - - If :meth:`open_session` returns ``None`` Flask will call into - :meth:`make_null_session` to create a session that acts as replacement - if the session support cannot work because some requirement is not - fulfilled. The default :class:`NullSession` class that is created - will complain that the secret key was not set. - - To replace the session interface on an application all you have to do - is to assign :attr:`flask.Flask.session_interface`:: - - app = Flask(__name__) - app.session_interface = MySessionInterface() - - Multiple requests with the same session may be sent and handled - concurrently. When implementing a new session interface, consider - whether reads or writes to the backing store must be synchronized. - There is no guarantee on the order in which the session for each - request is opened or saved, it will occur in the order that requests - begin and end processing. - - .. versionadded:: 0.8 - """ - - #: :meth:`make_null_session` will look here for the class that should - #: be created when a null session is requested. Likewise the - #: :meth:`is_null_session` method will perform a typecheck against - #: this type. - null_session_class = NullSession - - #: A flag that indicates if the session interface is pickle based. - #: This can be used by Flask extensions to make a decision in regards - #: to how to deal with the session object. - #: - #: .. versionadded:: 0.10 - pickle_based = False - - def make_null_session(self, app: Flask) -> NullSession: - """Creates a null session which acts as a replacement object if the - real session support could not be loaded due to a configuration - error. This mainly aids the user experience because the job of the - null session is to still support lookup without complaining but - modifications are answered with a helpful error message of what - failed. - - This creates an instance of :attr:`null_session_class` by default. - """ - return self.null_session_class() - - def is_null_session(self, obj: object) -> bool: - """Checks if a given object is a null session. Null sessions are - not asked to be saved. - - This checks if the object is an instance of :attr:`null_session_class` - by default. - """ - return isinstance(obj, self.null_session_class) - - def get_cookie_name(self, app: Flask) -> str: - """The name of the session cookie. Uses``app.config["SESSION_COOKIE_NAME"]``.""" - return app.config["SESSION_COOKIE_NAME"] # type: ignore[no-any-return] - - def get_cookie_domain(self, app: Flask) -> str | None: - """The value of the ``Domain`` parameter on the session cookie. If not set, - browsers will only send the cookie to the exact domain it was set from. - Otherwise, they will send it to any subdomain of the given value as well. - - Uses the :data:`SESSION_COOKIE_DOMAIN` config. - - .. versionchanged:: 2.3 - Not set by default, does not fall back to ``SERVER_NAME``. - """ - return app.config["SESSION_COOKIE_DOMAIN"] # type: ignore[no-any-return] - - def get_cookie_path(self, app: Flask) -> str: - """Returns the path for which the cookie should be valid. The - default implementation uses the value from the ``SESSION_COOKIE_PATH`` - config var if it's set, and falls back to ``APPLICATION_ROOT`` or - uses ``/`` if it's ``None``. - """ - return app.config["SESSION_COOKIE_PATH"] or app.config["APPLICATION_ROOT"] # type: ignore[no-any-return] - - def get_cookie_httponly(self, app: Flask) -> bool: - """Returns True if the session cookie should be httponly. This - currently just returns the value of the ``SESSION_COOKIE_HTTPONLY`` - config var. - """ - return app.config["SESSION_COOKIE_HTTPONLY"] # type: ignore[no-any-return] - - def get_cookie_secure(self, app: Flask) -> bool: - """Returns True if the cookie should be secure. This currently - just returns the value of the ``SESSION_COOKIE_SECURE`` setting. - """ - return app.config["SESSION_COOKIE_SECURE"] # type: ignore[no-any-return] - - def get_cookie_samesite(self, app: Flask) -> str | None: - """Return ``'Strict'`` or ``'Lax'`` if the cookie should use the - ``SameSite`` attribute. This currently just returns the value of - the :data:`SESSION_COOKIE_SAMESITE` setting. - """ - return app.config["SESSION_COOKIE_SAMESITE"] # type: ignore[no-any-return] - - def get_cookie_partitioned(self, app: Flask) -> bool: - """Returns True if the cookie should be partitioned. By default, uses - the value of :data:`SESSION_COOKIE_PARTITIONED`. - - .. versionadded:: 3.1 - """ - return app.config["SESSION_COOKIE_PARTITIONED"] # type: ignore[no-any-return] - - def get_expiration_time(self, app: Flask, session: SessionMixin) -> datetime | None: - """A helper method that returns an expiration date for the session - or ``None`` if the session is linked to the browser session. The - default implementation returns now + the permanent session - lifetime configured on the application. - """ - if session.permanent: - return datetime.now(timezone.utc) + app.permanent_session_lifetime - return None - - def should_set_cookie(self, app: Flask, session: SessionMixin) -> bool: - """Used by session backends to determine if a ``Set-Cookie`` header - should be set for this session cookie for this response. If the session - has been modified, the cookie is set. If the session is permanent and - the ``SESSION_REFRESH_EACH_REQUEST`` config is true, the cookie is - always set. - - This check is usually skipped if the session was deleted. - - .. versionadded:: 0.11 - """ - - return session.modified or ( - session.permanent and app.config["SESSION_REFRESH_EACH_REQUEST"] - ) - - def open_session(self, app: Flask, request: Request) -> SessionMixin | None: - """This is called at the beginning of each request, after - pushing the request context, before matching the URL. - - This must return an object which implements a dictionary-like - interface as well as the :class:`SessionMixin` interface. - - This will return ``None`` to indicate that loading failed in - some way that is not immediately an error. The request - context will fall back to using :meth:`make_null_session` - in this case. - """ - raise NotImplementedError() - - def save_session( - self, app: Flask, session: SessionMixin, response: Response - ) -> None: - """This is called at the end of each request, after generating - a response, before removing the request context. It is skipped - if :meth:`is_null_session` returns ``True``. - """ - raise NotImplementedError() - - -session_json_serializer = TaggedJSONSerializer() - - -def _lazy_sha1(string: bytes = b"") -> t.Any: - """Don't access ``hashlib.sha1`` until runtime. FIPS builds may not include - SHA-1, in which case the import and use as a default would fail before the - developer can configure something else. - """ - return hashlib.sha1(string) - - -class SecureCookieSessionInterface(SessionInterface): - """The default session interface that stores sessions in signed cookies - through the :mod:`itsdangerous` module. - """ - - #: the salt that should be applied on top of the secret key for the - #: signing of cookie based sessions. - salt = "cookie-session" - #: the hash function to use for the signature. The default is sha1 - digest_method = staticmethod(_lazy_sha1) - #: the name of the itsdangerous supported key derivation. The default - #: is hmac. - key_derivation = "hmac" - #: A python serializer for the payload. The default is a compact - #: JSON derived serializer with support for some extra Python types - #: such as datetime objects or tuples. - serializer = session_json_serializer - session_class = SecureCookieSession - - def get_signing_serializer(self, app: Flask) -> URLSafeTimedSerializer | None: - if not app.secret_key: - return None - - keys: list[str | bytes] = [] - - if fallbacks := app.config["SECRET_KEY_FALLBACKS"]: - keys.extend(fallbacks) - - keys.append(app.secret_key) # itsdangerous expects current key at top - return URLSafeTimedSerializer( - keys, # type: ignore[arg-type] - salt=self.salt, - serializer=self.serializer, - signer_kwargs={ - "key_derivation": self.key_derivation, - "digest_method": self.digest_method, - }, - ) - - def open_session(self, app: Flask, request: Request) -> SecureCookieSession | None: - s = self.get_signing_serializer(app) - if s is None: - return None - val = request.cookies.get(self.get_cookie_name(app)) - if not val: - return self.session_class() - max_age = int(app.permanent_session_lifetime.total_seconds()) - try: - data = s.loads(val, max_age=max_age) - return self.session_class(data) - except BadSignature: - return self.session_class() - - def save_session( - self, app: Flask, session: SessionMixin, response: Response - ) -> None: - name = self.get_cookie_name(app) - domain = self.get_cookie_domain(app) - path = self.get_cookie_path(app) - secure = self.get_cookie_secure(app) - partitioned = self.get_cookie_partitioned(app) - samesite = self.get_cookie_samesite(app) - httponly = self.get_cookie_httponly(app) - - # Add a "Vary: Cookie" header if the session was accessed at all. - if session.accessed: - response.vary.add("Cookie") - - # If the session is modified to be empty, remove the cookie. - # If the session is empty, return without setting the cookie. - if not session: - if session.modified: - response.delete_cookie( - name, - domain=domain, - path=path, - secure=secure, - partitioned=partitioned, - samesite=samesite, - httponly=httponly, - ) - response.vary.add("Cookie") - - return - - if not self.should_set_cookie(app, session): - return - - expires = self.get_expiration_time(app, session) - val = self.get_signing_serializer(app).dumps(dict(session)) # type: ignore[union-attr] - response.set_cookie( - name, - val, - expires=expires, - httponly=httponly, - domain=domain, - path=path, - secure=secure, - partitioned=partitioned, - samesite=samesite, - ) - response.vary.add("Cookie") diff --git a/venv/lib/python3.12/site-packages/flask/signals.py b/venv/lib/python3.12/site-packages/flask/signals.py deleted file mode 100644 index 444fda99..00000000 --- a/venv/lib/python3.12/site-packages/flask/signals.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import annotations - -from blinker import Namespace - -# This namespace is only for signals provided by Flask itself. -_signals = Namespace() - -template_rendered = _signals.signal("template-rendered") -before_render_template = _signals.signal("before-render-template") -request_started = _signals.signal("request-started") -request_finished = _signals.signal("request-finished") -request_tearing_down = _signals.signal("request-tearing-down") -got_request_exception = _signals.signal("got-request-exception") -appcontext_tearing_down = _signals.signal("appcontext-tearing-down") -appcontext_pushed = _signals.signal("appcontext-pushed") -appcontext_popped = _signals.signal("appcontext-popped") -message_flashed = _signals.signal("message-flashed") diff --git a/venv/lib/python3.12/site-packages/flask/templating.py b/venv/lib/python3.12/site-packages/flask/templating.py deleted file mode 100644 index 16d480f5..00000000 --- a/venv/lib/python3.12/site-packages/flask/templating.py +++ /dev/null @@ -1,219 +0,0 @@ -from __future__ import annotations - -import typing as t - -from jinja2 import BaseLoader -from jinja2 import Environment as BaseEnvironment -from jinja2 import Template -from jinja2 import TemplateNotFound - -from .globals import _cv_app -from .globals import _cv_request -from .globals import current_app -from .globals import request -from .helpers import stream_with_context -from .signals import before_render_template -from .signals import template_rendered - -if t.TYPE_CHECKING: # pragma: no cover - from .app import Flask - from .sansio.app import App - from .sansio.scaffold import Scaffold - - -def _default_template_ctx_processor() -> dict[str, t.Any]: - """Default template context processor. Injects `request`, - `session` and `g`. - """ - appctx = _cv_app.get(None) - reqctx = _cv_request.get(None) - rv: dict[str, t.Any] = {} - if appctx is not None: - rv["g"] = appctx.g - if reqctx is not None: - rv["request"] = reqctx.request - rv["session"] = reqctx.session - return rv - - -class Environment(BaseEnvironment): - """Works like a regular Jinja environment but has some additional - knowledge of how Flask's blueprint works so that it can prepend the - name of the blueprint to referenced templates if necessary. - """ - - def __init__(self, app: App, **options: t.Any) -> None: - if "loader" not in options: - options["loader"] = app.create_global_jinja_loader() - BaseEnvironment.__init__(self, **options) - self.app = app - - -class DispatchingJinjaLoader(BaseLoader): - """A loader that looks for templates in the application and all - the blueprint folders. - """ - - def __init__(self, app: App) -> None: - self.app = app - - def get_source( - self, environment: BaseEnvironment, template: str - ) -> tuple[str, str | None, t.Callable[[], bool] | None]: - if self.app.config["EXPLAIN_TEMPLATE_LOADING"]: - return self._get_source_explained(environment, template) - return self._get_source_fast(environment, template) - - def _get_source_explained( - self, environment: BaseEnvironment, template: str - ) -> tuple[str, str | None, t.Callable[[], bool] | None]: - attempts = [] - rv: tuple[str, str | None, t.Callable[[], bool] | None] | None - trv: None | (tuple[str, str | None, t.Callable[[], bool] | None]) = None - - for srcobj, loader in self._iter_loaders(template): - try: - rv = loader.get_source(environment, template) - if trv is None: - trv = rv - except TemplateNotFound: - rv = None - attempts.append((loader, srcobj, rv)) - - from .debughelpers import explain_template_loading_attempts - - explain_template_loading_attempts(self.app, template, attempts) - - if trv is not None: - return trv - raise TemplateNotFound(template) - - def _get_source_fast( - self, environment: BaseEnvironment, template: str - ) -> tuple[str, str | None, t.Callable[[], bool] | None]: - for _srcobj, loader in self._iter_loaders(template): - try: - return loader.get_source(environment, template) - except TemplateNotFound: - continue - raise TemplateNotFound(template) - - def _iter_loaders(self, template: str) -> t.Iterator[tuple[Scaffold, BaseLoader]]: - loader = self.app.jinja_loader - if loader is not None: - yield self.app, loader - - for blueprint in self.app.iter_blueprints(): - loader = blueprint.jinja_loader - if loader is not None: - yield blueprint, loader - - def list_templates(self) -> list[str]: - result = set() - loader = self.app.jinja_loader - if loader is not None: - result.update(loader.list_templates()) - - for blueprint in self.app.iter_blueprints(): - loader = blueprint.jinja_loader - if loader is not None: - for template in loader.list_templates(): - result.add(template) - - return list(result) - - -def _render(app: Flask, template: Template, context: dict[str, t.Any]) -> str: - app.update_template_context(context) - before_render_template.send( - app, _async_wrapper=app.ensure_sync, template=template, context=context - ) - rv = template.render(context) - template_rendered.send( - app, _async_wrapper=app.ensure_sync, template=template, context=context - ) - return rv - - -def render_template( - template_name_or_list: str | Template | list[str | Template], - **context: t.Any, -) -> str: - """Render a template by name with the given context. - - :param template_name_or_list: The name of the template to render. If - a list is given, the first name to exist will be rendered. - :param context: The variables to make available in the template. - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - template = app.jinja_env.get_or_select_template(template_name_or_list) - return _render(app, template, context) - - -def render_template_string(source: str, **context: t.Any) -> str: - """Render a template from the given source string with the given - context. - - :param source: The source code of the template to render. - :param context: The variables to make available in the template. - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - template = app.jinja_env.from_string(source) - return _render(app, template, context) - - -def _stream( - app: Flask, template: Template, context: dict[str, t.Any] -) -> t.Iterator[str]: - app.update_template_context(context) - before_render_template.send( - app, _async_wrapper=app.ensure_sync, template=template, context=context - ) - - def generate() -> t.Iterator[str]: - yield from template.generate(context) - template_rendered.send( - app, _async_wrapper=app.ensure_sync, template=template, context=context - ) - - rv = generate() - - # If a request context is active, keep it while generating. - if request: - rv = stream_with_context(rv) - - return rv - - -def stream_template( - template_name_or_list: str | Template | list[str | Template], - **context: t.Any, -) -> t.Iterator[str]: - """Render a template by name with the given context as a stream. - This returns an iterator of strings, which can be used as a - streaming response from a view. - - :param template_name_or_list: The name of the template to render. If - a list is given, the first name to exist will be rendered. - :param context: The variables to make available in the template. - - .. versionadded:: 2.2 - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - template = app.jinja_env.get_or_select_template(template_name_or_list) - return _stream(app, template, context) - - -def stream_template_string(source: str, **context: t.Any) -> t.Iterator[str]: - """Render a template from the given source string with the given - context as a stream. This returns an iterator of strings, which can - be used as a streaming response from a view. - - :param source: The source code of the template to render. - :param context: The variables to make available in the template. - - .. versionadded:: 2.2 - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - template = app.jinja_env.from_string(source) - return _stream(app, template, context) diff --git a/venv/lib/python3.12/site-packages/flask/testing.py b/venv/lib/python3.12/site-packages/flask/testing.py deleted file mode 100644 index 55eb12fe..00000000 --- a/venv/lib/python3.12/site-packages/flask/testing.py +++ /dev/null @@ -1,298 +0,0 @@ -from __future__ import annotations - -import importlib.metadata -import typing as t -from contextlib import contextmanager -from contextlib import ExitStack -from copy import copy -from types import TracebackType -from urllib.parse import urlsplit - -import werkzeug.test -from click.testing import CliRunner -from click.testing import Result -from werkzeug.test import Client -from werkzeug.wrappers import Request as BaseRequest - -from .cli import ScriptInfo -from .sessions import SessionMixin - -if t.TYPE_CHECKING: # pragma: no cover - from _typeshed.wsgi import WSGIEnvironment - from werkzeug.test import TestResponse - - from .app import Flask - - -class EnvironBuilder(werkzeug.test.EnvironBuilder): - """An :class:`~werkzeug.test.EnvironBuilder`, that takes defaults from the - application. - - :param app: The Flask application to configure the environment from. - :param path: URL path being requested. - :param base_url: Base URL where the app is being served, which - ``path`` is relative to. If not given, built from - :data:`PREFERRED_URL_SCHEME`, ``subdomain``, - :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. - :param subdomain: Subdomain name to append to :data:`SERVER_NAME`. - :param url_scheme: Scheme to use instead of - :data:`PREFERRED_URL_SCHEME`. - :param json: If given, this is serialized as JSON and passed as - ``data``. Also defaults ``content_type`` to - ``application/json``. - :param args: other positional arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - :param kwargs: other keyword arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - """ - - def __init__( - self, - app: Flask, - path: str = "/", - base_url: str | None = None, - subdomain: str | None = None, - url_scheme: str | None = None, - *args: t.Any, - **kwargs: t.Any, - ) -> None: - assert not (base_url or subdomain or url_scheme) or ( - base_url is not None - ) != bool(subdomain or url_scheme), ( - 'Cannot pass "subdomain" or "url_scheme" with "base_url".' - ) - - if base_url is None: - http_host = app.config.get("SERVER_NAME") or "localhost" - app_root = app.config["APPLICATION_ROOT"] - - if subdomain: - http_host = f"{subdomain}.{http_host}" - - if url_scheme is None: - url_scheme = app.config["PREFERRED_URL_SCHEME"] - - url = urlsplit(path) - base_url = ( - f"{url.scheme or url_scheme}://{url.netloc or http_host}" - f"/{app_root.lstrip('/')}" - ) - path = url.path - - if url.query: - path = f"{path}?{url.query}" - - self.app = app - super().__init__(path, base_url, *args, **kwargs) - - def json_dumps(self, obj: t.Any, **kwargs: t.Any) -> str: - """Serialize ``obj`` to a JSON-formatted string. - - The serialization will be configured according to the config associated - with this EnvironBuilder's ``app``. - """ - return self.app.json.dumps(obj, **kwargs) - - -_werkzeug_version = "" - - -def _get_werkzeug_version() -> str: - global _werkzeug_version - - if not _werkzeug_version: - _werkzeug_version = importlib.metadata.version("werkzeug") - - return _werkzeug_version - - -class FlaskClient(Client): - """Works like a regular Werkzeug test client but has knowledge about - Flask's contexts to defer the cleanup of the request context until - the end of a ``with`` block. For general information about how to - use this class refer to :class:`werkzeug.test.Client`. - - .. versionchanged:: 0.12 - `app.test_client()` includes preset default environment, which can be - set after instantiation of the `app.test_client()` object in - `client.environ_base`. - - Basic usage is outlined in the :doc:`/testing` chapter. - """ - - application: Flask - - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - super().__init__(*args, **kwargs) - self.preserve_context = False - self._new_contexts: list[t.ContextManager[t.Any]] = [] - self._context_stack = ExitStack() - self.environ_base = { - "REMOTE_ADDR": "127.0.0.1", - "HTTP_USER_AGENT": f"Werkzeug/{_get_werkzeug_version()}", - } - - @contextmanager - def session_transaction( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Iterator[SessionMixin]: - """When used in combination with a ``with`` statement this opens a - session transaction. This can be used to modify the session that - the test client uses. Once the ``with`` block is left the session is - stored back. - - :: - - with client.session_transaction() as session: - session['value'] = 42 - - Internally this is implemented by going through a temporary test - request context and since session handling could depend on - request variables this function accepts the same arguments as - :meth:`~flask.Flask.test_request_context` which are directly - passed through. - """ - if self._cookies is None: - raise TypeError( - "Cookies are disabled. Create a client with 'use_cookies=True'." - ) - - app = self.application - ctx = app.test_request_context(*args, **kwargs) - self._add_cookies_to_wsgi(ctx.request.environ) - - with ctx: - sess = app.session_interface.open_session(app, ctx.request) - - if sess is None: - raise RuntimeError("Session backend did not open a session.") - - yield sess - resp = app.response_class() - - if app.session_interface.is_null_session(sess): - return - - with ctx: - app.session_interface.save_session(app, sess, resp) - - self._update_cookies_from_response( - ctx.request.host.partition(":")[0], - ctx.request.path, - resp.headers.getlist("Set-Cookie"), - ) - - def _copy_environ(self, other: WSGIEnvironment) -> WSGIEnvironment: - out = {**self.environ_base, **other} - - if self.preserve_context: - out["werkzeug.debug.preserve_context"] = self._new_contexts.append - - return out - - def _request_from_builder_args( - self, args: tuple[t.Any, ...], kwargs: dict[str, t.Any] - ) -> BaseRequest: - kwargs["environ_base"] = self._copy_environ(kwargs.get("environ_base", {})) - builder = EnvironBuilder(self.application, *args, **kwargs) - - try: - return builder.get_request() - finally: - builder.close() - - def open( - self, - *args: t.Any, - buffered: bool = False, - follow_redirects: bool = False, - **kwargs: t.Any, - ) -> TestResponse: - if args and isinstance( - args[0], (werkzeug.test.EnvironBuilder, dict, BaseRequest) - ): - if isinstance(args[0], werkzeug.test.EnvironBuilder): - builder = copy(args[0]) - builder.environ_base = self._copy_environ(builder.environ_base or {}) # type: ignore[arg-type] - request = builder.get_request() - elif isinstance(args[0], dict): - request = EnvironBuilder.from_environ( - args[0], app=self.application, environ_base=self._copy_environ({}) - ).get_request() - else: - # isinstance(args[0], BaseRequest) - request = copy(args[0]) - request.environ = self._copy_environ(request.environ) - else: - # request is None - request = self._request_from_builder_args(args, kwargs) - - # Pop any previously preserved contexts. This prevents contexts - # from being preserved across redirects or multiple requests - # within a single block. - self._context_stack.close() - - response = super().open( - request, - buffered=buffered, - follow_redirects=follow_redirects, - ) - response.json_module = self.application.json # type: ignore[assignment] - - # Re-push contexts that were preserved during the request. - for cm in self._new_contexts: - self._context_stack.enter_context(cm) - - self._new_contexts.clear() - return response - - def __enter__(self) -> FlaskClient: - if self.preserve_context: - raise RuntimeError("Cannot nest client invocations") - self.preserve_context = True - return self - - def __exit__( - self, - exc_type: type | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.preserve_context = False - self._context_stack.close() - - -class FlaskCliRunner(CliRunner): - """A :class:`~click.testing.CliRunner` for testing a Flask app's - CLI commands. Typically created using - :meth:`~flask.Flask.test_cli_runner`. See :ref:`testing-cli`. - """ - - def __init__(self, app: Flask, **kwargs: t.Any) -> None: - self.app = app - super().__init__(**kwargs) - - def invoke( # type: ignore - self, cli: t.Any = None, args: t.Any = None, **kwargs: t.Any - ) -> Result: - """Invokes a CLI command in an isolated environment. See - :meth:`CliRunner.invoke ` for - full method documentation. See :ref:`testing-cli` for examples. - - If the ``obj`` argument is not given, passes an instance of - :class:`~flask.cli.ScriptInfo` that knows how to load the Flask - app being tested. - - :param cli: Command object to invoke. Default is the app's - :attr:`~flask.app.Flask.cli` group. - :param args: List of strings to invoke the command with. - - :return: a :class:`~click.testing.Result` object. - """ - if cli is None: - cli = self.app.cli - - if "obj" not in kwargs: - kwargs["obj"] = ScriptInfo(create_app=lambda: self.app) - - return super().invoke(cli, args, **kwargs) diff --git a/venv/lib/python3.12/site-packages/flask/typing.py b/venv/lib/python3.12/site-packages/flask/typing.py deleted file mode 100644 index 6b70c409..00000000 --- a/venv/lib/python3.12/site-packages/flask/typing.py +++ /dev/null @@ -1,93 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import typing as t - -if t.TYPE_CHECKING: # pragma: no cover - from _typeshed.wsgi import WSGIApplication # noqa: F401 - from werkzeug.datastructures import Headers # noqa: F401 - from werkzeug.sansio.response import Response # noqa: F401 - -# The possible types that are directly convertible or are a Response object. -ResponseValue = t.Union[ - "Response", - str, - bytes, - list[t.Any], - # Only dict is actually accepted, but Mapping allows for TypedDict. - t.Mapping[str, t.Any], - t.Iterator[str], - t.Iterator[bytes], - cabc.AsyncIterable[str], # for Quart, until App is generic. - cabc.AsyncIterable[bytes], -] - -# the possible types for an individual HTTP header -# This should be a Union, but mypy doesn't pass unless it's a TypeVar. -HeaderValue = t.Union[str, list[str], tuple[str, ...]] - -# the possible types for HTTP headers -HeadersValue = t.Union[ - "Headers", - t.Mapping[str, HeaderValue], - t.Sequence[tuple[str, HeaderValue]], -] - -# The possible types returned by a route function. -ResponseReturnValue = t.Union[ - ResponseValue, - tuple[ResponseValue, HeadersValue], - tuple[ResponseValue, int], - tuple[ResponseValue, int, HeadersValue], - "WSGIApplication", -] - -# Allow any subclass of werkzeug.Response, such as the one from Flask, -# as a callback argument. Using werkzeug.Response directly makes a -# callback annotated with flask.Response fail type checking. -ResponseClass = t.TypeVar("ResponseClass", bound="Response") - -AppOrBlueprintKey = t.Optional[str] # The App key is None, whereas blueprints are named -AfterRequestCallable = t.Union[ - t.Callable[[ResponseClass], ResponseClass], - t.Callable[[ResponseClass], t.Awaitable[ResponseClass]], -] -BeforeFirstRequestCallable = t.Union[ - t.Callable[[], None], t.Callable[[], t.Awaitable[None]] -] -BeforeRequestCallable = t.Union[ - t.Callable[[], t.Optional[ResponseReturnValue]], - t.Callable[[], t.Awaitable[t.Optional[ResponseReturnValue]]], -] -ShellContextProcessorCallable = t.Callable[[], dict[str, t.Any]] -TeardownCallable = t.Union[ - t.Callable[[t.Optional[BaseException]], None], - t.Callable[[t.Optional[BaseException]], t.Awaitable[None]], -] -TemplateContextProcessorCallable = t.Union[ - t.Callable[[], dict[str, t.Any]], - t.Callable[[], t.Awaitable[dict[str, t.Any]]], -] -TemplateFilterCallable = t.Callable[..., t.Any] -TemplateGlobalCallable = t.Callable[..., t.Any] -TemplateTestCallable = t.Callable[..., bool] -URLDefaultCallable = t.Callable[[str, dict[str, t.Any]], None] -URLValuePreprocessorCallable = t.Callable[ - [t.Optional[str], t.Optional[dict[str, t.Any]]], None -] - -# This should take Exception, but that either breaks typing the argument -# with a specific exception, or decorating multiple times with different -# exceptions (and using a union type on the argument). -# https://github.com/pallets/flask/issues/4095 -# https://github.com/pallets/flask/issues/4295 -# https://github.com/pallets/flask/issues/4297 -ErrorHandlerCallable = t.Union[ - t.Callable[[t.Any], ResponseReturnValue], - t.Callable[[t.Any], t.Awaitable[ResponseReturnValue]], -] - -RouteCallable = t.Union[ - t.Callable[..., ResponseReturnValue], - t.Callable[..., t.Awaitable[ResponseReturnValue]], -] diff --git a/venv/lib/python3.12/site-packages/flask/views.py b/venv/lib/python3.12/site-packages/flask/views.py deleted file mode 100644 index 53fe976d..00000000 --- a/venv/lib/python3.12/site-packages/flask/views.py +++ /dev/null @@ -1,191 +0,0 @@ -from __future__ import annotations - -import typing as t - -from . import typing as ft -from .globals import current_app -from .globals import request - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - -http_method_funcs = frozenset( - ["get", "post", "head", "options", "delete", "put", "trace", "patch"] -) - - -class View: - """Subclass this class and override :meth:`dispatch_request` to - create a generic class-based view. Call :meth:`as_view` to create a - view function that creates an instance of the class with the given - arguments and calls its ``dispatch_request`` method with any URL - variables. - - See :doc:`views` for a detailed guide. - - .. code-block:: python - - class Hello(View): - init_every_request = False - - def dispatch_request(self, name): - return f"Hello, {name}!" - - app.add_url_rule( - "/hello/", view_func=Hello.as_view("hello") - ) - - Set :attr:`methods` on the class to change what methods the view - accepts. - - Set :attr:`decorators` on the class to apply a list of decorators to - the generated view function. Decorators applied to the class itself - will not be applied to the generated view function! - - Set :attr:`init_every_request` to ``False`` for efficiency, unless - you need to store request-global data on ``self``. - """ - - #: The methods this view is registered for. Uses the same default - #: (``["GET", "HEAD", "OPTIONS"]``) as ``route`` and - #: ``add_url_rule`` by default. - methods: t.ClassVar[t.Collection[str] | None] = None - - #: Control whether the ``OPTIONS`` method is handled automatically. - #: Uses the same default (``True``) as ``route`` and - #: ``add_url_rule`` by default. - provide_automatic_options: t.ClassVar[bool | None] = None - - #: A list of decorators to apply, in order, to the generated view - #: function. Remember that ``@decorator`` syntax is applied bottom - #: to top, so the first decorator in the list would be the bottom - #: decorator. - #: - #: .. versionadded:: 0.8 - decorators: t.ClassVar[list[t.Callable[..., t.Any]]] = [] - - #: Create a new instance of this view class for every request by - #: default. If a view subclass sets this to ``False``, the same - #: instance is used for every request. - #: - #: A single instance is more efficient, especially if complex setup - #: is done during init. However, storing data on ``self`` is no - #: longer safe across requests, and :data:`~flask.g` should be used - #: instead. - #: - #: .. versionadded:: 2.2 - init_every_request: t.ClassVar[bool] = True - - def dispatch_request(self) -> ft.ResponseReturnValue: - """The actual view function behavior. Subclasses must override - this and return a valid response. Any variables from the URL - rule are passed as keyword arguments. - """ - raise NotImplementedError() - - @classmethod - def as_view( - cls, name: str, *class_args: t.Any, **class_kwargs: t.Any - ) -> ft.RouteCallable: - """Convert the class into a view function that can be registered - for a route. - - By default, the generated view will create a new instance of the - view class for every request and call its - :meth:`dispatch_request` method. If the view class sets - :attr:`init_every_request` to ``False``, the same instance will - be used for every request. - - Except for ``name``, all other arguments passed to this method - are forwarded to the view class ``__init__`` method. - - .. versionchanged:: 2.2 - Added the ``init_every_request`` class attribute. - """ - if cls.init_every_request: - - def view(**kwargs: t.Any) -> ft.ResponseReturnValue: - self = view.view_class( # type: ignore[attr-defined] - *class_args, **class_kwargs - ) - return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return] - - else: - self = cls(*class_args, **class_kwargs) # pyright: ignore - - def view(**kwargs: t.Any) -> ft.ResponseReturnValue: - return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return] - - if cls.decorators: - view.__name__ = name - view.__module__ = cls.__module__ - for decorator in cls.decorators: - view = decorator(view) - - # We attach the view class to the view function for two reasons: - # first of all it allows us to easily figure out what class-based - # view this thing came from, secondly it's also used for instantiating - # the view class so you can actually replace it with something else - # for testing purposes and debugging. - view.view_class = cls # type: ignore - view.__name__ = name - view.__doc__ = cls.__doc__ - view.__module__ = cls.__module__ - view.methods = cls.methods # type: ignore - view.provide_automatic_options = cls.provide_automatic_options # type: ignore - return view - - -class MethodView(View): - """Dispatches request methods to the corresponding instance methods. - For example, if you implement a ``get`` method, it will be used to - handle ``GET`` requests. - - This can be useful for defining a REST API. - - :attr:`methods` is automatically set based on the methods defined on - the class. - - See :doc:`views` for a detailed guide. - - .. code-block:: python - - class CounterAPI(MethodView): - def get(self): - return str(session.get("counter", 0)) - - def post(self): - session["counter"] = session.get("counter", 0) + 1 - return redirect(url_for("counter")) - - app.add_url_rule( - "/counter", view_func=CounterAPI.as_view("counter") - ) - """ - - def __init_subclass__(cls, **kwargs: t.Any) -> None: - super().__init_subclass__(**kwargs) - - if "methods" not in cls.__dict__: - methods = set() - - for base in cls.__bases__: - if getattr(base, "methods", None): - methods.update(base.methods) # type: ignore[attr-defined] - - for key in http_method_funcs: - if hasattr(cls, key): - methods.add(key.upper()) - - if methods: - cls.methods = methods - - def dispatch_request(self, **kwargs: t.Any) -> ft.ResponseReturnValue: - meth = getattr(self, request.method.lower(), None) - - # If the request method is HEAD and we don't have a handler for it - # retry with GET. - if meth is None and request.method == "HEAD": - meth = getattr(self, "get", None) - - assert meth is not None, f"Unimplemented method {request.method!r}" - return current_app.ensure_sync(meth)(**kwargs) # type: ignore[no-any-return] diff --git a/venv/lib/python3.12/site-packages/flask/wrappers.py b/venv/lib/python3.12/site-packages/flask/wrappers.py deleted file mode 100644 index bab61029..00000000 --- a/venv/lib/python3.12/site-packages/flask/wrappers.py +++ /dev/null @@ -1,257 +0,0 @@ -from __future__ import annotations - -import typing as t - -from werkzeug.exceptions import BadRequest -from werkzeug.exceptions import HTTPException -from werkzeug.wrappers import Request as RequestBase -from werkzeug.wrappers import Response as ResponseBase - -from . import json -from .globals import current_app -from .helpers import _split_blueprint_path - -if t.TYPE_CHECKING: # pragma: no cover - from werkzeug.routing import Rule - - -class Request(RequestBase): - """The request object used by default in Flask. Remembers the - matched endpoint and view arguments. - - It is what ends up as :class:`~flask.request`. If you want to replace - the request object used you can subclass this and set - :attr:`~flask.Flask.request_class` to your subclass. - - The request object is a :class:`~werkzeug.wrappers.Request` subclass and - provides all of the attributes Werkzeug defines plus a few Flask - specific ones. - """ - - json_module: t.Any = json - - #: The internal URL rule that matched the request. This can be - #: useful to inspect which methods are allowed for the URL from - #: a before/after handler (``request.url_rule.methods``) etc. - #: Though if the request's method was invalid for the URL rule, - #: the valid list is available in ``routing_exception.valid_methods`` - #: instead (an attribute of the Werkzeug exception - #: :exc:`~werkzeug.exceptions.MethodNotAllowed`) - #: because the request was never internally bound. - #: - #: .. versionadded:: 0.6 - url_rule: Rule | None = None - - #: A dict of view arguments that matched the request. If an exception - #: happened when matching, this will be ``None``. - view_args: dict[str, t.Any] | None = None - - #: If matching the URL failed, this is the exception that will be - #: raised / was raised as part of the request handling. This is - #: usually a :exc:`~werkzeug.exceptions.NotFound` exception or - #: something similar. - routing_exception: HTTPException | None = None - - _max_content_length: int | None = None - _max_form_memory_size: int | None = None - _max_form_parts: int | None = None - - @property - def max_content_length(self) -> int | None: - """The maximum number of bytes that will be read during this request. If - this limit is exceeded, a 413 :exc:`~werkzeug.exceptions.RequestEntityTooLarge` - error is raised. If it is set to ``None``, no limit is enforced at the - Flask application level. However, if it is ``None`` and the request has - no ``Content-Length`` header and the WSGI server does not indicate that - it terminates the stream, then no data is read to avoid an infinite - stream. - - Each request defaults to the :data:`MAX_CONTENT_LENGTH` config, which - defaults to ``None``. It can be set on a specific ``request`` to apply - the limit to that specific view. This should be set appropriately based - on an application's or view's specific needs. - - .. versionchanged:: 3.1 - This can be set per-request. - - .. versionchanged:: 0.6 - This is configurable through Flask config. - """ - if self._max_content_length is not None: - return self._max_content_length - - if not current_app: - return super().max_content_length - - return current_app.config["MAX_CONTENT_LENGTH"] # type: ignore[no-any-return] - - @max_content_length.setter - def max_content_length(self, value: int | None) -> None: - self._max_content_length = value - - @property - def max_form_memory_size(self) -> int | None: - """The maximum size in bytes any non-file form field may be in a - ``multipart/form-data`` body. If this limit is exceeded, a 413 - :exc:`~werkzeug.exceptions.RequestEntityTooLarge` error is raised. If it - is set to ``None``, no limit is enforced at the Flask application level. - - Each request defaults to the :data:`MAX_FORM_MEMORY_SIZE` config, which - defaults to ``500_000``. It can be set on a specific ``request`` to - apply the limit to that specific view. This should be set appropriately - based on an application's or view's specific needs. - - .. versionchanged:: 3.1 - This is configurable through Flask config. - """ - if self._max_form_memory_size is not None: - return self._max_form_memory_size - - if not current_app: - return super().max_form_memory_size - - return current_app.config["MAX_FORM_MEMORY_SIZE"] # type: ignore[no-any-return] - - @max_form_memory_size.setter - def max_form_memory_size(self, value: int | None) -> None: - self._max_form_memory_size = value - - @property # type: ignore[override] - def max_form_parts(self) -> int | None: - """The maximum number of fields that may be present in a - ``multipart/form-data`` body. If this limit is exceeded, a 413 - :exc:`~werkzeug.exceptions.RequestEntityTooLarge` error is raised. If it - is set to ``None``, no limit is enforced at the Flask application level. - - Each request defaults to the :data:`MAX_FORM_PARTS` config, which - defaults to ``1_000``. It can be set on a specific ``request`` to apply - the limit to that specific view. This should be set appropriately based - on an application's or view's specific needs. - - .. versionchanged:: 3.1 - This is configurable through Flask config. - """ - if self._max_form_parts is not None: - return self._max_form_parts - - if not current_app: - return super().max_form_parts - - return current_app.config["MAX_FORM_PARTS"] # type: ignore[no-any-return] - - @max_form_parts.setter - def max_form_parts(self, value: int | None) -> None: - self._max_form_parts = value - - @property - def endpoint(self) -> str | None: - """The endpoint that matched the request URL. - - This will be ``None`` if matching failed or has not been - performed yet. - - This in combination with :attr:`view_args` can be used to - reconstruct the same URL or a modified URL. - """ - if self.url_rule is not None: - return self.url_rule.endpoint # type: ignore[no-any-return] - - return None - - @property - def blueprint(self) -> str | None: - """The registered name of the current blueprint. - - This will be ``None`` if the endpoint is not part of a - blueprint, or if URL matching failed or has not been performed - yet. - - This does not necessarily match the name the blueprint was - created with. It may have been nested, or registered with a - different name. - """ - endpoint = self.endpoint - - if endpoint is not None and "." in endpoint: - return endpoint.rpartition(".")[0] - - return None - - @property - def blueprints(self) -> list[str]: - """The registered names of the current blueprint upwards through - parent blueprints. - - This will be an empty list if there is no current blueprint, or - if URL matching failed. - - .. versionadded:: 2.0.1 - """ - name = self.blueprint - - if name is None: - return [] - - return _split_blueprint_path(name) - - def _load_form_data(self) -> None: - super()._load_form_data() - - # In debug mode we're replacing the files multidict with an ad-hoc - # subclass that raises a different error for key errors. - if ( - current_app - and current_app.debug - and self.mimetype != "multipart/form-data" - and not self.files - ): - from .debughelpers import attach_enctype_error_multidict - - attach_enctype_error_multidict(self) - - def on_json_loading_failed(self, e: ValueError | None) -> t.Any: - try: - return super().on_json_loading_failed(e) - except BadRequest as ebr: - if current_app and current_app.debug: - raise - - raise BadRequest() from ebr - - -class Response(ResponseBase): - """The response object that is used by default in Flask. Works like the - response object from Werkzeug but is set to have an HTML mimetype by - default. Quite often you don't have to create this object yourself because - :meth:`~flask.Flask.make_response` will take care of that for you. - - If you want to replace the response object used you can subclass this and - set :attr:`~flask.Flask.response_class` to your subclass. - - .. versionchanged:: 1.0 - JSON support is added to the response, like the request. This is useful - when testing to get the test client response data as JSON. - - .. versionchanged:: 1.0 - - Added :attr:`max_cookie_size`. - """ - - default_mimetype: str | None = "text/html" - - json_module = json - - autocorrect_location_header = False - - @property - def max_cookie_size(self) -> int: # type: ignore - """Read-only view of the :data:`MAX_COOKIE_SIZE` config key. - - See :attr:`~werkzeug.wrappers.Response.max_cookie_size` in - Werkzeug's docs. - """ - if current_app: - return current_app.config["MAX_COOKIE_SIZE"] # type: ignore[no-any-return] - - # return Werkzeug's default when not in an app context - return super().max_cookie_size diff --git a/venv/lib/python3.12/site-packages/idna-3.11.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/idna-3.11.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/venv/lib/python3.12/site-packages/idna-3.11.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/idna-3.11.dist-info/METADATA b/venv/lib/python3.12/site-packages/idna-3.11.dist-info/METADATA deleted file mode 100644 index 7a4a4b7a..00000000 --- a/venv/lib/python3.12/site-packages/idna-3.11.dist-info/METADATA +++ /dev/null @@ -1,209 +0,0 @@ -Metadata-Version: 2.4 -Name: idna -Version: 3.11 -Summary: Internationalized Domain Names in Applications (IDNA) -Author-email: Kim Davies -Requires-Python: >=3.8 -Description-Content-Type: text/x-rst -License-Expression: BSD-3-Clause -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: System Administrators -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3.14 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Internet :: Name Service (DNS) -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Utilities -License-File: LICENSE.md -Requires-Dist: ruff >= 0.6.2 ; extra == "all" -Requires-Dist: mypy >= 1.11.2 ; extra == "all" -Requires-Dist: pytest >= 8.3.2 ; extra == "all" -Requires-Dist: flake8 >= 7.1.1 ; extra == "all" -Project-URL: Changelog, https://github.com/kjd/idna/blob/master/HISTORY.rst -Project-URL: Issue tracker, https://github.com/kjd/idna/issues -Project-URL: Source, https://github.com/kjd/idna -Provides-Extra: all - -Internationalized Domain Names in Applications (IDNA) -===================================================== - -Support for `Internationalized Domain Names in -Applications (IDNA) `_ -and `Unicode IDNA Compatibility Processing -`_. - -The latest versions of these standards supplied here provide -more comprehensive language coverage and reduce the potential of -allowing domains with known security vulnerabilities. This library -is a suitable replacement for the “encodings.idna” -module that comes with the Python standard library, but which -only supports an older superseded IDNA specification from 2003. - -Basic functions are simply executed: - -.. code-block:: pycon - - >>> import idna - >>> idna.encode('ドメイン.テスト') - b'xn--eckwd4c7c.xn--zckzah' - >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) - ドメイン.テスト - - -Installation ------------- - -This package is available for installation from PyPI via the -typical mechanisms, such as: - -.. code-block:: bash - - $ python3 -m pip install idna - - -Usage ------ - -For typical usage, the ``encode`` and ``decode`` functions will take a -domain name argument and perform a conversion to ASCII compatible encoding -(known as A-labels), or to Unicode strings (known as U-labels) -respectively. - -.. code-block:: pycon - - >>> import idna - >>> idna.encode('ドメイン.テスト') - b'xn--eckwd4c7c.xn--zckzah' - >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) - ドメイン.テスト - -Conversions can be applied at a per-label basis using the ``ulabel`` or -``alabel`` functions if necessary: - -.. code-block:: pycon - - >>> idna.alabel('测试') - b'xn--0zwm56d' - - -Compatibility Mapping (UTS #46) -+++++++++++++++++++++++++++++++ - -This library provides support for `Unicode IDNA Compatibility -Processing `_ which normalizes input from -different potential ways a user may input a domain prior to performing the IDNA -conversion operations. This functionality, known as a -`mapping `_, is considered by the -specification to be a local user-interface issue distinct from IDNA -conversion functionality. - -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 - - >>> import idna - >>> idna.encode('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 - - -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 position in the string (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 using the command-line -script ``tools/idna-data``. - -This tool will fetch relevant codepoint data from the Unicode repository -and perform the required calculations to identify eligibility. There are -three main modes: - -* ``idna-data make-libdata``. Generates ``idnadata.py`` and - ``uts46data.py``, the pre-calculated lookup tables used for IDNA and - UTS 46 conversions. Implementers 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 be used in computing the table data. For -example, ``idna-data --version 9.0.0 make-libdata`` will generate -library data against Unicode 9.0.0. - - -Additional Notes ----------------- - -* **Packages**. The latest tagged release version is published in the - `Python Package Index `_. - -* **Version support**. This library supports Python 3.8 and higher. - As this library serves as a low-level toolkit for a variety of - applications, many of which strive for broad compatibility with older - Python versions, there is no rush to remove older interpreter support. - Support for older versions are likely to be removed from new releases - as automated tests can no longer easily be run, i.e. once the Python - version is officially end-of-life. - -* **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 - `_. - -* **Emoji**. It is an occasional request to support emoji domains in - this library. Encoding of symbols like emoji is expressly prohibited by - the technical standard IDNA 2008 and emoji domains are broadly phased - out across the domain industry due to associated security risks. For - now, applications that need to support these non-compliant labels - may wish to consider trying the encode/decode operation in this library - first, and then falling back to using `encodings.idna`. See `the Github - project `_ for more discussion. - -* **Transitional processing**. Unicode 16.0.0 removed transitional - processing so the `transitional` argument for the encode() method - no longer has any effect and will be removed at a later date. - diff --git a/venv/lib/python3.12/site-packages/idna-3.11.dist-info/RECORD b/venv/lib/python3.12/site-packages/idna-3.11.dist-info/RECORD deleted file mode 100644 index 8525b6da..00000000 --- a/venv/lib/python3.12/site-packages/idna-3.11.dist-info/RECORD +++ /dev/null @@ -1,22 +0,0 @@ -idna-3.11.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -idna-3.11.dist-info/METADATA,sha256=fCwSww9SuiN8TIHllFSASUQCW55hAs8dzKnr9RaEEbA,8378 -idna-3.11.dist-info/RECORD,, -idna-3.11.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82 -idna-3.11.dist-info/licenses/LICENSE.md,sha256=t6M2q_OwThgOwGXN0W5wXQeeHMehT5EKpukYfza5zYc,1541 -idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868 -idna/__pycache__/__init__.cpython-312.pyc,, -idna/__pycache__/codec.cpython-312.pyc,, -idna/__pycache__/compat.cpython-312.pyc,, -idna/__pycache__/core.cpython-312.pyc,, -idna/__pycache__/idnadata.cpython-312.pyc,, -idna/__pycache__/intranges.cpython-312.pyc,, -idna/__pycache__/package_data.cpython-312.pyc,, -idna/__pycache__/uts46data.cpython-312.pyc,, -idna/codec.py,sha256=M2SGWN7cs_6B32QmKTyTN6xQGZeYQgQ2wiX3_DR6loE,3438 -idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316 -idna/core.py,sha256=P26_XVycuMTZ1R2mNK1ZREVzM5mvTzdabBXfyZVU1Lc,13246 -idna/idnadata.py,sha256=SG8jhaGE53iiD6B49pt2pwTv_UvClciWE-N54oR2p4U,79623 -idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898 -idna/package_data.py,sha256=_CUavOxobnbyNG2FLyHoN8QHP3QM9W1tKuw7eq9QwBk,21 -idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -idna/uts46data.py,sha256=H9J35VkD0F9L9mKOqjeNGd2A-Va6FlPoz6Jz4K7h-ps,243725 diff --git a/venv/lib/python3.12/site-packages/idna-3.11.dist-info/WHEEL b/venv/lib/python3.12/site-packages/idna-3.11.dist-info/WHEEL deleted file mode 100644 index d8b9936d..00000000 --- a/venv/lib/python3.12/site-packages/idna-3.11.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.12.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.12/site-packages/idna-3.11.dist-info/licenses/LICENSE.md b/venv/lib/python3.12/site-packages/idna-3.11.dist-info/licenses/LICENSE.md deleted file mode 100644 index 256ba90c..00000000 --- a/venv/lib/python3.12/site-packages/idna-3.11.dist-info/licenses/LICENSE.md +++ /dev/null @@ -1,31 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2013-2025, Kim Davies and contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. 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. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 -HOLDER 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. diff --git a/venv/lib/python3.12/site-packages/idna/__init__.py b/venv/lib/python3.12/site-packages/idna/__init__.py deleted file mode 100644 index cfdc030a..00000000 --- a/venv/lib/python3.12/site-packages/idna/__init__.py +++ /dev/null @@ -1,45 +0,0 @@ -from .core import ( - IDNABidiError, - IDNAError, - InvalidCodepoint, - InvalidCodepointContext, - alabel, - check_bidi, - check_hyphen_ok, - check_initial_combiner, - check_label, - check_nfc, - decode, - encode, - ulabel, - uts46_remap, - valid_contextj, - valid_contexto, - valid_label_length, - valid_string_length, -) -from .intranges import intranges_contain -from .package_data import __version__ - -__all__ = [ - "__version__", - "IDNABidiError", - "IDNAError", - "InvalidCodepoint", - "InvalidCodepointContext", - "alabel", - "check_bidi", - "check_hyphen_ok", - "check_initial_combiner", - "check_label", - "check_nfc", - "decode", - "encode", - "intranges_contain", - "ulabel", - "uts46_remap", - "valid_contextj", - "valid_contexto", - "valid_label_length", - "valid_string_length", -] diff --git a/venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 28beec43c5b5bb47375849aeede3dcc8cccf68b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 874 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 diff --git a/venv/lib/python3.12/site-packages/idna/__pycache__/compat.cpython-312.pyc b/venv/lib/python3.12/site-packages/idna/__pycache__/compat.cpython-312.pyc deleted file mode 100644 index 38d14f35c9777e8500231f046c5af18ad8cefe2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 878 zcmb7Cy=xRf6rb6z`%3%@N`geTu~hqI$of7g> zgUPVYgYk0=jtC=+CM2a@ni^e$5@s+nF;lB+rFPdwY=OgUsO?(Jd1rO&hz+PgW7n9& z^T;^J)R1YiI#6b_2I3~-R?+ZUC;BqaD9tu6N_(5ff}dbPddXoB2?nJDyz+Ju?m$vH z5>!v}Nbi~q69YZRvuKWpy5L@ukLU3wIi`U}Wes;6Q&~rsYsx*{@b^Uue#})8`I!_i zAX2#w4pVXH9{@k_lX%C^3bilz>eAg6KaUkGW?}R)+=JYY84vwPq*<-TH6q+~Wd+Tcd_WS!oYj%v7{D1wjg~#v(I;Ye*&+3=c7?zDKf#PYM) zyYjL&S2RoW;NR|JbfVW=>KVbSh0dd(?XD~@-*cIO+~q>KJryT$4lWN<$RuPgN~J_3 z5|5TMfl!?^OCSZVfIXH{NGy2+gX~qlBK;tqq^nzOp8jc)B1WUSTBJG zavl@te~>>zGcqZqKgj$q;*K0j=lZK7f^M)j)^1eSOWT9B58m+Rov+syD)Q6J1sTx3 Osn-HJuzpv*dcz-Ru)@;- diff --git a/venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc b/venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc deleted file mode 100644 index 648c1f56612f009f2ce18d981bc2fd470bdf0cb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16186 zcmd6OTW}OtmSASR-%q_Cs3d_z0YZQPyRqFM^x!3gjf5NIw&hY~N-9yR5?Lvb)TOb^ zICh1b7#C(HD6ff~>S=aXjC*&O>5d+E%*=*&JTcL+-5*&>IaFk8W0`2?gRdzpZG@MJ zo!xV8KB^>yAHCfXdlhxx_uO+&-gEA`=N|pS>9kQ096voC`7do0^=mAs!Kq|c=X4Zx zi()8-j#2}1N)OPatQ*ils*CE!4FiU8ZoHBV||BWY^>`ey;AEYwRWg=ux_o^Lu#E+>nf`Cl3F*^ zdWvd&jFgpB9Si4n$Zeg|o^aki{WJ>|t#$mmTErHYoqqZtD;X0e4 zyzS|}WX;>5t%=#k1OfLQ0DUK!p>){7?1CAZt(5%7v;m#g&(#7wcf+qRs$$r|w8E(E z%9#CMItFQOWA;G*;4~dP@Cdg-Z%`*$&P?!;cq|l^jOSvId4$_0NK2Lo6ALjRJ_LDh zB*t^0*a({#498=9C=z>QgUfccaxvT&DH-GTYfBS>i!%)_OvJa_M z4^-WvSPFML>~wlSKdlSuCF_aK-u5nzi*qvvj)oF!fSn4n1gXGqoC}1a(E#>nVPoMq z6N!xkI5ryMStc;S#fPHoc%t{NL9z@E#zN!l;Gkq192}1`lTpk&1_v)qhN4P~d2o=4 zhX)7mQmcsElT)pu@o}~l78eb-0iCmCLSRi_bx^FoAz+mCLYST9&ixU@pG{Qt= z(!9{6QRT`g8w(6U3kL|3ZwDl~GzrCVHpV9cA&w2i;(QW`FC*i_ zT!|WCM#H#E!x*c-5yqYqvCE-ogz1Pg>_i;MI`iTNq(cEFl7J5yzXG2RzU?IJyJ$R2 zz9xKJc~l^h2uvoPg>@NXjZsxG*4-M`*z}FCF5ifC2W)Y6il6D&fIL6S2G${oG$soU zL}CHCm5dBT_%B}r%4-gz0Q@w{pVroZO_DA=A(=RqpX6d;m4%?5GQv*}ztw*a(JhMC z+Q#5u*%)~2O+u1V4+J%xrIR#6U)&D31dE`U)DeaB%b+CeJjwzR7@Z3HD!}feg8E(# zk(vpdi(QPxufzi3(GV93^DKuXn~X(}oL+1`dX!p+tgffa)grC5}KeN3B@=%a+=#rS^6> z)9~SlXla^j&zUXr?N=|axT}`kby;`a9ew8L56w&N?JK?-q4u!oJ0dua3)2*T6&}A83574fqu?ZAY!hlHXC2WI{#Gu@XYlg<%*kKDqKm&Wt?Y@lf!|&V~U2Zym88bBO$QZ9U}*K@1IoHy$ucn+o5t@82Z)KtZuTzC z!EU1xI9mB&)m$90de_@A+%br%sCYI>As!5c@K$7 zVz~E;_d)>~;JZ%XJ9=6-tq&S{A039C-TilINgrinK&HJoZxKp9B4-B4T!YYMgdgRe zgFc6_pN!v%**1UR_h(W^ufCOYm*nhj`BOUJsvk>KoGzh$+rx&wf0j%JeP;GB-p zj7~vUKWzvadmsHPjCl0FA?ohu_Co@@5HaSShiKg{^vifBcn&d85PuPR9l@R`=U_X^ zh=0&?qi-R+Xx>+hy)`__hA$3Ad2SuI;qgi~4k-!+nG)bq{Q526yD+z_Ko7AiGs}MmR z8X4nd_@>uSFs51E^&SJ2)Ft#uIzdmHz5*|bF%yZPFdf0pa+%`v0Lc{F36QM>S3S_d z6l*NP*!FcXR`FERt8g;Rni*==@=Us>ej~b?xMP5?{W8r}72)aF3{RkONC53sXO~KOMZVt~4iJIA~9*{*!U4);;Qc_8$24_LE~4xbO&o-81u2cZ5su#X3t7wDC!38e%~q)3ivO zuxD4`ENW)$JwaOm8g~>y>biR2*C**Z;MdhJ>CQm;Xs@L2?K?elOi`l>0EzZqP?*-E zk1GoWxX8#T-@?aRqUBee(0+c z0)5MYfox!4>9s-OO;&tuSQx!12BM;GTyTs-KcOPHXb-h3kKD(6{Ca1)$(_-0-;F*DLLQPxN-Il9syy3`stJ3VEw=q|@HRXV& zbkCxD`~C8UT*J;Aryi6yWFlgD>&lj$!mc;PEg_*Ils8eHN+Ixa*8TEIS>v;2NT15O zn+p?&WP%%x{An6i@c3n#a#XC~@_R+s8NqVqfub9%Q(EvqBuDD2kSW#%HoI295i2XH zih!0&pe5jC!d|#8Fq#OzN)ye2$SH|Ft@6SUI}(X0+yMMsUx!#fs5mLQP6?J%svfnDR!Ap8t2ZHo`Y;0;QWe$ z7a-EFjbj3#7!%kJGDbZz2<4y9Esy>WgqffWf*be>$N0r+3FLm8mAs)Qveq9hdW%c6_wG+tBT4D0Tg*;Ygq zI2z%I>ctyEG%^F06gYLep%my)H=;GBG_so$NYPzm!(na+F#dN)8u;?+=Bvq?QC4<| z<{b;{qPdN%|FGyfB3O>(^^|45tiS8w1FqA3QJWx}@6TXY6q6xIDK|%DBhBiPpcmn0 zOVOMU?)tJ4-%!vt3tJAyGWr=CMHOqBs0KO!Q0rZVwOf`!aHLSzRuo*t60T+5PW))8vyX!BlYt@*kXoOWAF{}gq&A=FD z^)wa39}PO29&~ch)}LA-;K;jGL<`!!y3Jt4ul;|qVw<|UXRg>NuQ;jiqi9%fABC&# zgBuBBCp6st+ubeG#%W{F(Hn6D;CMh;M%3Q^Ztiu+OLRZcktDj4XnqkV^a@(IZP>2? zJCqMzj&Pyz&_>&iWF$su*&yN^1B)YGGKuOU=|@4DCRrs4BP2_BVi5G5NmkOu zFG_Soa;zJLmK9mwk+mI{tQ(=t8w`SDTpZf}7=DQ;uo#>nZeQv^+JEEF_ura3{=n=` z9Td%#IlC+6efPN)Vn*s(Xav=y`3JpXpiOk|UwZz`qWes)y!wIDH?LdqmZcKuS8iO% z=rTt|Z}aDr#acGszEa(|T)j72y?43#K(_k8Pr@H>`-J}4_8*Un)t&P_Id}E#M5gV- zsYN*PJry}`?VZL<_=nqn)NxP$(Q%>vK-PO8S6Z3U-S?FKqo*|Q1(=UZD334auUJ1T zSh>1>XcN6Vf4lSMU{X+8eDhWiV&1Zx+Y32AV3GHcT0$o{5WW_jz!ZSMN@Y=K)gA`I zC;-)1YbB>DmdsxwvEu z1a|3D{Q%QqF{bnbAv0|PjLc-zz9jt>SOhk2CzcssLFZC%Q|5$sKx8-weXs(UjhG4& zM#$O7ycHU&KMg}U4jB6e7!ERWf06=`2X@6-L(;%FNgaLNT7-##aj7E{mFw!=TD@~! zy+^C3ukQw$8x4Rp<4x+xw*r$tXJmXAF>Sa5=BQ zZ%I?vYXG*9@vnnT`pB?>TDU$Lw)ZPw6Pz}}CRhANe+9HJ2)##9DE4@b6yb1Cu z62SXA#DDMH$8Dc@fA-v8 zydm!G{JCjyZ!ZW$VDtx8Z|c=WYc&XlKlG>0-K)mIrhs#!mHi8VOTSfa$d0KYbGkS9qulgJ%5%e zJnc-wwA zc=J2exf%QKW(EVr*7+fcb|H#loy)9Gd3Ygk;4e#Brf%$;7aTKT+f5EA|k4Fk)vQ<{a)67Rh;s@=Lx4 zc(opSvc^9a|w;VSd>FvzLiXqZpmf~(cH*bMA z-1PZ7Q_Icm+2;07wr879E!lf=j*=DUmh{w*DwcyC*&(*dm~e4I9KIx0aI1P=<#Wmi3oNV4m7HBJxsWZnuu@T* z9{te0;9t0OxBMqt?@j)ACx9p|Th$wIYJ=C8*Taw}2?u<+zkA`OZlCTSd@mex8rRwR z@U$dn>KbHjfp6AVy?oCW>+st736cd>EfPS&Dz}Jr4@27NB|A=lY|_joAe+E2ae;~% zROwNWQ^gXE$EA?4nUMm|62R^o;(?YiV<-`hL}pyFZH$k{1JQVF1TN?(yCu_PlyCvO zvB~aFk`LU-kO#ZaT}yV>AUq&!-HuB`f2^hPxEoLIJV-o9dS&3|vnQoZ7?&+J@s?_TkN#e0|NYY`kR zId_#{srq8YUi&#k8=dzpj=UbyC-8`1^rVbShO!l3;Lf)e&WVj}Szp`SsfYI3^u;B+ zY?RzCx`Kiw_`qH!7|If80lM0Dkou{$U8n!AG!5~(O@kyRo2CSg*l(hUCH!QAeYq+| z$LyP31JRdfGh5n6fD8uGuGy~SI*fUbnpd|a*A5p^P4#-ZodL%yga+GJQ@+;w{fueq zmkPUBnPg#wipquwGsjxwn)eiY$=1Ic!cmvaU ziWP$OeZ#s7&|hUo7^f+jz^o1!SD=h$o4iV^{ezZX?%x1uW)7SVMbQNXeBs(#2m|bb z^F8pg;x`juqmhvacsRoQAQ+(F=pK$w#u#EW9o_2VtTG_z z)kEq27H6*(6?n1ORw?4>F8HhbrSP}{m>-;>uF;DN5H?vHnUuq$&#tZKb>YRyKK z*QC2{M(6Dhe6`EI#;mVV^ug0y4&Q8Qv*y~{u_bd$uB`q}{2E4abt~kom#wEuV zu(G||lQ%-mzpOREvm1(=oy4*q6kP-^$eo=}5_nTcdppXgzkA->v5)$+tgNF||LJZT z<9(%_W<4lB@o{jp#ZSPr4RYYmnvl?!CnkFUgre(gV7RG?(4mOX!S|>rH4aWM=rvyK z_)^%&VB7d3(oLPfo0XR6yri^k!i<7()*$Q`8ReZt?>lWN3 zG{Ls1$GsaIh=5KQh%nL4W94?CiC@Mwrrmhu{umd8Zc-B(;8H@9Tc9RT3g7SPTc9Rj zJTphnvMuAG3E3-E^|>T(gXpI!yJH1HVQ^k19@TIsIM?5|{~)?lhuH)uTw5$-o`03wNgl^Z5$8}}+nPjJ77jc-B(q6W4ZRnXNX z(@-PXBb-Ar#V7fR zN$?fJf&qO^B^xRsgTxzIvXGT<@hjlL$%pvKgk%S&i6~r)h~G5w5HW|zk)rC8F@xY* z9h%_&1N7)YQT8n&%Kpi)^?}np*Zr_`OZu`{3N8=jpr>2G<)MG2v?5({^TNC>uPe2> za^-=AnU6abTMz%B>hE7&?)px)>pQ~vkif)*iG&d5#jZ(VYC79Boh_f4Kb|YC1=H7S z^WC{%%ls*PWO)Ajvl)8PU7y?1l)3c5#gzSlr!3w0zB5-+l@7mu`tB|@v*Y7x;afe} zy7h+ZhAHQ*5xm=Ta_3CbLdT!9{LJ=qlW_Lje{*IBhOytytY;f`EKj$+U%OHkxEU2Z z4PWG&VI^z(C`b9SJ&?5rGNlV9(cUT;TEAGcQ=Y2NDZSOT;%g{Y-3P>DU?+QBcr%n8 z2oVp9m>7IZ8ai~kPjxSJykx}B!9`$4z?B%bT3Az3f!vxl^{+tk zXK7O^+a;V}gu!h|0zS*DEwk{p#W{=3SRkqlDhth`kTi}^vnCJ`K2Y*;D{Kgbr~FxS zthAtPZ`QZKq~Mii1~Fr1j3e^HL$NoQCTKzFH!IEnMq)-cV)-SCvA|2G83grC5Nwtr zwO$jMur3NPHf<(Q3Rr-#yP@z}%V@8kSMjye2nN7S$1~bHA{-+2F-<2d5GJXu0Q9ON z5tTHmbYFMLaj04tIztc-c&k+GG1Vs+&z`rCEz#E3rb9eU>dN+}2PaLxSMLu$gg4O>-vB}8S8xGwx1uFoPXMxe3{cE+y$<6Kj{BPGY%`B^gndP;^Mf#6&d0gOj@A>W(hC36L%1 zb|aZW6BD4nNd`2}a4*6DaOc_%3HPTM{YQ)n0`GY!;{OLECZoJ$B3LGf=_2v8+m@`| z!6t(DZIE82M0%~ED^)6V+rMP5&Fl2m5qbp-_U)-FH{J8?k4==tiAoKfK9os{j{WmA zs5amth4Svc*_reDZk69CPy27yTr)lN)-QXTv)<+fTJ-LiH{G{`B|oD}^Y6cbRt}fw zY8EWbIkR(q=H5zcH4lB&>C>Wbhv3+ew?ogz4$4xJv$)=KUUR0xOO~pf#qpl?nl;rVS}Nz-SL|ET zmomGS?6M<|qIePi{V&!I5RHw-)#Ck-6@9~kV;F9OQ1c{#eE+_qqnY}&xwPX&eOTL{ zP_Id%e;|?wBn|Ed5|UKG#IEgp$JducU^rK#7Lh~-kVHmMY|41tIwWj%w=3{Bc>SUg zUo*L@qlz7nK(?7c5}CeI5}9O41W$yJBQgk7D@6vGi)4_dq$o1T`2Qe-3?PFx9nWaD zLXbg*O=XbQ<2R5fHbtUTX!oPOjuR))@khBRb#r%tm_$f$e}*~qSm@_If*AZ`$sOuH zVfBB;NMm&F9v1%`BXR}$3(Wl`L|`@9jG>X2xgTTn6O8skME)yC)kcUaLT+3n`XglG z$IuDvAP$3ZKfYSk-|ky-*FTGcCq+lgIu5pbSJpA@HPeFvM?aH;fv+3hJ@i{--k~K6 zIs%aY^XL}s)q6duhw+fsZZ^t9RYoi?hfku zyMu;q2thqYJGk3G8A%6H71c$_1pXkP&T`0L9P+dLF-_QJ)&8%M{Cf>Ig3Wl(mCW#O zL=%xHD}Tup)|0PWg1It`@X8NvweXLT4OqloAQ^_@@hEwAm2cK9*s=#BVje@0PK?a5 z^&0)x?(e$q<=dUR1uPERDpc?*(D*Nx$_6Jqf0#%;#R?N9_{@T>OTZe8O61E%?{VxcV zXUzm+Fy&aIAX#%@{zOrJx{yytNIvf{($2I$PeGFLuVRw-(DV^H)t09)&FJNH!LUlo zc?(SkQZN9LbSc&aNY#8FsY>-JReIV354~LrZJCqVEvh00o>O$?V5< zc=8?{-A<1NuCO^{#{B=T-kc%9Cb*W@at(db>{_;GIgtuywebtG%vjw=1tpU2` bDWFhCfI_MO#heTjb2iFkU9&@uY~}w8ccB?T diff --git a/venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc b/venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc deleted file mode 100644 index ab80e3bcd04b3c21ded520a8d1c5ad48ff4ee0e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100903 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 C%bJV; diff --git a/venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc b/venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc deleted file mode 100644 index bace91da07b1d8c6bb2437df8c126a8fc2d67818..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2626 zcmZuyO>7&-6`uX0Xi}6!36|uaSR=~~vI_IOG=jE0e0uT zc|Y^!&G+7Xn@S}JjP9@gV&Co}k+e)GJWi4cIi}eufrJi_vlk7sqG35-XG) zr=o+ZUo;(uy5-_6#!>2c?lk3P*G~YG_gtUl%K^B3!B^fZmdXJGW6nyP`OFQ>!1i1; z4`vuGc)XYxANK>32S+lLxz-UqLnHpE;E(Dwo6YK3dTj>db^W`rIhx)nGhetmc-Qpl z9BsQ#*sc(J+@7{w(-8-J?;ylP1G~uRrE$lb9v>5N>v}fv3@_@UE{E!Q$V8}JE0-J= zYM2%yjByr}xtq;H#rhpxqt}^F zk$>DEWI?T}mOKw?uhN~B3E}-!sj4D4aE^2ZaO8P_;_NtRNcUa`nG(r5I(x~2R+SN? zFOOhXXQirHitwyiQrjnp9>K0SI+04GsxBz^{-%;38A%`(xg)(wbk*DkNx0IvZMgZD z5k}#<089)n(9JVM0yo`h=Km={VYI98kk|gst7YoI3_^%F1G^~N_LpampO;BiyZja zmoUwg{`S|2893zxq{_)pl(=`Br zSre{n!nRx!t)qRjrAj!k#TfH_94J}E{WcSjYskV|4w{u}1Oh z_t)P(^Udh`+vhe0&wm%c(A+(^oM@$BKM1Qky)yXOi8Xb269OfnCcqIYa0~f%5#TyO zT9ki35cf$H`uaTZRcRi|3kpEK_>6+&Ay9l62#&?%qZOrmH!k#aeg{#KhTkG-!tPg= z&((74$pdTZ0X_t)p~QDI9^6&zj45sJ4CMaG=~qUzfGiBl|K zylA`701EUbrsO6q!1L(i#(P1f>1Ji%oLV441u;Vy>MhB+t zavgNufY1LI{1(a2slByh_4Gz+Z1MEdMBn#`{p*SSwHx&t8;Q)~$ySWSlS`NXefR0$ zSpD>B4r=fCgG(EO$Ci^z>Jn=vdsmKqmmI16;Yo6&IWW{xNH-NW_pU-ceek4f_-X%0 zJy!Q0Bscmq%Uxh(3ZqXaLA{ym6R^^gVV7Z8UfwV`mIWNLQi2Z45mOwY5-NBQL}ye$ z2-r})<#~=ckAS&wC64`De6r|SWrw}Xv!IAL@t5G&QY1DtK_foXO3s^2)dI`?oyu#d0(imM{h-vQ&0o{|6n diff --git a/venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc b/venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc deleted file mode 100644 index ccda5809ffe94cbae559c38ecdf7a7d0edcb3f7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205 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 I_CfXk1IBbR{{R30 diff --git a/venv/lib/python3.12/site-packages/idna/codec.py b/venv/lib/python3.12/site-packages/idna/codec.py deleted file mode 100644 index cbc2e4ff..00000000 --- a/venv/lib/python3.12/site-packages/idna/codec.py +++ /dev/null @@ -1,122 +0,0 @@ -import codecs -import re -from typing import Any, Optional, Tuple - -from .core import IDNAError, alabel, decode, encode, ulabel - -_unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]") - - -class Codec(codecs.Codec): - def encode(self, data: str, errors: str = "strict") -> Tuple[bytes, int]: - if errors != "strict": - raise IDNAError('Unsupported error handling "{}"'.format(errors)) - - if not data: - return b"", 0 - - return encode(data), len(data) - - def decode(self, data: bytes, errors: str = "strict") -> Tuple[str, int]: - if errors != "strict": - raise IDNAError('Unsupported error handling "{}"'.format(errors)) - - if not data: - return "", 0 - - return decode(data), len(data) - - -class IncrementalEncoder(codecs.BufferedIncrementalEncoder): - def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[bytes, int]: - if errors != "strict": - raise IDNAError('Unsupported error handling "{}"'.format(errors)) - - if not data: - return b"", 0 - - labels = _unicode_dots_re.split(data) - trailing_dot = b"" - if labels: - if not labels[-1]: - trailing_dot = b"." - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = b"." - - result = [] - size = 0 - for label in labels: - result.append(alabel(label)) - if size: - size += 1 - size += len(label) - - # Join with U+002E - result_bytes = b".".join(result) + trailing_dot - size += len(trailing_dot) - return result_bytes, size - - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - def _buffer_decode(self, data: Any, errors: str, final: bool) -> Tuple[str, int]: - if errors != "strict": - raise IDNAError('Unsupported error handling "{}"'.format(errors)) - - if not data: - return ("", 0) - - if not isinstance(data, str): - data = str(data, "ascii") - - labels = _unicode_dots_re.split(data) - trailing_dot = "" - if labels: - 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(ulabel(label)) - if size: - size += 1 - size += len(label) - - result_str = ".".join(result) + trailing_dot - size += len(trailing_dot) - return (result_str, size) - - -class StreamWriter(Codec, codecs.StreamWriter): - pass - - -class StreamReader(Codec, codecs.StreamReader): - pass - - -def search_function(name: str) -> Optional[codecs.CodecInfo]: - if name != "idna2008": - return None - return codecs.CodecInfo( - name=name, - encode=Codec().encode, - decode=Codec().decode, # type: ignore - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamwriter=StreamWriter, - streamreader=StreamReader, - ) - - -codecs.register(search_function) diff --git a/venv/lib/python3.12/site-packages/idna/compat.py b/venv/lib/python3.12/site-packages/idna/compat.py deleted file mode 100644 index 1df9f2a7..00000000 --- a/venv/lib/python3.12/site-packages/idna/compat.py +++ /dev/null @@ -1,15 +0,0 @@ -from typing import Any, Union - -from .core import decode, encode - - -def ToASCII(label: str) -> bytes: - return encode(label) - - -def ToUnicode(label: Union[bytes, bytearray]) -> str: - return decode(label) - - -def nameprep(s: Any) -> None: - raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") diff --git a/venv/lib/python3.12/site-packages/idna/core.py b/venv/lib/python3.12/site-packages/idna/core.py deleted file mode 100644 index 8177bf7a..00000000 --- a/venv/lib/python3.12/site-packages/idna/core.py +++ /dev/null @@ -1,437 +0,0 @@ -import bisect -import re -import unicodedata -from typing import Optional, Union - -from . import idnadata -from .intranges import intranges_contain - -_virama_combining_class = 9 -_alabel_prefix = b"xn--" -_unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]") - - -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: int) -> int: - v = unicodedata.combining(chr(cp)) - if v == 0: - if not unicodedata.name(chr(cp)): - raise ValueError("Unknown character in unicodedata") - return v - - -def _is_script(cp: str, script: str) -> bool: - return intranges_contain(ord(cp), idnadata.scripts[script]) - - -def _punycode(s: str) -> bytes: - return s.encode("punycode") - - -def _unot(s: int) -> str: - return "U+{:04X}".format(s) - - -def valid_label_length(label: Union[bytes, str]) -> bool: - if len(label) > 63: - return False - return True - - -def valid_string_length(label: Union[bytes, str], trailing_dot: bool) -> bool: - if len(label) > (254 if trailing_dot else 253): - return False - return True - - -def check_bidi(label: str, check_ltr: bool = False) -> bool: - # 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 {} at position {}".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 {} must be directionality L, R or AL".format(repr(label))) - - valid_ending = False - number_type: Optional[str] = None - for idx, cp in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - - if rtl: - # Bidi rule 2 - if direction not in [ - "R", - "AL", - "AN", - "EN", - "ES", - "CS", - "ET", - "ON", - "BN", - "NSM", - ]: - raise IDNABidiError("Invalid direction for codepoint at position {} 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 direction not in ["L", "EN", "ES", "CS", "ET", "ON", "BN", "NSM"]: - raise IDNABidiError("Invalid direction for codepoint at position {} 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: str) -> bool: - if unicodedata.category(label[0])[0] == "M": - raise IDNAError("Label begins with an illegal combining character") - return True - - -def check_hyphen_ok(label: str) -> bool: - 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: str) -> None: - if unicodedata.normalize("NFC", label) != label: - raise IDNAError("Label must be in Normalization Form C") - - -def valid_contextj(label: str, pos: int) -> bool: - 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 - elif joining_type in [ord("L"), ord("D")]: - ok = True - break - else: - 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 - elif joining_type in [ord("R"), ord("D")]: - ok = True - break - else: - 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: str, pos: int, exception: bool = False) -> bool: - 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 == "\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 - - return False - - -def check_label(label: Union[str, bytes, bytearray]) -> None: - 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 {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label)) - ) - except ValueError: - raise IDNAError( - "Unknown codepoint adjacent to joiner {} at position {} in {}".format( - _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 {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label)) - ) - else: - raise InvalidCodepoint( - "Codepoint {} at position {} of {} not allowed".format(_unot(cp_value), pos + 1, repr(label)) - ) - - check_bidi(label) - - -def alabel(label: str) -> bytes: - try: - label_bytes = label.encode("ascii") - ulabel(label_bytes) - if not valid_label_length(label_bytes): - raise IDNAError("Label too long") - return label_bytes - except UnicodeEncodeError: - pass - - check_label(label) - label_bytes = _alabel_prefix + _punycode(label) - - if not valid_label_length(label_bytes): - raise IDNAError("Label too long") - - return label_bytes - - -def ulabel(label: Union[str, bytes, bytearray]) -> str: - if not isinstance(label, (bytes, bytearray)): - try: - label_bytes = label.encode("ascii") - except UnicodeEncodeError: - check_label(label) - return label - else: - label_bytes = bytes(label) - - label_bytes = label_bytes.lower() - if label_bytes.startswith(_alabel_prefix): - label_bytes = label_bytes[len(_alabel_prefix) :] - if not label_bytes: - raise IDNAError("Malformed A-label, no Punycode eligible content found") - if label_bytes.decode("ascii")[-1] == "-": - raise IDNAError("A-label must not end with a hyphen") - else: - check_label(label_bytes) - return label_bytes.decode("ascii") - - try: - label = label_bytes.decode("punycode") - except UnicodeError: - raise IDNAError("Invalid A-label") - check_label(label) - return label - - -def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False) -> str: - """Re-map the characters in the string according to UTS46 processing.""" - from .uts46data import uts46data - - output = "" - - for pos, char in enumerate(domain): - code_point = ord(char) - try: - uts46row = uts46data[code_point if code_point < 256 else bisect.bisect_left(uts46data, (code_point, "Z")) - 1] - status = uts46row[1] - replacement: Optional[str] = None - if len(uts46row) == 3: - replacement = uts46row[2] - 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() - except IndexError: - raise InvalidCodepoint( - "Codepoint {} not allowed at position {} in {}".format(_unot(code_point), pos + 1, repr(domain)) - ) - - return unicodedata.normalize("NFC", output) - - -def encode( - s: Union[str, bytes, bytearray], - strict: bool = False, - uts46: bool = False, - std3_rules: bool = False, - transitional: bool = False, -) -> bytes: - if not isinstance(s, str): - try: - s = str(s, "ascii") - except UnicodeDecodeError: - raise IDNAError("should pass a unicode string to the function rather than a byte string.") - 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: Union[str, bytes, bytearray], - strict: bool = False, - uts46: bool = False, - std3_rules: bool = False, -) -> str: - try: - if not isinstance(s, str): - s = str(s, "ascii") - except UnicodeDecodeError: - raise IDNAError("Invalid ASCII in A-label") - 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(".") - 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("") - return ".".join(result) diff --git a/venv/lib/python3.12/site-packages/idna/idnadata.py b/venv/lib/python3.12/site-packages/idna/idnadata.py deleted file mode 100644 index ded47cae..00000000 --- a/venv/lib/python3.12/site-packages/idna/idnadata.py +++ /dev/null @@ -1,4309 +0,0 @@ -# This file is automatically generated by tools/idna-data - -__version__ = "16.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, - 0x340000004DC0, - 0x4E000000A000, - 0xF9000000FA6E, - 0xFA700000FADA, - 0x16FE200016FE4, - 0x16FF000016FF2, - 0x200000002A6E0, - 0x2A7000002B73A, - 0x2B7400002B81E, - 0x2B8200002CEA2, - 0x2CEB00002EBE1, - 0x2EBF00002EE5E, - 0x2F8000002FA1E, - 0x300000003134B, - 0x31350000323B0, - ), - "Hebrew": ( - 0x591000005C8, - 0x5D0000005EB, - 0x5EF000005F5, - 0xFB1D0000FB37, - 0xFB380000FB3D, - 0xFB3E0000FB3F, - 0xFB400000FB42, - 0xFB430000FB45, - 0xFB460000FB50, - ), - "Hiragana": ( - 0x304100003097, - 0x309D000030A0, - 0x1B0010001B120, - 0x1B1320001B133, - 0x1B1500001B153, - 0x1F2000001F201, - ), - "Katakana": ( - 0x30A1000030FB, - 0x30FD00003100, - 0x31F000003200, - 0x32D0000032FF, - 0x330000003358, - 0xFF660000FF70, - 0xFF710000FF9E, - 0x1AFF00001AFF4, - 0x1AFF50001AFFC, - 0x1AFFD0001AFFF, - 0x1B0000001B001, - 0x1B1200001B123, - 0x1B1550001B156, - 0x1B1640001B168, - ), -} -joining_types = { - 0xAD: 84, - 0x300: 84, - 0x301: 84, - 0x302: 84, - 0x303: 84, - 0x304: 84, - 0x305: 84, - 0x306: 84, - 0x307: 84, - 0x308: 84, - 0x309: 84, - 0x30A: 84, - 0x30B: 84, - 0x30C: 84, - 0x30D: 84, - 0x30E: 84, - 0x30F: 84, - 0x310: 84, - 0x311: 84, - 0x312: 84, - 0x313: 84, - 0x314: 84, - 0x315: 84, - 0x316: 84, - 0x317: 84, - 0x318: 84, - 0x319: 84, - 0x31A: 84, - 0x31B: 84, - 0x31C: 84, - 0x31D: 84, - 0x31E: 84, - 0x31F: 84, - 0x320: 84, - 0x321: 84, - 0x322: 84, - 0x323: 84, - 0x324: 84, - 0x325: 84, - 0x326: 84, - 0x327: 84, - 0x328: 84, - 0x329: 84, - 0x32A: 84, - 0x32B: 84, - 0x32C: 84, - 0x32D: 84, - 0x32E: 84, - 0x32F: 84, - 0x330: 84, - 0x331: 84, - 0x332: 84, - 0x333: 84, - 0x334: 84, - 0x335: 84, - 0x336: 84, - 0x337: 84, - 0x338: 84, - 0x339: 84, - 0x33A: 84, - 0x33B: 84, - 0x33C: 84, - 0x33D: 84, - 0x33E: 84, - 0x33F: 84, - 0x340: 84, - 0x341: 84, - 0x342: 84, - 0x343: 84, - 0x344: 84, - 0x345: 84, - 0x346: 84, - 0x347: 84, - 0x348: 84, - 0x349: 84, - 0x34A: 84, - 0x34B: 84, - 0x34C: 84, - 0x34D: 84, - 0x34E: 84, - 0x34F: 84, - 0x350: 84, - 0x351: 84, - 0x352: 84, - 0x353: 84, - 0x354: 84, - 0x355: 84, - 0x356: 84, - 0x357: 84, - 0x358: 84, - 0x359: 84, - 0x35A: 84, - 0x35B: 84, - 0x35C: 84, - 0x35D: 84, - 0x35E: 84, - 0x35F: 84, - 0x360: 84, - 0x361: 84, - 0x362: 84, - 0x363: 84, - 0x364: 84, - 0x365: 84, - 0x366: 84, - 0x367: 84, - 0x368: 84, - 0x369: 84, - 0x36A: 84, - 0x36B: 84, - 0x36C: 84, - 0x36D: 84, - 0x36E: 84, - 0x36F: 84, - 0x483: 84, - 0x484: 84, - 0x485: 84, - 0x486: 84, - 0x487: 84, - 0x488: 84, - 0x489: 84, - 0x591: 84, - 0x592: 84, - 0x593: 84, - 0x594: 84, - 0x595: 84, - 0x596: 84, - 0x597: 84, - 0x598: 84, - 0x599: 84, - 0x59A: 84, - 0x59B: 84, - 0x59C: 84, - 0x59D: 84, - 0x59E: 84, - 0x59F: 84, - 0x5A0: 84, - 0x5A1: 84, - 0x5A2: 84, - 0x5A3: 84, - 0x5A4: 84, - 0x5A5: 84, - 0x5A6: 84, - 0x5A7: 84, - 0x5A8: 84, - 0x5A9: 84, - 0x5AA: 84, - 0x5AB: 84, - 0x5AC: 84, - 0x5AD: 84, - 0x5AE: 84, - 0x5AF: 84, - 0x5B0: 84, - 0x5B1: 84, - 0x5B2: 84, - 0x5B3: 84, - 0x5B4: 84, - 0x5B5: 84, - 0x5B6: 84, - 0x5B7: 84, - 0x5B8: 84, - 0x5B9: 84, - 0x5BA: 84, - 0x5BB: 84, - 0x5BC: 84, - 0x5BD: 84, - 0x5BF: 84, - 0x5C1: 84, - 0x5C2: 84, - 0x5C4: 84, - 0x5C5: 84, - 0x5C7: 84, - 0x610: 84, - 0x611: 84, - 0x612: 84, - 0x613: 84, - 0x614: 84, - 0x615: 84, - 0x616: 84, - 0x617: 84, - 0x618: 84, - 0x619: 84, - 0x61A: 84, - 0x61C: 84, - 0x620: 68, - 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, - 0x64B: 84, - 0x64C: 84, - 0x64D: 84, - 0x64E: 84, - 0x64F: 84, - 0x650: 84, - 0x651: 84, - 0x652: 84, - 0x653: 84, - 0x654: 84, - 0x655: 84, - 0x656: 84, - 0x657: 84, - 0x658: 84, - 0x659: 84, - 0x65A: 84, - 0x65B: 84, - 0x65C: 84, - 0x65D: 84, - 0x65E: 84, - 0x65F: 84, - 0x66E: 68, - 0x66F: 68, - 0x670: 84, - 0x671: 82, - 0x672: 82, - 0x673: 82, - 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, - 0x6D6: 84, - 0x6D7: 84, - 0x6D8: 84, - 0x6D9: 84, - 0x6DA: 84, - 0x6DB: 84, - 0x6DC: 84, - 0x6DF: 84, - 0x6E0: 84, - 0x6E1: 84, - 0x6E2: 84, - 0x6E3: 84, - 0x6E4: 84, - 0x6E7: 84, - 0x6E8: 84, - 0x6EA: 84, - 0x6EB: 84, - 0x6EC: 84, - 0x6ED: 84, - 0x6EE: 82, - 0x6EF: 82, - 0x6FA: 68, - 0x6FB: 68, - 0x6FC: 68, - 0x6FF: 68, - 0x70F: 84, - 0x710: 82, - 0x711: 84, - 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, - 0x730: 84, - 0x731: 84, - 0x732: 84, - 0x733: 84, - 0x734: 84, - 0x735: 84, - 0x736: 84, - 0x737: 84, - 0x738: 84, - 0x739: 84, - 0x73A: 84, - 0x73B: 84, - 0x73C: 84, - 0x73D: 84, - 0x73E: 84, - 0x73F: 84, - 0x740: 84, - 0x741: 84, - 0x742: 84, - 0x743: 84, - 0x744: 84, - 0x745: 84, - 0x746: 84, - 0x747: 84, - 0x748: 84, - 0x749: 84, - 0x74A: 84, - 0x74D: 82, - 0x74E: 68, - 0x74F: 68, - 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, - 0x7A6: 84, - 0x7A7: 84, - 0x7A8: 84, - 0x7A9: 84, - 0x7AA: 84, - 0x7AB: 84, - 0x7AC: 84, - 0x7AD: 84, - 0x7AE: 84, - 0x7AF: 84, - 0x7B0: 84, - 0x7CA: 68, - 0x7CB: 68, - 0x7CC: 68, - 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, - 0x7EB: 84, - 0x7EC: 84, - 0x7ED: 84, - 0x7EE: 84, - 0x7EF: 84, - 0x7F0: 84, - 0x7F1: 84, - 0x7F2: 84, - 0x7F3: 84, - 0x7FA: 67, - 0x7FD: 84, - 0x816: 84, - 0x817: 84, - 0x818: 84, - 0x819: 84, - 0x81B: 84, - 0x81C: 84, - 0x81D: 84, - 0x81E: 84, - 0x81F: 84, - 0x820: 84, - 0x821: 84, - 0x822: 84, - 0x823: 84, - 0x825: 84, - 0x826: 84, - 0x827: 84, - 0x829: 84, - 0x82A: 84, - 0x82B: 84, - 0x82C: 84, - 0x82D: 84, - 0x840: 82, - 0x841: 68, - 0x842: 68, - 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: 82, - 0x857: 82, - 0x858: 82, - 0x859: 84, - 0x85A: 84, - 0x85B: 84, - 0x860: 68, - 0x862: 68, - 0x863: 68, - 0x864: 68, - 0x865: 68, - 0x867: 82, - 0x868: 68, - 0x869: 82, - 0x86A: 82, - 0x870: 82, - 0x871: 82, - 0x872: 82, - 0x873: 82, - 0x874: 82, - 0x875: 82, - 0x876: 82, - 0x877: 82, - 0x878: 82, - 0x879: 82, - 0x87A: 82, - 0x87B: 82, - 0x87C: 82, - 0x87D: 82, - 0x87E: 82, - 0x87F: 82, - 0x880: 82, - 0x881: 82, - 0x882: 82, - 0x883: 67, - 0x884: 67, - 0x885: 67, - 0x886: 68, - 0x889: 68, - 0x88A: 68, - 0x88B: 68, - 0x88C: 68, - 0x88D: 68, - 0x88E: 82, - 0x897: 84, - 0x898: 84, - 0x899: 84, - 0x89A: 84, - 0x89B: 84, - 0x89C: 84, - 0x89D: 84, - 0x89E: 84, - 0x89F: 84, - 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, - 0x8AE: 82, - 0x8AF: 68, - 0x8B0: 68, - 0x8B1: 82, - 0x8B2: 82, - 0x8B3: 68, - 0x8B4: 68, - 0x8B5: 68, - 0x8B6: 68, - 0x8B7: 68, - 0x8B8: 68, - 0x8B9: 82, - 0x8BA: 68, - 0x8BB: 68, - 0x8BC: 68, - 0x8BD: 68, - 0x8BE: 68, - 0x8BF: 68, - 0x8C0: 68, - 0x8C1: 68, - 0x8C2: 68, - 0x8C3: 68, - 0x8C4: 68, - 0x8C5: 68, - 0x8C6: 68, - 0x8C7: 68, - 0x8C8: 68, - 0x8CA: 84, - 0x8CB: 84, - 0x8CC: 84, - 0x8CD: 84, - 0x8CE: 84, - 0x8CF: 84, - 0x8D0: 84, - 0x8D1: 84, - 0x8D2: 84, - 0x8D3: 84, - 0x8D4: 84, - 0x8D5: 84, - 0x8D6: 84, - 0x8D7: 84, - 0x8D8: 84, - 0x8D9: 84, - 0x8DA: 84, - 0x8DB: 84, - 0x8DC: 84, - 0x8DD: 84, - 0x8DE: 84, - 0x8DF: 84, - 0x8E0: 84, - 0x8E1: 84, - 0x8E3: 84, - 0x8E4: 84, - 0x8E5: 84, - 0x8E6: 84, - 0x8E7: 84, - 0x8E8: 84, - 0x8E9: 84, - 0x8EA: 84, - 0x8EB: 84, - 0x8EC: 84, - 0x8ED: 84, - 0x8EE: 84, - 0x8EF: 84, - 0x8F0: 84, - 0x8F1: 84, - 0x8F2: 84, - 0x8F3: 84, - 0x8F4: 84, - 0x8F5: 84, - 0x8F6: 84, - 0x8F7: 84, - 0x8F8: 84, - 0x8F9: 84, - 0x8FA: 84, - 0x8FB: 84, - 0x8FC: 84, - 0x8FD: 84, - 0x8FE: 84, - 0x8FF: 84, - 0x900: 84, - 0x901: 84, - 0x902: 84, - 0x93A: 84, - 0x93C: 84, - 0x941: 84, - 0x942: 84, - 0x943: 84, - 0x944: 84, - 0x945: 84, - 0x946: 84, - 0x947: 84, - 0x948: 84, - 0x94D: 84, - 0x951: 84, - 0x952: 84, - 0x953: 84, - 0x954: 84, - 0x955: 84, - 0x956: 84, - 0x957: 84, - 0x962: 84, - 0x963: 84, - 0x981: 84, - 0x9BC: 84, - 0x9C1: 84, - 0x9C2: 84, - 0x9C3: 84, - 0x9C4: 84, - 0x9CD: 84, - 0x9E2: 84, - 0x9E3: 84, - 0x9FE: 84, - 0xA01: 84, - 0xA02: 84, - 0xA3C: 84, - 0xA41: 84, - 0xA42: 84, - 0xA47: 84, - 0xA48: 84, - 0xA4B: 84, - 0xA4C: 84, - 0xA4D: 84, - 0xA51: 84, - 0xA70: 84, - 0xA71: 84, - 0xA75: 84, - 0xA81: 84, - 0xA82: 84, - 0xABC: 84, - 0xAC1: 84, - 0xAC2: 84, - 0xAC3: 84, - 0xAC4: 84, - 0xAC5: 84, - 0xAC7: 84, - 0xAC8: 84, - 0xACD: 84, - 0xAE2: 84, - 0xAE3: 84, - 0xAFA: 84, - 0xAFB: 84, - 0xAFC: 84, - 0xAFD: 84, - 0xAFE: 84, - 0xAFF: 84, - 0xB01: 84, - 0xB3C: 84, - 0xB3F: 84, - 0xB41: 84, - 0xB42: 84, - 0xB43: 84, - 0xB44: 84, - 0xB4D: 84, - 0xB55: 84, - 0xB56: 84, - 0xB62: 84, - 0xB63: 84, - 0xB82: 84, - 0xBC0: 84, - 0xBCD: 84, - 0xC00: 84, - 0xC04: 84, - 0xC3C: 84, - 0xC3E: 84, - 0xC3F: 84, - 0xC40: 84, - 0xC46: 84, - 0xC47: 84, - 0xC48: 84, - 0xC4A: 84, - 0xC4B: 84, - 0xC4C: 84, - 0xC4D: 84, - 0xC55: 84, - 0xC56: 84, - 0xC62: 84, - 0xC63: 84, - 0xC81: 84, - 0xCBC: 84, - 0xCBF: 84, - 0xCC6: 84, - 0xCCC: 84, - 0xCCD: 84, - 0xCE2: 84, - 0xCE3: 84, - 0xD00: 84, - 0xD01: 84, - 0xD3B: 84, - 0xD3C: 84, - 0xD41: 84, - 0xD42: 84, - 0xD43: 84, - 0xD44: 84, - 0xD4D: 84, - 0xD62: 84, - 0xD63: 84, - 0xD81: 84, - 0xDCA: 84, - 0xDD2: 84, - 0xDD3: 84, - 0xDD4: 84, - 0xDD6: 84, - 0xE31: 84, - 0xE34: 84, - 0xE35: 84, - 0xE36: 84, - 0xE37: 84, - 0xE38: 84, - 0xE39: 84, - 0xE3A: 84, - 0xE47: 84, - 0xE48: 84, - 0xE49: 84, - 0xE4A: 84, - 0xE4B: 84, - 0xE4C: 84, - 0xE4D: 84, - 0xE4E: 84, - 0xEB1: 84, - 0xEB4: 84, - 0xEB5: 84, - 0xEB6: 84, - 0xEB7: 84, - 0xEB8: 84, - 0xEB9: 84, - 0xEBA: 84, - 0xEBB: 84, - 0xEBC: 84, - 0xEC8: 84, - 0xEC9: 84, - 0xECA: 84, - 0xECB: 84, - 0xECC: 84, - 0xECD: 84, - 0xECE: 84, - 0xF18: 84, - 0xF19: 84, - 0xF35: 84, - 0xF37: 84, - 0xF39: 84, - 0xF71: 84, - 0xF72: 84, - 0xF73: 84, - 0xF74: 84, - 0xF75: 84, - 0xF76: 84, - 0xF77: 84, - 0xF78: 84, - 0xF79: 84, - 0xF7A: 84, - 0xF7B: 84, - 0xF7C: 84, - 0xF7D: 84, - 0xF7E: 84, - 0xF80: 84, - 0xF81: 84, - 0xF82: 84, - 0xF83: 84, - 0xF84: 84, - 0xF86: 84, - 0xF87: 84, - 0xF8D: 84, - 0xF8E: 84, - 0xF8F: 84, - 0xF90: 84, - 0xF91: 84, - 0xF92: 84, - 0xF93: 84, - 0xF94: 84, - 0xF95: 84, - 0xF96: 84, - 0xF97: 84, - 0xF99: 84, - 0xF9A: 84, - 0xF9B: 84, - 0xF9C: 84, - 0xF9D: 84, - 0xF9E: 84, - 0xF9F: 84, - 0xFA0: 84, - 0xFA1: 84, - 0xFA2: 84, - 0xFA3: 84, - 0xFA4: 84, - 0xFA5: 84, - 0xFA6: 84, - 0xFA7: 84, - 0xFA8: 84, - 0xFA9: 84, - 0xFAA: 84, - 0xFAB: 84, - 0xFAC: 84, - 0xFAD: 84, - 0xFAE: 84, - 0xFAF: 84, - 0xFB0: 84, - 0xFB1: 84, - 0xFB2: 84, - 0xFB3: 84, - 0xFB4: 84, - 0xFB5: 84, - 0xFB6: 84, - 0xFB7: 84, - 0xFB8: 84, - 0xFB9: 84, - 0xFBA: 84, - 0xFBB: 84, - 0xFBC: 84, - 0xFC6: 84, - 0x102D: 84, - 0x102E: 84, - 0x102F: 84, - 0x1030: 84, - 0x1032: 84, - 0x1033: 84, - 0x1034: 84, - 0x1035: 84, - 0x1036: 84, - 0x1037: 84, - 0x1039: 84, - 0x103A: 84, - 0x103D: 84, - 0x103E: 84, - 0x1058: 84, - 0x1059: 84, - 0x105E: 84, - 0x105F: 84, - 0x1060: 84, - 0x1071: 84, - 0x1072: 84, - 0x1073: 84, - 0x1074: 84, - 0x1082: 84, - 0x1085: 84, - 0x1086: 84, - 0x108D: 84, - 0x109D: 84, - 0x135D: 84, - 0x135E: 84, - 0x135F: 84, - 0x1712: 84, - 0x1713: 84, - 0x1714: 84, - 0x1732: 84, - 0x1733: 84, - 0x1752: 84, - 0x1753: 84, - 0x1772: 84, - 0x1773: 84, - 0x17B4: 84, - 0x17B5: 84, - 0x17B7: 84, - 0x17B8: 84, - 0x17B9: 84, - 0x17BA: 84, - 0x17BB: 84, - 0x17BC: 84, - 0x17BD: 84, - 0x17C6: 84, - 0x17C9: 84, - 0x17CA: 84, - 0x17CB: 84, - 0x17CC: 84, - 0x17CD: 84, - 0x17CE: 84, - 0x17CF: 84, - 0x17D0: 84, - 0x17D1: 84, - 0x17D2: 84, - 0x17D3: 84, - 0x17DD: 84, - 0x1807: 68, - 0x180A: 67, - 0x180B: 84, - 0x180C: 84, - 0x180D: 84, - 0x180F: 84, - 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, - 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, - 0x18A9: 84, - 0x18AA: 68, - 0x1920: 84, - 0x1921: 84, - 0x1922: 84, - 0x1927: 84, - 0x1928: 84, - 0x1932: 84, - 0x1939: 84, - 0x193A: 84, - 0x193B: 84, - 0x1A17: 84, - 0x1A18: 84, - 0x1A1B: 84, - 0x1A56: 84, - 0x1A58: 84, - 0x1A59: 84, - 0x1A5A: 84, - 0x1A5B: 84, - 0x1A5C: 84, - 0x1A5D: 84, - 0x1A5E: 84, - 0x1A60: 84, - 0x1A62: 84, - 0x1A65: 84, - 0x1A66: 84, - 0x1A67: 84, - 0x1A68: 84, - 0x1A69: 84, - 0x1A6A: 84, - 0x1A6B: 84, - 0x1A6C: 84, - 0x1A73: 84, - 0x1A74: 84, - 0x1A75: 84, - 0x1A76: 84, - 0x1A77: 84, - 0x1A78: 84, - 0x1A79: 84, - 0x1A7A: 84, - 0x1A7B: 84, - 0x1A7C: 84, - 0x1A7F: 84, - 0x1AB0: 84, - 0x1AB1: 84, - 0x1AB2: 84, - 0x1AB3: 84, - 0x1AB4: 84, - 0x1AB5: 84, - 0x1AB6: 84, - 0x1AB7: 84, - 0x1AB8: 84, - 0x1AB9: 84, - 0x1ABA: 84, - 0x1ABB: 84, - 0x1ABC: 84, - 0x1ABD: 84, - 0x1ABE: 84, - 0x1ABF: 84, - 0x1AC0: 84, - 0x1AC1: 84, - 0x1AC2: 84, - 0x1AC3: 84, - 0x1AC4: 84, - 0x1AC5: 84, - 0x1AC6: 84, - 0x1AC7: 84, - 0x1AC8: 84, - 0x1AC9: 84, - 0x1ACA: 84, - 0x1ACB: 84, - 0x1ACC: 84, - 0x1ACD: 84, - 0x1ACE: 84, - 0x1B00: 84, - 0x1B01: 84, - 0x1B02: 84, - 0x1B03: 84, - 0x1B34: 84, - 0x1B36: 84, - 0x1B37: 84, - 0x1B38: 84, - 0x1B39: 84, - 0x1B3A: 84, - 0x1B3C: 84, - 0x1B42: 84, - 0x1B6B: 84, - 0x1B6C: 84, - 0x1B6D: 84, - 0x1B6E: 84, - 0x1B6F: 84, - 0x1B70: 84, - 0x1B71: 84, - 0x1B72: 84, - 0x1B73: 84, - 0x1B80: 84, - 0x1B81: 84, - 0x1BA2: 84, - 0x1BA3: 84, - 0x1BA4: 84, - 0x1BA5: 84, - 0x1BA8: 84, - 0x1BA9: 84, - 0x1BAB: 84, - 0x1BAC: 84, - 0x1BAD: 84, - 0x1BE6: 84, - 0x1BE8: 84, - 0x1BE9: 84, - 0x1BED: 84, - 0x1BEF: 84, - 0x1BF0: 84, - 0x1BF1: 84, - 0x1C2C: 84, - 0x1C2D: 84, - 0x1C2E: 84, - 0x1C2F: 84, - 0x1C30: 84, - 0x1C31: 84, - 0x1C32: 84, - 0x1C33: 84, - 0x1C36: 84, - 0x1C37: 84, - 0x1CD0: 84, - 0x1CD1: 84, - 0x1CD2: 84, - 0x1CD4: 84, - 0x1CD5: 84, - 0x1CD6: 84, - 0x1CD7: 84, - 0x1CD8: 84, - 0x1CD9: 84, - 0x1CDA: 84, - 0x1CDB: 84, - 0x1CDC: 84, - 0x1CDD: 84, - 0x1CDE: 84, - 0x1CDF: 84, - 0x1CE0: 84, - 0x1CE2: 84, - 0x1CE3: 84, - 0x1CE4: 84, - 0x1CE5: 84, - 0x1CE6: 84, - 0x1CE7: 84, - 0x1CE8: 84, - 0x1CED: 84, - 0x1CF4: 84, - 0x1CF8: 84, - 0x1CF9: 84, - 0x1DC0: 84, - 0x1DC1: 84, - 0x1DC2: 84, - 0x1DC3: 84, - 0x1DC4: 84, - 0x1DC5: 84, - 0x1DC6: 84, - 0x1DC7: 84, - 0x1DC8: 84, - 0x1DC9: 84, - 0x1DCA: 84, - 0x1DCB: 84, - 0x1DCC: 84, - 0x1DCD: 84, - 0x1DCE: 84, - 0x1DCF: 84, - 0x1DD0: 84, - 0x1DD1: 84, - 0x1DD2: 84, - 0x1DD3: 84, - 0x1DD4: 84, - 0x1DD5: 84, - 0x1DD6: 84, - 0x1DD7: 84, - 0x1DD8: 84, - 0x1DD9: 84, - 0x1DDA: 84, - 0x1DDB: 84, - 0x1DDC: 84, - 0x1DDD: 84, - 0x1DDE: 84, - 0x1DDF: 84, - 0x1DE0: 84, - 0x1DE1: 84, - 0x1DE2: 84, - 0x1DE3: 84, - 0x1DE4: 84, - 0x1DE5: 84, - 0x1DE6: 84, - 0x1DE7: 84, - 0x1DE8: 84, - 0x1DE9: 84, - 0x1DEA: 84, - 0x1DEB: 84, - 0x1DEC: 84, - 0x1DED: 84, - 0x1DEE: 84, - 0x1DEF: 84, - 0x1DF0: 84, - 0x1DF1: 84, - 0x1DF2: 84, - 0x1DF3: 84, - 0x1DF4: 84, - 0x1DF5: 84, - 0x1DF6: 84, - 0x1DF7: 84, - 0x1DF8: 84, - 0x1DF9: 84, - 0x1DFA: 84, - 0x1DFB: 84, - 0x1DFC: 84, - 0x1DFD: 84, - 0x1DFE: 84, - 0x1DFF: 84, - 0x200B: 84, - 0x200D: 67, - 0x200E: 84, - 0x200F: 84, - 0x202A: 84, - 0x202B: 84, - 0x202C: 84, - 0x202D: 84, - 0x202E: 84, - 0x2060: 84, - 0x2061: 84, - 0x2062: 84, - 0x2063: 84, - 0x2064: 84, - 0x206A: 84, - 0x206B: 84, - 0x206C: 84, - 0x206D: 84, - 0x206E: 84, - 0x206F: 84, - 0x20D0: 84, - 0x20D1: 84, - 0x20D2: 84, - 0x20D3: 84, - 0x20D4: 84, - 0x20D5: 84, - 0x20D6: 84, - 0x20D7: 84, - 0x20D8: 84, - 0x20D9: 84, - 0x20DA: 84, - 0x20DB: 84, - 0x20DC: 84, - 0x20DD: 84, - 0x20DE: 84, - 0x20DF: 84, - 0x20E0: 84, - 0x20E1: 84, - 0x20E2: 84, - 0x20E3: 84, - 0x20E4: 84, - 0x20E5: 84, - 0x20E6: 84, - 0x20E7: 84, - 0x20E8: 84, - 0x20E9: 84, - 0x20EA: 84, - 0x20EB: 84, - 0x20EC: 84, - 0x20ED: 84, - 0x20EE: 84, - 0x20EF: 84, - 0x20F0: 84, - 0x2CEF: 84, - 0x2CF0: 84, - 0x2CF1: 84, - 0x2D7F: 84, - 0x2DE0: 84, - 0x2DE1: 84, - 0x2DE2: 84, - 0x2DE3: 84, - 0x2DE4: 84, - 0x2DE5: 84, - 0x2DE6: 84, - 0x2DE7: 84, - 0x2DE8: 84, - 0x2DE9: 84, - 0x2DEA: 84, - 0x2DEB: 84, - 0x2DEC: 84, - 0x2DED: 84, - 0x2DEE: 84, - 0x2DEF: 84, - 0x2DF0: 84, - 0x2DF1: 84, - 0x2DF2: 84, - 0x2DF3: 84, - 0x2DF4: 84, - 0x2DF5: 84, - 0x2DF6: 84, - 0x2DF7: 84, - 0x2DF8: 84, - 0x2DF9: 84, - 0x2DFA: 84, - 0x2DFB: 84, - 0x2DFC: 84, - 0x2DFD: 84, - 0x2DFE: 84, - 0x2DFF: 84, - 0x302A: 84, - 0x302B: 84, - 0x302C: 84, - 0x302D: 84, - 0x3099: 84, - 0x309A: 84, - 0xA66F: 84, - 0xA670: 84, - 0xA671: 84, - 0xA672: 84, - 0xA674: 84, - 0xA675: 84, - 0xA676: 84, - 0xA677: 84, - 0xA678: 84, - 0xA679: 84, - 0xA67A: 84, - 0xA67B: 84, - 0xA67C: 84, - 0xA67D: 84, - 0xA69E: 84, - 0xA69F: 84, - 0xA6F0: 84, - 0xA6F1: 84, - 0xA802: 84, - 0xA806: 84, - 0xA80B: 84, - 0xA825: 84, - 0xA826: 84, - 0xA82C: 84, - 0xA840: 68, - 0xA841: 68, - 0xA842: 68, - 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, - 0xA8C4: 84, - 0xA8C5: 84, - 0xA8E0: 84, - 0xA8E1: 84, - 0xA8E2: 84, - 0xA8E3: 84, - 0xA8E4: 84, - 0xA8E5: 84, - 0xA8E6: 84, - 0xA8E7: 84, - 0xA8E8: 84, - 0xA8E9: 84, - 0xA8EA: 84, - 0xA8EB: 84, - 0xA8EC: 84, - 0xA8ED: 84, - 0xA8EE: 84, - 0xA8EF: 84, - 0xA8F0: 84, - 0xA8F1: 84, - 0xA8FF: 84, - 0xA926: 84, - 0xA927: 84, - 0xA928: 84, - 0xA929: 84, - 0xA92A: 84, - 0xA92B: 84, - 0xA92C: 84, - 0xA92D: 84, - 0xA947: 84, - 0xA948: 84, - 0xA949: 84, - 0xA94A: 84, - 0xA94B: 84, - 0xA94C: 84, - 0xA94D: 84, - 0xA94E: 84, - 0xA94F: 84, - 0xA950: 84, - 0xA951: 84, - 0xA980: 84, - 0xA981: 84, - 0xA982: 84, - 0xA9B3: 84, - 0xA9B6: 84, - 0xA9B7: 84, - 0xA9B8: 84, - 0xA9B9: 84, - 0xA9BC: 84, - 0xA9BD: 84, - 0xA9E5: 84, - 0xAA29: 84, - 0xAA2A: 84, - 0xAA2B: 84, - 0xAA2C: 84, - 0xAA2D: 84, - 0xAA2E: 84, - 0xAA31: 84, - 0xAA32: 84, - 0xAA35: 84, - 0xAA36: 84, - 0xAA43: 84, - 0xAA4C: 84, - 0xAA7C: 84, - 0xAAB0: 84, - 0xAAB2: 84, - 0xAAB3: 84, - 0xAAB4: 84, - 0xAAB7: 84, - 0xAAB8: 84, - 0xAABE: 84, - 0xAABF: 84, - 0xAAC1: 84, - 0xAAEC: 84, - 0xAAED: 84, - 0xAAF6: 84, - 0xABE5: 84, - 0xABE8: 84, - 0xABED: 84, - 0xFB1E: 84, - 0xFE00: 84, - 0xFE01: 84, - 0xFE02: 84, - 0xFE03: 84, - 0xFE04: 84, - 0xFE05: 84, - 0xFE06: 84, - 0xFE07: 84, - 0xFE08: 84, - 0xFE09: 84, - 0xFE0A: 84, - 0xFE0B: 84, - 0xFE0C: 84, - 0xFE0D: 84, - 0xFE0E: 84, - 0xFE0F: 84, - 0xFE20: 84, - 0xFE21: 84, - 0xFE22: 84, - 0xFE23: 84, - 0xFE24: 84, - 0xFE25: 84, - 0xFE26: 84, - 0xFE27: 84, - 0xFE28: 84, - 0xFE29: 84, - 0xFE2A: 84, - 0xFE2B: 84, - 0xFE2C: 84, - 0xFE2D: 84, - 0xFE2E: 84, - 0xFE2F: 84, - 0xFEFF: 84, - 0xFFF9: 84, - 0xFFFA: 84, - 0xFFFB: 84, - 0x101FD: 84, - 0x102E0: 84, - 0x10376: 84, - 0x10377: 84, - 0x10378: 84, - 0x10379: 84, - 0x1037A: 84, - 0x10A01: 84, - 0x10A02: 84, - 0x10A03: 84, - 0x10A05: 84, - 0x10A06: 84, - 0x10A0C: 84, - 0x10A0D: 84, - 0x10A0E: 84, - 0x10A0F: 84, - 0x10A38: 84, - 0x10A39: 84, - 0x10A3A: 84, - 0x10A3F: 84, - 0x10AC0: 68, - 0x10AC1: 68, - 0x10AC2: 68, - 0x10AC3: 68, - 0x10AC4: 68, - 0x10AC5: 82, - 0x10AC7: 82, - 0x10AC9: 82, - 0x10ACA: 82, - 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, - 0x10AE4: 82, - 0x10AE5: 84, - 0x10AE6: 84, - 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, - 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, - 0x10D24: 84, - 0x10D25: 84, - 0x10D26: 84, - 0x10D27: 84, - 0x10D69: 84, - 0x10D6A: 84, - 0x10D6B: 84, - 0x10D6C: 84, - 0x10D6D: 84, - 0x10EAB: 84, - 0x10EAC: 84, - 0x10EC2: 82, - 0x10EC3: 68, - 0x10EC4: 68, - 0x10EFC: 84, - 0x10EFD: 84, - 0x10EFE: 84, - 0x10EFF: 84, - 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, - 0x10F46: 84, - 0x10F47: 84, - 0x10F48: 84, - 0x10F49: 84, - 0x10F4A: 84, - 0x10F4B: 84, - 0x10F4C: 84, - 0x10F4D: 84, - 0x10F4E: 84, - 0x10F4F: 84, - 0x10F50: 84, - 0x10F51: 68, - 0x10F52: 68, - 0x10F53: 68, - 0x10F54: 82, - 0x10F70: 68, - 0x10F71: 68, - 0x10F72: 68, - 0x10F73: 68, - 0x10F74: 82, - 0x10F75: 82, - 0x10F76: 68, - 0x10F77: 68, - 0x10F78: 68, - 0x10F79: 68, - 0x10F7A: 68, - 0x10F7B: 68, - 0x10F7C: 68, - 0x10F7D: 68, - 0x10F7E: 68, - 0x10F7F: 68, - 0x10F80: 68, - 0x10F81: 68, - 0x10F82: 84, - 0x10F83: 84, - 0x10F84: 84, - 0x10F85: 84, - 0x10FB0: 68, - 0x10FB2: 68, - 0x10FB3: 68, - 0x10FB4: 82, - 0x10FB5: 82, - 0x10FB6: 82, - 0x10FB8: 68, - 0x10FB9: 82, - 0x10FBA: 82, - 0x10FBB: 68, - 0x10FBC: 68, - 0x10FBD: 82, - 0x10FBE: 68, - 0x10FBF: 68, - 0x10FC1: 68, - 0x10FC2: 82, - 0x10FC3: 82, - 0x10FC4: 68, - 0x10FC9: 82, - 0x10FCA: 68, - 0x10FCB: 76, - 0x11001: 84, - 0x11038: 84, - 0x11039: 84, - 0x1103A: 84, - 0x1103B: 84, - 0x1103C: 84, - 0x1103D: 84, - 0x1103E: 84, - 0x1103F: 84, - 0x11040: 84, - 0x11041: 84, - 0x11042: 84, - 0x11043: 84, - 0x11044: 84, - 0x11045: 84, - 0x11046: 84, - 0x11070: 84, - 0x11073: 84, - 0x11074: 84, - 0x1107F: 84, - 0x11080: 84, - 0x11081: 84, - 0x110B3: 84, - 0x110B4: 84, - 0x110B5: 84, - 0x110B6: 84, - 0x110B9: 84, - 0x110BA: 84, - 0x110C2: 84, - 0x11100: 84, - 0x11101: 84, - 0x11102: 84, - 0x11127: 84, - 0x11128: 84, - 0x11129: 84, - 0x1112A: 84, - 0x1112B: 84, - 0x1112D: 84, - 0x1112E: 84, - 0x1112F: 84, - 0x11130: 84, - 0x11131: 84, - 0x11132: 84, - 0x11133: 84, - 0x11134: 84, - 0x11173: 84, - 0x11180: 84, - 0x11181: 84, - 0x111B6: 84, - 0x111B7: 84, - 0x111B8: 84, - 0x111B9: 84, - 0x111BA: 84, - 0x111BB: 84, - 0x111BC: 84, - 0x111BD: 84, - 0x111BE: 84, - 0x111C9: 84, - 0x111CA: 84, - 0x111CB: 84, - 0x111CC: 84, - 0x111CF: 84, - 0x1122F: 84, - 0x11230: 84, - 0x11231: 84, - 0x11234: 84, - 0x11236: 84, - 0x11237: 84, - 0x1123E: 84, - 0x11241: 84, - 0x112DF: 84, - 0x112E3: 84, - 0x112E4: 84, - 0x112E5: 84, - 0x112E6: 84, - 0x112E7: 84, - 0x112E8: 84, - 0x112E9: 84, - 0x112EA: 84, - 0x11300: 84, - 0x11301: 84, - 0x1133B: 84, - 0x1133C: 84, - 0x11340: 84, - 0x11366: 84, - 0x11367: 84, - 0x11368: 84, - 0x11369: 84, - 0x1136A: 84, - 0x1136B: 84, - 0x1136C: 84, - 0x11370: 84, - 0x11371: 84, - 0x11372: 84, - 0x11373: 84, - 0x11374: 84, - 0x113BB: 84, - 0x113BC: 84, - 0x113BD: 84, - 0x113BE: 84, - 0x113BF: 84, - 0x113C0: 84, - 0x113CE: 84, - 0x113D0: 84, - 0x113D2: 84, - 0x113E1: 84, - 0x113E2: 84, - 0x11438: 84, - 0x11439: 84, - 0x1143A: 84, - 0x1143B: 84, - 0x1143C: 84, - 0x1143D: 84, - 0x1143E: 84, - 0x1143F: 84, - 0x11442: 84, - 0x11443: 84, - 0x11444: 84, - 0x11446: 84, - 0x1145E: 84, - 0x114B3: 84, - 0x114B4: 84, - 0x114B5: 84, - 0x114B6: 84, - 0x114B7: 84, - 0x114B8: 84, - 0x114BA: 84, - 0x114BF: 84, - 0x114C0: 84, - 0x114C2: 84, - 0x114C3: 84, - 0x115B2: 84, - 0x115B3: 84, - 0x115B4: 84, - 0x115B5: 84, - 0x115BC: 84, - 0x115BD: 84, - 0x115BF: 84, - 0x115C0: 84, - 0x115DC: 84, - 0x115DD: 84, - 0x11633: 84, - 0x11634: 84, - 0x11635: 84, - 0x11636: 84, - 0x11637: 84, - 0x11638: 84, - 0x11639: 84, - 0x1163A: 84, - 0x1163D: 84, - 0x1163F: 84, - 0x11640: 84, - 0x116AB: 84, - 0x116AD: 84, - 0x116B0: 84, - 0x116B1: 84, - 0x116B2: 84, - 0x116B3: 84, - 0x116B4: 84, - 0x116B5: 84, - 0x116B7: 84, - 0x1171D: 84, - 0x1171F: 84, - 0x11722: 84, - 0x11723: 84, - 0x11724: 84, - 0x11725: 84, - 0x11727: 84, - 0x11728: 84, - 0x11729: 84, - 0x1172A: 84, - 0x1172B: 84, - 0x1182F: 84, - 0x11830: 84, - 0x11831: 84, - 0x11832: 84, - 0x11833: 84, - 0x11834: 84, - 0x11835: 84, - 0x11836: 84, - 0x11837: 84, - 0x11839: 84, - 0x1183A: 84, - 0x1193B: 84, - 0x1193C: 84, - 0x1193E: 84, - 0x11943: 84, - 0x119D4: 84, - 0x119D5: 84, - 0x119D6: 84, - 0x119D7: 84, - 0x119DA: 84, - 0x119DB: 84, - 0x119E0: 84, - 0x11A01: 84, - 0x11A02: 84, - 0x11A03: 84, - 0x11A04: 84, - 0x11A05: 84, - 0x11A06: 84, - 0x11A07: 84, - 0x11A08: 84, - 0x11A09: 84, - 0x11A0A: 84, - 0x11A33: 84, - 0x11A34: 84, - 0x11A35: 84, - 0x11A36: 84, - 0x11A37: 84, - 0x11A38: 84, - 0x11A3B: 84, - 0x11A3C: 84, - 0x11A3D: 84, - 0x11A3E: 84, - 0x11A47: 84, - 0x11A51: 84, - 0x11A52: 84, - 0x11A53: 84, - 0x11A54: 84, - 0x11A55: 84, - 0x11A56: 84, - 0x11A59: 84, - 0x11A5A: 84, - 0x11A5B: 84, - 0x11A8A: 84, - 0x11A8B: 84, - 0x11A8C: 84, - 0x11A8D: 84, - 0x11A8E: 84, - 0x11A8F: 84, - 0x11A90: 84, - 0x11A91: 84, - 0x11A92: 84, - 0x11A93: 84, - 0x11A94: 84, - 0x11A95: 84, - 0x11A96: 84, - 0x11A98: 84, - 0x11A99: 84, - 0x11C30: 84, - 0x11C31: 84, - 0x11C32: 84, - 0x11C33: 84, - 0x11C34: 84, - 0x11C35: 84, - 0x11C36: 84, - 0x11C38: 84, - 0x11C39: 84, - 0x11C3A: 84, - 0x11C3B: 84, - 0x11C3C: 84, - 0x11C3D: 84, - 0x11C3F: 84, - 0x11C92: 84, - 0x11C93: 84, - 0x11C94: 84, - 0x11C95: 84, - 0x11C96: 84, - 0x11C97: 84, - 0x11C98: 84, - 0x11C99: 84, - 0x11C9A: 84, - 0x11C9B: 84, - 0x11C9C: 84, - 0x11C9D: 84, - 0x11C9E: 84, - 0x11C9F: 84, - 0x11CA0: 84, - 0x11CA1: 84, - 0x11CA2: 84, - 0x11CA3: 84, - 0x11CA4: 84, - 0x11CA5: 84, - 0x11CA6: 84, - 0x11CA7: 84, - 0x11CAA: 84, - 0x11CAB: 84, - 0x11CAC: 84, - 0x11CAD: 84, - 0x11CAE: 84, - 0x11CAF: 84, - 0x11CB0: 84, - 0x11CB2: 84, - 0x11CB3: 84, - 0x11CB5: 84, - 0x11CB6: 84, - 0x11D31: 84, - 0x11D32: 84, - 0x11D33: 84, - 0x11D34: 84, - 0x11D35: 84, - 0x11D36: 84, - 0x11D3A: 84, - 0x11D3C: 84, - 0x11D3D: 84, - 0x11D3F: 84, - 0x11D40: 84, - 0x11D41: 84, - 0x11D42: 84, - 0x11D43: 84, - 0x11D44: 84, - 0x11D45: 84, - 0x11D47: 84, - 0x11D90: 84, - 0x11D91: 84, - 0x11D95: 84, - 0x11D97: 84, - 0x11EF3: 84, - 0x11EF4: 84, - 0x11F00: 84, - 0x11F01: 84, - 0x11F36: 84, - 0x11F37: 84, - 0x11F38: 84, - 0x11F39: 84, - 0x11F3A: 84, - 0x11F40: 84, - 0x11F42: 84, - 0x11F5A: 84, - 0x13430: 84, - 0x13431: 84, - 0x13432: 84, - 0x13433: 84, - 0x13434: 84, - 0x13435: 84, - 0x13436: 84, - 0x13437: 84, - 0x13438: 84, - 0x13439: 84, - 0x1343A: 84, - 0x1343B: 84, - 0x1343C: 84, - 0x1343D: 84, - 0x1343E: 84, - 0x1343F: 84, - 0x13440: 84, - 0x13447: 84, - 0x13448: 84, - 0x13449: 84, - 0x1344A: 84, - 0x1344B: 84, - 0x1344C: 84, - 0x1344D: 84, - 0x1344E: 84, - 0x1344F: 84, - 0x13450: 84, - 0x13451: 84, - 0x13452: 84, - 0x13453: 84, - 0x13454: 84, - 0x13455: 84, - 0x1611E: 84, - 0x1611F: 84, - 0x16120: 84, - 0x16121: 84, - 0x16122: 84, - 0x16123: 84, - 0x16124: 84, - 0x16125: 84, - 0x16126: 84, - 0x16127: 84, - 0x16128: 84, - 0x16129: 84, - 0x1612D: 84, - 0x1612E: 84, - 0x1612F: 84, - 0x16AF0: 84, - 0x16AF1: 84, - 0x16AF2: 84, - 0x16AF3: 84, - 0x16AF4: 84, - 0x16B30: 84, - 0x16B31: 84, - 0x16B32: 84, - 0x16B33: 84, - 0x16B34: 84, - 0x16B35: 84, - 0x16B36: 84, - 0x16F4F: 84, - 0x16F8F: 84, - 0x16F90: 84, - 0x16F91: 84, - 0x16F92: 84, - 0x16FE4: 84, - 0x1BC9D: 84, - 0x1BC9E: 84, - 0x1BCA0: 84, - 0x1BCA1: 84, - 0x1BCA2: 84, - 0x1BCA3: 84, - 0x1CF00: 84, - 0x1CF01: 84, - 0x1CF02: 84, - 0x1CF03: 84, - 0x1CF04: 84, - 0x1CF05: 84, - 0x1CF06: 84, - 0x1CF07: 84, - 0x1CF08: 84, - 0x1CF09: 84, - 0x1CF0A: 84, - 0x1CF0B: 84, - 0x1CF0C: 84, - 0x1CF0D: 84, - 0x1CF0E: 84, - 0x1CF0F: 84, - 0x1CF10: 84, - 0x1CF11: 84, - 0x1CF12: 84, - 0x1CF13: 84, - 0x1CF14: 84, - 0x1CF15: 84, - 0x1CF16: 84, - 0x1CF17: 84, - 0x1CF18: 84, - 0x1CF19: 84, - 0x1CF1A: 84, - 0x1CF1B: 84, - 0x1CF1C: 84, - 0x1CF1D: 84, - 0x1CF1E: 84, - 0x1CF1F: 84, - 0x1CF20: 84, - 0x1CF21: 84, - 0x1CF22: 84, - 0x1CF23: 84, - 0x1CF24: 84, - 0x1CF25: 84, - 0x1CF26: 84, - 0x1CF27: 84, - 0x1CF28: 84, - 0x1CF29: 84, - 0x1CF2A: 84, - 0x1CF2B: 84, - 0x1CF2C: 84, - 0x1CF2D: 84, - 0x1CF30: 84, - 0x1CF31: 84, - 0x1CF32: 84, - 0x1CF33: 84, - 0x1CF34: 84, - 0x1CF35: 84, - 0x1CF36: 84, - 0x1CF37: 84, - 0x1CF38: 84, - 0x1CF39: 84, - 0x1CF3A: 84, - 0x1CF3B: 84, - 0x1CF3C: 84, - 0x1CF3D: 84, - 0x1CF3E: 84, - 0x1CF3F: 84, - 0x1CF40: 84, - 0x1CF41: 84, - 0x1CF42: 84, - 0x1CF43: 84, - 0x1CF44: 84, - 0x1CF45: 84, - 0x1CF46: 84, - 0x1D167: 84, - 0x1D168: 84, - 0x1D169: 84, - 0x1D173: 84, - 0x1D174: 84, - 0x1D175: 84, - 0x1D176: 84, - 0x1D177: 84, - 0x1D178: 84, - 0x1D179: 84, - 0x1D17A: 84, - 0x1D17B: 84, - 0x1D17C: 84, - 0x1D17D: 84, - 0x1D17E: 84, - 0x1D17F: 84, - 0x1D180: 84, - 0x1D181: 84, - 0x1D182: 84, - 0x1D185: 84, - 0x1D186: 84, - 0x1D187: 84, - 0x1D188: 84, - 0x1D189: 84, - 0x1D18A: 84, - 0x1D18B: 84, - 0x1D1AA: 84, - 0x1D1AB: 84, - 0x1D1AC: 84, - 0x1D1AD: 84, - 0x1D242: 84, - 0x1D243: 84, - 0x1D244: 84, - 0x1DA00: 84, - 0x1DA01: 84, - 0x1DA02: 84, - 0x1DA03: 84, - 0x1DA04: 84, - 0x1DA05: 84, - 0x1DA06: 84, - 0x1DA07: 84, - 0x1DA08: 84, - 0x1DA09: 84, - 0x1DA0A: 84, - 0x1DA0B: 84, - 0x1DA0C: 84, - 0x1DA0D: 84, - 0x1DA0E: 84, - 0x1DA0F: 84, - 0x1DA10: 84, - 0x1DA11: 84, - 0x1DA12: 84, - 0x1DA13: 84, - 0x1DA14: 84, - 0x1DA15: 84, - 0x1DA16: 84, - 0x1DA17: 84, - 0x1DA18: 84, - 0x1DA19: 84, - 0x1DA1A: 84, - 0x1DA1B: 84, - 0x1DA1C: 84, - 0x1DA1D: 84, - 0x1DA1E: 84, - 0x1DA1F: 84, - 0x1DA20: 84, - 0x1DA21: 84, - 0x1DA22: 84, - 0x1DA23: 84, - 0x1DA24: 84, - 0x1DA25: 84, - 0x1DA26: 84, - 0x1DA27: 84, - 0x1DA28: 84, - 0x1DA29: 84, - 0x1DA2A: 84, - 0x1DA2B: 84, - 0x1DA2C: 84, - 0x1DA2D: 84, - 0x1DA2E: 84, - 0x1DA2F: 84, - 0x1DA30: 84, - 0x1DA31: 84, - 0x1DA32: 84, - 0x1DA33: 84, - 0x1DA34: 84, - 0x1DA35: 84, - 0x1DA36: 84, - 0x1DA3B: 84, - 0x1DA3C: 84, - 0x1DA3D: 84, - 0x1DA3E: 84, - 0x1DA3F: 84, - 0x1DA40: 84, - 0x1DA41: 84, - 0x1DA42: 84, - 0x1DA43: 84, - 0x1DA44: 84, - 0x1DA45: 84, - 0x1DA46: 84, - 0x1DA47: 84, - 0x1DA48: 84, - 0x1DA49: 84, - 0x1DA4A: 84, - 0x1DA4B: 84, - 0x1DA4C: 84, - 0x1DA4D: 84, - 0x1DA4E: 84, - 0x1DA4F: 84, - 0x1DA50: 84, - 0x1DA51: 84, - 0x1DA52: 84, - 0x1DA53: 84, - 0x1DA54: 84, - 0x1DA55: 84, - 0x1DA56: 84, - 0x1DA57: 84, - 0x1DA58: 84, - 0x1DA59: 84, - 0x1DA5A: 84, - 0x1DA5B: 84, - 0x1DA5C: 84, - 0x1DA5D: 84, - 0x1DA5E: 84, - 0x1DA5F: 84, - 0x1DA60: 84, - 0x1DA61: 84, - 0x1DA62: 84, - 0x1DA63: 84, - 0x1DA64: 84, - 0x1DA65: 84, - 0x1DA66: 84, - 0x1DA67: 84, - 0x1DA68: 84, - 0x1DA69: 84, - 0x1DA6A: 84, - 0x1DA6B: 84, - 0x1DA6C: 84, - 0x1DA75: 84, - 0x1DA84: 84, - 0x1DA9B: 84, - 0x1DA9C: 84, - 0x1DA9D: 84, - 0x1DA9E: 84, - 0x1DA9F: 84, - 0x1DAA1: 84, - 0x1DAA2: 84, - 0x1DAA3: 84, - 0x1DAA4: 84, - 0x1DAA5: 84, - 0x1DAA6: 84, - 0x1DAA7: 84, - 0x1DAA8: 84, - 0x1DAA9: 84, - 0x1DAAA: 84, - 0x1DAAB: 84, - 0x1DAAC: 84, - 0x1DAAD: 84, - 0x1DAAE: 84, - 0x1DAAF: 84, - 0x1E000: 84, - 0x1E001: 84, - 0x1E002: 84, - 0x1E003: 84, - 0x1E004: 84, - 0x1E005: 84, - 0x1E006: 84, - 0x1E008: 84, - 0x1E009: 84, - 0x1E00A: 84, - 0x1E00B: 84, - 0x1E00C: 84, - 0x1E00D: 84, - 0x1E00E: 84, - 0x1E00F: 84, - 0x1E010: 84, - 0x1E011: 84, - 0x1E012: 84, - 0x1E013: 84, - 0x1E014: 84, - 0x1E015: 84, - 0x1E016: 84, - 0x1E017: 84, - 0x1E018: 84, - 0x1E01B: 84, - 0x1E01C: 84, - 0x1E01D: 84, - 0x1E01E: 84, - 0x1E01F: 84, - 0x1E020: 84, - 0x1E021: 84, - 0x1E023: 84, - 0x1E024: 84, - 0x1E026: 84, - 0x1E027: 84, - 0x1E028: 84, - 0x1E029: 84, - 0x1E02A: 84, - 0x1E08F: 84, - 0x1E130: 84, - 0x1E131: 84, - 0x1E132: 84, - 0x1E133: 84, - 0x1E134: 84, - 0x1E135: 84, - 0x1E136: 84, - 0x1E2AE: 84, - 0x1E2EC: 84, - 0x1E2ED: 84, - 0x1E2EE: 84, - 0x1E2EF: 84, - 0x1E4EC: 84, - 0x1E4ED: 84, - 0x1E4EE: 84, - 0x1E4EF: 84, - 0x1E5EE: 84, - 0x1E5EF: 84, - 0x1E8D0: 84, - 0x1E8D1: 84, - 0x1E8D2: 84, - 0x1E8D3: 84, - 0x1E8D4: 84, - 0x1E8D5: 84, - 0x1E8D6: 84, - 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, - 0x1E944: 84, - 0x1E945: 84, - 0x1E946: 84, - 0x1E947: 84, - 0x1E948: 84, - 0x1E949: 84, - 0x1E94A: 84, - 0x1E94B: 84, - 0xE0001: 84, - 0xE0020: 84, - 0xE0021: 84, - 0xE0022: 84, - 0xE0023: 84, - 0xE0024: 84, - 0xE0025: 84, - 0xE0026: 84, - 0xE0027: 84, - 0xE0028: 84, - 0xE0029: 84, - 0xE002A: 84, - 0xE002B: 84, - 0xE002C: 84, - 0xE002D: 84, - 0xE002E: 84, - 0xE002F: 84, - 0xE0030: 84, - 0xE0031: 84, - 0xE0032: 84, - 0xE0033: 84, - 0xE0034: 84, - 0xE0035: 84, - 0xE0036: 84, - 0xE0037: 84, - 0xE0038: 84, - 0xE0039: 84, - 0xE003A: 84, - 0xE003B: 84, - 0xE003C: 84, - 0xE003D: 84, - 0xE003E: 84, - 0xE003F: 84, - 0xE0040: 84, - 0xE0041: 84, - 0xE0042: 84, - 0xE0043: 84, - 0xE0044: 84, - 0xE0045: 84, - 0xE0046: 84, - 0xE0047: 84, - 0xE0048: 84, - 0xE0049: 84, - 0xE004A: 84, - 0xE004B: 84, - 0xE004C: 84, - 0xE004D: 84, - 0xE004E: 84, - 0xE004F: 84, - 0xE0050: 84, - 0xE0051: 84, - 0xE0052: 84, - 0xE0053: 84, - 0xE0054: 84, - 0xE0055: 84, - 0xE0056: 84, - 0xE0057: 84, - 0xE0058: 84, - 0xE0059: 84, - 0xE005A: 84, - 0xE005B: 84, - 0xE005C: 84, - 0xE005D: 84, - 0xE005E: 84, - 0xE005F: 84, - 0xE0060: 84, - 0xE0061: 84, - 0xE0062: 84, - 0xE0063: 84, - 0xE0064: 84, - 0xE0065: 84, - 0xE0066: 84, - 0xE0067: 84, - 0xE0068: 84, - 0xE0069: 84, - 0xE006A: 84, - 0xE006B: 84, - 0xE006C: 84, - 0xE006D: 84, - 0xE006E: 84, - 0xE006F: 84, - 0xE0070: 84, - 0xE0071: 84, - 0xE0072: 84, - 0xE0073: 84, - 0xE0074: 84, - 0xE0075: 84, - 0xE0076: 84, - 0xE0077: 84, - 0xE0078: 84, - 0xE0079: 84, - 0xE007A: 84, - 0xE007B: 84, - 0xE007C: 84, - 0xE007D: 84, - 0xE007E: 84, - 0xE007F: 84, - 0xE0100: 84, - 0xE0101: 84, - 0xE0102: 84, - 0xE0103: 84, - 0xE0104: 84, - 0xE0105: 84, - 0xE0106: 84, - 0xE0107: 84, - 0xE0108: 84, - 0xE0109: 84, - 0xE010A: 84, - 0xE010B: 84, - 0xE010C: 84, - 0xE010D: 84, - 0xE010E: 84, - 0xE010F: 84, - 0xE0110: 84, - 0xE0111: 84, - 0xE0112: 84, - 0xE0113: 84, - 0xE0114: 84, - 0xE0115: 84, - 0xE0116: 84, - 0xE0117: 84, - 0xE0118: 84, - 0xE0119: 84, - 0xE011A: 84, - 0xE011B: 84, - 0xE011C: 84, - 0xE011D: 84, - 0xE011E: 84, - 0xE011F: 84, - 0xE0120: 84, - 0xE0121: 84, - 0xE0122: 84, - 0xE0123: 84, - 0xE0124: 84, - 0xE0125: 84, - 0xE0126: 84, - 0xE0127: 84, - 0xE0128: 84, - 0xE0129: 84, - 0xE012A: 84, - 0xE012B: 84, - 0xE012C: 84, - 0xE012D: 84, - 0xE012E: 84, - 0xE012F: 84, - 0xE0130: 84, - 0xE0131: 84, - 0xE0132: 84, - 0xE0133: 84, - 0xE0134: 84, - 0xE0135: 84, - 0xE0136: 84, - 0xE0137: 84, - 0xE0138: 84, - 0xE0139: 84, - 0xE013A: 84, - 0xE013B: 84, - 0xE013C: 84, - 0xE013D: 84, - 0xE013E: 84, - 0xE013F: 84, - 0xE0140: 84, - 0xE0141: 84, - 0xE0142: 84, - 0xE0143: 84, - 0xE0144: 84, - 0xE0145: 84, - 0xE0146: 84, - 0xE0147: 84, - 0xE0148: 84, - 0xE0149: 84, - 0xE014A: 84, - 0xE014B: 84, - 0xE014C: 84, - 0xE014D: 84, - 0xE014E: 84, - 0xE014F: 84, - 0xE0150: 84, - 0xE0151: 84, - 0xE0152: 84, - 0xE0153: 84, - 0xE0154: 84, - 0xE0155: 84, - 0xE0156: 84, - 0xE0157: 84, - 0xE0158: 84, - 0xE0159: 84, - 0xE015A: 84, - 0xE015B: 84, - 0xE015C: 84, - 0xE015D: 84, - 0xE015E: 84, - 0xE015F: 84, - 0xE0160: 84, - 0xE0161: 84, - 0xE0162: 84, - 0xE0163: 84, - 0xE0164: 84, - 0xE0165: 84, - 0xE0166: 84, - 0xE0167: 84, - 0xE0168: 84, - 0xE0169: 84, - 0xE016A: 84, - 0xE016B: 84, - 0xE016C: 84, - 0xE016D: 84, - 0xE016E: 84, - 0xE016F: 84, - 0xE0170: 84, - 0xE0171: 84, - 0xE0172: 84, - 0xE0173: 84, - 0xE0174: 84, - 0xE0175: 84, - 0xE0176: 84, - 0xE0177: 84, - 0xE0178: 84, - 0xE0179: 84, - 0xE017A: 84, - 0xE017B: 84, - 0xE017C: 84, - 0xE017D: 84, - 0xE017E: 84, - 0xE017F: 84, - 0xE0180: 84, - 0xE0181: 84, - 0xE0182: 84, - 0xE0183: 84, - 0xE0184: 84, - 0xE0185: 84, - 0xE0186: 84, - 0xE0187: 84, - 0xE0188: 84, - 0xE0189: 84, - 0xE018A: 84, - 0xE018B: 84, - 0xE018C: 84, - 0xE018D: 84, - 0xE018E: 84, - 0xE018F: 84, - 0xE0190: 84, - 0xE0191: 84, - 0xE0192: 84, - 0xE0193: 84, - 0xE0194: 84, - 0xE0195: 84, - 0xE0196: 84, - 0xE0197: 84, - 0xE0198: 84, - 0xE0199: 84, - 0xE019A: 84, - 0xE019B: 84, - 0xE019C: 84, - 0xE019D: 84, - 0xE019E: 84, - 0xE019F: 84, - 0xE01A0: 84, - 0xE01A1: 84, - 0xE01A2: 84, - 0xE01A3: 84, - 0xE01A4: 84, - 0xE01A5: 84, - 0xE01A6: 84, - 0xE01A7: 84, - 0xE01A8: 84, - 0xE01A9: 84, - 0xE01AA: 84, - 0xE01AB: 84, - 0xE01AC: 84, - 0xE01AD: 84, - 0xE01AE: 84, - 0xE01AF: 84, - 0xE01B0: 84, - 0xE01B1: 84, - 0xE01B2: 84, - 0xE01B3: 84, - 0xE01B4: 84, - 0xE01B5: 84, - 0xE01B6: 84, - 0xE01B7: 84, - 0xE01B8: 84, - 0xE01B9: 84, - 0xE01BA: 84, - 0xE01BB: 84, - 0xE01BC: 84, - 0xE01BD: 84, - 0xE01BE: 84, - 0xE01BF: 84, - 0xE01C0: 84, - 0xE01C1: 84, - 0xE01C2: 84, - 0xE01C3: 84, - 0xE01C4: 84, - 0xE01C5: 84, - 0xE01C6: 84, - 0xE01C7: 84, - 0xE01C8: 84, - 0xE01C9: 84, - 0xE01CA: 84, - 0xE01CB: 84, - 0xE01CC: 84, - 0xE01CD: 84, - 0xE01CE: 84, - 0xE01CF: 84, - 0xE01D0: 84, - 0xE01D1: 84, - 0xE01D2: 84, - 0xE01D3: 84, - 0xE01D4: 84, - 0xE01D5: 84, - 0xE01D6: 84, - 0xE01D7: 84, - 0xE01D8: 84, - 0xE01D9: 84, - 0xE01DA: 84, - 0xE01DB: 84, - 0xE01DC: 84, - 0xE01DD: 84, - 0xE01DE: 84, - 0xE01DF: 84, - 0xE01E0: 84, - 0xE01E1: 84, - 0xE01E2: 84, - 0xE01E3: 84, - 0xE01E4: 84, - 0xE01E5: 84, - 0xE01E6: 84, - 0xE01E7: 84, - 0xE01E8: 84, - 0xE01E9: 84, - 0xE01EA: 84, - 0xE01EB: 84, - 0xE01EC: 84, - 0xE01ED: 84, - 0xE01EE: 84, - 0xE01EF: 84, -} -codepoint_classes = { - "PVALID": ( - 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, - 0x87000000888, - 0x8890000088F, - 0x897000008E2, - 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, - 0xB5500000B58, - 0xB5F00000B64, - 0xB6600000B70, - 0xB7100000B72, - 0xB8200000B84, - 0xB8500000B8B, - 0xB8E00000B91, - 0xB9200000B96, - 0xB9900000B9B, - 0xB9C00000B9D, - 0xB9E00000BA0, - 0xBA300000BA5, - 0xBA800000BAB, - 0xBAE00000BBA, - 0xBBE00000BC3, - 0xBC600000BC9, - 0xBCA00000BCE, - 0xBD000000BD1, - 0xBD700000BD8, - 0xBE600000BF0, - 0xC0000000C0D, - 0xC0E00000C11, - 0xC1200000C29, - 0xC2A00000C3A, - 0xC3C00000C45, - 0xC4600000C49, - 0xC4A00000C4E, - 0xC5500000C57, - 0xC5800000C5B, - 0xC5D00000C5E, - 0xC6000000C64, - 0xC6600000C70, - 0xC8000000C84, - 0xC8500000C8D, - 0xC8E00000C91, - 0xC9200000CA9, - 0xCAA00000CB4, - 0xCB500000CBA, - 0xCBC00000CC5, - 0xCC600000CC9, - 0xCCA00000CCE, - 0xCD500000CD7, - 0xCDD00000CDF, - 0xCE000000CE4, - 0xCE600000CF0, - 0xCF100000CF4, - 0xD0000000D0D, - 0xD0E00000D11, - 0xD1200000D45, - 0xD4600000D49, - 0xD4A00000D4F, - 0xD5400000D58, - 0xD5F00000D64, - 0xD6600000D70, - 0xD7A00000D80, - 0xD8100000D84, - 0xD8500000D97, - 0xD9A00000DB2, - 0xDB300000DBC, - 0xDBD00000DBE, - 0xDC000000DC7, - 0xDCA00000DCB, - 0xDCF00000DD5, - 0xDD600000DD7, - 0xDD800000DE0, - 0xDE600000DF0, - 0xDF200000DF4, - 0xE0100000E33, - 0xE3400000E3B, - 0xE4000000E4F, - 0xE5000000E5A, - 0xE8100000E83, - 0xE8400000E85, - 0xE8600000E8B, - 0xE8C00000EA4, - 0xEA500000EA6, - 0xEA700000EB3, - 0xEB400000EBE, - 0xEC000000EC5, - 0xEC600000EC7, - 0xEC800000ECF, - 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, - 0x170000001716, - 0x171F00001735, - 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, - 0x1ABF00001ACF, - 0x1B0000001B4D, - 0x1B5000001B5A, - 0x1B6B00001B74, - 0x1B8000001BF4, - 0x1C0000001C38, - 0x1C4000001C4A, - 0x1C4D00001C7E, - 0x1C8A00001C8B, - 0x1CD000001CD3, - 0x1CD400001CFB, - 0x1D0000001D2C, - 0x1D2F00001D30, - 0x1D3B00001D3C, - 0x1D4E00001D4F, - 0x1D6B00001D78, - 0x1D7900001D9B, - 0x1DC000001E00, - 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, - 0x2C3000002C60, - 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, - 0x31A0000031C0, - 0x31F000003200, - 0x340000004DC0, - 0x4E000000A48D, - 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, - 0xA7BB0000A7BC, - 0xA7BD0000A7BE, - 0xA7BF0000A7C0, - 0xA7C10000A7C2, - 0xA7C30000A7C4, - 0xA7C80000A7C9, - 0xA7CA0000A7CB, - 0xA7CD0000A7CE, - 0xA7D10000A7D2, - 0xA7D30000A7D4, - 0xA7D50000A7D6, - 0xA7D70000A7D8, - 0xA7D90000A7DA, - 0xA7DB0000A7DC, - 0xA7F60000A7F8, - 0xA7FA0000A828, - 0xA82C0000A82D, - 0xA8400000A874, - 0xA8800000A8C6, - 0xA8D00000A8DA, - 0xA8E00000A8F8, - 0xA8FB0000A8FC, - 0xA8FD0000A92E, - 0xA9300000A954, - 0xA9800000A9C1, - 0xA9CF0000A9DA, - 0xA9E00000A9FF, - 0xAA000000AA37, - 0xAA400000AA4E, - 0xAA500000AA5A, - 0xAA600000AA77, - 0xAA7A0000AAC3, - 0xAADB0000AADE, - 0xAAE00000AAF0, - 0xAAF20000AAF7, - 0xAB010000AB07, - 0xAB090000AB0F, - 0xAB110000AB17, - 0xAB200000AB27, - 0xAB280000AB2F, - 0xAB300000AB5B, - 0xAB600000AB69, - 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, - 0x10597000105A2, - 0x105A3000105B2, - 0x105B3000105BA, - 0x105BB000105BD, - 0x105C0000105F4, - 0x1060000010737, - 0x1074000010756, - 0x1076000010768, - 0x1078000010781, - 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, - 0x10D4000010D50, - 0x10D6900010D6E, - 0x10D6F00010D86, - 0x10E8000010EAA, - 0x10EAB00010EAD, - 0x10EB000010EB2, - 0x10EC200010EC5, - 0x10EFC00010F1D, - 0x10F2700010F28, - 0x10F3000010F51, - 0x10F7000010F86, - 0x10FB000010FC5, - 0x10FE000010FF7, - 0x1100000011047, - 0x1106600011076, - 0x1107F000110BB, - 0x110C2000110C3, - 0x110D0000110E9, - 0x110F0000110FA, - 0x1110000011135, - 0x1113600011140, - 0x1114400011148, - 0x1115000011174, - 0x1117600011177, - 0x11180000111C5, - 0x111C9000111CD, - 0x111CE000111DB, - 0x111DC000111DD, - 0x1120000011212, - 0x1121300011238, - 0x1123E00011242, - 0x1128000011287, - 0x1128800011289, - 0x1128A0001128E, - 0x1128F0001129E, - 0x1129F000112A9, - 0x112B0000112EB, - 0x112F0000112FA, - 0x1130000011304, - 0x113050001130D, - 0x1130F00011311, - 0x1131300011329, - 0x1132A00011331, - 0x1133200011334, - 0x113350001133A, - 0x1133B00011345, - 0x1134700011349, - 0x1134B0001134E, - 0x1135000011351, - 0x1135700011358, - 0x1135D00011364, - 0x113660001136D, - 0x1137000011375, - 0x113800001138A, - 0x1138B0001138C, - 0x1138E0001138F, - 0x11390000113B6, - 0x113B7000113C1, - 0x113C2000113C3, - 0x113C5000113C6, - 0x113C7000113CB, - 0x113CC000113D4, - 0x113E1000113E3, - 0x114000001144B, - 0x114500001145A, - 0x1145E00011462, - 0x11480000114C6, - 0x114C7000114C8, - 0x114D0000114DA, - 0x11580000115B6, - 0x115B8000115C1, - 0x115D8000115DE, - 0x1160000011641, - 0x1164400011645, - 0x116500001165A, - 0x11680000116B9, - 0x116C0000116CA, - 0x116D0000116E4, - 0x117000001171B, - 0x1171D0001172C, - 0x117300001173A, - 0x1174000011747, - 0x118000001183B, - 0x118C0000118EA, - 0x118FF00011907, - 0x119090001190A, - 0x1190C00011914, - 0x1191500011917, - 0x1191800011936, - 0x1193700011939, - 0x1193B00011944, - 0x119500001195A, - 0x119A0000119A8, - 0x119AA000119D8, - 0x119DA000119E2, - 0x119E3000119E5, - 0x11A0000011A3F, - 0x11A4700011A48, - 0x11A5000011A9A, - 0x11A9D00011A9E, - 0x11AB000011AF9, - 0x11BC000011BE1, - 0x11BF000011BFA, - 0x11C0000011C09, - 0x11C0A00011C37, - 0x11C3800011C41, - 0x11C5000011C5A, - 0x11C7200011C90, - 0x11C9200011CA8, - 0x11CA900011CB7, - 0x11D0000011D07, - 0x11D0800011D0A, - 0x11D0B00011D37, - 0x11D3A00011D3B, - 0x11D3C00011D3E, - 0x11D3F00011D48, - 0x11D5000011D5A, - 0x11D6000011D66, - 0x11D6700011D69, - 0x11D6A00011D8F, - 0x11D9000011D92, - 0x11D9300011D99, - 0x11DA000011DAA, - 0x11EE000011EF7, - 0x11F0000011F11, - 0x11F1200011F3B, - 0x11F3E00011F43, - 0x11F5000011F5B, - 0x11FB000011FB1, - 0x120000001239A, - 0x1248000012544, - 0x12F9000012FF1, - 0x1300000013430, - 0x1344000013456, - 0x13460000143FB, - 0x1440000014647, - 0x161000001613A, - 0x1680000016A39, - 0x16A4000016A5F, - 0x16A6000016A6A, - 0x16A7000016ABF, - 0x16AC000016ACA, - 0x16AD000016AEE, - 0x16AF000016AF5, - 0x16B0000016B37, - 0x16B4000016B44, - 0x16B5000016B5A, - 0x16B6300016B78, - 0x16B7D00016B90, - 0x16D4000016D6D, - 0x16D7000016D7A, - 0x16E6000016E80, - 0x16F0000016F4B, - 0x16F4F00016F88, - 0x16F8F00016FA0, - 0x16FE000016FE2, - 0x16FE300016FE5, - 0x16FF000016FF2, - 0x17000000187F8, - 0x1880000018CD6, - 0x18CFF00018D09, - 0x1AFF00001AFF4, - 0x1AFF50001AFFC, - 0x1AFFD0001AFFF, - 0x1B0000001B123, - 0x1B1320001B133, - 0x1B1500001B153, - 0x1B1550001B156, - 0x1B1640001B168, - 0x1B1700001B2FC, - 0x1BC000001BC6B, - 0x1BC700001BC7D, - 0x1BC800001BC89, - 0x1BC900001BC9A, - 0x1BC9D0001BC9F, - 0x1CCF00001CCFA, - 0x1CF000001CF2E, - 0x1CF300001CF47, - 0x1DA000001DA37, - 0x1DA3B0001DA6D, - 0x1DA750001DA76, - 0x1DA840001DA85, - 0x1DA9B0001DAA0, - 0x1DAA10001DAB0, - 0x1DF000001DF1F, - 0x1DF250001DF2B, - 0x1E0000001E007, - 0x1E0080001E019, - 0x1E01B0001E022, - 0x1E0230001E025, - 0x1E0260001E02B, - 0x1E08F0001E090, - 0x1E1000001E12D, - 0x1E1300001E13E, - 0x1E1400001E14A, - 0x1E14E0001E14F, - 0x1E2900001E2AF, - 0x1E2C00001E2FA, - 0x1E4D00001E4FA, - 0x1E5D00001E5FB, - 0x1E7E00001E7E7, - 0x1E7E80001E7EC, - 0x1E7ED0001E7EF, - 0x1E7F00001E7FF, - 0x1E8000001E8C5, - 0x1E8D00001E8D7, - 0x1E9220001E94C, - 0x1E9500001E95A, - 0x200000002A6E0, - 0x2A7000002B73A, - 0x2B7400002B81E, - 0x2B8200002CEA2, - 0x2CEB00002EBE1, - 0x2EBF00002EE5E, - 0x300000003134B, - 0x31350000323B0, - ), - "CONTEXTJ": (0x200C0000200E,), - "CONTEXTO": ( - 0xB7000000B8, - 0x37500000376, - 0x5F3000005F5, - 0x6600000066A, - 0x6F0000006FA, - 0x30FB000030FC, - ), -} diff --git a/venv/lib/python3.12/site-packages/idna/intranges.py b/venv/lib/python3.12/site-packages/idna/intranges.py deleted file mode 100644 index 7bfaa8d8..00000000 --- a/venv/lib/python3.12/site-packages/idna/intranges.py +++ /dev/null @@ -1,57 +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 -from typing import List, Tuple - - -def intranges_from_list(list_: List[int]) -> Tuple[int, ...]: - """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: int, end: int) -> int: - return (start << 32) | end - - -def _decode_range(r: int) -> Tuple[int, int]: - return (r >> 32), (r & ((1 << 32) - 1)) - - -def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool: - """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.12/site-packages/idna/package_data.py b/venv/lib/python3.12/site-packages/idna/package_data.py deleted file mode 100644 index 7272c8d9..00000000 --- a/venv/lib/python3.12/site-packages/idna/package_data.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "3.11" diff --git a/venv/lib/python3.12/site-packages/idna/py.typed b/venv/lib/python3.12/site-packages/idna/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/venv/lib/python3.12/site-packages/idna/uts46data.py b/venv/lib/python3.12/site-packages/idna/uts46data.py deleted file mode 100644 index 4610b71d..00000000 --- a/venv/lib/python3.12/site-packages/idna/uts46data.py +++ /dev/null @@ -1,8841 +0,0 @@ -# This file is automatically generated by tools/idna-data -# vim: set fileencoding=utf-8 : - -from typing import List, Tuple, Union - -"""IDNA Mapping Table from UTS46.""" - - -__version__ = "16.0.0" - - -def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x0, "V"), - (0x1, "V"), - (0x2, "V"), - (0x3, "V"), - (0x4, "V"), - (0x5, "V"), - (0x6, "V"), - (0x7, "V"), - (0x8, "V"), - (0x9, "V"), - (0xA, "V"), - (0xB, "V"), - (0xC, "V"), - (0xD, "V"), - (0xE, "V"), - (0xF, "V"), - (0x10, "V"), - (0x11, "V"), - (0x12, "V"), - (0x13, "V"), - (0x14, "V"), - (0x15, "V"), - (0x16, "V"), - (0x17, "V"), - (0x18, "V"), - (0x19, "V"), - (0x1A, "V"), - (0x1B, "V"), - (0x1C, "V"), - (0x1D, "V"), - (0x1E, "V"), - (0x1F, "V"), - (0x20, "V"), - (0x21, "V"), - (0x22, "V"), - (0x23, "V"), - (0x24, "V"), - (0x25, "V"), - (0x26, "V"), - (0x27, "V"), - (0x28, "V"), - (0x29, "V"), - (0x2A, "V"), - (0x2B, "V"), - (0x2C, "V"), - (0x2D, "V"), - (0x2E, "V"), - (0x2F, "V"), - (0x30, "V"), - (0x31, "V"), - (0x32, "V"), - (0x33, "V"), - (0x34, "V"), - (0x35, "V"), - (0x36, "V"), - (0x37, "V"), - (0x38, "V"), - (0x39, "V"), - (0x3A, "V"), - (0x3B, "V"), - (0x3C, "V"), - (0x3D, "V"), - (0x3E, "V"), - (0x3F, "V"), - (0x40, "V"), - (0x41, "M", "a"), - (0x42, "M", "b"), - (0x43, "M", "c"), - (0x44, "M", "d"), - (0x45, "M", "e"), - (0x46, "M", "f"), - (0x47, "M", "g"), - (0x48, "M", "h"), - (0x49, "M", "i"), - (0x4A, "M", "j"), - (0x4B, "M", "k"), - (0x4C, "M", "l"), - (0x4D, "M", "m"), - (0x4E, "M", "n"), - (0x4F, "M", "o"), - (0x50, "M", "p"), - (0x51, "M", "q"), - (0x52, "M", "r"), - (0x53, "M", "s"), - (0x54, "M", "t"), - (0x55, "M", "u"), - (0x56, "M", "v"), - (0x57, "M", "w"), - (0x58, "M", "x"), - (0x59, "M", "y"), - (0x5A, "M", "z"), - (0x5B, "V"), - (0x5C, "V"), - (0x5D, "V"), - (0x5E, "V"), - (0x5F, "V"), - (0x60, "V"), - (0x61, "V"), - (0x62, "V"), - (0x63, "V"), - ] - - -def _seg_1() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - 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, "V"), - (0x7C, "V"), - (0x7D, "V"), - (0x7E, "V"), - (0x7F, "V"), - (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, "M", " "), - (0xA1, "V"), - (0xA2, "V"), - (0xA3, "V"), - (0xA4, "V"), - (0xA5, "V"), - (0xA6, "V"), - (0xA7, "V"), - (0xA8, "M", " ̈"), - (0xA9, "V"), - (0xAA, "M", "a"), - (0xAB, "V"), - (0xAC, "V"), - (0xAD, "I"), - (0xAE, "V"), - (0xAF, "M", " ̄"), - (0xB0, "V"), - (0xB1, "V"), - (0xB2, "M", "2"), - (0xB3, "M", "3"), - (0xB4, "M", " ́"), - (0xB5, "M", "μ"), - (0xB6, "V"), - (0xB7, "V"), - (0xB8, "M", " ̧"), - (0xB9, "M", "1"), - (0xBA, "M", "o"), - (0xBB, "V"), - (0xBC, "M", "1⁄4"), - (0xBD, "M", "1⁄2"), - (0xBE, "M", "3⁄4"), - (0xBF, "V"), - (0xC0, "M", "à"), - (0xC1, "M", "á"), - (0xC2, "M", "â"), - (0xC3, "M", "ã"), - (0xC4, "M", "ä"), - (0xC5, "M", "å"), - (0xC6, "M", "æ"), - (0xC7, "M", "ç"), - ] - - -def _seg_2() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xC8, "M", "è"), - (0xC9, "M", "é"), - (0xCA, "M", "ê"), - (0xCB, "M", "ë"), - (0xCC, "M", "ì"), - (0xCD, "M", "í"), - (0xCE, "M", "î"), - (0xCF, "M", "ï"), - (0xD0, "M", "ð"), - (0xD1, "M", "ñ"), - (0xD2, "M", "ò"), - (0xD3, "M", "ó"), - (0xD4, "M", "ô"), - (0xD5, "M", "õ"), - (0xD6, "M", "ö"), - (0xD7, "V"), - (0xD8, "M", "ø"), - (0xD9, "M", "ù"), - (0xDA, "M", "ú"), - (0xDB, "M", "û"), - (0xDC, "M", "ü"), - (0xDD, "M", "ý"), - (0xDE, "M", "þ"), - (0xDF, "D", "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", "ā"), - (0x101, "V"), - (0x102, "M", "ă"), - (0x103, "V"), - (0x104, "M", "ą"), - (0x105, "V"), - (0x106, "M", "ć"), - (0x107, "V"), - (0x108, "M", "ĉ"), - (0x109, "V"), - (0x10A, "M", "ċ"), - (0x10B, "V"), - (0x10C, "M", "č"), - (0x10D, "V"), - (0x10E, "M", "ď"), - (0x10F, "V"), - (0x110, "M", "đ"), - (0x111, "V"), - (0x112, "M", "ē"), - (0x113, "V"), - (0x114, "M", "ĕ"), - (0x115, "V"), - (0x116, "M", "ė"), - (0x117, "V"), - (0x118, "M", "ę"), - (0x119, "V"), - (0x11A, "M", "ě"), - (0x11B, "V"), - (0x11C, "M", "ĝ"), - (0x11D, "V"), - (0x11E, "M", "ğ"), - (0x11F, "V"), - (0x120, "M", "ġ"), - (0x121, "V"), - (0x122, "M", "ģ"), - (0x123, "V"), - (0x124, "M", "ĥ"), - (0x125, "V"), - (0x126, "M", "ħ"), - (0x127, "V"), - (0x128, "M", "ĩ"), - (0x129, "V"), - (0x12A, "M", "ī"), - (0x12B, "V"), - ] - - -def _seg_3() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x12C, "M", "ĭ"), - (0x12D, "V"), - (0x12E, "M", "į"), - (0x12F, "V"), - (0x130, "M", "i̇"), - (0x131, "V"), - (0x132, "M", "ij"), - (0x134, "M", "ĵ"), - (0x135, "V"), - (0x136, "M", "ķ"), - (0x137, "V"), - (0x139, "M", "ĺ"), - (0x13A, "V"), - (0x13B, "M", "ļ"), - (0x13C, "V"), - (0x13D, "M", "ľ"), - (0x13E, "V"), - (0x13F, "M", "l·"), - (0x141, "M", "ł"), - (0x142, "V"), - (0x143, "M", "ń"), - (0x144, "V"), - (0x145, "M", "ņ"), - (0x146, "V"), - (0x147, "M", "ň"), - (0x148, "V"), - (0x149, "M", "ʼn"), - (0x14A, "M", "ŋ"), - (0x14B, "V"), - (0x14C, "M", "ō"), - (0x14D, "V"), - (0x14E, "M", "ŏ"), - (0x14F, "V"), - (0x150, "M", "ő"), - (0x151, "V"), - (0x152, "M", "œ"), - (0x153, "V"), - (0x154, "M", "ŕ"), - (0x155, "V"), - (0x156, "M", "ŗ"), - (0x157, "V"), - (0x158, "M", "ř"), - (0x159, "V"), - (0x15A, "M", "ś"), - (0x15B, "V"), - (0x15C, "M", "ŝ"), - (0x15D, "V"), - (0x15E, "M", "ş"), - (0x15F, "V"), - (0x160, "M", "š"), - (0x161, "V"), - (0x162, "M", "ţ"), - (0x163, "V"), - (0x164, "M", "ť"), - (0x165, "V"), - (0x166, "M", "ŧ"), - (0x167, "V"), - (0x168, "M", "ũ"), - (0x169, "V"), - (0x16A, "M", "ū"), - (0x16B, "V"), - (0x16C, "M", "ŭ"), - (0x16D, "V"), - (0x16E, "M", "ů"), - (0x16F, "V"), - (0x170, "M", "ű"), - (0x171, "V"), - (0x172, "M", "ų"), - (0x173, "V"), - (0x174, "M", "ŵ"), - (0x175, "V"), - (0x176, "M", "ŷ"), - (0x177, "V"), - (0x178, "M", "ÿ"), - (0x179, "M", "ź"), - (0x17A, "V"), - (0x17B, "M", "ż"), - (0x17C, "V"), - (0x17D, "M", "ž"), - (0x17E, "V"), - (0x17F, "M", "s"), - (0x180, "V"), - (0x181, "M", "ɓ"), - (0x182, "M", "ƃ"), - (0x183, "V"), - (0x184, "M", "ƅ"), - (0x185, "V"), - (0x186, "M", "ɔ"), - (0x187, "M", "ƈ"), - (0x188, "V"), - (0x189, "M", "ɖ"), - (0x18A, "M", "ɗ"), - (0x18B, "M", "ƌ"), - (0x18C, "V"), - (0x18E, "M", "ǝ"), - (0x18F, "M", "ə"), - (0x190, "M", "ɛ"), - (0x191, "M", "ƒ"), - (0x192, "V"), - (0x193, "M", "ɠ"), - ] - - -def _seg_4() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x194, "M", "ɣ"), - (0x195, "V"), - (0x196, "M", "ɩ"), - (0x197, "M", "ɨ"), - (0x198, "M", "ƙ"), - (0x199, "V"), - (0x19C, "M", "ɯ"), - (0x19D, "M", "ɲ"), - (0x19E, "V"), - (0x19F, "M", "ɵ"), - (0x1A0, "M", "ơ"), - (0x1A1, "V"), - (0x1A2, "M", "ƣ"), - (0x1A3, "V"), - (0x1A4, "M", "ƥ"), - (0x1A5, "V"), - (0x1A6, "M", "ʀ"), - (0x1A7, "M", "ƨ"), - (0x1A8, "V"), - (0x1A9, "M", "ʃ"), - (0x1AA, "V"), - (0x1AC, "M", "ƭ"), - (0x1AD, "V"), - (0x1AE, "M", "ʈ"), - (0x1AF, "M", "ư"), - (0x1B0, "V"), - (0x1B1, "M", "ʊ"), - (0x1B2, "M", "ʋ"), - (0x1B3, "M", "ƴ"), - (0x1B4, "V"), - (0x1B5, "M", "ƶ"), - (0x1B6, "V"), - (0x1B7, "M", "ʒ"), - (0x1B8, "M", "ƹ"), - (0x1B9, "V"), - (0x1BC, "M", "ƽ"), - (0x1BD, "V"), - (0x1C4, "M", "dž"), - (0x1C7, "M", "lj"), - (0x1CA, "M", "nj"), - (0x1CD, "M", "ǎ"), - (0x1CE, "V"), - (0x1CF, "M", "ǐ"), - (0x1D0, "V"), - (0x1D1, "M", "ǒ"), - (0x1D2, "V"), - (0x1D3, "M", "ǔ"), - (0x1D4, "V"), - (0x1D5, "M", "ǖ"), - (0x1D6, "V"), - (0x1D7, "M", "ǘ"), - (0x1D8, "V"), - (0x1D9, "M", "ǚ"), - (0x1DA, "V"), - (0x1DB, "M", "ǜ"), - (0x1DC, "V"), - (0x1DE, "M", "ǟ"), - (0x1DF, "V"), - (0x1E0, "M", "ǡ"), - (0x1E1, "V"), - (0x1E2, "M", "ǣ"), - (0x1E3, "V"), - (0x1E4, "M", "ǥ"), - (0x1E5, "V"), - (0x1E6, "M", "ǧ"), - (0x1E7, "V"), - (0x1E8, "M", "ǩ"), - (0x1E9, "V"), - (0x1EA, "M", "ǫ"), - (0x1EB, "V"), - (0x1EC, "M", "ǭ"), - (0x1ED, "V"), - (0x1EE, "M", "ǯ"), - (0x1EF, "V"), - (0x1F1, "M", "dz"), - (0x1F4, "M", "ǵ"), - (0x1F5, "V"), - (0x1F6, "M", "ƕ"), - (0x1F7, "M", "ƿ"), - (0x1F8, "M", "ǹ"), - (0x1F9, "V"), - (0x1FA, "M", "ǻ"), - (0x1FB, "V"), - (0x1FC, "M", "ǽ"), - (0x1FD, "V"), - (0x1FE, "M", "ǿ"), - (0x1FF, "V"), - (0x200, "M", "ȁ"), - (0x201, "V"), - (0x202, "M", "ȃ"), - (0x203, "V"), - (0x204, "M", "ȅ"), - (0x205, "V"), - (0x206, "M", "ȇ"), - (0x207, "V"), - (0x208, "M", "ȉ"), - (0x209, "V"), - (0x20A, "M", "ȋ"), - (0x20B, "V"), - (0x20C, "M", "ȍ"), - ] - - -def _seg_5() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x20D, "V"), - (0x20E, "M", "ȏ"), - (0x20F, "V"), - (0x210, "M", "ȑ"), - (0x211, "V"), - (0x212, "M", "ȓ"), - (0x213, "V"), - (0x214, "M", "ȕ"), - (0x215, "V"), - (0x216, "M", "ȗ"), - (0x217, "V"), - (0x218, "M", "ș"), - (0x219, "V"), - (0x21A, "M", "ț"), - (0x21B, "V"), - (0x21C, "M", "ȝ"), - (0x21D, "V"), - (0x21E, "M", "ȟ"), - (0x21F, "V"), - (0x220, "M", "ƞ"), - (0x221, "V"), - (0x222, "M", "ȣ"), - (0x223, "V"), - (0x224, "M", "ȥ"), - (0x225, "V"), - (0x226, "M", "ȧ"), - (0x227, "V"), - (0x228, "M", "ȩ"), - (0x229, "V"), - (0x22A, "M", "ȫ"), - (0x22B, "V"), - (0x22C, "M", "ȭ"), - (0x22D, "V"), - (0x22E, "M", "ȯ"), - (0x22F, "V"), - (0x230, "M", "ȱ"), - (0x231, "V"), - (0x232, "M", "ȳ"), - (0x233, "V"), - (0x23A, "M", "ⱥ"), - (0x23B, "M", "ȼ"), - (0x23C, "V"), - (0x23D, "M", "ƚ"), - (0x23E, "M", "ⱦ"), - (0x23F, "V"), - (0x241, "M", "ɂ"), - (0x242, "V"), - (0x243, "M", "ƀ"), - (0x244, "M", "ʉ"), - (0x245, "M", "ʌ"), - (0x246, "M", "ɇ"), - (0x247, "V"), - (0x248, "M", "ɉ"), - (0x249, "V"), - (0x24A, "M", "ɋ"), - (0x24B, "V"), - (0x24C, "M", "ɍ"), - (0x24D, "V"), - (0x24E, "M", "ɏ"), - (0x24F, "V"), - (0x2B0, "M", "h"), - (0x2B1, "M", "ɦ"), - (0x2B2, "M", "j"), - (0x2B3, "M", "r"), - (0x2B4, "M", "ɹ"), - (0x2B5, "M", "ɻ"), - (0x2B6, "M", "ʁ"), - (0x2B7, "M", "w"), - (0x2B8, "M", "y"), - (0x2B9, "V"), - (0x2D8, "M", " ̆"), - (0x2D9, "M", " ̇"), - (0x2DA, "M", " ̊"), - (0x2DB, "M", " ̨"), - (0x2DC, "M", " ̃"), - (0x2DD, "M", " ̋"), - (0x2DE, "V"), - (0x2E0, "M", "ɣ"), - (0x2E1, "M", "l"), - (0x2E2, "M", "s"), - (0x2E3, "M", "x"), - (0x2E4, "M", "ʕ"), - (0x2E5, "V"), - (0x340, "M", "̀"), - (0x341, "M", "́"), - (0x342, "V"), - (0x343, "M", "̓"), - (0x344, "M", "̈́"), - (0x345, "M", "ι"), - (0x346, "V"), - (0x34F, "I"), - (0x350, "V"), - (0x370, "M", "ͱ"), - (0x371, "V"), - (0x372, "M", "ͳ"), - (0x373, "V"), - (0x374, "M", "ʹ"), - (0x375, "V"), - (0x376, "M", "ͷ"), - (0x377, "V"), - ] - - -def _seg_6() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x378, "X"), - (0x37A, "M", " ι"), - (0x37B, "V"), - (0x37E, "M", ";"), - (0x37F, "M", "ϳ"), - (0x380, "X"), - (0x384, "M", " ́"), - (0x385, "M", " ̈́"), - (0x386, "M", "ά"), - (0x387, "M", "·"), - (0x388, "M", "έ"), - (0x389, "M", "ή"), - (0x38A, "M", "ί"), - (0x38B, "X"), - (0x38C, "M", "ό"), - (0x38D, "X"), - (0x38E, "M", "ύ"), - (0x38F, "M", "ώ"), - (0x390, "V"), - (0x391, "M", "α"), - (0x392, "M", "β"), - (0x393, "M", "γ"), - (0x394, "M", "δ"), - (0x395, "M", "ε"), - (0x396, "M", "ζ"), - (0x397, "M", "η"), - (0x398, "M", "θ"), - (0x399, "M", "ι"), - (0x39A, "M", "κ"), - (0x39B, "M", "λ"), - (0x39C, "M", "μ"), - (0x39D, "M", "ν"), - (0x39E, "M", "ξ"), - (0x39F, "M", "ο"), - (0x3A0, "M", "π"), - (0x3A1, "M", "ρ"), - (0x3A2, "X"), - (0x3A3, "M", "σ"), - (0x3A4, "M", "τ"), - (0x3A5, "M", "υ"), - (0x3A6, "M", "φ"), - (0x3A7, "M", "χ"), - (0x3A8, "M", "ψ"), - (0x3A9, "M", "ω"), - (0x3AA, "M", "ϊ"), - (0x3AB, "M", "ϋ"), - (0x3AC, "V"), - (0x3C2, "D", "σ"), - (0x3C3, "V"), - (0x3CF, "M", "ϗ"), - (0x3D0, "M", "β"), - (0x3D1, "M", "θ"), - (0x3D2, "M", "υ"), - (0x3D3, "M", "ύ"), - (0x3D4, "M", "ϋ"), - (0x3D5, "M", "φ"), - (0x3D6, "M", "π"), - (0x3D7, "V"), - (0x3D8, "M", "ϙ"), - (0x3D9, "V"), - (0x3DA, "M", "ϛ"), - (0x3DB, "V"), - (0x3DC, "M", "ϝ"), - (0x3DD, "V"), - (0x3DE, "M", "ϟ"), - (0x3DF, "V"), - (0x3E0, "M", "ϡ"), - (0x3E1, "V"), - (0x3E2, "M", "ϣ"), - (0x3E3, "V"), - (0x3E4, "M", "ϥ"), - (0x3E5, "V"), - (0x3E6, "M", "ϧ"), - (0x3E7, "V"), - (0x3E8, "M", "ϩ"), - (0x3E9, "V"), - (0x3EA, "M", "ϫ"), - (0x3EB, "V"), - (0x3EC, "M", "ϭ"), - (0x3ED, "V"), - (0x3EE, "M", "ϯ"), - (0x3EF, "V"), - (0x3F0, "M", "κ"), - (0x3F1, "M", "ρ"), - (0x3F2, "M", "σ"), - (0x3F3, "V"), - (0x3F4, "M", "θ"), - (0x3F5, "M", "ε"), - (0x3F6, "V"), - (0x3F7, "M", "ϸ"), - (0x3F8, "V"), - (0x3F9, "M", "σ"), - (0x3FA, "M", "ϻ"), - (0x3FB, "V"), - (0x3FD, "M", "ͻ"), - (0x3FE, "M", "ͼ"), - (0x3FF, "M", "ͽ"), - (0x400, "M", "ѐ"), - (0x401, "M", "ё"), - (0x402, "M", "ђ"), - ] - - -def _seg_7() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x403, "M", "ѓ"), - (0x404, "M", "є"), - (0x405, "M", "ѕ"), - (0x406, "M", "і"), - (0x407, "M", "ї"), - (0x408, "M", "ј"), - (0x409, "M", "љ"), - (0x40A, "M", "њ"), - (0x40B, "M", "ћ"), - (0x40C, "M", "ќ"), - (0x40D, "M", "ѝ"), - (0x40E, "M", "ў"), - (0x40F, "M", "џ"), - (0x410, "M", "а"), - (0x411, "M", "б"), - (0x412, "M", "в"), - (0x413, "M", "г"), - (0x414, "M", "д"), - (0x415, "M", "е"), - (0x416, "M", "ж"), - (0x417, "M", "з"), - (0x418, "M", "и"), - (0x419, "M", "й"), - (0x41A, "M", "к"), - (0x41B, "M", "л"), - (0x41C, "M", "м"), - (0x41D, "M", "н"), - (0x41E, "M", "о"), - (0x41F, "M", "п"), - (0x420, "M", "р"), - (0x421, "M", "с"), - (0x422, "M", "т"), - (0x423, "M", "у"), - (0x424, "M", "ф"), - (0x425, "M", "х"), - (0x426, "M", "ц"), - (0x427, "M", "ч"), - (0x428, "M", "ш"), - (0x429, "M", "щ"), - (0x42A, "M", "ъ"), - (0x42B, "M", "ы"), - (0x42C, "M", "ь"), - (0x42D, "M", "э"), - (0x42E, "M", "ю"), - (0x42F, "M", "я"), - (0x430, "V"), - (0x460, "M", "ѡ"), - (0x461, "V"), - (0x462, "M", "ѣ"), - (0x463, "V"), - (0x464, "M", "ѥ"), - (0x465, "V"), - (0x466, "M", "ѧ"), - (0x467, "V"), - (0x468, "M", "ѩ"), - (0x469, "V"), - (0x46A, "M", "ѫ"), - (0x46B, "V"), - (0x46C, "M", "ѭ"), - (0x46D, "V"), - (0x46E, "M", "ѯ"), - (0x46F, "V"), - (0x470, "M", "ѱ"), - (0x471, "V"), - (0x472, "M", "ѳ"), - (0x473, "V"), - (0x474, "M", "ѵ"), - (0x475, "V"), - (0x476, "M", "ѷ"), - (0x477, "V"), - (0x478, "M", "ѹ"), - (0x479, "V"), - (0x47A, "M", "ѻ"), - (0x47B, "V"), - (0x47C, "M", "ѽ"), - (0x47D, "V"), - (0x47E, "M", "ѿ"), - (0x47F, "V"), - (0x480, "M", "ҁ"), - (0x481, "V"), - (0x48A, "M", "ҋ"), - (0x48B, "V"), - (0x48C, "M", "ҍ"), - (0x48D, "V"), - (0x48E, "M", "ҏ"), - (0x48F, "V"), - (0x490, "M", "ґ"), - (0x491, "V"), - (0x492, "M", "ғ"), - (0x493, "V"), - (0x494, "M", "ҕ"), - (0x495, "V"), - (0x496, "M", "җ"), - (0x497, "V"), - (0x498, "M", "ҙ"), - (0x499, "V"), - (0x49A, "M", "қ"), - (0x49B, "V"), - (0x49C, "M", "ҝ"), - (0x49D, "V"), - ] - - -def _seg_8() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x49E, "M", "ҟ"), - (0x49F, "V"), - (0x4A0, "M", "ҡ"), - (0x4A1, "V"), - (0x4A2, "M", "ң"), - (0x4A3, "V"), - (0x4A4, "M", "ҥ"), - (0x4A5, "V"), - (0x4A6, "M", "ҧ"), - (0x4A7, "V"), - (0x4A8, "M", "ҩ"), - (0x4A9, "V"), - (0x4AA, "M", "ҫ"), - (0x4AB, "V"), - (0x4AC, "M", "ҭ"), - (0x4AD, "V"), - (0x4AE, "M", "ү"), - (0x4AF, "V"), - (0x4B0, "M", "ұ"), - (0x4B1, "V"), - (0x4B2, "M", "ҳ"), - (0x4B3, "V"), - (0x4B4, "M", "ҵ"), - (0x4B5, "V"), - (0x4B6, "M", "ҷ"), - (0x4B7, "V"), - (0x4B8, "M", "ҹ"), - (0x4B9, "V"), - (0x4BA, "M", "һ"), - (0x4BB, "V"), - (0x4BC, "M", "ҽ"), - (0x4BD, "V"), - (0x4BE, "M", "ҿ"), - (0x4BF, "V"), - (0x4C0, "M", "ӏ"), - (0x4C1, "M", "ӂ"), - (0x4C2, "V"), - (0x4C3, "M", "ӄ"), - (0x4C4, "V"), - (0x4C5, "M", "ӆ"), - (0x4C6, "V"), - (0x4C7, "M", "ӈ"), - (0x4C8, "V"), - (0x4C9, "M", "ӊ"), - (0x4CA, "V"), - (0x4CB, "M", "ӌ"), - (0x4CC, "V"), - (0x4CD, "M", "ӎ"), - (0x4CE, "V"), - (0x4D0, "M", "ӑ"), - (0x4D1, "V"), - (0x4D2, "M", "ӓ"), - (0x4D3, "V"), - (0x4D4, "M", "ӕ"), - (0x4D5, "V"), - (0x4D6, "M", "ӗ"), - (0x4D7, "V"), - (0x4D8, "M", "ә"), - (0x4D9, "V"), - (0x4DA, "M", "ӛ"), - (0x4DB, "V"), - (0x4DC, "M", "ӝ"), - (0x4DD, "V"), - (0x4DE, "M", "ӟ"), - (0x4DF, "V"), - (0x4E0, "M", "ӡ"), - (0x4E1, "V"), - (0x4E2, "M", "ӣ"), - (0x4E3, "V"), - (0x4E4, "M", "ӥ"), - (0x4E5, "V"), - (0x4E6, "M", "ӧ"), - (0x4E7, "V"), - (0x4E8, "M", "ө"), - (0x4E9, "V"), - (0x4EA, "M", "ӫ"), - (0x4EB, "V"), - (0x4EC, "M", "ӭ"), - (0x4ED, "V"), - (0x4EE, "M", "ӯ"), - (0x4EF, "V"), - (0x4F0, "M", "ӱ"), - (0x4F1, "V"), - (0x4F2, "M", "ӳ"), - (0x4F3, "V"), - (0x4F4, "M", "ӵ"), - (0x4F5, "V"), - (0x4F6, "M", "ӷ"), - (0x4F7, "V"), - (0x4F8, "M", "ӹ"), - (0x4F9, "V"), - (0x4FA, "M", "ӻ"), - (0x4FB, "V"), - (0x4FC, "M", "ӽ"), - (0x4FD, "V"), - (0x4FE, "M", "ӿ"), - (0x4FF, "V"), - (0x500, "M", "ԁ"), - (0x501, "V"), - (0x502, "M", "ԃ"), - ] - - -def _seg_9() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x503, "V"), - (0x504, "M", "ԅ"), - (0x505, "V"), - (0x506, "M", "ԇ"), - (0x507, "V"), - (0x508, "M", "ԉ"), - (0x509, "V"), - (0x50A, "M", "ԋ"), - (0x50B, "V"), - (0x50C, "M", "ԍ"), - (0x50D, "V"), - (0x50E, "M", "ԏ"), - (0x50F, "V"), - (0x510, "M", "ԑ"), - (0x511, "V"), - (0x512, "M", "ԓ"), - (0x513, "V"), - (0x514, "M", "ԕ"), - (0x515, "V"), - (0x516, "M", "ԗ"), - (0x517, "V"), - (0x518, "M", "ԙ"), - (0x519, "V"), - (0x51A, "M", "ԛ"), - (0x51B, "V"), - (0x51C, "M", "ԝ"), - (0x51D, "V"), - (0x51E, "M", "ԟ"), - (0x51F, "V"), - (0x520, "M", "ԡ"), - (0x521, "V"), - (0x522, "M", "ԣ"), - (0x523, "V"), - (0x524, "M", "ԥ"), - (0x525, "V"), - (0x526, "M", "ԧ"), - (0x527, "V"), - (0x528, "M", "ԩ"), - (0x529, "V"), - (0x52A, "M", "ԫ"), - (0x52B, "V"), - (0x52C, "M", "ԭ"), - (0x52D, "V"), - (0x52E, "M", "ԯ"), - (0x52F, "V"), - (0x530, "X"), - (0x531, "M", "ա"), - (0x532, "M", "բ"), - (0x533, "M", "գ"), - (0x534, "M", "դ"), - (0x535, "M", "ե"), - (0x536, "M", "զ"), - (0x537, "M", "է"), - (0x538, "M", "ը"), - (0x539, "M", "թ"), - (0x53A, "M", "ժ"), - (0x53B, "M", "ի"), - (0x53C, "M", "լ"), - (0x53D, "M", "խ"), - (0x53E, "M", "ծ"), - (0x53F, "M", "կ"), - (0x540, "M", "հ"), - (0x541, "M", "ձ"), - (0x542, "M", "ղ"), - (0x543, "M", "ճ"), - (0x544, "M", "մ"), - (0x545, "M", "յ"), - (0x546, "M", "ն"), - (0x547, "M", "շ"), - (0x548, "M", "ո"), - (0x549, "M", "չ"), - (0x54A, "M", "պ"), - (0x54B, "M", "ջ"), - (0x54C, "M", "ռ"), - (0x54D, "M", "ս"), - (0x54E, "M", "վ"), - (0x54F, "M", "տ"), - (0x550, "M", "ր"), - (0x551, "M", "ց"), - (0x552, "M", "ւ"), - (0x553, "M", "փ"), - (0x554, "M", "ք"), - (0x555, "M", "օ"), - (0x556, "M", "ֆ"), - (0x557, "X"), - (0x559, "V"), - (0x587, "M", "եւ"), - (0x588, "V"), - (0x58B, "X"), - (0x58D, "V"), - (0x590, "X"), - (0x591, "V"), - (0x5C8, "X"), - (0x5D0, "V"), - (0x5EB, "X"), - (0x5EF, "V"), - (0x5F5, "X"), - (0x606, "V"), - (0x61C, "X"), - (0x61D, "V"), - ] - - -def _seg_10() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x675, "M", "اٴ"), - (0x676, "M", "وٴ"), - (0x677, "M", "ۇٴ"), - (0x678, "M", "يٴ"), - (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"), - (0x870, "V"), - (0x88F, "X"), - (0x897, "V"), - (0x8E2, "X"), - (0x8E3, "V"), - (0x958, "M", "क़"), - (0x959, "M", "ख़"), - (0x95A, "M", "ग़"), - (0x95B, "M", "ज़"), - (0x95C, "M", "ड़"), - (0x95D, "M", "ढ़"), - (0x95E, "M", "फ़"), - (0x95F, "M", "य़"), - (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", "ড়"), - (0x9DD, "M", "ঢ়"), - (0x9DE, "X"), - (0x9DF, "M", "য়"), - (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", "ਲ਼"), - (0xA34, "X"), - (0xA35, "V"), - (0xA36, "M", "ਸ਼"), - (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", "ਖ਼"), - (0xA5A, "M", "ਗ਼"), - (0xA5B, "M", "ਜ਼"), - (0xA5C, "V"), - (0xA5D, "X"), - ] - - -def _seg_11() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xA5E, "M", "ਫ਼"), - (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"), - (0xB55, "V"), - (0xB58, "X"), - (0xB5C, "M", "ଡ଼"), - (0xB5D, "M", "ଢ଼"), - (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"), - (0xC29, "X"), - (0xC2A, "V"), - ] - - -def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xC3A, "X"), - (0xC3C, "V"), - (0xC45, "X"), - (0xC46, "V"), - (0xC49, "X"), - (0xC4A, "V"), - (0xC4E, "X"), - (0xC55, "V"), - (0xC57, "X"), - (0xC58, "V"), - (0xC5B, "X"), - (0xC5D, "V"), - (0xC5E, "X"), - (0xC60, "V"), - (0xC64, "X"), - (0xC66, "V"), - (0xC70, "X"), - (0xC77, "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"), - (0xCDD, "V"), - (0xCDF, "X"), - (0xCE0, "V"), - (0xCE4, "X"), - (0xCE6, "V"), - (0xCF0, "X"), - (0xCF1, "V"), - (0xCF4, "X"), - (0xD00, "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"), - (0xD81, "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", "ํา"), - (0xE34, "V"), - (0xE3B, "X"), - (0xE3F, "V"), - (0xE5C, "X"), - (0xE81, "V"), - (0xE83, "X"), - (0xE84, "V"), - (0xE85, "X"), - (0xE86, "V"), - (0xE8B, "X"), - (0xE8C, "V"), - (0xEA4, "X"), - (0xEA5, "V"), - (0xEA6, "X"), - (0xEA7, "V"), - (0xEB3, "M", "ໍາ"), - (0xEB4, "V"), - ] - - -def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xEBE, "X"), - (0xEC0, "V"), - (0xEC5, "X"), - (0xEC6, "V"), - (0xEC7, "X"), - (0xEC8, "V"), - (0xECF, "X"), - (0xED0, "V"), - (0xEDA, "X"), - (0xEDC, "M", "ຫນ"), - (0xEDD, "M", "ຫມ"), - (0xEDE, "V"), - (0xEE0, "X"), - (0xF00, "V"), - (0xF0C, "M", "་"), - (0xF0D, "V"), - (0xF43, "M", "གྷ"), - (0xF44, "V"), - (0xF48, "X"), - (0xF49, "V"), - (0xF4D, "M", "ཌྷ"), - (0xF4E, "V"), - (0xF52, "M", "དྷ"), - (0xF53, "V"), - (0xF57, "M", "བྷ"), - (0xF58, "V"), - (0xF5C, "M", "ཛྷ"), - (0xF5D, "V"), - (0xF69, "M", "ཀྵ"), - (0xF6A, "V"), - (0xF6D, "X"), - (0xF71, "V"), - (0xF73, "M", "ཱི"), - (0xF74, "V"), - (0xF75, "M", "ཱུ"), - (0xF76, "M", "ྲྀ"), - (0xF77, "M", "ྲཱྀ"), - (0xF78, "M", "ླྀ"), - (0xF79, "M", "ླཱྀ"), - (0xF7A, "V"), - (0xF81, "M", "ཱྀ"), - (0xF82, "V"), - (0xF93, "M", "ྒྷ"), - (0xF94, "V"), - (0xF98, "X"), - (0xF99, "V"), - (0xF9D, "M", "ྜྷ"), - (0xF9E, "V"), - (0xFA2, "M", "ྡྷ"), - (0xFA3, "V"), - (0xFA7, "M", "ྦྷ"), - (0xFA8, "V"), - (0xFAC, "M", "ྫྷ"), - (0xFAD, "V"), - (0xFB9, "M", "ྐྵ"), - (0xFBA, "V"), - (0xFBD, "X"), - (0xFBE, "V"), - (0xFCD, "X"), - (0xFCE, "V"), - (0xFDB, "X"), - (0x1000, "V"), - (0x10A0, "M", "ⴀ"), - (0x10A1, "M", "ⴁ"), - (0x10A2, "M", "ⴂ"), - (0x10A3, "M", "ⴃ"), - (0x10A4, "M", "ⴄ"), - (0x10A5, "M", "ⴅ"), - (0x10A6, "M", "ⴆ"), - (0x10A7, "M", "ⴇ"), - (0x10A8, "M", "ⴈ"), - (0x10A9, "M", "ⴉ"), - (0x10AA, "M", "ⴊ"), - (0x10AB, "M", "ⴋ"), - (0x10AC, "M", "ⴌ"), - (0x10AD, "M", "ⴍ"), - (0x10AE, "M", "ⴎ"), - (0x10AF, "M", "ⴏ"), - (0x10B0, "M", "ⴐ"), - (0x10B1, "M", "ⴑ"), - (0x10B2, "M", "ⴒ"), - (0x10B3, "M", "ⴓ"), - (0x10B4, "M", "ⴔ"), - (0x10B5, "M", "ⴕ"), - (0x10B6, "M", "ⴖ"), - (0x10B7, "M", "ⴗ"), - (0x10B8, "M", "ⴘ"), - (0x10B9, "M", "ⴙ"), - (0x10BA, "M", "ⴚ"), - (0x10BB, "M", "ⴛ"), - (0x10BC, "M", "ⴜ"), - (0x10BD, "M", "ⴝ"), - (0x10BE, "M", "ⴞ"), - (0x10BF, "M", "ⴟ"), - (0x10C0, "M", "ⴠ"), - (0x10C1, "M", "ⴡ"), - (0x10C2, "M", "ⴢ"), - (0x10C3, "M", "ⴣ"), - (0x10C4, "M", "ⴤ"), - (0x10C5, "M", "ⴥ"), - ] - - -def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x10C6, "X"), - (0x10C7, "M", "ⴧ"), - (0x10C8, "X"), - (0x10CD, "M", "ⴭ"), - (0x10CE, "X"), - (0x10D0, "V"), - (0x10FC, "M", "ნ"), - (0x10FD, "V"), - (0x115F, "I"), - (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"), - (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", "Ᏸ"), - (0x13F9, "M", "Ᏹ"), - (0x13FA, "M", "Ᏺ"), - (0x13FB, "M", "Ᏻ"), - (0x13FC, "M", "Ᏼ"), - (0x13FD, "M", "Ᏽ"), - (0x13FE, "X"), - (0x1400, "V"), - (0x1680, "X"), - (0x1681, "V"), - (0x169D, "X"), - (0x16A0, "V"), - (0x16F9, "X"), - (0x1700, "V"), - (0x1716, "X"), - (0x171F, "V"), - (0x1737, "X"), - (0x1740, "V"), - (0x1754, "X"), - (0x1760, "V"), - (0x176D, "X"), - (0x176E, "V"), - (0x1771, "X"), - (0x1772, "V"), - (0x1774, "X"), - (0x1780, "V"), - (0x17B4, "I"), - (0x17B6, "V"), - (0x17DE, "X"), - (0x17E0, "V"), - (0x17EA, "X"), - (0x17F0, "V"), - (0x17FA, "X"), - (0x1800, "V"), - (0x180B, "I"), - (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"), - ] - - -def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (0x1A9A, "X"), - (0x1AA0, "V"), - (0x1AAE, "X"), - (0x1AB0, "V"), - (0x1ACF, "X"), - (0x1B00, "V"), - (0x1B4D, "X"), - (0x1B4E, "V"), - (0x1BF4, "X"), - (0x1BFC, "V"), - (0x1C38, "X"), - (0x1C3B, "V"), - (0x1C4A, "X"), - (0x1C4D, "V"), - (0x1C80, "M", "в"), - (0x1C81, "M", "д"), - (0x1C82, "M", "о"), - (0x1C83, "M", "с"), - (0x1C84, "M", "т"), - (0x1C86, "M", "ъ"), - (0x1C87, "M", "ѣ"), - (0x1C88, "M", "ꙋ"), - (0x1C89, "M", "ᲊ"), - (0x1C8A, "V"), - (0x1C8B, "X"), - (0x1C90, "M", "ა"), - (0x1C91, "M", "ბ"), - (0x1C92, "M", "გ"), - (0x1C93, "M", "დ"), - (0x1C94, "M", "ე"), - (0x1C95, "M", "ვ"), - (0x1C96, "M", "ზ"), - (0x1C97, "M", "თ"), - (0x1C98, "M", "ი"), - (0x1C99, "M", "კ"), - (0x1C9A, "M", "ლ"), - (0x1C9B, "M", "მ"), - (0x1C9C, "M", "ნ"), - (0x1C9D, "M", "ო"), - (0x1C9E, "M", "პ"), - (0x1C9F, "M", "ჟ"), - (0x1CA0, "M", "რ"), - (0x1CA1, "M", "ს"), - (0x1CA2, "M", "ტ"), - (0x1CA3, "M", "უ"), - (0x1CA4, "M", "ფ"), - (0x1CA5, "M", "ქ"), - (0x1CA6, "M", "ღ"), - (0x1CA7, "M", "ყ"), - (0x1CA8, "M", "შ"), - (0x1CA9, "M", "ჩ"), - (0x1CAA, "M", "ც"), - (0x1CAB, "M", "ძ"), - (0x1CAC, "M", "წ"), - (0x1CAD, "M", "ჭ"), - (0x1CAE, "M", "ხ"), - (0x1CAF, "M", "ჯ"), - (0x1CB0, "M", "ჰ"), - (0x1CB1, "M", "ჱ"), - (0x1CB2, "M", "ჲ"), - (0x1CB3, "M", "ჳ"), - (0x1CB4, "M", "ჴ"), - (0x1CB5, "M", "ჵ"), - (0x1CB6, "M", "ჶ"), - (0x1CB7, "M", "ჷ"), - (0x1CB8, "M", "ჸ"), - (0x1CB9, "M", "ჹ"), - (0x1CBA, "M", "ჺ"), - (0x1CBB, "X"), - (0x1CBD, "M", "ჽ"), - (0x1CBE, "M", "ჾ"), - (0x1CBF, "M", "ჿ"), - (0x1CC0, "V"), - (0x1CC8, "X"), - (0x1CD0, "V"), - (0x1CFB, "X"), - (0x1D00, "V"), - (0x1D2C, "M", "a"), - (0x1D2D, "M", "æ"), - (0x1D2E, "M", "b"), - (0x1D2F, "V"), - (0x1D30, "M", "d"), - (0x1D31, "M", "e"), - ] - - -def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D32, "M", "ǝ"), - (0x1D33, "M", "g"), - (0x1D34, "M", "h"), - (0x1D35, "M", "i"), - (0x1D36, "M", "j"), - (0x1D37, "M", "k"), - (0x1D38, "M", "l"), - (0x1D39, "M", "m"), - (0x1D3A, "M", "n"), - (0x1D3B, "V"), - (0x1D3C, "M", "o"), - (0x1D3D, "M", "ȣ"), - (0x1D3E, "M", "p"), - (0x1D3F, "M", "r"), - (0x1D40, "M", "t"), - (0x1D41, "M", "u"), - (0x1D42, "M", "w"), - (0x1D43, "M", "a"), - (0x1D44, "M", "ɐ"), - (0x1D45, "M", "ɑ"), - (0x1D46, "M", "ᴂ"), - (0x1D47, "M", "b"), - (0x1D48, "M", "d"), - (0x1D49, "M", "e"), - (0x1D4A, "M", "ə"), - (0x1D4B, "M", "ɛ"), - (0x1D4C, "M", "ɜ"), - (0x1D4D, "M", "g"), - (0x1D4E, "V"), - (0x1D4F, "M", "k"), - (0x1D50, "M", "m"), - (0x1D51, "M", "ŋ"), - (0x1D52, "M", "o"), - (0x1D53, "M", "ɔ"), - (0x1D54, "M", "ᴖ"), - (0x1D55, "M", "ᴗ"), - (0x1D56, "M", "p"), - (0x1D57, "M", "t"), - (0x1D58, "M", "u"), - (0x1D59, "M", "ᴝ"), - (0x1D5A, "M", "ɯ"), - (0x1D5B, "M", "v"), - (0x1D5C, "M", "ᴥ"), - (0x1D5D, "M", "β"), - (0x1D5E, "M", "γ"), - (0x1D5F, "M", "δ"), - (0x1D60, "M", "φ"), - (0x1D61, "M", "χ"), - (0x1D62, "M", "i"), - (0x1D63, "M", "r"), - (0x1D64, "M", "u"), - (0x1D65, "M", "v"), - (0x1D66, "M", "β"), - (0x1D67, "M", "γ"), - (0x1D68, "M", "ρ"), - (0x1D69, "M", "φ"), - (0x1D6A, "M", "χ"), - (0x1D6B, "V"), - (0x1D78, "M", "н"), - (0x1D79, "V"), - (0x1D9B, "M", "ɒ"), - (0x1D9C, "M", "c"), - (0x1D9D, "M", "ɕ"), - (0x1D9E, "M", "ð"), - (0x1D9F, "M", "ɜ"), - (0x1DA0, "M", "f"), - (0x1DA1, "M", "ɟ"), - (0x1DA2, "M", "ɡ"), - (0x1DA3, "M", "ɥ"), - (0x1DA4, "M", "ɨ"), - (0x1DA5, "M", "ɩ"), - (0x1DA6, "M", "ɪ"), - (0x1DA7, "M", "ᵻ"), - (0x1DA8, "M", "ʝ"), - (0x1DA9, "M", "ɭ"), - (0x1DAA, "M", "ᶅ"), - (0x1DAB, "M", "ʟ"), - (0x1DAC, "M", "ɱ"), - (0x1DAD, "M", "ɰ"), - (0x1DAE, "M", "ɲ"), - (0x1DAF, "M", "ɳ"), - (0x1DB0, "M", "ɴ"), - (0x1DB1, "M", "ɵ"), - (0x1DB2, "M", "ɸ"), - (0x1DB3, "M", "ʂ"), - (0x1DB4, "M", "ʃ"), - (0x1DB5, "M", "ƫ"), - (0x1DB6, "M", "ʉ"), - (0x1DB7, "M", "ʊ"), - (0x1DB8, "M", "ᴜ"), - (0x1DB9, "M", "ʋ"), - (0x1DBA, "M", "ʌ"), - (0x1DBB, "M", "z"), - (0x1DBC, "M", "ʐ"), - (0x1DBD, "M", "ʑ"), - (0x1DBE, "M", "ʒ"), - (0x1DBF, "M", "θ"), - (0x1DC0, "V"), - (0x1E00, "M", "ḁ"), - (0x1E01, "V"), - ] - - -def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1E02, "M", "ḃ"), - (0x1E03, "V"), - (0x1E04, "M", "ḅ"), - (0x1E05, "V"), - (0x1E06, "M", "ḇ"), - (0x1E07, "V"), - (0x1E08, "M", "ḉ"), - (0x1E09, "V"), - (0x1E0A, "M", "ḋ"), - (0x1E0B, "V"), - (0x1E0C, "M", "ḍ"), - (0x1E0D, "V"), - (0x1E0E, "M", "ḏ"), - (0x1E0F, "V"), - (0x1E10, "M", "ḑ"), - (0x1E11, "V"), - (0x1E12, "M", "ḓ"), - (0x1E13, "V"), - (0x1E14, "M", "ḕ"), - (0x1E15, "V"), - (0x1E16, "M", "ḗ"), - (0x1E17, "V"), - (0x1E18, "M", "ḙ"), - (0x1E19, "V"), - (0x1E1A, "M", "ḛ"), - (0x1E1B, "V"), - (0x1E1C, "M", "ḝ"), - (0x1E1D, "V"), - (0x1E1E, "M", "ḟ"), - (0x1E1F, "V"), - (0x1E20, "M", "ḡ"), - (0x1E21, "V"), - (0x1E22, "M", "ḣ"), - (0x1E23, "V"), - (0x1E24, "M", "ḥ"), - (0x1E25, "V"), - (0x1E26, "M", "ḧ"), - (0x1E27, "V"), - (0x1E28, "M", "ḩ"), - (0x1E29, "V"), - (0x1E2A, "M", "ḫ"), - (0x1E2B, "V"), - (0x1E2C, "M", "ḭ"), - (0x1E2D, "V"), - (0x1E2E, "M", "ḯ"), - (0x1E2F, "V"), - (0x1E30, "M", "ḱ"), - (0x1E31, "V"), - (0x1E32, "M", "ḳ"), - (0x1E33, "V"), - (0x1E34, "M", "ḵ"), - (0x1E35, "V"), - (0x1E36, "M", "ḷ"), - (0x1E37, "V"), - (0x1E38, "M", "ḹ"), - (0x1E39, "V"), - (0x1E3A, "M", "ḻ"), - (0x1E3B, "V"), - (0x1E3C, "M", "ḽ"), - (0x1E3D, "V"), - (0x1E3E, "M", "ḿ"), - (0x1E3F, "V"), - (0x1E40, "M", "ṁ"), - (0x1E41, "V"), - (0x1E42, "M", "ṃ"), - (0x1E43, "V"), - (0x1E44, "M", "ṅ"), - (0x1E45, "V"), - (0x1E46, "M", "ṇ"), - (0x1E47, "V"), - (0x1E48, "M", "ṉ"), - (0x1E49, "V"), - (0x1E4A, "M", "ṋ"), - (0x1E4B, "V"), - (0x1E4C, "M", "ṍ"), - (0x1E4D, "V"), - (0x1E4E, "M", "ṏ"), - (0x1E4F, "V"), - (0x1E50, "M", "ṑ"), - (0x1E51, "V"), - (0x1E52, "M", "ṓ"), - (0x1E53, "V"), - (0x1E54, "M", "ṕ"), - (0x1E55, "V"), - (0x1E56, "M", "ṗ"), - (0x1E57, "V"), - (0x1E58, "M", "ṙ"), - (0x1E59, "V"), - (0x1E5A, "M", "ṛ"), - (0x1E5B, "V"), - (0x1E5C, "M", "ṝ"), - (0x1E5D, "V"), - (0x1E5E, "M", "ṟ"), - (0x1E5F, "V"), - (0x1E60, "M", "ṡ"), - (0x1E61, "V"), - (0x1E62, "M", "ṣ"), - (0x1E63, "V"), - (0x1E64, "M", "ṥ"), - (0x1E65, "V"), - ] - - -def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1E66, "M", "ṧ"), - (0x1E67, "V"), - (0x1E68, "M", "ṩ"), - (0x1E69, "V"), - (0x1E6A, "M", "ṫ"), - (0x1E6B, "V"), - (0x1E6C, "M", "ṭ"), - (0x1E6D, "V"), - (0x1E6E, "M", "ṯ"), - (0x1E6F, "V"), - (0x1E70, "M", "ṱ"), - (0x1E71, "V"), - (0x1E72, "M", "ṳ"), - (0x1E73, "V"), - (0x1E74, "M", "ṵ"), - (0x1E75, "V"), - (0x1E76, "M", "ṷ"), - (0x1E77, "V"), - (0x1E78, "M", "ṹ"), - (0x1E79, "V"), - (0x1E7A, "M", "ṻ"), - (0x1E7B, "V"), - (0x1E7C, "M", "ṽ"), - (0x1E7D, "V"), - (0x1E7E, "M", "ṿ"), - (0x1E7F, "V"), - (0x1E80, "M", "ẁ"), - (0x1E81, "V"), - (0x1E82, "M", "ẃ"), - (0x1E83, "V"), - (0x1E84, "M", "ẅ"), - (0x1E85, "V"), - (0x1E86, "M", "ẇ"), - (0x1E87, "V"), - (0x1E88, "M", "ẉ"), - (0x1E89, "V"), - (0x1E8A, "M", "ẋ"), - (0x1E8B, "V"), - (0x1E8C, "M", "ẍ"), - (0x1E8D, "V"), - (0x1E8E, "M", "ẏ"), - (0x1E8F, "V"), - (0x1E90, "M", "ẑ"), - (0x1E91, "V"), - (0x1E92, "M", "ẓ"), - (0x1E93, "V"), - (0x1E94, "M", "ẕ"), - (0x1E95, "V"), - (0x1E9A, "M", "aʾ"), - (0x1E9B, "M", "ṡ"), - (0x1E9C, "V"), - (0x1E9E, "M", "ß"), - (0x1E9F, "V"), - (0x1EA0, "M", "ạ"), - (0x1EA1, "V"), - (0x1EA2, "M", "ả"), - (0x1EA3, "V"), - (0x1EA4, "M", "ấ"), - (0x1EA5, "V"), - (0x1EA6, "M", "ầ"), - (0x1EA7, "V"), - (0x1EA8, "M", "ẩ"), - (0x1EA9, "V"), - (0x1EAA, "M", "ẫ"), - (0x1EAB, "V"), - (0x1EAC, "M", "ậ"), - (0x1EAD, "V"), - (0x1EAE, "M", "ắ"), - (0x1EAF, "V"), - (0x1EB0, "M", "ằ"), - (0x1EB1, "V"), - (0x1EB2, "M", "ẳ"), - (0x1EB3, "V"), - (0x1EB4, "M", "ẵ"), - (0x1EB5, "V"), - (0x1EB6, "M", "ặ"), - (0x1EB7, "V"), - (0x1EB8, "M", "ẹ"), - (0x1EB9, "V"), - (0x1EBA, "M", "ẻ"), - (0x1EBB, "V"), - (0x1EBC, "M", "ẽ"), - (0x1EBD, "V"), - (0x1EBE, "M", "ế"), - (0x1EBF, "V"), - (0x1EC0, "M", "ề"), - (0x1EC1, "V"), - (0x1EC2, "M", "ể"), - (0x1EC3, "V"), - (0x1EC4, "M", "ễ"), - (0x1EC5, "V"), - (0x1EC6, "M", "ệ"), - (0x1EC7, "V"), - (0x1EC8, "M", "ỉ"), - (0x1EC9, "V"), - (0x1ECA, "M", "ị"), - (0x1ECB, "V"), - (0x1ECC, "M", "ọ"), - (0x1ECD, "V"), - (0x1ECE, "M", "ỏ"), - ] - - -def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1ECF, "V"), - (0x1ED0, "M", "ố"), - (0x1ED1, "V"), - (0x1ED2, "M", "ồ"), - (0x1ED3, "V"), - (0x1ED4, "M", "ổ"), - (0x1ED5, "V"), - (0x1ED6, "M", "ỗ"), - (0x1ED7, "V"), - (0x1ED8, "M", "ộ"), - (0x1ED9, "V"), - (0x1EDA, "M", "ớ"), - (0x1EDB, "V"), - (0x1EDC, "M", "ờ"), - (0x1EDD, "V"), - (0x1EDE, "M", "ở"), - (0x1EDF, "V"), - (0x1EE0, "M", "ỡ"), - (0x1EE1, "V"), - (0x1EE2, "M", "ợ"), - (0x1EE3, "V"), - (0x1EE4, "M", "ụ"), - (0x1EE5, "V"), - (0x1EE6, "M", "ủ"), - (0x1EE7, "V"), - (0x1EE8, "M", "ứ"), - (0x1EE9, "V"), - (0x1EEA, "M", "ừ"), - (0x1EEB, "V"), - (0x1EEC, "M", "ử"), - (0x1EED, "V"), - (0x1EEE, "M", "ữ"), - (0x1EEF, "V"), - (0x1EF0, "M", "ự"), - (0x1EF1, "V"), - (0x1EF2, "M", "ỳ"), - (0x1EF3, "V"), - (0x1EF4, "M", "ỵ"), - (0x1EF5, "V"), - (0x1EF6, "M", "ỷ"), - (0x1EF7, "V"), - (0x1EF8, "M", "ỹ"), - (0x1EF9, "V"), - (0x1EFA, "M", "ỻ"), - (0x1EFB, "V"), - (0x1EFC, "M", "ỽ"), - (0x1EFD, "V"), - (0x1EFE, "M", "ỿ"), - (0x1EFF, "V"), - (0x1F08, "M", "ἀ"), - (0x1F09, "M", "ἁ"), - (0x1F0A, "M", "ἂ"), - (0x1F0B, "M", "ἃ"), - (0x1F0C, "M", "ἄ"), - (0x1F0D, "M", "ἅ"), - (0x1F0E, "M", "ἆ"), - (0x1F0F, "M", "ἇ"), - (0x1F10, "V"), - (0x1F16, "X"), - (0x1F18, "M", "ἐ"), - (0x1F19, "M", "ἑ"), - (0x1F1A, "M", "ἒ"), - (0x1F1B, "M", "ἓ"), - (0x1F1C, "M", "ἔ"), - (0x1F1D, "M", "ἕ"), - (0x1F1E, "X"), - (0x1F20, "V"), - (0x1F28, "M", "ἠ"), - (0x1F29, "M", "ἡ"), - (0x1F2A, "M", "ἢ"), - (0x1F2B, "M", "ἣ"), - (0x1F2C, "M", "ἤ"), - (0x1F2D, "M", "ἥ"), - (0x1F2E, "M", "ἦ"), - (0x1F2F, "M", "ἧ"), - (0x1F30, "V"), - (0x1F38, "M", "ἰ"), - (0x1F39, "M", "ἱ"), - (0x1F3A, "M", "ἲ"), - (0x1F3B, "M", "ἳ"), - (0x1F3C, "M", "ἴ"), - (0x1F3D, "M", "ἵ"), - (0x1F3E, "M", "ἶ"), - (0x1F3F, "M", "ἷ"), - (0x1F40, "V"), - (0x1F46, "X"), - (0x1F48, "M", "ὀ"), - (0x1F49, "M", "ὁ"), - (0x1F4A, "M", "ὂ"), - (0x1F4B, "M", "ὃ"), - (0x1F4C, "M", "ὄ"), - (0x1F4D, "M", "ὅ"), - (0x1F4E, "X"), - (0x1F50, "V"), - (0x1F58, "X"), - (0x1F59, "M", "ὑ"), - (0x1F5A, "X"), - (0x1F5B, "M", "ὓ"), - (0x1F5C, "X"), - (0x1F5D, "M", "ὕ"), - ] - - -def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1F5E, "X"), - (0x1F5F, "M", "ὗ"), - (0x1F60, "V"), - (0x1F68, "M", "ὠ"), - (0x1F69, "M", "ὡ"), - (0x1F6A, "M", "ὢ"), - (0x1F6B, "M", "ὣ"), - (0x1F6C, "M", "ὤ"), - (0x1F6D, "M", "ὥ"), - (0x1F6E, "M", "ὦ"), - (0x1F6F, "M", "ὧ"), - (0x1F70, "V"), - (0x1F71, "M", "ά"), - (0x1F72, "V"), - (0x1F73, "M", "έ"), - (0x1F74, "V"), - (0x1F75, "M", "ή"), - (0x1F76, "V"), - (0x1F77, "M", "ί"), - (0x1F78, "V"), - (0x1F79, "M", "ό"), - (0x1F7A, "V"), - (0x1F7B, "M", "ύ"), - (0x1F7C, "V"), - (0x1F7D, "M", "ώ"), - (0x1F7E, "X"), - (0x1F80, "M", "ἀι"), - (0x1F81, "M", "ἁι"), - (0x1F82, "M", "ἂι"), - (0x1F83, "M", "ἃι"), - (0x1F84, "M", "ἄι"), - (0x1F85, "M", "ἅι"), - (0x1F86, "M", "ἆι"), - (0x1F87, "M", "ἇι"), - (0x1F88, "M", "ἀι"), - (0x1F89, "M", "ἁι"), - (0x1F8A, "M", "ἂι"), - (0x1F8B, "M", "ἃι"), - (0x1F8C, "M", "ἄι"), - (0x1F8D, "M", "ἅι"), - (0x1F8E, "M", "ἆι"), - (0x1F8F, "M", "ἇι"), - (0x1F90, "M", "ἠι"), - (0x1F91, "M", "ἡι"), - (0x1F92, "M", "ἢι"), - (0x1F93, "M", "ἣι"), - (0x1F94, "M", "ἤι"), - (0x1F95, "M", "ἥι"), - (0x1F96, "M", "ἦι"), - (0x1F97, "M", "ἧι"), - (0x1F98, "M", "ἠι"), - (0x1F99, "M", "ἡι"), - (0x1F9A, "M", "ἢι"), - (0x1F9B, "M", "ἣι"), - (0x1F9C, "M", "ἤι"), - (0x1F9D, "M", "ἥι"), - (0x1F9E, "M", "ἦι"), - (0x1F9F, "M", "ἧι"), - (0x1FA0, "M", "ὠι"), - (0x1FA1, "M", "ὡι"), - (0x1FA2, "M", "ὢι"), - (0x1FA3, "M", "ὣι"), - (0x1FA4, "M", "ὤι"), - (0x1FA5, "M", "ὥι"), - (0x1FA6, "M", "ὦι"), - (0x1FA7, "M", "ὧι"), - (0x1FA8, "M", "ὠι"), - (0x1FA9, "M", "ὡι"), - (0x1FAA, "M", "ὢι"), - (0x1FAB, "M", "ὣι"), - (0x1FAC, "M", "ὤι"), - (0x1FAD, "M", "ὥι"), - (0x1FAE, "M", "ὦι"), - (0x1FAF, "M", "ὧι"), - (0x1FB0, "V"), - (0x1FB2, "M", "ὰι"), - (0x1FB3, "M", "αι"), - (0x1FB4, "M", "άι"), - (0x1FB5, "X"), - (0x1FB6, "V"), - (0x1FB7, "M", "ᾶι"), - (0x1FB8, "M", "ᾰ"), - (0x1FB9, "M", "ᾱ"), - (0x1FBA, "M", "ὰ"), - (0x1FBB, "M", "ά"), - (0x1FBC, "M", "αι"), - (0x1FBD, "M", " ̓"), - (0x1FBE, "M", "ι"), - (0x1FBF, "M", " ̓"), - (0x1FC0, "M", " ͂"), - (0x1FC1, "M", " ̈͂"), - (0x1FC2, "M", "ὴι"), - (0x1FC3, "M", "ηι"), - (0x1FC4, "M", "ήι"), - (0x1FC5, "X"), - (0x1FC6, "V"), - (0x1FC7, "M", "ῆι"), - (0x1FC8, "M", "ὲ"), - (0x1FC9, "M", "έ"), - (0x1FCA, "M", "ὴ"), - ] - - -def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1FCB, "M", "ή"), - (0x1FCC, "M", "ηι"), - (0x1FCD, "M", " ̓̀"), - (0x1FCE, "M", " ̓́"), - (0x1FCF, "M", " ̓͂"), - (0x1FD0, "V"), - (0x1FD3, "M", "ΐ"), - (0x1FD4, "X"), - (0x1FD6, "V"), - (0x1FD8, "M", "ῐ"), - (0x1FD9, "M", "ῑ"), - (0x1FDA, "M", "ὶ"), - (0x1FDB, "M", "ί"), - (0x1FDC, "X"), - (0x1FDD, "M", " ̔̀"), - (0x1FDE, "M", " ̔́"), - (0x1FDF, "M", " ̔͂"), - (0x1FE0, "V"), - (0x1FE3, "M", "ΰ"), - (0x1FE4, "V"), - (0x1FE8, "M", "ῠ"), - (0x1FE9, "M", "ῡ"), - (0x1FEA, "M", "ὺ"), - (0x1FEB, "M", "ύ"), - (0x1FEC, "M", "ῥ"), - (0x1FED, "M", " ̈̀"), - (0x1FEE, "M", " ̈́"), - (0x1FEF, "M", "`"), - (0x1FF0, "X"), - (0x1FF2, "M", "ὼι"), - (0x1FF3, "M", "ωι"), - (0x1FF4, "M", "ώι"), - (0x1FF5, "X"), - (0x1FF6, "V"), - (0x1FF7, "M", "ῶι"), - (0x1FF8, "M", "ὸ"), - (0x1FF9, "M", "ό"), - (0x1FFA, "M", "ὼ"), - (0x1FFB, "M", "ώ"), - (0x1FFC, "M", "ωι"), - (0x1FFD, "M", " ́"), - (0x1FFE, "M", " ̔"), - (0x1FFF, "X"), - (0x2000, "M", " "), - (0x200B, "I"), - (0x200C, "D", ""), - (0x200E, "X"), - (0x2010, "V"), - (0x2011, "M", "‐"), - (0x2012, "V"), - (0x2017, "M", " ̳"), - (0x2018, "V"), - (0x2024, "X"), - (0x2027, "V"), - (0x2028, "X"), - (0x202F, "M", " "), - (0x2030, "V"), - (0x2033, "M", "′′"), - (0x2034, "M", "′′′"), - (0x2035, "V"), - (0x2036, "M", "‵‵"), - (0x2037, "M", "‵‵‵"), - (0x2038, "V"), - (0x203C, "M", "!!"), - (0x203D, "V"), - (0x203E, "M", " ̅"), - (0x203F, "V"), - (0x2047, "M", "??"), - (0x2048, "M", "?!"), - (0x2049, "M", "!?"), - (0x204A, "V"), - (0x2057, "M", "′′′′"), - (0x2058, "V"), - (0x205F, "M", " "), - (0x2060, "I"), - (0x2065, "X"), - (0x206A, "I"), - (0x2070, "M", "0"), - (0x2071, "M", "i"), - (0x2072, "X"), - (0x2074, "M", "4"), - (0x2075, "M", "5"), - (0x2076, "M", "6"), - (0x2077, "M", "7"), - (0x2078, "M", "8"), - (0x2079, "M", "9"), - (0x207A, "M", "+"), - (0x207B, "M", "−"), - (0x207C, "M", "="), - (0x207D, "M", "("), - (0x207E, "M", ")"), - (0x207F, "M", "n"), - (0x2080, "M", "0"), - (0x2081, "M", "1"), - (0x2082, "M", "2"), - (0x2083, "M", "3"), - (0x2084, "M", "4"), - (0x2085, "M", "5"), - (0x2086, "M", "6"), - (0x2087, "M", "7"), - ] - - -def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2088, "M", "8"), - (0x2089, "M", "9"), - (0x208A, "M", "+"), - (0x208B, "M", "−"), - (0x208C, "M", "="), - (0x208D, "M", "("), - (0x208E, "M", ")"), - (0x208F, "X"), - (0x2090, "M", "a"), - (0x2091, "M", "e"), - (0x2092, "M", "o"), - (0x2093, "M", "x"), - (0x2094, "M", "ə"), - (0x2095, "M", "h"), - (0x2096, "M", "k"), - (0x2097, "M", "l"), - (0x2098, "M", "m"), - (0x2099, "M", "n"), - (0x209A, "M", "p"), - (0x209B, "M", "s"), - (0x209C, "M", "t"), - (0x209D, "X"), - (0x20A0, "V"), - (0x20A8, "M", "rs"), - (0x20A9, "V"), - (0x20C1, "X"), - (0x20D0, "V"), - (0x20F1, "X"), - (0x2100, "M", "a/c"), - (0x2101, "M", "a/s"), - (0x2102, "M", "c"), - (0x2103, "M", "°c"), - (0x2104, "V"), - (0x2105, "M", "c/o"), - (0x2106, "M", "c/u"), - (0x2107, "M", "ɛ"), - (0x2108, "V"), - (0x2109, "M", "°f"), - (0x210A, "M", "g"), - (0x210B, "M", "h"), - (0x210F, "M", "ħ"), - (0x2110, "M", "i"), - (0x2112, "M", "l"), - (0x2114, "V"), - (0x2115, "M", "n"), - (0x2116, "M", "no"), - (0x2117, "V"), - (0x2119, "M", "p"), - (0x211A, "M", "q"), - (0x211B, "M", "r"), - (0x211E, "V"), - (0x2120, "M", "sm"), - (0x2121, "M", "tel"), - (0x2122, "M", "tm"), - (0x2123, "V"), - (0x2124, "M", "z"), - (0x2125, "V"), - (0x2126, "M", "ω"), - (0x2127, "V"), - (0x2128, "M", "z"), - (0x2129, "V"), - (0x212A, "M", "k"), - (0x212B, "M", "å"), - (0x212C, "M", "b"), - (0x212D, "M", "c"), - (0x212E, "V"), - (0x212F, "M", "e"), - (0x2131, "M", "f"), - (0x2132, "M", "ⅎ"), - (0x2133, "M", "m"), - (0x2134, "M", "o"), - (0x2135, "M", "א"), - (0x2136, "M", "ב"), - (0x2137, "M", "ג"), - (0x2138, "M", "ד"), - (0x2139, "M", "i"), - (0x213A, "V"), - (0x213B, "M", "fax"), - (0x213C, "M", "π"), - (0x213D, "M", "γ"), - (0x213F, "M", "π"), - (0x2140, "M", "∑"), - (0x2141, "V"), - (0x2145, "M", "d"), - (0x2147, "M", "e"), - (0x2148, "M", "i"), - (0x2149, "M", "j"), - (0x214A, "V"), - (0x2150, "M", "1⁄7"), - (0x2151, "M", "1⁄9"), - (0x2152, "M", "1⁄10"), - (0x2153, "M", "1⁄3"), - (0x2154, "M", "2⁄3"), - (0x2155, "M", "1⁄5"), - (0x2156, "M", "2⁄5"), - (0x2157, "M", "3⁄5"), - (0x2158, "M", "4⁄5"), - (0x2159, "M", "1⁄6"), - (0x215A, "M", "5⁄6"), - (0x215B, "M", "1⁄8"), - ] - - -def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x215C, "M", "3⁄8"), - (0x215D, "M", "5⁄8"), - (0x215E, "M", "7⁄8"), - (0x215F, "M", "1⁄"), - (0x2160, "M", "i"), - (0x2161, "M", "ii"), - (0x2162, "M", "iii"), - (0x2163, "M", "iv"), - (0x2164, "M", "v"), - (0x2165, "M", "vi"), - (0x2166, "M", "vii"), - (0x2167, "M", "viii"), - (0x2168, "M", "ix"), - (0x2169, "M", "x"), - (0x216A, "M", "xi"), - (0x216B, "M", "xii"), - (0x216C, "M", "l"), - (0x216D, "M", "c"), - (0x216E, "M", "d"), - (0x216F, "M", "m"), - (0x2170, "M", "i"), - (0x2171, "M", "ii"), - (0x2172, "M", "iii"), - (0x2173, "M", "iv"), - (0x2174, "M", "v"), - (0x2175, "M", "vi"), - (0x2176, "M", "vii"), - (0x2177, "M", "viii"), - (0x2178, "M", "ix"), - (0x2179, "M", "x"), - (0x217A, "M", "xi"), - (0x217B, "M", "xii"), - (0x217C, "M", "l"), - (0x217D, "M", "c"), - (0x217E, "M", "d"), - (0x217F, "M", "m"), - (0x2180, "V"), - (0x2183, "M", "ↄ"), - (0x2184, "V"), - (0x2189, "M", "0⁄3"), - (0x218A, "V"), - (0x218C, "X"), - (0x2190, "V"), - (0x222C, "M", "∫∫"), - (0x222D, "M", "∫∫∫"), - (0x222E, "V"), - (0x222F, "M", "∮∮"), - (0x2230, "M", "∮∮∮"), - (0x2231, "V"), - (0x2329, "M", "〈"), - (0x232A, "M", "〉"), - (0x232B, "V"), - (0x242A, "X"), - (0x2440, "V"), - (0x244B, "X"), - (0x2460, "M", "1"), - (0x2461, "M", "2"), - (0x2462, "M", "3"), - (0x2463, "M", "4"), - (0x2464, "M", "5"), - (0x2465, "M", "6"), - (0x2466, "M", "7"), - (0x2467, "M", "8"), - (0x2468, "M", "9"), - (0x2469, "M", "10"), - (0x246A, "M", "11"), - (0x246B, "M", "12"), - (0x246C, "M", "13"), - (0x246D, "M", "14"), - (0x246E, "M", "15"), - (0x246F, "M", "16"), - (0x2470, "M", "17"), - (0x2471, "M", "18"), - (0x2472, "M", "19"), - (0x2473, "M", "20"), - (0x2474, "M", "(1)"), - (0x2475, "M", "(2)"), - (0x2476, "M", "(3)"), - (0x2477, "M", "(4)"), - (0x2478, "M", "(5)"), - (0x2479, "M", "(6)"), - (0x247A, "M", "(7)"), - (0x247B, "M", "(8)"), - (0x247C, "M", "(9)"), - (0x247D, "M", "(10)"), - (0x247E, "M", "(11)"), - (0x247F, "M", "(12)"), - (0x2480, "M", "(13)"), - (0x2481, "M", "(14)"), - (0x2482, "M", "(15)"), - (0x2483, "M", "(16)"), - (0x2484, "M", "(17)"), - (0x2485, "M", "(18)"), - (0x2486, "M", "(19)"), - (0x2487, "M", "(20)"), - (0x2488, "X"), - (0x249C, "M", "(a)"), - (0x249D, "M", "(b)"), - (0x249E, "M", "(c)"), - (0x249F, "M", "(d)"), - ] - - -def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x24A0, "M", "(e)"), - (0x24A1, "M", "(f)"), - (0x24A2, "M", "(g)"), - (0x24A3, "M", "(h)"), - (0x24A4, "M", "(i)"), - (0x24A5, "M", "(j)"), - (0x24A6, "M", "(k)"), - (0x24A7, "M", "(l)"), - (0x24A8, "M", "(m)"), - (0x24A9, "M", "(n)"), - (0x24AA, "M", "(o)"), - (0x24AB, "M", "(p)"), - (0x24AC, "M", "(q)"), - (0x24AD, "M", "(r)"), - (0x24AE, "M", "(s)"), - (0x24AF, "M", "(t)"), - (0x24B0, "M", "(u)"), - (0x24B1, "M", "(v)"), - (0x24B2, "M", "(w)"), - (0x24B3, "M", "(x)"), - (0x24B4, "M", "(y)"), - (0x24B5, "M", "(z)"), - (0x24B6, "M", "a"), - (0x24B7, "M", "b"), - (0x24B8, "M", "c"), - (0x24B9, "M", "d"), - (0x24BA, "M", "e"), - (0x24BB, "M", "f"), - (0x24BC, "M", "g"), - (0x24BD, "M", "h"), - (0x24BE, "M", "i"), - (0x24BF, "M", "j"), - (0x24C0, "M", "k"), - (0x24C1, "M", "l"), - (0x24C2, "M", "m"), - (0x24C3, "M", "n"), - (0x24C4, "M", "o"), - (0x24C5, "M", "p"), - (0x24C6, "M", "q"), - (0x24C7, "M", "r"), - (0x24C8, "M", "s"), - (0x24C9, "M", "t"), - (0x24CA, "M", "u"), - (0x24CB, "M", "v"), - (0x24CC, "M", "w"), - (0x24CD, "M", "x"), - (0x24CE, "M", "y"), - (0x24CF, "M", "z"), - (0x24D0, "M", "a"), - (0x24D1, "M", "b"), - (0x24D2, "M", "c"), - (0x24D3, "M", "d"), - (0x24D4, "M", "e"), - (0x24D5, "M", "f"), - (0x24D6, "M", "g"), - (0x24D7, "M", "h"), - (0x24D8, "M", "i"), - (0x24D9, "M", "j"), - (0x24DA, "M", "k"), - (0x24DB, "M", "l"), - (0x24DC, "M", "m"), - (0x24DD, "M", "n"), - (0x24DE, "M", "o"), - (0x24DF, "M", "p"), - (0x24E0, "M", "q"), - (0x24E1, "M", "r"), - (0x24E2, "M", "s"), - (0x24E3, "M", "t"), - (0x24E4, "M", "u"), - (0x24E5, "M", "v"), - (0x24E6, "M", "w"), - (0x24E7, "M", "x"), - (0x24E8, "M", "y"), - (0x24E9, "M", "z"), - (0x24EA, "M", "0"), - (0x24EB, "V"), - (0x2A0C, "M", "∫∫∫∫"), - (0x2A0D, "V"), - (0x2A74, "M", "::="), - (0x2A75, "M", "=="), - (0x2A76, "M", "==="), - (0x2A77, "V"), - (0x2ADC, "M", "⫝̸"), - (0x2ADD, "V"), - (0x2B74, "X"), - (0x2B76, "V"), - (0x2B96, "X"), - (0x2B97, "V"), - (0x2C00, "M", "ⰰ"), - (0x2C01, "M", "ⰱ"), - (0x2C02, "M", "ⰲ"), - (0x2C03, "M", "ⰳ"), - (0x2C04, "M", "ⰴ"), - (0x2C05, "M", "ⰵ"), - (0x2C06, "M", "ⰶ"), - (0x2C07, "M", "ⰷ"), - (0x2C08, "M", "ⰸ"), - (0x2C09, "M", "ⰹ"), - (0x2C0A, "M", "ⰺ"), - (0x2C0B, "M", "ⰻ"), - ] - - -def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2C0C, "M", "ⰼ"), - (0x2C0D, "M", "ⰽ"), - (0x2C0E, "M", "ⰾ"), - (0x2C0F, "M", "ⰿ"), - (0x2C10, "M", "ⱀ"), - (0x2C11, "M", "ⱁ"), - (0x2C12, "M", "ⱂ"), - (0x2C13, "M", "ⱃ"), - (0x2C14, "M", "ⱄ"), - (0x2C15, "M", "ⱅ"), - (0x2C16, "M", "ⱆ"), - (0x2C17, "M", "ⱇ"), - (0x2C18, "M", "ⱈ"), - (0x2C19, "M", "ⱉ"), - (0x2C1A, "M", "ⱊ"), - (0x2C1B, "M", "ⱋ"), - (0x2C1C, "M", "ⱌ"), - (0x2C1D, "M", "ⱍ"), - (0x2C1E, "M", "ⱎ"), - (0x2C1F, "M", "ⱏ"), - (0x2C20, "M", "ⱐ"), - (0x2C21, "M", "ⱑ"), - (0x2C22, "M", "ⱒ"), - (0x2C23, "M", "ⱓ"), - (0x2C24, "M", "ⱔ"), - (0x2C25, "M", "ⱕ"), - (0x2C26, "M", "ⱖ"), - (0x2C27, "M", "ⱗ"), - (0x2C28, "M", "ⱘ"), - (0x2C29, "M", "ⱙ"), - (0x2C2A, "M", "ⱚ"), - (0x2C2B, "M", "ⱛ"), - (0x2C2C, "M", "ⱜ"), - (0x2C2D, "M", "ⱝ"), - (0x2C2E, "M", "ⱞ"), - (0x2C2F, "M", "ⱟ"), - (0x2C30, "V"), - (0x2C60, "M", "ⱡ"), - (0x2C61, "V"), - (0x2C62, "M", "ɫ"), - (0x2C63, "M", "ᵽ"), - (0x2C64, "M", "ɽ"), - (0x2C65, "V"), - (0x2C67, "M", "ⱨ"), - (0x2C68, "V"), - (0x2C69, "M", "ⱪ"), - (0x2C6A, "V"), - (0x2C6B, "M", "ⱬ"), - (0x2C6C, "V"), - (0x2C6D, "M", "ɑ"), - (0x2C6E, "M", "ɱ"), - (0x2C6F, "M", "ɐ"), - (0x2C70, "M", "ɒ"), - (0x2C71, "V"), - (0x2C72, "M", "ⱳ"), - (0x2C73, "V"), - (0x2C75, "M", "ⱶ"), - (0x2C76, "V"), - (0x2C7C, "M", "j"), - (0x2C7D, "M", "v"), - (0x2C7E, "M", "ȿ"), - (0x2C7F, "M", "ɀ"), - (0x2C80, "M", "ⲁ"), - (0x2C81, "V"), - (0x2C82, "M", "ⲃ"), - (0x2C83, "V"), - (0x2C84, "M", "ⲅ"), - (0x2C85, "V"), - (0x2C86, "M", "ⲇ"), - (0x2C87, "V"), - (0x2C88, "M", "ⲉ"), - (0x2C89, "V"), - (0x2C8A, "M", "ⲋ"), - (0x2C8B, "V"), - (0x2C8C, "M", "ⲍ"), - (0x2C8D, "V"), - (0x2C8E, "M", "ⲏ"), - (0x2C8F, "V"), - (0x2C90, "M", "ⲑ"), - (0x2C91, "V"), - (0x2C92, "M", "ⲓ"), - (0x2C93, "V"), - (0x2C94, "M", "ⲕ"), - (0x2C95, "V"), - (0x2C96, "M", "ⲗ"), - (0x2C97, "V"), - (0x2C98, "M", "ⲙ"), - (0x2C99, "V"), - (0x2C9A, "M", "ⲛ"), - (0x2C9B, "V"), - (0x2C9C, "M", "ⲝ"), - (0x2C9D, "V"), - (0x2C9E, "M", "ⲟ"), - (0x2C9F, "V"), - (0x2CA0, "M", "ⲡ"), - (0x2CA1, "V"), - (0x2CA2, "M", "ⲣ"), - (0x2CA3, "V"), - (0x2CA4, "M", "ⲥ"), - (0x2CA5, "V"), - ] - - -def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2CA6, "M", "ⲧ"), - (0x2CA7, "V"), - (0x2CA8, "M", "ⲩ"), - (0x2CA9, "V"), - (0x2CAA, "M", "ⲫ"), - (0x2CAB, "V"), - (0x2CAC, "M", "ⲭ"), - (0x2CAD, "V"), - (0x2CAE, "M", "ⲯ"), - (0x2CAF, "V"), - (0x2CB0, "M", "ⲱ"), - (0x2CB1, "V"), - (0x2CB2, "M", "ⲳ"), - (0x2CB3, "V"), - (0x2CB4, "M", "ⲵ"), - (0x2CB5, "V"), - (0x2CB6, "M", "ⲷ"), - (0x2CB7, "V"), - (0x2CB8, "M", "ⲹ"), - (0x2CB9, "V"), - (0x2CBA, "M", "ⲻ"), - (0x2CBB, "V"), - (0x2CBC, "M", "ⲽ"), - (0x2CBD, "V"), - (0x2CBE, "M", "ⲿ"), - (0x2CBF, "V"), - (0x2CC0, "M", "ⳁ"), - (0x2CC1, "V"), - (0x2CC2, "M", "ⳃ"), - (0x2CC3, "V"), - (0x2CC4, "M", "ⳅ"), - (0x2CC5, "V"), - (0x2CC6, "M", "ⳇ"), - (0x2CC7, "V"), - (0x2CC8, "M", "ⳉ"), - (0x2CC9, "V"), - (0x2CCA, "M", "ⳋ"), - (0x2CCB, "V"), - (0x2CCC, "M", "ⳍ"), - (0x2CCD, "V"), - (0x2CCE, "M", "ⳏ"), - (0x2CCF, "V"), - (0x2CD0, "M", "ⳑ"), - (0x2CD1, "V"), - (0x2CD2, "M", "ⳓ"), - (0x2CD3, "V"), - (0x2CD4, "M", "ⳕ"), - (0x2CD5, "V"), - (0x2CD6, "M", "ⳗ"), - (0x2CD7, "V"), - (0x2CD8, "M", "ⳙ"), - (0x2CD9, "V"), - (0x2CDA, "M", "ⳛ"), - (0x2CDB, "V"), - (0x2CDC, "M", "ⳝ"), - (0x2CDD, "V"), - (0x2CDE, "M", "ⳟ"), - (0x2CDF, "V"), - (0x2CE0, "M", "ⳡ"), - (0x2CE1, "V"), - (0x2CE2, "M", "ⳣ"), - (0x2CE3, "V"), - (0x2CEB, "M", "ⳬ"), - (0x2CEC, "V"), - (0x2CED, "M", "ⳮ"), - (0x2CEE, "V"), - (0x2CF2, "M", "ⳳ"), - (0x2CF3, "V"), - (0x2CF4, "X"), - (0x2CF9, "V"), - (0x2D26, "X"), - (0x2D27, "V"), - (0x2D28, "X"), - (0x2D2D, "V"), - (0x2D2E, "X"), - (0x2D30, "V"), - (0x2D68, "X"), - (0x2D6F, "M", "ⵡ"), - (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"), - (0x2E5E, "X"), - ] - - -def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2E80, "V"), - (0x2E9A, "X"), - (0x2E9B, "V"), - (0x2E9F, "M", "母"), - (0x2EA0, "V"), - (0x2EF3, "M", "龟"), - (0x2EF4, "X"), - (0x2F00, "M", "一"), - (0x2F01, "M", "丨"), - (0x2F02, "M", "丶"), - (0x2F03, "M", "丿"), - (0x2F04, "M", "乙"), - (0x2F05, "M", "亅"), - (0x2F06, "M", "二"), - (0x2F07, "M", "亠"), - (0x2F08, "M", "人"), - (0x2F09, "M", "儿"), - (0x2F0A, "M", "入"), - (0x2F0B, "M", "八"), - (0x2F0C, "M", "冂"), - (0x2F0D, "M", "冖"), - (0x2F0E, "M", "冫"), - (0x2F0F, "M", "几"), - (0x2F10, "M", "凵"), - (0x2F11, "M", "刀"), - (0x2F12, "M", "力"), - (0x2F13, "M", "勹"), - (0x2F14, "M", "匕"), - (0x2F15, "M", "匚"), - (0x2F16, "M", "匸"), - (0x2F17, "M", "十"), - (0x2F18, "M", "卜"), - (0x2F19, "M", "卩"), - (0x2F1A, "M", "厂"), - (0x2F1B, "M", "厶"), - (0x2F1C, "M", "又"), - (0x2F1D, "M", "口"), - (0x2F1E, "M", "囗"), - (0x2F1F, "M", "土"), - (0x2F20, "M", "士"), - (0x2F21, "M", "夂"), - (0x2F22, "M", "夊"), - (0x2F23, "M", "夕"), - (0x2F24, "M", "大"), - (0x2F25, "M", "女"), - (0x2F26, "M", "子"), - (0x2F27, "M", "宀"), - (0x2F28, "M", "寸"), - (0x2F29, "M", "小"), - (0x2F2A, "M", "尢"), - (0x2F2B, "M", "尸"), - (0x2F2C, "M", "屮"), - (0x2F2D, "M", "山"), - (0x2F2E, "M", "巛"), - (0x2F2F, "M", "工"), - (0x2F30, "M", "己"), - (0x2F31, "M", "巾"), - (0x2F32, "M", "干"), - (0x2F33, "M", "幺"), - (0x2F34, "M", "广"), - (0x2F35, "M", "廴"), - (0x2F36, "M", "廾"), - (0x2F37, "M", "弋"), - (0x2F38, "M", "弓"), - (0x2F39, "M", "彐"), - (0x2F3A, "M", "彡"), - (0x2F3B, "M", "彳"), - (0x2F3C, "M", "心"), - (0x2F3D, "M", "戈"), - (0x2F3E, "M", "戶"), - (0x2F3F, "M", "手"), - (0x2F40, "M", "支"), - (0x2F41, "M", "攴"), - (0x2F42, "M", "文"), - (0x2F43, "M", "斗"), - (0x2F44, "M", "斤"), - (0x2F45, "M", "方"), - (0x2F46, "M", "无"), - (0x2F47, "M", "日"), - (0x2F48, "M", "曰"), - (0x2F49, "M", "月"), - (0x2F4A, "M", "木"), - (0x2F4B, "M", "欠"), - (0x2F4C, "M", "止"), - (0x2F4D, "M", "歹"), - (0x2F4E, "M", "殳"), - (0x2F4F, "M", "毋"), - (0x2F50, "M", "比"), - (0x2F51, "M", "毛"), - (0x2F52, "M", "氏"), - (0x2F53, "M", "气"), - (0x2F54, "M", "水"), - (0x2F55, "M", "火"), - (0x2F56, "M", "爪"), - (0x2F57, "M", "父"), - (0x2F58, "M", "爻"), - (0x2F59, "M", "爿"), - (0x2F5A, "M", "片"), - (0x2F5B, "M", "牙"), - (0x2F5C, "M", "牛"), - ] - - -def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F5D, "M", "犬"), - (0x2F5E, "M", "玄"), - (0x2F5F, "M", "玉"), - (0x2F60, "M", "瓜"), - (0x2F61, "M", "瓦"), - (0x2F62, "M", "甘"), - (0x2F63, "M", "生"), - (0x2F64, "M", "用"), - (0x2F65, "M", "田"), - (0x2F66, "M", "疋"), - (0x2F67, "M", "疒"), - (0x2F68, "M", "癶"), - (0x2F69, "M", "白"), - (0x2F6A, "M", "皮"), - (0x2F6B, "M", "皿"), - (0x2F6C, "M", "目"), - (0x2F6D, "M", "矛"), - (0x2F6E, "M", "矢"), - (0x2F6F, "M", "石"), - (0x2F70, "M", "示"), - (0x2F71, "M", "禸"), - (0x2F72, "M", "禾"), - (0x2F73, "M", "穴"), - (0x2F74, "M", "立"), - (0x2F75, "M", "竹"), - (0x2F76, "M", "米"), - (0x2F77, "M", "糸"), - (0x2F78, "M", "缶"), - (0x2F79, "M", "网"), - (0x2F7A, "M", "羊"), - (0x2F7B, "M", "羽"), - (0x2F7C, "M", "老"), - (0x2F7D, "M", "而"), - (0x2F7E, "M", "耒"), - (0x2F7F, "M", "耳"), - (0x2F80, "M", "聿"), - (0x2F81, "M", "肉"), - (0x2F82, "M", "臣"), - (0x2F83, "M", "自"), - (0x2F84, "M", "至"), - (0x2F85, "M", "臼"), - (0x2F86, "M", "舌"), - (0x2F87, "M", "舛"), - (0x2F88, "M", "舟"), - (0x2F89, "M", "艮"), - (0x2F8A, "M", "色"), - (0x2F8B, "M", "艸"), - (0x2F8C, "M", "虍"), - (0x2F8D, "M", "虫"), - (0x2F8E, "M", "血"), - (0x2F8F, "M", "行"), - (0x2F90, "M", "衣"), - (0x2F91, "M", "襾"), - (0x2F92, "M", "見"), - (0x2F93, "M", "角"), - (0x2F94, "M", "言"), - (0x2F95, "M", "谷"), - (0x2F96, "M", "豆"), - (0x2F97, "M", "豕"), - (0x2F98, "M", "豸"), - (0x2F99, "M", "貝"), - (0x2F9A, "M", "赤"), - (0x2F9B, "M", "走"), - (0x2F9C, "M", "足"), - (0x2F9D, "M", "身"), - (0x2F9E, "M", "車"), - (0x2F9F, "M", "辛"), - (0x2FA0, "M", "辰"), - (0x2FA1, "M", "辵"), - (0x2FA2, "M", "邑"), - (0x2FA3, "M", "酉"), - (0x2FA4, "M", "釆"), - (0x2FA5, "M", "里"), - (0x2FA6, "M", "金"), - (0x2FA7, "M", "長"), - (0x2FA8, "M", "門"), - (0x2FA9, "M", "阜"), - (0x2FAA, "M", "隶"), - (0x2FAB, "M", "隹"), - (0x2FAC, "M", "雨"), - (0x2FAD, "M", "靑"), - (0x2FAE, "M", "非"), - (0x2FAF, "M", "面"), - (0x2FB0, "M", "革"), - (0x2FB1, "M", "韋"), - (0x2FB2, "M", "韭"), - (0x2FB3, "M", "音"), - (0x2FB4, "M", "頁"), - (0x2FB5, "M", "風"), - (0x2FB6, "M", "飛"), - (0x2FB7, "M", "食"), - (0x2FB8, "M", "首"), - (0x2FB9, "M", "香"), - (0x2FBA, "M", "馬"), - (0x2FBB, "M", "骨"), - (0x2FBC, "M", "高"), - (0x2FBD, "M", "髟"), - (0x2FBE, "M", "鬥"), - (0x2FBF, "M", "鬯"), - (0x2FC0, "M", "鬲"), - ] - - -def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2FC1, "M", "鬼"), - (0x2FC2, "M", "魚"), - (0x2FC3, "M", "鳥"), - (0x2FC4, "M", "鹵"), - (0x2FC5, "M", "鹿"), - (0x2FC6, "M", "麥"), - (0x2FC7, "M", "麻"), - (0x2FC8, "M", "黃"), - (0x2FC9, "M", "黍"), - (0x2FCA, "M", "黑"), - (0x2FCB, "M", "黹"), - (0x2FCC, "M", "黽"), - (0x2FCD, "M", "鼎"), - (0x2FCE, "M", "鼓"), - (0x2FCF, "M", "鼠"), - (0x2FD0, "M", "鼻"), - (0x2FD1, "M", "齊"), - (0x2FD2, "M", "齒"), - (0x2FD3, "M", "龍"), - (0x2FD4, "M", "龜"), - (0x2FD5, "M", "龠"), - (0x2FD6, "X"), - (0x3000, "M", " "), - (0x3001, "V"), - (0x3002, "M", "."), - (0x3003, "V"), - (0x3036, "M", "〒"), - (0x3037, "V"), - (0x3038, "M", "十"), - (0x3039, "M", "卄"), - (0x303A, "M", "卅"), - (0x303B, "V"), - (0x3040, "X"), - (0x3041, "V"), - (0x3097, "X"), - (0x3099, "V"), - (0x309B, "M", " ゙"), - (0x309C, "M", " ゚"), - (0x309D, "V"), - (0x309F, "M", "より"), - (0x30A0, "V"), - (0x30FF, "M", "コト"), - (0x3100, "X"), - (0x3105, "V"), - (0x3130, "X"), - (0x3131, "M", "ᄀ"), - (0x3132, "M", "ᄁ"), - (0x3133, "M", "ᆪ"), - (0x3134, "M", "ᄂ"), - (0x3135, "M", "ᆬ"), - (0x3136, "M", "ᆭ"), - (0x3137, "M", "ᄃ"), - (0x3138, "M", "ᄄ"), - (0x3139, "M", "ᄅ"), - (0x313A, "M", "ᆰ"), - (0x313B, "M", "ᆱ"), - (0x313C, "M", "ᆲ"), - (0x313D, "M", "ᆳ"), - (0x313E, "M", "ᆴ"), - (0x313F, "M", "ᆵ"), - (0x3140, "M", "ᄚ"), - (0x3141, "M", "ᄆ"), - (0x3142, "M", "ᄇ"), - (0x3143, "M", "ᄈ"), - (0x3144, "M", "ᄡ"), - (0x3145, "M", "ᄉ"), - (0x3146, "M", "ᄊ"), - (0x3147, "M", "ᄋ"), - (0x3148, "M", "ᄌ"), - (0x3149, "M", "ᄍ"), - (0x314A, "M", "ᄎ"), - (0x314B, "M", "ᄏ"), - (0x314C, "M", "ᄐ"), - (0x314D, "M", "ᄑ"), - (0x314E, "M", "ᄒ"), - (0x314F, "M", "ᅡ"), - (0x3150, "M", "ᅢ"), - (0x3151, "M", "ᅣ"), - (0x3152, "M", "ᅤ"), - (0x3153, "M", "ᅥ"), - (0x3154, "M", "ᅦ"), - (0x3155, "M", "ᅧ"), - (0x3156, "M", "ᅨ"), - (0x3157, "M", "ᅩ"), - (0x3158, "M", "ᅪ"), - (0x3159, "M", "ᅫ"), - (0x315A, "M", "ᅬ"), - (0x315B, "M", "ᅭ"), - (0x315C, "M", "ᅮ"), - (0x315D, "M", "ᅯ"), - (0x315E, "M", "ᅰ"), - (0x315F, "M", "ᅱ"), - (0x3160, "M", "ᅲ"), - (0x3161, "M", "ᅳ"), - (0x3162, "M", "ᅴ"), - (0x3163, "M", "ᅵ"), - (0x3164, "I"), - (0x3165, "M", "ᄔ"), - (0x3166, "M", "ᄕ"), - (0x3167, "M", "ᇇ"), - ] - - -def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x3168, "M", "ᇈ"), - (0x3169, "M", "ᇌ"), - (0x316A, "M", "ᇎ"), - (0x316B, "M", "ᇓ"), - (0x316C, "M", "ᇗ"), - (0x316D, "M", "ᇙ"), - (0x316E, "M", "ᄜ"), - (0x316F, "M", "ᇝ"), - (0x3170, "M", "ᇟ"), - (0x3171, "M", "ᄝ"), - (0x3172, "M", "ᄞ"), - (0x3173, "M", "ᄠ"), - (0x3174, "M", "ᄢ"), - (0x3175, "M", "ᄣ"), - (0x3176, "M", "ᄧ"), - (0x3177, "M", "ᄩ"), - (0x3178, "M", "ᄫ"), - (0x3179, "M", "ᄬ"), - (0x317A, "M", "ᄭ"), - (0x317B, "M", "ᄮ"), - (0x317C, "M", "ᄯ"), - (0x317D, "M", "ᄲ"), - (0x317E, "M", "ᄶ"), - (0x317F, "M", "ᅀ"), - (0x3180, "M", "ᅇ"), - (0x3181, "M", "ᅌ"), - (0x3182, "M", "ᇱ"), - (0x3183, "M", "ᇲ"), - (0x3184, "M", "ᅗ"), - (0x3185, "M", "ᅘ"), - (0x3186, "M", "ᅙ"), - (0x3187, "M", "ᆄ"), - (0x3188, "M", "ᆅ"), - (0x3189, "M", "ᆈ"), - (0x318A, "M", "ᆑ"), - (0x318B, "M", "ᆒ"), - (0x318C, "M", "ᆔ"), - (0x318D, "M", "ᆞ"), - (0x318E, "M", "ᆡ"), - (0x318F, "X"), - (0x3190, "V"), - (0x3192, "M", "一"), - (0x3193, "M", "二"), - (0x3194, "M", "三"), - (0x3195, "M", "四"), - (0x3196, "M", "上"), - (0x3197, "M", "中"), - (0x3198, "M", "下"), - (0x3199, "M", "甲"), - (0x319A, "M", "乙"), - (0x319B, "M", "丙"), - (0x319C, "M", "丁"), - (0x319D, "M", "天"), - (0x319E, "M", "地"), - (0x319F, "M", "人"), - (0x31A0, "V"), - (0x31E6, "X"), - (0x31F0, "V"), - (0x3200, "M", "(ᄀ)"), - (0x3201, "M", "(ᄂ)"), - (0x3202, "M", "(ᄃ)"), - (0x3203, "M", "(ᄅ)"), - (0x3204, "M", "(ᄆ)"), - (0x3205, "M", "(ᄇ)"), - (0x3206, "M", "(ᄉ)"), - (0x3207, "M", "(ᄋ)"), - (0x3208, "M", "(ᄌ)"), - (0x3209, "M", "(ᄎ)"), - (0x320A, "M", "(ᄏ)"), - (0x320B, "M", "(ᄐ)"), - (0x320C, "M", "(ᄑ)"), - (0x320D, "M", "(ᄒ)"), - (0x320E, "M", "(가)"), - (0x320F, "M", "(나)"), - (0x3210, "M", "(다)"), - (0x3211, "M", "(라)"), - (0x3212, "M", "(마)"), - (0x3213, "M", "(바)"), - (0x3214, "M", "(사)"), - (0x3215, "M", "(아)"), - (0x3216, "M", "(자)"), - (0x3217, "M", "(차)"), - (0x3218, "M", "(카)"), - (0x3219, "M", "(타)"), - (0x321A, "M", "(파)"), - (0x321B, "M", "(하)"), - (0x321C, "M", "(주)"), - (0x321D, "M", "(오전)"), - (0x321E, "M", "(오후)"), - (0x321F, "X"), - (0x3220, "M", "(一)"), - (0x3221, "M", "(二)"), - (0x3222, "M", "(三)"), - (0x3223, "M", "(四)"), - (0x3224, "M", "(五)"), - (0x3225, "M", "(六)"), - (0x3226, "M", "(七)"), - (0x3227, "M", "(八)"), - (0x3228, "M", "(九)"), - (0x3229, "M", "(十)"), - ] - - -def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x322A, "M", "(月)"), - (0x322B, "M", "(火)"), - (0x322C, "M", "(水)"), - (0x322D, "M", "(木)"), - (0x322E, "M", "(金)"), - (0x322F, "M", "(土)"), - (0x3230, "M", "(日)"), - (0x3231, "M", "(株)"), - (0x3232, "M", "(有)"), - (0x3233, "M", "(社)"), - (0x3234, "M", "(名)"), - (0x3235, "M", "(特)"), - (0x3236, "M", "(財)"), - (0x3237, "M", "(祝)"), - (0x3238, "M", "(労)"), - (0x3239, "M", "(代)"), - (0x323A, "M", "(呼)"), - (0x323B, "M", "(学)"), - (0x323C, "M", "(監)"), - (0x323D, "M", "(企)"), - (0x323E, "M", "(資)"), - (0x323F, "M", "(協)"), - (0x3240, "M", "(祭)"), - (0x3241, "M", "(休)"), - (0x3242, "M", "(自)"), - (0x3243, "M", "(至)"), - (0x3244, "M", "問"), - (0x3245, "M", "幼"), - (0x3246, "M", "文"), - (0x3247, "M", "箏"), - (0x3248, "V"), - (0x3250, "M", "pte"), - (0x3251, "M", "21"), - (0x3252, "M", "22"), - (0x3253, "M", "23"), - (0x3254, "M", "24"), - (0x3255, "M", "25"), - (0x3256, "M", "26"), - (0x3257, "M", "27"), - (0x3258, "M", "28"), - (0x3259, "M", "29"), - (0x325A, "M", "30"), - (0x325B, "M", "31"), - (0x325C, "M", "32"), - (0x325D, "M", "33"), - (0x325E, "M", "34"), - (0x325F, "M", "35"), - (0x3260, "M", "ᄀ"), - (0x3261, "M", "ᄂ"), - (0x3262, "M", "ᄃ"), - (0x3263, "M", "ᄅ"), - (0x3264, "M", "ᄆ"), - (0x3265, "M", "ᄇ"), - (0x3266, "M", "ᄉ"), - (0x3267, "M", "ᄋ"), - (0x3268, "M", "ᄌ"), - (0x3269, "M", "ᄎ"), - (0x326A, "M", "ᄏ"), - (0x326B, "M", "ᄐ"), - (0x326C, "M", "ᄑ"), - (0x326D, "M", "ᄒ"), - (0x326E, "M", "가"), - (0x326F, "M", "나"), - (0x3270, "M", "다"), - (0x3271, "M", "라"), - (0x3272, "M", "마"), - (0x3273, "M", "바"), - (0x3274, "M", "사"), - (0x3275, "M", "아"), - (0x3276, "M", "자"), - (0x3277, "M", "차"), - (0x3278, "M", "카"), - (0x3279, "M", "타"), - (0x327A, "M", "파"), - (0x327B, "M", "하"), - (0x327C, "M", "참고"), - (0x327D, "M", "주의"), - (0x327E, "M", "우"), - (0x327F, "V"), - (0x3280, "M", "一"), - (0x3281, "M", "二"), - (0x3282, "M", "三"), - (0x3283, "M", "四"), - (0x3284, "M", "五"), - (0x3285, "M", "六"), - (0x3286, "M", "七"), - (0x3287, "M", "八"), - (0x3288, "M", "九"), - (0x3289, "M", "十"), - (0x328A, "M", "月"), - (0x328B, "M", "火"), - (0x328C, "M", "水"), - (0x328D, "M", "木"), - (0x328E, "M", "金"), - (0x328F, "M", "土"), - (0x3290, "M", "日"), - (0x3291, "M", "株"), - (0x3292, "M", "有"), - (0x3293, "M", "社"), - (0x3294, "M", "名"), - ] - - -def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x3295, "M", "特"), - (0x3296, "M", "財"), - (0x3297, "M", "祝"), - (0x3298, "M", "労"), - (0x3299, "M", "秘"), - (0x329A, "M", "男"), - (0x329B, "M", "女"), - (0x329C, "M", "適"), - (0x329D, "M", "優"), - (0x329E, "M", "印"), - (0x329F, "M", "注"), - (0x32A0, "M", "項"), - (0x32A1, "M", "休"), - (0x32A2, "M", "写"), - (0x32A3, "M", "正"), - (0x32A4, "M", "上"), - (0x32A5, "M", "中"), - (0x32A6, "M", "下"), - (0x32A7, "M", "左"), - (0x32A8, "M", "右"), - (0x32A9, "M", "医"), - (0x32AA, "M", "宗"), - (0x32AB, "M", "学"), - (0x32AC, "M", "監"), - (0x32AD, "M", "企"), - (0x32AE, "M", "資"), - (0x32AF, "M", "協"), - (0x32B0, "M", "夜"), - (0x32B1, "M", "36"), - (0x32B2, "M", "37"), - (0x32B3, "M", "38"), - (0x32B4, "M", "39"), - (0x32B5, "M", "40"), - (0x32B6, "M", "41"), - (0x32B7, "M", "42"), - (0x32B8, "M", "43"), - (0x32B9, "M", "44"), - (0x32BA, "M", "45"), - (0x32BB, "M", "46"), - (0x32BC, "M", "47"), - (0x32BD, "M", "48"), - (0x32BE, "M", "49"), - (0x32BF, "M", "50"), - (0x32C0, "M", "1月"), - (0x32C1, "M", "2月"), - (0x32C2, "M", "3月"), - (0x32C3, "M", "4月"), - (0x32C4, "M", "5月"), - (0x32C5, "M", "6月"), - (0x32C6, "M", "7月"), - (0x32C7, "M", "8月"), - (0x32C8, "M", "9月"), - (0x32C9, "M", "10月"), - (0x32CA, "M", "11月"), - (0x32CB, "M", "12月"), - (0x32CC, "M", "hg"), - (0x32CD, "M", "erg"), - (0x32CE, "M", "ev"), - (0x32CF, "M", "ltd"), - (0x32D0, "M", "ア"), - (0x32D1, "M", "イ"), - (0x32D2, "M", "ウ"), - (0x32D3, "M", "エ"), - (0x32D4, "M", "オ"), - (0x32D5, "M", "カ"), - (0x32D6, "M", "キ"), - (0x32D7, "M", "ク"), - (0x32D8, "M", "ケ"), - (0x32D9, "M", "コ"), - (0x32DA, "M", "サ"), - (0x32DB, "M", "シ"), - (0x32DC, "M", "ス"), - (0x32DD, "M", "セ"), - (0x32DE, "M", "ソ"), - (0x32DF, "M", "タ"), - (0x32E0, "M", "チ"), - (0x32E1, "M", "ツ"), - (0x32E2, "M", "テ"), - (0x32E3, "M", "ト"), - (0x32E4, "M", "ナ"), - (0x32E5, "M", "ニ"), - (0x32E6, "M", "ヌ"), - (0x32E7, "M", "ネ"), - (0x32E8, "M", "ノ"), - (0x32E9, "M", "ハ"), - (0x32EA, "M", "ヒ"), - (0x32EB, "M", "フ"), - (0x32EC, "M", "ヘ"), - (0x32ED, "M", "ホ"), - (0x32EE, "M", "マ"), - (0x32EF, "M", "ミ"), - (0x32F0, "M", "ム"), - (0x32F1, "M", "メ"), - (0x32F2, "M", "モ"), - (0x32F3, "M", "ヤ"), - (0x32F4, "M", "ユ"), - (0x32F5, "M", "ヨ"), - (0x32F6, "M", "ラ"), - (0x32F7, "M", "リ"), - (0x32F8, "M", "ル"), - ] - - -def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x32F9, "M", "レ"), - (0x32FA, "M", "ロ"), - (0x32FB, "M", "ワ"), - (0x32FC, "M", "ヰ"), - (0x32FD, "M", "ヱ"), - (0x32FE, "M", "ヲ"), - (0x32FF, "M", "令和"), - (0x3300, "M", "アパート"), - (0x3301, "M", "アルファ"), - (0x3302, "M", "アンペア"), - (0x3303, "M", "アール"), - (0x3304, "M", "イニング"), - (0x3305, "M", "インチ"), - (0x3306, "M", "ウォン"), - (0x3307, "M", "エスクード"), - (0x3308, "M", "エーカー"), - (0x3309, "M", "オンス"), - (0x330A, "M", "オーム"), - (0x330B, "M", "カイリ"), - (0x330C, "M", "カラット"), - (0x330D, "M", "カロリー"), - (0x330E, "M", "ガロン"), - (0x330F, "M", "ガンマ"), - (0x3310, "M", "ギガ"), - (0x3311, "M", "ギニー"), - (0x3312, "M", "キュリー"), - (0x3313, "M", "ギルダー"), - (0x3314, "M", "キロ"), - (0x3315, "M", "キログラム"), - (0x3316, "M", "キロメートル"), - (0x3317, "M", "キロワット"), - (0x3318, "M", "グラム"), - (0x3319, "M", "グラムトン"), - (0x331A, "M", "クルゼイロ"), - (0x331B, "M", "クローネ"), - (0x331C, "M", "ケース"), - (0x331D, "M", "コルナ"), - (0x331E, "M", "コーポ"), - (0x331F, "M", "サイクル"), - (0x3320, "M", "サンチーム"), - (0x3321, "M", "シリング"), - (0x3322, "M", "センチ"), - (0x3323, "M", "セント"), - (0x3324, "M", "ダース"), - (0x3325, "M", "デシ"), - (0x3326, "M", "ドル"), - (0x3327, "M", "トン"), - (0x3328, "M", "ナノ"), - (0x3329, "M", "ノット"), - (0x332A, "M", "ハイツ"), - (0x332B, "M", "パーセント"), - (0x332C, "M", "パーツ"), - (0x332D, "M", "バーレル"), - (0x332E, "M", "ピアストル"), - (0x332F, "M", "ピクル"), - (0x3330, "M", "ピコ"), - (0x3331, "M", "ビル"), - (0x3332, "M", "ファラッド"), - (0x3333, "M", "フィート"), - (0x3334, "M", "ブッシェル"), - (0x3335, "M", "フラン"), - (0x3336, "M", "ヘクタール"), - (0x3337, "M", "ペソ"), - (0x3338, "M", "ペニヒ"), - (0x3339, "M", "ヘルツ"), - (0x333A, "M", "ペンス"), - (0x333B, "M", "ページ"), - (0x333C, "M", "ベータ"), - (0x333D, "M", "ポイント"), - (0x333E, "M", "ボルト"), - (0x333F, "M", "ホン"), - (0x3340, "M", "ポンド"), - (0x3341, "M", "ホール"), - (0x3342, "M", "ホーン"), - (0x3343, "M", "マイクロ"), - (0x3344, "M", "マイル"), - (0x3345, "M", "マッハ"), - (0x3346, "M", "マルク"), - (0x3347, "M", "マンション"), - (0x3348, "M", "ミクロン"), - (0x3349, "M", "ミリ"), - (0x334A, "M", "ミリバール"), - (0x334B, "M", "メガ"), - (0x334C, "M", "メガトン"), - (0x334D, "M", "メートル"), - (0x334E, "M", "ヤード"), - (0x334F, "M", "ヤール"), - (0x3350, "M", "ユアン"), - (0x3351, "M", "リットル"), - (0x3352, "M", "リラ"), - (0x3353, "M", "ルピー"), - (0x3354, "M", "ルーブル"), - (0x3355, "M", "レム"), - (0x3356, "M", "レントゲン"), - (0x3357, "M", "ワット"), - (0x3358, "M", "0点"), - (0x3359, "M", "1点"), - (0x335A, "M", "2点"), - (0x335B, "M", "3点"), - (0x335C, "M", "4点"), - ] - - -def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x335D, "M", "5点"), - (0x335E, "M", "6点"), - (0x335F, "M", "7点"), - (0x3360, "M", "8点"), - (0x3361, "M", "9点"), - (0x3362, "M", "10点"), - (0x3363, "M", "11点"), - (0x3364, "M", "12点"), - (0x3365, "M", "13点"), - (0x3366, "M", "14点"), - (0x3367, "M", "15点"), - (0x3368, "M", "16点"), - (0x3369, "M", "17点"), - (0x336A, "M", "18点"), - (0x336B, "M", "19点"), - (0x336C, "M", "20点"), - (0x336D, "M", "21点"), - (0x336E, "M", "22点"), - (0x336F, "M", "23点"), - (0x3370, "M", "24点"), - (0x3371, "M", "hpa"), - (0x3372, "M", "da"), - (0x3373, "M", "au"), - (0x3374, "M", "bar"), - (0x3375, "M", "ov"), - (0x3376, "M", "pc"), - (0x3377, "M", "dm"), - (0x3378, "M", "dm2"), - (0x3379, "M", "dm3"), - (0x337A, "M", "iu"), - (0x337B, "M", "平成"), - (0x337C, "M", "昭和"), - (0x337D, "M", "大正"), - (0x337E, "M", "明治"), - (0x337F, "M", "株式会社"), - (0x3380, "M", "pa"), - (0x3381, "M", "na"), - (0x3382, "M", "μa"), - (0x3383, "M", "ma"), - (0x3384, "M", "ka"), - (0x3385, "M", "kb"), - (0x3386, "M", "mb"), - (0x3387, "M", "gb"), - (0x3388, "M", "cal"), - (0x3389, "M", "kcal"), - (0x338A, "M", "pf"), - (0x338B, "M", "nf"), - (0x338C, "M", "μf"), - (0x338D, "M", "μg"), - (0x338E, "M", "mg"), - (0x338F, "M", "kg"), - (0x3390, "M", "hz"), - (0x3391, "M", "khz"), - (0x3392, "M", "mhz"), - (0x3393, "M", "ghz"), - (0x3394, "M", "thz"), - (0x3395, "M", "μl"), - (0x3396, "M", "ml"), - (0x3397, "M", "dl"), - (0x3398, "M", "kl"), - (0x3399, "M", "fm"), - (0x339A, "M", "nm"), - (0x339B, "M", "μm"), - (0x339C, "M", "mm"), - (0x339D, "M", "cm"), - (0x339E, "M", "km"), - (0x339F, "M", "mm2"), - (0x33A0, "M", "cm2"), - (0x33A1, "M", "m2"), - (0x33A2, "M", "km2"), - (0x33A3, "M", "mm3"), - (0x33A4, "M", "cm3"), - (0x33A5, "M", "m3"), - (0x33A6, "M", "km3"), - (0x33A7, "M", "m∕s"), - (0x33A8, "M", "m∕s2"), - (0x33A9, "M", "pa"), - (0x33AA, "M", "kpa"), - (0x33AB, "M", "mpa"), - (0x33AC, "M", "gpa"), - (0x33AD, "M", "rad"), - (0x33AE, "M", "rad∕s"), - (0x33AF, "M", "rad∕s2"), - (0x33B0, "M", "ps"), - (0x33B1, "M", "ns"), - (0x33B2, "M", "μs"), - (0x33B3, "M", "ms"), - (0x33B4, "M", "pv"), - (0x33B5, "M", "nv"), - (0x33B6, "M", "μv"), - (0x33B7, "M", "mv"), - (0x33B8, "M", "kv"), - (0x33B9, "M", "mv"), - (0x33BA, "M", "pw"), - (0x33BB, "M", "nw"), - (0x33BC, "M", "μw"), - (0x33BD, "M", "mw"), - (0x33BE, "M", "kw"), - (0x33BF, "M", "mw"), - (0x33C0, "M", "kω"), - ] - - -def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x33C1, "M", "mω"), - (0x33C2, "X"), - (0x33C3, "M", "bq"), - (0x33C4, "M", "cc"), - (0x33C5, "M", "cd"), - (0x33C6, "M", "c∕kg"), - (0x33C7, "X"), - (0x33C8, "M", "db"), - (0x33C9, "M", "gy"), - (0x33CA, "M", "ha"), - (0x33CB, "M", "hp"), - (0x33CC, "M", "in"), - (0x33CD, "M", "kk"), - (0x33CE, "M", "km"), - (0x33CF, "M", "kt"), - (0x33D0, "M", "lm"), - (0x33D1, "M", "ln"), - (0x33D2, "M", "log"), - (0x33D3, "M", "lx"), - (0x33D4, "M", "mb"), - (0x33D5, "M", "mil"), - (0x33D6, "M", "mol"), - (0x33D7, "M", "ph"), - (0x33D8, "X"), - (0x33D9, "M", "ppm"), - (0x33DA, "M", "pr"), - (0x33DB, "M", "sr"), - (0x33DC, "M", "sv"), - (0x33DD, "M", "wb"), - (0x33DE, "M", "v∕m"), - (0x33DF, "M", "a∕m"), - (0x33E0, "M", "1日"), - (0x33E1, "M", "2日"), - (0x33E2, "M", "3日"), - (0x33E3, "M", "4日"), - (0x33E4, "M", "5日"), - (0x33E5, "M", "6日"), - (0x33E6, "M", "7日"), - (0x33E7, "M", "8日"), - (0x33E8, "M", "9日"), - (0x33E9, "M", "10日"), - (0x33EA, "M", "11日"), - (0x33EB, "M", "12日"), - (0x33EC, "M", "13日"), - (0x33ED, "M", "14日"), - (0x33EE, "M", "15日"), - (0x33EF, "M", "16日"), - (0x33F0, "M", "17日"), - (0x33F1, "M", "18日"), - (0x33F2, "M", "19日"), - (0x33F3, "M", "20日"), - (0x33F4, "M", "21日"), - (0x33F5, "M", "22日"), - (0x33F6, "M", "23日"), - (0x33F7, "M", "24日"), - (0x33F8, "M", "25日"), - (0x33F9, "M", "26日"), - (0x33FA, "M", "27日"), - (0x33FB, "M", "28日"), - (0x33FC, "M", "29日"), - (0x33FD, "M", "30日"), - (0x33FE, "M", "31日"), - (0x33FF, "M", "gal"), - (0x3400, "V"), - (0xA48D, "X"), - (0xA490, "V"), - (0xA4C7, "X"), - (0xA4D0, "V"), - (0xA62C, "X"), - (0xA640, "M", "ꙁ"), - (0xA641, "V"), - (0xA642, "M", "ꙃ"), - (0xA643, "V"), - (0xA644, "M", "ꙅ"), - (0xA645, "V"), - (0xA646, "M", "ꙇ"), - (0xA647, "V"), - (0xA648, "M", "ꙉ"), - (0xA649, "V"), - (0xA64A, "M", "ꙋ"), - (0xA64B, "V"), - (0xA64C, "M", "ꙍ"), - (0xA64D, "V"), - (0xA64E, "M", "ꙏ"), - (0xA64F, "V"), - (0xA650, "M", "ꙑ"), - (0xA651, "V"), - (0xA652, "M", "ꙓ"), - (0xA653, "V"), - (0xA654, "M", "ꙕ"), - (0xA655, "V"), - (0xA656, "M", "ꙗ"), - (0xA657, "V"), - (0xA658, "M", "ꙙ"), - (0xA659, "V"), - (0xA65A, "M", "ꙛ"), - (0xA65B, "V"), - (0xA65C, "M", "ꙝ"), - (0xA65D, "V"), - (0xA65E, "M", "ꙟ"), - ] - - -def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xA65F, "V"), - (0xA660, "M", "ꙡ"), - (0xA661, "V"), - (0xA662, "M", "ꙣ"), - (0xA663, "V"), - (0xA664, "M", "ꙥ"), - (0xA665, "V"), - (0xA666, "M", "ꙧ"), - (0xA667, "V"), - (0xA668, "M", "ꙩ"), - (0xA669, "V"), - (0xA66A, "M", "ꙫ"), - (0xA66B, "V"), - (0xA66C, "M", "ꙭ"), - (0xA66D, "V"), - (0xA680, "M", "ꚁ"), - (0xA681, "V"), - (0xA682, "M", "ꚃ"), - (0xA683, "V"), - (0xA684, "M", "ꚅ"), - (0xA685, "V"), - (0xA686, "M", "ꚇ"), - (0xA687, "V"), - (0xA688, "M", "ꚉ"), - (0xA689, "V"), - (0xA68A, "M", "ꚋ"), - (0xA68B, "V"), - (0xA68C, "M", "ꚍ"), - (0xA68D, "V"), - (0xA68E, "M", "ꚏ"), - (0xA68F, "V"), - (0xA690, "M", "ꚑ"), - (0xA691, "V"), - (0xA692, "M", "ꚓ"), - (0xA693, "V"), - (0xA694, "M", "ꚕ"), - (0xA695, "V"), - (0xA696, "M", "ꚗ"), - (0xA697, "V"), - (0xA698, "M", "ꚙ"), - (0xA699, "V"), - (0xA69A, "M", "ꚛ"), - (0xA69B, "V"), - (0xA69C, "M", "ъ"), - (0xA69D, "M", "ь"), - (0xA69E, "V"), - (0xA6F8, "X"), - (0xA700, "V"), - (0xA722, "M", "ꜣ"), - (0xA723, "V"), - (0xA724, "M", "ꜥ"), - (0xA725, "V"), - (0xA726, "M", "ꜧ"), - (0xA727, "V"), - (0xA728, "M", "ꜩ"), - (0xA729, "V"), - (0xA72A, "M", "ꜫ"), - (0xA72B, "V"), - (0xA72C, "M", "ꜭ"), - (0xA72D, "V"), - (0xA72E, "M", "ꜯ"), - (0xA72F, "V"), - (0xA732, "M", "ꜳ"), - (0xA733, "V"), - (0xA734, "M", "ꜵ"), - (0xA735, "V"), - (0xA736, "M", "ꜷ"), - (0xA737, "V"), - (0xA738, "M", "ꜹ"), - (0xA739, "V"), - (0xA73A, "M", "ꜻ"), - (0xA73B, "V"), - (0xA73C, "M", "ꜽ"), - (0xA73D, "V"), - (0xA73E, "M", "ꜿ"), - (0xA73F, "V"), - (0xA740, "M", "ꝁ"), - (0xA741, "V"), - (0xA742, "M", "ꝃ"), - (0xA743, "V"), - (0xA744, "M", "ꝅ"), - (0xA745, "V"), - (0xA746, "M", "ꝇ"), - (0xA747, "V"), - (0xA748, "M", "ꝉ"), - (0xA749, "V"), - (0xA74A, "M", "ꝋ"), - (0xA74B, "V"), - (0xA74C, "M", "ꝍ"), - (0xA74D, "V"), - (0xA74E, "M", "ꝏ"), - (0xA74F, "V"), - (0xA750, "M", "ꝑ"), - (0xA751, "V"), - (0xA752, "M", "ꝓ"), - (0xA753, "V"), - (0xA754, "M", "ꝕ"), - (0xA755, "V"), - (0xA756, "M", "ꝗ"), - (0xA757, "V"), - ] - - -def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xA758, "M", "ꝙ"), - (0xA759, "V"), - (0xA75A, "M", "ꝛ"), - (0xA75B, "V"), - (0xA75C, "M", "ꝝ"), - (0xA75D, "V"), - (0xA75E, "M", "ꝟ"), - (0xA75F, "V"), - (0xA760, "M", "ꝡ"), - (0xA761, "V"), - (0xA762, "M", "ꝣ"), - (0xA763, "V"), - (0xA764, "M", "ꝥ"), - (0xA765, "V"), - (0xA766, "M", "ꝧ"), - (0xA767, "V"), - (0xA768, "M", "ꝩ"), - (0xA769, "V"), - (0xA76A, "M", "ꝫ"), - (0xA76B, "V"), - (0xA76C, "M", "ꝭ"), - (0xA76D, "V"), - (0xA76E, "M", "ꝯ"), - (0xA76F, "V"), - (0xA770, "M", "ꝯ"), - (0xA771, "V"), - (0xA779, "M", "ꝺ"), - (0xA77A, "V"), - (0xA77B, "M", "ꝼ"), - (0xA77C, "V"), - (0xA77D, "M", "ᵹ"), - (0xA77E, "M", "ꝿ"), - (0xA77F, "V"), - (0xA780, "M", "ꞁ"), - (0xA781, "V"), - (0xA782, "M", "ꞃ"), - (0xA783, "V"), - (0xA784, "M", "ꞅ"), - (0xA785, "V"), - (0xA786, "M", "ꞇ"), - (0xA787, "V"), - (0xA78B, "M", "ꞌ"), - (0xA78C, "V"), - (0xA78D, "M", "ɥ"), - (0xA78E, "V"), - (0xA790, "M", "ꞑ"), - (0xA791, "V"), - (0xA792, "M", "ꞓ"), - (0xA793, "V"), - (0xA796, "M", "ꞗ"), - (0xA797, "V"), - (0xA798, "M", "ꞙ"), - (0xA799, "V"), - (0xA79A, "M", "ꞛ"), - (0xA79B, "V"), - (0xA79C, "M", "ꞝ"), - (0xA79D, "V"), - (0xA79E, "M", "ꞟ"), - (0xA79F, "V"), - (0xA7A0, "M", "ꞡ"), - (0xA7A1, "V"), - (0xA7A2, "M", "ꞣ"), - (0xA7A3, "V"), - (0xA7A4, "M", "ꞥ"), - (0xA7A5, "V"), - (0xA7A6, "M", "ꞧ"), - (0xA7A7, "V"), - (0xA7A8, "M", "ꞩ"), - (0xA7A9, "V"), - (0xA7AA, "M", "ɦ"), - (0xA7AB, "M", "ɜ"), - (0xA7AC, "M", "ɡ"), - (0xA7AD, "M", "ɬ"), - (0xA7AE, "M", "ɪ"), - (0xA7AF, "V"), - (0xA7B0, "M", "ʞ"), - (0xA7B1, "M", "ʇ"), - (0xA7B2, "M", "ʝ"), - (0xA7B3, "M", "ꭓ"), - (0xA7B4, "M", "ꞵ"), - (0xA7B5, "V"), - (0xA7B6, "M", "ꞷ"), - (0xA7B7, "V"), - (0xA7B8, "M", "ꞹ"), - (0xA7B9, "V"), - (0xA7BA, "M", "ꞻ"), - (0xA7BB, "V"), - (0xA7BC, "M", "ꞽ"), - (0xA7BD, "V"), - (0xA7BE, "M", "ꞿ"), - (0xA7BF, "V"), - (0xA7C0, "M", "ꟁ"), - (0xA7C1, "V"), - (0xA7C2, "M", "ꟃ"), - (0xA7C3, "V"), - (0xA7C4, "M", "ꞔ"), - (0xA7C5, "M", "ʂ"), - (0xA7C6, "M", "ᶎ"), - (0xA7C7, "M", "ꟈ"), - (0xA7C8, "V"), - ] - - -def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xA7C9, "M", "ꟊ"), - (0xA7CA, "V"), - (0xA7CB, "M", "ɤ"), - (0xA7CC, "M", "ꟍ"), - (0xA7CD, "V"), - (0xA7CE, "X"), - (0xA7D0, "M", "ꟑ"), - (0xA7D1, "V"), - (0xA7D2, "X"), - (0xA7D3, "V"), - (0xA7D4, "X"), - (0xA7D5, "V"), - (0xA7D6, "M", "ꟗ"), - (0xA7D7, "V"), - (0xA7D8, "M", "ꟙ"), - (0xA7D9, "V"), - (0xA7DA, "M", "ꟛ"), - (0xA7DB, "V"), - (0xA7DC, "M", "ƛ"), - (0xA7DD, "X"), - (0xA7F2, "M", "c"), - (0xA7F3, "M", "f"), - (0xA7F4, "M", "q"), - (0xA7F5, "M", "ꟶ"), - (0xA7F6, "V"), - (0xA7F8, "M", "ħ"), - (0xA7F9, "M", "œ"), - (0xA7FA, "V"), - (0xA82D, "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", "ꜧ"), - (0xAB5D, "M", "ꬷ"), - (0xAB5E, "M", "ɫ"), - (0xAB5F, "M", "ꭒ"), - (0xAB60, "V"), - (0xAB69, "M", "ʍ"), - (0xAB6A, "V"), - (0xAB6C, "X"), - (0xAB70, "M", "Ꭰ"), - (0xAB71, "M", "Ꭱ"), - (0xAB72, "M", "Ꭲ"), - (0xAB73, "M", "Ꭳ"), - (0xAB74, "M", "Ꭴ"), - (0xAB75, "M", "Ꭵ"), - (0xAB76, "M", "Ꭶ"), - (0xAB77, "M", "Ꭷ"), - (0xAB78, "M", "Ꭸ"), - (0xAB79, "M", "Ꭹ"), - (0xAB7A, "M", "Ꭺ"), - (0xAB7B, "M", "Ꭻ"), - (0xAB7C, "M", "Ꭼ"), - (0xAB7D, "M", "Ꭽ"), - (0xAB7E, "M", "Ꭾ"), - (0xAB7F, "M", "Ꭿ"), - (0xAB80, "M", "Ꮀ"), - (0xAB81, "M", "Ꮁ"), - (0xAB82, "M", "Ꮂ"), - (0xAB83, "M", "Ꮃ"), - (0xAB84, "M", "Ꮄ"), - (0xAB85, "M", "Ꮅ"), - (0xAB86, "M", "Ꮆ"), - (0xAB87, "M", "Ꮇ"), - ] - - -def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xAB88, "M", "Ꮈ"), - (0xAB89, "M", "Ꮉ"), - (0xAB8A, "M", "Ꮊ"), - (0xAB8B, "M", "Ꮋ"), - (0xAB8C, "M", "Ꮌ"), - (0xAB8D, "M", "Ꮍ"), - (0xAB8E, "M", "Ꮎ"), - (0xAB8F, "M", "Ꮏ"), - (0xAB90, "M", "Ꮐ"), - (0xAB91, "M", "Ꮑ"), - (0xAB92, "M", "Ꮒ"), - (0xAB93, "M", "Ꮓ"), - (0xAB94, "M", "Ꮔ"), - (0xAB95, "M", "Ꮕ"), - (0xAB96, "M", "Ꮖ"), - (0xAB97, "M", "Ꮗ"), - (0xAB98, "M", "Ꮘ"), - (0xAB99, "M", "Ꮙ"), - (0xAB9A, "M", "Ꮚ"), - (0xAB9B, "M", "Ꮛ"), - (0xAB9C, "M", "Ꮜ"), - (0xAB9D, "M", "Ꮝ"), - (0xAB9E, "M", "Ꮞ"), - (0xAB9F, "M", "Ꮟ"), - (0xABA0, "M", "Ꮠ"), - (0xABA1, "M", "Ꮡ"), - (0xABA2, "M", "Ꮢ"), - (0xABA3, "M", "Ꮣ"), - (0xABA4, "M", "Ꮤ"), - (0xABA5, "M", "Ꮥ"), - (0xABA6, "M", "Ꮦ"), - (0xABA7, "M", "Ꮧ"), - (0xABA8, "M", "Ꮨ"), - (0xABA9, "M", "Ꮩ"), - (0xABAA, "M", "Ꮪ"), - (0xABAB, "M", "Ꮫ"), - (0xABAC, "M", "Ꮬ"), - (0xABAD, "M", "Ꮭ"), - (0xABAE, "M", "Ꮮ"), - (0xABAF, "M", "Ꮯ"), - (0xABB0, "M", "Ꮰ"), - (0xABB1, "M", "Ꮱ"), - (0xABB2, "M", "Ꮲ"), - (0xABB3, "M", "Ꮳ"), - (0xABB4, "M", "Ꮴ"), - (0xABB5, "M", "Ꮵ"), - (0xABB6, "M", "Ꮶ"), - (0xABB7, "M", "Ꮷ"), - (0xABB8, "M", "Ꮸ"), - (0xABB9, "M", "Ꮹ"), - (0xABBA, "M", "Ꮺ"), - (0xABBB, "M", "Ꮻ"), - (0xABBC, "M", "Ꮼ"), - (0xABBD, "M", "Ꮽ"), - (0xABBE, "M", "Ꮾ"), - (0xABBF, "M", "Ꮿ"), - (0xABC0, "V"), - (0xABEE, "X"), - (0xABF0, "V"), - (0xABFA, "X"), - (0xAC00, "V"), - (0xD7A4, "X"), - (0xD7B0, "V"), - (0xD7C7, "X"), - (0xD7CB, "V"), - (0xD7FC, "X"), - (0xF900, "M", "豈"), - (0xF901, "M", "更"), - (0xF902, "M", "車"), - (0xF903, "M", "賈"), - (0xF904, "M", "滑"), - (0xF905, "M", "串"), - (0xF906, "M", "句"), - (0xF907, "M", "龜"), - (0xF909, "M", "契"), - (0xF90A, "M", "金"), - (0xF90B, "M", "喇"), - (0xF90C, "M", "奈"), - (0xF90D, "M", "懶"), - (0xF90E, "M", "癩"), - (0xF90F, "M", "羅"), - (0xF910, "M", "蘿"), - (0xF911, "M", "螺"), - (0xF912, "M", "裸"), - (0xF913, "M", "邏"), - (0xF914, "M", "樂"), - (0xF915, "M", "洛"), - (0xF916, "M", "烙"), - (0xF917, "M", "珞"), - (0xF918, "M", "落"), - (0xF919, "M", "酪"), - (0xF91A, "M", "駱"), - (0xF91B, "M", "亂"), - (0xF91C, "M", "卵"), - (0xF91D, "M", "欄"), - (0xF91E, "M", "爛"), - (0xF91F, "M", "蘭"), - (0xF920, "M", "鸞"), - (0xF921, "M", "嵐"), - (0xF922, "M", "濫"), - ] - - -def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xF923, "M", "藍"), - (0xF924, "M", "襤"), - (0xF925, "M", "拉"), - (0xF926, "M", "臘"), - (0xF927, "M", "蠟"), - (0xF928, "M", "廊"), - (0xF929, "M", "朗"), - (0xF92A, "M", "浪"), - (0xF92B, "M", "狼"), - (0xF92C, "M", "郎"), - (0xF92D, "M", "來"), - (0xF92E, "M", "冷"), - (0xF92F, "M", "勞"), - (0xF930, "M", "擄"), - (0xF931, "M", "櫓"), - (0xF932, "M", "爐"), - (0xF933, "M", "盧"), - (0xF934, "M", "老"), - (0xF935, "M", "蘆"), - (0xF936, "M", "虜"), - (0xF937, "M", "路"), - (0xF938, "M", "露"), - (0xF939, "M", "魯"), - (0xF93A, "M", "鷺"), - (0xF93B, "M", "碌"), - (0xF93C, "M", "祿"), - (0xF93D, "M", "綠"), - (0xF93E, "M", "菉"), - (0xF93F, "M", "錄"), - (0xF940, "M", "鹿"), - (0xF941, "M", "論"), - (0xF942, "M", "壟"), - (0xF943, "M", "弄"), - (0xF944, "M", "籠"), - (0xF945, "M", "聾"), - (0xF946, "M", "牢"), - (0xF947, "M", "磊"), - (0xF948, "M", "賂"), - (0xF949, "M", "雷"), - (0xF94A, "M", "壘"), - (0xF94B, "M", "屢"), - (0xF94C, "M", "樓"), - (0xF94D, "M", "淚"), - (0xF94E, "M", "漏"), - (0xF94F, "M", "累"), - (0xF950, "M", "縷"), - (0xF951, "M", "陋"), - (0xF952, "M", "勒"), - (0xF953, "M", "肋"), - (0xF954, "M", "凜"), - (0xF955, "M", "凌"), - (0xF956, "M", "稜"), - (0xF957, "M", "綾"), - (0xF958, "M", "菱"), - (0xF959, "M", "陵"), - (0xF95A, "M", "讀"), - (0xF95B, "M", "拏"), - (0xF95C, "M", "樂"), - (0xF95D, "M", "諾"), - (0xF95E, "M", "丹"), - (0xF95F, "M", "寧"), - (0xF960, "M", "怒"), - (0xF961, "M", "率"), - (0xF962, "M", "異"), - (0xF963, "M", "北"), - (0xF964, "M", "磻"), - (0xF965, "M", "便"), - (0xF966, "M", "復"), - (0xF967, "M", "不"), - (0xF968, "M", "泌"), - (0xF969, "M", "數"), - (0xF96A, "M", "索"), - (0xF96B, "M", "參"), - (0xF96C, "M", "塞"), - (0xF96D, "M", "省"), - (0xF96E, "M", "葉"), - (0xF96F, "M", "說"), - (0xF970, "M", "殺"), - (0xF971, "M", "辰"), - (0xF972, "M", "沈"), - (0xF973, "M", "拾"), - (0xF974, "M", "若"), - (0xF975, "M", "掠"), - (0xF976, "M", "略"), - (0xF977, "M", "亮"), - (0xF978, "M", "兩"), - (0xF979, "M", "凉"), - (0xF97A, "M", "梁"), - (0xF97B, "M", "糧"), - (0xF97C, "M", "良"), - (0xF97D, "M", "諒"), - (0xF97E, "M", "量"), - (0xF97F, "M", "勵"), - (0xF980, "M", "呂"), - (0xF981, "M", "女"), - (0xF982, "M", "廬"), - (0xF983, "M", "旅"), - (0xF984, "M", "濾"), - (0xF985, "M", "礪"), - (0xF986, "M", "閭"), - ] - - -def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xF987, "M", "驪"), - (0xF988, "M", "麗"), - (0xF989, "M", "黎"), - (0xF98A, "M", "力"), - (0xF98B, "M", "曆"), - (0xF98C, "M", "歷"), - (0xF98D, "M", "轢"), - (0xF98E, "M", "年"), - (0xF98F, "M", "憐"), - (0xF990, "M", "戀"), - (0xF991, "M", "撚"), - (0xF992, "M", "漣"), - (0xF993, "M", "煉"), - (0xF994, "M", "璉"), - (0xF995, "M", "秊"), - (0xF996, "M", "練"), - (0xF997, "M", "聯"), - (0xF998, "M", "輦"), - (0xF999, "M", "蓮"), - (0xF99A, "M", "連"), - (0xF99B, "M", "鍊"), - (0xF99C, "M", "列"), - (0xF99D, "M", "劣"), - (0xF99E, "M", "咽"), - (0xF99F, "M", "烈"), - (0xF9A0, "M", "裂"), - (0xF9A1, "M", "說"), - (0xF9A2, "M", "廉"), - (0xF9A3, "M", "念"), - (0xF9A4, "M", "捻"), - (0xF9A5, "M", "殮"), - (0xF9A6, "M", "簾"), - (0xF9A7, "M", "獵"), - (0xF9A8, "M", "令"), - (0xF9A9, "M", "囹"), - (0xF9AA, "M", "寧"), - (0xF9AB, "M", "嶺"), - (0xF9AC, "M", "怜"), - (0xF9AD, "M", "玲"), - (0xF9AE, "M", "瑩"), - (0xF9AF, "M", "羚"), - (0xF9B0, "M", "聆"), - (0xF9B1, "M", "鈴"), - (0xF9B2, "M", "零"), - (0xF9B3, "M", "靈"), - (0xF9B4, "M", "領"), - (0xF9B5, "M", "例"), - (0xF9B6, "M", "禮"), - (0xF9B7, "M", "醴"), - (0xF9B8, "M", "隸"), - (0xF9B9, "M", "惡"), - (0xF9BA, "M", "了"), - (0xF9BB, "M", "僚"), - (0xF9BC, "M", "寮"), - (0xF9BD, "M", "尿"), - (0xF9BE, "M", "料"), - (0xF9BF, "M", "樂"), - (0xF9C0, "M", "燎"), - (0xF9C1, "M", "療"), - (0xF9C2, "M", "蓼"), - (0xF9C3, "M", "遼"), - (0xF9C4, "M", "龍"), - (0xF9C5, "M", "暈"), - (0xF9C6, "M", "阮"), - (0xF9C7, "M", "劉"), - (0xF9C8, "M", "杻"), - (0xF9C9, "M", "柳"), - (0xF9CA, "M", "流"), - (0xF9CB, "M", "溜"), - (0xF9CC, "M", "琉"), - (0xF9CD, "M", "留"), - (0xF9CE, "M", "硫"), - (0xF9CF, "M", "紐"), - (0xF9D0, "M", "類"), - (0xF9D1, "M", "六"), - (0xF9D2, "M", "戮"), - (0xF9D3, "M", "陸"), - (0xF9D4, "M", "倫"), - (0xF9D5, "M", "崙"), - (0xF9D6, "M", "淪"), - (0xF9D7, "M", "輪"), - (0xF9D8, "M", "律"), - (0xF9D9, "M", "慄"), - (0xF9DA, "M", "栗"), - (0xF9DB, "M", "率"), - (0xF9DC, "M", "隆"), - (0xF9DD, "M", "利"), - (0xF9DE, "M", "吏"), - (0xF9DF, "M", "履"), - (0xF9E0, "M", "易"), - (0xF9E1, "M", "李"), - (0xF9E2, "M", "梨"), - (0xF9E3, "M", "泥"), - (0xF9E4, "M", "理"), - (0xF9E5, "M", "痢"), - (0xF9E6, "M", "罹"), - (0xF9E7, "M", "裏"), - (0xF9E8, "M", "裡"), - (0xF9E9, "M", "里"), - (0xF9EA, "M", "離"), - ] - - -def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xF9EB, "M", "匿"), - (0xF9EC, "M", "溺"), - (0xF9ED, "M", "吝"), - (0xF9EE, "M", "燐"), - (0xF9EF, "M", "璘"), - (0xF9F0, "M", "藺"), - (0xF9F1, "M", "隣"), - (0xF9F2, "M", "鱗"), - (0xF9F3, "M", "麟"), - (0xF9F4, "M", "林"), - (0xF9F5, "M", "淋"), - (0xF9F6, "M", "臨"), - (0xF9F7, "M", "立"), - (0xF9F8, "M", "笠"), - (0xF9F9, "M", "粒"), - (0xF9FA, "M", "狀"), - (0xF9FB, "M", "炙"), - (0xF9FC, "M", "識"), - (0xF9FD, "M", "什"), - (0xF9FE, "M", "茶"), - (0xF9FF, "M", "刺"), - (0xFA00, "M", "切"), - (0xFA01, "M", "度"), - (0xFA02, "M", "拓"), - (0xFA03, "M", "糖"), - (0xFA04, "M", "宅"), - (0xFA05, "M", "洞"), - (0xFA06, "M", "暴"), - (0xFA07, "M", "輻"), - (0xFA08, "M", "行"), - (0xFA09, "M", "降"), - (0xFA0A, "M", "見"), - (0xFA0B, "M", "廓"), - (0xFA0C, "M", "兀"), - (0xFA0D, "M", "嗀"), - (0xFA0E, "V"), - (0xFA10, "M", "塚"), - (0xFA11, "V"), - (0xFA12, "M", "晴"), - (0xFA13, "V"), - (0xFA15, "M", "凞"), - (0xFA16, "M", "猪"), - (0xFA17, "M", "益"), - (0xFA18, "M", "礼"), - (0xFA19, "M", "神"), - (0xFA1A, "M", "祥"), - (0xFA1B, "M", "福"), - (0xFA1C, "M", "靖"), - (0xFA1D, "M", "精"), - (0xFA1E, "M", "羽"), - (0xFA1F, "V"), - (0xFA20, "M", "蘒"), - (0xFA21, "V"), - (0xFA22, "M", "諸"), - (0xFA23, "V"), - (0xFA25, "M", "逸"), - (0xFA26, "M", "都"), - (0xFA27, "V"), - (0xFA2A, "M", "飯"), - (0xFA2B, "M", "飼"), - (0xFA2C, "M", "館"), - (0xFA2D, "M", "鶴"), - (0xFA2E, "M", "郞"), - (0xFA2F, "M", "隷"), - (0xFA30, "M", "侮"), - (0xFA31, "M", "僧"), - (0xFA32, "M", "免"), - (0xFA33, "M", "勉"), - (0xFA34, "M", "勤"), - (0xFA35, "M", "卑"), - (0xFA36, "M", "喝"), - (0xFA37, "M", "嘆"), - (0xFA38, "M", "器"), - (0xFA39, "M", "塀"), - (0xFA3A, "M", "墨"), - (0xFA3B, "M", "層"), - (0xFA3C, "M", "屮"), - (0xFA3D, "M", "悔"), - (0xFA3E, "M", "慨"), - (0xFA3F, "M", "憎"), - (0xFA40, "M", "懲"), - (0xFA41, "M", "敏"), - (0xFA42, "M", "既"), - (0xFA43, "M", "暑"), - (0xFA44, "M", "梅"), - (0xFA45, "M", "海"), - (0xFA46, "M", "渚"), - (0xFA47, "M", "漢"), - (0xFA48, "M", "煮"), - (0xFA49, "M", "爫"), - (0xFA4A, "M", "琢"), - (0xFA4B, "M", "碑"), - (0xFA4C, "M", "社"), - (0xFA4D, "M", "祉"), - (0xFA4E, "M", "祈"), - (0xFA4F, "M", "祐"), - (0xFA50, "M", "祖"), - (0xFA51, "M", "祝"), - (0xFA52, "M", "禍"), - (0xFA53, "M", "禎"), - ] - - -def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFA54, "M", "穀"), - (0xFA55, "M", "突"), - (0xFA56, "M", "節"), - (0xFA57, "M", "練"), - (0xFA58, "M", "縉"), - (0xFA59, "M", "繁"), - (0xFA5A, "M", "署"), - (0xFA5B, "M", "者"), - (0xFA5C, "M", "臭"), - (0xFA5D, "M", "艹"), - (0xFA5F, "M", "著"), - (0xFA60, "M", "褐"), - (0xFA61, "M", "視"), - (0xFA62, "M", "謁"), - (0xFA63, "M", "謹"), - (0xFA64, "M", "賓"), - (0xFA65, "M", "贈"), - (0xFA66, "M", "辶"), - (0xFA67, "M", "逸"), - (0xFA68, "M", "難"), - (0xFA69, "M", "響"), - (0xFA6A, "M", "頻"), - (0xFA6B, "M", "恵"), - (0xFA6C, "M", "𤋮"), - (0xFA6D, "M", "舘"), - (0xFA6E, "X"), - (0xFA70, "M", "並"), - (0xFA71, "M", "况"), - (0xFA72, "M", "全"), - (0xFA73, "M", "侀"), - (0xFA74, "M", "充"), - (0xFA75, "M", "冀"), - (0xFA76, "M", "勇"), - (0xFA77, "M", "勺"), - (0xFA78, "M", "喝"), - (0xFA79, "M", "啕"), - (0xFA7A, "M", "喙"), - (0xFA7B, "M", "嗢"), - (0xFA7C, "M", "塚"), - (0xFA7D, "M", "墳"), - (0xFA7E, "M", "奄"), - (0xFA7F, "M", "奔"), - (0xFA80, "M", "婢"), - (0xFA81, "M", "嬨"), - (0xFA82, "M", "廒"), - (0xFA83, "M", "廙"), - (0xFA84, "M", "彩"), - (0xFA85, "M", "徭"), - (0xFA86, "M", "惘"), - (0xFA87, "M", "慎"), - (0xFA88, "M", "愈"), - (0xFA89, "M", "憎"), - (0xFA8A, "M", "慠"), - (0xFA8B, "M", "懲"), - (0xFA8C, "M", "戴"), - (0xFA8D, "M", "揄"), - (0xFA8E, "M", "搜"), - (0xFA8F, "M", "摒"), - (0xFA90, "M", "敖"), - (0xFA91, "M", "晴"), - (0xFA92, "M", "朗"), - (0xFA93, "M", "望"), - (0xFA94, "M", "杖"), - (0xFA95, "M", "歹"), - (0xFA96, "M", "殺"), - (0xFA97, "M", "流"), - (0xFA98, "M", "滛"), - (0xFA99, "M", "滋"), - (0xFA9A, "M", "漢"), - (0xFA9B, "M", "瀞"), - (0xFA9C, "M", "煮"), - (0xFA9D, "M", "瞧"), - (0xFA9E, "M", "爵"), - (0xFA9F, "M", "犯"), - (0xFAA0, "M", "猪"), - (0xFAA1, "M", "瑱"), - (0xFAA2, "M", "甆"), - (0xFAA3, "M", "画"), - (0xFAA4, "M", "瘝"), - (0xFAA5, "M", "瘟"), - (0xFAA6, "M", "益"), - (0xFAA7, "M", "盛"), - (0xFAA8, "M", "直"), - (0xFAA9, "M", "睊"), - (0xFAAA, "M", "着"), - (0xFAAB, "M", "磌"), - (0xFAAC, "M", "窱"), - (0xFAAD, "M", "節"), - (0xFAAE, "M", "类"), - (0xFAAF, "M", "絛"), - (0xFAB0, "M", "練"), - (0xFAB1, "M", "缾"), - (0xFAB2, "M", "者"), - (0xFAB3, "M", "荒"), - (0xFAB4, "M", "華"), - (0xFAB5, "M", "蝹"), - (0xFAB6, "M", "襁"), - (0xFAB7, "M", "覆"), - (0xFAB8, "M", "視"), - (0xFAB9, "M", "調"), - ] - - -def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFABA, "M", "諸"), - (0xFABB, "M", "請"), - (0xFABC, "M", "謁"), - (0xFABD, "M", "諾"), - (0xFABE, "M", "諭"), - (0xFABF, "M", "謹"), - (0xFAC0, "M", "變"), - (0xFAC1, "M", "贈"), - (0xFAC2, "M", "輸"), - (0xFAC3, "M", "遲"), - (0xFAC4, "M", "醙"), - (0xFAC5, "M", "鉶"), - (0xFAC6, "M", "陼"), - (0xFAC7, "M", "難"), - (0xFAC8, "M", "靖"), - (0xFAC9, "M", "韛"), - (0xFACA, "M", "響"), - (0xFACB, "M", "頋"), - (0xFACC, "M", "頻"), - (0xFACD, "M", "鬒"), - (0xFACE, "M", "龜"), - (0xFACF, "M", "𢡊"), - (0xFAD0, "M", "𢡄"), - (0xFAD1, "M", "𣏕"), - (0xFAD2, "M", "㮝"), - (0xFAD3, "M", "䀘"), - (0xFAD4, "M", "䀹"), - (0xFAD5, "M", "𥉉"), - (0xFAD6, "M", "𥳐"), - (0xFAD7, "M", "𧻓"), - (0xFAD8, "M", "齃"), - (0xFAD9, "M", "龎"), - (0xFADA, "X"), - (0xFB00, "M", "ff"), - (0xFB01, "M", "fi"), - (0xFB02, "M", "fl"), - (0xFB03, "M", "ffi"), - (0xFB04, "M", "ffl"), - (0xFB05, "M", "st"), - (0xFB07, "X"), - (0xFB13, "M", "մն"), - (0xFB14, "M", "մե"), - (0xFB15, "M", "մի"), - (0xFB16, "M", "վն"), - (0xFB17, "M", "մխ"), - (0xFB18, "X"), - (0xFB1D, "M", "יִ"), - (0xFB1E, "V"), - (0xFB1F, "M", "ײַ"), - (0xFB20, "M", "ע"), - (0xFB21, "M", "א"), - (0xFB22, "M", "ד"), - (0xFB23, "M", "ה"), - (0xFB24, "M", "כ"), - (0xFB25, "M", "ל"), - (0xFB26, "M", "ם"), - (0xFB27, "M", "ר"), - (0xFB28, "M", "ת"), - (0xFB29, "M", "+"), - (0xFB2A, "M", "שׁ"), - (0xFB2B, "M", "שׂ"), - (0xFB2C, "M", "שּׁ"), - (0xFB2D, "M", "שּׂ"), - (0xFB2E, "M", "אַ"), - (0xFB2F, "M", "אָ"), - (0xFB30, "M", "אּ"), - (0xFB31, "M", "בּ"), - (0xFB32, "M", "גּ"), - (0xFB33, "M", "דּ"), - (0xFB34, "M", "הּ"), - (0xFB35, "M", "וּ"), - (0xFB36, "M", "זּ"), - (0xFB37, "X"), - (0xFB38, "M", "טּ"), - (0xFB39, "M", "יּ"), - (0xFB3A, "M", "ךּ"), - (0xFB3B, "M", "כּ"), - (0xFB3C, "M", "לּ"), - (0xFB3D, "X"), - (0xFB3E, "M", "מּ"), - (0xFB3F, "X"), - (0xFB40, "M", "נּ"), - (0xFB41, "M", "סּ"), - (0xFB42, "X"), - (0xFB43, "M", "ףּ"), - (0xFB44, "M", "פּ"), - (0xFB45, "X"), - (0xFB46, "M", "צּ"), - (0xFB47, "M", "קּ"), - (0xFB48, "M", "רּ"), - (0xFB49, "M", "שּ"), - (0xFB4A, "M", "תּ"), - (0xFB4B, "M", "וֹ"), - (0xFB4C, "M", "בֿ"), - (0xFB4D, "M", "כֿ"), - (0xFB4E, "M", "פֿ"), - (0xFB4F, "M", "אל"), - (0xFB50, "M", "ٱ"), - (0xFB52, "M", "ٻ"), - (0xFB56, "M", "پ"), - ] - - -def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFB5A, "M", "ڀ"), - (0xFB5E, "M", "ٺ"), - (0xFB62, "M", "ٿ"), - (0xFB66, "M", "ٹ"), - (0xFB6A, "M", "ڤ"), - (0xFB6E, "M", "ڦ"), - (0xFB72, "M", "ڄ"), - (0xFB76, "M", "ڃ"), - (0xFB7A, "M", "چ"), - (0xFB7E, "M", "ڇ"), - (0xFB82, "M", "ڍ"), - (0xFB84, "M", "ڌ"), - (0xFB86, "M", "ڎ"), - (0xFB88, "M", "ڈ"), - (0xFB8A, "M", "ژ"), - (0xFB8C, "M", "ڑ"), - (0xFB8E, "M", "ک"), - (0xFB92, "M", "گ"), - (0xFB96, "M", "ڳ"), - (0xFB9A, "M", "ڱ"), - (0xFB9E, "M", "ں"), - (0xFBA0, "M", "ڻ"), - (0xFBA4, "M", "ۀ"), - (0xFBA6, "M", "ہ"), - (0xFBAA, "M", "ھ"), - (0xFBAE, "M", "ے"), - (0xFBB0, "M", "ۓ"), - (0xFBB2, "V"), - (0xFBC3, "X"), - (0xFBD3, "M", "ڭ"), - (0xFBD7, "M", "ۇ"), - (0xFBD9, "M", "ۆ"), - (0xFBDB, "M", "ۈ"), - (0xFBDD, "M", "ۇٴ"), - (0xFBDE, "M", "ۋ"), - (0xFBE0, "M", "ۅ"), - (0xFBE2, "M", "ۉ"), - (0xFBE4, "M", "ې"), - (0xFBE8, "M", "ى"), - (0xFBEA, "M", "ئا"), - (0xFBEC, "M", "ئە"), - (0xFBEE, "M", "ئو"), - (0xFBF0, "M", "ئۇ"), - (0xFBF2, "M", "ئۆ"), - (0xFBF4, "M", "ئۈ"), - (0xFBF6, "M", "ئې"), - (0xFBF9, "M", "ئى"), - (0xFBFC, "M", "ی"), - (0xFC00, "M", "ئج"), - (0xFC01, "M", "ئح"), - (0xFC02, "M", "ئم"), - (0xFC03, "M", "ئى"), - (0xFC04, "M", "ئي"), - (0xFC05, "M", "بج"), - (0xFC06, "M", "بح"), - (0xFC07, "M", "بخ"), - (0xFC08, "M", "بم"), - (0xFC09, "M", "بى"), - (0xFC0A, "M", "بي"), - (0xFC0B, "M", "تج"), - (0xFC0C, "M", "تح"), - (0xFC0D, "M", "تخ"), - (0xFC0E, "M", "تم"), - (0xFC0F, "M", "تى"), - (0xFC10, "M", "تي"), - (0xFC11, "M", "ثج"), - (0xFC12, "M", "ثم"), - (0xFC13, "M", "ثى"), - (0xFC14, "M", "ثي"), - (0xFC15, "M", "جح"), - (0xFC16, "M", "جم"), - (0xFC17, "M", "حج"), - (0xFC18, "M", "حم"), - (0xFC19, "M", "خج"), - (0xFC1A, "M", "خح"), - (0xFC1B, "M", "خم"), - (0xFC1C, "M", "سج"), - (0xFC1D, "M", "سح"), - (0xFC1E, "M", "سخ"), - (0xFC1F, "M", "سم"), - (0xFC20, "M", "صح"), - (0xFC21, "M", "صم"), - (0xFC22, "M", "ضج"), - (0xFC23, "M", "ضح"), - (0xFC24, "M", "ضخ"), - (0xFC25, "M", "ضم"), - (0xFC26, "M", "طح"), - (0xFC27, "M", "طم"), - (0xFC28, "M", "ظم"), - (0xFC29, "M", "عج"), - (0xFC2A, "M", "عم"), - (0xFC2B, "M", "غج"), - (0xFC2C, "M", "غم"), - (0xFC2D, "M", "فج"), - (0xFC2E, "M", "فح"), - (0xFC2F, "M", "فخ"), - (0xFC30, "M", "فم"), - (0xFC31, "M", "فى"), - (0xFC32, "M", "في"), - (0xFC33, "M", "قح"), - ] - - -def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFC34, "M", "قم"), - (0xFC35, "M", "قى"), - (0xFC36, "M", "قي"), - (0xFC37, "M", "كا"), - (0xFC38, "M", "كج"), - (0xFC39, "M", "كح"), - (0xFC3A, "M", "كخ"), - (0xFC3B, "M", "كل"), - (0xFC3C, "M", "كم"), - (0xFC3D, "M", "كى"), - (0xFC3E, "M", "كي"), - (0xFC3F, "M", "لج"), - (0xFC40, "M", "لح"), - (0xFC41, "M", "لخ"), - (0xFC42, "M", "لم"), - (0xFC43, "M", "لى"), - (0xFC44, "M", "لي"), - (0xFC45, "M", "مج"), - (0xFC46, "M", "مح"), - (0xFC47, "M", "مخ"), - (0xFC48, "M", "مم"), - (0xFC49, "M", "مى"), - (0xFC4A, "M", "مي"), - (0xFC4B, "M", "نج"), - (0xFC4C, "M", "نح"), - (0xFC4D, "M", "نخ"), - (0xFC4E, "M", "نم"), - (0xFC4F, "M", "نى"), - (0xFC50, "M", "ني"), - (0xFC51, "M", "هج"), - (0xFC52, "M", "هم"), - (0xFC53, "M", "هى"), - (0xFC54, "M", "هي"), - (0xFC55, "M", "يج"), - (0xFC56, "M", "يح"), - (0xFC57, "M", "يخ"), - (0xFC58, "M", "يم"), - (0xFC59, "M", "يى"), - (0xFC5A, "M", "يي"), - (0xFC5B, "M", "ذٰ"), - (0xFC5C, "M", "رٰ"), - (0xFC5D, "M", "ىٰ"), - (0xFC5E, "M", " ٌّ"), - (0xFC5F, "M", " ٍّ"), - (0xFC60, "M", " َّ"), - (0xFC61, "M", " ُّ"), - (0xFC62, "M", " ِّ"), - (0xFC63, "M", " ّٰ"), - (0xFC64, "M", "ئر"), - (0xFC65, "M", "ئز"), - (0xFC66, "M", "ئم"), - (0xFC67, "M", "ئن"), - (0xFC68, "M", "ئى"), - (0xFC69, "M", "ئي"), - (0xFC6A, "M", "بر"), - (0xFC6B, "M", "بز"), - (0xFC6C, "M", "بم"), - (0xFC6D, "M", "بن"), - (0xFC6E, "M", "بى"), - (0xFC6F, "M", "بي"), - (0xFC70, "M", "تر"), - (0xFC71, "M", "تز"), - (0xFC72, "M", "تم"), - (0xFC73, "M", "تن"), - (0xFC74, "M", "تى"), - (0xFC75, "M", "تي"), - (0xFC76, "M", "ثر"), - (0xFC77, "M", "ثز"), - (0xFC78, "M", "ثم"), - (0xFC79, "M", "ثن"), - (0xFC7A, "M", "ثى"), - (0xFC7B, "M", "ثي"), - (0xFC7C, "M", "فى"), - (0xFC7D, "M", "في"), - (0xFC7E, "M", "قى"), - (0xFC7F, "M", "قي"), - (0xFC80, "M", "كا"), - (0xFC81, "M", "كل"), - (0xFC82, "M", "كم"), - (0xFC83, "M", "كى"), - (0xFC84, "M", "كي"), - (0xFC85, "M", "لم"), - (0xFC86, "M", "لى"), - (0xFC87, "M", "لي"), - (0xFC88, "M", "ما"), - (0xFC89, "M", "مم"), - (0xFC8A, "M", "نر"), - (0xFC8B, "M", "نز"), - (0xFC8C, "M", "نم"), - (0xFC8D, "M", "نن"), - (0xFC8E, "M", "نى"), - (0xFC8F, "M", "ني"), - (0xFC90, "M", "ىٰ"), - (0xFC91, "M", "ير"), - (0xFC92, "M", "يز"), - (0xFC93, "M", "يم"), - (0xFC94, "M", "ين"), - (0xFC95, "M", "يى"), - (0xFC96, "M", "يي"), - (0xFC97, "M", "ئج"), - ] - - -def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFC98, "M", "ئح"), - (0xFC99, "M", "ئخ"), - (0xFC9A, "M", "ئم"), - (0xFC9B, "M", "ئه"), - (0xFC9C, "M", "بج"), - (0xFC9D, "M", "بح"), - (0xFC9E, "M", "بخ"), - (0xFC9F, "M", "بم"), - (0xFCA0, "M", "به"), - (0xFCA1, "M", "تج"), - (0xFCA2, "M", "تح"), - (0xFCA3, "M", "تخ"), - (0xFCA4, "M", "تم"), - (0xFCA5, "M", "ته"), - (0xFCA6, "M", "ثم"), - (0xFCA7, "M", "جح"), - (0xFCA8, "M", "جم"), - (0xFCA9, "M", "حج"), - (0xFCAA, "M", "حم"), - (0xFCAB, "M", "خج"), - (0xFCAC, "M", "خم"), - (0xFCAD, "M", "سج"), - (0xFCAE, "M", "سح"), - (0xFCAF, "M", "سخ"), - (0xFCB0, "M", "سم"), - (0xFCB1, "M", "صح"), - (0xFCB2, "M", "صخ"), - (0xFCB3, "M", "صم"), - (0xFCB4, "M", "ضج"), - (0xFCB5, "M", "ضح"), - (0xFCB6, "M", "ضخ"), - (0xFCB7, "M", "ضم"), - (0xFCB8, "M", "طح"), - (0xFCB9, "M", "ظم"), - (0xFCBA, "M", "عج"), - (0xFCBB, "M", "عم"), - (0xFCBC, "M", "غج"), - (0xFCBD, "M", "غم"), - (0xFCBE, "M", "فج"), - (0xFCBF, "M", "فح"), - (0xFCC0, "M", "فخ"), - (0xFCC1, "M", "فم"), - (0xFCC2, "M", "قح"), - (0xFCC3, "M", "قم"), - (0xFCC4, "M", "كج"), - (0xFCC5, "M", "كح"), - (0xFCC6, "M", "كخ"), - (0xFCC7, "M", "كل"), - (0xFCC8, "M", "كم"), - (0xFCC9, "M", "لج"), - (0xFCCA, "M", "لح"), - (0xFCCB, "M", "لخ"), - (0xFCCC, "M", "لم"), - (0xFCCD, "M", "له"), - (0xFCCE, "M", "مج"), - (0xFCCF, "M", "مح"), - (0xFCD0, "M", "مخ"), - (0xFCD1, "M", "مم"), - (0xFCD2, "M", "نج"), - (0xFCD3, "M", "نح"), - (0xFCD4, "M", "نخ"), - (0xFCD5, "M", "نم"), - (0xFCD6, "M", "نه"), - (0xFCD7, "M", "هج"), - (0xFCD8, "M", "هم"), - (0xFCD9, "M", "هٰ"), - (0xFCDA, "M", "يج"), - (0xFCDB, "M", "يح"), - (0xFCDC, "M", "يخ"), - (0xFCDD, "M", "يم"), - (0xFCDE, "M", "يه"), - (0xFCDF, "M", "ئم"), - (0xFCE0, "M", "ئه"), - (0xFCE1, "M", "بم"), - (0xFCE2, "M", "به"), - (0xFCE3, "M", "تم"), - (0xFCE4, "M", "ته"), - (0xFCE5, "M", "ثم"), - (0xFCE6, "M", "ثه"), - (0xFCE7, "M", "سم"), - (0xFCE8, "M", "سه"), - (0xFCE9, "M", "شم"), - (0xFCEA, "M", "شه"), - (0xFCEB, "M", "كل"), - (0xFCEC, "M", "كم"), - (0xFCED, "M", "لم"), - (0xFCEE, "M", "نم"), - (0xFCEF, "M", "نه"), - (0xFCF0, "M", "يم"), - (0xFCF1, "M", "يه"), - (0xFCF2, "M", "ـَّ"), - (0xFCF3, "M", "ـُّ"), - (0xFCF4, "M", "ـِّ"), - (0xFCF5, "M", "طى"), - (0xFCF6, "M", "طي"), - (0xFCF7, "M", "عى"), - (0xFCF8, "M", "عي"), - (0xFCF9, "M", "غى"), - (0xFCFA, "M", "غي"), - (0xFCFB, "M", "سى"), - ] - - -def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFCFC, "M", "سي"), - (0xFCFD, "M", "شى"), - (0xFCFE, "M", "شي"), - (0xFCFF, "M", "حى"), - (0xFD00, "M", "حي"), - (0xFD01, "M", "جى"), - (0xFD02, "M", "جي"), - (0xFD03, "M", "خى"), - (0xFD04, "M", "خي"), - (0xFD05, "M", "صى"), - (0xFD06, "M", "صي"), - (0xFD07, "M", "ضى"), - (0xFD08, "M", "ضي"), - (0xFD09, "M", "شج"), - (0xFD0A, "M", "شح"), - (0xFD0B, "M", "شخ"), - (0xFD0C, "M", "شم"), - (0xFD0D, "M", "شر"), - (0xFD0E, "M", "سر"), - (0xFD0F, "M", "صر"), - (0xFD10, "M", "ضر"), - (0xFD11, "M", "طى"), - (0xFD12, "M", "طي"), - (0xFD13, "M", "عى"), - (0xFD14, "M", "عي"), - (0xFD15, "M", "غى"), - (0xFD16, "M", "غي"), - (0xFD17, "M", "سى"), - (0xFD18, "M", "سي"), - (0xFD19, "M", "شى"), - (0xFD1A, "M", "شي"), - (0xFD1B, "M", "حى"), - (0xFD1C, "M", "حي"), - (0xFD1D, "M", "جى"), - (0xFD1E, "M", "جي"), - (0xFD1F, "M", "خى"), - (0xFD20, "M", "خي"), - (0xFD21, "M", "صى"), - (0xFD22, "M", "صي"), - (0xFD23, "M", "ضى"), - (0xFD24, "M", "ضي"), - (0xFD25, "M", "شج"), - (0xFD26, "M", "شح"), - (0xFD27, "M", "شخ"), - (0xFD28, "M", "شم"), - (0xFD29, "M", "شر"), - (0xFD2A, "M", "سر"), - (0xFD2B, "M", "صر"), - (0xFD2C, "M", "ضر"), - (0xFD2D, "M", "شج"), - (0xFD2E, "M", "شح"), - (0xFD2F, "M", "شخ"), - (0xFD30, "M", "شم"), - (0xFD31, "M", "سه"), - (0xFD32, "M", "شه"), - (0xFD33, "M", "طم"), - (0xFD34, "M", "سج"), - (0xFD35, "M", "سح"), - (0xFD36, "M", "سخ"), - (0xFD37, "M", "شج"), - (0xFD38, "M", "شح"), - (0xFD39, "M", "شخ"), - (0xFD3A, "M", "طم"), - (0xFD3B, "M", "ظم"), - (0xFD3C, "M", "اً"), - (0xFD3E, "V"), - (0xFD50, "M", "تجم"), - (0xFD51, "M", "تحج"), - (0xFD53, "M", "تحم"), - (0xFD54, "M", "تخم"), - (0xFD55, "M", "تمج"), - (0xFD56, "M", "تمح"), - (0xFD57, "M", "تمخ"), - (0xFD58, "M", "جمح"), - (0xFD5A, "M", "حمي"), - (0xFD5B, "M", "حمى"), - (0xFD5C, "M", "سحج"), - (0xFD5D, "M", "سجح"), - (0xFD5E, "M", "سجى"), - (0xFD5F, "M", "سمح"), - (0xFD61, "M", "سمج"), - (0xFD62, "M", "سمم"), - (0xFD64, "M", "صحح"), - (0xFD66, "M", "صمم"), - (0xFD67, "M", "شحم"), - (0xFD69, "M", "شجي"), - (0xFD6A, "M", "شمخ"), - (0xFD6C, "M", "شمم"), - (0xFD6E, "M", "ضحى"), - (0xFD6F, "M", "ضخم"), - (0xFD71, "M", "طمح"), - (0xFD73, "M", "طمم"), - (0xFD74, "M", "طمي"), - (0xFD75, "M", "عجم"), - (0xFD76, "M", "عمم"), - (0xFD78, "M", "عمى"), - (0xFD79, "M", "غمم"), - (0xFD7A, "M", "غمي"), - (0xFD7B, "M", "غمى"), - (0xFD7C, "M", "فخم"), - ] - - -def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFD7E, "M", "قمح"), - (0xFD7F, "M", "قمم"), - (0xFD80, "M", "لحم"), - (0xFD81, "M", "لحي"), - (0xFD82, "M", "لحى"), - (0xFD83, "M", "لجج"), - (0xFD85, "M", "لخم"), - (0xFD87, "M", "لمح"), - (0xFD89, "M", "محج"), - (0xFD8A, "M", "محم"), - (0xFD8B, "M", "محي"), - (0xFD8C, "M", "مجح"), - (0xFD8D, "M", "مجم"), - (0xFD8E, "M", "مخج"), - (0xFD8F, "M", "مخم"), - (0xFD90, "X"), - (0xFD92, "M", "مجخ"), - (0xFD93, "M", "همج"), - (0xFD94, "M", "همم"), - (0xFD95, "M", "نحم"), - (0xFD96, "M", "نحى"), - (0xFD97, "M", "نجم"), - (0xFD99, "M", "نجى"), - (0xFD9A, "M", "نمي"), - (0xFD9B, "M", "نمى"), - (0xFD9C, "M", "يمم"), - (0xFD9E, "M", "بخي"), - (0xFD9F, "M", "تجي"), - (0xFDA0, "M", "تجى"), - (0xFDA1, "M", "تخي"), - (0xFDA2, "M", "تخى"), - (0xFDA3, "M", "تمي"), - (0xFDA4, "M", "تمى"), - (0xFDA5, "M", "جمي"), - (0xFDA6, "M", "جحى"), - (0xFDA7, "M", "جمى"), - (0xFDA8, "M", "سخى"), - (0xFDA9, "M", "صحي"), - (0xFDAA, "M", "شحي"), - (0xFDAB, "M", "ضحي"), - (0xFDAC, "M", "لجي"), - (0xFDAD, "M", "لمي"), - (0xFDAE, "M", "يحي"), - (0xFDAF, "M", "يجي"), - (0xFDB0, "M", "يمي"), - (0xFDB1, "M", "ممي"), - (0xFDB2, "M", "قمي"), - (0xFDB3, "M", "نحي"), - (0xFDB4, "M", "قمح"), - (0xFDB5, "M", "لحم"), - (0xFDB6, "M", "عمي"), - (0xFDB7, "M", "كمي"), - (0xFDB8, "M", "نجح"), - (0xFDB9, "M", "مخي"), - (0xFDBA, "M", "لجم"), - (0xFDBB, "M", "كمم"), - (0xFDBC, "M", "لجم"), - (0xFDBD, "M", "نجح"), - (0xFDBE, "M", "جحي"), - (0xFDBF, "M", "حجي"), - (0xFDC0, "M", "مجي"), - (0xFDC1, "M", "فمي"), - (0xFDC2, "M", "بحي"), - (0xFDC3, "M", "كمم"), - (0xFDC4, "M", "عجم"), - (0xFDC5, "M", "صمم"), - (0xFDC6, "M", "سخي"), - (0xFDC7, "M", "نجي"), - (0xFDC8, "X"), - (0xFDCF, "V"), - (0xFDD0, "X"), - (0xFDF0, "M", "صلے"), - (0xFDF1, "M", "قلے"), - (0xFDF2, "M", "الله"), - (0xFDF3, "M", "اكبر"), - (0xFDF4, "M", "محمد"), - (0xFDF5, "M", "صلعم"), - (0xFDF6, "M", "رسول"), - (0xFDF7, "M", "عليه"), - (0xFDF8, "M", "وسلم"), - (0xFDF9, "M", "صلى"), - (0xFDFA, "M", "صلى الله عليه وسلم"), - (0xFDFB, "M", "جل جلاله"), - (0xFDFC, "M", "ریال"), - (0xFDFD, "V"), - (0xFE00, "I"), - (0xFE10, "M", ","), - (0xFE11, "M", "、"), - (0xFE12, "X"), - (0xFE13, "M", ":"), - (0xFE14, "M", ";"), - (0xFE15, "M", "!"), - (0xFE16, "M", "?"), - (0xFE17, "M", "〖"), - (0xFE18, "M", "〗"), - (0xFE19, "X"), - (0xFE20, "V"), - (0xFE30, "X"), - (0xFE31, "M", "—"), - (0xFE32, "M", "–"), - ] - - -def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFE33, "M", "_"), - (0xFE35, "M", "("), - (0xFE36, "M", ")"), - (0xFE37, "M", "{"), - (0xFE38, "M", "}"), - (0xFE39, "M", "〔"), - (0xFE3A, "M", "〕"), - (0xFE3B, "M", "【"), - (0xFE3C, "M", "】"), - (0xFE3D, "M", "《"), - (0xFE3E, "M", "》"), - (0xFE3F, "M", "〈"), - (0xFE40, "M", "〉"), - (0xFE41, "M", "「"), - (0xFE42, "M", "」"), - (0xFE43, "M", "『"), - (0xFE44, "M", "』"), - (0xFE45, "V"), - (0xFE47, "M", "["), - (0xFE48, "M", "]"), - (0xFE49, "M", " ̅"), - (0xFE4D, "M", "_"), - (0xFE50, "M", ","), - (0xFE51, "M", "、"), - (0xFE52, "X"), - (0xFE54, "M", ";"), - (0xFE55, "M", ":"), - (0xFE56, "M", "?"), - (0xFE57, "M", "!"), - (0xFE58, "M", "—"), - (0xFE59, "M", "("), - (0xFE5A, "M", ")"), - (0xFE5B, "M", "{"), - (0xFE5C, "M", "}"), - (0xFE5D, "M", "〔"), - (0xFE5E, "M", "〕"), - (0xFE5F, "M", "#"), - (0xFE60, "M", "&"), - (0xFE61, "M", "*"), - (0xFE62, "M", "+"), - (0xFE63, "M", "-"), - (0xFE64, "M", "<"), - (0xFE65, "M", ">"), - (0xFE66, "M", "="), - (0xFE67, "X"), - (0xFE68, "M", "\\"), - (0xFE69, "M", "$"), - (0xFE6A, "M", "%"), - (0xFE6B, "M", "@"), - (0xFE6C, "X"), - (0xFE70, "M", " ً"), - (0xFE71, "M", "ـً"), - (0xFE72, "M", " ٌ"), - (0xFE73, "V"), - (0xFE74, "M", " ٍ"), - (0xFE75, "X"), - (0xFE76, "M", " َ"), - (0xFE77, "M", "ـَ"), - (0xFE78, "M", " ُ"), - (0xFE79, "M", "ـُ"), - (0xFE7A, "M", " ِ"), - (0xFE7B, "M", "ـِ"), - (0xFE7C, "M", " ّ"), - (0xFE7D, "M", "ـّ"), - (0xFE7E, "M", " ْ"), - (0xFE7F, "M", "ـْ"), - (0xFE80, "M", "ء"), - (0xFE81, "M", "آ"), - (0xFE83, "M", "أ"), - (0xFE85, "M", "ؤ"), - (0xFE87, "M", "إ"), - (0xFE89, "M", "ئ"), - (0xFE8D, "M", "ا"), - (0xFE8F, "M", "ب"), - (0xFE93, "M", "ة"), - (0xFE95, "M", "ت"), - (0xFE99, "M", "ث"), - (0xFE9D, "M", "ج"), - (0xFEA1, "M", "ح"), - (0xFEA5, "M", "خ"), - (0xFEA9, "M", "د"), - (0xFEAB, "M", "ذ"), - (0xFEAD, "M", "ر"), - (0xFEAF, "M", "ز"), - (0xFEB1, "M", "س"), - (0xFEB5, "M", "ش"), - (0xFEB9, "M", "ص"), - (0xFEBD, "M", "ض"), - (0xFEC1, "M", "ط"), - (0xFEC5, "M", "ظ"), - (0xFEC9, "M", "ع"), - (0xFECD, "M", "غ"), - (0xFED1, "M", "ف"), - (0xFED5, "M", "ق"), - (0xFED9, "M", "ك"), - (0xFEDD, "M", "ل"), - (0xFEE1, "M", "م"), - (0xFEE5, "M", "ن"), - (0xFEE9, "M", "ه"), - (0xFEED, "M", "و"), - ] - - -def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFEEF, "M", "ى"), - (0xFEF1, "M", "ي"), - (0xFEF5, "M", "لآ"), - (0xFEF7, "M", "لأ"), - (0xFEF9, "M", "لإ"), - (0xFEFB, "M", "لا"), - (0xFEFD, "X"), - (0xFEFF, "I"), - (0xFF00, "X"), - (0xFF01, "M", "!"), - (0xFF02, "M", '"'), - (0xFF03, "M", "#"), - (0xFF04, "M", "$"), - (0xFF05, "M", "%"), - (0xFF06, "M", "&"), - (0xFF07, "M", "'"), - (0xFF08, "M", "("), - (0xFF09, "M", ")"), - (0xFF0A, "M", "*"), - (0xFF0B, "M", "+"), - (0xFF0C, "M", ","), - (0xFF0D, "M", "-"), - (0xFF0E, "M", "."), - (0xFF0F, "M", "/"), - (0xFF10, "M", "0"), - (0xFF11, "M", "1"), - (0xFF12, "M", "2"), - (0xFF13, "M", "3"), - (0xFF14, "M", "4"), - (0xFF15, "M", "5"), - (0xFF16, "M", "6"), - (0xFF17, "M", "7"), - (0xFF18, "M", "8"), - (0xFF19, "M", "9"), - (0xFF1A, "M", ":"), - (0xFF1B, "M", ";"), - (0xFF1C, "M", "<"), - (0xFF1D, "M", "="), - (0xFF1E, "M", ">"), - (0xFF1F, "M", "?"), - (0xFF20, "M", "@"), - (0xFF21, "M", "a"), - (0xFF22, "M", "b"), - (0xFF23, "M", "c"), - (0xFF24, "M", "d"), - (0xFF25, "M", "e"), - (0xFF26, "M", "f"), - (0xFF27, "M", "g"), - (0xFF28, "M", "h"), - (0xFF29, "M", "i"), - (0xFF2A, "M", "j"), - (0xFF2B, "M", "k"), - (0xFF2C, "M", "l"), - (0xFF2D, "M", "m"), - (0xFF2E, "M", "n"), - (0xFF2F, "M", "o"), - (0xFF30, "M", "p"), - (0xFF31, "M", "q"), - (0xFF32, "M", "r"), - (0xFF33, "M", "s"), - (0xFF34, "M", "t"), - (0xFF35, "M", "u"), - (0xFF36, "M", "v"), - (0xFF37, "M", "w"), - (0xFF38, "M", "x"), - (0xFF39, "M", "y"), - (0xFF3A, "M", "z"), - (0xFF3B, "M", "["), - (0xFF3C, "M", "\\"), - (0xFF3D, "M", "]"), - (0xFF3E, "M", "^"), - (0xFF3F, "M", "_"), - (0xFF40, "M", "`"), - (0xFF41, "M", "a"), - (0xFF42, "M", "b"), - (0xFF43, "M", "c"), - (0xFF44, "M", "d"), - (0xFF45, "M", "e"), - (0xFF46, "M", "f"), - (0xFF47, "M", "g"), - (0xFF48, "M", "h"), - (0xFF49, "M", "i"), - (0xFF4A, "M", "j"), - (0xFF4B, "M", "k"), - (0xFF4C, "M", "l"), - (0xFF4D, "M", "m"), - (0xFF4E, "M", "n"), - (0xFF4F, "M", "o"), - (0xFF50, "M", "p"), - (0xFF51, "M", "q"), - (0xFF52, "M", "r"), - (0xFF53, "M", "s"), - (0xFF54, "M", "t"), - (0xFF55, "M", "u"), - (0xFF56, "M", "v"), - (0xFF57, "M", "w"), - (0xFF58, "M", "x"), - (0xFF59, "M", "y"), - (0xFF5A, "M", "z"), - (0xFF5B, "M", "{"), - ] - - -def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFF5C, "M", "|"), - (0xFF5D, "M", "}"), - (0xFF5E, "M", "~"), - (0xFF5F, "M", "⦅"), - (0xFF60, "M", "⦆"), - (0xFF61, "M", "."), - (0xFF62, "M", "「"), - (0xFF63, "M", "」"), - (0xFF64, "M", "、"), - (0xFF65, "M", "・"), - (0xFF66, "M", "ヲ"), - (0xFF67, "M", "ァ"), - (0xFF68, "M", "ィ"), - (0xFF69, "M", "ゥ"), - (0xFF6A, "M", "ェ"), - (0xFF6B, "M", "ォ"), - (0xFF6C, "M", "ャ"), - (0xFF6D, "M", "ュ"), - (0xFF6E, "M", "ョ"), - (0xFF6F, "M", "ッ"), - (0xFF70, "M", "ー"), - (0xFF71, "M", "ア"), - (0xFF72, "M", "イ"), - (0xFF73, "M", "ウ"), - (0xFF74, "M", "エ"), - (0xFF75, "M", "オ"), - (0xFF76, "M", "カ"), - (0xFF77, "M", "キ"), - (0xFF78, "M", "ク"), - (0xFF79, "M", "ケ"), - (0xFF7A, "M", "コ"), - (0xFF7B, "M", "サ"), - (0xFF7C, "M", "シ"), - (0xFF7D, "M", "ス"), - (0xFF7E, "M", "セ"), - (0xFF7F, "M", "ソ"), - (0xFF80, "M", "タ"), - (0xFF81, "M", "チ"), - (0xFF82, "M", "ツ"), - (0xFF83, "M", "テ"), - (0xFF84, "M", "ト"), - (0xFF85, "M", "ナ"), - (0xFF86, "M", "ニ"), - (0xFF87, "M", "ヌ"), - (0xFF88, "M", "ネ"), - (0xFF89, "M", "ノ"), - (0xFF8A, "M", "ハ"), - (0xFF8B, "M", "ヒ"), - (0xFF8C, "M", "フ"), - (0xFF8D, "M", "ヘ"), - (0xFF8E, "M", "ホ"), - (0xFF8F, "M", "マ"), - (0xFF90, "M", "ミ"), - (0xFF91, "M", "ム"), - (0xFF92, "M", "メ"), - (0xFF93, "M", "モ"), - (0xFF94, "M", "ヤ"), - (0xFF95, "M", "ユ"), - (0xFF96, "M", "ヨ"), - (0xFF97, "M", "ラ"), - (0xFF98, "M", "リ"), - (0xFF99, "M", "ル"), - (0xFF9A, "M", "レ"), - (0xFF9B, "M", "ロ"), - (0xFF9C, "M", "ワ"), - (0xFF9D, "M", "ン"), - (0xFF9E, "M", "゙"), - (0xFF9F, "M", "゚"), - (0xFFA0, "I"), - (0xFFA1, "M", "ᄀ"), - (0xFFA2, "M", "ᄁ"), - (0xFFA3, "M", "ᆪ"), - (0xFFA4, "M", "ᄂ"), - (0xFFA5, "M", "ᆬ"), - (0xFFA6, "M", "ᆭ"), - (0xFFA7, "M", "ᄃ"), - (0xFFA8, "M", "ᄄ"), - (0xFFA9, "M", "ᄅ"), - (0xFFAA, "M", "ᆰ"), - (0xFFAB, "M", "ᆱ"), - (0xFFAC, "M", "ᆲ"), - (0xFFAD, "M", "ᆳ"), - (0xFFAE, "M", "ᆴ"), - (0xFFAF, "M", "ᆵ"), - (0xFFB0, "M", "ᄚ"), - (0xFFB1, "M", "ᄆ"), - (0xFFB2, "M", "ᄇ"), - (0xFFB3, "M", "ᄈ"), - (0xFFB4, "M", "ᄡ"), - (0xFFB5, "M", "ᄉ"), - (0xFFB6, "M", "ᄊ"), - (0xFFB7, "M", "ᄋ"), - (0xFFB8, "M", "ᄌ"), - (0xFFB9, "M", "ᄍ"), - (0xFFBA, "M", "ᄎ"), - (0xFFBB, "M", "ᄏ"), - (0xFFBC, "M", "ᄐ"), - (0xFFBD, "M", "ᄑ"), - (0xFFBE, "M", "ᄒ"), - (0xFFBF, "X"), - ] - - -def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFFC2, "M", "ᅡ"), - (0xFFC3, "M", "ᅢ"), - (0xFFC4, "M", "ᅣ"), - (0xFFC5, "M", "ᅤ"), - (0xFFC6, "M", "ᅥ"), - (0xFFC7, "M", "ᅦ"), - (0xFFC8, "X"), - (0xFFCA, "M", "ᅧ"), - (0xFFCB, "M", "ᅨ"), - (0xFFCC, "M", "ᅩ"), - (0xFFCD, "M", "ᅪ"), - (0xFFCE, "M", "ᅫ"), - (0xFFCF, "M", "ᅬ"), - (0xFFD0, "X"), - (0xFFD2, "M", "ᅭ"), - (0xFFD3, "M", "ᅮ"), - (0xFFD4, "M", "ᅯ"), - (0xFFD5, "M", "ᅰ"), - (0xFFD6, "M", "ᅱ"), - (0xFFD7, "M", "ᅲ"), - (0xFFD8, "X"), - (0xFFDA, "M", "ᅳ"), - (0xFFDB, "M", "ᅴ"), - (0xFFDC, "M", "ᅵ"), - (0xFFDD, "X"), - (0xFFE0, "M", "¢"), - (0xFFE1, "M", "£"), - (0xFFE2, "M", "¬"), - (0xFFE3, "M", " ̄"), - (0xFFE4, "M", "¦"), - (0xFFE5, "M", "¥"), - (0xFFE6, "M", "₩"), - (0xFFE7, "X"), - (0xFFE8, "M", "│"), - (0xFFE9, "M", "←"), - (0xFFEA, "M", "↑"), - (0xFFEB, "M", "→"), - (0xFFEC, "M", "↓"), - (0xFFED, "M", "■"), - (0xFFEE, "M", "○"), - (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"), - (0x1019D, "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", "𐐨"), - (0x10401, "M", "𐐩"), - (0x10402, "M", "𐐪"), - (0x10403, "M", "𐐫"), - (0x10404, "M", "𐐬"), - (0x10405, "M", "𐐭"), - (0x10406, "M", "𐐮"), - (0x10407, "M", "𐐯"), - (0x10408, "M", "𐐰"), - (0x10409, "M", "𐐱"), - (0x1040A, "M", "𐐲"), - (0x1040B, "M", "𐐳"), - (0x1040C, "M", "𐐴"), - (0x1040D, "M", "𐐵"), - (0x1040E, "M", "𐐶"), - ] - - -def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1040F, "M", "𐐷"), - (0x10410, "M", "𐐸"), - (0x10411, "M", "𐐹"), - (0x10412, "M", "𐐺"), - (0x10413, "M", "𐐻"), - (0x10414, "M", "𐐼"), - (0x10415, "M", "𐐽"), - (0x10416, "M", "𐐾"), - (0x10417, "M", "𐐿"), - (0x10418, "M", "𐑀"), - (0x10419, "M", "𐑁"), - (0x1041A, "M", "𐑂"), - (0x1041B, "M", "𐑃"), - (0x1041C, "M", "𐑄"), - (0x1041D, "M", "𐑅"), - (0x1041E, "M", "𐑆"), - (0x1041F, "M", "𐑇"), - (0x10420, "M", "𐑈"), - (0x10421, "M", "𐑉"), - (0x10422, "M", "𐑊"), - (0x10423, "M", "𐑋"), - (0x10424, "M", "𐑌"), - (0x10425, "M", "𐑍"), - (0x10426, "M", "𐑎"), - (0x10427, "M", "𐑏"), - (0x10428, "V"), - (0x1049E, "X"), - (0x104A0, "V"), - (0x104AA, "X"), - (0x104B0, "M", "𐓘"), - (0x104B1, "M", "𐓙"), - (0x104B2, "M", "𐓚"), - (0x104B3, "M", "𐓛"), - (0x104B4, "M", "𐓜"), - (0x104B5, "M", "𐓝"), - (0x104B6, "M", "𐓞"), - (0x104B7, "M", "𐓟"), - (0x104B8, "M", "𐓠"), - (0x104B9, "M", "𐓡"), - (0x104BA, "M", "𐓢"), - (0x104BB, "M", "𐓣"), - (0x104BC, "M", "𐓤"), - (0x104BD, "M", "𐓥"), - (0x104BE, "M", "𐓦"), - (0x104BF, "M", "𐓧"), - (0x104C0, "M", "𐓨"), - (0x104C1, "M", "𐓩"), - (0x104C2, "M", "𐓪"), - (0x104C3, "M", "𐓫"), - (0x104C4, "M", "𐓬"), - (0x104C5, "M", "𐓭"), - (0x104C6, "M", "𐓮"), - (0x104C7, "M", "𐓯"), - (0x104C8, "M", "𐓰"), - (0x104C9, "M", "𐓱"), - (0x104CA, "M", "𐓲"), - (0x104CB, "M", "𐓳"), - (0x104CC, "M", "𐓴"), - (0x104CD, "M", "𐓵"), - (0x104CE, "M", "𐓶"), - (0x104CF, "M", "𐓷"), - (0x104D0, "M", "𐓸"), - (0x104D1, "M", "𐓹"), - (0x104D2, "M", "𐓺"), - (0x104D3, "M", "𐓻"), - (0x104D4, "X"), - (0x104D8, "V"), - (0x104FC, "X"), - (0x10500, "V"), - (0x10528, "X"), - (0x10530, "V"), - (0x10564, "X"), - (0x1056F, "V"), - (0x10570, "M", "𐖗"), - (0x10571, "M", "𐖘"), - (0x10572, "M", "𐖙"), - (0x10573, "M", "𐖚"), - (0x10574, "M", "𐖛"), - (0x10575, "M", "𐖜"), - (0x10576, "M", "𐖝"), - (0x10577, "M", "𐖞"), - (0x10578, "M", "𐖟"), - (0x10579, "M", "𐖠"), - (0x1057A, "M", "𐖡"), - (0x1057B, "X"), - (0x1057C, "M", "𐖣"), - (0x1057D, "M", "𐖤"), - (0x1057E, "M", "𐖥"), - (0x1057F, "M", "𐖦"), - (0x10580, "M", "𐖧"), - (0x10581, "M", "𐖨"), - (0x10582, "M", "𐖩"), - (0x10583, "M", "𐖪"), - (0x10584, "M", "𐖫"), - (0x10585, "M", "𐖬"), - (0x10586, "M", "𐖭"), - (0x10587, "M", "𐖮"), - (0x10588, "M", "𐖯"), - (0x10589, "M", "𐖰"), - (0x1058A, "M", "𐖱"), - ] - - -def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1058B, "X"), - (0x1058C, "M", "𐖳"), - (0x1058D, "M", "𐖴"), - (0x1058E, "M", "𐖵"), - (0x1058F, "M", "𐖶"), - (0x10590, "M", "𐖷"), - (0x10591, "M", "𐖸"), - (0x10592, "M", "𐖹"), - (0x10593, "X"), - (0x10594, "M", "𐖻"), - (0x10595, "M", "𐖼"), - (0x10596, "X"), - (0x10597, "V"), - (0x105A2, "X"), - (0x105A3, "V"), - (0x105B2, "X"), - (0x105B3, "V"), - (0x105BA, "X"), - (0x105BB, "V"), - (0x105BD, "X"), - (0x105C0, "V"), - (0x105F4, "X"), - (0x10600, "V"), - (0x10737, "X"), - (0x10740, "V"), - (0x10756, "X"), - (0x10760, "V"), - (0x10768, "X"), - (0x10780, "V"), - (0x10781, "M", "ː"), - (0x10782, "M", "ˑ"), - (0x10783, "M", "æ"), - (0x10784, "M", "ʙ"), - (0x10785, "M", "ɓ"), - (0x10786, "X"), - (0x10787, "M", "ʣ"), - (0x10788, "M", "ꭦ"), - (0x10789, "M", "ʥ"), - (0x1078A, "M", "ʤ"), - (0x1078B, "M", "ɖ"), - (0x1078C, "M", "ɗ"), - (0x1078D, "M", "ᶑ"), - (0x1078E, "M", "ɘ"), - (0x1078F, "M", "ɞ"), - (0x10790, "M", "ʩ"), - (0x10791, "M", "ɤ"), - (0x10792, "M", "ɢ"), - (0x10793, "M", "ɠ"), - (0x10794, "M", "ʛ"), - (0x10795, "M", "ħ"), - (0x10796, "M", "ʜ"), - (0x10797, "M", "ɧ"), - (0x10798, "M", "ʄ"), - (0x10799, "M", "ʪ"), - (0x1079A, "M", "ʫ"), - (0x1079B, "M", "ɬ"), - (0x1079C, "M", "𝼄"), - (0x1079D, "M", "ꞎ"), - (0x1079E, "M", "ɮ"), - (0x1079F, "M", "𝼅"), - (0x107A0, "M", "ʎ"), - (0x107A1, "M", "𝼆"), - (0x107A2, "M", "ø"), - (0x107A3, "M", "ɶ"), - (0x107A4, "M", "ɷ"), - (0x107A5, "M", "q"), - (0x107A6, "M", "ɺ"), - (0x107A7, "M", "𝼈"), - (0x107A8, "M", "ɽ"), - (0x107A9, "M", "ɾ"), - (0x107AA, "M", "ʀ"), - (0x107AB, "M", "ʨ"), - (0x107AC, "M", "ʦ"), - (0x107AD, "M", "ꭧ"), - (0x107AE, "M", "ʧ"), - (0x107AF, "M", "ʈ"), - (0x107B0, "M", "ⱱ"), - (0x107B1, "X"), - (0x107B2, "M", "ʏ"), - (0x107B3, "M", "ʡ"), - (0x107B4, "M", "ʢ"), - (0x107B5, "M", "ʘ"), - (0x107B6, "M", "ǀ"), - (0x107B7, "M", "ǁ"), - (0x107B8, "M", "ǂ"), - (0x107B9, "M", "𝼊"), - (0x107BA, "M", "𝼞"), - (0x107BB, "X"), - (0x10800, "V"), - (0x10806, "X"), - (0x10808, "V"), - (0x10809, "X"), - (0x1080A, "V"), - (0x10836, "X"), - (0x10837, "V"), - (0x10839, "X"), - (0x1083C, "V"), - (0x1083D, "X"), - (0x1083F, "V"), - (0x10856, "X"), - ] - - -def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "𐳀"), - (0x10C81, "M", "𐳁"), - (0x10C82, "M", "𐳂"), - (0x10C83, "M", "𐳃"), - (0x10C84, "M", "𐳄"), - (0x10C85, "M", "𐳅"), - (0x10C86, "M", "𐳆"), - (0x10C87, "M", "𐳇"), - (0x10C88, "M", "𐳈"), - (0x10C89, "M", "𐳉"), - (0x10C8A, "M", "𐳊"), - (0x10C8B, "M", "𐳋"), - (0x10C8C, "M", "𐳌"), - (0x10C8D, "M", "𐳍"), - (0x10C8E, "M", "𐳎"), - (0x10C8F, "M", "𐳏"), - (0x10C90, "M", "𐳐"), - (0x10C91, "M", "𐳑"), - (0x10C92, "M", "𐳒"), - (0x10C93, "M", "𐳓"), - (0x10C94, "M", "𐳔"), - (0x10C95, "M", "𐳕"), - (0x10C96, "M", "𐳖"), - (0x10C97, "M", "𐳗"), - (0x10C98, "M", "𐳘"), - (0x10C99, "M", "𐳙"), - (0x10C9A, "M", "𐳚"), - (0x10C9B, "M", "𐳛"), - (0x10C9C, "M", "𐳜"), - (0x10C9D, "M", "𐳝"), - (0x10C9E, "M", "𐳞"), - (0x10C9F, "M", "𐳟"), - (0x10CA0, "M", "𐳠"), - (0x10CA1, "M", "𐳡"), - (0x10CA2, "M", "𐳢"), - (0x10CA3, "M", "𐳣"), - (0x10CA4, "M", "𐳤"), - (0x10CA5, "M", "𐳥"), - (0x10CA6, "M", "𐳦"), - (0x10CA7, "M", "𐳧"), - (0x10CA8, "M", "𐳨"), - (0x10CA9, "M", "𐳩"), - (0x10CAA, "M", "𐳪"), - (0x10CAB, "M", "𐳫"), - (0x10CAC, "M", "𐳬"), - (0x10CAD, "M", "𐳭"), - ] - - -def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x10CAE, "M", "𐳮"), - (0x10CAF, "M", "𐳯"), - (0x10CB0, "M", "𐳰"), - (0x10CB1, "M", "𐳱"), - (0x10CB2, "M", "𐳲"), - (0x10CB3, "X"), - (0x10CC0, "V"), - (0x10CF3, "X"), - (0x10CFA, "V"), - (0x10D28, "X"), - (0x10D30, "V"), - (0x10D3A, "X"), - (0x10D40, "V"), - (0x10D50, "M", "𐵰"), - (0x10D51, "M", "𐵱"), - (0x10D52, "M", "𐵲"), - (0x10D53, "M", "𐵳"), - (0x10D54, "M", "𐵴"), - (0x10D55, "M", "𐵵"), - (0x10D56, "M", "𐵶"), - (0x10D57, "M", "𐵷"), - (0x10D58, "M", "𐵸"), - (0x10D59, "M", "𐵹"), - (0x10D5A, "M", "𐵺"), - (0x10D5B, "M", "𐵻"), - (0x10D5C, "M", "𐵼"), - (0x10D5D, "M", "𐵽"), - (0x10D5E, "M", "𐵾"), - (0x10D5F, "M", "𐵿"), - (0x10D60, "M", "𐶀"), - (0x10D61, "M", "𐶁"), - (0x10D62, "M", "𐶂"), - (0x10D63, "M", "𐶃"), - (0x10D64, "M", "𐶄"), - (0x10D65, "M", "𐶅"), - (0x10D66, "X"), - (0x10D69, "V"), - (0x10D86, "X"), - (0x10D8E, "V"), - (0x10D90, "X"), - (0x10E60, "V"), - (0x10E7F, "X"), - (0x10E80, "V"), - (0x10EAA, "X"), - (0x10EAB, "V"), - (0x10EAE, "X"), - (0x10EB0, "V"), - (0x10EB2, "X"), - (0x10EC2, "V"), - (0x10EC5, "X"), - (0x10EFC, "V"), - (0x10F28, "X"), - (0x10F30, "V"), - (0x10F5A, "X"), - (0x10F70, "V"), - (0x10F8A, "X"), - (0x10FB0, "V"), - (0x10FCC, "X"), - (0x10FE0, "V"), - (0x10FF7, "X"), - (0x11000, "V"), - (0x1104E, "X"), - (0x11052, "V"), - (0x11076, "X"), - (0x1107F, "V"), - (0x110BD, "X"), - (0x110BE, "V"), - (0x110C3, "X"), - (0x110D0, "V"), - (0x110E9, "X"), - (0x110F0, "V"), - (0x110FA, "X"), - (0x11100, "V"), - (0x11135, "X"), - (0x11136, "V"), - (0x11148, "X"), - (0x11150, "V"), - (0x11177, "X"), - (0x11180, "V"), - (0x111E0, "X"), - (0x111E1, "V"), - (0x111F5, "X"), - (0x11200, "V"), - (0x11212, "X"), - (0x11213, "V"), - (0x11242, "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"), - ] - - -def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (0x11380, "V"), - (0x1138A, "X"), - (0x1138B, "V"), - (0x1138C, "X"), - (0x1138E, "V"), - (0x1138F, "X"), - (0x11390, "V"), - (0x113B6, "X"), - (0x113B7, "V"), - (0x113C1, "X"), - (0x113C2, "V"), - (0x113C3, "X"), - (0x113C5, "V"), - (0x113C6, "X"), - (0x113C7, "V"), - (0x113CB, "X"), - (0x113CC, "V"), - (0x113D6, "X"), - (0x113D7, "V"), - (0x113D9, "X"), - (0x113E1, "V"), - (0x113E3, "X"), - (0x11400, "V"), - (0x1145C, "X"), - (0x1145D, "V"), - (0x11462, "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"), - (0x116BA, "X"), - (0x116C0, "V"), - (0x116CA, "X"), - (0x116D0, "V"), - (0x116E4, "X"), - (0x11700, "V"), - (0x1171B, "X"), - (0x1171D, "V"), - (0x1172C, "X"), - (0x11730, "V"), - (0x11747, "X"), - (0x11800, "V"), - (0x1183C, "X"), - (0x118A0, "M", "𑣀"), - (0x118A1, "M", "𑣁"), - (0x118A2, "M", "𑣂"), - (0x118A3, "M", "𑣃"), - (0x118A4, "M", "𑣄"), - (0x118A5, "M", "𑣅"), - (0x118A6, "M", "𑣆"), - (0x118A7, "M", "𑣇"), - (0x118A8, "M", "𑣈"), - (0x118A9, "M", "𑣉"), - (0x118AA, "M", "𑣊"), - (0x118AB, "M", "𑣋"), - (0x118AC, "M", "𑣌"), - (0x118AD, "M", "𑣍"), - (0x118AE, "M", "𑣎"), - (0x118AF, "M", "𑣏"), - ] - - -def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x118B0, "M", "𑣐"), - (0x118B1, "M", "𑣑"), - (0x118B2, "M", "𑣒"), - (0x118B3, "M", "𑣓"), - (0x118B4, "M", "𑣔"), - (0x118B5, "M", "𑣕"), - (0x118B6, "M", "𑣖"), - (0x118B7, "M", "𑣗"), - (0x118B8, "M", "𑣘"), - (0x118B9, "M", "𑣙"), - (0x118BA, "M", "𑣚"), - (0x118BB, "M", "𑣛"), - (0x118BC, "M", "𑣜"), - (0x118BD, "M", "𑣝"), - (0x118BE, "M", "𑣞"), - (0x118BF, "M", "𑣟"), - (0x118C0, "V"), - (0x118F3, "X"), - (0x118FF, "V"), - (0x11907, "X"), - (0x11909, "V"), - (0x1190A, "X"), - (0x1190C, "V"), - (0x11914, "X"), - (0x11915, "V"), - (0x11917, "X"), - (0x11918, "V"), - (0x11936, "X"), - (0x11937, "V"), - (0x11939, "X"), - (0x1193B, "V"), - (0x11947, "X"), - (0x11950, "V"), - (0x1195A, "X"), - (0x119A0, "V"), - (0x119A8, "X"), - (0x119AA, "V"), - (0x119D8, "X"), - (0x119DA, "V"), - (0x119E5, "X"), - (0x11A00, "V"), - (0x11A48, "X"), - (0x11A50, "V"), - (0x11AA3, "X"), - (0x11AB0, "V"), - (0x11AF9, "X"), - (0x11B00, "V"), - (0x11B0A, "X"), - (0x11BC0, "V"), - (0x11BE2, "X"), - (0x11BF0, "V"), - (0x11BFA, "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"), - (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"), - (0x11F00, "V"), - (0x11F11, "X"), - (0x11F12, "V"), - (0x11F3B, "X"), - (0x11F3E, "V"), - (0x11F5B, "X"), - ] - - -def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x11FB0, "V"), - (0x11FB1, "X"), - (0x11FC0, "V"), - (0x11FF2, "X"), - (0x11FFF, "V"), - (0x1239A, "X"), - (0x12400, "V"), - (0x1246F, "X"), - (0x12470, "V"), - (0x12475, "X"), - (0x12480, "V"), - (0x12544, "X"), - (0x12F90, "V"), - (0x12FF3, "X"), - (0x13000, "V"), - (0x13430, "X"), - (0x13440, "V"), - (0x13456, "X"), - (0x13460, "V"), - (0x143FB, "X"), - (0x14400, "V"), - (0x14647, "X"), - (0x16100, "V"), - (0x1613A, "X"), - (0x16800, "V"), - (0x16A39, "X"), - (0x16A40, "V"), - (0x16A5F, "X"), - (0x16A60, "V"), - (0x16A6A, "X"), - (0x16A6E, "V"), - (0x16ABF, "X"), - (0x16AC0, "V"), - (0x16ACA, "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"), - (0x16D40, "V"), - (0x16D7A, "X"), - (0x16E40, "M", "𖹠"), - (0x16E41, "M", "𖹡"), - (0x16E42, "M", "𖹢"), - (0x16E43, "M", "𖹣"), - (0x16E44, "M", "𖹤"), - (0x16E45, "M", "𖹥"), - (0x16E46, "M", "𖹦"), - (0x16E47, "M", "𖹧"), - (0x16E48, "M", "𖹨"), - (0x16E49, "M", "𖹩"), - (0x16E4A, "M", "𖹪"), - (0x16E4B, "M", "𖹫"), - (0x16E4C, "M", "𖹬"), - (0x16E4D, "M", "𖹭"), - (0x16E4E, "M", "𖹮"), - (0x16E4F, "M", "𖹯"), - (0x16E50, "M", "𖹰"), - (0x16E51, "M", "𖹱"), - (0x16E52, "M", "𖹲"), - (0x16E53, "M", "𖹳"), - (0x16E54, "M", "𖹴"), - (0x16E55, "M", "𖹵"), - (0x16E56, "M", "𖹶"), - (0x16E57, "M", "𖹷"), - (0x16E58, "M", "𖹸"), - (0x16E59, "M", "𖹹"), - (0x16E5A, "M", "𖹺"), - (0x16E5B, "M", "𖹻"), - (0x16E5C, "M", "𖹼"), - (0x16E5D, "M", "𖹽"), - (0x16E5E, "M", "𖹾"), - (0x16E5F, "M", "𖹿"), - (0x16E60, "V"), - (0x16E9B, "X"), - (0x16F00, "V"), - (0x16F4B, "X"), - (0x16F4F, "V"), - (0x16F88, "X"), - (0x16F8F, "V"), - (0x16FA0, "X"), - (0x16FE0, "V"), - (0x16FE5, "X"), - (0x16FF0, "V"), - (0x16FF2, "X"), - (0x17000, "V"), - (0x187F8, "X"), - (0x18800, "V"), - (0x18CD6, "X"), - (0x18CFF, "V"), - (0x18D09, "X"), - ] - - -def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1AFF0, "V"), - (0x1AFF4, "X"), - (0x1AFF5, "V"), - (0x1AFFC, "X"), - (0x1AFFD, "V"), - (0x1AFFF, "X"), - (0x1B000, "V"), - (0x1B123, "X"), - (0x1B132, "V"), - (0x1B133, "X"), - (0x1B150, "V"), - (0x1B153, "X"), - (0x1B155, "V"), - (0x1B156, "X"), - (0x1B164, "V"), - (0x1B168, "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"), - (0x1CC00, "V"), - (0x1CCD6, "M", "a"), - (0x1CCD7, "M", "b"), - (0x1CCD8, "M", "c"), - (0x1CCD9, "M", "d"), - (0x1CCDA, "M", "e"), - (0x1CCDB, "M", "f"), - (0x1CCDC, "M", "g"), - (0x1CCDD, "M", "h"), - (0x1CCDE, "M", "i"), - (0x1CCDF, "M", "j"), - (0x1CCE0, "M", "k"), - (0x1CCE1, "M", "l"), - (0x1CCE2, "M", "m"), - (0x1CCE3, "M", "n"), - (0x1CCE4, "M", "o"), - (0x1CCE5, "M", "p"), - (0x1CCE6, "M", "q"), - (0x1CCE7, "M", "r"), - (0x1CCE8, "M", "s"), - (0x1CCE9, "M", "t"), - (0x1CCEA, "M", "u"), - (0x1CCEB, "M", "v"), - (0x1CCEC, "M", "w"), - (0x1CCED, "M", "x"), - (0x1CCEE, "M", "y"), - (0x1CCEF, "M", "z"), - (0x1CCF0, "M", "0"), - (0x1CCF1, "M", "1"), - (0x1CCF2, "M", "2"), - (0x1CCF3, "M", "3"), - (0x1CCF4, "M", "4"), - (0x1CCF5, "M", "5"), - (0x1CCF6, "M", "6"), - (0x1CCF7, "M", "7"), - (0x1CCF8, "M", "8"), - (0x1CCF9, "M", "9"), - (0x1CCFA, "X"), - (0x1CD00, "V"), - (0x1CEB4, "X"), - (0x1CF00, "V"), - (0x1CF2E, "X"), - (0x1CF30, "V"), - (0x1CF47, "X"), - (0x1CF50, "V"), - (0x1CFC4, "X"), - (0x1D000, "V"), - (0x1D0F6, "X"), - (0x1D100, "V"), - (0x1D127, "X"), - (0x1D129, "V"), - (0x1D15E, "M", "𝅗𝅥"), - (0x1D15F, "M", "𝅘𝅥"), - (0x1D160, "M", "𝅘𝅥𝅮"), - (0x1D161, "M", "𝅘𝅥𝅯"), - (0x1D162, "M", "𝅘𝅥𝅰"), - (0x1D163, "M", "𝅘𝅥𝅱"), - (0x1D164, "M", "𝅘𝅥𝅲"), - (0x1D165, "V"), - (0x1D173, "I"), - (0x1D17B, "V"), - (0x1D1BB, "M", "𝆹𝅥"), - (0x1D1BC, "M", "𝆺𝅥"), - (0x1D1BD, "M", "𝆹𝅥𝅮"), - (0x1D1BE, "M", "𝆺𝅥𝅮"), - (0x1D1BF, "M", "𝆹𝅥𝅯"), - (0x1D1C0, "M", "𝆺𝅥𝅯"), - (0x1D1C1, "V"), - (0x1D1EB, "X"), - (0x1D200, "V"), - (0x1D246, "X"), - ] - - -def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D2C0, "V"), - (0x1D2D4, "X"), - (0x1D2E0, "V"), - (0x1D2F4, "X"), - (0x1D300, "V"), - (0x1D357, "X"), - (0x1D360, "V"), - (0x1D379, "X"), - (0x1D400, "M", "a"), - (0x1D401, "M", "b"), - (0x1D402, "M", "c"), - (0x1D403, "M", "d"), - (0x1D404, "M", "e"), - (0x1D405, "M", "f"), - (0x1D406, "M", "g"), - (0x1D407, "M", "h"), - (0x1D408, "M", "i"), - (0x1D409, "M", "j"), - (0x1D40A, "M", "k"), - (0x1D40B, "M", "l"), - (0x1D40C, "M", "m"), - (0x1D40D, "M", "n"), - (0x1D40E, "M", "o"), - (0x1D40F, "M", "p"), - (0x1D410, "M", "q"), - (0x1D411, "M", "r"), - (0x1D412, "M", "s"), - (0x1D413, "M", "t"), - (0x1D414, "M", "u"), - (0x1D415, "M", "v"), - (0x1D416, "M", "w"), - (0x1D417, "M", "x"), - (0x1D418, "M", "y"), - (0x1D419, "M", "z"), - (0x1D41A, "M", "a"), - (0x1D41B, "M", "b"), - (0x1D41C, "M", "c"), - (0x1D41D, "M", "d"), - (0x1D41E, "M", "e"), - (0x1D41F, "M", "f"), - (0x1D420, "M", "g"), - (0x1D421, "M", "h"), - (0x1D422, "M", "i"), - (0x1D423, "M", "j"), - (0x1D424, "M", "k"), - (0x1D425, "M", "l"), - (0x1D426, "M", "m"), - (0x1D427, "M", "n"), - (0x1D428, "M", "o"), - (0x1D429, "M", "p"), - (0x1D42A, "M", "q"), - (0x1D42B, "M", "r"), - (0x1D42C, "M", "s"), - (0x1D42D, "M", "t"), - (0x1D42E, "M", "u"), - (0x1D42F, "M", "v"), - (0x1D430, "M", "w"), - (0x1D431, "M", "x"), - (0x1D432, "M", "y"), - (0x1D433, "M", "z"), - (0x1D434, "M", "a"), - (0x1D435, "M", "b"), - (0x1D436, "M", "c"), - (0x1D437, "M", "d"), - (0x1D438, "M", "e"), - (0x1D439, "M", "f"), - (0x1D43A, "M", "g"), - (0x1D43B, "M", "h"), - (0x1D43C, "M", "i"), - (0x1D43D, "M", "j"), - (0x1D43E, "M", "k"), - (0x1D43F, "M", "l"), - (0x1D440, "M", "m"), - (0x1D441, "M", "n"), - (0x1D442, "M", "o"), - (0x1D443, "M", "p"), - (0x1D444, "M", "q"), - (0x1D445, "M", "r"), - (0x1D446, "M", "s"), - (0x1D447, "M", "t"), - (0x1D448, "M", "u"), - (0x1D449, "M", "v"), - (0x1D44A, "M", "w"), - (0x1D44B, "M", "x"), - (0x1D44C, "M", "y"), - (0x1D44D, "M", "z"), - (0x1D44E, "M", "a"), - (0x1D44F, "M", "b"), - (0x1D450, "M", "c"), - (0x1D451, "M", "d"), - (0x1D452, "M", "e"), - (0x1D453, "M", "f"), - (0x1D454, "M", "g"), - (0x1D455, "X"), - (0x1D456, "M", "i"), - (0x1D457, "M", "j"), - (0x1D458, "M", "k"), - (0x1D459, "M", "l"), - (0x1D45A, "M", "m"), - (0x1D45B, "M", "n"), - ] - - -def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D45C, "M", "o"), - (0x1D45D, "M", "p"), - (0x1D45E, "M", "q"), - (0x1D45F, "M", "r"), - (0x1D460, "M", "s"), - (0x1D461, "M", "t"), - (0x1D462, "M", "u"), - (0x1D463, "M", "v"), - (0x1D464, "M", "w"), - (0x1D465, "M", "x"), - (0x1D466, "M", "y"), - (0x1D467, "M", "z"), - (0x1D468, "M", "a"), - (0x1D469, "M", "b"), - (0x1D46A, "M", "c"), - (0x1D46B, "M", "d"), - (0x1D46C, "M", "e"), - (0x1D46D, "M", "f"), - (0x1D46E, "M", "g"), - (0x1D46F, "M", "h"), - (0x1D470, "M", "i"), - (0x1D471, "M", "j"), - (0x1D472, "M", "k"), - (0x1D473, "M", "l"), - (0x1D474, "M", "m"), - (0x1D475, "M", "n"), - (0x1D476, "M", "o"), - (0x1D477, "M", "p"), - (0x1D478, "M", "q"), - (0x1D479, "M", "r"), - (0x1D47A, "M", "s"), - (0x1D47B, "M", "t"), - (0x1D47C, "M", "u"), - (0x1D47D, "M", "v"), - (0x1D47E, "M", "w"), - (0x1D47F, "M", "x"), - (0x1D480, "M", "y"), - (0x1D481, "M", "z"), - (0x1D482, "M", "a"), - (0x1D483, "M", "b"), - (0x1D484, "M", "c"), - (0x1D485, "M", "d"), - (0x1D486, "M", "e"), - (0x1D487, "M", "f"), - (0x1D488, "M", "g"), - (0x1D489, "M", "h"), - (0x1D48A, "M", "i"), - (0x1D48B, "M", "j"), - (0x1D48C, "M", "k"), - (0x1D48D, "M", "l"), - (0x1D48E, "M", "m"), - (0x1D48F, "M", "n"), - (0x1D490, "M", "o"), - (0x1D491, "M", "p"), - (0x1D492, "M", "q"), - (0x1D493, "M", "r"), - (0x1D494, "M", "s"), - (0x1D495, "M", "t"), - (0x1D496, "M", "u"), - (0x1D497, "M", "v"), - (0x1D498, "M", "w"), - (0x1D499, "M", "x"), - (0x1D49A, "M", "y"), - (0x1D49B, "M", "z"), - (0x1D49C, "M", "a"), - (0x1D49D, "X"), - (0x1D49E, "M", "c"), - (0x1D49F, "M", "d"), - (0x1D4A0, "X"), - (0x1D4A2, "M", "g"), - (0x1D4A3, "X"), - (0x1D4A5, "M", "j"), - (0x1D4A6, "M", "k"), - (0x1D4A7, "X"), - (0x1D4A9, "M", "n"), - (0x1D4AA, "M", "o"), - (0x1D4AB, "M", "p"), - (0x1D4AC, "M", "q"), - (0x1D4AD, "X"), - (0x1D4AE, "M", "s"), - (0x1D4AF, "M", "t"), - (0x1D4B0, "M", "u"), - (0x1D4B1, "M", "v"), - (0x1D4B2, "M", "w"), - (0x1D4B3, "M", "x"), - (0x1D4B4, "M", "y"), - (0x1D4B5, "M", "z"), - (0x1D4B6, "M", "a"), - (0x1D4B7, "M", "b"), - (0x1D4B8, "M", "c"), - (0x1D4B9, "M", "d"), - (0x1D4BA, "X"), - (0x1D4BB, "M", "f"), - (0x1D4BC, "X"), - (0x1D4BD, "M", "h"), - (0x1D4BE, "M", "i"), - (0x1D4BF, "M", "j"), - (0x1D4C0, "M", "k"), - (0x1D4C1, "M", "l"), - (0x1D4C2, "M", "m"), - ] - - -def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D4C3, "M", "n"), - (0x1D4C4, "X"), - (0x1D4C5, "M", "p"), - (0x1D4C6, "M", "q"), - (0x1D4C7, "M", "r"), - (0x1D4C8, "M", "s"), - (0x1D4C9, "M", "t"), - (0x1D4CA, "M", "u"), - (0x1D4CB, "M", "v"), - (0x1D4CC, "M", "w"), - (0x1D4CD, "M", "x"), - (0x1D4CE, "M", "y"), - (0x1D4CF, "M", "z"), - (0x1D4D0, "M", "a"), - (0x1D4D1, "M", "b"), - (0x1D4D2, "M", "c"), - (0x1D4D3, "M", "d"), - (0x1D4D4, "M", "e"), - (0x1D4D5, "M", "f"), - (0x1D4D6, "M", "g"), - (0x1D4D7, "M", "h"), - (0x1D4D8, "M", "i"), - (0x1D4D9, "M", "j"), - (0x1D4DA, "M", "k"), - (0x1D4DB, "M", "l"), - (0x1D4DC, "M", "m"), - (0x1D4DD, "M", "n"), - (0x1D4DE, "M", "o"), - (0x1D4DF, "M", "p"), - (0x1D4E0, "M", "q"), - (0x1D4E1, "M", "r"), - (0x1D4E2, "M", "s"), - (0x1D4E3, "M", "t"), - (0x1D4E4, "M", "u"), - (0x1D4E5, "M", "v"), - (0x1D4E6, "M", "w"), - (0x1D4E7, "M", "x"), - (0x1D4E8, "M", "y"), - (0x1D4E9, "M", "z"), - (0x1D4EA, "M", "a"), - (0x1D4EB, "M", "b"), - (0x1D4EC, "M", "c"), - (0x1D4ED, "M", "d"), - (0x1D4EE, "M", "e"), - (0x1D4EF, "M", "f"), - (0x1D4F0, "M", "g"), - (0x1D4F1, "M", "h"), - (0x1D4F2, "M", "i"), - (0x1D4F3, "M", "j"), - (0x1D4F4, "M", "k"), - (0x1D4F5, "M", "l"), - (0x1D4F6, "M", "m"), - (0x1D4F7, "M", "n"), - (0x1D4F8, "M", "o"), - (0x1D4F9, "M", "p"), - (0x1D4FA, "M", "q"), - (0x1D4FB, "M", "r"), - (0x1D4FC, "M", "s"), - (0x1D4FD, "M", "t"), - (0x1D4FE, "M", "u"), - (0x1D4FF, "M", "v"), - (0x1D500, "M", "w"), - (0x1D501, "M", "x"), - (0x1D502, "M", "y"), - (0x1D503, "M", "z"), - (0x1D504, "M", "a"), - (0x1D505, "M", "b"), - (0x1D506, "X"), - (0x1D507, "M", "d"), - (0x1D508, "M", "e"), - (0x1D509, "M", "f"), - (0x1D50A, "M", "g"), - (0x1D50B, "X"), - (0x1D50D, "M", "j"), - (0x1D50E, "M", "k"), - (0x1D50F, "M", "l"), - (0x1D510, "M", "m"), - (0x1D511, "M", "n"), - (0x1D512, "M", "o"), - (0x1D513, "M", "p"), - (0x1D514, "M", "q"), - (0x1D515, "X"), - (0x1D516, "M", "s"), - (0x1D517, "M", "t"), - (0x1D518, "M", "u"), - (0x1D519, "M", "v"), - (0x1D51A, "M", "w"), - (0x1D51B, "M", "x"), - (0x1D51C, "M", "y"), - (0x1D51D, "X"), - (0x1D51E, "M", "a"), - (0x1D51F, "M", "b"), - (0x1D520, "M", "c"), - (0x1D521, "M", "d"), - (0x1D522, "M", "e"), - (0x1D523, "M", "f"), - (0x1D524, "M", "g"), - (0x1D525, "M", "h"), - (0x1D526, "M", "i"), - (0x1D527, "M", "j"), - ] - - -def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D528, "M", "k"), - (0x1D529, "M", "l"), - (0x1D52A, "M", "m"), - (0x1D52B, "M", "n"), - (0x1D52C, "M", "o"), - (0x1D52D, "M", "p"), - (0x1D52E, "M", "q"), - (0x1D52F, "M", "r"), - (0x1D530, "M", "s"), - (0x1D531, "M", "t"), - (0x1D532, "M", "u"), - (0x1D533, "M", "v"), - (0x1D534, "M", "w"), - (0x1D535, "M", "x"), - (0x1D536, "M", "y"), - (0x1D537, "M", "z"), - (0x1D538, "M", "a"), - (0x1D539, "M", "b"), - (0x1D53A, "X"), - (0x1D53B, "M", "d"), - (0x1D53C, "M", "e"), - (0x1D53D, "M", "f"), - (0x1D53E, "M", "g"), - (0x1D53F, "X"), - (0x1D540, "M", "i"), - (0x1D541, "M", "j"), - (0x1D542, "M", "k"), - (0x1D543, "M", "l"), - (0x1D544, "M", "m"), - (0x1D545, "X"), - (0x1D546, "M", "o"), - (0x1D547, "X"), - (0x1D54A, "M", "s"), - (0x1D54B, "M", "t"), - (0x1D54C, "M", "u"), - (0x1D54D, "M", "v"), - (0x1D54E, "M", "w"), - (0x1D54F, "M", "x"), - (0x1D550, "M", "y"), - (0x1D551, "X"), - (0x1D552, "M", "a"), - (0x1D553, "M", "b"), - (0x1D554, "M", "c"), - (0x1D555, "M", "d"), - (0x1D556, "M", "e"), - (0x1D557, "M", "f"), - (0x1D558, "M", "g"), - (0x1D559, "M", "h"), - (0x1D55A, "M", "i"), - (0x1D55B, "M", "j"), - (0x1D55C, "M", "k"), - (0x1D55D, "M", "l"), - (0x1D55E, "M", "m"), - (0x1D55F, "M", "n"), - (0x1D560, "M", "o"), - (0x1D561, "M", "p"), - (0x1D562, "M", "q"), - (0x1D563, "M", "r"), - (0x1D564, "M", "s"), - (0x1D565, "M", "t"), - (0x1D566, "M", "u"), - (0x1D567, "M", "v"), - (0x1D568, "M", "w"), - (0x1D569, "M", "x"), - (0x1D56A, "M", "y"), - (0x1D56B, "M", "z"), - (0x1D56C, "M", "a"), - (0x1D56D, "M", "b"), - (0x1D56E, "M", "c"), - (0x1D56F, "M", "d"), - (0x1D570, "M", "e"), - (0x1D571, "M", "f"), - (0x1D572, "M", "g"), - (0x1D573, "M", "h"), - (0x1D574, "M", "i"), - (0x1D575, "M", "j"), - (0x1D576, "M", "k"), - (0x1D577, "M", "l"), - (0x1D578, "M", "m"), - (0x1D579, "M", "n"), - (0x1D57A, "M", "o"), - (0x1D57B, "M", "p"), - (0x1D57C, "M", "q"), - (0x1D57D, "M", "r"), - (0x1D57E, "M", "s"), - (0x1D57F, "M", "t"), - (0x1D580, "M", "u"), - (0x1D581, "M", "v"), - (0x1D582, "M", "w"), - (0x1D583, "M", "x"), - (0x1D584, "M", "y"), - (0x1D585, "M", "z"), - (0x1D586, "M", "a"), - (0x1D587, "M", "b"), - (0x1D588, "M", "c"), - (0x1D589, "M", "d"), - (0x1D58A, "M", "e"), - (0x1D58B, "M", "f"), - (0x1D58C, "M", "g"), - (0x1D58D, "M", "h"), - ] - - -def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D58E, "M", "i"), - (0x1D58F, "M", "j"), - (0x1D590, "M", "k"), - (0x1D591, "M", "l"), - (0x1D592, "M", "m"), - (0x1D593, "M", "n"), - (0x1D594, "M", "o"), - (0x1D595, "M", "p"), - (0x1D596, "M", "q"), - (0x1D597, "M", "r"), - (0x1D598, "M", "s"), - (0x1D599, "M", "t"), - (0x1D59A, "M", "u"), - (0x1D59B, "M", "v"), - (0x1D59C, "M", "w"), - (0x1D59D, "M", "x"), - (0x1D59E, "M", "y"), - (0x1D59F, "M", "z"), - (0x1D5A0, "M", "a"), - (0x1D5A1, "M", "b"), - (0x1D5A2, "M", "c"), - (0x1D5A3, "M", "d"), - (0x1D5A4, "M", "e"), - (0x1D5A5, "M", "f"), - (0x1D5A6, "M", "g"), - (0x1D5A7, "M", "h"), - (0x1D5A8, "M", "i"), - (0x1D5A9, "M", "j"), - (0x1D5AA, "M", "k"), - (0x1D5AB, "M", "l"), - (0x1D5AC, "M", "m"), - (0x1D5AD, "M", "n"), - (0x1D5AE, "M", "o"), - (0x1D5AF, "M", "p"), - (0x1D5B0, "M", "q"), - (0x1D5B1, "M", "r"), - (0x1D5B2, "M", "s"), - (0x1D5B3, "M", "t"), - (0x1D5B4, "M", "u"), - (0x1D5B5, "M", "v"), - (0x1D5B6, "M", "w"), - (0x1D5B7, "M", "x"), - (0x1D5B8, "M", "y"), - (0x1D5B9, "M", "z"), - (0x1D5BA, "M", "a"), - (0x1D5BB, "M", "b"), - (0x1D5BC, "M", "c"), - (0x1D5BD, "M", "d"), - (0x1D5BE, "M", "e"), - (0x1D5BF, "M", "f"), - (0x1D5C0, "M", "g"), - (0x1D5C1, "M", "h"), - (0x1D5C2, "M", "i"), - (0x1D5C3, "M", "j"), - (0x1D5C4, "M", "k"), - (0x1D5C5, "M", "l"), - (0x1D5C6, "M", "m"), - (0x1D5C7, "M", "n"), - (0x1D5C8, "M", "o"), - (0x1D5C9, "M", "p"), - (0x1D5CA, "M", "q"), - (0x1D5CB, "M", "r"), - (0x1D5CC, "M", "s"), - (0x1D5CD, "M", "t"), - (0x1D5CE, "M", "u"), - (0x1D5CF, "M", "v"), - (0x1D5D0, "M", "w"), - (0x1D5D1, "M", "x"), - (0x1D5D2, "M", "y"), - (0x1D5D3, "M", "z"), - (0x1D5D4, "M", "a"), - (0x1D5D5, "M", "b"), - (0x1D5D6, "M", "c"), - (0x1D5D7, "M", "d"), - (0x1D5D8, "M", "e"), - (0x1D5D9, "M", "f"), - (0x1D5DA, "M", "g"), - (0x1D5DB, "M", "h"), - (0x1D5DC, "M", "i"), - (0x1D5DD, "M", "j"), - (0x1D5DE, "M", "k"), - (0x1D5DF, "M", "l"), - (0x1D5E0, "M", "m"), - (0x1D5E1, "M", "n"), - (0x1D5E2, "M", "o"), - (0x1D5E3, "M", "p"), - (0x1D5E4, "M", "q"), - (0x1D5E5, "M", "r"), - (0x1D5E6, "M", "s"), - (0x1D5E7, "M", "t"), - (0x1D5E8, "M", "u"), - (0x1D5E9, "M", "v"), - (0x1D5EA, "M", "w"), - (0x1D5EB, "M", "x"), - (0x1D5EC, "M", "y"), - (0x1D5ED, "M", "z"), - (0x1D5EE, "M", "a"), - (0x1D5EF, "M", "b"), - (0x1D5F0, "M", "c"), - (0x1D5F1, "M", "d"), - ] - - -def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D5F2, "M", "e"), - (0x1D5F3, "M", "f"), - (0x1D5F4, "M", "g"), - (0x1D5F5, "M", "h"), - (0x1D5F6, "M", "i"), - (0x1D5F7, "M", "j"), - (0x1D5F8, "M", "k"), - (0x1D5F9, "M", "l"), - (0x1D5FA, "M", "m"), - (0x1D5FB, "M", "n"), - (0x1D5FC, "M", "o"), - (0x1D5FD, "M", "p"), - (0x1D5FE, "M", "q"), - (0x1D5FF, "M", "r"), - (0x1D600, "M", "s"), - (0x1D601, "M", "t"), - (0x1D602, "M", "u"), - (0x1D603, "M", "v"), - (0x1D604, "M", "w"), - (0x1D605, "M", "x"), - (0x1D606, "M", "y"), - (0x1D607, "M", "z"), - (0x1D608, "M", "a"), - (0x1D609, "M", "b"), - (0x1D60A, "M", "c"), - (0x1D60B, "M", "d"), - (0x1D60C, "M", "e"), - (0x1D60D, "M", "f"), - (0x1D60E, "M", "g"), - (0x1D60F, "M", "h"), - (0x1D610, "M", "i"), - (0x1D611, "M", "j"), - (0x1D612, "M", "k"), - (0x1D613, "M", "l"), - (0x1D614, "M", "m"), - (0x1D615, "M", "n"), - (0x1D616, "M", "o"), - (0x1D617, "M", "p"), - (0x1D618, "M", "q"), - (0x1D619, "M", "r"), - (0x1D61A, "M", "s"), - (0x1D61B, "M", "t"), - (0x1D61C, "M", "u"), - (0x1D61D, "M", "v"), - (0x1D61E, "M", "w"), - (0x1D61F, "M", "x"), - (0x1D620, "M", "y"), - (0x1D621, "M", "z"), - (0x1D622, "M", "a"), - (0x1D623, "M", "b"), - (0x1D624, "M", "c"), - (0x1D625, "M", "d"), - (0x1D626, "M", "e"), - (0x1D627, "M", "f"), - (0x1D628, "M", "g"), - (0x1D629, "M", "h"), - (0x1D62A, "M", "i"), - (0x1D62B, "M", "j"), - (0x1D62C, "M", "k"), - (0x1D62D, "M", "l"), - (0x1D62E, "M", "m"), - (0x1D62F, "M", "n"), - (0x1D630, "M", "o"), - (0x1D631, "M", "p"), - (0x1D632, "M", "q"), - (0x1D633, "M", "r"), - (0x1D634, "M", "s"), - (0x1D635, "M", "t"), - (0x1D636, "M", "u"), - (0x1D637, "M", "v"), - (0x1D638, "M", "w"), - (0x1D639, "M", "x"), - (0x1D63A, "M", "y"), - (0x1D63B, "M", "z"), - (0x1D63C, "M", "a"), - (0x1D63D, "M", "b"), - (0x1D63E, "M", "c"), - (0x1D63F, "M", "d"), - (0x1D640, "M", "e"), - (0x1D641, "M", "f"), - (0x1D642, "M", "g"), - (0x1D643, "M", "h"), - (0x1D644, "M", "i"), - (0x1D645, "M", "j"), - (0x1D646, "M", "k"), - (0x1D647, "M", "l"), - (0x1D648, "M", "m"), - (0x1D649, "M", "n"), - (0x1D64A, "M", "o"), - (0x1D64B, "M", "p"), - (0x1D64C, "M", "q"), - (0x1D64D, "M", "r"), - (0x1D64E, "M", "s"), - (0x1D64F, "M", "t"), - (0x1D650, "M", "u"), - (0x1D651, "M", "v"), - (0x1D652, "M", "w"), - (0x1D653, "M", "x"), - (0x1D654, "M", "y"), - (0x1D655, "M", "z"), - ] - - -def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D656, "M", "a"), - (0x1D657, "M", "b"), - (0x1D658, "M", "c"), - (0x1D659, "M", "d"), - (0x1D65A, "M", "e"), - (0x1D65B, "M", "f"), - (0x1D65C, "M", "g"), - (0x1D65D, "M", "h"), - (0x1D65E, "M", "i"), - (0x1D65F, "M", "j"), - (0x1D660, "M", "k"), - (0x1D661, "M", "l"), - (0x1D662, "M", "m"), - (0x1D663, "M", "n"), - (0x1D664, "M", "o"), - (0x1D665, "M", "p"), - (0x1D666, "M", "q"), - (0x1D667, "M", "r"), - (0x1D668, "M", "s"), - (0x1D669, "M", "t"), - (0x1D66A, "M", "u"), - (0x1D66B, "M", "v"), - (0x1D66C, "M", "w"), - (0x1D66D, "M", "x"), - (0x1D66E, "M", "y"), - (0x1D66F, "M", "z"), - (0x1D670, "M", "a"), - (0x1D671, "M", "b"), - (0x1D672, "M", "c"), - (0x1D673, "M", "d"), - (0x1D674, "M", "e"), - (0x1D675, "M", "f"), - (0x1D676, "M", "g"), - (0x1D677, "M", "h"), - (0x1D678, "M", "i"), - (0x1D679, "M", "j"), - (0x1D67A, "M", "k"), - (0x1D67B, "M", "l"), - (0x1D67C, "M", "m"), - (0x1D67D, "M", "n"), - (0x1D67E, "M", "o"), - (0x1D67F, "M", "p"), - (0x1D680, "M", "q"), - (0x1D681, "M", "r"), - (0x1D682, "M", "s"), - (0x1D683, "M", "t"), - (0x1D684, "M", "u"), - (0x1D685, "M", "v"), - (0x1D686, "M", "w"), - (0x1D687, "M", "x"), - (0x1D688, "M", "y"), - (0x1D689, "M", "z"), - (0x1D68A, "M", "a"), - (0x1D68B, "M", "b"), - (0x1D68C, "M", "c"), - (0x1D68D, "M", "d"), - (0x1D68E, "M", "e"), - (0x1D68F, "M", "f"), - (0x1D690, "M", "g"), - (0x1D691, "M", "h"), - (0x1D692, "M", "i"), - (0x1D693, "M", "j"), - (0x1D694, "M", "k"), - (0x1D695, "M", "l"), - (0x1D696, "M", "m"), - (0x1D697, "M", "n"), - (0x1D698, "M", "o"), - (0x1D699, "M", "p"), - (0x1D69A, "M", "q"), - (0x1D69B, "M", "r"), - (0x1D69C, "M", "s"), - (0x1D69D, "M", "t"), - (0x1D69E, "M", "u"), - (0x1D69F, "M", "v"), - (0x1D6A0, "M", "w"), - (0x1D6A1, "M", "x"), - (0x1D6A2, "M", "y"), - (0x1D6A3, "M", "z"), - (0x1D6A4, "M", "ı"), - (0x1D6A5, "M", "ȷ"), - (0x1D6A6, "X"), - (0x1D6A8, "M", "α"), - (0x1D6A9, "M", "β"), - (0x1D6AA, "M", "γ"), - (0x1D6AB, "M", "δ"), - (0x1D6AC, "M", "ε"), - (0x1D6AD, "M", "ζ"), - (0x1D6AE, "M", "η"), - (0x1D6AF, "M", "θ"), - (0x1D6B0, "M", "ι"), - (0x1D6B1, "M", "κ"), - (0x1D6B2, "M", "λ"), - (0x1D6B3, "M", "μ"), - (0x1D6B4, "M", "ν"), - (0x1D6B5, "M", "ξ"), - (0x1D6B6, "M", "ο"), - (0x1D6B7, "M", "π"), - (0x1D6B8, "M", "ρ"), - (0x1D6B9, "M", "θ"), - (0x1D6BA, "M", "σ"), - ] - - -def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D6BB, "M", "τ"), - (0x1D6BC, "M", "υ"), - (0x1D6BD, "M", "φ"), - (0x1D6BE, "M", "χ"), - (0x1D6BF, "M", "ψ"), - (0x1D6C0, "M", "ω"), - (0x1D6C1, "M", "∇"), - (0x1D6C2, "M", "α"), - (0x1D6C3, "M", "β"), - (0x1D6C4, "M", "γ"), - (0x1D6C5, "M", "δ"), - (0x1D6C6, "M", "ε"), - (0x1D6C7, "M", "ζ"), - (0x1D6C8, "M", "η"), - (0x1D6C9, "M", "θ"), - (0x1D6CA, "M", "ι"), - (0x1D6CB, "M", "κ"), - (0x1D6CC, "M", "λ"), - (0x1D6CD, "M", "μ"), - (0x1D6CE, "M", "ν"), - (0x1D6CF, "M", "ξ"), - (0x1D6D0, "M", "ο"), - (0x1D6D1, "M", "π"), - (0x1D6D2, "M", "ρ"), - (0x1D6D3, "M", "σ"), - (0x1D6D5, "M", "τ"), - (0x1D6D6, "M", "υ"), - (0x1D6D7, "M", "φ"), - (0x1D6D8, "M", "χ"), - (0x1D6D9, "M", "ψ"), - (0x1D6DA, "M", "ω"), - (0x1D6DB, "M", "∂"), - (0x1D6DC, "M", "ε"), - (0x1D6DD, "M", "θ"), - (0x1D6DE, "M", "κ"), - (0x1D6DF, "M", "φ"), - (0x1D6E0, "M", "ρ"), - (0x1D6E1, "M", "π"), - (0x1D6E2, "M", "α"), - (0x1D6E3, "M", "β"), - (0x1D6E4, "M", "γ"), - (0x1D6E5, "M", "δ"), - (0x1D6E6, "M", "ε"), - (0x1D6E7, "M", "ζ"), - (0x1D6E8, "M", "η"), - (0x1D6E9, "M", "θ"), - (0x1D6EA, "M", "ι"), - (0x1D6EB, "M", "κ"), - (0x1D6EC, "M", "λ"), - (0x1D6ED, "M", "μ"), - (0x1D6EE, "M", "ν"), - (0x1D6EF, "M", "ξ"), - (0x1D6F0, "M", "ο"), - (0x1D6F1, "M", "π"), - (0x1D6F2, "M", "ρ"), - (0x1D6F3, "M", "θ"), - (0x1D6F4, "M", "σ"), - (0x1D6F5, "M", "τ"), - (0x1D6F6, "M", "υ"), - (0x1D6F7, "M", "φ"), - (0x1D6F8, "M", "χ"), - (0x1D6F9, "M", "ψ"), - (0x1D6FA, "M", "ω"), - (0x1D6FB, "M", "∇"), - (0x1D6FC, "M", "α"), - (0x1D6FD, "M", "β"), - (0x1D6FE, "M", "γ"), - (0x1D6FF, "M", "δ"), - (0x1D700, "M", "ε"), - (0x1D701, "M", "ζ"), - (0x1D702, "M", "η"), - (0x1D703, "M", "θ"), - (0x1D704, "M", "ι"), - (0x1D705, "M", "κ"), - (0x1D706, "M", "λ"), - (0x1D707, "M", "μ"), - (0x1D708, "M", "ν"), - (0x1D709, "M", "ξ"), - (0x1D70A, "M", "ο"), - (0x1D70B, "M", "π"), - (0x1D70C, "M", "ρ"), - (0x1D70D, "M", "σ"), - (0x1D70F, "M", "τ"), - (0x1D710, "M", "υ"), - (0x1D711, "M", "φ"), - (0x1D712, "M", "χ"), - (0x1D713, "M", "ψ"), - (0x1D714, "M", "ω"), - (0x1D715, "M", "∂"), - (0x1D716, "M", "ε"), - (0x1D717, "M", "θ"), - (0x1D718, "M", "κ"), - (0x1D719, "M", "φ"), - (0x1D71A, "M", "ρ"), - (0x1D71B, "M", "π"), - (0x1D71C, "M", "α"), - (0x1D71D, "M", "β"), - (0x1D71E, "M", "γ"), - (0x1D71F, "M", "δ"), - (0x1D720, "M", "ε"), - ] - - -def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D721, "M", "ζ"), - (0x1D722, "M", "η"), - (0x1D723, "M", "θ"), - (0x1D724, "M", "ι"), - (0x1D725, "M", "κ"), - (0x1D726, "M", "λ"), - (0x1D727, "M", "μ"), - (0x1D728, "M", "ν"), - (0x1D729, "M", "ξ"), - (0x1D72A, "M", "ο"), - (0x1D72B, "M", "π"), - (0x1D72C, "M", "ρ"), - (0x1D72D, "M", "θ"), - (0x1D72E, "M", "σ"), - (0x1D72F, "M", "τ"), - (0x1D730, "M", "υ"), - (0x1D731, "M", "φ"), - (0x1D732, "M", "χ"), - (0x1D733, "M", "ψ"), - (0x1D734, "M", "ω"), - (0x1D735, "M", "∇"), - (0x1D736, "M", "α"), - (0x1D737, "M", "β"), - (0x1D738, "M", "γ"), - (0x1D739, "M", "δ"), - (0x1D73A, "M", "ε"), - (0x1D73B, "M", "ζ"), - (0x1D73C, "M", "η"), - (0x1D73D, "M", "θ"), - (0x1D73E, "M", "ι"), - (0x1D73F, "M", "κ"), - (0x1D740, "M", "λ"), - (0x1D741, "M", "μ"), - (0x1D742, "M", "ν"), - (0x1D743, "M", "ξ"), - (0x1D744, "M", "ο"), - (0x1D745, "M", "π"), - (0x1D746, "M", "ρ"), - (0x1D747, "M", "σ"), - (0x1D749, "M", "τ"), - (0x1D74A, "M", "υ"), - (0x1D74B, "M", "φ"), - (0x1D74C, "M", "χ"), - (0x1D74D, "M", "ψ"), - (0x1D74E, "M", "ω"), - (0x1D74F, "M", "∂"), - (0x1D750, "M", "ε"), - (0x1D751, "M", "θ"), - (0x1D752, "M", "κ"), - (0x1D753, "M", "φ"), - (0x1D754, "M", "ρ"), - (0x1D755, "M", "π"), - (0x1D756, "M", "α"), - (0x1D757, "M", "β"), - (0x1D758, "M", "γ"), - (0x1D759, "M", "δ"), - (0x1D75A, "M", "ε"), - (0x1D75B, "M", "ζ"), - (0x1D75C, "M", "η"), - (0x1D75D, "M", "θ"), - (0x1D75E, "M", "ι"), - (0x1D75F, "M", "κ"), - (0x1D760, "M", "λ"), - (0x1D761, "M", "μ"), - (0x1D762, "M", "ν"), - (0x1D763, "M", "ξ"), - (0x1D764, "M", "ο"), - (0x1D765, "M", "π"), - (0x1D766, "M", "ρ"), - (0x1D767, "M", "θ"), - (0x1D768, "M", "σ"), - (0x1D769, "M", "τ"), - (0x1D76A, "M", "υ"), - (0x1D76B, "M", "φ"), - (0x1D76C, "M", "χ"), - (0x1D76D, "M", "ψ"), - (0x1D76E, "M", "ω"), - (0x1D76F, "M", "∇"), - (0x1D770, "M", "α"), - (0x1D771, "M", "β"), - (0x1D772, "M", "γ"), - (0x1D773, "M", "δ"), - (0x1D774, "M", "ε"), - (0x1D775, "M", "ζ"), - (0x1D776, "M", "η"), - (0x1D777, "M", "θ"), - (0x1D778, "M", "ι"), - (0x1D779, "M", "κ"), - (0x1D77A, "M", "λ"), - (0x1D77B, "M", "μ"), - (0x1D77C, "M", "ν"), - (0x1D77D, "M", "ξ"), - (0x1D77E, "M", "ο"), - (0x1D77F, "M", "π"), - (0x1D780, "M", "ρ"), - (0x1D781, "M", "σ"), - (0x1D783, "M", "τ"), - (0x1D784, "M", "υ"), - (0x1D785, "M", "φ"), - (0x1D786, "M", "χ"), - ] - - -def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D787, "M", "ψ"), - (0x1D788, "M", "ω"), - (0x1D789, "M", "∂"), - (0x1D78A, "M", "ε"), - (0x1D78B, "M", "θ"), - (0x1D78C, "M", "κ"), - (0x1D78D, "M", "φ"), - (0x1D78E, "M", "ρ"), - (0x1D78F, "M", "π"), - (0x1D790, "M", "α"), - (0x1D791, "M", "β"), - (0x1D792, "M", "γ"), - (0x1D793, "M", "δ"), - (0x1D794, "M", "ε"), - (0x1D795, "M", "ζ"), - (0x1D796, "M", "η"), - (0x1D797, "M", "θ"), - (0x1D798, "M", "ι"), - (0x1D799, "M", "κ"), - (0x1D79A, "M", "λ"), - (0x1D79B, "M", "μ"), - (0x1D79C, "M", "ν"), - (0x1D79D, "M", "ξ"), - (0x1D79E, "M", "ο"), - (0x1D79F, "M", "π"), - (0x1D7A0, "M", "ρ"), - (0x1D7A1, "M", "θ"), - (0x1D7A2, "M", "σ"), - (0x1D7A3, "M", "τ"), - (0x1D7A4, "M", "υ"), - (0x1D7A5, "M", "φ"), - (0x1D7A6, "M", "χ"), - (0x1D7A7, "M", "ψ"), - (0x1D7A8, "M", "ω"), - (0x1D7A9, "M", "∇"), - (0x1D7AA, "M", "α"), - (0x1D7AB, "M", "β"), - (0x1D7AC, "M", "γ"), - (0x1D7AD, "M", "δ"), - (0x1D7AE, "M", "ε"), - (0x1D7AF, "M", "ζ"), - (0x1D7B0, "M", "η"), - (0x1D7B1, "M", "θ"), - (0x1D7B2, "M", "ι"), - (0x1D7B3, "M", "κ"), - (0x1D7B4, "M", "λ"), - (0x1D7B5, "M", "μ"), - (0x1D7B6, "M", "ν"), - (0x1D7B7, "M", "ξ"), - (0x1D7B8, "M", "ο"), - (0x1D7B9, "M", "π"), - (0x1D7BA, "M", "ρ"), - (0x1D7BB, "M", "σ"), - (0x1D7BD, "M", "τ"), - (0x1D7BE, "M", "υ"), - (0x1D7BF, "M", "φ"), - (0x1D7C0, "M", "χ"), - (0x1D7C1, "M", "ψ"), - (0x1D7C2, "M", "ω"), - (0x1D7C3, "M", "∂"), - (0x1D7C4, "M", "ε"), - (0x1D7C5, "M", "θ"), - (0x1D7C6, "M", "κ"), - (0x1D7C7, "M", "φ"), - (0x1D7C8, "M", "ρ"), - (0x1D7C9, "M", "π"), - (0x1D7CA, "M", "ϝ"), - (0x1D7CC, "X"), - (0x1D7CE, "M", "0"), - (0x1D7CF, "M", "1"), - (0x1D7D0, "M", "2"), - (0x1D7D1, "M", "3"), - (0x1D7D2, "M", "4"), - (0x1D7D3, "M", "5"), - (0x1D7D4, "M", "6"), - (0x1D7D5, "M", "7"), - (0x1D7D6, "M", "8"), - (0x1D7D7, "M", "9"), - (0x1D7D8, "M", "0"), - (0x1D7D9, "M", "1"), - (0x1D7DA, "M", "2"), - (0x1D7DB, "M", "3"), - (0x1D7DC, "M", "4"), - (0x1D7DD, "M", "5"), - (0x1D7DE, "M", "6"), - (0x1D7DF, "M", "7"), - (0x1D7E0, "M", "8"), - (0x1D7E1, "M", "9"), - (0x1D7E2, "M", "0"), - (0x1D7E3, "M", "1"), - (0x1D7E4, "M", "2"), - (0x1D7E5, "M", "3"), - (0x1D7E6, "M", "4"), - (0x1D7E7, "M", "5"), - (0x1D7E8, "M", "6"), - (0x1D7E9, "M", "7"), - (0x1D7EA, "M", "8"), - (0x1D7EB, "M", "9"), - (0x1D7EC, "M", "0"), - (0x1D7ED, "M", "1"), - ] - - -def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D7EE, "M", "2"), - (0x1D7EF, "M", "3"), - (0x1D7F0, "M", "4"), - (0x1D7F1, "M", "5"), - (0x1D7F2, "M", "6"), - (0x1D7F3, "M", "7"), - (0x1D7F4, "M", "8"), - (0x1D7F5, "M", "9"), - (0x1D7F6, "M", "0"), - (0x1D7F7, "M", "1"), - (0x1D7F8, "M", "2"), - (0x1D7F9, "M", "3"), - (0x1D7FA, "M", "4"), - (0x1D7FB, "M", "5"), - (0x1D7FC, "M", "6"), - (0x1D7FD, "M", "7"), - (0x1D7FE, "M", "8"), - (0x1D7FF, "M", "9"), - (0x1D800, "V"), - (0x1DA8C, "X"), - (0x1DA9B, "V"), - (0x1DAA0, "X"), - (0x1DAA1, "V"), - (0x1DAB0, "X"), - (0x1DF00, "V"), - (0x1DF1F, "X"), - (0x1DF25, "V"), - (0x1DF2B, "X"), - (0x1E000, "V"), - (0x1E007, "X"), - (0x1E008, "V"), - (0x1E019, "X"), - (0x1E01B, "V"), - (0x1E022, "X"), - (0x1E023, "V"), - (0x1E025, "X"), - (0x1E026, "V"), - (0x1E02B, "X"), - (0x1E030, "M", "а"), - (0x1E031, "M", "б"), - (0x1E032, "M", "в"), - (0x1E033, "M", "г"), - (0x1E034, "M", "д"), - (0x1E035, "M", "е"), - (0x1E036, "M", "ж"), - (0x1E037, "M", "з"), - (0x1E038, "M", "и"), - (0x1E039, "M", "к"), - (0x1E03A, "M", "л"), - (0x1E03B, "M", "м"), - (0x1E03C, "M", "о"), - (0x1E03D, "M", "п"), - (0x1E03E, "M", "р"), - (0x1E03F, "M", "с"), - (0x1E040, "M", "т"), - (0x1E041, "M", "у"), - (0x1E042, "M", "ф"), - (0x1E043, "M", "х"), - (0x1E044, "M", "ц"), - (0x1E045, "M", "ч"), - (0x1E046, "M", "ш"), - (0x1E047, "M", "ы"), - (0x1E048, "M", "э"), - (0x1E049, "M", "ю"), - (0x1E04A, "M", "ꚉ"), - (0x1E04B, "M", "ә"), - (0x1E04C, "M", "і"), - (0x1E04D, "M", "ј"), - (0x1E04E, "M", "ө"), - (0x1E04F, "M", "ү"), - (0x1E050, "M", "ӏ"), - (0x1E051, "M", "а"), - (0x1E052, "M", "б"), - (0x1E053, "M", "в"), - (0x1E054, "M", "г"), - (0x1E055, "M", "д"), - (0x1E056, "M", "е"), - (0x1E057, "M", "ж"), - (0x1E058, "M", "з"), - (0x1E059, "M", "и"), - (0x1E05A, "M", "к"), - (0x1E05B, "M", "л"), - (0x1E05C, "M", "о"), - (0x1E05D, "M", "п"), - (0x1E05E, "M", "с"), - (0x1E05F, "M", "у"), - (0x1E060, "M", "ф"), - (0x1E061, "M", "х"), - (0x1E062, "M", "ц"), - (0x1E063, "M", "ч"), - (0x1E064, "M", "ш"), - (0x1E065, "M", "ъ"), - (0x1E066, "M", "ы"), - (0x1E067, "M", "ґ"), - (0x1E068, "M", "і"), - (0x1E069, "M", "ѕ"), - (0x1E06A, "M", "џ"), - (0x1E06B, "M", "ҫ"), - (0x1E06C, "M", "ꙑ"), - (0x1E06D, "M", "ұ"), - ] - - -def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1E06E, "X"), - (0x1E08F, "V"), - (0x1E090, "X"), - (0x1E100, "V"), - (0x1E12D, "X"), - (0x1E130, "V"), - (0x1E13E, "X"), - (0x1E140, "V"), - (0x1E14A, "X"), - (0x1E14E, "V"), - (0x1E150, "X"), - (0x1E290, "V"), - (0x1E2AF, "X"), - (0x1E2C0, "V"), - (0x1E2FA, "X"), - (0x1E2FF, "V"), - (0x1E300, "X"), - (0x1E4D0, "V"), - (0x1E4FA, "X"), - (0x1E5D0, "V"), - (0x1E5FB, "X"), - (0x1E5FF, "V"), - (0x1E600, "X"), - (0x1E7E0, "V"), - (0x1E7E7, "X"), - (0x1E7E8, "V"), - (0x1E7EC, "X"), - (0x1E7ED, "V"), - (0x1E7EF, "X"), - (0x1E7F0, "V"), - (0x1E7FF, "X"), - (0x1E800, "V"), - (0x1E8C5, "X"), - (0x1E8C7, "V"), - (0x1E8D7, "X"), - (0x1E900, "M", "𞤢"), - (0x1E901, "M", "𞤣"), - (0x1E902, "M", "𞤤"), - (0x1E903, "M", "𞤥"), - (0x1E904, "M", "𞤦"), - (0x1E905, "M", "𞤧"), - (0x1E906, "M", "𞤨"), - (0x1E907, "M", "𞤩"), - (0x1E908, "M", "𞤪"), - (0x1E909, "M", "𞤫"), - (0x1E90A, "M", "𞤬"), - (0x1E90B, "M", "𞤭"), - (0x1E90C, "M", "𞤮"), - (0x1E90D, "M", "𞤯"), - (0x1E90E, "M", "𞤰"), - (0x1E90F, "M", "𞤱"), - (0x1E910, "M", "𞤲"), - (0x1E911, "M", "𞤳"), - (0x1E912, "M", "𞤴"), - (0x1E913, "M", "𞤵"), - (0x1E914, "M", "𞤶"), - (0x1E915, "M", "𞤷"), - (0x1E916, "M", "𞤸"), - (0x1E917, "M", "𞤹"), - (0x1E918, "M", "𞤺"), - (0x1E919, "M", "𞤻"), - (0x1E91A, "M", "𞤼"), - (0x1E91B, "M", "𞤽"), - (0x1E91C, "M", "𞤾"), - (0x1E91D, "M", "𞤿"), - (0x1E91E, "M", "𞥀"), - (0x1E91F, "M", "𞥁"), - (0x1E920, "M", "𞥂"), - (0x1E921, "M", "𞥃"), - (0x1E922, "V"), - (0x1E94C, "X"), - (0x1E950, "V"), - (0x1E95A, "X"), - (0x1E95E, "V"), - (0x1E960, "X"), - (0x1EC71, "V"), - (0x1ECB5, "X"), - (0x1ED01, "V"), - (0x1ED3E, "X"), - (0x1EE00, "M", "ا"), - (0x1EE01, "M", "ب"), - (0x1EE02, "M", "ج"), - (0x1EE03, "M", "د"), - (0x1EE04, "X"), - (0x1EE05, "M", "و"), - (0x1EE06, "M", "ز"), - (0x1EE07, "M", "ح"), - (0x1EE08, "M", "ط"), - (0x1EE09, "M", "ي"), - (0x1EE0A, "M", "ك"), - (0x1EE0B, "M", "ل"), - (0x1EE0C, "M", "م"), - (0x1EE0D, "M", "ن"), - (0x1EE0E, "M", "س"), - (0x1EE0F, "M", "ع"), - (0x1EE10, "M", "ف"), - (0x1EE11, "M", "ص"), - (0x1EE12, "M", "ق"), - (0x1EE13, "M", "ر"), - (0x1EE14, "M", "ش"), - ] - - -def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1EE15, "M", "ت"), - (0x1EE16, "M", "ث"), - (0x1EE17, "M", "خ"), - (0x1EE18, "M", "ذ"), - (0x1EE19, "M", "ض"), - (0x1EE1A, "M", "ظ"), - (0x1EE1B, "M", "غ"), - (0x1EE1C, "M", "ٮ"), - (0x1EE1D, "M", "ں"), - (0x1EE1E, "M", "ڡ"), - (0x1EE1F, "M", "ٯ"), - (0x1EE20, "X"), - (0x1EE21, "M", "ب"), - (0x1EE22, "M", "ج"), - (0x1EE23, "X"), - (0x1EE24, "M", "ه"), - (0x1EE25, "X"), - (0x1EE27, "M", "ح"), - (0x1EE28, "X"), - (0x1EE29, "M", "ي"), - (0x1EE2A, "M", "ك"), - (0x1EE2B, "M", "ل"), - (0x1EE2C, "M", "م"), - (0x1EE2D, "M", "ن"), - (0x1EE2E, "M", "س"), - (0x1EE2F, "M", "ع"), - (0x1EE30, "M", "ف"), - (0x1EE31, "M", "ص"), - (0x1EE32, "M", "ق"), - (0x1EE33, "X"), - (0x1EE34, "M", "ش"), - (0x1EE35, "M", "ت"), - (0x1EE36, "M", "ث"), - (0x1EE37, "M", "خ"), - (0x1EE38, "X"), - (0x1EE39, "M", "ض"), - (0x1EE3A, "X"), - (0x1EE3B, "M", "غ"), - (0x1EE3C, "X"), - (0x1EE42, "M", "ج"), - (0x1EE43, "X"), - (0x1EE47, "M", "ح"), - (0x1EE48, "X"), - (0x1EE49, "M", "ي"), - (0x1EE4A, "X"), - (0x1EE4B, "M", "ل"), - (0x1EE4C, "X"), - (0x1EE4D, "M", "ن"), - (0x1EE4E, "M", "س"), - (0x1EE4F, "M", "ع"), - (0x1EE50, "X"), - (0x1EE51, "M", "ص"), - (0x1EE52, "M", "ق"), - (0x1EE53, "X"), - (0x1EE54, "M", "ش"), - (0x1EE55, "X"), - (0x1EE57, "M", "خ"), - (0x1EE58, "X"), - (0x1EE59, "M", "ض"), - (0x1EE5A, "X"), - (0x1EE5B, "M", "غ"), - (0x1EE5C, "X"), - (0x1EE5D, "M", "ں"), - (0x1EE5E, "X"), - (0x1EE5F, "M", "ٯ"), - (0x1EE60, "X"), - (0x1EE61, "M", "ب"), - (0x1EE62, "M", "ج"), - (0x1EE63, "X"), - (0x1EE64, "M", "ه"), - (0x1EE65, "X"), - (0x1EE67, "M", "ح"), - (0x1EE68, "M", "ط"), - (0x1EE69, "M", "ي"), - (0x1EE6A, "M", "ك"), - (0x1EE6B, "X"), - (0x1EE6C, "M", "م"), - (0x1EE6D, "M", "ن"), - (0x1EE6E, "M", "س"), - (0x1EE6F, "M", "ع"), - (0x1EE70, "M", "ف"), - (0x1EE71, "M", "ص"), - (0x1EE72, "M", "ق"), - (0x1EE73, "X"), - (0x1EE74, "M", "ش"), - (0x1EE75, "M", "ت"), - (0x1EE76, "M", "ث"), - (0x1EE77, "M", "خ"), - (0x1EE78, "X"), - (0x1EE79, "M", "ض"), - (0x1EE7A, "M", "ظ"), - (0x1EE7B, "M", "غ"), - (0x1EE7C, "M", "ٮ"), - (0x1EE7D, "X"), - (0x1EE7E, "M", "ڡ"), - (0x1EE7F, "X"), - (0x1EE80, "M", "ا"), - (0x1EE81, "M", "ب"), - (0x1EE82, "M", "ج"), - (0x1EE83, "M", "د"), - ] - - -def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1EE84, "M", "ه"), - (0x1EE85, "M", "و"), - (0x1EE86, "M", "ز"), - (0x1EE87, "M", "ح"), - (0x1EE88, "M", "ط"), - (0x1EE89, "M", "ي"), - (0x1EE8A, "X"), - (0x1EE8B, "M", "ل"), - (0x1EE8C, "M", "م"), - (0x1EE8D, "M", "ن"), - (0x1EE8E, "M", "س"), - (0x1EE8F, "M", "ع"), - (0x1EE90, "M", "ف"), - (0x1EE91, "M", "ص"), - (0x1EE92, "M", "ق"), - (0x1EE93, "M", "ر"), - (0x1EE94, "M", "ش"), - (0x1EE95, "M", "ت"), - (0x1EE96, "M", "ث"), - (0x1EE97, "M", "خ"), - (0x1EE98, "M", "ذ"), - (0x1EE99, "M", "ض"), - (0x1EE9A, "M", "ظ"), - (0x1EE9B, "M", "غ"), - (0x1EE9C, "X"), - (0x1EEA1, "M", "ب"), - (0x1EEA2, "M", "ج"), - (0x1EEA3, "M", "د"), - (0x1EEA4, "X"), - (0x1EEA5, "M", "و"), - (0x1EEA6, "M", "ز"), - (0x1EEA7, "M", "ح"), - (0x1EEA8, "M", "ط"), - (0x1EEA9, "M", "ي"), - (0x1EEAA, "X"), - (0x1EEAB, "M", "ل"), - (0x1EEAC, "M", "م"), - (0x1EEAD, "M", "ن"), - (0x1EEAE, "M", "س"), - (0x1EEAF, "M", "ع"), - (0x1EEB0, "M", "ف"), - (0x1EEB1, "M", "ص"), - (0x1EEB2, "M", "ق"), - (0x1EEB3, "M", "ر"), - (0x1EEB4, "M", "ش"), - (0x1EEB5, "M", "ت"), - (0x1EEB6, "M", "ث"), - (0x1EEB7, "M", "خ"), - (0x1EEB8, "M", "ذ"), - (0x1EEB9, "M", "ض"), - (0x1EEBA, "M", "ظ"), - (0x1EEBB, "M", "غ"), - (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, "M", "0,"), - (0x1F102, "M", "1,"), - (0x1F103, "M", "2,"), - (0x1F104, "M", "3,"), - (0x1F105, "M", "4,"), - (0x1F106, "M", "5,"), - (0x1F107, "M", "6,"), - (0x1F108, "M", "7,"), - (0x1F109, "M", "8,"), - (0x1F10A, "M", "9,"), - (0x1F10B, "V"), - (0x1F110, "M", "(a)"), - (0x1F111, "M", "(b)"), - (0x1F112, "M", "(c)"), - (0x1F113, "M", "(d)"), - (0x1F114, "M", "(e)"), - (0x1F115, "M", "(f)"), - (0x1F116, "M", "(g)"), - (0x1F117, "M", "(h)"), - (0x1F118, "M", "(i)"), - (0x1F119, "M", "(j)"), - (0x1F11A, "M", "(k)"), - (0x1F11B, "M", "(l)"), - (0x1F11C, "M", "(m)"), - (0x1F11D, "M", "(n)"), - (0x1F11E, "M", "(o)"), - (0x1F11F, "M", "(p)"), - (0x1F120, "M", "(q)"), - (0x1F121, "M", "(r)"), - (0x1F122, "M", "(s)"), - (0x1F123, "M", "(t)"), - (0x1F124, "M", "(u)"), - (0x1F125, "M", "(v)"), - ] - - -def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1F126, "M", "(w)"), - (0x1F127, "M", "(x)"), - (0x1F128, "M", "(y)"), - (0x1F129, "M", "(z)"), - (0x1F12A, "M", "〔s〕"), - (0x1F12B, "M", "c"), - (0x1F12C, "M", "r"), - (0x1F12D, "M", "cd"), - (0x1F12E, "M", "wz"), - (0x1F12F, "V"), - (0x1F130, "M", "a"), - (0x1F131, "M", "b"), - (0x1F132, "M", "c"), - (0x1F133, "M", "d"), - (0x1F134, "M", "e"), - (0x1F135, "M", "f"), - (0x1F136, "M", "g"), - (0x1F137, "M", "h"), - (0x1F138, "M", "i"), - (0x1F139, "M", "j"), - (0x1F13A, "M", "k"), - (0x1F13B, "M", "l"), - (0x1F13C, "M", "m"), - (0x1F13D, "M", "n"), - (0x1F13E, "M", "o"), - (0x1F13F, "M", "p"), - (0x1F140, "M", "q"), - (0x1F141, "M", "r"), - (0x1F142, "M", "s"), - (0x1F143, "M", "t"), - (0x1F144, "M", "u"), - (0x1F145, "M", "v"), - (0x1F146, "M", "w"), - (0x1F147, "M", "x"), - (0x1F148, "M", "y"), - (0x1F149, "M", "z"), - (0x1F14A, "M", "hv"), - (0x1F14B, "M", "mv"), - (0x1F14C, "M", "sd"), - (0x1F14D, "M", "ss"), - (0x1F14E, "M", "ppv"), - (0x1F14F, "M", "wc"), - (0x1F150, "V"), - (0x1F16A, "M", "mc"), - (0x1F16B, "M", "md"), - (0x1F16C, "M", "mr"), - (0x1F16D, "V"), - (0x1F190, "M", "dj"), - (0x1F191, "V"), - (0x1F1AE, "X"), - (0x1F1E6, "V"), - (0x1F200, "M", "ほか"), - (0x1F201, "M", "ココ"), - (0x1F202, "M", "サ"), - (0x1F203, "X"), - (0x1F210, "M", "手"), - (0x1F211, "M", "字"), - (0x1F212, "M", "双"), - (0x1F213, "M", "デ"), - (0x1F214, "M", "二"), - (0x1F215, "M", "多"), - (0x1F216, "M", "解"), - (0x1F217, "M", "天"), - (0x1F218, "M", "交"), - (0x1F219, "M", "映"), - (0x1F21A, "M", "無"), - (0x1F21B, "M", "料"), - (0x1F21C, "M", "前"), - (0x1F21D, "M", "後"), - (0x1F21E, "M", "再"), - (0x1F21F, "M", "新"), - (0x1F220, "M", "初"), - (0x1F221, "M", "終"), - (0x1F222, "M", "生"), - (0x1F223, "M", "販"), - (0x1F224, "M", "声"), - (0x1F225, "M", "吹"), - (0x1F226, "M", "演"), - (0x1F227, "M", "投"), - (0x1F228, "M", "捕"), - (0x1F229, "M", "一"), - (0x1F22A, "M", "三"), - (0x1F22B, "M", "遊"), - (0x1F22C, "M", "左"), - (0x1F22D, "M", "中"), - (0x1F22E, "M", "右"), - (0x1F22F, "M", "指"), - (0x1F230, "M", "走"), - (0x1F231, "M", "打"), - (0x1F232, "M", "禁"), - (0x1F233, "M", "空"), - (0x1F234, "M", "合"), - (0x1F235, "M", "満"), - (0x1F236, "M", "有"), - (0x1F237, "M", "月"), - (0x1F238, "M", "申"), - (0x1F239, "M", "割"), - (0x1F23A, "M", "営"), - (0x1F23B, "M", "配"), - (0x1F23C, "X"), - ] - - -def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1F240, "M", "〔本〕"), - (0x1F241, "M", "〔三〕"), - (0x1F242, "M", "〔二〕"), - (0x1F243, "M", "〔安〕"), - (0x1F244, "M", "〔点〕"), - (0x1F245, "M", "〔打〕"), - (0x1F246, "M", "〔盗〕"), - (0x1F247, "M", "〔勝〕"), - (0x1F248, "M", "〔敗〕"), - (0x1F249, "X"), - (0x1F250, "M", "得"), - (0x1F251, "M", "可"), - (0x1F252, "X"), - (0x1F260, "V"), - (0x1F266, "X"), - (0x1F300, "V"), - (0x1F6D8, "X"), - (0x1F6DC, "V"), - (0x1F6ED, "X"), - (0x1F6F0, "V"), - (0x1F6FD, "X"), - (0x1F700, "V"), - (0x1F777, "X"), - (0x1F77B, "V"), - (0x1F7DA, "X"), - (0x1F7E0, "V"), - (0x1F7EC, "X"), - (0x1F7F0, "V"), - (0x1F7F1, "X"), - (0x1F800, "V"), - (0x1F80C, "X"), - (0x1F810, "V"), - (0x1F848, "X"), - (0x1F850, "V"), - (0x1F85A, "X"), - (0x1F860, "V"), - (0x1F888, "X"), - (0x1F890, "V"), - (0x1F8AE, "X"), - (0x1F8B0, "V"), - (0x1F8BC, "X"), - (0x1F8C0, "V"), - (0x1F8C2, "X"), - (0x1F900, "V"), - (0x1FA54, "X"), - (0x1FA60, "V"), - (0x1FA6E, "X"), - (0x1FA70, "V"), - (0x1FA7D, "X"), - (0x1FA80, "V"), - (0x1FA8A, "X"), - (0x1FA8F, "V"), - (0x1FAC7, "X"), - (0x1FACE, "V"), - (0x1FADD, "X"), - (0x1FADF, "V"), - (0x1FAEA, "X"), - (0x1FAF0, "V"), - (0x1FAF9, "X"), - (0x1FB00, "V"), - (0x1FB93, "X"), - (0x1FB94, "V"), - (0x1FBF0, "M", "0"), - (0x1FBF1, "M", "1"), - (0x1FBF2, "M", "2"), - (0x1FBF3, "M", "3"), - (0x1FBF4, "M", "4"), - (0x1FBF5, "M", "5"), - (0x1FBF6, "M", "6"), - (0x1FBF7, "M", "7"), - (0x1FBF8, "M", "8"), - (0x1FBF9, "M", "9"), - (0x1FBFA, "X"), - (0x20000, "V"), - (0x2A6E0, "X"), - (0x2A700, "V"), - (0x2B73A, "X"), - (0x2B740, "V"), - (0x2B81E, "X"), - (0x2B820, "V"), - (0x2CEA2, "X"), - (0x2CEB0, "V"), - (0x2EBE1, "X"), - (0x2EBF0, "V"), - (0x2EE5E, "X"), - (0x2F800, "M", "丽"), - (0x2F801, "M", "丸"), - (0x2F802, "M", "乁"), - (0x2F803, "M", "𠄢"), - (0x2F804, "M", "你"), - (0x2F805, "M", "侮"), - (0x2F806, "M", "侻"), - (0x2F807, "M", "倂"), - (0x2F808, "M", "偺"), - (0x2F809, "M", "備"), - (0x2F80A, "M", "僧"), - (0x2F80B, "M", "像"), - (0x2F80C, "M", "㒞"), - (0x2F80D, "M", "𠘺"), - (0x2F80E, "M", "免"), - ] - - -def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F80F, "M", "兔"), - (0x2F810, "M", "兤"), - (0x2F811, "M", "具"), - (0x2F812, "M", "𠔜"), - (0x2F813, "M", "㒹"), - (0x2F814, "M", "內"), - (0x2F815, "M", "再"), - (0x2F816, "M", "𠕋"), - (0x2F817, "M", "冗"), - (0x2F818, "M", "冤"), - (0x2F819, "M", "仌"), - (0x2F81A, "M", "冬"), - (0x2F81B, "M", "况"), - (0x2F81C, "M", "𩇟"), - (0x2F81D, "M", "凵"), - (0x2F81E, "M", "刃"), - (0x2F81F, "M", "㓟"), - (0x2F820, "M", "刻"), - (0x2F821, "M", "剆"), - (0x2F822, "M", "割"), - (0x2F823, "M", "剷"), - (0x2F824, "M", "㔕"), - (0x2F825, "M", "勇"), - (0x2F826, "M", "勉"), - (0x2F827, "M", "勤"), - (0x2F828, "M", "勺"), - (0x2F829, "M", "包"), - (0x2F82A, "M", "匆"), - (0x2F82B, "M", "北"), - (0x2F82C, "M", "卉"), - (0x2F82D, "M", "卑"), - (0x2F82E, "M", "博"), - (0x2F82F, "M", "即"), - (0x2F830, "M", "卽"), - (0x2F831, "M", "卿"), - (0x2F834, "M", "𠨬"), - (0x2F835, "M", "灰"), - (0x2F836, "M", "及"), - (0x2F837, "M", "叟"), - (0x2F838, "M", "𠭣"), - (0x2F839, "M", "叫"), - (0x2F83A, "M", "叱"), - (0x2F83B, "M", "吆"), - (0x2F83C, "M", "咞"), - (0x2F83D, "M", "吸"), - (0x2F83E, "M", "呈"), - (0x2F83F, "M", "周"), - (0x2F840, "M", "咢"), - (0x2F841, "M", "哶"), - (0x2F842, "M", "唐"), - (0x2F843, "M", "啓"), - (0x2F844, "M", "啣"), - (0x2F845, "M", "善"), - (0x2F847, "M", "喙"), - (0x2F848, "M", "喫"), - (0x2F849, "M", "喳"), - (0x2F84A, "M", "嗂"), - (0x2F84B, "M", "圖"), - (0x2F84C, "M", "嘆"), - (0x2F84D, "M", "圗"), - (0x2F84E, "M", "噑"), - (0x2F84F, "M", "噴"), - (0x2F850, "M", "切"), - (0x2F851, "M", "壮"), - (0x2F852, "M", "城"), - (0x2F853, "M", "埴"), - (0x2F854, "M", "堍"), - (0x2F855, "M", "型"), - (0x2F856, "M", "堲"), - (0x2F857, "M", "報"), - (0x2F858, "M", "墬"), - (0x2F859, "M", "𡓤"), - (0x2F85A, "M", "売"), - (0x2F85B, "M", "壷"), - (0x2F85C, "M", "夆"), - (0x2F85D, "M", "多"), - (0x2F85E, "M", "夢"), - (0x2F85F, "M", "奢"), - (0x2F860, "M", "𡚨"), - (0x2F861, "M", "𡛪"), - (0x2F862, "M", "姬"), - (0x2F863, "M", "娛"), - (0x2F864, "M", "娧"), - (0x2F865, "M", "姘"), - (0x2F866, "M", "婦"), - (0x2F867, "M", "㛮"), - (0x2F868, "M", "㛼"), - (0x2F869, "M", "嬈"), - (0x2F86A, "M", "嬾"), - (0x2F86C, "M", "𡧈"), - (0x2F86D, "M", "寃"), - (0x2F86E, "M", "寘"), - (0x2F86F, "M", "寧"), - (0x2F870, "M", "寳"), - (0x2F871, "M", "𡬘"), - (0x2F872, "M", "寿"), - (0x2F873, "M", "将"), - (0x2F874, "M", "当"), - (0x2F875, "M", "尢"), - (0x2F876, "M", "㞁"), - ] - - -def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F877, "M", "屠"), - (0x2F878, "M", "屮"), - (0x2F879, "M", "峀"), - (0x2F87A, "M", "岍"), - (0x2F87B, "M", "𡷤"), - (0x2F87C, "M", "嵃"), - (0x2F87D, "M", "𡷦"), - (0x2F87E, "M", "嵮"), - (0x2F87F, "M", "嵫"), - (0x2F880, "M", "嵼"), - (0x2F881, "M", "巡"), - (0x2F882, "M", "巢"), - (0x2F883, "M", "㠯"), - (0x2F884, "M", "巽"), - (0x2F885, "M", "帨"), - (0x2F886, "M", "帽"), - (0x2F887, "M", "幩"), - (0x2F888, "M", "㡢"), - (0x2F889, "M", "𢆃"), - (0x2F88A, "M", "㡼"), - (0x2F88B, "M", "庰"), - (0x2F88C, "M", "庳"), - (0x2F88D, "M", "庶"), - (0x2F88E, "M", "廊"), - (0x2F88F, "M", "𪎒"), - (0x2F890, "M", "廾"), - (0x2F891, "M", "𢌱"), - (0x2F893, "M", "舁"), - (0x2F894, "M", "弢"), - (0x2F896, "M", "㣇"), - (0x2F897, "M", "𣊸"), - (0x2F898, "M", "𦇚"), - (0x2F899, "M", "形"), - (0x2F89A, "M", "彫"), - (0x2F89B, "M", "㣣"), - (0x2F89C, "M", "徚"), - (0x2F89D, "M", "忍"), - (0x2F89E, "M", "志"), - (0x2F89F, "M", "忹"), - (0x2F8A0, "M", "悁"), - (0x2F8A1, "M", "㤺"), - (0x2F8A2, "M", "㤜"), - (0x2F8A3, "M", "悔"), - (0x2F8A4, "M", "𢛔"), - (0x2F8A5, "M", "惇"), - (0x2F8A6, "M", "慈"), - (0x2F8A7, "M", "慌"), - (0x2F8A8, "M", "慎"), - (0x2F8A9, "M", "慌"), - (0x2F8AA, "M", "慺"), - (0x2F8AB, "M", "憎"), - (0x2F8AC, "M", "憲"), - (0x2F8AD, "M", "憤"), - (0x2F8AE, "M", "憯"), - (0x2F8AF, "M", "懞"), - (0x2F8B0, "M", "懲"), - (0x2F8B1, "M", "懶"), - (0x2F8B2, "M", "成"), - (0x2F8B3, "M", "戛"), - (0x2F8B4, "M", "扝"), - (0x2F8B5, "M", "抱"), - (0x2F8B6, "M", "拔"), - (0x2F8B7, "M", "捐"), - (0x2F8B8, "M", "𢬌"), - (0x2F8B9, "M", "挽"), - (0x2F8BA, "M", "拼"), - (0x2F8BB, "M", "捨"), - (0x2F8BC, "M", "掃"), - (0x2F8BD, "M", "揤"), - (0x2F8BE, "M", "𢯱"), - (0x2F8BF, "M", "搢"), - (0x2F8C0, "M", "揅"), - (0x2F8C1, "M", "掩"), - (0x2F8C2, "M", "㨮"), - (0x2F8C3, "M", "摩"), - (0x2F8C4, "M", "摾"), - (0x2F8C5, "M", "撝"), - (0x2F8C6, "M", "摷"), - (0x2F8C7, "M", "㩬"), - (0x2F8C8, "M", "敏"), - (0x2F8C9, "M", "敬"), - (0x2F8CA, "M", "𣀊"), - (0x2F8CB, "M", "旣"), - (0x2F8CC, "M", "書"), - (0x2F8CD, "M", "晉"), - (0x2F8CE, "M", "㬙"), - (0x2F8CF, "M", "暑"), - (0x2F8D0, "M", "㬈"), - (0x2F8D1, "M", "㫤"), - (0x2F8D2, "M", "冒"), - (0x2F8D3, "M", "冕"), - (0x2F8D4, "M", "最"), - (0x2F8D5, "M", "暜"), - (0x2F8D6, "M", "肭"), - (0x2F8D7, "M", "䏙"), - (0x2F8D8, "M", "朗"), - (0x2F8D9, "M", "望"), - (0x2F8DA, "M", "朡"), - (0x2F8DB, "M", "杞"), - (0x2F8DC, "M", "杓"), - ] - - -def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F8DD, "M", "𣏃"), - (0x2F8DE, "M", "㭉"), - (0x2F8DF, "M", "柺"), - (0x2F8E0, "M", "枅"), - (0x2F8E1, "M", "桒"), - (0x2F8E2, "M", "梅"), - (0x2F8E3, "M", "𣑭"), - (0x2F8E4, "M", "梎"), - (0x2F8E5, "M", "栟"), - (0x2F8E6, "M", "椔"), - (0x2F8E7, "M", "㮝"), - (0x2F8E8, "M", "楂"), - (0x2F8E9, "M", "榣"), - (0x2F8EA, "M", "槪"), - (0x2F8EB, "M", "檨"), - (0x2F8EC, "M", "𣚣"), - (0x2F8ED, "M", "櫛"), - (0x2F8EE, "M", "㰘"), - (0x2F8EF, "M", "次"), - (0x2F8F0, "M", "𣢧"), - (0x2F8F1, "M", "歔"), - (0x2F8F2, "M", "㱎"), - (0x2F8F3, "M", "歲"), - (0x2F8F4, "M", "殟"), - (0x2F8F5, "M", "殺"), - (0x2F8F6, "M", "殻"), - (0x2F8F7, "M", "𣪍"), - (0x2F8F8, "M", "𡴋"), - (0x2F8F9, "M", "𣫺"), - (0x2F8FA, "M", "汎"), - (0x2F8FB, "M", "𣲼"), - (0x2F8FC, "M", "沿"), - (0x2F8FD, "M", "泍"), - (0x2F8FE, "M", "汧"), - (0x2F8FF, "M", "洖"), - (0x2F900, "M", "派"), - (0x2F901, "M", "海"), - (0x2F902, "M", "流"), - (0x2F903, "M", "浩"), - (0x2F904, "M", "浸"), - (0x2F905, "M", "涅"), - (0x2F906, "M", "𣴞"), - (0x2F907, "M", "洴"), - (0x2F908, "M", "港"), - (0x2F909, "M", "湮"), - (0x2F90A, "M", "㴳"), - (0x2F90B, "M", "滋"), - (0x2F90C, "M", "滇"), - (0x2F90D, "M", "𣻑"), - (0x2F90E, "M", "淹"), - (0x2F90F, "M", "潮"), - (0x2F910, "M", "𣽞"), - (0x2F911, "M", "𣾎"), - (0x2F912, "M", "濆"), - (0x2F913, "M", "瀹"), - (0x2F914, "M", "瀞"), - (0x2F915, "M", "瀛"), - (0x2F916, "M", "㶖"), - (0x2F917, "M", "灊"), - (0x2F918, "M", "災"), - (0x2F919, "M", "灷"), - (0x2F91A, "M", "炭"), - (0x2F91B, "M", "𠔥"), - (0x2F91C, "M", "煅"), - (0x2F91D, "M", "𤉣"), - (0x2F91E, "M", "熜"), - (0x2F91F, "M", "𤎫"), - (0x2F920, "M", "爨"), - (0x2F921, "M", "爵"), - (0x2F922, "M", "牐"), - (0x2F923, "M", "𤘈"), - (0x2F924, "M", "犀"), - (0x2F925, "M", "犕"), - (0x2F926, "M", "𤜵"), - (0x2F927, "M", "𤠔"), - (0x2F928, "M", "獺"), - (0x2F929, "M", "王"), - (0x2F92A, "M", "㺬"), - (0x2F92B, "M", "玥"), - (0x2F92C, "M", "㺸"), - (0x2F92E, "M", "瑇"), - (0x2F92F, "M", "瑜"), - (0x2F930, "M", "瑱"), - (0x2F931, "M", "璅"), - (0x2F932, "M", "瓊"), - (0x2F933, "M", "㼛"), - (0x2F934, "M", "甤"), - (0x2F935, "M", "𤰶"), - (0x2F936, "M", "甾"), - (0x2F937, "M", "𤲒"), - (0x2F938, "M", "異"), - (0x2F939, "M", "𢆟"), - (0x2F93A, "M", "瘐"), - (0x2F93B, "M", "𤾡"), - (0x2F93C, "M", "𤾸"), - (0x2F93D, "M", "𥁄"), - (0x2F93E, "M", "㿼"), - (0x2F93F, "M", "䀈"), - (0x2F940, "M", "直"), - (0x2F941, "M", "𥃳"), - ] - - -def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F942, "M", "𥃲"), - (0x2F943, "M", "𥄙"), - (0x2F944, "M", "𥄳"), - (0x2F945, "M", "眞"), - (0x2F946, "M", "真"), - (0x2F948, "M", "睊"), - (0x2F949, "M", "䀹"), - (0x2F94A, "M", "瞋"), - (0x2F94B, "M", "䁆"), - (0x2F94C, "M", "䂖"), - (0x2F94D, "M", "𥐝"), - (0x2F94E, "M", "硎"), - (0x2F94F, "M", "碌"), - (0x2F950, "M", "磌"), - (0x2F951, "M", "䃣"), - (0x2F952, "M", "𥘦"), - (0x2F953, "M", "祖"), - (0x2F954, "M", "𥚚"), - (0x2F955, "M", "𥛅"), - (0x2F956, "M", "福"), - (0x2F957, "M", "秫"), - (0x2F958, "M", "䄯"), - (0x2F959, "M", "穀"), - (0x2F95A, "M", "穊"), - (0x2F95B, "M", "穏"), - (0x2F95C, "M", "𥥼"), - (0x2F95D, "M", "𥪧"), - (0x2F95F, "M", "竮"), - (0x2F960, "M", "䈂"), - (0x2F961, "M", "𥮫"), - (0x2F962, "M", "篆"), - (0x2F963, "M", "築"), - (0x2F964, "M", "䈧"), - (0x2F965, "M", "𥲀"), - (0x2F966, "M", "糒"), - (0x2F967, "M", "䊠"), - (0x2F968, "M", "糨"), - (0x2F969, "M", "糣"), - (0x2F96A, "M", "紀"), - (0x2F96B, "M", "𥾆"), - (0x2F96C, "M", "絣"), - (0x2F96D, "M", "䌁"), - (0x2F96E, "M", "緇"), - (0x2F96F, "M", "縂"), - (0x2F970, "M", "繅"), - (0x2F971, "M", "䌴"), - (0x2F972, "M", "𦈨"), - (0x2F973, "M", "𦉇"), - (0x2F974, "M", "䍙"), - (0x2F975, "M", "𦋙"), - (0x2F976, "M", "罺"), - (0x2F977, "M", "𦌾"), - (0x2F978, "M", "羕"), - (0x2F979, "M", "翺"), - (0x2F97A, "M", "者"), - (0x2F97B, "M", "𦓚"), - (0x2F97C, "M", "𦔣"), - (0x2F97D, "M", "聠"), - (0x2F97E, "M", "𦖨"), - (0x2F97F, "M", "聰"), - (0x2F980, "M", "𣍟"), - (0x2F981, "M", "䏕"), - (0x2F982, "M", "育"), - (0x2F983, "M", "脃"), - (0x2F984, "M", "䐋"), - (0x2F985, "M", "脾"), - (0x2F986, "M", "媵"), - (0x2F987, "M", "𦞧"), - (0x2F988, "M", "𦞵"), - (0x2F989, "M", "𣎓"), - (0x2F98A, "M", "𣎜"), - (0x2F98B, "M", "舁"), - (0x2F98C, "M", "舄"), - (0x2F98D, "M", "辞"), - (0x2F98E, "M", "䑫"), - (0x2F98F, "M", "芑"), - (0x2F990, "M", "芋"), - (0x2F991, "M", "芝"), - (0x2F992, "M", "劳"), - (0x2F993, "M", "花"), - (0x2F994, "M", "芳"), - (0x2F995, "M", "芽"), - (0x2F996, "M", "苦"), - (0x2F997, "M", "𦬼"), - (0x2F998, "M", "若"), - (0x2F999, "M", "茝"), - (0x2F99A, "M", "荣"), - (0x2F99B, "M", "莭"), - (0x2F99C, "M", "茣"), - (0x2F99D, "M", "莽"), - (0x2F99E, "M", "菧"), - (0x2F99F, "M", "著"), - (0x2F9A0, "M", "荓"), - (0x2F9A1, "M", "菊"), - (0x2F9A2, "M", "菌"), - (0x2F9A3, "M", "菜"), - (0x2F9A4, "M", "𦰶"), - (0x2F9A5, "M", "𦵫"), - (0x2F9A6, "M", "𦳕"), - (0x2F9A7, "M", "䔫"), - ] - - -def _seg_82() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F9A8, "M", "蓱"), - (0x2F9A9, "M", "蓳"), - (0x2F9AA, "M", "蔖"), - (0x2F9AB, "M", "𧏊"), - (0x2F9AC, "M", "蕤"), - (0x2F9AD, "M", "𦼬"), - (0x2F9AE, "M", "䕝"), - (0x2F9AF, "M", "䕡"), - (0x2F9B0, "M", "𦾱"), - (0x2F9B1, "M", "𧃒"), - (0x2F9B2, "M", "䕫"), - (0x2F9B3, "M", "虐"), - (0x2F9B4, "M", "虜"), - (0x2F9B5, "M", "虧"), - (0x2F9B6, "M", "虩"), - (0x2F9B7, "M", "蚩"), - (0x2F9B8, "M", "蚈"), - (0x2F9B9, "M", "蜎"), - (0x2F9BA, "M", "蛢"), - (0x2F9BB, "M", "蝹"), - (0x2F9BC, "M", "蜨"), - (0x2F9BD, "M", "蝫"), - (0x2F9BE, "M", "螆"), - (0x2F9BF, "M", "䗗"), - (0x2F9C0, "M", "蟡"), - (0x2F9C1, "M", "蠁"), - (0x2F9C2, "M", "䗹"), - (0x2F9C3, "M", "衠"), - (0x2F9C4, "M", "衣"), - (0x2F9C5, "M", "𧙧"), - (0x2F9C6, "M", "裗"), - (0x2F9C7, "M", "裞"), - (0x2F9C8, "M", "䘵"), - (0x2F9C9, "M", "裺"), - (0x2F9CA, "M", "㒻"), - (0x2F9CB, "M", "𧢮"), - (0x2F9CC, "M", "𧥦"), - (0x2F9CD, "M", "䚾"), - (0x2F9CE, "M", "䛇"), - (0x2F9CF, "M", "誠"), - (0x2F9D0, "M", "諭"), - (0x2F9D1, "M", "變"), - (0x2F9D2, "M", "豕"), - (0x2F9D3, "M", "𧲨"), - (0x2F9D4, "M", "貫"), - (0x2F9D5, "M", "賁"), - (0x2F9D6, "M", "贛"), - (0x2F9D7, "M", "起"), - (0x2F9D8, "M", "𧼯"), - (0x2F9D9, "M", "𠠄"), - (0x2F9DA, "M", "跋"), - (0x2F9DB, "M", "趼"), - (0x2F9DC, "M", "跰"), - (0x2F9DD, "M", "𠣞"), - (0x2F9DE, "M", "軔"), - (0x2F9DF, "M", "輸"), - (0x2F9E0, "M", "𨗒"), - (0x2F9E1, "M", "𨗭"), - (0x2F9E2, "M", "邔"), - (0x2F9E3, "M", "郱"), - (0x2F9E4, "M", "鄑"), - (0x2F9E5, "M", "𨜮"), - (0x2F9E6, "M", "鄛"), - (0x2F9E7, "M", "鈸"), - (0x2F9E8, "M", "鋗"), - (0x2F9E9, "M", "鋘"), - (0x2F9EA, "M", "鉼"), - (0x2F9EB, "M", "鏹"), - (0x2F9EC, "M", "鐕"), - (0x2F9ED, "M", "𨯺"), - (0x2F9EE, "M", "開"), - (0x2F9EF, "M", "䦕"), - (0x2F9F0, "M", "閷"), - (0x2F9F1, "M", "𨵷"), - (0x2F9F2, "M", "䧦"), - (0x2F9F3, "M", "雃"), - (0x2F9F4, "M", "嶲"), - (0x2F9F5, "M", "霣"), - (0x2F9F6, "M", "𩅅"), - (0x2F9F7, "M", "𩈚"), - (0x2F9F8, "M", "䩮"), - (0x2F9F9, "M", "䩶"), - (0x2F9FA, "M", "韠"), - (0x2F9FB, "M", "𩐊"), - (0x2F9FC, "M", "䪲"), - (0x2F9FD, "M", "𩒖"), - (0x2F9FE, "M", "頋"), - (0x2FA00, "M", "頩"), - (0x2FA01, "M", "𩖶"), - (0x2FA02, "M", "飢"), - (0x2FA03, "M", "䬳"), - (0x2FA04, "M", "餩"), - (0x2FA05, "M", "馧"), - (0x2FA06, "M", "駂"), - (0x2FA07, "M", "駾"), - (0x2FA08, "M", "䯎"), - (0x2FA09, "M", "𩬰"), - (0x2FA0A, "M", "鬒"), - (0x2FA0B, "M", "鱀"), - (0x2FA0C, "M", "鳽"), - ] - - -def _seg_83() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2FA0D, "M", "䳎"), - (0x2FA0E, "M", "䳭"), - (0x2FA0F, "M", "鵧"), - (0x2FA10, "M", "𪃎"), - (0x2FA11, "M", "䳸"), - (0x2FA12, "M", "𪄅"), - (0x2FA13, "M", "𪈎"), - (0x2FA14, "M", "𪊑"), - (0x2FA15, "M", "麻"), - (0x2FA16, "M", "䵖"), - (0x2FA17, "M", "黹"), - (0x2FA18, "M", "黾"), - (0x2FA19, "M", "鼅"), - (0x2FA1A, "M", "鼏"), - (0x2FA1B, "M", "鼖"), - (0x2FA1C, "M", "鼻"), - (0x2FA1D, "M", "𪘀"), - (0x2FA1E, "X"), - (0x30000, "V"), - (0x3134B, "X"), - (0x31350, "V"), - (0x323B0, "X"), - (0xE0100, "I"), - (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() - + _seg_79() - + _seg_80() - + _seg_81() - + _seg_82() - + _seg_83() -) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] diff --git a/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt b/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt deleted file mode 100644 index 7b190ca6..00000000 --- a/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2011 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. 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. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 -HOLDER 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. diff --git a/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA b/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA deleted file mode 100644 index ddf54648..00000000 --- a/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA +++ /dev/null @@ -1,60 +0,0 @@ -Metadata-Version: 2.1 -Name: itsdangerous -Version: 2.2.0 -Summary: Safely pass data to untrusted environments and back. -Maintainer-email: Pallets -Requires-Python: >=3.8 -Description-Content-Type: text/markdown -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Typing :: Typed -Project-URL: Changes, https://itsdangerous.palletsprojects.com/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://itsdangerous.palletsprojects.com/ -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Source, https://github.com/pallets/itsdangerous/ - -# ItsDangerous - -... so better sign this - -Various helpers to pass data to untrusted environments and to get it -back safe and sound. Data is cryptographically signed to ensure that a -token has not been tampered with. - -It's possible to customize how data is serialized. Data is compressed as -needed. A timestamp can be added and verified automatically while -loading a token. - - -## A Simple Example - -Here's how you could generate a token for transmitting a user's id and -name between web requests. - -```python -from itsdangerous import URLSafeSerializer -auth_s = URLSafeSerializer("secret key", "auth") -token = auth_s.dumps({"id": 5, "name": "itsdangerous"}) - -print(token) -# eyJpZCI6NSwibmFtZSI6Iml0c2Rhbmdlcm91cyJ9.6YP6T0BaO67XP--9UzTrmurXSmg - -data = auth_s.loads(token) -print(data["name"]) -# itsdangerous -``` - - -## Donate - -The Pallets organization develops and supports ItsDangerous and other -popular packages. In order to grow the community of contributors and -users, and allow the maintainers to devote more time to the projects, -[please donate today][]. - -[please donate today]: https://palletsprojects.com/donate - diff --git a/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD b/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD deleted file mode 100644 index 245f43e8..00000000 --- a/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD +++ /dev/null @@ -1,22 +0,0 @@ -itsdangerous-2.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -itsdangerous-2.2.0.dist-info/LICENSE.txt,sha256=Y68JiRtr6K0aQlLtQ68PTvun_JSOIoNnvtfzxa4LCdc,1475 -itsdangerous-2.2.0.dist-info/METADATA,sha256=0rk0-1ZwihuU5DnwJVwPWoEI4yWOyCexih3JyZHblhE,1924 -itsdangerous-2.2.0.dist-info/RECORD,, -itsdangerous-2.2.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -itsdangerous/__init__.py,sha256=4SK75sCe29xbRgQE1ZQtMHnKUuZYAf3bSpZOrff1IAY,1427 -itsdangerous/__pycache__/__init__.cpython-312.pyc,, -itsdangerous/__pycache__/_json.cpython-312.pyc,, -itsdangerous/__pycache__/encoding.cpython-312.pyc,, -itsdangerous/__pycache__/exc.cpython-312.pyc,, -itsdangerous/__pycache__/serializer.cpython-312.pyc,, -itsdangerous/__pycache__/signer.cpython-312.pyc,, -itsdangerous/__pycache__/timed.cpython-312.pyc,, -itsdangerous/__pycache__/url_safe.cpython-312.pyc,, -itsdangerous/_json.py,sha256=wPQGmge2yZ9328EHKF6gadGeyGYCJQKxtU-iLKE6UnA,473 -itsdangerous/encoding.py,sha256=wwTz5q_3zLcaAdunk6_vSoStwGqYWe307Zl_U87aRFM,1409 -itsdangerous/exc.py,sha256=Rr3exo0MRFEcPZltwecyK16VV1bE2K9_F1-d-ljcUn4,3201 -itsdangerous/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -itsdangerous/serializer.py,sha256=PmdwADLqkSyQLZ0jOKAgDsAW4k_H0TlA71Ei3z0C5aI,15601 -itsdangerous/signer.py,sha256=YO0CV7NBvHA6j549REHJFUjUojw2pHqwcUpQnU7yNYQ,9647 -itsdangerous/timed.py,sha256=6RvDMqNumGMxf0-HlpaZdN9PUQQmRvrQGplKhxuivUs,8083 -itsdangerous/url_safe.py,sha256=az4e5fXi_vs-YbWj8YZwn4wiVKfeD--GEKRT5Ueu4P4,2505 diff --git a/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL b/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL deleted file mode 100644 index 3b5e64b5..00000000 --- a/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.9.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.12/site-packages/itsdangerous/__init__.py b/venv/lib/python3.12/site-packages/itsdangerous/__init__.py deleted file mode 100644 index ea55256e..00000000 --- a/venv/lib/python3.12/site-packages/itsdangerous/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import annotations - -import typing as t - -from .encoding import base64_decode as base64_decode -from .encoding import base64_encode as base64_encode -from .encoding import want_bytes as want_bytes -from .exc import BadData as BadData -from .exc import BadHeader as BadHeader -from .exc import BadPayload as BadPayload -from .exc import BadSignature as BadSignature -from .exc import BadTimeSignature as BadTimeSignature -from .exc import SignatureExpired as SignatureExpired -from .serializer import Serializer as Serializer -from .signer import HMACAlgorithm as HMACAlgorithm -from .signer import NoneAlgorithm as NoneAlgorithm -from .signer import Signer as Signer -from .timed import TimedSerializer as TimedSerializer -from .timed import TimestampSigner as TimestampSigner -from .url_safe import URLSafeSerializer as URLSafeSerializer -from .url_safe import URLSafeTimedSerializer as URLSafeTimedSerializer - - -def __getattr__(name: str) -> t.Any: - if name == "__version__": - import importlib.metadata - import warnings - - warnings.warn( - "The '__version__' attribute is deprecated and will be removed in" - " ItsDangerous 2.3. Use feature detection or" - " 'importlib.metadata.version(\"itsdangerous\")' instead.", - DeprecationWarning, - stacklevel=2, - ) - return importlib.metadata.version("itsdangerous") - - raise AttributeError(name) diff --git a/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index bec82f176bc846ac7e5e7902412222560d455c03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1622 zcmZXU&u<$=6vt=%W4->dw&VORQM(C+bPu&5DM%F+QfLZ6f(YSOmG-ilcqY!K`@@pQ5C%Clq&}u77NQFZr4v~^mPrNs=Bd3g3v!C~!**9p_m_HdzIa7*jz|+pO;&Fc_n000qPXJ$XE&)%m$?r1GTfLM$eS}-L zwWLVHFp^YyQ5dfuX=kFjL1X^m4VUpl|v3OpPLgO+ZTe#<@vU)VHqplusx zJlby;N3Anv`r|=FO(MLjBZ_Fiy-qB&+qn=R4d_ zN~4qQTvGeLmz(B;}Ri_U{N02|Jx+LK^TS zf4+p6gMebpk!4x0?>DxhfH%BQ`mIJsMBA|47-27n_8L1p+-bmm8=aoqio)gk`%8`3 zll*!I_Cnh{ZjA1v;ksVvN!P7+dYG#=91=tWxq1gyo55w9(0xN*g@B%{L{+(^NRhnV*gTqR=N4a zxcPTs=F!Bn!sREK%O~KL*cq_^uOuByk?4ZM^$hp3vc3}b?75`ix|?0Ru@DY!KG9{b z1LvD)GBMQu01ScUEwGwJPPyWHErBI0^4Q@YSYY*v5_VXpkk|8DEy^h9vAVXRf>Wy4 zjiH>Cc!xy|g>e*&uJGL$?yHzUZ4x^?r(cP97x^l5uZ>$l#JWEJSS*8yS0ug--Emse xv_4sQMQZ<$8-0B0ee!mnEcS`rC)fMr1NFSuCrj$NI#h1;$)~4!S-YYZ`47SV!C3$R diff --git a/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/_json.cpython-312.pyc b/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/_json.cpython-312.pyc deleted file mode 100644 index d9dca56ccd311855f31686410190cac02d165678..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1176 zcmZ`&y-yTD6rb5I)&nFU8YxURpeBoWt6(%S#Kf4Wu{aA%Os?4sH^Z^V-R?Rw2OL~M zL1UvOlol2kdjAO>lT0wL=nYRRKrD#71pX+QBQB9Xlm#YqWU_b#Q*0luCMBAPB8Q@uPwZ!yQ!o;jbgbJYE6O%@Ym7UXm=FLYn<^`dwmb{op z6;_f$f#q7X>@Biz(W?ftUfhuLQ8<;qIq3-~^E#BdK*~&bffSU4Wd_`Ym!`_c4Q@m1 zm7zb|kWX`};fg^JYv}vH@axr=tDAQ|4vg*CV=Yjkzj&LV=vBNI0c@Zqu5_6z+w4$G zwUZI!|JmrLYk-mLOc(QGBL7M2Jv3!w()I9zps4}tinMXAqO z(2Lt3*3f}{_LDubYmaQ^x328jH$Hd2C$@5X_SDx-3#WDm+&5Q2?AR`cmZ5@c@G~lY zFYK1nbY>f{S&7A&tn;vK%KZJX;adD0nD7fq40q9aK#2}+u*bIVhor`QKgs!iwy}Ww zeE&tAR68#{zE7i)QVaEeD%BV)3QZRvrT7k|6=j^&NVyWKN8%cYb+m6xADDy38a6Mt zbYu-3DRg83I@WY^Jk|YFD2t=Kp)@FHt`2OVIIaeo7;4M2-dnN}2VptEGR?&=!TV_u nZF@SSa*vO~gW4%^5yX*>G5&@|57F=!H1x~r#pA~aMC$n)uK*I~ diff --git a/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/encoding.cpython-312.pyc b/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/encoding.cpython-312.pyc deleted file mode 100644 index 3f6b42b10e3d1b5540899a3af21a28a367750cde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2676 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 diff --git a/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/serializer.cpython-312.pyc b/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/serializer.cpython-312.pyc deleted file mode 100644 index c342b8dd40b7c3fd07a5b50dc3f82e53069663a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15417 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 diff --git a/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/signer.cpython-312.pyc b/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/signer.cpython-312.pyc deleted file mode 100644 index b4ea920e39c986ff0d3a4617fb4d7fa94e431fb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11282 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 diff --git a/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/url_safe.cpython-312.pyc b/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/url_safe.cpython-312.pyc deleted file mode 100644 index 3904603642359838c3dd9c311c33eee7a4b89284..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3526 zcmbtWU2Ggz6~41Gv;RN-$*%1r#a>x^MI0yB3X!sQ~@bS2=Rm(BpwibNNOakA(4Vw9{RSaT@j@(oO5S4 z>zGmmT(9q(d(OFM?woVJbI+ersW^d={LQoGA7g~PkBiQT1cbElE)bWAK@7m7nKT$6(nmHLD%1+p~jdni@f(taV$fV2msJ?*_6 z>5k=4zV|~^%}ahlw{6GMJ=3w>i4UcKnbb}?m8xF$o}YYS0+dqIy339p(F|6047P>A z>^38QLN{L2mn}y(K-{CfcuM#5NybgxGV6>3FaF3X^O9L%Mwe9%P9DtdgGw9Ug!K== z@r;xtgOoxqLjX!LQ%b54Vqrr*4st^=)VHJ<+5Trln`A~Z!WYt|h!GQXeh@W15Ly=1J&#qY z9`zhrx6J7{g;56Qapt|Y++&=YGt_2f(9`*Hfj-wUXt|EC z68M}3F5YU&bzr4?XsWE+)P*mwmgzL3RZA}i=hi8FT0xkpXSWCA6*$s4zt3PZdd>2* z?nhy$5y%8D8z zUORyaX-FNdm2gAlIgkPTf-x^3*;xh8M!2i*r8=^U(FXb9Zm<@fl^XKTq+fTSflO024E6_tp><}7?$;#%cwI$A+T(z%&G`X2us@G z=B#P!mc}@DczwKU4%3dJu`Nm0H8|sNCZvYQLP*HAEFXnfdph@AOmZHEQ~I&5bzaG% zxK_}%AMYCXRkv1U+)pCVwT`8juei*b@gr>pheUzRI-hm@@WLWKc}}qAUB~t%=EpRx zZ0WA6X)XpGL4)J`gR{jsr^1S+?OEkwl{@pS?72uRRh*^btIU422uCVbm%Ta1K3sV6 zP|-C#b`WaSfKPV68vjJasQk zlDSqWoEo}4ur|p=_o}Pxj*Ct<31^shgRxt4H3;j9ou^D>HU8I(C0^ zg!Bx3L=-U8w|l+k%=!r3ROSA3D@=A|TM;>x{iG#>^pnj#vSSz&!FrCa?>M_Yx)&4& z`ap4T2o!sVP%$<1z%9Th{4_D%Pp)Oh50M-FvGJmOV|RLdzkFlAiu9q_iL`vJgDnUSK{b#)tPx_&V>WFYjfYiXMd>2F zp>$Bah4)a?2-TqyEC5Qm(oj}Hh74~>bPR8?s5WG-8cIX0gAnSH3iVx`cqYIe?*(Q) z%rUZl(x_Fcoy_G~WJNpB@nwtI9BV{A!tuKGWoLSx4x0A1)a~rh<#U(LtsYs+ z?rX+BNTi$f*T4E!d3Enk%&U*RS$QvUV7-61d1`$(ZJzm{Z)8wCNz`CDReJ-749 z*-Liw^xaIZncjdm!0pF(!oydmmp$h4T|hrjy~4P?EWle&3Ys?Pgkv)f1(xv7qkfn( zuf}b$$SeHuj({IPYClYHuSPY^)++92jlkq~}IAQ5=UxDfV_sPAGtVUaL^5mCq zD!H432iKJ2tt8pI?_TV4>an}Mxt0n~Ku!-p45=u|KGs4R?CBqDC6G#zc;@32Q2%&Z zN~;6+2uwWRdD|mxOZ(E3HhMtZZCbEpfsRY|d;g{S)ZaPl@CBDzCUgd4q9Tq>6}s)n z6rHYl6m!Id3&EgRr(EbupqUUid>j)ED_p0`C_@)#x*nE#xI?i0s8yj}w>K{`UWP`F zmgjU1%^mOqC1FOls&o1@^Qi99MQ}4dr>36Jo|u|CfW$!{gdLy@KnLB$#M=r#h~B_* z!;3h50j9S};3JBRBc174AT|&m7sy8#nm`A||CJv*ZQHgMvi^rpbLKXs&+@2n1H|b6 z^r$d{uKyoB%AZ1i9mPrH8Aa+#o#_Q6uu=p<FL^NVzapw#8bG(!}HetT%VWZBm==w4=jsj#sNX3~RJ?Dey z@c{2%;U{1RB0_+%B}jJmH6b0+dFXz5oCK diff --git a/venv/lib/python3.12/site-packages/itsdangerous/_json.py b/venv/lib/python3.12/site-packages/itsdangerous/_json.py deleted file mode 100644 index fc23feaa..00000000 --- a/venv/lib/python3.12/site-packages/itsdangerous/_json.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import annotations - -import json as _json -import typing as t - - -class _CompactJSON: - """Wrapper around json module that strips whitespace.""" - - @staticmethod - def loads(payload: str | bytes) -> t.Any: - return _json.loads(payload) - - @staticmethod - def dumps(obj: t.Any, **kwargs: t.Any) -> str: - kwargs.setdefault("ensure_ascii", False) - kwargs.setdefault("separators", (",", ":")) - return _json.dumps(obj, **kwargs) diff --git a/venv/lib/python3.12/site-packages/itsdangerous/encoding.py b/venv/lib/python3.12/site-packages/itsdangerous/encoding.py deleted file mode 100644 index f5ca80f9..00000000 --- a/venv/lib/python3.12/site-packages/itsdangerous/encoding.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import annotations - -import base64 -import string -import struct -import typing as t - -from .exc import BadData - - -def want_bytes( - s: str | bytes, encoding: str = "utf-8", errors: str = "strict" -) -> bytes: - if isinstance(s, str): - s = s.encode(encoding, errors) - - return s - - -def base64_encode(string: str | bytes) -> bytes: - """Base64 encode a string of bytes or text. The resulting bytes are - safe to use in URLs. - """ - string = want_bytes(string) - return base64.urlsafe_b64encode(string).rstrip(b"=") - - -def base64_decode(string: str | bytes) -> bytes: - """Base64 decode a URL-safe string of bytes or text. The result is - bytes. - """ - string = want_bytes(string, encoding="ascii", errors="ignore") - string += b"=" * (-len(string) % 4) - - try: - return base64.urlsafe_b64decode(string) - except (TypeError, ValueError) as e: - raise BadData("Invalid base64-encoded data") from e - - -# The alphabet used by base64.urlsafe_* -_base64_alphabet = f"{string.ascii_letters}{string.digits}-_=".encode("ascii") - -_int64_struct = struct.Struct(">Q") -_int_to_bytes = _int64_struct.pack -_bytes_to_int = t.cast("t.Callable[[bytes], tuple[int]]", _int64_struct.unpack) - - -def int_to_bytes(num: int) -> bytes: - return _int_to_bytes(num).lstrip(b"\x00") - - -def bytes_to_int(bytestr: bytes) -> int: - return _bytes_to_int(bytestr.rjust(8, b"\x00"))[0] diff --git a/venv/lib/python3.12/site-packages/itsdangerous/exc.py b/venv/lib/python3.12/site-packages/itsdangerous/exc.py deleted file mode 100644 index a75adcd5..00000000 --- a/venv/lib/python3.12/site-packages/itsdangerous/exc.py +++ /dev/null @@ -1,106 +0,0 @@ -from __future__ import annotations - -import typing as t -from datetime import datetime - - -class BadData(Exception): - """Raised if bad data of any sort was encountered. This is the base - for all exceptions that ItsDangerous defines. - - .. versionadded:: 0.15 - """ - - def __init__(self, message: str): - super().__init__(message) - self.message = message - - def __str__(self) -> str: - return self.message - - -class BadSignature(BadData): - """Raised if a signature does not match.""" - - def __init__(self, message: str, payload: t.Any | None = None): - super().__init__(message) - - #: The payload that failed the signature test. In some - #: situations you might still want to inspect this, even if - #: you know it was tampered with. - #: - #: .. versionadded:: 0.14 - self.payload: t.Any | None = payload - - -class BadTimeSignature(BadSignature): - """Raised if a time-based signature is invalid. This is a subclass - of :class:`BadSignature`. - """ - - def __init__( - self, - message: str, - payload: t.Any | None = None, - date_signed: datetime | None = None, - ): - super().__init__(message, payload) - - #: If the signature expired this exposes the date of when the - #: signature was created. This can be helpful in order to - #: tell the user how long a link has been gone stale. - #: - #: .. versionchanged:: 2.0 - #: The datetime value is timezone-aware rather than naive. - #: - #: .. versionadded:: 0.14 - self.date_signed = date_signed - - -class SignatureExpired(BadTimeSignature): - """Raised if a signature timestamp is older than ``max_age``. This - is a subclass of :exc:`BadTimeSignature`. - """ - - -class BadHeader(BadSignature): - """Raised if a signed header is invalid in some form. This only - happens for serializers that have a header that goes with the - signature. - - .. versionadded:: 0.24 - """ - - def __init__( - self, - message: str, - payload: t.Any | None = None, - header: t.Any | None = None, - original_error: Exception | None = None, - ): - super().__init__(message, payload) - - #: If the header is actually available but just malformed it - #: might be stored here. - self.header: t.Any | None = header - - #: If available, the error that indicates why the payload was - #: not valid. This might be ``None``. - self.original_error: Exception | None = original_error - - -class BadPayload(BadData): - """Raised if a payload is invalid. This could happen if the payload - is loaded despite an invalid signature, or if there is a mismatch - between the serializer and deserializer. The original exception - that occurred during loading is stored on as :attr:`original_error`. - - .. versionadded:: 0.15 - """ - - def __init__(self, message: str, original_error: Exception | None = None): - super().__init__(message) - - #: If available, the error that indicates why the payload was - #: not valid. This might be ``None``. - self.original_error: Exception | None = original_error diff --git a/venv/lib/python3.12/site-packages/itsdangerous/py.typed b/venv/lib/python3.12/site-packages/itsdangerous/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/venv/lib/python3.12/site-packages/itsdangerous/serializer.py b/venv/lib/python3.12/site-packages/itsdangerous/serializer.py deleted file mode 100644 index 5ddf3871..00000000 --- a/venv/lib/python3.12/site-packages/itsdangerous/serializer.py +++ /dev/null @@ -1,406 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import json -import typing as t - -from .encoding import want_bytes -from .exc import BadPayload -from .exc import BadSignature -from .signer import _make_keys_list -from .signer import Signer - -if t.TYPE_CHECKING: - import typing_extensions as te - - # This should be either be str or bytes. To avoid having to specify the - # bound type, it falls back to a union if structural matching fails. - _TSerialized = te.TypeVar( - "_TSerialized", bound=t.Union[str, bytes], default=t.Union[str, bytes] - ) -else: - # Still available at runtime on Python < 3.13, but without the default. - _TSerialized = t.TypeVar("_TSerialized", bound=t.Union[str, bytes]) - - -class _PDataSerializer(t.Protocol[_TSerialized]): - def loads(self, payload: _TSerialized, /) -> t.Any: ... - # A signature with additional arguments is not handled correctly by type - # checkers right now, so an overload is used below for serializers that - # don't match this strict protocol. - def dumps(self, obj: t.Any, /) -> _TSerialized: ... - - -# Use TypeIs once it's available in typing_extensions or 3.13. -def is_text_serializer( - serializer: _PDataSerializer[t.Any], -) -> te.TypeGuard[_PDataSerializer[str]]: - """Checks whether a serializer generates text or binary.""" - return isinstance(serializer.dumps({}), str) - - -class Serializer(t.Generic[_TSerialized]): - """A serializer wraps a :class:`~itsdangerous.signer.Signer` to - enable serializing and securely signing data other than bytes. It - can unsign to verify that the data hasn't been changed. - - The serializer provides :meth:`dumps` and :meth:`loads`, similar to - :mod:`json`, and by default uses :mod:`json` internally to serialize - the data to bytes. - - The secret key should be a random string of ``bytes`` and should not - be saved to code or version control. Different salts should be used - to distinguish signing in different contexts. See :doc:`/concepts` - for information about the security of the secret key and salt. - - :param secret_key: The secret key to sign and verify with. Can be a - list of keys, oldest to newest, to support key rotation. - :param salt: Extra key to combine with ``secret_key`` to distinguish - signatures in different contexts. - :param serializer: An object that provides ``dumps`` and ``loads`` - methods for serializing data to a string. Defaults to - :attr:`default_serializer`, which defaults to :mod:`json`. - :param serializer_kwargs: Keyword arguments to pass when calling - ``serializer.dumps``. - :param signer: A ``Signer`` class to instantiate when signing data. - Defaults to :attr:`default_signer`, which defaults to - :class:`~itsdangerous.signer.Signer`. - :param signer_kwargs: Keyword arguments to pass when instantiating - the ``Signer`` class. - :param fallback_signers: List of signer parameters to try when - unsigning with the default signer fails. Each item can be a dict - of ``signer_kwargs``, a ``Signer`` class, or a tuple of - ``(signer, signer_kwargs)``. Defaults to - :attr:`default_fallback_signers`. - - .. versionchanged:: 2.0 - Added support for key rotation by passing a list to - ``secret_key``. - - .. versionchanged:: 2.0 - Removed the default SHA-512 fallback signer from - ``default_fallback_signers``. - - .. versionchanged:: 1.1 - Added support for ``fallback_signers`` and configured a default - SHA-512 fallback. This fallback is for users who used the yanked - 1.0.0 release which defaulted to SHA-512. - - .. versionchanged:: 0.14 - The ``signer`` and ``signer_kwargs`` parameters were added to - the constructor. - """ - - #: The default serialization module to use to serialize data to a - #: string internally. The default is :mod:`json`, but can be changed - #: to any object that provides ``dumps`` and ``loads`` methods. - default_serializer: _PDataSerializer[t.Any] = json - - #: The default ``Signer`` class to instantiate when signing data. - #: The default is :class:`itsdangerous.signer.Signer`. - default_signer: type[Signer] = Signer - - #: The default fallback signers to try when unsigning fails. - default_fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] = [] - - # Serializer[str] if no data serializer is provided, or if it returns str. - @t.overload - def __init__( - self: Serializer[str], - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None = b"itsdangerous", - serializer: None | _PDataSerializer[str] = None, - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): ... - - # Serializer[bytes] with a bytes data serializer positional argument. - @t.overload - def __init__( - self: Serializer[bytes], - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None, - serializer: _PDataSerializer[bytes], - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): ... - - # Serializer[bytes] with a bytes data serializer keyword argument. - @t.overload - def __init__( - self: Serializer[bytes], - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None = b"itsdangerous", - *, - serializer: _PDataSerializer[bytes], - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): ... - - # Fall back with a positional argument. If the strict signature of - # _PDataSerializer doesn't match, fall back to a union, requiring the user - # to specify the type. - @t.overload - def __init__( - self, - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None, - serializer: t.Any, - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): ... - - # Fall back with a keyword argument. - @t.overload - def __init__( - self, - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None = b"itsdangerous", - *, - serializer: t.Any, - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): ... - - def __init__( - self, - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None = b"itsdangerous", - serializer: t.Any | None = None, - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): - #: The list of secret keys to try for verifying signatures, from - #: oldest to newest. The newest (last) key is used for signing. - #: - #: This allows a key rotation system to keep a list of allowed - #: keys and remove expired ones. - self.secret_keys: list[bytes] = _make_keys_list(secret_key) - - if salt is not None: - salt = want_bytes(salt) - # if salt is None then the signer's default is used - - self.salt = salt - - if serializer is None: - serializer = self.default_serializer - - self.serializer: _PDataSerializer[_TSerialized] = serializer - self.is_text_serializer: bool = is_text_serializer(serializer) - - if signer is None: - signer = self.default_signer - - self.signer: type[Signer] = signer - self.signer_kwargs: dict[str, t.Any] = signer_kwargs or {} - - if fallback_signers is None: - fallback_signers = list(self.default_fallback_signers) - - self.fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] = fallback_signers - self.serializer_kwargs: dict[str, t.Any] = serializer_kwargs or {} - - @property - def secret_key(self) -> bytes: - """The newest (last) entry in the :attr:`secret_keys` list. This - is for compatibility from before key rotation support was added. - """ - return self.secret_keys[-1] - - def load_payload( - self, payload: bytes, serializer: _PDataSerializer[t.Any] | None = None - ) -> t.Any: - """Loads the encoded object. This function raises - :class:`.BadPayload` if the payload is not valid. The - ``serializer`` parameter can be used to override the serializer - stored on the class. The encoded ``payload`` should always be - bytes. - """ - if serializer is None: - use_serializer = self.serializer - is_text = self.is_text_serializer - else: - use_serializer = serializer - is_text = is_text_serializer(serializer) - - try: - if is_text: - return use_serializer.loads(payload.decode("utf-8")) # type: ignore[arg-type] - - return use_serializer.loads(payload) # type: ignore[arg-type] - except Exception as e: - raise BadPayload( - "Could not load the payload because an exception" - " occurred on unserializing the data.", - original_error=e, - ) from e - - def dump_payload(self, obj: t.Any) -> bytes: - """Dumps the encoded object. The return value is always bytes. - If the internal serializer returns text, the value will be - encoded as UTF-8. - """ - return want_bytes(self.serializer.dumps(obj, **self.serializer_kwargs)) - - def make_signer(self, salt: str | bytes | None = None) -> Signer: - """Creates a new instance of the signer to be used. The default - implementation uses the :class:`.Signer` base class. - """ - if salt is None: - salt = self.salt - - return self.signer(self.secret_keys, salt=salt, **self.signer_kwargs) - - def iter_unsigners(self, salt: str | bytes | None = None) -> cabc.Iterator[Signer]: - """Iterates over all signers to be tried for unsigning. Starts - with the configured signer, then constructs each signer - specified in ``fallback_signers``. - """ - if salt is None: - salt = self.salt - - yield self.make_signer(salt) - - for fallback in self.fallback_signers: - if isinstance(fallback, dict): - kwargs = fallback - fallback = self.signer - elif isinstance(fallback, tuple): - fallback, kwargs = fallback - else: - kwargs = self.signer_kwargs - - for secret_key in self.secret_keys: - yield fallback(secret_key, salt=salt, **kwargs) - - def dumps(self, obj: t.Any, salt: str | bytes | None = None) -> _TSerialized: - """Returns a signed string serialized with the internal - serializer. The return value can be either a byte or unicode - string depending on the format of the internal serializer. - """ - payload = want_bytes(self.dump_payload(obj)) - rv = self.make_signer(salt).sign(payload) - - if self.is_text_serializer: - return rv.decode("utf-8") # type: ignore[return-value] - - return rv # type: ignore[return-value] - - def dump(self, obj: t.Any, f: t.IO[t.Any], salt: str | bytes | None = None) -> None: - """Like :meth:`dumps` but dumps into a file. The file handle has - to be compatible with what the internal serializer expects. - """ - f.write(self.dumps(obj, salt)) - - def loads( - self, s: str | bytes, salt: str | bytes | None = None, **kwargs: t.Any - ) -> t.Any: - """Reverse of :meth:`dumps`. Raises :exc:`.BadSignature` if the - signature validation fails. - """ - s = want_bytes(s) - last_exception = None - - for signer in self.iter_unsigners(salt): - try: - return self.load_payload(signer.unsign(s)) - except BadSignature as err: - last_exception = err - - raise t.cast(BadSignature, last_exception) - - def load(self, f: t.IO[t.Any], salt: str | bytes | None = None) -> t.Any: - """Like :meth:`loads` but loads from a file.""" - return self.loads(f.read(), salt) - - def loads_unsafe( - self, s: str | bytes, salt: str | bytes | None = None - ) -> tuple[bool, t.Any]: - """Like :meth:`loads` but without verifying the signature. This - is potentially very dangerous to use depending on how your - serializer works. The return value is ``(signature_valid, - payload)`` instead of just the payload. The first item will be a - boolean that indicates if the signature is valid. This function - never fails. - - Use it for debugging only and if you know that your serializer - module is not exploitable (for example, do not use it with a - pickle serializer). - - .. versionadded:: 0.15 - """ - return self._loads_unsafe_impl(s, salt) - - def _loads_unsafe_impl( - self, - s: str | bytes, - salt: str | bytes | None, - load_kwargs: dict[str, t.Any] | None = None, - load_payload_kwargs: dict[str, t.Any] | None = None, - ) -> tuple[bool, t.Any]: - """Low level helper function to implement :meth:`loads_unsafe` - in serializer subclasses. - """ - if load_kwargs is None: - load_kwargs = {} - - try: - return True, self.loads(s, salt=salt, **load_kwargs) - except BadSignature as e: - if e.payload is None: - return False, None - - if load_payload_kwargs is None: - load_payload_kwargs = {} - - try: - return ( - False, - self.load_payload(e.payload, **load_payload_kwargs), - ) - except BadPayload: - return False, None - - def load_unsafe( - self, f: t.IO[t.Any], salt: str | bytes | None = None - ) -> tuple[bool, t.Any]: - """Like :meth:`loads_unsafe` but loads from a file. - - .. versionadded:: 0.15 - """ - return self.loads_unsafe(f.read(), salt=salt) diff --git a/venv/lib/python3.12/site-packages/itsdangerous/signer.py b/venv/lib/python3.12/site-packages/itsdangerous/signer.py deleted file mode 100644 index e324dc03..00000000 --- a/venv/lib/python3.12/site-packages/itsdangerous/signer.py +++ /dev/null @@ -1,266 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import hashlib -import hmac -import typing as t - -from .encoding import _base64_alphabet -from .encoding import base64_decode -from .encoding import base64_encode -from .encoding import want_bytes -from .exc import BadSignature - - -class SigningAlgorithm: - """Subclasses must implement :meth:`get_signature` to provide - signature generation functionality. - """ - - def get_signature(self, key: bytes, value: bytes) -> bytes: - """Returns the signature for the given key and value.""" - raise NotImplementedError() - - def verify_signature(self, key: bytes, value: bytes, sig: bytes) -> bool: - """Verifies the given signature matches the expected - signature. - """ - return hmac.compare_digest(sig, self.get_signature(key, value)) - - -class NoneAlgorithm(SigningAlgorithm): - """Provides an algorithm that does not perform any signing and - returns an empty signature. - """ - - def get_signature(self, key: bytes, value: bytes) -> bytes: - return b"" - - -def _lazy_sha1(string: bytes = b"") -> t.Any: - """Don't access ``hashlib.sha1`` until runtime. FIPS builds may not include - SHA-1, in which case the import and use as a default would fail before the - developer can configure something else. - """ - return hashlib.sha1(string) - - -class HMACAlgorithm(SigningAlgorithm): - """Provides signature generation using HMACs.""" - - #: The digest method to use with the MAC algorithm. This defaults to - #: SHA1, but can be changed to any other function in the hashlib - #: module. - default_digest_method: t.Any = staticmethod(_lazy_sha1) - - def __init__(self, digest_method: t.Any = None): - if digest_method is None: - digest_method = self.default_digest_method - - self.digest_method: t.Any = digest_method - - def get_signature(self, key: bytes, value: bytes) -> bytes: - mac = hmac.new(key, msg=value, digestmod=self.digest_method) - return mac.digest() - - -def _make_keys_list( - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], -) -> list[bytes]: - if isinstance(secret_key, (str, bytes)): - return [want_bytes(secret_key)] - - return [want_bytes(s) for s in secret_key] # pyright: ignore - - -class Signer: - """A signer securely signs bytes, then unsigns them to verify that - the value hasn't been changed. - - The secret key should be a random string of ``bytes`` and should not - be saved to code or version control. Different salts should be used - to distinguish signing in different contexts. See :doc:`/concepts` - for information about the security of the secret key and salt. - - :param secret_key: The secret key to sign and verify with. Can be a - list of keys, oldest to newest, to support key rotation. - :param salt: Extra key to combine with ``secret_key`` to distinguish - signatures in different contexts. - :param sep: Separator between the signature and value. - :param key_derivation: How to derive the signing key from the secret - key and salt. Possible values are ``concat``, ``django-concat``, - or ``hmac``. Defaults to :attr:`default_key_derivation`, which - defaults to ``django-concat``. - :param digest_method: Hash function to use when generating the HMAC - signature. Defaults to :attr:`default_digest_method`, which - defaults to :func:`hashlib.sha1`. Note that the security of the - hash alone doesn't apply when used intermediately in HMAC. - :param algorithm: A :class:`SigningAlgorithm` instance to use - instead of building a default :class:`HMACAlgorithm` with the - ``digest_method``. - - .. versionchanged:: 2.0 - Added support for key rotation by passing a list to - ``secret_key``. - - .. versionchanged:: 0.18 - ``algorithm`` was added as an argument to the class constructor. - - .. versionchanged:: 0.14 - ``key_derivation`` and ``digest_method`` were added as arguments - to the class constructor. - """ - - #: The default digest method to use for the signer. The default is - #: :func:`hashlib.sha1`, but can be changed to any :mod:`hashlib` or - #: compatible object. Note that the security of the hash alone - #: doesn't apply when used intermediately in HMAC. - #: - #: .. versionadded:: 0.14 - default_digest_method: t.Any = staticmethod(_lazy_sha1) - - #: The default scheme to use to derive the signing key from the - #: secret key and salt. The default is ``django-concat``. Possible - #: values are ``concat``, ``django-concat``, and ``hmac``. - #: - #: .. versionadded:: 0.14 - default_key_derivation: str = "django-concat" - - def __init__( - self, - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None = b"itsdangerous.Signer", - sep: str | bytes = b".", - key_derivation: str | None = None, - digest_method: t.Any | None = None, - algorithm: SigningAlgorithm | None = None, - ): - #: The list of secret keys to try for verifying signatures, from - #: oldest to newest. The newest (last) key is used for signing. - #: - #: This allows a key rotation system to keep a list of allowed - #: keys and remove expired ones. - self.secret_keys: list[bytes] = _make_keys_list(secret_key) - self.sep: bytes = want_bytes(sep) - - if self.sep in _base64_alphabet: - raise ValueError( - "The given separator cannot be used because it may be" - " contained in the signature itself. ASCII letters," - " digits, and '-_=' must not be used." - ) - - if salt is not None: - salt = want_bytes(salt) - else: - salt = b"itsdangerous.Signer" - - self.salt = salt - - if key_derivation is None: - key_derivation = self.default_key_derivation - - self.key_derivation: str = key_derivation - - if digest_method is None: - digest_method = self.default_digest_method - - self.digest_method: t.Any = digest_method - - if algorithm is None: - algorithm = HMACAlgorithm(self.digest_method) - - self.algorithm: SigningAlgorithm = algorithm - - @property - def secret_key(self) -> bytes: - """The newest (last) entry in the :attr:`secret_keys` list. This - is for compatibility from before key rotation support was added. - """ - return self.secret_keys[-1] - - def derive_key(self, secret_key: str | bytes | None = None) -> bytes: - """This method is called to derive the key. The default key - derivation choices can be overridden here. Key derivation is not - intended to be used as a security method to make a complex key - out of a short password. Instead you should use large random - secret keys. - - :param secret_key: A specific secret key to derive from. - Defaults to the last item in :attr:`secret_keys`. - - .. versionchanged:: 2.0 - Added the ``secret_key`` parameter. - """ - if secret_key is None: - secret_key = self.secret_keys[-1] - else: - secret_key = want_bytes(secret_key) - - if self.key_derivation == "concat": - return t.cast(bytes, self.digest_method(self.salt + secret_key).digest()) - elif self.key_derivation == "django-concat": - return t.cast( - bytes, self.digest_method(self.salt + b"signer" + secret_key).digest() - ) - elif self.key_derivation == "hmac": - mac = hmac.new(secret_key, digestmod=self.digest_method) - mac.update(self.salt) - return mac.digest() - elif self.key_derivation == "none": - return secret_key - else: - raise TypeError("Unknown key derivation method") - - def get_signature(self, value: str | bytes) -> bytes: - """Returns the signature for the given value.""" - value = want_bytes(value) - key = self.derive_key() - sig = self.algorithm.get_signature(key, value) - return base64_encode(sig) - - def sign(self, value: str | bytes) -> bytes: - """Signs the given string.""" - value = want_bytes(value) - return value + self.sep + self.get_signature(value) - - def verify_signature(self, value: str | bytes, sig: str | bytes) -> bool: - """Verifies the signature for the given value.""" - try: - sig = base64_decode(sig) - except Exception: - return False - - value = want_bytes(value) - - for secret_key in reversed(self.secret_keys): - key = self.derive_key(secret_key) - - if self.algorithm.verify_signature(key, value, sig): - return True - - return False - - def unsign(self, signed_value: str | bytes) -> bytes: - """Unsigns the given string.""" - signed_value = want_bytes(signed_value) - - if self.sep not in signed_value: - raise BadSignature(f"No {self.sep!r} found in value") - - value, sig = signed_value.rsplit(self.sep, 1) - - if self.verify_signature(value, sig): - return value - - raise BadSignature(f"Signature {sig!r} does not match", payload=value) - - def validate(self, signed_value: str | bytes) -> bool: - """Only validates the given signed value. Returns ``True`` if - the signature exists and is valid. - """ - try: - self.unsign(signed_value) - return True - except BadSignature: - return False diff --git a/venv/lib/python3.12/site-packages/itsdangerous/timed.py b/venv/lib/python3.12/site-packages/itsdangerous/timed.py deleted file mode 100644 index 73843755..00000000 --- a/venv/lib/python3.12/site-packages/itsdangerous/timed.py +++ /dev/null @@ -1,228 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import time -import typing as t -from datetime import datetime -from datetime import timezone - -from .encoding import base64_decode -from .encoding import base64_encode -from .encoding import bytes_to_int -from .encoding import int_to_bytes -from .encoding import want_bytes -from .exc import BadSignature -from .exc import BadTimeSignature -from .exc import SignatureExpired -from .serializer import _TSerialized -from .serializer import Serializer -from .signer import Signer - - -class TimestampSigner(Signer): - """Works like the regular :class:`.Signer` but also records the time - of the signing and can be used to expire signatures. The - :meth:`unsign` method can raise :exc:`.SignatureExpired` if the - unsigning failed because the signature is expired. - """ - - def get_timestamp(self) -> int: - """Returns the current timestamp. The function must return an - integer. - """ - return int(time.time()) - - def timestamp_to_datetime(self, ts: int) -> datetime: - """Convert the timestamp from :meth:`get_timestamp` into an - aware :class`datetime.datetime` in UTC. - - .. versionchanged:: 2.0 - The timestamp is returned as a timezone-aware ``datetime`` - in UTC rather than a naive ``datetime`` assumed to be UTC. - """ - return datetime.fromtimestamp(ts, tz=timezone.utc) - - def sign(self, value: str | bytes) -> bytes: - """Signs the given string and also attaches time information.""" - value = want_bytes(value) - timestamp = base64_encode(int_to_bytes(self.get_timestamp())) - sep = want_bytes(self.sep) - value = value + sep + timestamp - return value + sep + self.get_signature(value) - - # Ignore overlapping signatures check, return_timestamp is the only - # parameter that affects the return type. - - @t.overload - def unsign( # type: ignore[overload-overlap] - self, - signed_value: str | bytes, - max_age: int | None = None, - return_timestamp: t.Literal[False] = False, - ) -> bytes: ... - - @t.overload - def unsign( - self, - signed_value: str | bytes, - max_age: int | None = None, - return_timestamp: t.Literal[True] = True, - ) -> tuple[bytes, datetime]: ... - - def unsign( - self, - signed_value: str | bytes, - max_age: int | None = None, - return_timestamp: bool = False, - ) -> tuple[bytes, datetime] | bytes: - """Works like the regular :meth:`.Signer.unsign` but can also - validate the time. See the base docstring of the class for - the general behavior. If ``return_timestamp`` is ``True`` the - timestamp of the signature will be returned as an aware - :class:`datetime.datetime` object in UTC. - - .. versionchanged:: 2.0 - The timestamp is returned as a timezone-aware ``datetime`` - in UTC rather than a naive ``datetime`` assumed to be UTC. - """ - try: - result = super().unsign(signed_value) - sig_error = None - except BadSignature as e: - sig_error = e - result = e.payload or b"" - - sep = want_bytes(self.sep) - - # If there is no timestamp in the result there is something - # seriously wrong. In case there was a signature error, we raise - # that one directly, otherwise we have a weird situation in - # which we shouldn't have come except someone uses a time-based - # serializer on non-timestamp data, so catch that. - if sep not in result: - if sig_error: - raise sig_error - - raise BadTimeSignature("timestamp missing", payload=result) - - value, ts_bytes = result.rsplit(sep, 1) - ts_int: int | None = None - ts_dt: datetime | None = None - - try: - ts_int = bytes_to_int(base64_decode(ts_bytes)) - except Exception: - pass - - # Signature is *not* okay. Raise a proper error now that we have - # split the value and the timestamp. - if sig_error is not None: - if ts_int is not None: - try: - ts_dt = self.timestamp_to_datetime(ts_int) - except (ValueError, OSError, OverflowError) as exc: - # Windows raises OSError - # 32-bit raises OverflowError - raise BadTimeSignature( - "Malformed timestamp", payload=value - ) from exc - - raise BadTimeSignature(str(sig_error), payload=value, date_signed=ts_dt) - - # Signature was okay but the timestamp is actually not there or - # malformed. Should not happen, but we handle it anyway. - if ts_int is None: - raise BadTimeSignature("Malformed timestamp", payload=value) - - # Check timestamp is not older than max_age - if max_age is not None: - age = self.get_timestamp() - ts_int - - if age > max_age: - raise SignatureExpired( - f"Signature age {age} > {max_age} seconds", - payload=value, - date_signed=self.timestamp_to_datetime(ts_int), - ) - - if age < 0: - raise SignatureExpired( - f"Signature age {age} < 0 seconds", - payload=value, - date_signed=self.timestamp_to_datetime(ts_int), - ) - - if return_timestamp: - return value, self.timestamp_to_datetime(ts_int) - - return value - - def validate(self, signed_value: str | bytes, max_age: int | None = None) -> bool: - """Only validates the given signed value. Returns ``True`` if - the signature exists and is valid.""" - try: - self.unsign(signed_value, max_age=max_age) - return True - except BadSignature: - return False - - -class TimedSerializer(Serializer[_TSerialized]): - """Uses :class:`TimestampSigner` instead of the default - :class:`.Signer`. - """ - - default_signer: type[TimestampSigner] = TimestampSigner - - def iter_unsigners( - self, salt: str | bytes | None = None - ) -> cabc.Iterator[TimestampSigner]: - return t.cast("cabc.Iterator[TimestampSigner]", super().iter_unsigners(salt)) - - # TODO: Signature is incompatible because parameters were added - # before salt. - - def loads( # type: ignore[override] - self, - s: str | bytes, - max_age: int | None = None, - return_timestamp: bool = False, - salt: str | bytes | None = None, - ) -> t.Any: - """Reverse of :meth:`dumps`, raises :exc:`.BadSignature` if the - signature validation fails. If a ``max_age`` is provided it will - ensure the signature is not older than that time in seconds. In - case the signature is outdated, :exc:`.SignatureExpired` is - raised. All arguments are forwarded to the signer's - :meth:`~TimestampSigner.unsign` method. - """ - s = want_bytes(s) - last_exception = None - - for signer in self.iter_unsigners(salt): - try: - base64d, timestamp = signer.unsign( - s, max_age=max_age, return_timestamp=True - ) - payload = self.load_payload(base64d) - - if return_timestamp: - return payload, timestamp - - return payload - except SignatureExpired: - # The signature was unsigned successfully but was - # expired. Do not try the next signer. - raise - except BadSignature as err: - last_exception = err - - raise t.cast(BadSignature, last_exception) - - def loads_unsafe( # type: ignore[override] - self, - s: str | bytes, - max_age: int | None = None, - salt: str | bytes | None = None, - ) -> tuple[bool, t.Any]: - return self._loads_unsafe_impl(s, salt, load_kwargs={"max_age": max_age}) diff --git a/venv/lib/python3.12/site-packages/itsdangerous/url_safe.py b/venv/lib/python3.12/site-packages/itsdangerous/url_safe.py deleted file mode 100644 index 56a07933..00000000 --- a/venv/lib/python3.12/site-packages/itsdangerous/url_safe.py +++ /dev/null @@ -1,83 +0,0 @@ -from __future__ import annotations - -import typing as t -import zlib - -from ._json import _CompactJSON -from .encoding import base64_decode -from .encoding import base64_encode -from .exc import BadPayload -from .serializer import _PDataSerializer -from .serializer import Serializer -from .timed import TimedSerializer - - -class URLSafeSerializerMixin(Serializer[str]): - """Mixed in with a regular serializer it will attempt to zlib - compress the string to make it shorter if necessary. It will also - base64 encode the string so that it can safely be placed in a URL. - """ - - default_serializer: _PDataSerializer[str] = _CompactJSON - - def load_payload( - self, - payload: bytes, - *args: t.Any, - serializer: t.Any | None = None, - **kwargs: t.Any, - ) -> t.Any: - decompress = False - - if payload.startswith(b"."): - payload = payload[1:] - decompress = True - - try: - json = base64_decode(payload) - except Exception as e: - raise BadPayload( - "Could not base64 decode the payload because of an exception", - original_error=e, - ) from e - - if decompress: - try: - json = zlib.decompress(json) - except Exception as e: - raise BadPayload( - "Could not zlib decompress the payload before decoding the payload", - original_error=e, - ) from e - - return super().load_payload(json, *args, **kwargs) - - def dump_payload(self, obj: t.Any) -> bytes: - json = super().dump_payload(obj) - is_compressed = False - compressed = zlib.compress(json) - - if len(compressed) < (len(json) - 1): - json = compressed - is_compressed = True - - base64d = base64_encode(json) - - if is_compressed: - base64d = b"." + base64d - - return base64d - - -class URLSafeSerializer(URLSafeSerializerMixin, Serializer[str]): - """Works like :class:`.Serializer` but dumps and loads into a URL - safe string consisting of the upper and lowercase character of the - alphabet as well as ``'_'``, ``'-'`` and ``'.'``. - """ - - -class URLSafeTimedSerializer(URLSafeSerializerMixin, TimedSerializer[str]): - """Works like :class:`.TimedSerializer` but dumps and loads into a - URL safe string consisting of the upper and lowercase character of - the alphabet as well as ``'_'``, ``'-'`` and ``'.'``. - """ diff --git a/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/METADATA b/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/METADATA deleted file mode 100644 index ffef2ff3..00000000 --- a/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/METADATA +++ /dev/null @@ -1,84 +0,0 @@ -Metadata-Version: 2.4 -Name: Jinja2 -Version: 3.1.6 -Summary: A very fast and expressive template engine. -Maintainer-email: Pallets -Requires-Python: >=3.7 -Description-Content-Type: text/markdown -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Text Processing :: Markup :: HTML -Classifier: Typing :: Typed -License-File: LICENSE.txt -Requires-Dist: MarkupSafe>=2.0 -Requires-Dist: Babel>=2.7 ; extra == "i18n" -Project-URL: Changes, https://jinja.palletsprojects.com/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://jinja.palletsprojects.com/ -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Source, https://github.com/pallets/jinja/ -Provides-Extra: i18n - -# Jinja - -Jinja is a fast, expressive, extensible templating engine. Special -placeholders in the template allow writing code similar to Python -syntax. Then the template is passed data to render the final document. - -It includes: - -- Template inheritance and inclusion. -- Define and import macros within templates. -- HTML templates can use autoescaping to prevent XSS from untrusted - user input. -- A sandboxed environment can safely render untrusted templates. -- AsyncIO support for generating templates and calling async - functions. -- I18N support with Babel. -- Templates are compiled to optimized Python code just-in-time and - cached, or can be compiled ahead-of-time. -- Exceptions point to the correct line in templates to make debugging - easier. -- Extensible filters, tests, functions, and even syntax. - -Jinja's philosophy is that while application logic belongs in Python if -possible, it shouldn't make the template designer's job difficult by -restricting functionality too much. - - -## In A Nutshell - -```jinja -{% extends "base.html" %} -{% block title %}Members{% endblock %} -{% block content %} -

-{% endblock %} -``` - -## Donate - -The Pallets organization develops and supports Jinja and other popular -packages. In order to grow the community of contributors and users, and -allow the maintainers to devote more time to the projects, [please -donate today][]. - -[please donate today]: https://palletsprojects.com/donate - -## Contributing - -See our [detailed contributing documentation][contrib] for many ways to -contribute, including reporting issues, requesting features, asking or answering -questions, and making PRs. - -[contrib]: https://palletsprojects.com/contributing/ - diff --git a/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/RECORD b/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/RECORD deleted file mode 100644 index ffa3866a..00000000 --- a/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/RECORD +++ /dev/null @@ -1,57 +0,0 @@ -jinja2-3.1.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -jinja2-3.1.6.dist-info/METADATA,sha256=aMVUj7Z8QTKhOJjZsx7FDGvqKr3ZFdkh8hQ1XDpkmcg,2871 -jinja2-3.1.6.dist-info/RECORD,, -jinja2-3.1.6.dist-info/WHEEL,sha256=_2ozNFCLWc93bK4WKHCO-eDUENDlo-dgc9cU3qokYO4,82 -jinja2-3.1.6.dist-info/entry_points.txt,sha256=OL85gYU1eD8cuPlikifFngXpeBjaxl6rIJ8KkC_3r-I,58 -jinja2-3.1.6.dist-info/licenses/LICENSE.txt,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 -jinja2/__init__.py,sha256=xxepO9i7DHsqkQrgBEduLtfoz2QCuT6_gbL4XSN1hbU,1928 -jinja2/__pycache__/__init__.cpython-312.pyc,, -jinja2/__pycache__/_identifier.cpython-312.pyc,, -jinja2/__pycache__/async_utils.cpython-312.pyc,, -jinja2/__pycache__/bccache.cpython-312.pyc,, -jinja2/__pycache__/compiler.cpython-312.pyc,, -jinja2/__pycache__/constants.cpython-312.pyc,, -jinja2/__pycache__/debug.cpython-312.pyc,, -jinja2/__pycache__/defaults.cpython-312.pyc,, -jinja2/__pycache__/environment.cpython-312.pyc,, -jinja2/__pycache__/exceptions.cpython-312.pyc,, -jinja2/__pycache__/ext.cpython-312.pyc,, -jinja2/__pycache__/filters.cpython-312.pyc,, -jinja2/__pycache__/idtracking.cpython-312.pyc,, -jinja2/__pycache__/lexer.cpython-312.pyc,, -jinja2/__pycache__/loaders.cpython-312.pyc,, -jinja2/__pycache__/meta.cpython-312.pyc,, -jinja2/__pycache__/nativetypes.cpython-312.pyc,, -jinja2/__pycache__/nodes.cpython-312.pyc,, -jinja2/__pycache__/optimizer.cpython-312.pyc,, -jinja2/__pycache__/parser.cpython-312.pyc,, -jinja2/__pycache__/runtime.cpython-312.pyc,, -jinja2/__pycache__/sandbox.cpython-312.pyc,, -jinja2/__pycache__/tests.cpython-312.pyc,, -jinja2/__pycache__/utils.cpython-312.pyc,, -jinja2/__pycache__/visitor.cpython-312.pyc,, -jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 -jinja2/async_utils.py,sha256=vK-PdsuorOMnWSnEkT3iUJRIkTnYgO2T6MnGxDgHI5o,2834 -jinja2/bccache.py,sha256=gh0qs9rulnXo0PhX5jTJy2UHzI8wFnQ63o_vw7nhzRg,14061 -jinja2/compiler.py,sha256=9RpCQl5X88BHllJiPsHPh295Hh0uApvwFJNQuutULeM,74131 -jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 -jinja2/debug.py,sha256=CnHqCDHd-BVGvti_8ZsTolnXNhA3ECsY-6n_2pwU8Hw,6297 -jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 -jinja2/environment.py,sha256=9nhrP7Ch-NbGX00wvyr4yy-uhNHq2OCc60ggGrni_fk,61513 -jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 -jinja2/ext.py,sha256=5PF5eHfh8mXAIxXHHRB2xXbXohi8pE3nHSOxa66uS7E,31875 -jinja2/filters.py,sha256=PQ_Egd9n9jSgtnGQYyF4K5j2nYwhUIulhPnyimkdr-k,55212 -jinja2/idtracking.py,sha256=-ll5lIp73pML3ErUYiIJj7tdmWxcH_IlDv3yA_hiZYo,10555 -jinja2/lexer.py,sha256=LYiYio6br-Tep9nPcupWXsPEtjluw3p1mU-lNBVRUfk,29786 -jinja2/loaders.py,sha256=wIrnxjvcbqh5VwW28NSkfotiDq8qNCxIOSFbGUiSLB4,24055 -jinja2/meta.py,sha256=OTDPkaFvU2Hgvx-6akz7154F8BIWaRmvJcBFvwopHww,4397 -jinja2/nativetypes.py,sha256=7GIGALVJgdyL80oZJdQUaUfwSt5q2lSSZbXt0dNf_M4,4210 -jinja2/nodes.py,sha256=m1Duzcr6qhZI8JQ6VyJgUNinjAf5bQzijSmDnMsvUx8,34579 -jinja2/optimizer.py,sha256=rJnCRlQ7pZsEEmMhsQDgC_pKyDHxP5TPS6zVPGsgcu8,1651 -jinja2/parser.py,sha256=lLOFy3sEmHc5IaEHRiH1sQVnId2moUQzhyeJZTtdY30,40383 -jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -jinja2/runtime.py,sha256=gDk-GvdriJXqgsGbHgrcKTP0Yp6zPXzhzrIpCFH3jAU,34249 -jinja2/sandbox.py,sha256=Mw2aitlY2I8la7FYhcX2YG9BtUYcLnD0Gh3d29cDWrY,15009 -jinja2/tests.py,sha256=VLsBhVFnWg-PxSBz1MhRnNWgP1ovXk3neO1FLQMeC9Q,5926 -jinja2/utils.py,sha256=rRp3o9e7ZKS4fyrWRbELyLcpuGVTFcnooaOa1qx_FIk,24129 -jinja2/visitor.py,sha256=EcnL1PIwf_4RVCOMxsRNuR8AXHbS1qfAdMOE2ngKJz4,3557 diff --git a/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/WHEEL b/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/WHEEL deleted file mode 100644 index 23d2d7e9..00000000 --- a/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.11.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/entry_points.txt b/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/entry_points.txt deleted file mode 100644 index abc3eae3..00000000 --- a/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[babel.extractors] -jinja2=jinja2.ext:babel_extract[i18n] - diff --git a/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt b/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt deleted file mode 100644 index c37cae49..00000000 --- a/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2007 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. 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. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 -HOLDER 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. diff --git a/venv/lib/python3.12/site-packages/jinja2/__init__.py b/venv/lib/python3.12/site-packages/jinja2/__init__.py deleted file mode 100644 index 1a423a3e..00000000 --- a/venv/lib/python3.12/site-packages/jinja2/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -"""Jinja is a template engine written in pure Python. It provides a -non-XML syntax that supports inline expressions and an optional -sandboxed environment. -""" - -from .bccache import BytecodeCache as BytecodeCache -from .bccache import FileSystemBytecodeCache as FileSystemBytecodeCache -from .bccache import MemcachedBytecodeCache as MemcachedBytecodeCache -from .environment import Environment as Environment -from .environment import Template as Template -from .exceptions import TemplateAssertionError as TemplateAssertionError -from .exceptions import TemplateError as TemplateError -from .exceptions import TemplateNotFound as TemplateNotFound -from .exceptions import TemplateRuntimeError as TemplateRuntimeError -from .exceptions import TemplatesNotFound as TemplatesNotFound -from .exceptions import TemplateSyntaxError as TemplateSyntaxError -from .exceptions import UndefinedError as UndefinedError -from .loaders import BaseLoader as BaseLoader -from .loaders import ChoiceLoader as ChoiceLoader -from .loaders import DictLoader as DictLoader -from .loaders import FileSystemLoader as FileSystemLoader -from .loaders import FunctionLoader as FunctionLoader -from .loaders import ModuleLoader as ModuleLoader -from .loaders import PackageLoader as PackageLoader -from .loaders import PrefixLoader as PrefixLoader -from .runtime import ChainableUndefined as ChainableUndefined -from .runtime import DebugUndefined as DebugUndefined -from .runtime import make_logging_undefined as make_logging_undefined -from .runtime import StrictUndefined as StrictUndefined -from .runtime import Undefined as Undefined -from .utils import clear_caches as clear_caches -from .utils import is_undefined as is_undefined -from .utils import pass_context as pass_context -from .utils import pass_environment as pass_environment -from .utils import pass_eval_context as pass_eval_context -from .utils import select_autoescape as select_autoescape - -__version__ = "3.1.6" diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index fa00a412dbf71d3f90184c4e12e185bddca3c948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1647 zcmZ9M+in|07{_O0JGR&7_>^-tNehaq#A*wLN~IDxQBYF_0uq{=)p~b`C*7S{&5VuR zE4bqg;1zfQUV=BUv=S0m+<_`?dc`-Bu5G%q|N4FZ`R2Ia?C+I|jo_*N_Kg0NN9a!- zq|ee@c>RNg(9bA97zI|a6k5>|Ua~Z2fHOE_I18M`S;M(77cJvu!^^;VoHv{g3sDgl z4HtlIY#S~DmvG6j4P3@$!zJJft{5%@S8>&F1-OQ5hO1#cYT$<98t@8UF4k+i(-OgFA*>z+K!m+y-97tA;z_TC|SW4R?Vz@P^@4;7z<~cnx?9Zy8<( z-p1R8H^QCB!H(fg;9b0Hcnf$B?-||(-pBifcYyEUJBA(LyZA2fE`D#acd-BJmoF&0 z@f<20&ru|bLr)QhuxrYQ^Sz)-5#~_l#6v-x%ZVCrcI14noLKM?4G8qI8E1#zUOac? zgeh&aKZ(LJXjxtd5=?Ym8#3ljM{EqJ%3bT%Iw#wdLKcB{ahls}b{ z2)(E?A-K>}r!A>bPmLE`o%10JAgPslUk#a}5lM3!sV^6jo2hwa4lB*Ae!~Lt9UN4U zI`*+A$#d=nL@%U#GT_vo$Mz}p)vUEXKaiPMJs&b(?`7tcFL*Ev=VMeZJ^!V5JvYji z0@g5|byztWc$9hlkjz#GOR1ic{_uLy=|tX3;)eVhYUbL7L%H1vs39_kA<9$Uvoutd<Mvw(43MT2{0)wY0RfwRAwHd2w4nqN}Y{Eo)lVwQPV)b3;W# zDK@pSrDa>ojuuDDF37axx+5a=Rdd~6(QB~Kn=g9<9+4hpD)f7Bb#LHsq=s?C$Gs8k zw-?fWFE;lZ4(dTqQbi8q+X|7r8~u%V&~shNsB+z-c=D$3Br^5%R2;$#`mRa_@^{9v ztbdj=R`y>TSsx_mvjm+b=wX5m6Z9-Wj}r7GL8l3NnxNwZeQf;uMjt2W!vq0CGUz8J bguWjo=w5<)=?_B4eEdhX{bNbogDL+5`2^$c diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/_identifier.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/_identifier.cpython-312.pyc deleted file mode 100644 index 61d0a6c8f2e04679c574c469eec261fd54b224bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2128 zcmYL~O>iSe8HQ!MUz4UK6_~nN`#j?Nt&7c1|{JX;b;r=u8X@Y&4d8x6Nlb5sW*me9md7Zk>e3oaQ z9ly%4S7)y}HwAWcdUM8ZYB$ZB){Vt(oG-L5I_zJ&UpCm6o!2&d?Y*9mUSOn`NI!uX zq}L%$(oKj%=OsqxCuAHlGS0~`7}XL~yMhE%n=-2JQ(c1;sa~bJL5&!rMuHjvH89&u zQZqx%EH!f&sMIV{vr0{anp0{a*-B6=pcay5oXiZFSu&9{RWda)J7jjr?30D0l^`o1 z3rRagb_TLTHlnslc9m>{Z1iN$sEuqpLG6Ir$T~@KGUQ~*LDW&nDUeenr%H}N7je2k z#Ep}ihGfazg{b5fsiQFJB&mbxZj!o~?q;cr>8?uM7t}3Kw@O`udf2R&pk6>dM7<<= zhe9$(G`gZo+=t6g=&DOsC|q6A)tIgV8fO`eRSJ$MC{fU- zU`W9w1yc%UH0d&$CTW_cX@;gM21T0U8BYV6rMY4=u1tBXz<8|0V-<+bV^v6v$C?m_ z$GQ-o$K#C0RUY5x@ng6$SIdm6XZ-Yl@zdx0vng9Ncs0$dCa>v?*KA(vK*qdPWW064%@>TD6>ehA47fSt7N)HUZ!3(qle~@9oFsS9 zu;cLy6fffZ;vC{|x52pU@lK8L&X9X~#=QgXJ%_Zo=Wq|bc|P}skV`(qSBH=>WHwi3 z^O!P^J)bA?Y@RrsC(h@II$UR-Jensj=AO&uUU%M~&4)Uh4`;WE#cmb%HeR}oAB&PJ zNjbAjf7};Of(hItc#Y(L~9_-gfRDnsS0zaPGm|i%)5E+v zV7Od`dHh##Nq`hcgFRW;2P0`@1mCmkpb_T%8j5~1%umuVlYFQt3d1E1kk?{qFoTJs z67NWJ6>3SDNurW$O5=xGDg}^Dd7+k;vuVtxJ(!FFcBI)0wQL(EI|S2E%bj76vqEi8 zeqk>G#vlMw6x1ZhfGo(#f(nYD3JlPY#Ws+Aspul#htbf6RtdEOSv|z61sA5!2l7Nk z^iw29mtZUn4q&1?Q^UYK2{mgM z#wvwcM{d^{0J&Xf7HYi%m|hc@(qPK(!uZl)2OlT)CqUlkK5k?m>ki~{gHHgS$v^{# zvVh}{Wgp`~Sg_H3!S=&KTbed16EstpOvA!-A7*+Gp7hF~5|&eShKmUtX?g&sDB~%W z(>xZ%R6zHon%;U;lY$!10cg@8}!4ng&FGv1?vo)OXG$W`MaqoX^@rX2q05Y z&Vd1H01vF9SYgG;!x)9IQcuFvckgxlqVDyK``aJBz4ZCwR`l}+k2aocuCBpsKHT1p zZmpYQ~DjY&?lBudZ*eJzCz}+ISp&wEa|?kDqLOy!=sg{iEfz)!#2~KHL6a zWBn)Z{`kG+r>omhw)ybUpC0}(`gHm6>iXk{?=AmsbtSsKz50jM=+?WN&%XNB&z@|o ze7F|<`PLiQM849Wejk@`X<=dECh|u3&B&YI&HiBjot<~W#mG1Q^1b_|#WxpY54P~0 GkNgK%i~r>S diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/async_utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/async_utils.cpython-312.pyc deleted file mode 100644 index d1d151d0edeb70b8efe881b58189a32e9ea9f6f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4968 zcmb_fZ%kX)6~FiWvyHJ07;p$AHN!@;!-y<9!V9RSTIal_;5%PgA~3T2*OZwhv}Tg1u6SYMHctb4xU}=|1e7_xuME zx@^-f_}+8xJ@?%E&i$P~_m2)o8G+*b?X$5eJ0X9?PN5hx&{;oC37I7_k!hTS%$9~Y z=yP#?PzVVW$9SN{kO;IOi*aet60#Vy1hh3|r9|NdstTe@EfWm6Wg$C<9NS7W1xmJD zgZ;6D9I|zqgq(^?sZc7FD#fi-D>bmLR;C4>v(}JDwt=L*=9-N)jJ9m-o3w1H146d+ zb4FVRlpx!uh0u16bP~CIn#c}Vx&PjkiUU_%Mfa;5Bo^*dyn?3Bx3?V)?u zn!CbI6~OtxIQ3V3flOU~s=H6V7(8*J4)Yjas8-|}5Q=1x7$&SN zlmTmjDz!4F6_7|kU;MQ2rkL3NU#=2xl`Kwjnxi0Da}}wI0#!iK0Dk>lCB+qH3+*JY z)fAX6SW^6T=~`Yd8^%eBlP%Y+1(c*oT1-o6#F%Z`dM&@a&`t^$Bxct<1*s{axR)T8 zrG#*KX$G#%-lYo>c1G1Drf9<~vFQ>;U^OoB1Q7STJgs;+DKK+{^+54b3R?oy^PksE zu5w)rJAOf@nl3~mD%5?+WL&q#)Nn){PeiX$1|Ef|2paF5p1|4Upc05Bw0JZy#F7I_ zR8x@{8%&M`MwG-zARg-r42^4NlZnTh_q7Dnn5H~76p6kXIisk7fmmW7(h@KvhljOT zTx}j2X9(ws7ISbU!eWtx)_f?Qj7H+>Q_ZpxO|poVWTm0P*=q4%JD{2(tDbGMBkzoS zAkTk)q4G-SvafZ~*P8XTWh&a%fq`tTQyFIdKRVqC@+CbpCv4;w8DfNY)d~R0J8K-_Pr1;qYKm z9*!&FF!-f#A~J|nc{u#qa3pT_&|`sTFR4END3!$WdJQ{*UgiUo1|0Q}aU zf$CjhmT=^PkRnAx;4X+vM3l;8JDCLYVpibbQzS-G^h5eH@MqAMHuk~4F%-)hpz>P` zTlSp*LkgSN z_n(6?zvMxXr5=Xr>nZZ3L@Mj%s(;~32S0atS3LD|!MURs$1Vz=yDI+TX`FA(cv=?r zFM3)s6)m5;cg_nLcVIzUbO$o!0pm7${0@eOt6Te7axk3i8(`>64E*SPFfnf8N7ROg z;)>3zipDT5=w))Ozh7ZWBC0TS1q{DXcN$cT~#t(NbJ@iDj>ELox$6`}Q=9%7X)5&bZOR&i;n=}1- z=E40-w)RyZCo;a)n|({R;6FHse_2b)cdXX#Ua(|q_oh479(p)! zS+ee0an+`s#wD6C!vZjc-a$pj01&#(JtTT^Cnzbe$q3bk zJY9s;U|3-oJT|#Ayy^4sTmJ)8#|ho!(n=<$<=s9ZBZSpzXh}xdDn!T>*5&!TiDoPE z7Gro}gpkq>Z0CKXawVzfA=`W%K>Hpy%l||aNjJ#pChg=c={Ni+_48c}aW&!8nuDW} zm=@`aE2ny2@k_d(jSne$734^RgULjAh{XnDT5Lp7OWswt#1iTdgeKh{QzM1te#-WO z$PMllJjSq=3>zE_GsCBF{spN1j(2d&Vo!IRe|@QT&!T0|s;lDdkqaXiqjPOpS7XN7 zc+28kwrpRtY@cgevNW#N)Xw(4(+gl-P_i|x%dXapwRO#2G4)(dBo%FUR5Y4%!P;OW z{dgMC{Wim?942-Y$i@K12 z*8uw-NYWkMT5`y|;8-%DS7CRiV_&Ac_1hc|!~aw<2RKKA zgicr2kvSwT*`DNoU3-APDL%>nj)#FRIP8FjLd3_6 zmf_=)ZO01Dl^wwfeFeiz!+?tEevJg`0FGgG41OvuohIuX6`R&2DpuztL2R3^yiK4n z7a{ANhqdM(B|wv>!1)yI$#g)Edh=&AyRU4*54uzXzkNV#%qua^DY#Qs0XRagyGr5l z0PeQvnm6F5m^qd3hWXGDkOJAeYUAJ7juL}z=U2|q#?HOzPy#|DKdmeu4 zy-@rR zZ=m@`^#Suar=MQre8SHKuk;?>SvJdirS}D&@GI(-=BZD(V)awMz>Whe>%|=k?duyFr`Znx?+hlW*TS16jXz^mTKf~M!u$t#+%5<{mk6W(ev_&j_}jZc07Ij zSXZZBX-Wu#2`dQ|Agbz|rs$R)h>5)sX4(Pf5;_lWG+peECnK7fEb^cWT|kxSf*gx# zY&Rac1*^w#foMQpw-v*!5fODur;<=uENU2$p>8Hf`DXIF5_&+1{e2O>j&FXO6vbEFC@HHATOY{In+b z5+xo8uJgVHexc_^>&=>vh2QslQkJPXo*`8^$x18df|ollb#)xz{d_Um9Piyp+04pqp!u=z$gI!5k0mnpn3kLYu4N>E0E4 Zdya>8O_XMO-{?(0{l=-=BJ>Tc{|ic0QxyOJ diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/bccache.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/bccache.cpython-312.pyc deleted file mode 100644 index 361cc10c3ce2e9c333c70f0f0633cf083cc5d7f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19339 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 diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/compiler.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/compiler.cpython-312.pyc deleted file mode 100644 index f452c0dc4436a15074f588c8a20e437d157693e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104054 zcmdSC33y!BbtYIl3aA3AunHVz>(5|(w+!T{3Y~s@FJ*T z-21jFK7f+q{=S|^;?;fco_F_q?m6e4bMC*%%*-(0%KE*-ec!Ay8vcqN54~WxzUU>$I`3bs%lf-f3rH+d%qYMrQ^Krwup; zot>F1Y#+!PbalE|I2~bkryJo6!7-3MnA4fV!p?!*!Mx5q7S0^VA1vrBVBsu;3p)#0 z*oAOWXAuj#5iag5X5nmvOFBzfIAwhW2Fp9kSvYT?Vz9Eal7;gT_H=q! zxL}}au)4F_Xz-i*56VrU{)!o_4Qe~RyXb|F)&G zS!nS4@T{L#qd%wrD{>C%ui!mr7EC-xq_Ya?tbJ-aXVvfJP)a(hkY3Qfqn zSB6x7g=WDgtU-CttMBBH-$!jAtX(m7-7>MJ{(d)d&S{FPw>3oGtw;v z{Gz9CC^+nSb}V>)c*xTO2;a}BSZ!WoBCBV3DCoZ&9PA$IKIa$d&FF~G9rSly61zu6 z*c*F$Q0yBzcjN?Otv%S6;H{(eV)wuSUPU~npBM@D4fch2 zwYr||4g~gz=MZ5-GxT%^>5DeB&vSi&z91`|qjl(FpEx`;=pPCuj0b&yu$~M31e@>k9=LH1+2aH(577ZB@^R*y6%Sh7~!OY!$`5w~v}uN%eIq&>*e?!aR$%HTtQTp}d2M0? z3MYE$wu){|xFzgE{!3ldu3{}71JtD+x~@Dvx#s-vpnnZ!_(0E^5plTR-xCZ_;PT+` z0q`T(=CVXH`f8S7l_xd$G9D#_wkujcG@90oZ zs8TL6rbi&?+c_}Y(>)N_?W58VfR7483)3&I7?$h?r~94VQ@bOMx>^56L$`#tvXJzlsvTDW?)Wv=cM-^ad%!hMs6AGiv`8}GU*2_keYG}AcSx=^@2;$Hs~ zmwP&IIv743bv4iQ;uf(tKSVADuT^y5Ct+#5JR&BH!Gw9=(3nVLz-wYHBW^-CK(pc% zkGPRQGn1+yZpXW3f;oyCmD-eH^(|(VFPZUszi!q0owqt!cya3<{_g0pf4}Mf*u=s= zP0x5Ie=7g)t$=-0WN?;*8)x<{IO-#odT}#lW*Qz58xas!22t>vk7W@+xY>~qie!Aj*;d~YvbdGl|mgvy7Mj6Y> zbmpdD`Wz`cQbODeA00gwOnJ;?DZJ&idK)b9wP~`=aai#n*L2@qcy41E8vBrk;ru zZ=0{4FPIl2h5KX91B?9abnyDvwXvDHn6puN6LXd+VTP%+C-?&-0Zvr2^`e77lvB<#+2GNv-7H+;jzP>9#UP!vaVY5V(z2-7iia@!jz<*n&}^{f zGRP&5!I^udjg{vAA1Lhb7e`^wd_fepewm5%OGIHqYnRExJY^1{Gu0^zxL+ocw5TZq z8Ccswm72NDk-=yZE)Z$9iF@d_4>yo3`zd??w?wvf{?lgxv6Uie@^hl*Fha?5oDJzv zDIdo4%@fo6G<`FU+ta3ZdvslUbalHjy|>Qi%-iPAMhf@Eocq<;$L8ogXQMKK!>6uY zjyXLk5I_Jc&d>DIL*3$-GDAh8DUzmUhFT}_BqB*35unyXJs#QEjLYD26F-=nUAMcI z3<&=5Y4-DJ@DV*pa}%K@5FPT|?V5K-V0iig=~SK=)N#|e8HBZU z-1dP))=Z?0r}aCKeabbi9rusVpW#s^jM@!gkmZ*HDZQ5L5Y9m9CjO+yA06lpo+VPdi)$++hra% zk=`*j;%5wQB9Hj(u5&VX)YUTprjt*H4wN!sKj#mE85s3@?V28?fg-lkjetZN|KfAF zCDN6Y0@Q0*C)vf)53RKZ?@fNi#b-`&nk=*ZC}XR z5wY)h;4Y23*GAoI7wx&z9pSAr&&_tu7e6$cvTaw6U@f&~ef7kfC#G9smf{C#nO9z4 zbQQ&2l~Gq^+|?L$H7>YTMeM5{IQa4fE{5uov~DP)s{`YT7`!*#7*{A4zeWuKyLOz7 z8bsrmF-VLdyVMb&lE6VqlU+fDFbpc=BABJbx|L9l96Fx{l61Ko@?@xBff6cGLM3wO zyaj3G1k2@T!Spuj)uN0!c?Pr_bn8(ee}}qyG^v;=mHsL@R{fR7vR)2j7OyqrZ5f8x zha^74Bzn$wU-V-{2fBOx9??G{`U4POfXy5p+S8HLH$-b~z~4i{&qobL)<0)3o51(0 zSU{Q4ziGT~G#ajETMT1{-!We@io^ikHYPI9cL%yCw=T-fYf6}WYZJzc3>SJhBlb9b zCyh=}GrL15p9WmT_6o$WA=yAaZhu3V@@~$CS>v~M&1A=OYoa+D{*kR7Z{-&n^{Ya2 zN2yAs!SFIr*o1Myq*tNKM$uu^B0Pm-kg8ghR8{dT)z>Tv_(>Qqh-``x=ENjqQ&6P& z_VoHq0V+_Bn^eE{A9T#0yu<3akXv&%ck73lbKMJ#TNiS-MswPw3fDCl4|=l`S#86? zBao%}NhAe|+uk}b&^Hq33nVN-V4Z~J?C|hF!i;qoGMItk?qDK~@YsO=GRW@kp>zI( z87qTG6hy)r97P0(^1c9g>3|zClhyh^CdW$o4y@ z|MaCFz4Win#B$mfT#TWKW>^eAf>%10xfdhB5sx1_aB8RZkEbT*sM zfI*%xLqJ6EDc87${kxiPfyfBpKP`URiI(*Xp)<%k}Jhcjq#=nHtd zJ?K!+aIXhl%Fxl7bW~|Fn`}8ww>!N;z}qke*sE zgVxAU^8iyrOS||Q-H3l-E1gUP@}ZP)_4W-3UFt{T6#)J^{sJ%KhBeG-aMjMVE@Z8` za%jn9v1Tsj6@O+hrh6t^7M;289G^NKuD$21{J9ygNEVeFca%pRZu-7-^N;LC+-XcJ7mXRZ9@6x`j)k?;h%Gs6#re(s z%1Xo_*v)U%qfziyS(j8;z6nH9U2JYxu+3l}GkdKG`|<7`arl(Km(v7w_@FIm7}Jnu z!+0kGSX7PU2AZ4v66i@m-|R`50_;f{&|`+%rnZCVA1}U4xTH}P=pqq-U(~$d^4o-4 zfw8bE#3Wx+_RT+o;aOSqruqKmB{Go8XOiz2Po|9>Uwpwdw|D?Td4}x(?eM0q}k6hPNW|| zW%fgKc|jz+d)vSf#72b0x8&Qq2n1H+_BKR<7HfU@HwssI5z$jAdm3XcYSZQ@!KK4HWD5p8@}2mBZP16+D9PX?+Yh1n>44x=q~6oSat zjKXo#l?DwlWd2Y=w}4W{qd?y%IS4?*T?!${o)i>2bV8GwF6tepJfv~2%>#&9XVPl( z1%yIYQZ@OdEejwNa#M~ccBxA#AFGMV6j8mDTv?nvObqNv$&Wn|wqzF=a&sHj-EZRQ zpx4QIMf?psh?%%0(gJ+%ERiPyZTE@(uHn(($Y`*uhZc{7?d)hTct7k|(dbXugTq+u z(UFOCadLK46w(UdeU+4%l51hg`HU6R0{C%OMX!owt= z*CP;g8DxVVq?{6yb}Qor1(U9R8WJg&%s7l2)p^AB35=nt0}u}ciB0Gk9vP$Mp4f+; zQITf6XL!i(gP7Mge3mwp5^2D{*z@U1q<3)+7D3=-A`TI<@hxNVH<5e7Ldi+XLc$~_ zF##ftg-`|`Bn0;tcn%!E?TX>2nYr(LW$G*87UEGCGFMNU7VR1DIHnwNdr8z@65e=o z*Nt5w%%{JiE)0PnvwrtFyf>Uho*V8=&Tnr8#)EE{! zpGci7ej7JTKw6vl^ru#42myOuY+ABeMu<*gLO`xlDj^4NXZG-yhz@MV?TX=coZ^8(&!>A!iOn9Oc*u@5;JGYEaW3~&;h>Uglj zYi3hP{00gZd9G3TZwR6qHy~rTAuH#d7pGqQ`b(H*g=LsS&c!17 z$yBG3*VNXAAy$VkLTN$2uN`~+x50vDiC@Dj@#}QEiW?yZVYsKOOC%W!C&TQdXh9Vb zhv*&AUA(}96#8H3_91SBLkJDvTT*e*5N2$+(~U4jfD(Dz@MFtb;Od6ei&b?$PhV&C zJjf|uvf>vwK0D`n#jF%`h->}$JiNoig2Um)Go)}g#uhQB}{K*;TFAl@Uq z{V1{rf667Jv4?NtRdUINbjEZ*WkjFglo%5m2+1@CLzPdtB$zZthEh6;5KRS?V2D(8 zfWgT~6t?(B{NN;qdd3cd@AHci>lpIw^GJJoXt{2Z!GaTkN`nW2ZEPa4i4yb&5CN(_ z;A6wHO&>GuMgCe2U&clt#pKS^h<-G&3T7HJFbNlWcNA$Q(s&uLqe&$oc?jWOtvrMV zddRa(-4wFuztdOLO4y&PssG+4P$SO!Rkh#CpR{})B~SLS3eDwluMs5`9NwTBV>KN6)cHNCSdOC>0(_Z{vHy7m`D&rlDUbKxFw+= zCj;v`$a*eRyIiwqq0GpYNyfk$+MV*!AG3S#^p0~1Z;GOJTD*#H6yLMg@M)^8=l=}t zB>p}%$0v0A1G?$AP6n@c2ZmCpdgZnum^5mcS|q2}GT1_XCu=H;?_A%rS3TJ-_>hku z3j)^-V@9tjRMZZf!>1ctDY2*$qd@E*L&r~asDl@oG1H-%mCMY494Pcd>Yg__atB>V z>q#3}ndC);qdB%tH~^5a@j)a0kRB{lfAJ3~Xl2QYcMwiRir=Sqbo;OP3!K1>mW-_r zEhcNjlHFvjoymW{>{i*50l~T2hx9|QtHYx=LpMV7x_VZi*VRjQqqSki`o80qV+m5D zhB?b4`r$K^a?nSwZy_cHy_)uz*{)GURIW+xuz#Ot}OOL&z1}Jzxq_ z0PrZm5OQ^5Hy~XkVQlDDDk3G85CjQ?fK0H*^b6DU06e!cg5exPu^ z6~;tr`t|bRb7DgJkwWSv7%wzp9CssDi`FDCeWnDPQAZG?$R5-*b-7F3lvQ-EpOSvg ztgIP9nzHPY7tyzjW5f~=u1UG{xK#bRswILH!~|tiY-R}HNzKrklZ0w<LO<*U$q|r5!QVc!eNoXRfKJ!Ruf51BK`^8?$C{`B9tWG93#BMkQ3}r41s6y^tR#W zCbQMPlwqv}Ct|PM1(Lf`p>+v*b2f>s1t8&r!4_lBIl- zP&Be**D|zw!g)Yaf2Ey^&<{^__Yu1$?Y&4^03vkcdaxCO`V+?q!aX?3Wu}+T;}tQP z{i6ZSLJHW8B?SV~Si{x}w$q5z?;RB(Vi7%1&ZW&8#u+eed~mp6AkWg;%ZOfvfJG`q zz!MnlIZuKCzrt7m853qrNe%ly?6WrUcTv^UmXFdqy46w3lUVX?!)Mg;d`+X6qz04q zDIRvZwQJgG>~k?0_ScA@hYWj}{SQfoy;7`gnQzT{f>oAYnm_GU2|x80u( zsdrkhi6q@J>cKkc^jn2YzXOn2Fy3&{x(GNc;M@pj3fX>0%aMvj$icG<<}zPr?{cNo zZ9*O-=x*VvkdOFm;Tu8$OO3uLL`;tG>kPhVnL6b51BItvtPYf`O(;eh`I=IcAeRD^ z;@5>zl$=WUqt9dDHm$KJLMG~@pkW%Z+p$Gr>I40m+4<~ zKT#$rm){ELmXw!x1}^bzlmdh|!FX6!WJxlS6tjmr4-B9D4uT3CgC zTupt6(Qgx)@V0?=p4hWRXvVjVtUvTylK7UC3vJes@(PdAE+!jAXocsVgz#tin!sFPrUK@Vrs;ycN%z07vFsn1UhMGO3(_p!wgO*RSn!h zz#U<5-%80Ej~ci`fIG_INa-Wx(!d=C+;Ik{Gx9ZXM*!Ex;B@AK2JRWaonUY?DVgF? z19uc~CmGy(E5aQETswoCT@mg$;7&7h!8Vu+osr1=-@8Q1Ksx+ z`zJLk?u&x4vlEc^Cv)*XPb1p@l5mR9GSYh>m{bnQiR6$e#Vm^CkA&t2|$3&*zlq zG4_03c@DAXKIQo}_S~;LkF)0s%JT$!9#EcN$MYMS@?2rhYI)vd&w~p5TmE06nob+_ z=8>lDhBPzpSCwy^E4I(D=9{ldxqz}yy)?Ouphc&Y)bmmylSbRCn$*9pd{eaIH=^d7 zZ%8F7Tk(qkO7xC@8nDZ)OrM{|W5)ihwn3tq{ARRzwNCCv!aKkXqngtG2CtzWMX71O zi<&RKDSfe5CkK`CzNGo$TS_agTJf99ns0v7|0|$5zD{k~PsldqVr3hXC`7vudfTdS zOxLCM*TKe`8oh@0zac?xOi3J%8pv@#en)~NsX@x6ftyAtGbW#&B7>wvr|LGDdS z5RaNP-vHz-2~uxOQ(OEBAipO;9$qocHv#$E66CQJA>RVz`x4}{D?tWY${XRt`oDxcAJ%5E8KRkX@or0PXd6rPGrbO*DQCuI*#3jGD(`ZlvsF8n zM82eR(Zyt8Pz_*T@IkPKK&jM;EGSV7i@~n$fxd2t$e`xNcC8XwuvEpKGE57GyL!9D zL^hcjTo@X@G}I-f#SUO)5NLiq-$+_gc%y>0`6l|l=HLRTGlRmqg?N}+~P-9V8Qcvl8J zKvKZ785)r;)VRE>@#Dnv=B)_07T0fmaS-IxcIMg~DhA_-&AINd*FIcb(p*T!LZL*e>mb8$~uA=K-SK z|0k+9RG8f4vI7F)BDFcqN!UnWi{SOC*JnB+s(MwzJQz5au<^keazNvz4I1FgDF~rC z`J!DOhV~93ki0ua$nEp*8hv2lNxntq2CEKs_YH7`sBX`82%ERRB3rZVOY+$AiVxZl zgr3xah!;!`jYxFyuW<`d`Q%}ku=FD7P)>5A(7SPJk5Yg_`7f(>rhT@4uJ#k}$KLsl zKRWY+GYeTqBle?Db`_<~>i-M^)K!<4*+&ZjZT6TnTJh96_$KxGj^SMsQ^PAe1S1J- zj`}ZoMu+-f2H{cXGFQe+n1Wqiqxb+xh$&s4$b%{u&=L$nyVTD@)ydV?gSkS@Kn;jt zK`IaBckSgf*-?8n^xqe=bEjM4dERKAHk#b-K}nAGhe?xw3@S;Rly479 zyT#ZA9vOyN5)|U#3`Pj}LRQZ%&r4_8Fn<0PIf`N266p+?(jTS>;frdo5?q<`Crf|i~Xr!?Dp54b96SgPA zumgqh3HM_p^iV^}7c~xRSP!rS8rBr}Px@Q8dQ(rlrQf`&mF#lPE99HM;Tt_(Ms;IwDOBd6sGI&)HVU zOLsB|pR+DwX13BZRXX?B7#ffAdfWzFV=FI0&gMv2Dp$sU1x-J?P59+Eq) z?V)^;D+Y6?TI7ubPO2Ioo4nq~R{uZ%5Lpt06vYhk+dwZ6D<`g_+keI_VdI1dpJHjy z^dPb%k)h@#<8Yd6;u3DjIJ|&o)5Yt<=@ir_RGT~t^`X8-v+`df%`1kVLoc&((UnJw zU))uH*Hyph&byvqpMp&Y9QePDTp1+_P_8VOjE_qF-cLVkk802qP3d&=)1mdqy&o-N#R;J5p8} zk;t}G{KxzEpHWK_jVvuC#dqz+;geB&#h=@YIi|A&g8q@Db%RhFLvJe=eB2lU>91W+ znF^Wv1RqOOa!MMiWB-T*W$l{B2q)q0zsHMEe)6c1hU5RDSNM*oy-F@T*Qn8=W@XL0 zf@IO?x|G0`Tuf^1SAeAp2vkwo$4UnFMGs0pO@?GszV})}buae$2cR)7de|z){qCs? zA)h_Iw#T+H2KU(RBOiN1LL=IXRy8(RlcpjqX31000rmmR56d7_oZOO{sDDnaxdC5e zC^+2j?3~&eaa5ANO50Q$jQl(9IafW9p8PilZVZIKGP^ZWx^Ygp=iI?ZH_^oMr3{k2 zc(YtXzez6AbQ@ZhaZ)p5*qB4>TA}Yw4MWu+ib2+iU^Re#1%}frn%caAakURw%k9*P zu=sblX$My#9Ze}UObQLIMEnjlOBp`YG)s-__9O6(6VTCd*7B)h4D`_Wk}qYf4d4w; za6N+ua%>@+cCdw8r#VzDw&j*~j7t=gE^06+YHn<2b_1|t0N>jKJv}0@G|l5#Ee*KU zP*Rbaz(;fyX&Q3}EJma#+i{r?=Fa8V@S>W5TIXD2!Wm$BN$psYGQc!(ze`QI8sCD2 zv>VbhCDq*g88BXTggMEt(K_&sobs9;mF+p1b*4Uvbs5QBCu3^e)=eUsj4g&U5L>`N zTX)bww4<5bR|{arZ%Q%6hOY68c&iv)n?v7zj(qTWx;xTzNE9KtJBhqowmUPJaD*wgg^H3pQ;qq3>PnI>P*+;hvt>N7 zIp(ZhEGmcTbY|nUg_cUPve-D2f6v_jL+i}OU;NZnN=De(KX$s8V0oSWI6!3CTdSH4 zzmvYrJa61)P8csItvAX%`dehm<`F(fy~KZuUezKX2_W!wyr&dWED0RpfXa^hqCilyw@R5_1x6xr+~LQW$M-71tywP*a9XdM0@fJ zUn?b)-x+j?coP2gD?&pRHo1*J{%WktKY!|4Ob0T@7OH=qL~EEsQ0FGB4{mUnEdw9{ zV75xH;j+m0*qG6FFl3>5#3YDNY5or=oA`gxt%Gh1|0gJPpKgDFTf)ZIQbse$^aq?_ zCoK`|!%%MWJYY-dpAaOe?9;;FdS}nq_AKTW#&c`$=GIEoW!zmAbyv;Q&gOkodAl-N zy*1|EhN!sPbJy*eX?g#|trJoAhI?)g`_LQB14>&;L{^`UVUv<{ieblRy;s-QIqH-TIUlH5i3 zFA?9)OmtYAVhJ)O(xlg{>1C8f{lZ-vIH}!fw6fmbhycTKsX{cC9;LoO@a3$Z*s4QD zA#hu?DQ2%y)|_u-atcPf_|jCN=ZAlYTawsJ7tsKDm`HI)Ud%B8kTJi;jc@J(S*SC` zFf~X#mvS-pu{Fzmp_;od3!&6w%tZe{Kdsp(fXqZ&gAN!RhW4q{$XKZSpbfZ_D|p)p za=JibDBxJaJlK7iPbL!7iT@|vXbQl4b9CLrq)crAH?Y?rc3P=_1?Fr;`T z|U(%l4}JT@YRbI)i*EP zxBxTn6H8V@)gD0e(d=ZSxr_UrNE+0H99eJvK6*jhn}YFeLr`fi=9fvgr&Lc$7nBd6}SHB)y&m2~r0V1n5yu(OyWFq0lm&a$#3VOQbYdu!|M&>yHB|FWZ;S z%l1TG<~P@joAng(W!Vn$1g*>*D5XunOP78v$J4+L*~aYwF0#<>iIkoo0mx` zO>S>S80)o{ZhG2!ja#OTVlnd7S=1PRlAh89coghvzC+o|lr3F_S+;+UV=OGwKjXH3 zW&cer0o>naXvL|>Td&qOJ(J3$S})TxYMHN|KyUm~`WwBCQd4ikMeURQt=H~*mT6Om zTE1m!uG^2FqvlRE<+0^vXJ!(NZccCdmMM9b`t6r3`IvRg>UDLm2Kr=F5qW7MpW4iL zm^c7386Xy!6Ge(lUG~sGj^0!rVV`Hf-z^YL1#^YLZf4vi2xO>`#8Yq=Q4FnmB=`Lp zwD8gecRr)s7+p58?;GkF7==4I?mS%n08&g8OS}a01Qaw~j$B^|I_Qm*72?{eg(PQI8$U;wE2MmXn4kBO-#Cm!;hFiiej16^B z1XKYKl1?kYQ8(~jj(9L2)CrtoT}7d6L?zq|t_z1?T<8|bOB(VL&n2wvwWxd@pf!h0 zF}g8=3NEwB?w@)+mC{urenRb&fxd(9vob?j<|YVx?Q=%kFMF z`f1KW{;@|^#6C2b%Q7O&r49IwZP&JaW-z7KOsbBpHEyf};nsW3>Ln`xNGk7HEH1xU zdIQ|NDbqV`Re1dvVkEwQ(@fnxcO$;Y^kQG#T^4aQELQvC)f=PL8yBiKLk^I=;o39P z2g3Qp^*nR!nVFoK12daujk9&Lg^|j2_wv?5Mv%RM_^VxC+a*igMkSsHHgT|Dp13wK zj(fmE6;F?WqpW^-nhT4w*vz8ihvGqcr^(&m`krxgF@ zjvG5>t(rF*!K^K%;ahMLy4Bg7T%DSk!dcVorrCzMoJi%ydwDn&z?i+6_VQuwrzs{Y znk+22x#z~7+18kQy1&t*R8Bu)GqtyQu@o)@0ZnB@>beTlo?Qp zx|CW45cil(bTQIWQJUiK=q{(j;&oD>^hvvk$ewW3MKNZEe&^&It&F+bbeLz#P->v=fS=>cW@*aE#ePbi~t)#woUUh-}aRWgfOkF3^oiZ=`U zy0N-#*wgm2|BmZ%8tYrZ6G{ikjWyj@?Zxu{eN1XDc_)QIR=|WUfZZ6sz?D~+X#Nq! z(H1A1c{7565SHrk6x;9uJi?DKF9f7?D7(O6x>Pz2y|YI~aTJFF*XIv}DwB!FCjd&Y z4g_Atd;!%^V8~sykh6L+?SZbVR1(;erzE(7dU@*Q@D{dG9f>$MOUu)uyYPDEHSEO~ zE~QyAvzDxBt3Y9trNh|0Zt~!CYk2!3x1qQ)Jo=r?&kT8)mDnN3Eev0b=GHCNG{kFm zMr(F1)a;%<7~Xh|eEVhR(?);zV$97p{k8l2Gxf81x0+@uX5W|(%@2H9^=ZqeTO;iq zk;>CC_j9yvYIpoWNl2@yHi_^XG4~n*MIJMGGrhANw+3duGPgZaxjW|GLlIi&#ez+9 z{daQjRL>1ZHXU3nfZQtl!pw_kk^Hrf%;xMIUS1_z1iqd1nHQD(c{Un=ix-KkmM
#J%^snSq1FPVaB!V$BK@8T*am{H!%mah*YA)U>I|l5X zSAV@6r?X{fXGCX>lk)_GY1|4n->hBTuC^kNEV(KykHQu6utFfDS$D7c@x3A*VBhC} zN&sb&dL=nmz7kZ`kri>nTSka8aO9JI{(`YzQBzjahS)%&0ciEsie1Lw;s~eUJT?Q@ zsOMUQibjW+_Ap$#b;BC~eEo}~j6Hvx0l>jNX!8!8gD0EcL>_RF3ZMYvCPZ3LMXD)R zzH!6FKU8|*m++#W9h)UmD~hxLlJ{{#BDXEcr8h%K2}?he<>ceQi06QtMJS2%Lf;t* z07w!W9;`G8D^ny^4+WE03>?veWr=(6OjQ)nL>(rC@nfV9PZ!y_leWc%ruQdqO~f0v zM;o@s8}>#U_AWH+|ICn)e$W_o)=VC}c4GRu@aaWYeyn))UDs+%t;OuZSn2A!*%W5; zuYRUzHg~oo-n>8Bynms&CDPP-=j5HyJAI$N8mT;a&wUDCe0TTVY;W=hr)LilUG3h) z5^TPk-Mr{7AQTktz2~m`X@NJgs%4>|HR5hv%BSM|ya1ZZ@?NE%d5Xe|#nL2oxn^Pjvr0b3p9RSM0QsUKX!Q*^9!LvUQ$V} zSmPzl(UNA`Jg%R%X?qfAHnaXGu6()o>&Q{c>~jm%8zWVl<~pGZcF(=VeFD75yGue?99 zhgxedwH9G}rLCMj=ZA*_ehwQ-QJT=ky+W95wGw?D}3>aEq5!nOuiPeADZvP z?a9@J@?xt?lUyyTXv(F*-f*@_xEET@rZ$|hi4kEG573XKQcE@jTDcT-wCT9NR2^-+ zqpf>syKOP2AfAH*7-|-B>LS_oGs5h~+4_iUUBteQmzYW@UkYFPHyGkHo%FP21&14zg9>T*8P)nR5nQrsx@*7>M!1|Q=jCJkRg`@3zI`|_HU45)L$I)B;hN-WWI~d zRCzoxNx>!+QVz+pmc?(8->SbVEyp0XsWEaW1!9N%Uj5ZVd;z@hLk(W|CC$c(4E+{| zWF-SF=F(EpfLyV?mYtJnUvy4RIP^=!%H-CPAb{JYwyPW(cc6tOyuo^Dj~t`^jw_>w zLF`jwp?oAy&yE8jY!sJ?83n?9@YX?@*DM+86Q-u&vHo3@kPV5>FPyUk1-`(P=zb>W48V} z0p2fX*_d1{SNNjg>VKAV_7;TJw2TgpFgcX6mq~&c$a}is4Gm|Skj4tz-DKK_zBU}a zjlE7B$Zg`=GilPnA|SX90co(8BAxIUI{!Q*Xda}7qwF9!W2s>;Qkxw2sTKff-v^({ z)jZ{DWxLTc2nTJn*El>#3YSb#Ti$s@`H*z?=s?idp=Nq8VP*Mnu8?-2V0^Ltu^D=t zkDVlBleoa`jQ9=}fiGlC8Wfd;#%jiw`N4#FLd70(DNcUdpy_-O24X^W6B9J;;(Egziw=aP}p02nPYZlx5+z?BXkBp2rVn4tVYoDr`9fR9kP)MIk9 zMDYktqtO4B9N>!oK>6=R2z++~g}roR>~T8lDYBhSxZpN@ps%M72Vt!LmLoy;jHOIO3fZ)Ri6-grN+EZp(Uw#oDdB^8sd`xRB+@ki{~{K}rR z{Im%AhU9T_p{VIIgEf8A)Zxhk)47YToOdoyT@G)(>#A9-uA6pAFCwLDqpr1!?wYu} zA?j|JHGgEkZI8LvNg9P=>&?s?neifTw8%SK^HJmN#)YB{_naG-97y?5mZ6|-rsMq= zZ@m~WXo!{$ird;Z=J6XSa(n^NPPqenA zjUKMO>Am5dIkZsH6e(_=Jqg9MvD;(wc^|wH@$F&f0pDqf*^fwimRB?B98f4+PPf9S z7%ydA_n5ts*=#mM?G4ykwEONS^_VNYRO+#u!t2e~nmPY8bKw2Mw+=7lH1myFGRSD3 z$(^yzyc{WAA9HSyYIybdk|{lN^<2^9#+}iUUDIjk7%o(ushP>2 z=?T9Ub2AYPbA>;Hc3*|0a0YVJSw9nqIagD{$EJ>bqiv}YC0p_^rTzM-y&j{GD(ISW zg)KMJZ=~aBVjQ$V)vSryYi3&KH%9C=G5cOk&F5;d&m6OFp%#J)=GCkRI5VOz;;M|; zD}V9GZ!{EDe`c`p@p9zaktLI+HW-EReWZ!WadcX zfW^X+X@8`2!`y*S4u5=jZYNwY?=_Y$mV0i#aN~vWu~{QYX;=RjCZ#pwv&YOU_P=Vb zYjYU>^_IG}EvA3xsB7D3{&yRUblTQYYXb+mTjH;gWfqZGo{NrjViaL+QcT9X8oe&~qjrRLDntRpkJ1{>6rE&C zVPIV4zzx{`sCd-JP8&{A`>`N9;xZl{#7$9W0UN1R`_XSYxtSydm(pYf7gNGQ=U4Kj zv-Qnd#;dOL({(x2h;-<6HNtNraj4Z} zZq%F!BI2w>RkuaB=W<#INN=aA!pbaEoL>&=FQsY%yUQPb^uxIaWA@y<8E)%?Txsa zX7|sI#n&8(t~nC%9YgGKV^Vaa=^0XJIcEHOvn8FMy^v(BLdbz3h_4`Uopw%icXh~z z0Hj#Ds^o8GkDEwns~`Iv)4OJpe=!dPzEjdcK%VoXgV^kaHH5%S>qmxRmqe$E$n%A1 z|Ankf-~O?M_J%<~6Ai~YN|si#&VL_olckk*Ik{BtAoBY^pL=O>^S1f;>y36ro>8-SSPI`zGH2yIB-&V`-WNEf`>bPveBU~~}6zop)x znaU6glmg2$e&Q~hwoLbu%sg-M{PfvyLD(L1RzWGSJVVl@%PTNGHohj7p?I*uV7P(t z7Y>#uqrv(1l{|PDQEg`@zjj@?m^^}Vo-8O1%}(+(^CZNdQMp@CZtOJW7Ls}zRNBfj z9(d~B&%Bix_iT%Lwk>#e#6A0>o_!0R15jxzCzZCmj7dB8V{`JR4^M9opNhCV5xa+r zoKYF&Ql{#^z^mm9U6M=)^^FXbZ9>L4YjcpYN>L`#gV5~uVA|_JXq08fY~HlcCyEj< zDez*ZXsM_|E)xF1>@ zqa#c+7zwlCs$FhxW(6cy0xaYj8 zuo0@2b~eHK%IlH5*EuY9N&IoBN@0rur&-y2%KK0$K8JgQlz9F!REb{!Zk$F$c0?>V zO0e&{m>Yi<4!OaSCz)1~`8;D(=h1B%A3cdoW=n+mMa>)tl_n3{q{sytv4`+In79m3 z%j7{MQixONb`#ml9=6BqJCp~obDKcq%79yA_H9a>_nv*#lRG;WBu)eOVLxumZdegS z%7t}^zD>DS!iF;K!)=PYPhwO)3r?N79m?hk&+Xy6%Q$dJ9EPS8)RUNIw&cr&S?s|+ zmQYlN%ooEFS@K-(!I*+<1#%czpnP4M=0n%dJj-ygj^sy4I;WHh_lkO613ya(OukYmWnjT|zH){dTR+vzY29R`3fcg& z93s1L?i*WpB?nwea;nbz=+Ifx3)0p>focP4{VVhd-*sj9m7_|QXP4BpPgt&t#D0Vt zlSkt6Vw49oEbEXBhGiCG;>x4;^0>V=YOlqSwP$XfiPyD8>slA;4&Ad$N117H5I*OF zZYu&`WYEbAt7MkG`q|+T-Z!#Qg3`1a8lNE`G6iHUlQ2WV^Mp%_7pVRXDfM4Y67(~w zK5empI$;izSmmqWDMCIGitT47Q6Myf*gWf8p~_+A!_B*^pB>@~^Ft}C4TPt@eA@gT?S;2J-Xvkr`Wj&HwY!|6N zX^I^xPabe7(T}O9v}Fq_(Ulu_HATV1oq}95Vqd#L({FxiNy*qn+Os!~L9qusnT2_N z0~bK$7h^~wktPu@A@~O4DqG?k6q!22#Ep0xs(7+0GVw$EAOA1ah3II~t;&yQ`=Z&t zSuvWu9%@#O?CBTpIw}@(%NBErri;Qw5m$A@Ui~DApfFElWXn1OIj3GSW=5r!b!78_ z^c^vy?^=lAYzw9PaP}fBuY^X~zseP=?File4w)p)sw@sGcV?(8x%SDiX3U5H>8qgb zq&ZR_&8c6=X#|@%TRgWhzTuhZhG#zAw6Ni1Wc{hgsrHDgBVzA(vi1tjpv{-%hGGC- zWysH~F7jr+o-Z00gT0YybVG-k_MO)JS_ztq+0Tr6RLJ^)A z2#G=kpLao9NKGMBm)tzdfZ3>>YFRtMk|ge`z3Zx7%q@a`T{tgZ?28uDh$&tlajlQo z*FQM{EclYz=;1TCE!RGJOP6|lx;%E|@u95l5_QNtA`WzqVIPac51fc2OF@OoW4>no z5(VJsc$7k^XdsUvTmEsEOdh8CN7RFHQUetsNol#K)1c#aTJGPg`Ci>Ud*hRXMllb+ zjOO_wjUqP%)83_~O}PR^pu2VKS^`eISM+bykDyj&VuRDvVtB{gV>$;9T4%Ue7J5p8 zsRU-{*PRu`Qd9e!kG)(aU$}50@!Fxu()9 zzoJhA4Wu>8lzF*tH74QAY+NsWjediwWfdfqCw4vAZ_qqDqG*`F#z-WCbW#{hxde@n z9p%;$#Xq&Db<<_->SXlSE%k){+ zxJ7VL6Ji9owYo85M#0gqXr8GJ7Oa%RL5~tr`#{N8)~HbC5V<_i>s4q?U=htp&YN7D zjTw93N}|U!VZLPW=7xq91_{St4h}>4V8DOTKd>AcWx|-z5dnMpjIGL$8ElDq(i$z1 zyA?V`4*q6UhJo)PB#d1l2c(Fg7NJZLc}-jj3j;+FU0TC?YHPgI~fTJ`8i2gAgC0%+B5CpbJ5QU3N_KKmB2~pNghx}#BPLS zqh6xV5*BI(k!+e1&XLixP#)-FCSF{4%TgqxnnXH#3%A^&o>gxy5#OmxTvZAg@Fa+v zR=EF;{t#J-cb{zy~{j%NQx#I_boX_ECag-xfB0ZTJ1$!tYwb9pA}V z$gP=dSxnlLZdu6jVnf=6+$-<8DrMd5(%FvL!*eb3x${=pl%{|IdG12nThjM0n-ykX znCqCYna`KqZ5GgGGi`03ftqmRTx0(@;{^@T zf`(bkLP7JinbM?9aWe8bHEV|R-_quLZr@Tm5`kckAILc!BoVjo|%1jU3GHls&>pD`!xFpCn7uAKJAWFK6}r7@_S{LIf9=!iNagW+?zSa|Vb4)x#Jddw?SK4iouO!3fb>m%WXn9f z#qy&(3+_pK)#-?2lwKJK01!2%H`AU0wJ(z_ZyD9o4}iA7d8A%=t3%SrNDqqB*c=%! z4_YQH@P=a&EC^dCtV{~7lbW9TwCK{1BrsD7p$G~xwGBD6vFdx2OGiOkunPJr(26pt zHg#4?MeSCtxo8s7hKzz8X2iNiK|vxc*`=q*ESHfyzr+8HQFn1sQ&80Ttr#+FwKMGsZLYPR2xO2nVNJ7mXl_%k;lss;SK>AK+1*3zvx()Jb#P zLA9B13XX9HT6gWZLr>8eYRrn_D%;anrI^W{Ubx*dGkS+HO5i-n!Q|`MK!IYxz zs-w&;w=v6a(~~Ky@j);){8Fu#CQL$paGUbpsCR~^P#}+0^wAoquv4d{T>U!A#6rGY zrwNyS%a6NI+rp$a(@%Y0N_KeE${>Xzj4)GIl?;V&wGy^pHj0_7bx1!Y<#GaVcPX=T z+|I~*on8})<+`wxj;17oN0oJ85XW^ObXzwm-4mbps}yDFlRDp-grW~irY4Lhxta@4wOhHCxEI18Mtn;2H$5sF7C*R3qjkz276^W^K zV-42rO}t(AWEw*CxLcdQ7F&+P7)sXKW8?j4efPz&WwuZ>p53)tE|&&#rt4zP8hQRr z)A;AlrB)sZD`M%oaW|-$dfW{{gLYM2CMP|Ntr5_SyU~s$ zjb@kr2oM_Ok}ZpKl~r?DoU7X}N$Kk0T-~q6v*q4oxt)|tul|l>e0&j{3zsUtW`VCp zJ<*WheVYtLJZkE4NJou|obl+*@>S!x=&#l9f|t-z5<-)1j?FB`PB|a-S0~53Wpeb5 z=Ot4?u!UaJ7RnzQ=87`Re3>*HhA+X!AOm@LjfpI7ODxMK@Ww8OL#0gbp}%jazk9t; z@ms=99P=bR+6$08G+Q_|@vpS>z`l!6v zWyR(R{0(5=OUX2}wi_BnDA(uyLaaw=LPe~Dn4Am(Gwd{w^BbhJJ>=lUU~fZZ*gi+s zj&1jJU+N~u?Evw0_YA-kyU{D13)cn31KRygSOcTbP7!ZX`q?OwEPGC_~G88322Y3qzzJa$uEo#&QGiCKaxbnAem$KnHf}*~f z@tS0r5!Z8(`&LIK@OMdqMABKVYg~17zG~*=OzUjXT-97|ta?+l>Zqh{oSkb7ai8!3 zsut4+d~B@OuiXkNkOtIIR|OKyU4kZ-s&^h`N>UxvSW7 zD{&3om~|8xMlm}o?uUd)OK%X|U*P7==eU9?1=G0YhXg5&K<6h)vRWqOOxS?e@IT=^ zPktbPh%mteBBhs*a8?)0rv^t7R(29&!ZtW8j1Kq{=Havb%#ex;PgyC*xGIs!G!}6t z<3$pnCY-#V_){Ps5VE{G>6aT_WhKvn)V=5A*j+SS-oVB=1gh{_=rWciSRtom$9a zJnXwNZe-kb*1)G>def4V$^mzZ@12gR@!C3H$lo4yY*%FA>!La9=AfvsO*PKy37?Ks?}?P|jXC$}7?iDE6S1$s5p!AL z{O?vS)~&l+_w0OaeEYM}?axLwKg-O}e(Wfe#Nn`Oia9qj9h{=5y(pXy3o`apfm52o z!JA_@#<=N~o-r2x;t9*E&uj)~5kGX`ZZ31Fqjhy9ovg(V6}Wnw!PP`_YvQ?0cXOL$ z(RAhMd+z7R?-!G{pNzpp4}Z}0*A=PU7ISYW2yIT`iI^K6doVOd#F6)*5c3%v1y9npdv^9L6S z4)Co6axn&ryGZ?kNM%dRjR{*2UKNGfM#>k577AKYzSuHvnY%oH`BTfCi=X0XvJ)}) zvy0BcxD!6rD&x+ksIzJIG?@T;YN>GSEC_6(kRwy4k5!}$rZ3@_Vooo6g5F&<#|k|D zofA_hV1N0{jb~;ZG|s5%{EPXPh_j3aFt-8x^|qxgXx*jlWRVApKM)A>!9RNK2d~Ad zjxH1(os>`Q375{CnK?1HK2o@OzI!r@Yyb;Ou3x@(8OtqD-y0vl5vx43P`B~_x;fVdw7zm9-LG>(}NLj+jLB^WQXU{R|_ zEaj4Nr6}#wW=hKSf%FV!3+8x|@tjfbd>4@fLW&lKnv5!vo3IR#$X3zMP+{a;*pUJ{ zyY}KM%aot=If#%+xj<~o?8Y|aMzkO(fL_dA|6Y0}hopQ1uV0mS1K^6RG8hh(UzU&aiWGs6GKyJ#hqX&(BsWzr#Sou{Oe#Ioy^MXUFq>wZ6} zMRZa?*~*`+yZjYull3l~QmM58{L}hX(Q{DK6GUmfIVyWw^?=)xZQ*2o*2gpp+8&qcv$BkhWfFi; z0U+Q7L1t5ZoGyJSWIyBe?A+y9w>`9aC1;_h{I8Dok&Ym@zzI1So6Nk0R(nGw8b(>> zG35-bXI@%+hO1hJ@;PUm0>b#;$Jtajh4UrGH(_OukJA;F_i+wqdbK?7V+TD+46xVD zc?QNVEMiD-r3m6T;JcJO;0fZ}#4(V{XTmN@wc=F!-xK_Pb|a85g$_^%o5PBwsLD!w zlj2E%HpNC%yn}bC-s3p2zMoEQ|AZ*@KR}XD?sI1oY36=s_t$oV7$7x>I=15ueFNx4 zk`3t0N$rWDJ7ex$8X6=&oP8~0+DhKVcYJNfVnGRCy=Utd3f4{?dO**sq6MoK3YsPl z5s>79oR-(}4RbA@9QpXj+^#$JNa>MJH^!V;mf0~(jD8?RhQ*v+^THqX{h)9D%%@Ee z_w&dZ25NANYA5{xnAKlxWBQwwQCDT$)p*y{ID7h|mv6ruX=ZCKOQC7D`=DU!m+ce zqPevTx%H8phDgKK2s@lgQ$m#%V&_Von}Of;W{DcO+LjbxWi1W2#LJqaWz7-a{yWDP z%1%W}+avCdM^a&7<3uMfoxW%1hxH_>Dkv(;vsl4NRiPiFAoU8A0c&V!0||iH*y^nB zGA3awj4d@aI8HRN^ZPFB!qv}P%up2{T~(#Ube0+uN^eHlz{j$ zEvXgQKdp6iDF-nPN7EQIM{3dO@Oop#LG&F?vsK0){ETPfU^uKd+@gt#JN%+A)C7Yt z5`)725~gG%1mUJ}I4K_1lu+zz=1P4GqjKf8cY)ACn^syvq~ry-BpL|zjgXlq{9p&L ze5_6pl|qE2kuUqmT0&m%8oAQlKJ;X08?6{5w`r1Pt$cBU;4~#cX|?k)%icyf#@?E| z1o>bu3d1CFh1AFseCdo=KB!hoi>2-DV5@1HH;b<`KSMdV4LVzF*s{aKX|&>qQM$2J zWj#U(yIcvbnsLraT+FD;O$y#BS<3CSIq zIua>pxg-4Pg&$prIZr|Ri>#R{qK=B0?7NO?Jm(d~bG;HH&G^>jlc|vgVd>ISF=sn) zzr0M{FR1?JP{dtJJTzl_6%i3Ki`kEY$!7!LrYC0hMRMVa zrGX-taOqUc-cAp)EQ7y28MB|Fx6JDbl|P%ER#@j{hp92?N8Da|*IpWaHEQ?#xgLHd z8jeQ(!%1N3uNuB;0*==8YamulErX*~`WO&|?^7-nj|tF*O>%&ugPnsJ^5=SLWisX$ zJD!$~p0g6w=d_ZJSujtSanzDR%cAx=rP57J;TwVqj>Wm05~nI|6QI36wE1Z%YwD}R zD`{ej;`f#*X%^ns$x!Mq`UZ%NF7$Ddf5>Ih(Rj^$T6y(Tz}p6%qxLTM6-trh z5z>T%4COdBdcI6QXY1!F_duLXRJ9ZVF^st<1p0snx%M_vCDPAxT% zaHT|t3gtC6g@#bQ8S=f(BIz)V4(Z$!xT8NvChprs8%CM<5UtqOqit5A&WY}PNOb+T zv3gADdUVl@0Hbcp8K;y3RxwJ9E6-(Y?8BS&JW2!)C5)sXR+JyNVdCds(+Fi2i&w7j zU88hn1;IS^`Si9_kMI-j)E!j?z8Q67Huk@O{i253l8)s~VxPXz#!S#cZJeW*Tm8vx zaU}+4r^;58iV%YO669wioI7=hqoCuM`GfcgRq_XPqf@#?;*~>(lEedzTn?Zl-bE=% z6kHeIljDxb8@*m%7c~ZLzrnl6_RwaHtYW3_8I%HiGOdHFiLr7@+tdi|QB!`J1pD!znuagq2o`V+0|QiwP%l+%M6n z+%lC3BK8v)ZQRO!s}yNOBAt{Fm;s0QrvP9wiB~+Y$e!&bB2wyneIind#1VLgKsHwQ ze}sU7HU}%nW|z}|$(;Cuye4?Da^z17WPb48X*%9E=2&;%RSaK)iZ}cZ12NZz#j;h` z((h-3!{(k6*F?+Ke8298d2{8l>^+NR&4|n_1XT!cjUQS+a@=-&|MVxFA9qF?_Qo>z zEf#qvkI2Mj@!GlKImi4uI3<}6#_TOJP5F7KOl@tL_(G~yq;ylvxmi2rnH`5LcF=-` zw_pQBf&4EPGjL0xv&Q6{Aa*MGTr*!zp;t&Zlco^4&oTOY~YFt;9lx3af9f(O4W zd;<~6ae7kr~`4!o7iX28?z+P^jwP z#F%4Nr}$01z!_`5k)l<%L|92vmAZ8(9IP`sTy2V^S0{HmCti=z1;qxBSnA4$^c9L+ zt%10MPJ-7hzoPa|D>C+Ube$eCiZl&zIB};R)owTq;~iE&+56C1iCi5F97>nJ@_N%a&&#kF zF~b~DGK}|Us3^m6@=56`QnU4PlQddj&x1?$M{*m;c_`r$HsuT9(>7kSF==tI6XuoBrp1!;G&po~5frJ5SOxc<- z=}ju;PKK7hlna{9y3_anYwlg3<2ueW!ESV4pc`la4WRJ`hzIco2#^Fo;z3d31AG&d zL{buITOf!AMeqU8w?Rp4kuv2?VnC)NFp|S&Vn+=}J8UMJ5T27`!Molyo$+iKPd4dh z18%6-I>XFNvXeP;W}5;Xd3a`L_xr2vt1qfaO7_{=CUL9ot-5vV@z-B}{q;XE32jDj zO)*iRd7zTNAUMTe-X#8l=s?n|u`hkqDJB{nJqpkb>Wl5A+ABD+$)JDD4u8=LV=z}p zXEn@{69-Vxvdlrv6@u_@(&cSj9;Q$M^^W;QhGoSn#UR|NF-FqwqbIp!Q4bZsB%&C# zu!vhYg@G-HNgt65@@+gw<{Y^=b7(h{&N91bF{XWqCdqsF60L(L=t3`QtzBfJ7M(} z{uYcg3k2bb>Jh>AKLpAcH>Ly+()DA~M{`zLPdWGo*IxXU|w9IB39jwE1Dl$<+NHxIdCE|oX!{`Zu zt%~eig&!s9%jITt?Fg!?{b)(<#NYDExP05HiJ{l&V(5TTExR5OQO)}L02o#6+BT?y z>+)%Q7?R!E0t^<67X|WddJAI8V$1n1T*!N!h~u&Yh8y`BtTSCUfp3ETk~hy_3G=N( zX}?lT+osj$FFn0&W^(3a;CPV9&&F!jM{00F9`tIA1i3_*?4=rn~^0#PM zf0r&XT>Q=I;g%-cOqL$ny<;a73y(ud)+PpX=N91NTaXR>q?-AUbywSVfY`4sueuBo~5autKU&Lyllm0{8 z^8sxc!UfF>juz|>aL%ODG_VIf zE2)6HcD~7mtt&bbixt#Cd?9!^TF@HKZ-b%kH62SGouQL+r(o_sZ>yDU&$+AxF$xYQ zK|^=6rZ-&OH{TX6-?`x0MI|$F2QU`640P~Nw74Z!ygpLAey(%g9xZ+&pF5Y{#{IKOee_4bQ*4&B+s zw=!HxB3+XVA(8Gkue`|&lUGOF)xp9AcjHoVMXb0nQVd5OKQC@u@~n<|S|Xm7Q1{P0 z>k_@_yZf6gu0k?D(fiFeaXOh>yHs2q%)5FKj&^a%NK&Ykp-FU+cfR|_PyO(zSpU9A z|GqniqW#Z@`woVy4lTM5-z%?rzxR6YvV~^S&Sz1t`h46}PBQL2I7Aog04kxyUomho3$iKKw$s>cvI(O9rbKbGgxm zXQCBbG=mpQMXJFI&wgy~;8i!v;u469(9s(sVQV2U$;3qf%I2R+Opt>=ICax?(~_Q#~t-UiTa{=IJX!FY@}E$JYSNNv;4Yx_`NRwZ@Gdlg~_KB#5r#*Mt`&~>wl zmRsGWuE>a!x_Al*fpo70RxQ%uV9+KKW)u;cx{Ex#DSk^J76P-086P^-wy{GF!Lg)V z2}g(8;i%qCB9av)I!z@C$V2Fd{{SS4fH>4f*8!sM$-kMI^i7M1sKobb^t!9Di<)Q) zk=C^L7m>4u9uivZP;1S$AR5V}eghi)8YHnC0+JWC6CA>MUEXZ<+bX=U5{P$X`l05u zTAO|#f)!$oy|>1cj9YI`QptiGDe9K%b*p7Rt_0mC1*^sCm9w@9vR9Jzfxk$N3zB+8T(`%MSjWn~G9F}NY>28d{XphhKQub76JkR71-vcjYdjUq z6dl80rWBdDWRIT}M9!Li`UVZ7U^_+pQq%9EG^A}lfe%SjSX5uy7AM>OcpN_NGJOcQ z>S%4Zdmh)VRO=&5{G^E@LH2st0OqKZbvFy~YDxu9kjHR_$M z_M$#XE?KbV8hTaOd-A_UjdlyiTiL^~Z$G+Z%c;GB63nVXg4uy@i!f$`3ZsCWMib;b zDMm^)lmEZPMyYCH#3y1*oNW1Jzo>uJUScCOxH5;_iT)Kl_cjx8a_YI2Z=~3P(K)c` zr+@o`1&7!zgNNdFl2n2X5V8~i`z7{?@iQ05L^*Dgn1n>vGbSMsGa8E!iic#WLc|>O~?X9-=7eJ$%9h3J%{{V!GW3X zYn#5kDU!eIzsRNdl-jUNh&l~%r$cf3=oud*gu!?AP7Z1ZdBL9RDfo!myDO7UTfGxZf+i? zU!Z2j&B;hxd>6(?{H}d?2VzoW@ui7L=n+SeRmh)ZXbTtFYiQFwfTXN1Iw#wZ54X9x znO{`kjZ3T^YvnL?m_+q!B5pKAnz_;Y7Ve4oJLsjj6V*8{``|4=zD)OS>a3xWlVfMV zq=fG;pIk`;_s{5(Mcw+Z=)zdWhv^wvv49#I#&Agf5A=X+Veo@p-4F(|Xt9k_iPC2- zOE@o@OZYW(7`%5?w~GYu87?%c4F)d^%aSwvHHdfsPC97 zqahd*8H3-e30Yy@s=Ql8z{9D{BeRo5E#bQ~o0cRxv0f@Hy9Q@{?|x+}lXS>47aWzw zM|vvELvWcZ7@f%8ZH3bNFLIe(jIKyk*L*XK@4-Zr)Co+F=|WQaMK(_H&}QP=?)l4r=VVBgz)ORgfWtsir>MqD^Y%KURhfBp z!NsHkDLxr1Zi*B)g_}3czY;CpvEbUN=JH)h`XrNh>*fxg7hG*>uE}dK77}bxwDYJ$ z(R)1$t~&hVcRs?s1cFOmsiKQN7JT4UAgBGv1r&;gYYm~)jX#RX0Vjt2eQhcVgufSc$Kn30gE zXAOC;&WFiqnD8La)f=Nw=A687VfMn@j%XvZBmoO2OP)bGI@o)4?=K}AxWy9Q0X(6y z1Q@jqvD*GfZGW`(sj#a``DU021;QjoIYbeA6tPHk2tpNeuSSbE-?lF}26Snr{;T~# z%!^h6Q9gWu{J^e2U+_?`wt4ycYY1H-p_l{dp> zE#cDE5achJfd+u6(z}%X!lJ9jq!Rl5O5)s;DQXzQAQKL(Tt4FU1bU?Ds%wzy**o9M zWu7;+FB4EuUG(pTi=SR}J)_k1=9;Ttn}_t`7U~jJe@O9K4QnWMN>7E0n^u?`fk(S` zZ8CCYr=(7%o@Ba5>;Q;tl3)^s>Tb2)Y`@#G_qOLR%YITe|1#NQDdqN903v(@5wNqH za7|aZx_b_Ktu$!V3o4wc5Ub3>1F&YXomsO0?2%t=Q#up<#Gw#M;QbJDHAY;GAtg80 z%GF;x9E9Mg+UtS3SQ!)O*%dA84wr6#dGg{-3$CY3L-4uAOU+E9g*q`HfE!MVQ^O%w zTf=G_%c{JaMaDfistd?4;}LUpMOmwADMtOB|^vaBTZYKrGz|Gs_6$JQ6T!2v_TcxCD0jxj9?~u!1Ob0mV|N$_;QZv z72KM>oVPNEpLC}ySVfMe_gC-3C{igc4TgSdm!T)R)0JtwQrn*c7p|B8=-6vM%G-_^c%H%&PR zWkQZ{=6nFEpsV$z2rh5~Cl!rP62JNfS(C7*?6+y_An+k%f;C1vK7jDl+srss`7H$;ur@T69 zPJY{IaTPrRUHu69qg}3dJ6UUr{*+;O(TFcsm7vQq%9E-8d=1X~-Dl@<{Js*x1HX z*5#4b(frAjU#27`GQ&h(*lvu8ys-KApYa7slmWMZ?o7ecG*|$(C0WPL7Ufdm6Vl^wOAdd8@GE=X!Rzzqn*l}*{zQF8w$$jqu;XNSc4RW6fX>7Z&FV=bEk8; z9e`l>yk{y`cQHM4e$i365?<{1Fp+f2uc9BGfB>|KjH!tUK7CA5Kt=MohX^K;bBOSo zRix-|#6I|Tt_WgGB&&b`1VrWw-b|Kp5Q$-HO4V%6h$LYQ?Yf|NY;|!C8Dn!1hl|@} zWjrdK?qF=EAE8q5bj}LmJSbvktyJ`JsoWx&MEhuF-twe z0fN(Sq7=YsaRsq1-n~TT`aCg5MZ{4NbC4U@P#r97>Tp@H;AkMI1SK*9U7(s|2;H>c zSgYsNU^wO|jW|f#vGsau@Zy4l%v^G^hqzE0%vUTr8dkzHVJHUAbN^l8*`TZ-#%n^j zRX0)CTI^B$4A`0YxB!Cx6b+>xgE0~GCauAk1%h?jgxy7@NX8T0D^UDGNg|lHo+{$? zF97K0a|1mrIf%?wI8N>kzkyoo8HvqYE7 ztjQ!)O-R8$4+H(ax>koVTLW*l|<1LxcuY83rJ#@K+OWZ*O z%kXhfJ2Kto4h=CoQ|wT{H#8*AP)?!~Ip)t!`ixuzz7H+m%*FC=!&SDM*^I7vzvX&M z@L*_l@TEvudnC6b3bdY`^Ul%fqXFCW5bPlHBFphQQ^!v_EF>UdfJNuy*DOYdaw;&v zjk4AMqeIY4l*CxZ=g+$zfQ7RKDJb?B^%Xo#*x;*;ovZ zPx^ExnK;X&4wwD7klA&My0mIG6Vw*@O-t*F4C6Eav_HFSdEmmy$V~S){b5Hb>*Ba` zNG&I+j|pM1K0b~ifbAvwHze545W22@%O!q(kn-bg^Y3-*CF|P|>bsPNbakQ_GKsiW z@?XO~)91+lwlqoN+UzHsS~f$vOUxGm z+b%bG(c{3iJe!@OwpORp|#{v62*6}WKd%!f=o!_-xN`tnT#Pr5~L*Id= zAe%RnzJxIpk)Q@9$+TriZCDBj!feeNo(7O_J&#jbHY-)2)Fup_TOS`K^L9*&Nt-du z8||<@X%(*t?bX|cM@}NIZvsYGX|_S~pn3%ML`cJFVtfRMfV_mmaH}#8+1YS=rZ#b( zADuiekNc{JtB)OHs$G+00p!>*jtdBLoR}bgEo0-aRFgW_*zxl?b?ws&IChLx^4Kx0 zNJ1=Il3JuSQ*BQ*-0BXaJRqO5=f)I+dxlyaI|hVpD)QjOc^T~)!QnRblG2`GnT+E= z%L_-|O6QFdO~X3C&|y?5wbQhk!ZnQnFSe`IY+}Y!AG%Rn5&&qY0*6K>U+2f!G|X~6 zE=iaK$cJ0usYZmX@T9?p4*t?EYGSJDY&gg_D{M`H>J}^SD*%hQ3zgCE6kpL*+d1Us zf-P$>!;7ZwgpL+YtRc=Z#Ec@Ssk(HB`s5D?D-zZEtIL*;%WG#h%}LSKI6~bR_H5*< z4~Z2eHHDBOy|GN|-M4LeQ>JaF@WlK>0~PdVY9Mg?R%FJWN^7EAi>!>8Z~t_C0DESx}>EK) zj1WEshh4&!rRC;8vLL$c2cWQ(*Yn}q?;1nLj2EbKC1tIJzhf`Ei79VD{YP7KzG;NNVK$X%6=t>PORUYelx7_VB*p% znEmHQFbdj_<{?|rTM#i)O_TJL{dDb09biF6UEc{|8hAFUW`$NyoFK{wRt(_qh;NeU z9^y8HS()RdW5*6K+QxvVnEVY#Mlk&;!&C_{)^Ih9DG~kz)_P5btO-Su6kEAX6Adl- z7^X82Noh<+QKl`U;y_7mL8FaQU-A4QjuFX}6{KRI|0w&bO}Ju3j*yBSKr>~+eCB&Q z0^RTKhde;oQOmId!TE@hG@v-^;D0~_`yHXNF>uO_gTlI9m)FNhf-qe~CdpX_tuO8H z>ylk3K`vT#Lk1!~mWrKFlEwkhwR;Yd9)oDlu6>J$?BQ*gj)&w6Y~eWv>##&(4_EWy z2BZv+WBF8}fsKFlab%V+@L|_RR)HWgm<||F;j2v}+r5ul7mjww z?5o*<(f7x%k4N2WreM4PH$%REJ9cx~5Uz$nd#Q+VTQWl8C-`68BV+NydcvG@9f`asTrVNSQUy|Ry^K(ZF-BjQe{T`IDdTKRGroBt4elpw{ufh@ z{_qKiZ+_vyXD6wHSXSAn(SXV8aWRdLzPj@6pMcbJs?}A?u|Ok4EIKwqiiIzT6|C%S z-?x}-k$}CZaVXwIVX07q+>UM(bT9n#5UUw)nt#R)Mh?MoV-jmzaIB=JYj%e+&EK$C zz=8*#?ULlAMOMIn@UUZTrsA#e@k#!xTg&eq=w~O<M` z<0sPUEOH_0E1snq_tI)PVwp+1a{M*R>$W47*R0K%gYpm1Q%o6yTLt=WDAVt3=lTXs zO)_b*$j2$q7K(j}OLH;z4*D@YV8Rki46d0Lnk;%o^eZQRI}nR!>Xf~_mL50z z@IBZU{Kr`sipf5{3X4tl@w9&fAn@%%4ai6@+&R?W&8laT*NOun5{icKPPiQMa7=WY z$s6Azr#TIgf`({86J+%IpPI7cG!8yFnQUFLvwmtIk(QTT3Wh>q<+Z`z8w9~!QX8!Q zurSu#A8GDiDBkq%%c^2!Es?U8Xjxm>(+0aXv69Y6N$1?aeE01pIMSPu?z^$c{Z3}E zE0i|d^WmX|lJ$@ho_YSN<67?3+@Q4RZXlNt@S_+w9N4+&u1j>_%Zc?wU2*b=jInfm z^Fm+?99Sr3U+QnP&9((sg-Mr{oPon(fwzD%-Fx$K6StH7MNXfVF z>b{_7!PCHO%f#Fb5qCpyGIV%um*T34B;UKZ@f$eKa5qNWjUjtzbnYd%hE&Rp6tpV# zg95&9A4s&K-ida-HNv=lE}i-hm3vslgcgGdvel#meaCllk~HGE3Qc* zTN<5o8IYHXAk{I3&J9wZ!A`Ew=J_O*%zmORjfy$3@?B$c%y!W^%thO)P;|PI4=P9` zcqM#CEg5*~$;A#ISrQY15DGBBh8|fuHg4dA0t#whF)kl;%`rjkYLy_haFE1^&cQMn6ae=>$|;fJ=txm#)Q(i$@o za^8cqb+VV{942Ph#d!qRr znp@#;WyhQ?bbfAsSko<2wP0wiN~Bryb{MUmapCMrd^=H1A|oq>CP=YKQUte1BDH(L zQA*+!6jwwlAj850v8v%2C|J1YXk;AMB&Q!;LiB1oVUMOZEwH)yO_y)58gfe%)b_>%zZm})25^N9tk zk|}EeCQ8zq5t_|-s}ijh7l|Og$A+5aoWj=zG)NhmDye{xerBeYiw(V;RHAk zxC}Fyek?}~j~lPXv1GVxhrbsxz)kyy<pqwxxGAA z(;2Dh3|Du}ZGq3|1=mIu199D!n1iDpuJocvL6Q^EnLJABKRd7Tkv{nG8&rKMS zmw<*eB!l;qpRWYZ?dqK#`doM}KtysECWwHG%xn<}o-5255pojCiR#nf$qB4Smc&R% zyQfMBWp*GLyVp*$U3YWFdYU%I0wPO)n>pYXp$W3IC}7Az z4<=o43_%Xd9N#st1{f<*P?r8RCVlE0l>ZaW%NDx)73$1P=lb1E5YrfiRKlp2IWm08 zFEtY?@#oR;m0}FInlaef-nltj{u#ae2Xy%kU1&-(Ljf|QV4kO2jf{bp8K~|<-+$OE z)6ydU4t<`emzAeRjO?MBnNE%5zs57MoGMXmql66ZAq$WJCScEW&&+Gg{|vmPyge8g zjjd|GyQ+PzKDK__-Sykpj<@D+ZVk4HF?VgmT^n4F4OqMoOMQXTBdAVIh;Q6D(R-GR#{sj1udb@XhFx+c5E}l?rLn#;AnT}Le;vv zo^?yK;q8i)bj=-HC}I0h?C_R~u<0Y+?%>(E?)idwDg4yn9p9bN@WDf2&taG#g=#l! zj~0^-GShndR_@B#PqUNFeiDOB#e^1-9)L2zj8_*R=9)yndS(zv7EuJV91sdq>S_rL z;%tL*BaL0hPjm8VV4zt!czrOM(>i4%pHL&;>0ZcUdf-?l z-}41J-+g`2Rjn+W?@b1_y-UUdR*nxrDw_qrK;)VQhZ@4OE1k7~5!6NluP8t9YNz(L zIV1=NYg3yEBK88D?W8-WDSE) zE3>>2;~KY<_@BTnNIsWLHy;0+PuW)H_!f<~a$KJ#IdhcLPYfjU=oP9bV+hfT-e_^( zqO1Q`zsQ9zbF%6HTPs@TrTkrYJbzpISEYBd$(XYH#eZU+wQb1p&`0aZ*E=^@ez1N^ ztL-N(R$RrKwEuvNsaQ|O12^V`RokdN8b^Y$1XQJI;My27Tr|$fTLTeRh189T2XH{r z#@H`{k|0EDXVgW8*T4$D0G(A8HW}81HtN$fplqF|>BiUjw606rGNt#?WT&YDG;Bh|%psk4wzH&f)98EgDkIVP5(dTX95?2ADf}PZ=$q|} zmbTMi*G=!9+BW0)I5%H44bioLB~&>ESJXfu_jc2%SxO; zm1a1BXon{m`y}jO$4jQ4+Q&~k?#bJ^Ut`?81_)yMpL|tiLrY7m{2Zb2=LJKhsQHl7 zKr#75DSt!*br7vh8mM1?jAlAT6pJ=4eW>|wcwB~`Xg)r{xQOT*;~W*QFUD~~4&jK4 zRtaOtS0K`tqV#0i3T7V2D+l*&UQV$JT)+nuOm4ZD(uXj_kAjlzV7ipbsGLgWi@D9g&qL336C*Fdt#XsBW&a4Dc%s^ z2fP87e&g^?_DJeE>DXUPNdv>wvm*ie+sk7l6crVs~)|B(GS^pN6AXhNnKoU;sFEQLKL= zXk@U;s1I6$R&EIYcY<3`P%G9Tg>4P85*#cs+nT5SF9f!<%CR#~gCthT^V7SNC9q2B zr+42gshwgf>9pe-oB2{OEnKjg*ujwShLw^}Eosh5&YLDtEFX@;T&hsl%;ci00?sg; zmDsi^kc;)H#uBa+r9?*t zG>SzDTRlc}Y(d4aXJ7+MV=9wZ*tl)toKN0`ThqotaWT6Mx+cRAtTSm0a*9$({MR&) zdr<`UwZeA9+zyP1ai3pwt?6phrxvTTc517NTjT)nN)2rEIcp!epVsij6uy*tXeQAp z{u2)ZF=N1`v6>F<1anY~0gOX{&V}CaGbj=BgZee@oH)mIOnh=b?zvc_cf86)GqSTbW9pH;J;x*ryLZ z%vW4jbMvOJ!B}gP-(ysdQXP76R7+Ek3%I0nof`7~Y?zUZ%R*uxsljC@_Yfuq7bP)9 z;PNWIMVJ+iO%3WTd_fNv!ysjwGTk(1NJhZn=WOiB^W3b*%%$L#a6tq3-r_Pjl7-}} zfD>*HOBU>qM90Z9Vyykph$niy=0gLDNFuhy=2%cqvR*;Bbu$E zK1$-kW41aB98Z~`ZpB0;Q7(lh(kH5uiyfzU1D$`RL2UOoANbR%mvYavUsgl4d}sZi*OZ8Rc%CRdR1 zkd!u=@l-bR;qs0J_gaOEryj zw=}$3Itei2P_>viCqG0~u%;;7VFuA+ei2Lh6+z`!Q3S{j zoZ|FN_k}fHFu;xM^uaP{v+Ljf?q9Rt~Z}~@n4%ITe2qr{p48yID8xtE_V+6S{o+3yPj+R1krkTXTQE~H6 zRHn$DpO`XLxnP&<<448thNl9qwz#yL-?U$bxpZ5AX;qn%{cL+Xnt3-L` zo`XQP#02uv#jOD~nDJdYzs+Cyrb-n`g)%F;-eI(!Ot`Wh*Tt?w-q zBeh|fjQq!)lNZj7GM}b$6CU~q3o#bF%7iaaa21^ULZ=wU8qQ9P`)f=}l!}EkLzXlY z!&q6{^)`N59VuHEE?qxY6E5yraCL((5-V68DOepV zXoW~}te_)O&@pHK$oYL|w4iT#yRzz|05Z69=*E%RBayO>aOv7PYq)qlS*z9yXpR&# z#|qX&3LtEKYwYG&w4i5dJ3DWm+7y&x)obroul=}g&2`7z2JmP=FYKP)9k2y<2l|7r z@HawVnXd^KZJPJ~`1B7?FSz!Ay2&n7jA4)c!sUs%Y9g+h@ak?Bua3B?gKMBu@5zKt zeOAu&YWBD?;;IaIqpsD^sn5zJYyEi%x5ecNXEAH)B*4=YC=0Hi`5O3`%Q%q8QLKcM zy()vEMbE71>ti=NPI~Y>11naf0oHLbP;SaL_2+ z=rBn*(KHt3Hcr*?fcQvM#2%N|VA={056r@*i53K)5OA7Oq}Y>Ok{wP_3jy&iSEr~2 zbjwnH%dpX5vVWphq^Ep8!^q_E0u_2Svm5+~cpdB~y_QBgD^~owpz5qR1`qjjm9yL? z@L5R|&)?q6WN%imUCpYlN`8iv{5f3yPc1~=MrdRUKnQlVXfMn$4BJcS{8xs(0)%xK zC-yb~Eono+1o_0ARc=I?n)9LJ<`<86y2Jk`Mo_8)x zUkK;cX>>aI*$s{^y4#lWimt7?x+<2}bT_X_NnR?d502hAGkYfZGAvJYZL=%L~`NjP0mb-Z^YT+-325#-Uxi7SNJ|9+R7u`>h$_FV^ zycj%u=D{hpv?jo7ln77+w=loG6Dol4Y312Y6HhK#`x<0lC=N%VR-hzr>SLW2=A|K6%Z zhYJc9=blbNVR%!}v0f{l6J28ZO>3&OK=DbEET}x>SJnY{d56d<<&Z9TSWD(H#>US; z3K6o0YbX_-+sVKM{`)r=3}V1K#|h}c!N>wz=63KT0TR zy}narZs9Ru7`esfN+YVz5T9!CD4xYk!LS;x_peJPsnjEhaW5HZ)QvhBUfDsDX&*}c z6*jUki{qd6hjZ&y6xH>9-}S!W`33iyC3lfR9YKkqz(d+xa0L^ri+UQv1x-MI%`FKC z0k;0qX3x%HTn$FK!WR_@XQmq@GUdO(*Kj!SAp)Jx%iF$=`H)&E#dVRWN}8C*U{Opl zg_PVlvnizH)UDLYGkE_YaE7~(uOa1(W2Ipsi^NO@JJ=w6} zC{uUyNs1SYAq-Rg6(2hau4JoORA~a)hN>rR(Fr&Sw3mC3!q78r%s=7w;mM8~%thf| zw24k>^24xEdLk1YUzFi&lOc@kwU1e`g(c4&LW&1@Bv=nbo-yeEBaeuRvU}6L=}I2b z!}kDB*@ZeF(g~DvG5rJU?^>aA?Y=1a(k`aUu1QTBagr%6d2z%W|?=5+t79cb61z5{(ur*r;B)pNU$&G(Py)m$F$S1`~HeA z?&6>2cPloFvK?=USAR0DdW5F(ukcMs%sz5M2)3NMStQkAWpfxV?p$)ms=cTXTYcqvlc z4SH|N^>J45lB;TJU(8h%aa9GgBCbuLi&596kF!gz@B2kLJt@Z%T&DKXN6B_PHeo^7 z;$Ej#f>4lN@4CBLx<4>FuYb%@5)DOaf=`4~yw+qZ27punEMuo8V(l5I5bll*wI?ugb@PIwR)5Bj zwovgzqv|d{qK{0+T>=6GJwYXzenxT_Jt&|Qjg%iJEHadB5SMba=_?_VK@c#e6=Tfw z+QH!yqv8cmO?{PmtQFPNPse+?!S)m1q<(c$A)l)^E?Cuv8P0NmQdX=3nxJWE0Cz z7Cp!0iSe^ghikv7*cf7byp&xrpue$2wYMtn3Q^9lQ&$kb8(3D85852ueq;CSZm_(B z-cGcA=TW@(d0S2T7~;wGhn5w38vbHqe=w^VM1A|dPmYdL0eVL@h+t-AzHd-BH70jcxUdbLG>2{uh1;Hr`VxKbQ*Aq08qr;MT2H!Cv)Wq1;6|piE;?|Nic;Jp?NYJLbfSMRY@!~ zZ_IIpI)IqyI-cp`_BX(P{o3r;A_W^49X%_XO{kUrmiur?1uJNvpxG-LCtnfc1hqjR zhh!MNeMEx{Io_cLwqctk6Viwa*RiD?g`wgjbuaVXNZE=0yb-F_5K zi$_MyHV4JIevhh8ViU%BE3Q1P^K1yVBa(6mgnN9fcgh;4hD4QeNK=s0Z;64dl2?2C zs0<^i-ff&z)!W!AnszBNU!$g$o0_Tu-}z_?BxP4yP2@zXRww&VWP=uW5HUSAejeCF z+%#oMG~lTPctDoSP-Rzp|pQ z1?`U}u?WkcYahungFvUylAoCT)WHm>5H&LYbiFaQ9V6zR=?7erX?lcPyr*Co_MSjy z##pin;u#``C}v+LW=*tsmTv@-kla<3Nw8FvIiL*Uu{cOc-=ncOfNBHT>Z;>QjwewV zU!f%aNHuNhVul<30kEEGmZ+S-)UvrGRGMN(piO78VeJfl%1M zM4e}u3dgN+kO8&=F!0(w)cByJN-g3;2+jX$>_rA(8lOS0gKn9Rug)cj-KBjT=*x*#MNbW z0}Q&GEHbPhU&3Xj!2HkX#UPqtR@zdQ?gKEBeP;Lq1AZ|rV$5-qrpHfFB&J7Bek`Xk zlG7N?X`Zqv7?$bJjs)vswcU~0Zg_R8-4w2QDqM^$bPr*>v%;{*+TJQvZy?Mx4jWI`U#8E30QP#-oH~E|tGR`3_|68f0 zdIicV6Evy0j16r3`MPFltMJ{8f!FgK}7vY$AoxFtru+?C(41FoU; zs)><`L|vft>VZf|iqqX8ZP7Slx$0<6IFF zB#O3+gc1a+(8Xj2aHQ=bZiO~?_za?}X*CeE0~>H^iOskkV_g8Omti$n0q(xxS4W$g z{Us|BC9{fYeX|5W%i%ayts;QDDxs#yf#w2Hd?$MOkqzc z*-wml8Y7;@sHb_#sjeVxfmPu~*k;(e;Mm3%jE0B`>A8&AP>81=0{+;2Kt4-_PU8ZvBr+&Z zdGdn%0zDh2%RkcPKhdR?E=(-rGm1T+%P;AYg-hH%2p2QVoh$c@X{Yi28%k!>0o(un zXS!wPnZCtdAr`;B8t3B2whbbm^iCBXyYlmnphsR-%qjp?^-d z|B7O_>GD6)?N4xtXY3vyIddLu{u{bW=Zung<_@@k;c`UjVImcb#YoJCLUKKYbjc|nopyoQMcfT9(`0AvW#TRfJx`8} zoE@D!IpO6VYnbnvGUS$-(O72ibt5%kEj?paU&-KWJe}KLl{c{)ZpKR9LN{3kn^y96 zdh2iL{lBKmX1d)?m%pNB?4=kPqLmNOGF()adrHSL4b)dk0RGWV%=0eRkqCHHrmLjc$Rit>WMPfGj^}_|~%%J~h+e z=qp-uVp1lSR6HGvDP){va_AP%P_+8wQFeELtEb5)*`14213Yy22_5NGSdNAJVQDAkbj%*94fzBo}ycidTV5K z%WtzJ5j$7@7A55mtYCD?Gf0qc(7^m2WpV8`@WSNx=#d+hOX5VyzfX^gQ?O;^0Hsok zIJe{v=~iOA1o@9xoZ(w}mf|iW{VxA8Jt`33ZJCyfcxg&RE&mzPO}-UnV(_p_8(Qc4 zvCCrlZE|qX)V5S!y;Qd9e(p}I)OD}0HX%_2TyA(mn#g9+9E+zU!3u{UW@gTE9(($Hnk794 zq7za}pbPk4YFW0a4-%Pa(mrdzmatG5Jjlb)SC-j*!eNuzf+Nco1c^+W)DeJlBm_Y( zJ?cPcq)D}bZB%q^$WA5K-gih6_B9C$ zg3$1-Q#Vh|7yh{Hhh>rW?d)0j*+a{emdLS56@l~g(Tb3VK3ai~Zny5T-nXSotCsRS z2^Ln?^01}#R?E$nxx*hF{r=HN%QNgDs|zwG+)gPkXuXj+n;Gi9)pxTmQoSKz!Lxak zkKhiNnWIl1q=GW`mCzn{8#ikn}a zlRnD)erC9+FOt)rkdTLD1q%}y6mwXLOIXgl8>O?Qq0Tw$N7DDDP+z2GL!@Y9f=Yx` zFyJ7IVzRYOstSIUDm+*JQOoyRB8^WaEO>UiZkd9_m#sO{W*QX)p{`{L?pLQvTdnkr z!uc*9-r2s)?(e&;(k^QV&_m&E3^9e_=MF8iNFv=Ttq&B?)AhjudbU21{+v~U$*;m| zJFo79O{2Zn_l62@Ro$!#SM)?Yy$Ksj-nx@V?m08xDV{E#DGWGfsv^#sWr>m#C(<&d z%wSK#f?y61iC`W*i6BuTN%?`p?;pK>lsY&+w2eAAKY?+m3Bg4dg1Oc7sAf4QOKMG& zWk|cNb4Z|Y9^F9Ua(CZ2&k73B#v8~ zq#A(Nn%Ol83!?Mr0R#jG2oi^^JyN-vj3^}|pkxGzNozLRp^xFd>-$3Wv6j9_OJBI6 zFXHJ>*jR?`yLp6Fi=HG_Ii*1W(~XMR3Yv0**11t0-nP@+gUhs{ZYe)_I9A^ssqao$ za5Ik_2<{*Qg2cFWcbfF96|RiNu8$=w?1sjVMQ8w7B=Lg1Kq?0uymbAggay$MN zQV=9s9Kc~p?;uLOgMfMmLBa!M0rR>CW)BdwubM|Hg4;+{ut;NYG}f>&(y);#-*_9J zM{oxpN02DWlzJfuIsJ`xUaZ{CW z@0v(%Q`Fv(u(zWj*~=CLiDOntS{<_9%DkC5x9+3v?{`OlXC1uQ5|U_l{)1%-*1(<-GVH3y=U0Rg2WNNn~<4f>eihQ0 zC6&@(d=Il2Q5p;cx9y)&KtNf*vcT^n#U!bOaLM<8Y7iw{g5Y)?L2!wZ8L>nT%?u?U z%?#wDnNi1P2F(N%<&-MbEQnGT1XL6Pr6|O(oKog|j^gOMh*D+*lo^4N8L>o@Lu#fG z`d$`wZ!^aQ%^Vjr!*^P`Cy~}DRhrNpks0BNu85~QVWZT|+j#iwAr{iYRrYq-%=U=0 z^iv5L=!3kV#Pe2Gy&P$S3ebpBA0nVWM4(g;u|ze?jP*f8BFzwO1<> zZE2Wq+E_L4v1;IB)sS%6^a>zK6+l2Z4nZOlgN@I{JneTq?L;k=EN#U4g^=L`1`41p z4O!@pvLIwxi1Gw6dH_ohifOy+L4Db6cOQ=^xv+X>VliaX^Da$K+|cwyK+}`fNvzzf zjOnX*`YN8jDv@pjkx5@^x$A+9G2M0cuu%ENDn=HwEM&fvk~)_9o@Sw5St~$H84*OO zLl97hAfP%lr~rs40U!bbKm>_&Nl!(TqaT)vyF`u)lZMa_Yaec?{s^f42oe=pQXi|_ zn!BDg2^-yQ!19ccRSsdIEK`E=2(_{EuBS6$W4D{O@Cb4}kmw0x`pCDi)oI=#{~7HY z)1h}q%#j|t$sFPPv@>JJ`F7LEyr)l0obkza%8)iTArq4ny2IFqPO=2zpvgCA_e2aq z;)J81v&=Y>4?X?=q>T z$|O@EchH3n!Q#?+*k$r@Z9_Wql6TXkh?24o9eH+OXxpxVZF_eQ?u_U0Mnb|}k<#(S z(@_7dl)sqrXB>j|;R|r^SW4|+jG_`se1&dlGtcdV?x7fQ8{}u{Lc9Q(v2$)wY>qNB zw%5yaJ3^Pgq07HOLfm$6bW*-dw_m3VvAyE1=g(t{dvYVOa3R8`cEu%pIC}Nv6O#e zS^xKz%1HouC`}g*y zd-m+hTfVXTt=&^2fxP$2u9pS3h4O9{-Yg96iIjFM*wU?X#4CrzMd}kHP#on>{pMN3T z_(G)O#bwHnXmMK$mK<3L8^U{1`Ztcgb#$f*n5$#9V{T*E-9LXQ?A{WQwk}J^kXUP} zYg#Iv6%p9YRX{9fLwgoKc)?0TnVx@G3zbVnkCp1{elzIk`jlT1r? z4s%QRRWkhm-N{52J$AtlXCj+oInee>&?m4bQR}jXHoMg^)BC`J;6cvu RGV3<$%-&yGScJjU{|mCjne_kw diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/constants.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/constants.cpython-312.pyc deleted file mode 100644 index ff8ea429f912c721d407c3a0cf5bf3e962fcd652..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1550 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 diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/defaults.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/defaults.cpython-312.pyc deleted file mode 100644 index 3b11c7f83e5c4faa233ba93fd7f1b4c443baa956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1600 zcmah}TW=dh6rS}hzQm5Nxj1Q?wxq#oW2*rnkXkC&-83eSlO_(ArD$0^lXR24nAvq3 zZxvDT!fW%CB2}WV`~m(1FGhJ;4OBux2=y&hc*+xJwq6pR*j>+j^PTU^Idf*lKPQuM z1W)RxMfEs@&>wu@Kd}Kg{!&2b0Bsh_5 zha-UFQryEsfD=-}!%@J)(y)MtuwC?no%S^3#YsscI3}fWT*}~tl*PkR4kx8NPDuqU zNTc9eKK1bt8J_@1Ch*7&=s{QfA6?qhWu!@*k*07~I)`)Mogc90$ptb^;v_~AWEdBo zN2H5*6pvv6-f{R%;89h;8C-lGl`cV~1wW6|o{R&(cslmcW?+!%B#+e-N>i`6srd?O zjY|3pRI!PynUv_V+OfJiSA1luU;q?rDmt+` zN}D)=$1_e~W)J$uPGFDsmz}`nJyvMco1(nlsQiO%6Vr&r>!fM-Q5zWh! zMcUpvSY+GFmc9V`M_j0GG@x=Tje4yvu9s$5#O`%eV~Ytk z8`@MgsFp?HVj(u-iw7Ia!ZxvNi+amU`bKZ7S-5MfnnfevM~8S5ORg`Os zVr{A3yvs6g!pV>uF)Ya3VgZ}5?Cr)%ZHe#gS_|4WE=|AT#O58JDSTXAt57HB(dPXF@t--fK6|R9{11giS310oipGMlOKe1z6~i!Xg_D*n(*zeKAhBiHOKY7a z8$8d|!H_1ops*y0t8#0tT8DFWS00=%ngSag;ew1`w`O%&Twkr$L^{U#&>eo>f>opU zBRU2Go!qNDFm+N<4O?qhI@H`IZQJ5tS2uSn4~g-xqN!h1Iz9V=X}nXuK3}omsL#O# z+EKQMRoPaJZDqcK$)?iPY^&VqokVZwChltFL;5a6;P=-03!0;#APB#q?4PLe5|v(} ziI-^BYo~q>hQ7P??X6!!myRN6wAe>kH#gQtX?J|8j|whla_-ni h{q*9&mHjKva?g|>$oJ$~@t5pdf1{WXp!2ZSe*n-I%R&GE diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/environment.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/environment.cpython-312.pyc deleted file mode 100644 index 6e33fdc4aa0a3b5c1a6d8f5cdc55cee00f5182c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76676 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 diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/exceptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index ea0aa7d431fc64ac5afb520724c7d49447ac51d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7714 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 IUih*9A8{C->Hq)$ diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/ext.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/ext.cpython-312.pyc deleted file mode 100644 index 9d23ca940c50db2a84e26fa5151621c0418ebfd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41907 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 Q;yLpszCfRwE;)VqUlM_4i~s-t diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/idtracking.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/idtracking.cpython-312.pyc deleted file mode 100644 index 5b2f59bc53c093cbb35304e22ee42576ade07fd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19189 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 Zi@xN@{ng4zh_^eK;nZK&*pK%b{yz!{w%Y&z diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/loaders.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/loaders.cpython-312.pyc deleted file mode 100644 index 92ed9fae9b9aab5b3433c93e0c1e5ae111cc921d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32349 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 diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/meta.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/meta.cpython-312.pyc deleted file mode 100644 index 9fb2df0d538370e582df78e9bc06683d2db7026c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5484 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 diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/nativetypes.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/nativetypes.cpython-312.pyc deleted file mode 100644 index 721c2eb7712e9028b3eb4d88a5b45a9cbcd5456e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7005 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 z zojV`gy>tKGjy>rjkyWQLx20{sjy?22VoKAwM^K-~f{H?$Hqv&SJCe@D5=J-_ISmgs zWK%>jJ4`k3FdBkgLkIz8DRJWOCMq;78o_fXW&%=|3gM7QFdbhQ@1&PwX**UI71A9l zWa6y&DOiLcZG(-`5{}^2dIIwXE8dy8m42?KfEWAOurEYEnWFz8#lB6!cPMy=g6~uC zLkfOG!TS_UQt%fP{1pX%L&4us@ZTu-?-Wc^FhjvVQScrG|3-m_>i1)cRZ)x%vg31| z_=Foi*@e$F5YASZ%Iu~j*XWHy6eBk#?7V?D^a~%3yfKnCM)BSRHhyMfM7FqNvo$sl zV>2o?SYo>%HpyWl7`AKRwQOD==Ji-!1rEQD3f-6~-FrGEu)JS-W+jVr#N++l=IrZ7@{zmR{UCyfri9+qsTb z+xh&Vr!Sr!K0VTZ3)42 zi%a&6Zk$FneQ1lkYkAl2Pd04l-*4}y+WTh9`)qRU$fy5FqWkPIr(G@`T0bk{HtVJM z5jCD8S5W@A%@*g#)da_Fw%8$;4TWY={j%8tAJQ+Km2jI~nk!chmCj1I&6eij-CeU1 zZnM>Hxnjftcc+L~I_0tvq{nTxkkYJI(|F_(N{`!YZH`<;`Qt|4tq|Wu8GOhG`QtXb z)FJz*Y`D!9I1xWWdHQAxk)HDBGMA#9$RD@amU4MH<%!$u+A?`Ll?S)k)dlilnG(@` zcCi<=*)=QSHd{w6fj78SYULgB(4JX|?z7vxa@ELvl&WgBt{AEC0JqsDm)tr8IBv7$ zUU?hEaht94$ou4>ja0dP@@%bJzHg|TTI0Ui$`W}c)dIKa=3=>$c+dLb`ibI|$-I_n zJ3(6Sr)?Q;Kap&Gm;tw(IWKWTc-N#~jwC-RwXS}89dMWu0@4af!Zx{3Tcs`a|r#pnijyixlhUtUDbf!nOV zM6?-hv(4ssv3x+LW}^FSQ=Z%|Q}fe(wz^6#r&hylb`$jrYRdg$NB`DSYnBj>8F44t z?+m3Woh>xO=Z=?(e1NODa)(Sm=ssJTD<71HD(Kfi{Ia9(8|iyx;(HudzpciBTLq)2 zD{iyJd5D)%B?@M%U2^FN;JD3}`{X=|<2Jk0C9kL6!fm#^L@uRwahq-S$*vK=ahqM5 zBfCaXf81t^Wx0mZ<2LJ(F*eX-xXrp8Vr<|xTTlpmMLxLAF3*z}j4q`zESRm%MW^`J zQEe)w%Vl|^@K!&K3^tAzy;XLtjHB1L&Jg6bODgq`c~d1T&%16&g&#NynalXU0fg00 ATL1t6 diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/optimizer.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/optimizer.cpython-312.pyc deleted file mode 100644 index 96a5562f42cfb8e8626b21ba8306de6476507990..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2683 zcmaJ@Uu+b|8K2qP+xzFU4L)N7Niz}-&QWs5pAfZiL;}PKP}!}DU$`n+ExU8}9(y~- z%%1<{QlSbd=AjLi8aYT+p{P4zlUWBIjDjh>}VdYXimb>y+mEF z=okT=^pbU>VqiqIT6gEG4GTAb$MDkiOeF*SDXP~B8?HN~lXfyrcJsTc;p8spm7In? zKu*^M6+7u-PWHmLK9Pzutwn4-FeDMz+Eaxz=+L!5mjN(6&5D-1;=lrdmglKUVY7zoPZHO!GG4a=utAvsy0bQ`H(U>7Pg%<7 zstdL$16VWIOJ*psEnfrmh238St9Q<4qjUIhDY}jkFf@6`kZ;5R4r}u zhXXRh_*rl$GCaDbj$#(s8RhMiHBE^{0Gul26ws5_(-M&&3+6SI^${xoV-Z2YU5AJ{ z@Oc)%r!=d~7XjlSTH+h~&zl|fKg58P4e83IPoXYB4U^NZ zaD!rkr{IiBcf!nC!3YThXn6MX@)WDnGT7(YkZ33YfVy7uDO2AI#6B{Tx!gP>9yTf&?3uU?1kw(dSak0JHGhg-QL~j zPu$OSefH+XH-G!;(w@aVU$|G;Wp>@U`-6jbb8md3zp)DZ$d*$);&`ksz{#f&Uy3Ri z-YLyVIU2kd2`2&XiF)DUPomY)sj=BhdIo@1OHNAkU*fB12Re+ksl?=o=&1FXL z3{21EqRa%9ixPn))WR)f0u_xp$dB$`zz&Tm}{ zbSXZ22{?pw_B>kIxqCtXS9*~5!Bz!3)GakYVjUtoo83)Lj(FO09WxQCnq4^N?88?D=4jM+K-Gf?zk?ZgMqi5vS`^!Be z3;L5Z>e_b6`Q7N1lb28aGdJAUQu+S-11~Loy!i3Gf&I$^`&SBsOJj>;HzuwQT|IYg z_*QVY@b=2iSFVg)9$6tn_sG6wvag*&g9lcTKDf1w^etQ4y{NaakbC+hg$mp6_3c{j z+x2gR^ZhHmg@-+T3%Pa*HqV3%;;kdOBZtvn5BDAIPyDTbVJ_+lnfZaBBwb^^<^5tq z!}w5@;&?GD%g49s)HK7aX+qzJHUxB+X`X9ZUUb6;K!u77m;YpV7ffN|h(D*W3-cXl zZR&ZZ3H3Sz_d<4(cO!&V>B~t5OdN&j=>@c^;pA}J*pe))6t*v&Ts+xMNP76SFPnd8 zM)Z$XeaZ5=-?`-9V87`NBL)za8OnnD2wFbWDuF)J|ZG zA8To>uNDyQ`wsOzKtm4``ls*w>YWGrYi&cvhb|pjdTa452q!*teM~K1(>t}>HHb1k R^rX8V7cTYu2f?D$eGdZUgaH5m diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/parser.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/parser.cpython-312.pyc deleted file mode 100644 index 16bbbd05055c23ffbf685d48752162bae9f9e065..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61197 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

a)M$l4H5hWgQS%)CU0_L!9wbz3o2 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 diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/runtime.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/runtime.cpython-312.pyc deleted file mode 100644 index a1baac3d0d45dc2d54ff72aa9e534241d702a486..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48885 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 Y?9=xJ{M>&;EEPLu2mYggAGVVH|6kk882|tP diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/sandbox.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/sandbox.cpython-312.pyc deleted file mode 100644 index 324e91d7172f368fe7267bd6f9e999457b41b478..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18101 zcmdUWYj7M@mS$$XtE5ut{j}t?^{`5|P5}8%D zrIx`k%pei;Sl*`BayPxm-Mxbdv(X}k9n3~YV0ve_>DY~!Doe8xIcArQWq!>3Dv((m z%>LN#+{`&bg=lv)Ak4@D%;^!;x$IIPQPahw-@d%*v>h zDw6gv>v9x~!sMlZD zf%+SOc_52nZr-7L9=A2r&@ zzCnM>5GU6ClE2PtrC|#oAJ0M!l63rD0ot8^-iR7T3tF zTl$m%k$nR;&kC?vv<>%X;f$O%!`cdo#o8P5y^+nHAa#hFr0rpwxcMbp{|>QHs>633 zzMJs9Q*6%Pn%E)9~6cZ3uDFL7dAwauG@4P_l;TnJI7z@5|m&}9E_hAqQNmq780j}2|vnB&JAmLbWMzqz=p<0X7hxTW%!69t}Av zg%cWqEv!_7WTj^N?2B+QjCca8t$G6^$wY84O8Y_zskWdzq|g`>NjVk*p!wL5bK-wx z0Lc|Dp^Gn$o8bO}yTB)OX2Q2A+7dc*aNL5Nvvoh`M9VL%hB$nYpWsh& ze(U&?U4k5p4PpBe3xQF#B!nR;Myw-gHHvU9k~l2{g{Tx8LM9#-M&dFo>c2z_8NgJ}n&@z5E?ARonKXgnOtq18HW@pt%b zs-1ODwW4*^Z8oKPk73=y(fB!S+gs#zj99hGu_1-dCPDc6@$ILQ!$A~kf~I41 z3_A*PCBXV4??EF^;$NY&?jm=`#T67!mrriH*!`K)GkMRSo`21M%UO53s4ipSy>++i znr61np2%2vuYbjA^?5R!)$Pf6xI*8>M^-?AQ~7YnTx)#OAZV>u%8^`w;xNGlkkg(C z4r^x_e}M#pf|Us;VfJghQu41 z=p&N&OKR$k-c?9DLub$>1jF7((qiAhb0;++Cy6<_MMp#lFo9mf!SdQ`N+s9j#8imj2Q`-lvv}0n76i7NyyuT%_DMrv!6lIe0(pIB&k$7 z(&1oK(XjedD`=_S?zkLJCZG=Wjg3lbX_qn<3mwtUy12~BEP;T(RP{s@Xak8LloQpS z0IZ@G9@a%HfypGkRL^5f(y{{LIMqg=s;e7fmI_sGpBxNHgE&vvr~5GJNLtP6R_kqt*;&xx+SV<&PIF6Zf>Lh~j+L~R(L-N#NGJJolzw{tT;N+Q zYrj>{zFbyy+g&!@{d&bxjXz!EUv%qr>4Nt8^2NQ!(>srwFy)Kx24GHizOvseYks5S zYRB8nOKtnpZTo+l{NVZbpHI~sTXa9Z>?<=VZ%fx~TXeUxRy)!K9SpnpwTc}WcK42~wG+H;8eK^4b61EGGwa>1ITx^WX0Ll`Oi zt7Q}Xg!L>JvhX<8ZQK~|w*)gJYE}t{&}oTuCh#+4jLAp>4*j4on2bcRuLWJl)TIIA znAT`SNo*6uNC+u3Vp0(_Q-pG4_k`jytftX8?1I>k&~>mI3ST@K6`|!p;~s-j#|WWe zI^oH3GFg#9L?k6}CKf*zGgRExA6)?VGCe;Z|9%_N8EH)U2K$nnSO@7}`~WR!difvG z6vK+ZG&;YkEjFy9#xQlQmn=U8Vg;fMwx1?uw+RCSOu7s(iKvO~?=vx*!}0iL^f9+*)x6MR^g_M9rd*ROSEkcO!F~xoRw#=;a|o^mpC}P zxPA-VUwpq+wDj8~`>?6)n0OpY^Jp_D&7;MjG>`Uz(mc8eN==PqRcqDRFC!;fUw8I< zrJ~_HdVy4o^34Wh_Knh}?3a;e18>(idnOe#S5%qk{02ttcVM^(Lv-iwkLX#ayg)1r zJ0`g>FM3}pgyXSj9XOv<4EJT;wG#`Z4Plp90vA>Ny7&ZR6H5WpAeKoR#d6TASce|1 zOrAZ0cJh{oJz^E;3MO5e+dl^1CDs6c)4F}9nLm_ot@5{{I}53|`LOc#O={Hlv_q^z zUz*nK%LdHb|1ITuP;UMX%8hVJHUO^WTUNVhxHr#iKPY#-kDP8-RM3C`QQ103~2dP?Ce8 zD7*mhkm`mAGi7r6Ba8&c3}Zp-jOLl3CgEwK*0nCevleo8r2-iY-}MA6-4-6p*Crg4V8j@DRD-O3YpF%3sB;z zN1BUTn*q#YE=d|*D3}~NozNU;eSYWH{MN7ec9n1Yn%_Qd*^d7O3gQ{?2%HVNGZUP{%pcwH z!kCK`U{h3(QyONGrk<0RVvV2>gvY_aI#+Z9V;AaK)5u^qa zA2B6@5{Sf6IdYa9e&6Q)9kIi;3l(*h0e{^wM*UiS8iG^*CrhJd3T#tQ=*-X956(sPE z!ar(U1!7C#B0R^Ji0kxhE!$MK@qg+j>sU9ASMLHGR)%M~LpV5QZUUn)yZ&p|m~EkC zEQ*5$NZ18fa8cVE`m$(V?E(E5qWNbgJ3BIDU<}0~<8%_?7&tVH+Ys#Hcnpq0%~c;J za~xLtkhz@)n5VBJ7=;5-3E-A6DC`%QFA!}Id3t07BXEb+f*dHi^c#|J&yn zWvrHBTx(d|9=6n~6Jw=oNY$lX#KvXSM)zX4(23xX3(-kpJf@VP1Lq3N56E<*F6TYL zq7Npl6Q=tY$`U{R6}+k%b7`j=?wevk8OjG_c`$)G8jB*d>dwyGGmlAeWkB;X((E#+ zWAGIT66rj22U>XY2ueY?05spP;c_t=F+8uhK{J;M_s#IaigfVPC9IH0Qi9zuD4h)g$(YQ|QKpiRfbgWa85EQ_s(wPy1Tu$`*X>DObC;f-bCJl0phX z=HU%2QnJ`Gj)Kk=&JE>GW5SbMV~(RUd;b%*G;#8)kk=-APgt_IZidrS9&>ZqTWY8X z`to0}qTG!(*+Xto1LJ}XA|a1L2vK0*+9&KU*e2{D%hOOa0PQvCWZ%?#VCW;1Z4)*V znv~i#Pp9x3WFuDUdu?jFMyQr#w$-;q6g zqy;h(t{C7ab7Iu}n5An-omDA@h?@tv9 zcW)QhyncVmx8)121QoY^H8ZWh?q2k@W-PuEeAhM1od5a$=|dTprvjhCmO1NO--57f z#-4F;8ylAzcBLD3&37&|?47YL1Ngz^#+IKw!gT1J>AIcsjq~SkRxH*XS#E6o*`v!q z*tk2rargYm8?6f)yKhx@-@Q}9ZGcmiuc-gHdIN6vE9(FGP61cF2}LC}AD367sHEn9 zXWZ1guQN?tarvd^rkhiidCLbC z`24VvrR}B2|BiPb^xA*tu~5E{r@Yrn`C|9M4ffyFu<|;d@*7zBCLXn_+tfi+`!+Ptm`Wn`|_&r$HjX1Zr<7Rt9y_CVDy zt6C~;Ntd?FCKpQEC%cz@rIXJuSJh5?a5cB&Yfk%`XG3#)=cPs81Itw#rVDYwuvFHX zF2k8K7g;E~FI9No-8)rWal;p!&0UePSiKcMpV@o)xm(4}cW;;1zy70C*;X)-x8mdC za*CR%_?j|qK!2U7&a%-_Vk1&RlumT^#lkKR_o2t#b&vJKa$8rO<-=;8@^!whcKe5I z7RqnqDc^3T{4T0p#TK;X7+a7=1#_3nZ|+W5er^#hxn{1x4*4Qb0Bik)9c+*jfAY5N zx(!X>ftxaG!AQuP;?%HaDGWdp$k{!lbc~m4J}~CzGPl;aja16VPuTQc$VCVd zq3yBe5&5$`0!Xm9!=^OKg1lnO%GD`bR!SLiP61}Zlt)vhGV=;Tgz~m#rLdt_?5n7n zDv3c=u1=I0eVE{;Z22zFumN!|P0s~OtRR7VYVDcejIDgZ0&h>AtF%{~qCH^-@eFS; zFtcyb@g4Qf>`dTF$2Mu7bWA$oa(BH{h|gDWDHN#J>pJ--uZx(QL-n zh;bNlaAIpLn57m(&*&5YIxITf-XvXp0C(?ks-O@{GDb&&a7B}!2>~hSD1$+CkDT=( zF)xCtKu$!@eRfvLeQygRnRFeH0gTf0xvo)z|Nnt z;om-GnV@i15;AxUTnI*I@A#JN7+d{9B6tQ%5{nB66u?yn!W?z0MUjd7#{GGq5o;An zzzf9IOa~WQ$DP_1^2@{qZ$a7C&QrQ9hayYSq?+f}5e|?qSM|bylBKS?NNJ{PdDVGV zE7sN9i+Hq)d8Z!YJ>HpDy zE!6g=%6mV95}f$S-dX-%9zgMOZTH`Fe`Na)M{nN$(NL=Ti507*t`g3eib^QDwGA`D zt5wsE<*J%#+y5x5yLx2y@Z6#KmW2&_7s~df3imM!&|l1q1Njh*{4f%= zgGGyuOG_>L(=Gc`Wd{%xRP6cGTYBk-Q$I{K-kiRc| zt`GaRyScm1a4 ztsa(rH}n;iu>73{9FQ|Z(8F>}`G!EgvEu?lcgWSQQxCuCDrJbYd3M(mMP@x^C~Lec zML7x)DMO6XoFJ(MauwCt;&93ypTMoRfQXT@8-&be@! z8H5@$Zj~9Uc>)1M_ayPNfq+^V2t1n%Mm0T6bp`@rJcMGmVt4{H=O2kzSoq071U)9B zsxyJuNilL(bs<YF}t&Epy&QUT> zIQCO9_&8;{#*-&0A?F0sGga3ycI6t3Y9TmrkpFOxOg;E$Q4yydS>dGWpBmm*OIqB?X6!fs$44Cm@e9g z%%$j5R0sRq=lT=gk+N0Il)O=SwQ|-vd;HD*YyI;j?^V20afAQB{=R*_=qCSr`-k?_ zj-GV$;goPVU2|lGbJ-o44Xc~{+-~hAT9q^W8;+}v8D+NX%}1_1GS9zff5$#|PNO#W zT)OE%YU6=)^@A&%)$aJbh1=G7{eBIr;A+8ace=WD!M5k~25#%_>swQ{is@&s{OIzJ zX75Q?ZCS8&W^6Y5-kIPV(p4$LAv^c%Z<22%S@uTxmsFA|blQ7)jN{a`QyGr(^Nrg3 zM(_jaeV|d%oy~|Y%87sZp+O>D*p7&0@b4ts1 zANqaghn+0{soQg@Vya@r4%kek)7~*#MU8aKce7Wv*^ZC+zqS9tPAzw2N~`UAmdnbo zbY2D($~QH?dF0xWxo&Op=N?Hn!FWIgk*}Jnnl8Cgak*l~ohsRsc5hy>qb9Sv)PC=b zE>n@6JDK6|nm_*DlkYrvCWC2s>rmuvV%o-K9s>idTvB$Jw2K7 zHgsK|H)Juj<8O`M*z`f$`)xN*e$;sLsr0_y^!8&b94a$U@m_STtTtoE8v%C3C6|&@ z$&8b}T*jB1zC0X8*?hSnkt5m}p@8dX+v$Cm=m5&mhSS%+td1@XNkD zmWgPU9HMQVI=kcyyI81|1EE&PAuz>F`j}dObVLs_%_j-R7oKGCCx*)PjX0End{_e% zk|Kz4rrBvRAh@|1i6r!>&yfBrK7_im%agppu85kaNLMJ@0}w@cK`JuEe1Jk<(Zm?; zV(4<0Na*)>`2#1{-m9*;J=OGS-FRp7Zu-&=;*-ThuwqK4;I{rT>Y3x&^n$_a<8vJ3 z@Q@j{n080rdl)C!Aka05Nr9ZJygL-Et$BBt;G_0Q1Jcw^hBLnXTi5BEq5VIj<7*2D zLD{_RE1x>YE(qqt`JP4JzU8v&&&vFBjdO{GvfU})?v!h{c1n5JDJB0K>d#+N@+Kv8 zps=$;(+~feK1V2dpOSx%Bv)4dmI^6(jk>T0nY%ARR$C#fJvMu%!C}afV8Y7~5XgRH z`-)0Fr$l28BD9J*jIF=&PpDbV91`x4*I@vwXwzd2?O*_h=#ZSE6R@VK4PyF}p8}o2 zjJkOvV8A2(lPDSe$`*5aG@cc;`J!F(;($@vr6{5rU5FtoV60jQR&~p-gETxnv9t03 za(XNejzaUHeM46&E4z@;zQr!h`H@*xn`4nZkTPOUWRDg%^AlkDt*R|R&9EIylW*K% zeSo~yINPVhGudrQfa7(hJTOfHGwkJ;v>(XNaQ7m&TwXP4d(~}3zocE8XZ9?(HnTN{ z8EpRQmZ@*6E+T1=R{XF0S0t+)Lx!Qr0`zSc?CZF?ZMhEY3yujp!ulW5!}^^UToX>Y z9+4am#Wia~%$E(fjV3Ikt=2?Sz(8i&}7Perm`CfvRok@T> zMdT0ht?5yuQDHxvrh?y5V(Pf6Jsgo0{OA=w07z)AK_|>y@&K!RM4?__!L&!SX;}ko zzH=PN*|nqQS?yoa;?W%@3@Zm$wR669q4I&L0(g27%SEM^VpFl1Q?rNWS{90SPFfM2 zM2_GcQ;$p@nLhrpuX4Gv_DbY(WT|pXx{~f}jxSVhzij<9Zz(y2ci_}4E}QO|98bAw zG|}W;E1GDh=ZGfSe!9MUl75*@zx8oGhMyAPj8N@;N&GrX{sY0}6dxzo%E zC*3L17u%Hup*Vgx!hWHu$iyfzQG|6*@k=la6lVFW4jqTsM)i!aAH9=hCzFDsc^C?E z0!(FEQPq=;%GB&Vr>q5(%FM&()sU#;cDka2+Ua z-TJF!imRU4^hWd5=2`32wgqk*kc76my{U%I6j!(Qqh10sdF%u&Rsq?^XwaEub!O^zA0Uku3nf6{^rbE zXKpm6JDAy3_2A92RMnxhuLo*8Z^`uYg}iSXb^u;8(h9vY4IbV*8O(5aO?R!(D^t6f z-vqkJt1z{Yo$F?=`9mx8m3f4(UIIC|eX p?DX)RsiynxfNrNBTyHgu?&Oi7iha6+g{{ugYEi3>4 diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/tests.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/tests.cpython-312.pyc deleted file mode 100644 index 4e790559ea98134f7648f4e63985d888f85ec365..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9044 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 diff --git a/venv/lib/python3.12/site-packages/jinja2/__pycache__/utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/jinja2/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index defabba238c6fe3dc1d4f68afdc6cc5091c4d05c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34857 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 bool: - return t.cast(bool, args[0].is_async) - - else: - - def is_async(args: t.Any) -> bool: - return t.cast(bool, args[0].environment.is_async) - - # Take the doc and annotations from the sync function, but the - # name from the async function. Pallets-Sphinx-Themes - # build_function_directive expects __wrapped__ to point to the - # sync function. - async_func_attrs = ("__module__", "__name__", "__qualname__") - normal_func_attrs = tuple(set(WRAPPER_ASSIGNMENTS).difference(async_func_attrs)) - - @wraps(normal_func, assigned=normal_func_attrs) - @wraps(async_func, assigned=async_func_attrs, updated=()) - def wrapper(*args, **kwargs): # type: ignore - b = is_async(args) - - if need_eval_context: - args = args[1:] - - if b: - return async_func(*args, **kwargs) - - return normal_func(*args, **kwargs) - - if need_eval_context: - wrapper = pass_eval_context(wrapper) - - wrapper.jinja_async_variant = True # type: ignore[attr-defined] - return wrapper - - return decorator - - -_common_primitives = {int, float, bool, str, list, dict, tuple, type(None)} - - -async def auto_await(value: t.Union[t.Awaitable["V"], "V"]) -> "V": - # Avoid a costly call to isawaitable - if type(value) in _common_primitives: - return t.cast("V", value) - - if inspect.isawaitable(value): - return await t.cast("t.Awaitable[V]", value) - - return value - - -class _IteratorToAsyncIterator(t.Generic[V]): - def __init__(self, iterator: "t.Iterator[V]"): - self._iterator = iterator - - def __aiter__(self) -> "te.Self": - return self - - async def __anext__(self) -> V: - try: - return next(self._iterator) - except StopIteration as e: - raise StopAsyncIteration(e.value) from e - - -def auto_aiter( - iterable: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", -) -> "t.AsyncIterator[V]": - if hasattr(iterable, "__aiter__"): - return iterable.__aiter__() - else: - return _IteratorToAsyncIterator(iter(iterable)) - - -async def auto_to_list( - value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", -) -> t.List["V"]: - return [x async for x in auto_aiter(value)] diff --git a/venv/lib/python3.12/site-packages/jinja2/bccache.py b/venv/lib/python3.12/site-packages/jinja2/bccache.py deleted file mode 100644 index ada8b099..00000000 --- a/venv/lib/python3.12/site-packages/jinja2/bccache.py +++ /dev/null @@ -1,408 +0,0 @@ -"""The optional bytecode cache system. This is useful if you have very -complex template situations and the compilation of all those templates -slows down your application too much. - -Situations where this is useful are often forking web applications that -are initialized on the first request. -""" - -import errno -import fnmatch -import marshal -import os -import pickle -import stat -import sys -import tempfile -import typing as t -from hashlib import sha1 -from io import BytesIO -from types import CodeType - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .environment import Environment - - class _MemcachedClient(te.Protocol): - def get(self, key: str) -> bytes: ... - - def set( - self, key: str, value: bytes, timeout: t.Optional[int] = None - ) -> None: ... - - -bc_version = 5 -# Magic bytes to identify Jinja bytecode cache files. Contains the -# Python major and minor version to avoid loading incompatible bytecode -# if a project upgrades its Python version. -bc_magic = ( - b"j2" - + pickle.dumps(bc_version, 2) - + pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1], 2) -) - - -class Bucket: - """Buckets are used to store the bytecode for one template. It's created - and initialized by the bytecode cache and passed to the loading functions. - - The buckets get an internal checksum from the cache assigned and use this - to automatically reject outdated cache material. Individual bytecode - cache subclasses don't have to care about cache invalidation. - """ - - def __init__(self, environment: "Environment", key: str, checksum: str) -> None: - self.environment = environment - self.key = key - self.checksum = checksum - self.reset() - - def reset(self) -> None: - """Resets the bucket (unloads the bytecode).""" - self.code: t.Optional[CodeType] = None - - def load_bytecode(self, f: t.BinaryIO) -> None: - """Loads bytecode from a file or file like object.""" - # make sure the magic header is correct - magic = f.read(len(bc_magic)) - if magic != bc_magic: - self.reset() - return - # the source code of the file changed, we need to reload - checksum = pickle.load(f) - if self.checksum != checksum: - self.reset() - return - # if marshal_load fails then we need to reload - try: - self.code = marshal.load(f) - except (EOFError, ValueError, TypeError): - self.reset() - return - - def write_bytecode(self, f: t.IO[bytes]) -> None: - """Dump the bytecode into the file or file like object passed.""" - if self.code is None: - raise TypeError("can't write empty bucket") - f.write(bc_magic) - pickle.dump(self.checksum, f, 2) - marshal.dump(self.code, f) - - def bytecode_from_string(self, string: bytes) -> None: - """Load bytecode from bytes.""" - self.load_bytecode(BytesIO(string)) - - def bytecode_to_string(self) -> bytes: - """Return the bytecode as bytes.""" - out = BytesIO() - self.write_bytecode(out) - return out.getvalue() - - -class BytecodeCache: - """To implement your own bytecode cache you have to subclass this class - and override :meth:`load_bytecode` and :meth:`dump_bytecode`. Both of - these methods are passed a :class:`~jinja2.bccache.Bucket`. - - A very basic bytecode cache that saves the bytecode on the file system:: - - from os import path - - class MyCache(BytecodeCache): - - def __init__(self, directory): - self.directory = directory - - def load_bytecode(self, bucket): - filename = path.join(self.directory, bucket.key) - if path.exists(filename): - with open(filename, 'rb') as f: - bucket.load_bytecode(f) - - def dump_bytecode(self, bucket): - filename = path.join(self.directory, bucket.key) - with open(filename, 'wb') as f: - bucket.write_bytecode(f) - - A more advanced version of a filesystem based bytecode cache is part of - Jinja. - """ - - def load_bytecode(self, bucket: Bucket) -> None: - """Subclasses have to override this method to load bytecode into a - bucket. If they are not able to find code in the cache for the - bucket, it must not do anything. - """ - raise NotImplementedError() - - def dump_bytecode(self, bucket: Bucket) -> None: - """Subclasses have to override this method to write the bytecode - from a bucket back to the cache. If it unable to do so it must not - fail silently but raise an exception. - """ - raise NotImplementedError() - - def clear(self) -> None: - """Clears the cache. This method is not used by Jinja but should be - implemented to allow applications to clear the bytecode cache used - by a particular environment. - """ - - def get_cache_key( - self, name: str, filename: t.Optional[t.Union[str]] = None - ) -> str: - """Returns the unique hash key for this template name.""" - hash = sha1(name.encode("utf-8")) - - if filename is not None: - hash.update(f"|{filename}".encode()) - - return hash.hexdigest() - - def get_source_checksum(self, source: str) -> str: - """Returns a checksum for the source.""" - return sha1(source.encode("utf-8")).hexdigest() - - def get_bucket( - self, - environment: "Environment", - name: str, - filename: t.Optional[str], - source: str, - ) -> Bucket: - """Return a cache bucket for the given template. All arguments are - mandatory but filename may be `None`. - """ - key = self.get_cache_key(name, filename) - checksum = self.get_source_checksum(source) - bucket = Bucket(environment, key, checksum) - self.load_bytecode(bucket) - return bucket - - def set_bucket(self, bucket: Bucket) -> None: - """Put the bucket into the cache.""" - self.dump_bytecode(bucket) - - -class FileSystemBytecodeCache(BytecodeCache): - """A bytecode cache that stores bytecode on the filesystem. It accepts - two arguments: The directory where the cache items are stored and a - pattern string that is used to build the filename. - - If no directory is specified a default cache directory is selected. On - Windows the user's temp directory is used, on UNIX systems a directory - is created for the user in the system temp directory. - - The pattern can be used to have multiple separate caches operate on the - same directory. The default pattern is ``'__jinja2_%s.cache'``. ``%s`` - is replaced with the cache key. - - >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache') - - This bytecode cache supports clearing of the cache using the clear method. - """ - - def __init__( - self, directory: t.Optional[str] = None, pattern: str = "__jinja2_%s.cache" - ) -> None: - if directory is None: - directory = self._get_default_cache_dir() - self.directory = directory - self.pattern = pattern - - def _get_default_cache_dir(self) -> str: - def _unsafe_dir() -> "te.NoReturn": - raise RuntimeError( - "Cannot determine safe temp directory. You " - "need to explicitly provide one." - ) - - tmpdir = tempfile.gettempdir() - - # On windows the temporary directory is used specific unless - # explicitly forced otherwise. We can just use that. - if os.name == "nt": - return tmpdir - if not hasattr(os, "getuid"): - _unsafe_dir() - - dirname = f"_jinja2-cache-{os.getuid()}" - actual_dir = os.path.join(tmpdir, dirname) - - try: - os.mkdir(actual_dir, stat.S_IRWXU) - except OSError as e: - if e.errno != errno.EEXIST: - raise - try: - os.chmod(actual_dir, stat.S_IRWXU) - actual_dir_stat = os.lstat(actual_dir) - if ( - actual_dir_stat.st_uid != os.getuid() - or not stat.S_ISDIR(actual_dir_stat.st_mode) - or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU - ): - _unsafe_dir() - except OSError as e: - if e.errno != errno.EEXIST: - raise - - actual_dir_stat = os.lstat(actual_dir) - if ( - actual_dir_stat.st_uid != os.getuid() - or not stat.S_ISDIR(actual_dir_stat.st_mode) - or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU - ): - _unsafe_dir() - - return actual_dir - - def _get_cache_filename(self, bucket: Bucket) -> str: - return os.path.join(self.directory, self.pattern % (bucket.key,)) - - def load_bytecode(self, bucket: Bucket) -> None: - filename = self._get_cache_filename(bucket) - - # Don't test for existence before opening the file, since the - # file could disappear after the test before the open. - try: - f = open(filename, "rb") - except (FileNotFoundError, IsADirectoryError, PermissionError): - # PermissionError can occur on Windows when an operation is - # in progress, such as calling clear(). - return - - with f: - bucket.load_bytecode(f) - - def dump_bytecode(self, bucket: Bucket) -> None: - # Write to a temporary file, then rename to the real name after - # writing. This avoids another process reading the file before - # it is fully written. - name = self._get_cache_filename(bucket) - f = tempfile.NamedTemporaryFile( - mode="wb", - dir=os.path.dirname(name), - prefix=os.path.basename(name), - suffix=".tmp", - delete=False, - ) - - def remove_silent() -> None: - try: - os.remove(f.name) - except OSError: - # Another process may have called clear(). On Windows, - # another program may be holding the file open. - pass - - try: - with f: - bucket.write_bytecode(f) - except BaseException: - remove_silent() - raise - - try: - os.replace(f.name, name) - except OSError: - # Another process may have called clear(). On Windows, - # another program may be holding the file open. - remove_silent() - except BaseException: - remove_silent() - raise - - def clear(self) -> None: - # imported lazily here because google app-engine doesn't support - # write access on the file system and the function does not exist - # normally. - from os import remove - - files = fnmatch.filter(os.listdir(self.directory), self.pattern % ("*",)) - for filename in files: - try: - remove(os.path.join(self.directory, filename)) - except OSError: - pass - - -class MemcachedBytecodeCache(BytecodeCache): - """This class implements a bytecode cache that uses a memcache cache for - storing the information. It does not enforce a specific memcache library - (tummy's memcache or cmemcache) but will accept any class that provides - the minimal interface required. - - Libraries compatible with this class: - - - `cachelib `_ - - `python-memcached `_ - - (Unfortunately the django cache interface is not compatible because it - does not support storing binary data, only text. You can however pass - the underlying cache client to the bytecode cache which is available - as `django.core.cache.cache._client`.) - - The minimal interface for the client passed to the constructor is this: - - .. class:: MinimalClientInterface - - .. method:: set(key, value[, timeout]) - - Stores the bytecode in the cache. `value` is a string and - `timeout` the timeout of the key. If timeout is not provided - a default timeout or no timeout should be assumed, if it's - provided it's an integer with the number of seconds the cache - item should exist. - - .. method:: get(key) - - Returns the value for the cache key. If the item does not - exist in the cache the return value must be `None`. - - The other arguments to the constructor are the prefix for all keys that - is added before the actual cache key and the timeout for the bytecode in - the cache system. We recommend a high (or no) timeout. - - This bytecode cache does not support clearing of used items in the cache. - The clear method is a no-operation function. - - .. versionadded:: 2.7 - Added support for ignoring memcache errors through the - `ignore_memcache_errors` parameter. - """ - - def __init__( - self, - client: "_MemcachedClient", - prefix: str = "jinja2/bytecode/", - timeout: t.Optional[int] = None, - ignore_memcache_errors: bool = True, - ): - self.client = client - self.prefix = prefix - self.timeout = timeout - self.ignore_memcache_errors = ignore_memcache_errors - - def load_bytecode(self, bucket: Bucket) -> None: - try: - code = self.client.get(self.prefix + bucket.key) - except Exception: - if not self.ignore_memcache_errors: - raise - else: - bucket.bytecode_from_string(code) - - def dump_bytecode(self, bucket: Bucket) -> None: - key = self.prefix + bucket.key - value = bucket.bytecode_to_string() - - try: - if self.timeout is not None: - self.client.set(key, value, self.timeout) - else: - self.client.set(key, value) - except Exception: - if not self.ignore_memcache_errors: - raise diff --git a/venv/lib/python3.12/site-packages/jinja2/compiler.py b/venv/lib/python3.12/site-packages/jinja2/compiler.py deleted file mode 100644 index a4ff6a1b..00000000 --- a/venv/lib/python3.12/site-packages/jinja2/compiler.py +++ /dev/null @@ -1,1998 +0,0 @@ -"""Compiles nodes from the parser into Python code.""" - -import typing as t -from contextlib import contextmanager -from functools import update_wrapper -from io import StringIO -from itertools import chain -from keyword import iskeyword as is_python_keyword - -from markupsafe import escape -from markupsafe import Markup - -from . import nodes -from .exceptions import TemplateAssertionError -from .idtracking import Symbols -from .idtracking import VAR_LOAD_ALIAS -from .idtracking import VAR_LOAD_PARAMETER -from .idtracking import VAR_LOAD_RESOLVE -from .idtracking import VAR_LOAD_UNDEFINED -from .nodes import EvalContext -from .optimizer import Optimizer -from .utils import _PassArg -from .utils import concat -from .visitor import NodeVisitor - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .environment import Environment - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - -operators = { - "eq": "==", - "ne": "!=", - "gt": ">", - "gteq": ">=", - "lt": "<", - "lteq": "<=", - "in": "in", - "notin": "not in", -} - - -def optimizeconst(f: F) -> F: - def new_func( - self: "CodeGenerator", node: nodes.Expr, frame: "Frame", **kwargs: t.Any - ) -> t.Any: - # Only optimize if the frame is not volatile - if self.optimizer is not None and not frame.eval_ctx.volatile: - new_node = self.optimizer.visit(node, frame.eval_ctx) - - if new_node != node: - return self.visit(new_node, frame) - - return f(self, node, frame, **kwargs) - - return update_wrapper(new_func, f) # type: ignore[return-value] - - -def _make_binop(op: str) -> t.Callable[["CodeGenerator", nodes.BinExpr, "Frame"], None]: - @optimizeconst - def visitor(self: "CodeGenerator", node: nodes.BinExpr, frame: Frame) -> None: - if ( - self.environment.sandboxed and op in self.environment.intercepted_binops # type: ignore - ): - self.write(f"environment.call_binop(context, {op!r}, ") - self.visit(node.left, frame) - self.write(", ") - self.visit(node.right, frame) - else: - self.write("(") - self.visit(node.left, frame) - self.write(f" {op} ") - self.visit(node.right, frame) - - self.write(")") - - return visitor - - -def _make_unop( - op: str, -) -> t.Callable[["CodeGenerator", nodes.UnaryExpr, "Frame"], None]: - @optimizeconst - def visitor(self: "CodeGenerator", node: nodes.UnaryExpr, frame: Frame) -> None: - if ( - self.environment.sandboxed and op in self.environment.intercepted_unops # type: ignore - ): - self.write(f"environment.call_unop(context, {op!r}, ") - self.visit(node.node, frame) - else: - self.write("(" + op) - self.visit(node.node, frame) - - self.write(")") - - return visitor - - -def generate( - node: nodes.Template, - environment: "Environment", - name: t.Optional[str], - filename: t.Optional[str], - stream: t.Optional[t.TextIO] = None, - defer_init: bool = False, - optimized: bool = True, -) -> t.Optional[str]: - """Generate the python source for a node tree.""" - if not isinstance(node, nodes.Template): - raise TypeError("Can't compile non template nodes") - - generator = environment.code_generator_class( - environment, name, filename, stream, defer_init, optimized - ) - generator.visit(node) - - if stream is None: - return generator.stream.getvalue() # type: ignore - - return None - - -def has_safe_repr(value: t.Any) -> bool: - """Does the node have a safe representation?""" - if value is None or value is NotImplemented or value is Ellipsis: - return True - - if type(value) in {bool, int, float, complex, range, str, Markup}: - return True - - if type(value) in {tuple, list, set, frozenset}: - return all(has_safe_repr(v) for v in value) - - if type(value) is dict: # noqa E721 - return all(has_safe_repr(k) and has_safe_repr(v) for k, v in value.items()) - - return False - - -def find_undeclared( - nodes: t.Iterable[nodes.Node], names: t.Iterable[str] -) -> t.Set[str]: - """Check if the names passed are accessed undeclared. The return value - is a set of all the undeclared names from the sequence of names found. - """ - visitor = UndeclaredNameVisitor(names) - try: - for node in nodes: - visitor.visit(node) - except VisitorExit: - pass - return visitor.undeclared - - -class MacroRef: - def __init__(self, node: t.Union[nodes.Macro, nodes.CallBlock]) -> None: - self.node = node - self.accesses_caller = False - self.accesses_kwargs = False - self.accesses_varargs = False - - -class Frame: - """Holds compile time information for us.""" - - def __init__( - self, - eval_ctx: EvalContext, - parent: t.Optional["Frame"] = None, - level: t.Optional[int] = None, - ) -> None: - self.eval_ctx = eval_ctx - - # the parent of this frame - self.parent = parent - - if parent is None: - self.symbols = Symbols(level=level) - - # in some dynamic inheritance situations the compiler needs to add - # write tests around output statements. - self.require_output_check = False - - # inside some tags we are using a buffer rather than yield statements. - # this for example affects {% filter %} or {% macro %}. If a frame - # is buffered this variable points to the name of the list used as - # buffer. - self.buffer: t.Optional[str] = None - - # the name of the block we're in, otherwise None. - self.block: t.Optional[str] = None - - else: - self.symbols = Symbols(parent.symbols, level=level) - self.require_output_check = parent.require_output_check - self.buffer = parent.buffer - self.block = parent.block - - # a toplevel frame is the root + soft frames such as if conditions. - self.toplevel = False - - # the root frame is basically just the outermost frame, so no if - # conditions. This information is used to optimize inheritance - # situations. - self.rootlevel = False - - # variables set inside of loops and blocks should not affect outer frames, - # but they still needs to be kept track of as part of the active context. - self.loop_frame = False - self.block_frame = False - - # track whether the frame is being used in an if-statement or conditional - # expression as it determines which errors should be raised during runtime - # or compile time. - self.soft_frame = False - - def copy(self) -> "te.Self": - """Create a copy of the current one.""" - rv = object.__new__(self.__class__) - rv.__dict__.update(self.__dict__) - rv.symbols = self.symbols.copy() - return rv - - def inner(self, isolated: bool = False) -> "Frame": - """Return an inner frame.""" - if isolated: - return Frame(self.eval_ctx, level=self.symbols.level + 1) - return Frame(self.eval_ctx, self) - - def soft(self) -> "te.Self": - """Return a soft frame. A soft frame may not be modified as - standalone thing as it shares the resources with the frame it - was created of, but it's not a rootlevel frame any longer. - - This is only used to implement if-statements and conditional - expressions. - """ - rv = self.copy() - rv.rootlevel = False - rv.soft_frame = True - return rv - - __copy__ = copy - - -class VisitorExit(RuntimeError): - """Exception used by the `UndeclaredNameVisitor` to signal a stop.""" - - -class DependencyFinderVisitor(NodeVisitor): - """A visitor that collects filter and test calls.""" - - def __init__(self) -> None: - self.filters: t.Set[str] = set() - self.tests: t.Set[str] = set() - - def visit_Filter(self, node: nodes.Filter) -> None: - self.generic_visit(node) - self.filters.add(node.name) - - def visit_Test(self, node: nodes.Test) -> None: - self.generic_visit(node) - self.tests.add(node.name) - - def visit_Block(self, node: nodes.Block) -> None: - """Stop visiting at blocks.""" - - -class UndeclaredNameVisitor(NodeVisitor): - """A visitor that checks if a name is accessed without being - declared. This is different from the frame visitor as it will - not stop at closure frames. - """ - - def __init__(self, names: t.Iterable[str]) -> None: - self.names = set(names) - self.undeclared: t.Set[str] = set() - - def visit_Name(self, node: nodes.Name) -> None: - if node.ctx == "load" and node.name in self.names: - self.undeclared.add(node.name) - if self.undeclared == self.names: - raise VisitorExit() - else: - self.names.discard(node.name) - - def visit_Block(self, node: nodes.Block) -> None: - """Stop visiting a blocks.""" - - -class CompilerExit(Exception): - """Raised if the compiler encountered a situation where it just - doesn't make sense to further process the code. Any block that - raises such an exception is not further processed. - """ - - -class CodeGenerator(NodeVisitor): - def __init__( - self, - environment: "Environment", - name: t.Optional[str], - filename: t.Optional[str], - stream: t.Optional[t.TextIO] = None, - defer_init: bool = False, - optimized: bool = True, - ) -> None: - if stream is None: - stream = StringIO() - self.environment = environment - self.name = name - self.filename = filename - self.stream = stream - self.created_block_context = False - self.defer_init = defer_init - self.optimizer: t.Optional[Optimizer] = None - - if optimized: - self.optimizer = Optimizer(environment) - - # aliases for imports - self.import_aliases: t.Dict[str, str] = {} - - # a registry for all blocks. Because blocks are moved out - # into the global python scope they are registered here - self.blocks: t.Dict[str, nodes.Block] = {} - - # the number of extends statements so far - self.extends_so_far = 0 - - # some templates have a rootlevel extends. In this case we - # can safely assume that we're a child template and do some - # more optimizations. - self.has_known_extends = False - - # the current line number - self.code_lineno = 1 - - # registry of all filters and tests (global, not block local) - self.tests: t.Dict[str, str] = {} - self.filters: t.Dict[str, str] = {} - - # the debug information - self.debug_info: t.List[t.Tuple[int, int]] = [] - self._write_debug_info: t.Optional[int] = None - - # the number of new lines before the next write() - self._new_lines = 0 - - # the line number of the last written statement - self._last_line = 0 - - # true if nothing was written so far. - self._first_write = True - - # used by the `temporary_identifier` method to get new - # unique, temporary identifier - self._last_identifier = 0 - - # the current indentation - self._indentation = 0 - - # Tracks toplevel assignments - self._assign_stack: t.List[t.Set[str]] = [] - - # Tracks parameter definition blocks - self._param_def_block: t.List[t.Set[str]] = [] - - # Tracks the current context. - self._context_reference_stack = ["context"] - - @property - def optimized(self) -> bool: - return self.optimizer is not None - - # -- Various compilation helpers - - def fail(self, msg: str, lineno: int) -> "te.NoReturn": - """Fail with a :exc:`TemplateAssertionError`.""" - raise TemplateAssertionError(msg, lineno, self.name, self.filename) - - def temporary_identifier(self) -> str: - """Get a new unique identifier.""" - self._last_identifier += 1 - return f"t_{self._last_identifier}" - - def buffer(self, frame: Frame) -> None: - """Enable buffering for the frame from that point onwards.""" - frame.buffer = self.temporary_identifier() - self.writeline(f"{frame.buffer} = []") - - def return_buffer_contents( - self, frame: Frame, force_unescaped: bool = False - ) -> None: - """Return the buffer contents of the frame.""" - if not force_unescaped: - if frame.eval_ctx.volatile: - self.writeline("if context.eval_ctx.autoescape:") - self.indent() - self.writeline(f"return Markup(concat({frame.buffer}))") - self.outdent() - self.writeline("else:") - self.indent() - self.writeline(f"return concat({frame.buffer})") - self.outdent() - return - elif frame.eval_ctx.autoescape: - self.writeline(f"return Markup(concat({frame.buffer}))") - return - self.writeline(f"return concat({frame.buffer})") - - def indent(self) -> None: - """Indent by one.""" - self._indentation += 1 - - def outdent(self, step: int = 1) -> None: - """Outdent by step.""" - self._indentation -= step - - def start_write(self, frame: Frame, node: t.Optional[nodes.Node] = None) -> None: - """Yield or write into the frame buffer.""" - if frame.buffer is None: - self.writeline("yield ", node) - else: - self.writeline(f"{frame.buffer}.append(", node) - - def end_write(self, frame: Frame) -> None: - """End the writing process started by `start_write`.""" - if frame.buffer is not None: - self.write(")") - - def simple_write( - self, s: str, frame: Frame, node: t.Optional[nodes.Node] = None - ) -> None: - """Simple shortcut for start_write + write + end_write.""" - self.start_write(frame, node) - self.write(s) - self.end_write(frame) - - def blockvisit(self, nodes: t.Iterable[nodes.Node], frame: Frame) -> None: - """Visit a list of nodes as block in a frame. If the current frame - is no buffer a dummy ``if 0: yield None`` is written automatically. - """ - try: - self.writeline("pass") - for node in nodes: - self.visit(node, frame) - except CompilerExit: - pass - - def write(self, x: str) -> None: - """Write a string into the output stream.""" - if self._new_lines: - if not self._first_write: - self.stream.write("\n" * self._new_lines) - self.code_lineno += self._new_lines - if self._write_debug_info is not None: - self.debug_info.append((self._write_debug_info, self.code_lineno)) - self._write_debug_info = None - self._first_write = False - self.stream.write(" " * self._indentation) - self._new_lines = 0 - self.stream.write(x) - - def writeline( - self, x: str, node: t.Optional[nodes.Node] = None, extra: int = 0 - ) -> None: - """Combination of newline and write.""" - self.newline(node, extra) - self.write(x) - - def newline(self, node: t.Optional[nodes.Node] = None, extra: int = 0) -> None: - """Add one or more newlines before the next write.""" - self._new_lines = max(self._new_lines, 1 + extra) - if node is not None and node.lineno != self._last_line: - self._write_debug_info = node.lineno - self._last_line = node.lineno - - def signature( - self, - node: t.Union[nodes.Call, nodes.Filter, nodes.Test], - frame: Frame, - extra_kwargs: t.Optional[t.Mapping[str, t.Any]] = None, - ) -> None: - """Writes a function call to the stream for the current node. - A leading comma is added automatically. The extra keyword - arguments may not include python keywords otherwise a syntax - error could occur. The extra keyword arguments should be given - as python dict. - """ - # if any of the given keyword arguments is a python keyword - # we have to make sure that no invalid call is created. - kwarg_workaround = any( - is_python_keyword(t.cast(str, k)) - for k in chain((x.key for x in node.kwargs), extra_kwargs or ()) - ) - - for arg in node.args: - self.write(", ") - self.visit(arg, frame) - - if not kwarg_workaround: - for kwarg in node.kwargs: - self.write(", ") - self.visit(kwarg, frame) - if extra_kwargs is not None: - for key, value in extra_kwargs.items(): - self.write(f", {key}={value}") - if node.dyn_args: - self.write(", *") - self.visit(node.dyn_args, frame) - - if kwarg_workaround: - if node.dyn_kwargs is not None: - self.write(", **dict({") - else: - self.write(", **{") - for kwarg in node.kwargs: - self.write(f"{kwarg.key!r}: ") - self.visit(kwarg.value, frame) - self.write(", ") - if extra_kwargs is not None: - for key, value in extra_kwargs.items(): - self.write(f"{key!r}: {value}, ") - if node.dyn_kwargs is not None: - self.write("}, **") - self.visit(node.dyn_kwargs, frame) - self.write(")") - else: - self.write("}") - - elif node.dyn_kwargs is not None: - self.write(", **") - self.visit(node.dyn_kwargs, frame) - - def pull_dependencies(self, nodes: t.Iterable[nodes.Node]) -> None: - """Find all filter and test names used in the template and - assign them to variables in the compiled namespace. Checking - that the names are registered with the environment is done when - compiling the Filter and Test nodes. If the node is in an If or - CondExpr node, the check is done at runtime instead. - - .. versionchanged:: 3.0 - Filters and tests in If and CondExpr nodes are checked at - runtime instead of compile time. - """ - visitor = DependencyFinderVisitor() - - for node in nodes: - visitor.visit(node) - - for id_map, names, dependency in ( - (self.filters, visitor.filters, "filters"), - ( - self.tests, - visitor.tests, - "tests", - ), - ): - for name in sorted(names): - if name not in id_map: - id_map[name] = self.temporary_identifier() - - # add check during runtime that dependencies used inside of executed - # blocks are defined, as this step may be skipped during compile time - self.writeline("try:") - self.indent() - self.writeline(f"{id_map[name]} = environment.{dependency}[{name!r}]") - self.outdent() - self.writeline("except KeyError:") - self.indent() - self.writeline("@internalcode") - self.writeline(f"def {id_map[name]}(*unused):") - self.indent() - self.writeline( - f'raise TemplateRuntimeError("No {dependency[:-1]}' - f' named {name!r} found.")' - ) - self.outdent() - self.outdent() - - def enter_frame(self, frame: Frame) -> None: - undefs = [] - for target, (action, param) in frame.symbols.loads.items(): - if action == VAR_LOAD_PARAMETER: - pass - elif action == VAR_LOAD_RESOLVE: - self.writeline(f"{target} = {self.get_resolve_func()}({param!r})") - elif action == VAR_LOAD_ALIAS: - self.writeline(f"{target} = {param}") - elif action == VAR_LOAD_UNDEFINED: - undefs.append(target) - else: - raise NotImplementedError("unknown load instruction") - if undefs: - self.writeline(f"{' = '.join(undefs)} = missing") - - def leave_frame(self, frame: Frame, with_python_scope: bool = False) -> None: - if not with_python_scope: - undefs = [] - for target in frame.symbols.loads: - undefs.append(target) - if undefs: - self.writeline(f"{' = '.join(undefs)} = missing") - - def choose_async(self, async_value: str = "async ", sync_value: str = "") -> str: - return async_value if self.environment.is_async else sync_value - - def func(self, name: str) -> str: - return f"{self.choose_async()}def {name}" - - def macro_body( - self, node: t.Union[nodes.Macro, nodes.CallBlock], frame: Frame - ) -> t.Tuple[Frame, MacroRef]: - """Dump the function def of a macro or call block.""" - frame = frame.inner() - frame.symbols.analyze_node(node) - macro_ref = MacroRef(node) - - explicit_caller = None - skip_special_params = set() - args = [] - - for idx, arg in enumerate(node.args): - if arg.name == "caller": - explicit_caller = idx - if arg.name in ("kwargs", "varargs"): - skip_special_params.add(arg.name) - args.append(frame.symbols.ref(arg.name)) - - undeclared = find_undeclared(node.body, ("caller", "kwargs", "varargs")) - - if "caller" in undeclared: - # In older Jinja versions there was a bug that allowed caller - # to retain the special behavior even if it was mentioned in - # the argument list. However thankfully this was only really - # working if it was the last argument. So we are explicitly - # checking this now and error out if it is anywhere else in - # the argument list. - if explicit_caller is not None: - try: - node.defaults[explicit_caller - len(node.args)] - except IndexError: - self.fail( - "When defining macros or call blocks the " - 'special "caller" argument must be omitted ' - "or be given a default.", - node.lineno, - ) - else: - args.append(frame.symbols.declare_parameter("caller")) - macro_ref.accesses_caller = True - if "kwargs" in undeclared and "kwargs" not in skip_special_params: - args.append(frame.symbols.declare_parameter("kwargs")) - macro_ref.accesses_kwargs = True - if "varargs" in undeclared and "varargs" not in skip_special_params: - args.append(frame.symbols.declare_parameter("varargs")) - macro_ref.accesses_varargs = True - - # macros are delayed, they never require output checks - frame.require_output_check = False - frame.symbols.analyze_node(node) - self.writeline(f"{self.func('macro')}({', '.join(args)}):", node) - self.indent() - - self.buffer(frame) - self.enter_frame(frame) - - self.push_parameter_definitions(frame) - for idx, arg in enumerate(node.args): - ref = frame.symbols.ref(arg.name) - self.writeline(f"if {ref} is missing:") - self.indent() - try: - default = node.defaults[idx - len(node.args)] - except IndexError: - self.writeline( - f'{ref} = undefined("parameter {arg.name!r} was not provided",' - f" name={arg.name!r})" - ) - else: - self.writeline(f"{ref} = ") - self.visit(default, frame) - self.mark_parameter_stored(ref) - self.outdent() - self.pop_parameter_definitions() - - self.blockvisit(node.body, frame) - self.return_buffer_contents(frame, force_unescaped=True) - self.leave_frame(frame, with_python_scope=True) - self.outdent() - - return frame, macro_ref - - def macro_def(self, macro_ref: MacroRef, frame: Frame) -> None: - """Dump the macro definition for the def created by macro_body.""" - arg_tuple = ", ".join(repr(x.name) for x in macro_ref.node.args) - name = getattr(macro_ref.node, "name", None) - if len(macro_ref.node.args) == 1: - arg_tuple += "," - self.write( - f"Macro(environment, macro, {name!r}, ({arg_tuple})," - f" {macro_ref.accesses_kwargs!r}, {macro_ref.accesses_varargs!r}," - f" {macro_ref.accesses_caller!r}, context.eval_ctx.autoescape)" - ) - - def position(self, node: nodes.Node) -> str: - """Return a human readable position for the node.""" - rv = f"line {node.lineno}" - if self.name is not None: - rv = f"{rv} in {self.name!r}" - return rv - - def dump_local_context(self, frame: Frame) -> str: - items_kv = ", ".join( - f"{name!r}: {target}" - for name, target in frame.symbols.dump_stores().items() - ) - return f"{{{items_kv}}}" - - def write_commons(self) -> None: - """Writes a common preamble that is used by root and block functions. - Primarily this sets up common local helpers and enforces a generator - through a dead branch. - """ - self.writeline("resolve = context.resolve_or_missing") - self.writeline("undefined = environment.undefined") - self.writeline("concat = environment.concat") - # always use the standard Undefined class for the implicit else of - # conditional expressions - self.writeline("cond_expr_undefined = Undefined") - self.writeline("if 0: yield None") - - def push_parameter_definitions(self, frame: Frame) -> None: - """Pushes all parameter targets from the given frame into a local - stack that permits tracking of yet to be assigned parameters. In - particular this enables the optimization from `visit_Name` to skip - undefined expressions for parameters in macros as macros can reference - otherwise unbound parameters. - """ - self._param_def_block.append(frame.symbols.dump_param_targets()) - - def pop_parameter_definitions(self) -> None: - """Pops the current parameter definitions set.""" - self._param_def_block.pop() - - def mark_parameter_stored(self, target: str) -> None: - """Marks a parameter in the current parameter definitions as stored. - This will skip the enforced undefined checks. - """ - if self._param_def_block: - self._param_def_block[-1].discard(target) - - def push_context_reference(self, target: str) -> None: - self._context_reference_stack.append(target) - - def pop_context_reference(self) -> None: - self._context_reference_stack.pop() - - def get_context_ref(self) -> str: - return self._context_reference_stack[-1] - - def get_resolve_func(self) -> str: - target = self._context_reference_stack[-1] - if target == "context": - return "resolve" - return f"{target}.resolve" - - def derive_context(self, frame: Frame) -> str: - return f"{self.get_context_ref()}.derived({self.dump_local_context(frame)})" - - def parameter_is_undeclared(self, target: str) -> bool: - """Checks if a given target is an undeclared parameter.""" - if not self._param_def_block: - return False - return target in self._param_def_block[-1] - - def push_assign_tracking(self) -> None: - """Pushes a new layer for assignment tracking.""" - self._assign_stack.append(set()) - - def pop_assign_tracking(self, frame: Frame) -> None: - """Pops the topmost level for assignment tracking and updates the - context variables if necessary. - """ - vars = self._assign_stack.pop() - if ( - not frame.block_frame - and not frame.loop_frame - and not frame.toplevel - or not vars - ): - return - public_names = [x for x in vars if x[:1] != "_"] - if len(vars) == 1: - name = next(iter(vars)) - ref = frame.symbols.ref(name) - if frame.loop_frame: - self.writeline(f"_loop_vars[{name!r}] = {ref}") - return - if frame.block_frame: - self.writeline(f"_block_vars[{name!r}] = {ref}") - return - self.writeline(f"context.vars[{name!r}] = {ref}") - else: - if frame.loop_frame: - self.writeline("_loop_vars.update({") - elif frame.block_frame: - self.writeline("_block_vars.update({") - else: - self.writeline("context.vars.update({") - for idx, name in enumerate(sorted(vars)): - if idx: - self.write(", ") - ref = frame.symbols.ref(name) - self.write(f"{name!r}: {ref}") - self.write("})") - if not frame.block_frame and not frame.loop_frame and public_names: - if len(public_names) == 1: - self.writeline(f"context.exported_vars.add({public_names[0]!r})") - else: - names_str = ", ".join(map(repr, sorted(public_names))) - self.writeline(f"context.exported_vars.update(({names_str}))") - - # -- Statement Visitors - - def visit_Template( - self, node: nodes.Template, frame: t.Optional[Frame] = None - ) -> None: - assert frame is None, "no root frame allowed" - eval_ctx = EvalContext(self.environment, self.name) - - from .runtime import async_exported - from .runtime import exported - - if self.environment.is_async: - exported_names = sorted(exported + async_exported) - else: - exported_names = sorted(exported) - - self.writeline("from jinja2.runtime import " + ", ".join(exported_names)) - - # if we want a deferred initialization we cannot move the - # environment into a local name - envenv = "" if self.defer_init else ", environment=environment" - - # do we have an extends tag at all? If not, we can save some - # overhead by just not processing any inheritance code. - have_extends = node.find(nodes.Extends) is not None - - # find all blocks - for block in node.find_all(nodes.Block): - if block.name in self.blocks: - self.fail(f"block {block.name!r} defined twice", block.lineno) - self.blocks[block.name] = block - - # find all imports and import them - for import_ in node.find_all(nodes.ImportedName): - if import_.importname not in self.import_aliases: - imp = import_.importname - self.import_aliases[imp] = alias = self.temporary_identifier() - if "." in imp: - module, obj = imp.rsplit(".", 1) - self.writeline(f"from {module} import {obj} as {alias}") - else: - self.writeline(f"import {imp} as {alias}") - - # add the load name - self.writeline(f"name = {self.name!r}") - - # generate the root render function. - self.writeline( - f"{self.func('root')}(context, missing=missing{envenv}):", extra=1 - ) - self.indent() - self.write_commons() - - # process the root - frame = Frame(eval_ctx) - if "self" in find_undeclared(node.body, ("self",)): - ref = frame.symbols.declare_parameter("self") - self.writeline(f"{ref} = TemplateReference(context)") - frame.symbols.analyze_node(node) - frame.toplevel = frame.rootlevel = True - frame.require_output_check = have_extends and not self.has_known_extends - if have_extends: - self.writeline("parent_template = None") - self.enter_frame(frame) - self.pull_dependencies(node.body) - self.blockvisit(node.body, frame) - self.leave_frame(frame, with_python_scope=True) - self.outdent() - - # make sure that the parent root is called. - if have_extends: - if not self.has_known_extends: - self.indent() - self.writeline("if parent_template is not None:") - self.indent() - if not self.environment.is_async: - self.writeline("yield from parent_template.root_render_func(context)") - else: - self.writeline("agen = parent_template.root_render_func(context)") - self.writeline("try:") - self.indent() - self.writeline("async for event in agen:") - self.indent() - self.writeline("yield event") - self.outdent() - self.outdent() - self.writeline("finally: await agen.aclose()") - self.outdent(1 + (not self.has_known_extends)) - - # at this point we now have the blocks collected and can visit them too. - for name, block in self.blocks.items(): - self.writeline( - f"{self.func('block_' + name)}(context, missing=missing{envenv}):", - block, - 1, - ) - self.indent() - self.write_commons() - # It's important that we do not make this frame a child of the - # toplevel template. This would cause a variety of - # interesting issues with identifier tracking. - block_frame = Frame(eval_ctx) - block_frame.block_frame = True - undeclared = find_undeclared(block.body, ("self", "super")) - if "self" in undeclared: - ref = block_frame.symbols.declare_parameter("self") - self.writeline(f"{ref} = TemplateReference(context)") - if "super" in undeclared: - ref = block_frame.symbols.declare_parameter("super") - self.writeline(f"{ref} = context.super({name!r}, block_{name})") - block_frame.symbols.analyze_node(block) - block_frame.block = name - self.writeline("_block_vars = {}") - self.enter_frame(block_frame) - self.pull_dependencies(block.body) - self.blockvisit(block.body, block_frame) - self.leave_frame(block_frame, with_python_scope=True) - self.outdent() - - blocks_kv_str = ", ".join(f"{x!r}: block_{x}" for x in self.blocks) - self.writeline(f"blocks = {{{blocks_kv_str}}}", extra=1) - debug_kv_str = "&".join(f"{k}={v}" for k, v in self.debug_info) - self.writeline(f"debug_info = {debug_kv_str!r}") - - def visit_Block(self, node: nodes.Block, frame: Frame) -> None: - """Call a block and register it for the template.""" - level = 0 - if frame.toplevel: - # if we know that we are a child template, there is no need to - # check if we are one - if self.has_known_extends: - return - if self.extends_so_far > 0: - self.writeline("if parent_template is None:") - self.indent() - level += 1 - - if node.scoped: - context = self.derive_context(frame) - else: - context = self.get_context_ref() - - if node.required: - self.writeline(f"if len(context.blocks[{node.name!r}]) <= 1:", node) - self.indent() - self.writeline( - f'raise TemplateRuntimeError("Required block {node.name!r} not found")', - node, - ) - self.outdent() - - if not self.environment.is_async and frame.buffer is None: - self.writeline( - f"yield from context.blocks[{node.name!r}][0]({context})", node - ) - else: - self.writeline(f"gen = context.blocks[{node.name!r}][0]({context})") - self.writeline("try:") - self.indent() - self.writeline( - f"{self.choose_async()}for event in gen:", - node, - ) - self.indent() - self.simple_write("event", frame) - self.outdent() - self.outdent() - self.writeline( - f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" - ) - - self.outdent(level) - - def visit_Extends(self, node: nodes.Extends, frame: Frame) -> None: - """Calls the extender.""" - if not frame.toplevel: - self.fail("cannot use extend from a non top-level scope", node.lineno) - - # if the number of extends statements in general is zero so - # far, we don't have to add a check if something extended - # the template before this one. - if self.extends_so_far > 0: - # if we have a known extends we just add a template runtime - # error into the generated code. We could catch that at compile - # time too, but i welcome it not to confuse users by throwing the - # same error at different times just "because we can". - if not self.has_known_extends: - self.writeline("if parent_template is not None:") - self.indent() - self.writeline('raise TemplateRuntimeError("extended multiple times")') - - # if we have a known extends already we don't need that code here - # as we know that the template execution will end here. - if self.has_known_extends: - raise CompilerExit() - else: - self.outdent() - - self.writeline("parent_template = environment.get_template(", node) - self.visit(node.template, frame) - self.write(f", {self.name!r})") - self.writeline("for name, parent_block in parent_template.blocks.items():") - self.indent() - self.writeline("context.blocks.setdefault(name, []).append(parent_block)") - self.outdent() - - # if this extends statement was in the root level we can take - # advantage of that information and simplify the generated code - # in the top level from this point onwards - if frame.rootlevel: - self.has_known_extends = True - - # and now we have one more - self.extends_so_far += 1 - - def visit_Include(self, node: nodes.Include, frame: Frame) -> None: - """Handles includes.""" - if node.ignore_missing: - self.writeline("try:") - self.indent() - - func_name = "get_or_select_template" - if isinstance(node.template, nodes.Const): - if isinstance(node.template.value, str): - func_name = "get_template" - elif isinstance(node.template.value, (tuple, list)): - func_name = "select_template" - elif isinstance(node.template, (nodes.Tuple, nodes.List)): - func_name = "select_template" - - self.writeline(f"template = environment.{func_name}(", node) - self.visit(node.template, frame) - self.write(f", {self.name!r})") - if node.ignore_missing: - self.outdent() - self.writeline("except TemplateNotFound:") - self.indent() - self.writeline("pass") - self.outdent() - self.writeline("else:") - self.indent() - - def loop_body() -> None: - self.indent() - self.simple_write("event", frame) - self.outdent() - - if node.with_context: - self.writeline( - f"gen = template.root_render_func(" - "template.new_context(context.get_all(), True," - f" {self.dump_local_context(frame)}))" - ) - self.writeline("try:") - self.indent() - self.writeline(f"{self.choose_async()}for event in gen:") - loop_body() - self.outdent() - self.writeline( - f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" - ) - elif self.environment.is_async: - self.writeline( - "for event in (await template._get_default_module_async())" - "._body_stream:" - ) - loop_body() - else: - self.writeline("yield from template._get_default_module()._body_stream") - - if node.ignore_missing: - self.outdent() - - def _import_common( - self, node: t.Union[nodes.Import, nodes.FromImport], frame: Frame - ) -> None: - self.write(f"{self.choose_async('await ')}environment.get_template(") - self.visit(node.template, frame) - self.write(f", {self.name!r}).") - - if node.with_context: - f_name = f"make_module{self.choose_async('_async')}" - self.write( - f"{f_name}(context.get_all(), True, {self.dump_local_context(frame)})" - ) - else: - self.write(f"_get_default_module{self.choose_async('_async')}(context)") - - def visit_Import(self, node: nodes.Import, frame: Frame) -> None: - """Visit regular imports.""" - self.writeline(f"{frame.symbols.ref(node.target)} = ", node) - if frame.toplevel: - self.write(f"context.vars[{node.target!r}] = ") - - self._import_common(node, frame) - - if frame.toplevel and not node.target.startswith("_"): - self.writeline(f"context.exported_vars.discard({node.target!r})") - - def visit_FromImport(self, node: nodes.FromImport, frame: Frame) -> None: - """Visit named imports.""" - self.newline(node) - self.write("included_template = ") - self._import_common(node, frame) - var_names = [] - discarded_names = [] - for name in node.names: - if isinstance(name, tuple): - name, alias = name - else: - alias = name - self.writeline( - f"{frame.symbols.ref(alias)} =" - f" getattr(included_template, {name!r}, missing)" - ) - self.writeline(f"if {frame.symbols.ref(alias)} is missing:") - self.indent() - # The position will contain the template name, and will be formatted - # into a string that will be compiled into an f-string. Curly braces - # in the name must be replaced with escapes so that they will not be - # executed as part of the f-string. - position = self.position(node).replace("{", "{{").replace("}", "}}") - message = ( - "the template {included_template.__name__!r}" - f" (imported on {position})" - f" does not export the requested name {name!r}" - ) - self.writeline( - f"{frame.symbols.ref(alias)} = undefined(f{message!r}, name={name!r})" - ) - self.outdent() - if frame.toplevel: - var_names.append(alias) - if not alias.startswith("_"): - discarded_names.append(alias) - - if var_names: - if len(var_names) == 1: - name = var_names[0] - self.writeline(f"context.vars[{name!r}] = {frame.symbols.ref(name)}") - else: - names_kv = ", ".join( - f"{name!r}: {frame.symbols.ref(name)}" for name in var_names - ) - self.writeline(f"context.vars.update({{{names_kv}}})") - if discarded_names: - if len(discarded_names) == 1: - self.writeline(f"context.exported_vars.discard({discarded_names[0]!r})") - else: - names_str = ", ".join(map(repr, discarded_names)) - self.writeline( - f"context.exported_vars.difference_update(({names_str}))" - ) - - def visit_For(self, node: nodes.For, frame: Frame) -> None: - loop_frame = frame.inner() - loop_frame.loop_frame = True - test_frame = frame.inner() - else_frame = frame.inner() - - # try to figure out if we have an extended loop. An extended loop - # is necessary if the loop is in recursive mode if the special loop - # variable is accessed in the body if the body is a scoped block. - extended_loop = ( - node.recursive - or "loop" - in find_undeclared(node.iter_child_nodes(only=("body",)), ("loop",)) - or any(block.scoped for block in node.find_all(nodes.Block)) - ) - - loop_ref = None - if extended_loop: - loop_ref = loop_frame.symbols.declare_parameter("loop") - - loop_frame.symbols.analyze_node(node, for_branch="body") - if node.else_: - else_frame.symbols.analyze_node(node, for_branch="else") - - if node.test: - loop_filter_func = self.temporary_identifier() - test_frame.symbols.analyze_node(node, for_branch="test") - self.writeline(f"{self.func(loop_filter_func)}(fiter):", node.test) - self.indent() - self.enter_frame(test_frame) - self.writeline(self.choose_async("async for ", "for ")) - self.visit(node.target, loop_frame) - self.write(" in ") - self.write(self.choose_async("auto_aiter(fiter)", "fiter")) - self.write(":") - self.indent() - self.writeline("if ", node.test) - self.visit(node.test, test_frame) - self.write(":") - self.indent() - self.writeline("yield ") - self.visit(node.target, loop_frame) - self.outdent(3) - self.leave_frame(test_frame, with_python_scope=True) - - # if we don't have an recursive loop we have to find the shadowed - # variables at that point. Because loops can be nested but the loop - # variable is a special one we have to enforce aliasing for it. - if node.recursive: - self.writeline( - f"{self.func('loop')}(reciter, loop_render_func, depth=0):", node - ) - self.indent() - self.buffer(loop_frame) - - # Use the same buffer for the else frame - else_frame.buffer = loop_frame.buffer - - # make sure the loop variable is a special one and raise a template - # assertion error if a loop tries to write to loop - if extended_loop: - self.writeline(f"{loop_ref} = missing") - - for name in node.find_all(nodes.Name): - if name.ctx == "store" and name.name == "loop": - self.fail( - "Can't assign to special loop variable in for-loop target", - name.lineno, - ) - - if node.else_: - iteration_indicator = self.temporary_identifier() - self.writeline(f"{iteration_indicator} = 1") - - self.writeline(self.choose_async("async for ", "for "), node) - self.visit(node.target, loop_frame) - if extended_loop: - self.write(f", {loop_ref} in {self.choose_async('Async')}LoopContext(") - else: - self.write(" in ") - - if node.test: - self.write(f"{loop_filter_func}(") - if node.recursive: - self.write("reciter") - else: - if self.environment.is_async and not extended_loop: - self.write("auto_aiter(") - self.visit(node.iter, frame) - if self.environment.is_async and not extended_loop: - self.write(")") - if node.test: - self.write(")") - - if node.recursive: - self.write(", undefined, loop_render_func, depth):") - else: - self.write(", undefined):" if extended_loop else ":") - - self.indent() - self.enter_frame(loop_frame) - - self.writeline("_loop_vars = {}") - self.blockvisit(node.body, loop_frame) - if node.else_: - self.writeline(f"{iteration_indicator} = 0") - self.outdent() - self.leave_frame( - loop_frame, with_python_scope=node.recursive and not node.else_ - ) - - if node.else_: - self.writeline(f"if {iteration_indicator}:") - self.indent() - self.enter_frame(else_frame) - self.blockvisit(node.else_, else_frame) - self.leave_frame(else_frame) - self.outdent() - - # if the node was recursive we have to return the buffer contents - # and start the iteration code - if node.recursive: - self.return_buffer_contents(loop_frame) - self.outdent() - self.start_write(frame, node) - self.write(f"{self.choose_async('await ')}loop(") - if self.environment.is_async: - self.write("auto_aiter(") - self.visit(node.iter, frame) - if self.environment.is_async: - self.write(")") - self.write(", loop)") - self.end_write(frame) - - # at the end of the iteration, clear any assignments made in the - # loop from the top level - if self._assign_stack: - self._assign_stack[-1].difference_update(loop_frame.symbols.stores) - - def visit_If(self, node: nodes.If, frame: Frame) -> None: - if_frame = frame.soft() - self.writeline("if ", node) - self.visit(node.test, if_frame) - self.write(":") - self.indent() - self.blockvisit(node.body, if_frame) - self.outdent() - for elif_ in node.elif_: - self.writeline("elif ", elif_) - self.visit(elif_.test, if_frame) - self.write(":") - self.indent() - self.blockvisit(elif_.body, if_frame) - self.outdent() - if node.else_: - self.writeline("else:") - self.indent() - self.blockvisit(node.else_, if_frame) - self.outdent() - - def visit_Macro(self, node: nodes.Macro, frame: Frame) -> None: - macro_frame, macro_ref = self.macro_body(node, frame) - self.newline() - if frame.toplevel: - if not node.name.startswith("_"): - self.write(f"context.exported_vars.add({node.name!r})") - self.writeline(f"context.vars[{node.name!r}] = ") - self.write(f"{frame.symbols.ref(node.name)} = ") - self.macro_def(macro_ref, macro_frame) - - def visit_CallBlock(self, node: nodes.CallBlock, frame: Frame) -> None: - call_frame, macro_ref = self.macro_body(node, frame) - self.writeline("caller = ") - self.macro_def(macro_ref, call_frame) - self.start_write(frame, node) - self.visit_Call(node.call, frame, forward_caller=True) - self.end_write(frame) - - def visit_FilterBlock(self, node: nodes.FilterBlock, frame: Frame) -> None: - filter_frame = frame.inner() - filter_frame.symbols.analyze_node(node) - self.enter_frame(filter_frame) - self.buffer(filter_frame) - self.blockvisit(node.body, filter_frame) - self.start_write(frame, node) - self.visit_Filter(node.filter, filter_frame) - self.end_write(frame) - self.leave_frame(filter_frame) - - def visit_With(self, node: nodes.With, frame: Frame) -> None: - with_frame = frame.inner() - with_frame.symbols.analyze_node(node) - self.enter_frame(with_frame) - for target, expr in zip(node.targets, node.values): - self.newline() - self.visit(target, with_frame) - self.write(" = ") - self.visit(expr, frame) - self.blockvisit(node.body, with_frame) - self.leave_frame(with_frame) - - def visit_ExprStmt(self, node: nodes.ExprStmt, frame: Frame) -> None: - self.newline(node) - self.visit(node.node, frame) - - class _FinalizeInfo(t.NamedTuple): - const: t.Optional[t.Callable[..., str]] - src: t.Optional[str] - - @staticmethod - def _default_finalize(value: t.Any) -> t.Any: - """The default finalize function if the environment isn't - configured with one. Or, if the environment has one, this is - called on that function's output for constants. - """ - return str(value) - - _finalize: t.Optional[_FinalizeInfo] = None - - def _make_finalize(self) -> _FinalizeInfo: - """Build the finalize function to be used on constants and at - runtime. Cached so it's only created once for all output nodes. - - Returns a ``namedtuple`` with the following attributes: - - ``const`` - A function to finalize constant data at compile time. - - ``src`` - Source code to output around nodes to be evaluated at - runtime. - """ - if self._finalize is not None: - return self._finalize - - finalize: t.Optional[t.Callable[..., t.Any]] - finalize = default = self._default_finalize - src = None - - if self.environment.finalize: - src = "environment.finalize(" - env_finalize = self.environment.finalize - pass_arg = { - _PassArg.context: "context", - _PassArg.eval_context: "context.eval_ctx", - _PassArg.environment: "environment", - }.get( - _PassArg.from_obj(env_finalize) # type: ignore - ) - finalize = None - - if pass_arg is None: - - def finalize(value: t.Any) -> t.Any: # noqa: F811 - return default(env_finalize(value)) - - else: - src = f"{src}{pass_arg}, " - - if pass_arg == "environment": - - def finalize(value: t.Any) -> t.Any: # noqa: F811 - return default(env_finalize(self.environment, value)) - - self._finalize = self._FinalizeInfo(finalize, src) - return self._finalize - - def _output_const_repr(self, group: t.Iterable[t.Any]) -> str: - """Given a group of constant values converted from ``Output`` - child nodes, produce a string to write to the template module - source. - """ - return repr(concat(group)) - - def _output_child_to_const( - self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo - ) -> str: - """Try to optimize a child of an ``Output`` node by trying to - convert it to constant, finalized data at compile time. - - If :exc:`Impossible` is raised, the node is not constant and - will be evaluated at runtime. Any other exception will also be - evaluated at runtime for easier debugging. - """ - const = node.as_const(frame.eval_ctx) - - if frame.eval_ctx.autoescape: - const = escape(const) - - # Template data doesn't go through finalize. - if isinstance(node, nodes.TemplateData): - return str(const) - - return finalize.const(const) # type: ignore - - def _output_child_pre( - self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo - ) -> None: - """Output extra source code before visiting a child of an - ``Output`` node. - """ - if frame.eval_ctx.volatile: - self.write("(escape if context.eval_ctx.autoescape else str)(") - elif frame.eval_ctx.autoescape: - self.write("escape(") - else: - self.write("str(") - - if finalize.src is not None: - self.write(finalize.src) - - def _output_child_post( - self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo - ) -> None: - """Output extra source code after visiting a child of an - ``Output`` node. - """ - self.write(")") - - if finalize.src is not None: - self.write(")") - - def visit_Output(self, node: nodes.Output, frame: Frame) -> None: - # If an extends is active, don't render outside a block. - if frame.require_output_check: - # A top-level extends is known to exist at compile time. - if self.has_known_extends: - return - - self.writeline("if parent_template is None:") - self.indent() - - finalize = self._make_finalize() - body: t.List[t.Union[t.List[t.Any], nodes.Expr]] = [] - - # Evaluate constants at compile time if possible. Each item in - # body will be either a list of static data or a node to be - # evaluated at runtime. - for child in node.nodes: - try: - if not ( - # If the finalize function requires runtime context, - # constants can't be evaluated at compile time. - finalize.const - # Unless it's basic template data that won't be - # finalized anyway. - or isinstance(child, nodes.TemplateData) - ): - raise nodes.Impossible() - - const = self._output_child_to_const(child, frame, finalize) - except (nodes.Impossible, Exception): - # The node was not constant and needs to be evaluated at - # runtime. Or another error was raised, which is easier - # to debug at runtime. - body.append(child) - continue - - if body and isinstance(body[-1], list): - body[-1].append(const) - else: - body.append([const]) - - if frame.buffer is not None: - if len(body) == 1: - self.writeline(f"{frame.buffer}.append(") - else: - self.writeline(f"{frame.buffer}.extend((") - - self.indent() - - for item in body: - if isinstance(item, list): - # A group of constant data to join and output. - val = self._output_const_repr(item) - - if frame.buffer is None: - self.writeline("yield " + val) - else: - self.writeline(val + ",") - else: - if frame.buffer is None: - self.writeline("yield ", item) - else: - self.newline(item) - - # A node to be evaluated at runtime. - self._output_child_pre(item, frame, finalize) - self.visit(item, frame) - self._output_child_post(item, frame, finalize) - - if frame.buffer is not None: - self.write(",") - - if frame.buffer is not None: - self.outdent() - self.writeline(")" if len(body) == 1 else "))") - - if frame.require_output_check: - self.outdent() - - def visit_Assign(self, node: nodes.Assign, frame: Frame) -> None: - self.push_assign_tracking() - - # ``a.b`` is allowed for assignment, and is parsed as an NSRef. However, - # it is only valid if it references a Namespace object. Emit a check for - # that for each ref here, before assignment code is emitted. This can't - # be done in visit_NSRef as the ref could be in the middle of a tuple. - seen_refs: t.Set[str] = set() - - for nsref in node.find_all(nodes.NSRef): - if nsref.name in seen_refs: - # Only emit the check for each reference once, in case the same - # ref is used multiple times in a tuple, `ns.a, ns.b = c, d`. - continue - - seen_refs.add(nsref.name) - ref = frame.symbols.ref(nsref.name) - self.writeline(f"if not isinstance({ref}, Namespace):") - self.indent() - self.writeline( - "raise TemplateRuntimeError" - '("cannot assign attribute on non-namespace object")' - ) - self.outdent() - - self.newline(node) - self.visit(node.target, frame) - self.write(" = ") - self.visit(node.node, frame) - self.pop_assign_tracking(frame) - - def visit_AssignBlock(self, node: nodes.AssignBlock, frame: Frame) -> None: - self.push_assign_tracking() - block_frame = frame.inner() - # This is a special case. Since a set block always captures we - # will disable output checks. This way one can use set blocks - # toplevel even in extended templates. - block_frame.require_output_check = False - block_frame.symbols.analyze_node(node) - self.enter_frame(block_frame) - self.buffer(block_frame) - self.blockvisit(node.body, block_frame) - self.newline(node) - self.visit(node.target, frame) - self.write(" = (Markup if context.eval_ctx.autoescape else identity)(") - if node.filter is not None: - self.visit_Filter(node.filter, block_frame) - else: - self.write(f"concat({block_frame.buffer})") - self.write(")") - self.pop_assign_tracking(frame) - self.leave_frame(block_frame) - - # -- Expression Visitors - - def visit_Name(self, node: nodes.Name, frame: Frame) -> None: - if node.ctx == "store" and ( - frame.toplevel or frame.loop_frame or frame.block_frame - ): - if self._assign_stack: - self._assign_stack[-1].add(node.name) - ref = frame.symbols.ref(node.name) - - # If we are looking up a variable we might have to deal with the - # case where it's undefined. We can skip that case if the load - # instruction indicates a parameter which are always defined. - if node.ctx == "load": - load = frame.symbols.find_load(ref) - if not ( - load is not None - and load[0] == VAR_LOAD_PARAMETER - and not self.parameter_is_undeclared(ref) - ): - self.write( - f"(undefined(name={node.name!r}) if {ref} is missing else {ref})" - ) - return - - self.write(ref) - - def visit_NSRef(self, node: nodes.NSRef, frame: Frame) -> None: - # NSRef is a dotted assignment target a.b=c, but uses a[b]=c internally. - # visit_Assign emits code to validate that each ref is to a Namespace - # object only. That can't be emitted here as the ref could be in the - # middle of a tuple assignment. - ref = frame.symbols.ref(node.name) - self.writeline(f"{ref}[{node.attr!r}]") - - def visit_Const(self, node: nodes.Const, frame: Frame) -> None: - val = node.as_const(frame.eval_ctx) - if isinstance(val, float): - self.write(str(val)) - else: - self.write(repr(val)) - - def visit_TemplateData(self, node: nodes.TemplateData, frame: Frame) -> None: - try: - self.write(repr(node.as_const(frame.eval_ctx))) - except nodes.Impossible: - self.write( - f"(Markup if context.eval_ctx.autoescape else identity)({node.data!r})" - ) - - def visit_Tuple(self, node: nodes.Tuple, frame: Frame) -> None: - self.write("(") - idx = -1 - for idx, item in enumerate(node.items): - if idx: - self.write(", ") - self.visit(item, frame) - self.write(",)" if idx == 0 else ")") - - def visit_List(self, node: nodes.List, frame: Frame) -> None: - self.write("[") - for idx, item in enumerate(node.items): - if idx: - self.write(", ") - self.visit(item, frame) - self.write("]") - - def visit_Dict(self, node: nodes.Dict, frame: Frame) -> None: - self.write("{") - for idx, item in enumerate(node.items): - if idx: - self.write(", ") - self.visit(item.key, frame) - self.write(": ") - self.visit(item.value, frame) - self.write("}") - - visit_Add = _make_binop("+") - visit_Sub = _make_binop("-") - visit_Mul = _make_binop("*") - visit_Div = _make_binop("/") - visit_FloorDiv = _make_binop("//") - visit_Pow = _make_binop("**") - visit_Mod = _make_binop("%") - visit_And = _make_binop("and") - visit_Or = _make_binop("or") - visit_Pos = _make_unop("+") - visit_Neg = _make_unop("-") - visit_Not = _make_unop("not ") - - @optimizeconst - def visit_Concat(self, node: nodes.Concat, frame: Frame) -> None: - if frame.eval_ctx.volatile: - func_name = "(markup_join if context.eval_ctx.volatile else str_join)" - elif frame.eval_ctx.autoescape: - func_name = "markup_join" - else: - func_name = "str_join" - self.write(f"{func_name}((") - for arg in node.nodes: - self.visit(arg, frame) - self.write(", ") - self.write("))") - - @optimizeconst - def visit_Compare(self, node: nodes.Compare, frame: Frame) -> None: - self.write("(") - self.visit(node.expr, frame) - for op in node.ops: - self.visit(op, frame) - self.write(")") - - def visit_Operand(self, node: nodes.Operand, frame: Frame) -> None: - self.write(f" {operators[node.op]} ") - self.visit(node.expr, frame) - - @optimizeconst - def visit_Getattr(self, node: nodes.Getattr, frame: Frame) -> None: - if self.environment.is_async: - self.write("(await auto_await(") - - self.write("environment.getattr(") - self.visit(node.node, frame) - self.write(f", {node.attr!r})") - - if self.environment.is_async: - self.write("))") - - @optimizeconst - def visit_Getitem(self, node: nodes.Getitem, frame: Frame) -> None: - # slices bypass the environment getitem method. - if isinstance(node.arg, nodes.Slice): - self.visit(node.node, frame) - self.write("[") - self.visit(node.arg, frame) - self.write("]") - else: - if self.environment.is_async: - self.write("(await auto_await(") - - self.write("environment.getitem(") - self.visit(node.node, frame) - self.write(", ") - self.visit(node.arg, frame) - self.write(")") - - if self.environment.is_async: - self.write("))") - - def visit_Slice(self, node: nodes.Slice, frame: Frame) -> None: - if node.start is not None: - self.visit(node.start, frame) - self.write(":") - if node.stop is not None: - self.visit(node.stop, frame) - if node.step is not None: - self.write(":") - self.visit(node.step, frame) - - @contextmanager - def _filter_test_common( - self, node: t.Union[nodes.Filter, nodes.Test], frame: Frame, is_filter: bool - ) -> t.Iterator[None]: - if self.environment.is_async: - self.write("(await auto_await(") - - if is_filter: - self.write(f"{self.filters[node.name]}(") - func = self.environment.filters.get(node.name) - else: - self.write(f"{self.tests[node.name]}(") - func = self.environment.tests.get(node.name) - - # When inside an If or CondExpr frame, allow the filter to be - # undefined at compile time and only raise an error if it's - # actually called at runtime. See pull_dependencies. - if func is None and not frame.soft_frame: - type_name = "filter" if is_filter else "test" - self.fail(f"No {type_name} named {node.name!r}.", node.lineno) - - pass_arg = { - _PassArg.context: "context", - _PassArg.eval_context: "context.eval_ctx", - _PassArg.environment: "environment", - }.get( - _PassArg.from_obj(func) # type: ignore - ) - - if pass_arg is not None: - self.write(f"{pass_arg}, ") - - # Back to the visitor function to handle visiting the target of - # the filter or test. - yield - - self.signature(node, frame) - self.write(")") - - if self.environment.is_async: - self.write("))") - - @optimizeconst - def visit_Filter(self, node: nodes.Filter, frame: Frame) -> None: - with self._filter_test_common(node, frame, True): - # if the filter node is None we are inside a filter block - # and want to write to the current buffer - if node.node is not None: - self.visit(node.node, frame) - elif frame.eval_ctx.volatile: - self.write( - f"(Markup(concat({frame.buffer}))" - f" if context.eval_ctx.autoescape else concat({frame.buffer}))" - ) - elif frame.eval_ctx.autoescape: - self.write(f"Markup(concat({frame.buffer}))") - else: - self.write(f"concat({frame.buffer})") - - @optimizeconst - def visit_Test(self, node: nodes.Test, frame: Frame) -> None: - with self._filter_test_common(node, frame, False): - self.visit(node.node, frame) - - @optimizeconst - def visit_CondExpr(self, node: nodes.CondExpr, frame: Frame) -> None: - frame = frame.soft() - - def write_expr2() -> None: - if node.expr2 is not None: - self.visit(node.expr2, frame) - return - - self.write( - f'cond_expr_undefined("the inline if-expression on' - f" {self.position(node)} evaluated to false and no else" - f' section was defined.")' - ) - - self.write("(") - self.visit(node.expr1, frame) - self.write(" if ") - self.visit(node.test, frame) - self.write(" else ") - write_expr2() - self.write(")") - - @optimizeconst - def visit_Call( - self, node: nodes.Call, frame: Frame, forward_caller: bool = False - ) -> None: - if self.environment.is_async: - self.write("(await auto_await(") - if self.environment.sandboxed: - self.write("environment.call(context, ") - else: - self.write("context.call(") - self.visit(node.node, frame) - extra_kwargs = {"caller": "caller"} if forward_caller else None - loop_kwargs = {"_loop_vars": "_loop_vars"} if frame.loop_frame else {} - block_kwargs = {"_block_vars": "_block_vars"} if frame.block_frame else {} - if extra_kwargs: - extra_kwargs.update(loop_kwargs, **block_kwargs) - elif loop_kwargs or block_kwargs: - extra_kwargs = dict(loop_kwargs, **block_kwargs) - self.signature(node, frame, extra_kwargs) - self.write(")") - if self.environment.is_async: - self.write("))") - - def visit_Keyword(self, node: nodes.Keyword, frame: Frame) -> None: - self.write(node.key + "=") - self.visit(node.value, frame) - - # -- Unused nodes for extensions - - def visit_MarkSafe(self, node: nodes.MarkSafe, frame: Frame) -> None: - self.write("Markup(") - self.visit(node.expr, frame) - self.write(")") - - def visit_MarkSafeIfAutoescape( - self, node: nodes.MarkSafeIfAutoescape, frame: Frame - ) -> None: - self.write("(Markup if context.eval_ctx.autoescape else identity)(") - self.visit(node.expr, frame) - self.write(")") - - def visit_EnvironmentAttribute( - self, node: nodes.EnvironmentAttribute, frame: Frame - ) -> None: - self.write("environment." + node.name) - - def visit_ExtensionAttribute( - self, node: nodes.ExtensionAttribute, frame: Frame - ) -> None: - self.write(f"environment.extensions[{node.identifier!r}].{node.name}") - - def visit_ImportedName(self, node: nodes.ImportedName, frame: Frame) -> None: - self.write(self.import_aliases[node.importname]) - - def visit_InternalName(self, node: nodes.InternalName, frame: Frame) -> None: - self.write(node.name) - - def visit_ContextReference( - self, node: nodes.ContextReference, frame: Frame - ) -> None: - self.write("context") - - def visit_DerivedContextReference( - self, node: nodes.DerivedContextReference, frame: Frame - ) -> None: - self.write(self.derive_context(frame)) - - def visit_Continue(self, node: nodes.Continue, frame: Frame) -> None: - self.writeline("continue", node) - - def visit_Break(self, node: nodes.Break, frame: Frame) -> None: - self.writeline("break", node) - - def visit_Scope(self, node: nodes.Scope, frame: Frame) -> None: - scope_frame = frame.inner() - scope_frame.symbols.analyze_node(node) - self.enter_frame(scope_frame) - self.blockvisit(node.body, scope_frame) - self.leave_frame(scope_frame) - - def visit_OverlayScope(self, node: nodes.OverlayScope, frame: Frame) -> None: - ctx = self.temporary_identifier() - self.writeline(f"{ctx} = {self.derive_context(frame)}") - self.writeline(f"{ctx}.vars = ") - self.visit(node.context, frame) - self.push_context_reference(ctx) - - scope_frame = frame.inner(isolated=True) - scope_frame.symbols.analyze_node(node) - self.enter_frame(scope_frame) - self.blockvisit(node.body, scope_frame) - self.leave_frame(scope_frame) - self.pop_context_reference() - - def visit_EvalContextModifier( - self, node: nodes.EvalContextModifier, frame: Frame - ) -> None: - for keyword in node.options: - self.writeline(f"context.eval_ctx.{keyword.key} = ") - self.visit(keyword.value, frame) - try: - val = keyword.value.as_const(frame.eval_ctx) - except nodes.Impossible: - frame.eval_ctx.volatile = True - else: - setattr(frame.eval_ctx, keyword.key, val) - - def visit_ScopedEvalContextModifier( - self, node: nodes.ScopedEvalContextModifier, frame: Frame - ) -> None: - old_ctx_name = self.temporary_identifier() - saved_ctx = frame.eval_ctx.save() - self.writeline(f"{old_ctx_name} = context.eval_ctx.save()") - self.visit_EvalContextModifier(node, frame) - for child in node.body: - self.visit(child, frame) - frame.eval_ctx.revert(saved_ctx) - self.writeline(f"context.eval_ctx.revert({old_ctx_name})") diff --git a/venv/lib/python3.12/site-packages/jinja2/constants.py b/venv/lib/python3.12/site-packages/jinja2/constants.py deleted file mode 100644 index 41a1c23b..00000000 --- a/venv/lib/python3.12/site-packages/jinja2/constants.py +++ /dev/null @@ -1,20 +0,0 @@ -#: list of lorem ipsum words used by the lipsum() helper function -LOREM_IPSUM_WORDS = """\ -a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at -auctor augue bibendum blandit class commodo condimentum congue consectetuer -consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus -diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend -elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames -faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac -hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum -justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem -luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie -mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non -nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque -penatibus per pharetra phasellus placerat platea porta porttitor posuere -potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus -ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit -sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor -tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices -ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus -viverra volutpat vulputate""" diff --git a/venv/lib/python3.12/site-packages/jinja2/debug.py b/venv/lib/python3.12/site-packages/jinja2/debug.py deleted file mode 100644 index eeeeee78..00000000 --- a/venv/lib/python3.12/site-packages/jinja2/debug.py +++ /dev/null @@ -1,191 +0,0 @@ -import sys -import typing as t -from types import CodeType -from types import TracebackType - -from .exceptions import TemplateSyntaxError -from .utils import internal_code -from .utils import missing - -if t.TYPE_CHECKING: - from .runtime import Context - - -def rewrite_traceback_stack(source: t.Optional[str] = None) -> BaseException: - """Rewrite the current exception to replace any tracebacks from - within compiled template code with tracebacks that look like they - came from the template source. - - This must be called within an ``except`` block. - - :param source: For ``TemplateSyntaxError``, the original source if - known. - :return: The original exception with the rewritten traceback. - """ - _, exc_value, tb = sys.exc_info() - exc_value = t.cast(BaseException, exc_value) - tb = t.cast(TracebackType, tb) - - if isinstance(exc_value, TemplateSyntaxError) and not exc_value.translated: - exc_value.translated = True - exc_value.source = source - # Remove the old traceback, otherwise the frames from the - # compiler still show up. - exc_value.with_traceback(None) - # Outside of runtime, so the frame isn't executing template - # code, but it still needs to point at the template. - tb = fake_traceback( - exc_value, None, exc_value.filename or "", exc_value.lineno - ) - else: - # Skip the frame for the render function. - tb = tb.tb_next - - stack = [] - - # Build the stack of traceback object, replacing any in template - # code with the source file and line information. - while tb is not None: - # Skip frames decorated with @internalcode. These are internal - # calls that aren't useful in template debugging output. - if tb.tb_frame.f_code in internal_code: - tb = tb.tb_next - continue - - template = tb.tb_frame.f_globals.get("__jinja_template__") - - if template is not None: - lineno = template.get_corresponding_lineno(tb.tb_lineno) - fake_tb = fake_traceback(exc_value, tb, template.filename, lineno) - stack.append(fake_tb) - else: - stack.append(tb) - - tb = tb.tb_next - - tb_next = None - - # Assign tb_next in reverse to avoid circular references. - for tb in reversed(stack): - tb.tb_next = tb_next - tb_next = tb - - return exc_value.with_traceback(tb_next) - - -def fake_traceback( # type: ignore - exc_value: BaseException, tb: t.Optional[TracebackType], filename: str, lineno: int -) -> TracebackType: - """Produce a new traceback object that looks like it came from the - template source instead of the compiled code. The filename, line - number, and location name will point to the template, and the local - variables will be the current template context. - - :param exc_value: The original exception to be re-raised to create - the new traceback. - :param tb: The original traceback to get the local variables and - code info from. - :param filename: The template filename. - :param lineno: The line number in the template source. - """ - if tb is not None: - # Replace the real locals with the context that would be - # available at that point in the template. - locals = get_template_locals(tb.tb_frame.f_locals) - locals.pop("__jinja_exception__", None) - else: - locals = {} - - globals = { - "__name__": filename, - "__file__": filename, - "__jinja_exception__": exc_value, - } - # Raise an exception at the correct line number. - code: CodeType = compile( - "\n" * (lineno - 1) + "raise __jinja_exception__", filename, "exec" - ) - - # Build a new code object that points to the template file and - # replaces the location with a block name. - location = "template" - - if tb is not None: - function = tb.tb_frame.f_code.co_name - - if function == "root": - location = "top-level template code" - elif function.startswith("block_"): - location = f"block {function[6:]!r}" - - if sys.version_info >= (3, 8): - code = code.replace(co_name=location) - else: - code = CodeType( - code.co_argcount, - code.co_kwonlyargcount, - code.co_nlocals, - code.co_stacksize, - code.co_flags, - code.co_code, - code.co_consts, - code.co_names, - code.co_varnames, - code.co_filename, - location, - code.co_firstlineno, - code.co_lnotab, - code.co_freevars, - code.co_cellvars, - ) - - # Execute the new code, which is guaranteed to raise, and return - # the new traceback without this frame. - try: - exec(code, globals, locals) - except BaseException: - return sys.exc_info()[2].tb_next # type: ignore - - -def get_template_locals(real_locals: t.Mapping[str, t.Any]) -> t.Dict[str, t.Any]: - """Based on the runtime locals, get the context that would be - available at that point in the template. - """ - # Start with the current template context. - ctx: t.Optional[Context] = real_locals.get("context") - - if ctx is not None: - data: t.Dict[str, t.Any] = ctx.get_all().copy() - else: - data = {} - - # Might be in a derived context that only sets local variables - # rather than pushing a context. Local variables follow the scheme - # l_depth_name. Find the highest-depth local that has a value for - # each name. - local_overrides: t.Dict[str, t.Tuple[int, t.Any]] = {} - - for name, value in real_locals.items(): - if not name.startswith("l_") or value is missing: - # Not a template variable, or no longer relevant. - continue - - try: - _, depth_str, name = name.split("_", 2) - depth = int(depth_str) - except ValueError: - continue - - cur_depth = local_overrides.get(name, (-1,))[0] - - if cur_depth < depth: - local_overrides[name] = (depth, value) - - # Modify the context with any derived context. - for name, (_, value) in local_overrides.items(): - if value is missing: - data.pop(name, None) - else: - data[name] = value - - return data diff --git a/venv/lib/python3.12/site-packages/jinja2/defaults.py b/venv/lib/python3.12/site-packages/jinja2/defaults.py deleted file mode 100644 index 638cad3d..00000000 --- a/venv/lib/python3.12/site-packages/jinja2/defaults.py +++ /dev/null @@ -1,48 +0,0 @@ -import typing as t - -from .filters import FILTERS as DEFAULT_FILTERS # noqa: F401 -from .tests import TESTS as DEFAULT_TESTS # noqa: F401 -from .utils import Cycler -from .utils import generate_lorem_ipsum -from .utils import Joiner -from .utils import Namespace - -if t.TYPE_CHECKING: - import typing_extensions as te - -# defaults for the parser / lexer -BLOCK_START_STRING = "{%" -BLOCK_END_STRING = "%}" -VARIABLE_START_STRING = "{{" -VARIABLE_END_STRING = "}}" -COMMENT_START_STRING = "{#" -COMMENT_END_STRING = "#}" -LINE_STATEMENT_PREFIX: t.Optional[str] = None -LINE_COMMENT_PREFIX: t.Optional[str] = None -TRIM_BLOCKS = False -LSTRIP_BLOCKS = False -NEWLINE_SEQUENCE: "te.Literal['\\n', '\\r\\n', '\\r']" = "\n" -KEEP_TRAILING_NEWLINE = False - -# default filters, tests and namespace - -DEFAULT_NAMESPACE = { - "range": range, - "dict": dict, - "lipsum": generate_lorem_ipsum, - "cycler": Cycler, - "joiner": Joiner, - "namespace": Namespace, -} - -# default policies -DEFAULT_POLICIES: t.Dict[str, t.Any] = { - "compiler.ascii_str": True, - "urlize.rel": "noopener", - "urlize.target": None, - "urlize.extra_schemes": None, - "truncate.leeway": 5, - "json.dumps_function": None, - "json.dumps_kwargs": {"sort_keys": True}, - "ext.i18n.trimmed": False, -} diff --git a/venv/lib/python3.12/site-packages/jinja2/environment.py b/venv/lib/python3.12/site-packages/jinja2/environment.py deleted file mode 100644 index 0fc6e5be..00000000 --- a/venv/lib/python3.12/site-packages/jinja2/environment.py +++ /dev/null @@ -1,1672 +0,0 @@ -"""Classes for managing templates and their runtime and compile time -options. -""" - -import os -import typing -import typing as t -import weakref -from collections import ChainMap -from functools import lru_cache -from functools import partial -from functools import reduce -from types import CodeType - -from markupsafe import Markup - -from . import nodes -from .compiler import CodeGenerator -from .compiler import generate -from .defaults import BLOCK_END_STRING -from .defaults import BLOCK_START_STRING -from .defaults import COMMENT_END_STRING -from .defaults import COMMENT_START_STRING -from .defaults import DEFAULT_FILTERS # type: ignore[attr-defined] -from .defaults import DEFAULT_NAMESPACE -from .defaults import DEFAULT_POLICIES -from .defaults import DEFAULT_TESTS # type: ignore[attr-defined] -from .defaults import KEEP_TRAILING_NEWLINE -from .defaults import LINE_COMMENT_PREFIX -from .defaults import LINE_STATEMENT_PREFIX -from .defaults import LSTRIP_BLOCKS -from .defaults import NEWLINE_SEQUENCE -from .defaults import TRIM_BLOCKS -from .defaults import VARIABLE_END_STRING -from .defaults import VARIABLE_START_STRING -from .exceptions import TemplateNotFound -from .exceptions import TemplateRuntimeError -from .exceptions import TemplatesNotFound -from .exceptions import TemplateSyntaxError -from .exceptions import UndefinedError -from .lexer import get_lexer -from .lexer import Lexer -from .lexer import TokenStream -from .nodes import EvalContext -from .parser import Parser -from .runtime import Context -from .runtime import new_context -from .runtime import Undefined -from .utils import _PassArg -from .utils import concat -from .utils import consume -from .utils import import_string -from .utils import internalcode -from .utils import LRUCache -from .utils import missing - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .bccache import BytecodeCache - from .ext import Extension - from .loaders import BaseLoader - -_env_bound = t.TypeVar("_env_bound", bound="Environment") - - -# for direct template usage we have up to ten living environments -@lru_cache(maxsize=10) -def get_spontaneous_environment(cls: t.Type[_env_bound], *args: t.Any) -> _env_bound: - """Return a new spontaneous environment. A spontaneous environment - is used for templates created directly rather than through an - existing environment. - - :param cls: Environment class to create. - :param args: Positional arguments passed to environment. - """ - env = cls(*args) - env.shared = True - return env - - -def create_cache( - size: int, -) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: - """Return the cache class for the given size.""" - if size == 0: - return None - - if size < 0: - return {} - - return LRUCache(size) # type: ignore - - -def copy_cache( - cache: t.Optional[t.MutableMapping[t.Any, t.Any]], -) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: - """Create an empty copy of the given cache.""" - if cache is None: - return None - - if type(cache) is dict: # noqa E721 - return {} - - return LRUCache(cache.capacity) # type: ignore - - -def load_extensions( - environment: "Environment", - extensions: t.Sequence[t.Union[str, t.Type["Extension"]]], -) -> t.Dict[str, "Extension"]: - """Load the extensions from the list and bind it to the environment. - Returns a dict of instantiated extensions. - """ - result = {} - - for extension in extensions: - if isinstance(extension, str): - extension = t.cast(t.Type["Extension"], import_string(extension)) - - result[extension.identifier] = extension(environment) - - return result - - -def _environment_config_check(environment: _env_bound) -> _env_bound: - """Perform a sanity check on the environment.""" - assert issubclass( - environment.undefined, Undefined - ), "'undefined' must be a subclass of 'jinja2.Undefined'." - assert ( - environment.block_start_string - != environment.variable_start_string - != environment.comment_start_string - ), "block, variable and comment start strings must be different." - assert environment.newline_sequence in { - "\r", - "\r\n", - "\n", - }, "'newline_sequence' must be one of '\\n', '\\r\\n', or '\\r'." - return environment - - -class Environment: - r"""The core component of Jinja is the `Environment`. It contains - important shared variables like configuration, filters, tests, - globals and others. Instances of this class may be modified if - they are not shared and if no template was loaded so far. - Modifications on environments after the first template was loaded - will lead to surprising effects and undefined behavior. - - Here are the possible initialization parameters: - - `block_start_string` - The string marking the beginning of a block. Defaults to ``'{%'``. - - `block_end_string` - The string marking the end of a block. Defaults to ``'%}'``. - - `variable_start_string` - The string marking the beginning of a print statement. - Defaults to ``'{{'``. - - `variable_end_string` - The string marking the end of a print statement. Defaults to - ``'}}'``. - - `comment_start_string` - The string marking the beginning of a comment. Defaults to ``'{#'``. - - `comment_end_string` - The string marking the end of a comment. Defaults to ``'#}'``. - - `line_statement_prefix` - If given and a string, this will be used as prefix for line based - statements. See also :ref:`line-statements`. - - `line_comment_prefix` - If given and a string, this will be used as prefix for line based - comments. See also :ref:`line-statements`. - - .. versionadded:: 2.2 - - `trim_blocks` - If this is set to ``True`` the first newline after a block is - removed (block, not variable tag!). Defaults to `False`. - - `lstrip_blocks` - If this is set to ``True`` leading spaces and tabs are stripped - from the start of a line to a block. Defaults to `False`. - - `newline_sequence` - The sequence that starts a newline. Must be one of ``'\r'``, - ``'\n'`` or ``'\r\n'``. The default is ``'\n'`` which is a - useful default for Linux and OS X systems as well as web - applications. - - `keep_trailing_newline` - Preserve the trailing newline when rendering templates. - The default is ``False``, which causes a single newline, - if present, to be stripped from the end of the template. - - .. versionadded:: 2.7 - - `extensions` - List of Jinja extensions to use. This can either be import paths - as strings or extension classes. For more information have a - look at :ref:`the extensions documentation `. - - `optimized` - should the optimizer be enabled? Default is ``True``. - - `undefined` - :class:`Undefined` or a subclass of it that is used to represent - undefined values in the template. - - `finalize` - A callable that can be used to process the result of a variable - expression before it is output. For example one can convert - ``None`` implicitly into an empty string here. - - `autoescape` - If set to ``True`` the XML/HTML autoescaping feature is enabled by - default. For more details about autoescaping see - :class:`~markupsafe.Markup`. As of Jinja 2.4 this can also - be a callable that is passed the template name and has to - return ``True`` or ``False`` depending on autoescape should be - enabled by default. - - .. versionchanged:: 2.4 - `autoescape` can now be a function - - `loader` - The template loader for this environment. - - `cache_size` - The size of the cache. Per default this is ``400`` which means - that if more than 400 templates are loaded the loader will clean - out the least recently used template. If the cache size is set to - ``0`` templates are recompiled all the time, if the cache size is - ``-1`` the cache will not be cleaned. - - .. versionchanged:: 2.8 - The cache size was increased to 400 from a low 50. - - `auto_reload` - Some loaders load templates from locations where the template - sources may change (ie: file system or database). If - ``auto_reload`` is set to ``True`` (default) every time a template is - requested the loader checks if the source changed and if yes, it - will reload the template. For higher performance it's possible to - disable that. - - `bytecode_cache` - If set to a bytecode cache object, this object will provide a - cache for the internal Jinja bytecode so that templates don't - have to be parsed if they were not changed. - - See :ref:`bytecode-cache` for more information. - - `enable_async` - If set to true this enables async template execution which - allows using async functions and generators. - """ - - #: if this environment is sandboxed. Modifying this variable won't make - #: the environment sandboxed though. For a real sandboxed environment - #: have a look at jinja2.sandbox. This flag alone controls the code - #: generation by the compiler. - sandboxed = False - - #: True if the environment is just an overlay - overlayed = False - - #: the environment this environment is linked to if it is an overlay - linked_to: t.Optional["Environment"] = None - - #: shared environments have this set to `True`. A shared environment - #: must not be modified - shared = False - - #: the class that is used for code generation. See - #: :class:`~jinja2.compiler.CodeGenerator` for more information. - code_generator_class: t.Type["CodeGenerator"] = CodeGenerator - - concat = "".join - - #: the context class that is used for templates. See - #: :class:`~jinja2.runtime.Context` for more information. - context_class: t.Type[Context] = Context - - template_class: t.Type["Template"] - - def __init__( - self, - block_start_string: str = BLOCK_START_STRING, - block_end_string: str = BLOCK_END_STRING, - variable_start_string: str = VARIABLE_START_STRING, - variable_end_string: str = VARIABLE_END_STRING, - comment_start_string: str = COMMENT_START_STRING, - comment_end_string: str = COMMENT_END_STRING, - line_statement_prefix: t.Optional[str] = LINE_STATEMENT_PREFIX, - line_comment_prefix: t.Optional[str] = LINE_COMMENT_PREFIX, - trim_blocks: bool = TRIM_BLOCKS, - lstrip_blocks: bool = LSTRIP_BLOCKS, - newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = NEWLINE_SEQUENCE, - keep_trailing_newline: bool = KEEP_TRAILING_NEWLINE, - extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = (), - optimized: bool = True, - undefined: t.Type[Undefined] = Undefined, - finalize: t.Optional[t.Callable[..., t.Any]] = None, - autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = False, - loader: t.Optional["BaseLoader"] = None, - cache_size: int = 400, - auto_reload: bool = True, - bytecode_cache: t.Optional["BytecodeCache"] = None, - enable_async: bool = False, - ): - # !!Important notice!! - # The constructor accepts quite a few arguments that should be - # passed by keyword rather than position. However it's important to - # not change the order of arguments because it's used at least - # internally in those cases: - # - spontaneous environments (i18n extension and Template) - # - unittests - # If parameter changes are required only add parameters at the end - # and don't change the arguments (or the defaults!) of the arguments - # existing already. - - # lexer / parser information - self.block_start_string = block_start_string - self.block_end_string = block_end_string - self.variable_start_string = variable_start_string - self.variable_end_string = variable_end_string - self.comment_start_string = comment_start_string - self.comment_end_string = comment_end_string - self.line_statement_prefix = line_statement_prefix - self.line_comment_prefix = line_comment_prefix - self.trim_blocks = trim_blocks - self.lstrip_blocks = lstrip_blocks - self.newline_sequence = newline_sequence - self.keep_trailing_newline = keep_trailing_newline - - # runtime information - self.undefined: t.Type[Undefined] = undefined - self.optimized = optimized - self.finalize = finalize - self.autoescape = autoescape - - # defaults - self.filters = DEFAULT_FILTERS.copy() - self.tests = DEFAULT_TESTS.copy() - self.globals = DEFAULT_NAMESPACE.copy() - - # set the loader provided - self.loader = loader - self.cache = create_cache(cache_size) - self.bytecode_cache = bytecode_cache - self.auto_reload = auto_reload - - # configurable policies - self.policies = DEFAULT_POLICIES.copy() - - # load extensions - self.extensions = load_extensions(self, extensions) - - self.is_async = enable_async - _environment_config_check(self) - - def add_extension(self, extension: t.Union[str, t.Type["Extension"]]) -> None: - """Adds an extension after the environment was created. - - .. versionadded:: 2.5 - """ - self.extensions.update(load_extensions(self, [extension])) - - def extend(self, **attributes: t.Any) -> None: - """Add the items to the instance of the environment if they do not exist - yet. This is used by :ref:`extensions ` to register - callbacks and configuration values without breaking inheritance. - """ - for key, value in attributes.items(): - if not hasattr(self, key): - setattr(self, key, value) - - def overlay( - self, - block_start_string: str = missing, - block_end_string: str = missing, - variable_start_string: str = missing, - variable_end_string: str = missing, - comment_start_string: str = missing, - comment_end_string: str = missing, - line_statement_prefix: t.Optional[str] = missing, - line_comment_prefix: t.Optional[str] = missing, - trim_blocks: bool = missing, - lstrip_blocks: bool = missing, - newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = missing, - keep_trailing_newline: bool = missing, - extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = missing, - optimized: bool = missing, - undefined: t.Type[Undefined] = missing, - finalize: t.Optional[t.Callable[..., t.Any]] = missing, - autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = missing, - loader: t.Optional["BaseLoader"] = missing, - cache_size: int = missing, - auto_reload: bool = missing, - bytecode_cache: t.Optional["BytecodeCache"] = missing, - enable_async: bool = missing, - ) -> "te.Self": - """Create a new overlay environment that shares all the data with the - current environment except for cache and the overridden attributes. - Extensions cannot be removed for an overlayed environment. An overlayed - environment automatically gets all the extensions of the environment it - is linked to plus optional extra extensions. - - Creating overlays should happen after the initial environment was set - up completely. Not all attributes are truly linked, some are just - copied over so modifications on the original environment may not shine - through. - - .. versionchanged:: 3.1.5 - ``enable_async`` is applied correctly. - - .. versionchanged:: 3.1.2 - Added the ``newline_sequence``, ``keep_trailing_newline``, - and ``enable_async`` parameters to match ``__init__``. - """ - args = dict(locals()) - del args["self"], args["cache_size"], args["extensions"], args["enable_async"] - - rv = object.__new__(self.__class__) - rv.__dict__.update(self.__dict__) - rv.overlayed = True - rv.linked_to = self - - for key, value in args.items(): - if value is not missing: - setattr(rv, key, value) - - if cache_size is not missing: - rv.cache = create_cache(cache_size) - else: - rv.cache = copy_cache(self.cache) - - rv.extensions = {} - for key, value in self.extensions.items(): - rv.extensions[key] = value.bind(rv) - if extensions is not missing: - rv.extensions.update(load_extensions(rv, extensions)) - - if enable_async is not missing: - rv.is_async = enable_async - - return _environment_config_check(rv) - - @property - def lexer(self) -> Lexer: - """The lexer for this environment.""" - return get_lexer(self) - - def iter_extensions(self) -> t.Iterator["Extension"]: - """Iterates over the extensions by priority.""" - return iter(sorted(self.extensions.values(), key=lambda x: x.priority)) - - def getitem( - self, obj: t.Any, argument: t.Union[str, t.Any] - ) -> t.Union[t.Any, Undefined]: - """Get an item or attribute of an object but prefer the item.""" - try: - return obj[argument] - except (AttributeError, TypeError, LookupError): - if isinstance(argument, str): - try: - attr = str(argument) - except Exception: - pass - else: - try: - return getattr(obj, attr) - except AttributeError: - pass - return self.undefined(obj=obj, name=argument) - - def getattr(self, obj: t.Any, attribute: str) -> t.Any: - """Get an item or attribute of an object but prefer the attribute. - Unlike :meth:`getitem` the attribute *must* be a string. - """ - try: - return getattr(obj, attribute) - except AttributeError: - pass - try: - return obj[attribute] - except (TypeError, LookupError, AttributeError): - return self.undefined(obj=obj, name=attribute) - - def _filter_test_common( - self, - name: t.Union[str, Undefined], - value: t.Any, - args: t.Optional[t.Sequence[t.Any]], - kwargs: t.Optional[t.Mapping[str, t.Any]], - context: t.Optional[Context], - eval_ctx: t.Optional[EvalContext], - is_filter: bool, - ) -> t.Any: - if is_filter: - env_map = self.filters - type_name = "filter" - else: - env_map = self.tests - type_name = "test" - - func = env_map.get(name) # type: ignore - - if func is None: - msg = f"No {type_name} named {name!r}." - - if isinstance(name, Undefined): - try: - name._fail_with_undefined_error() - except Exception as e: - msg = f"{msg} ({e}; did you forget to quote the callable name?)" - - raise TemplateRuntimeError(msg) - - args = [value, *(args if args is not None else ())] - kwargs = kwargs if kwargs is not None else {} - pass_arg = _PassArg.from_obj(func) - - if pass_arg is _PassArg.context: - if context is None: - raise TemplateRuntimeError( - f"Attempted to invoke a context {type_name} without context." - ) - - args.insert(0, context) - elif pass_arg is _PassArg.eval_context: - if eval_ctx is None: - if context is not None: - eval_ctx = context.eval_ctx - else: - eval_ctx = EvalContext(self) - - args.insert(0, eval_ctx) - elif pass_arg is _PassArg.environment: - args.insert(0, self) - - return func(*args, **kwargs) - - def call_filter( - self, - name: str, - value: t.Any, - args: t.Optional[t.Sequence[t.Any]] = None, - kwargs: t.Optional[t.Mapping[str, t.Any]] = None, - context: t.Optional[Context] = None, - eval_ctx: t.Optional[EvalContext] = None, - ) -> t.Any: - """Invoke a filter on a value the same way the compiler does. - - This might return a coroutine if the filter is running from an - environment in async mode and the filter supports async - execution. It's your responsibility to await this if needed. - - .. versionadded:: 2.7 - """ - return self._filter_test_common( - name, value, args, kwargs, context, eval_ctx, True - ) - - def call_test( - self, - name: str, - value: t.Any, - args: t.Optional[t.Sequence[t.Any]] = None, - kwargs: t.Optional[t.Mapping[str, t.Any]] = None, - context: t.Optional[Context] = None, - eval_ctx: t.Optional[EvalContext] = None, - ) -> t.Any: - """Invoke a test on a value the same way the compiler does. - - This might return a coroutine if the test is running from an - environment in async mode and the test supports async execution. - It's your responsibility to await this if needed. - - .. versionchanged:: 3.0 - Tests support ``@pass_context``, etc. decorators. Added - the ``context`` and ``eval_ctx`` parameters. - - .. versionadded:: 2.7 - """ - return self._filter_test_common( - name, value, args, kwargs, context, eval_ctx, False - ) - - @internalcode - def parse( - self, - source: str, - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - ) -> nodes.Template: - """Parse the sourcecode and return the abstract syntax tree. This - tree of nodes is used by the compiler to convert the template into - executable source- or bytecode. This is useful for debugging or to - extract information from templates. - - If you are :ref:`developing Jinja extensions ` - this gives you a good overview of the node tree generated. - """ - try: - return self._parse(source, name, filename) - except TemplateSyntaxError: - self.handle_exception(source=source) - - def _parse( - self, source: str, name: t.Optional[str], filename: t.Optional[str] - ) -> nodes.Template: - """Internal parsing function used by `parse` and `compile`.""" - return Parser(self, source, name, filename).parse() - - def lex( - self, - source: str, - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - ) -> t.Iterator[t.Tuple[int, str, str]]: - """Lex the given sourcecode and return a generator that yields - tokens as tuples in the form ``(lineno, token_type, value)``. - This can be useful for :ref:`extension development ` - and debugging templates. - - This does not perform preprocessing. If you want the preprocessing - of the extensions to be applied you have to filter source through - the :meth:`preprocess` method. - """ - source = str(source) - try: - return self.lexer.tokeniter(source, name, filename) - except TemplateSyntaxError: - self.handle_exception(source=source) - - def preprocess( - self, - source: str, - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - ) -> str: - """Preprocesses the source with all extensions. This is automatically - called for all parsing and compiling methods but *not* for :meth:`lex` - because there you usually only want the actual source tokenized. - """ - return reduce( - lambda s, e: e.preprocess(s, name, filename), - self.iter_extensions(), - str(source), - ) - - def _tokenize( - self, - source: str, - name: t.Optional[str], - filename: t.Optional[str] = None, - state: t.Optional[str] = None, - ) -> TokenStream: - """Called by the parser to do the preprocessing and filtering - for all the extensions. Returns a :class:`~jinja2.lexer.TokenStream`. - """ - source = self.preprocess(source, name, filename) - stream = self.lexer.tokenize(source, name, filename, state) - - for ext in self.iter_extensions(): - stream = ext.filter_stream(stream) # type: ignore - - if not isinstance(stream, TokenStream): - stream = TokenStream(stream, name, filename) - - return stream - - def _generate( - self, - source: nodes.Template, - name: t.Optional[str], - filename: t.Optional[str], - defer_init: bool = False, - ) -> str: - """Internal hook that can be overridden to hook a different generate - method in. - - .. versionadded:: 2.5 - """ - return generate( # type: ignore - source, - self, - name, - filename, - defer_init=defer_init, - optimized=self.optimized, - ) - - def _compile(self, source: str, filename: str) -> CodeType: - """Internal hook that can be overridden to hook a different compile - method in. - - .. versionadded:: 2.5 - """ - return compile(source, filename, "exec") - - @typing.overload - def compile( - self, - source: t.Union[str, nodes.Template], - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - raw: "te.Literal[False]" = False, - defer_init: bool = False, - ) -> CodeType: ... - - @typing.overload - def compile( - self, - source: t.Union[str, nodes.Template], - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - raw: "te.Literal[True]" = ..., - defer_init: bool = False, - ) -> str: ... - - @internalcode - def compile( - self, - source: t.Union[str, nodes.Template], - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - raw: bool = False, - defer_init: bool = False, - ) -> t.Union[str, CodeType]: - """Compile a node or template source code. The `name` parameter is - the load name of the template after it was joined using - :meth:`join_path` if necessary, not the filename on the file system. - the `filename` parameter is the estimated filename of the template on - the file system. If the template came from a database or memory this - can be omitted. - - The return value of this method is a python code object. If the `raw` - parameter is `True` the return value will be a string with python - code equivalent to the bytecode returned otherwise. This method is - mainly used internally. - - `defer_init` is use internally to aid the module code generator. This - causes the generated code to be able to import without the global - environment variable to be set. - - .. versionadded:: 2.4 - `defer_init` parameter added. - """ - source_hint = None - try: - if isinstance(source, str): - source_hint = source - source = self._parse(source, name, filename) - source = self._generate(source, name, filename, defer_init=defer_init) - if raw: - return source - if filename is None: - filename = "